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

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 (155) hide show
  1. package/dist-client/index.d.ts +1 -0
  2. package/dist-client/index.js +1 -1
  3. package/dist-client/index.js.map +1 -1
  4. package/dist-client/pages/lib/chatbot-widget.d.ts +53 -0
  5. package/dist-client/pages/lib/chatbot-widget.js +631 -0
  6. package/dist-client/pages/lib/chatbot-widget.js.map +1 -0
  7. package/dist-client/pages/lib/select2-component.d.ts +1 -1
  8. package/dist-client/pages/lib/select2-component.js +35 -35
  9. package/dist-client/pages/lib/select2-component.js.map +1 -1
  10. package/dist-client/pages/project/component/pagenation.d.ts +18 -0
  11. package/dist-client/pages/project/component/pagenation.js +142 -0
  12. package/dist-client/pages/project/component/pagenation.js.map +1 -0
  13. package/dist-client/pages/project/component/project-update-header.js +26 -3
  14. package/dist-client/pages/project/component/project-update-header.js.map +1 -1
  15. package/dist-client/pages/project/popup/checklist/task-checklist-attachment-list-popup.d.ts +1 -0
  16. package/dist-client/pages/project/popup/checklist/task-checklist-attachment-list-popup.js +308 -0
  17. package/dist-client/pages/project/popup/checklist/task-checklist-attachment-list-popup.js.map +1 -0
  18. package/dist-client/pages/project/popup/checklist/task-checklist-comment-list-popup.d.ts +1 -0
  19. package/dist-client/pages/project/popup/checklist/task-checklist-comment-list-popup.js +356 -0
  20. package/dist-client/pages/project/popup/checklist/task-checklist-comment-list-popup.js.map +1 -0
  21. package/dist-client/pages/project/popup/checklist/task-checklist-create-popup.d.ts +1 -0
  22. package/dist-client/pages/project/popup/checklist/task-checklist-create-popup.js +681 -0
  23. package/dist-client/pages/project/popup/checklist/task-checklist-create-popup.js.map +1 -0
  24. package/dist-client/pages/project/popup/checklist/task-checklist-view.d.ts +32 -0
  25. package/dist-client/pages/project/popup/checklist/task-checklist-view.js +620 -0
  26. package/dist-client/pages/project/popup/checklist/task-checklist-view.js.map +1 -0
  27. package/dist-client/pages/project/popup/popup-plan-export.js +8 -2
  28. package/dist-client/pages/project/popup/popup-plan-export.js.map +1 -1
  29. package/dist-client/pages/project/popup/{popup-schedule-upload.d.ts → popup-task-upload.d.ts} +1 -1
  30. package/dist-client/pages/project/popup/{popup-schedule-upload.js → popup-task-upload.js} +9 -9
  31. package/dist-client/pages/project/popup/popup-task-upload.js.map +1 -0
  32. package/dist-client/pages/project/project-completed-list.d.ts +5 -0
  33. package/dist-client/pages/project/project-completed-list.js +32 -3
  34. package/dist-client/pages/project/project-completed-list.js.map +1 -1
  35. package/dist-client/pages/project/project-detail.d.ts +6 -0
  36. package/dist-client/pages/project/project-detail.js +225 -89
  37. package/dist-client/pages/project/project-detail.js.map +1 -1
  38. package/dist-client/pages/project/project-list.d.ts +57 -0
  39. package/dist-client/pages/project/project-list.js +80 -9
  40. package/dist-client/pages/project/project-list.js.map +1 -1
  41. package/dist-client/pages/project/project-plan-management.js +6 -1
  42. package/dist-client/pages/project/project-plan-management.js.map +1 -1
  43. package/dist-client/pages/project/project-setting-list.d.ts +7 -0
  44. package/dist-client/pages/project/project-setting-list.js +61 -7
  45. package/dist-client/pages/project/project-setting-list.js.map +1 -1
  46. package/dist-client/pages/project/{project-schedule-list.d.ts → project-task-list.d.ts} +2 -2
  47. package/dist-client/pages/project/{project-schedule-list.js → project-task-list.js} +11 -11
  48. package/dist-client/pages/project/project-task-list.js.map +1 -0
  49. package/dist-client/pages/project/{project-schedule.d.ts → project-task.d.ts} +17 -4
  50. package/dist-client/pages/project/project-task.js +691 -0
  51. package/dist-client/pages/project/project-task.js.map +1 -0
  52. package/dist-client/pages/project/project-update.d.ts +34 -0
  53. package/dist-client/pages/project/project-update.js +508 -35
  54. package/dist-client/pages/project/project-update.js.map +1 -1
  55. package/dist-client/pages/resource/construction-type-management.js +14 -0
  56. package/dist-client/pages/resource/construction-type-management.js.map +1 -1
  57. package/dist-client/pages/resource/resource-list-page.d.ts +1 -2
  58. package/dist-client/pages/resource/resource-list-page.js +1 -2
  59. package/dist-client/pages/resource/resource-list-page.js.map +1 -1
  60. package/dist-client/pages/task/task-list-page.d.ts +1 -2
  61. package/dist-client/pages/task/task-list-page.js +1 -2
  62. package/dist-client/pages/task/task-list-page.js.map +1 -1
  63. package/dist-client/pages/task-resource/task-resource-list-page.d.ts +1 -2
  64. package/dist-client/pages/task-resource/task-resource-list-page.js +1 -2
  65. package/dist-client/pages/task-resource/task-resource-list-page.js.map +1 -1
  66. package/dist-client/route.d.ts +1 -1
  67. package/dist-client/route.js +4 -4
  68. package/dist-client/route.js.map +1 -1
  69. package/dist-client/shared/domain-context.d.ts +18 -0
  70. package/dist-client/shared/domain-context.js +28 -0
  71. package/dist-client/shared/domain-context.js.map +1 -0
  72. package/dist-client/tsconfig.tsbuildinfo +1 -1
  73. package/dist-client/viewparts/domain-switch.d.ts +19 -0
  74. package/dist-client/viewparts/domain-switch.js +266 -0
  75. package/dist-client/viewparts/domain-switch.js.map +1 -0
  76. package/dist-server/controllers/parse-excel.js.map +1 -1
  77. package/dist-server/migrations/1723861466414-seed-codes.js +1 -1
  78. package/dist-server/migrations/1723861466414-seed-codes.js.map +1 -1
  79. package/dist-server/service/construction-type/construction-type-query.d.ts +2 -2
  80. package/dist-server/service/construction-type/construction-type-query.js +5 -10
  81. package/dist-server/service/construction-type/construction-type-query.js.map +1 -1
  82. package/dist-server/service/construction-type/construction-type-type.d.ts +1 -0
  83. package/dist-server/service/construction-type/construction-type-type.js +4 -0
  84. package/dist-server/service/construction-type/construction-type-type.js.map +1 -1
  85. package/dist-server/service/construction-type/construction-type.d.ts +1 -0
  86. package/dist-server/service/construction-type/construction-type.js +5 -0
  87. package/dist-server/service/construction-type/construction-type.js.map +1 -1
  88. package/dist-server/service/index.d.ts +2 -2
  89. package/dist-server/service/index.js +5 -2
  90. package/dist-server/service/index.js.map +1 -1
  91. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.d.ts +2 -2
  92. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.js +5 -10
  93. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.js.map +1 -1
  94. package/dist-server/service/manager/manager-query.d.ts +1 -1
  95. package/dist-server/service/manager/manager-query.js +2 -6
  96. package/dist-server/service/manager/manager-query.js.map +1 -1
  97. package/dist-server/service/project/issue-project-code.d.ts +7 -0
  98. package/dist-server/service/project/issue-project-code.js +27 -0
  99. package/dist-server/service/project/issue-project-code.js.map +1 -0
  100. package/dist-server/service/project/project-mutation.d.ts +2 -0
  101. package/dist-server/service/project/project-mutation.js +109 -11
  102. package/dist-server/service/project/project-mutation.js.map +1 -1
  103. package/dist-server/service/project/project-query.d.ts +13 -2
  104. package/dist-server/service/project/project-query.js +138 -13
  105. package/dist-server/service/project/project-query.js.map +1 -1
  106. package/dist-server/service/project/project-type.d.ts +10 -2
  107. package/dist-server/service/project/project-type.js +32 -2
  108. package/dist-server/service/project/project-type.js.map +1 -1
  109. package/dist-server/service/project/project.d.ts +22 -0
  110. package/dist-server/service/project/project.js +84 -2
  111. package/dist-server/service/project/project.js.map +1 -1
  112. package/dist-server/service/resource/resource-mutation.js +5 -6
  113. package/dist-server/service/resource/resource-mutation.js.map +1 -1
  114. package/dist-server/service/resource/resource-query.d.ts +2 -2
  115. package/dist-server/service/resource/resource-query.js +5 -10
  116. package/dist-server/service/resource/resource-query.js.map +1 -1
  117. package/dist-server/service/task/task-query.d.ts +2 -0
  118. package/dist-server/service/task/task-query.js +11 -0
  119. package/dist-server/service/task/task-query.js.map +1 -1
  120. package/dist-server/service/task/task.d.ts +2 -0
  121. package/dist-server/service/task/task.js +6 -0
  122. package/dist-server/service/task/task.js.map +1 -1
  123. package/dist-server/service/task-checklist-binding/index.d.ts +5 -0
  124. package/dist-server/service/task-checklist-binding/index.js +9 -0
  125. package/dist-server/service/task-checklist-binding/index.js.map +1 -0
  126. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.d.ts +5 -0
  127. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.js +186 -0
  128. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.js.map +1 -0
  129. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.d.ts +8 -0
  130. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.js +61 -0
  131. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.js.map +1 -0
  132. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.d.ts +15 -0
  133. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.js +57 -0
  134. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.js.map +1 -0
  135. package/dist-server/service/task-checklist-binding/task-checklist-binding.d.ts +22 -0
  136. package/dist-server/service/task-checklist-binding/task-checklist-binding.js +106 -0
  137. package/dist-server/service/task-checklist-binding/task-checklist-binding.js.map +1 -0
  138. package/dist-server/service/task-resource/task-resource-query.d.ts +2 -2
  139. package/dist-server/service/task-resource/task-resource-query.js +4 -9
  140. package/dist-server/service/task-resource/task-resource-query.js.map +1 -1
  141. package/dist-server/service/worker-type/worker-type-query.d.ts +2 -2
  142. package/dist-server/service/worker-type/worker-type-query.js +5 -10
  143. package/dist-server/service/worker-type/worker-type-query.js.map +1 -1
  144. package/dist-server/tsconfig.tsbuildinfo +1 -1
  145. package/package.json +15 -13
  146. package/things-factory.config.js +3 -3
  147. package/translations/en.json +10 -9
  148. package/translations/ja.json +15 -1
  149. package/translations/ko.json +3 -0
  150. package/translations/ms.json +15 -1
  151. package/translations/zh.json +15 -1
  152. package/dist-client/pages/project/popup/popup-schedule-upload.js.map +0 -1
  153. package/dist-client/pages/project/project-schedule-list.js.map +0 -1
  154. package/dist-client/pages/project/project-schedule.js +0 -407
  155. package/dist-client/pages/project/project-schedule.js.map +0 -1
@@ -10,9 +10,10 @@ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
10
10
  import { client } from '@operato/graphql';
11
11
  import { ScrollbarStyles } from '@operato/styles';
12
12
  import gql from 'graphql-tag';
13
- import { BUILDING_INSPECTION_STATUS, ProjectType } from './project-list';
13
+ import { BUILDING_INSPECTION_STATUS, BUILDING_INSPECTION_RE_STATUS, ProjectType } from './project-list';
14
14
  import _getWeather from '../lib/waether';
15
15
  import '@operato/chart/ox-progress-circle.js';
16
+ import { isProjectTypeDomain } from '../../shared/domain-context';
16
17
  let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
17
18
  constructor() {
18
19
  super(...arguments);
@@ -36,8 +37,11 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
36
37
  wait: 0,
37
38
  request: 0,
38
39
  pass: 0,
39
- fail: 0
40
+ fail: 0,
41
+ reWait: 0
40
42
  };
43
+ this.statusFilter = '';
44
+ this.configProjectType = '';
41
45
  this.weather = {
42
46
  rain: 0,
43
47
  temperature: 0,
@@ -47,43 +51,79 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
47
51
  };
48
52
  }
49
53
  get context() {
54
+ var _a;
50
55
  return {
51
- title: '진행 프로젝트 상세 정보'
56
+ title: !isProjectTypeDomain() && ((_a = this.project) === null || _a === void 0 ? void 0 : _a.name)
57
+ ? `진행 중 프로젝트 상세 정보 - ${this.project.name}`
58
+ : '진행 중 프로젝트 상세 정보'
52
59
  };
53
60
  }
54
61
  render() {
55
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
62
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;
56
63
  let totalInspectionCount = this.inspectionSummary.pass + this.inspectionSummary.fail + this.inspectionSummary.request + this.inspectionSummary.wait;
57
64
  return html `
58
65
  <div header>
59
- <h2>${this.project.name}</h2>
66
+ <h2>
67
+ <md-icon slot="icon" back @click=${() => history.back()}>arrow_back</md-icon>
68
+ ${this.project.name}
69
+ </h2>
60
70
  <div button-container>
61
- <md-elevated-button href=${`project-update/${this.project.id}`}>
62
- <md-icon slot="icon">assignment</md-icon>프로젝트 정보 수정
63
- </md-elevated-button>
64
- <md-elevated-button href=${`project-plan-management/${this.project.id}`}>
65
- <md-icon slot="icon">description</md-icon>도면 관리
66
- </md-elevated-button>
67
- <md-elevated-button href=${`project-schedule/${this.project.id}`}>
68
- <md-icon slot="icon">event_note</md-icon>공정표 관리
69
- </md-elevated-button>
71
+ ${this.configProjectType === ProjectType.DCSP
72
+ ? html `
73
+ <md-elevated-button href="employee-list"> <md-icon slot="icon">badge</md-icon>인력 관리 </md-elevated-button>
74
+ <md-elevated-button href=${`project-plan-management/${this.project.id}`}>
75
+ <md-icon slot="icon">description</md-icon>도면 관리
76
+ </md-elevated-button>
77
+ <md-elevated-button href=${`project-task/${this.project.id}`}>
78
+ <md-icon slot="icon">event_note</md-icon>공정표 관리
79
+ </md-elevated-button>
80
+ <md-elevated-button href=${`project-checklist-management/${this.project.id}`}>
81
+ <md-icon slot="icon">checklist</md-icon>체크리스트 관리
82
+ </md-elevated-button>
83
+ <md-elevated-button href=${`building-inspection-management/${this.project.id}`}>
84
+ <md-icon slot="icon">open_in_new</md-icon>업무 바로가기
85
+ </md-elevated-button>
86
+ `
87
+ : html `
88
+ <md-elevated-button
89
+ target="_blank"
90
+ href=${((_a = this.project.buildingComplex) === null || _a === void 0 ? void 0 : _a.virtualTourLink) || ''}
91
+ ?disabled=${!((_b = this.project.buildingComplex) === null || _b === void 0 ? void 0 : _b.virtualTourLink)}
92
+ >
93
+ <md-icon slot="icon">smart_toy</md-icon>Virtual Tour
94
+ </md-elevated-button>
95
+ <md-elevated-button href=${`project-update/${this.project.id}`}>
96
+ <md-icon slot="icon">assignment</md-icon>프로젝트 정보 수정
97
+ </md-elevated-button>
98
+ <md-elevated-button href=${`project-plan-management/${this.project.id}`}>
99
+ <md-icon slot="icon">description</md-icon>도면 관리
100
+ </md-elevated-button>
101
+ <md-elevated-button href=${`project-task/${this.project.id}`}>
102
+ <md-icon slot="icon">event_note</md-icon>공정표 관리
103
+ </md-elevated-button>
104
+ `}
70
105
  </div>
71
106
  </div>
72
107
 
73
108
  <div body>
74
109
  <div>
75
110
  <div left-top>
76
- <h3>기본 정보</h3>
111
+ <h3>
112
+ 기본 정보
113
+ <md-elevated-button href=${`project-update/${this.project.id}`}>
114
+ <md-icon slot="icon">assignment</md-icon>프로젝트 정보 수정
115
+ </md-elevated-button>
116
+ </h3>
77
117
  <div content-1>
78
118
  <img
79
- ?no-image=${!((_a = this.project.mainPhoto) === null || _a === void 0 ? void 0 : _a.fullpath)}
80
- src=${((_b = this.project.mainPhoto) === null || _b === void 0 ? void 0 : _b.fullpath) || '/assets/images/no-image.png'}
119
+ ?no-image=${!((_c = this.project.mainPhoto) === null || _c === void 0 ? void 0 : _c.fullpath)}
120
+ src=${((_d = this.project.mainPhoto) === null || _d === void 0 ? void 0 : _d.fullpath) || '/assets/images/no-image.png'}
81
121
  />
82
122
 
83
123
  <div>
84
124
  <div row>
85
125
  <span>- 면적 : </span>
86
- <span>${(_d = (_c = this.project.buildingComplex) === null || _c === void 0 ? void 0 : _c.area) === null || _d === void 0 ? void 0 : _d.toLocaleString()} ㎡</span>
126
+ <span>${(_f = (_e = this.project.buildingComplex) === null || _e === void 0 ? void 0 : _e.area) === null || _f === void 0 ? void 0 : _f.toLocaleString()} ㎡</span>
87
127
  </div>
88
128
  <div row>
89
129
  <span>- 착공~준공 : </span>
@@ -91,19 +131,19 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
91
131
  </div>
92
132
  <div row>
93
133
  <span>- 발주처 : </span>
94
- <span>${(_e = this.project.buildingComplex) === null || _e === void 0 ? void 0 : _e.clientCompany}</span>
134
+ <span>${(_g = this.project.buildingComplex) === null || _g === void 0 ? void 0 : _g.clientCompany}</span>
95
135
  </div>
96
136
  <div row>
97
137
  <span>- 건설사 : </span>
98
- <span>${(_f = this.project.buildingComplex) === null || _f === void 0 ? void 0 : _f.constructionCompany}</span>
138
+ <span>${(_h = this.project.buildingComplex) === null || _h === void 0 ? void 0 : _h.constructionCompany}</span>
99
139
  </div>
100
140
  <div row>
101
141
  <span>- 감리사 : </span>
102
- <span>${(_g = this.project.buildingComplex) === null || _g === void 0 ? void 0 : _g.supervisoryCompany}</span>
142
+ <span>${(_j = this.project.buildingComplex) === null || _j === void 0 ? void 0 : _j.supervisoryCompany}</span>
103
143
  </div>
104
144
  <div row>
105
145
  <span>- 설계사 : </span>
106
- <span>${(_h = this.project.buildingComplex) === null || _h === void 0 ? void 0 : _h.designCompany}</span>
146
+ <span>${(_k = this.project.buildingComplex) === null || _k === void 0 ? void 0 : _k.designCompany}</span>
107
147
  </div>
108
148
  </div>
109
149
  </div>
@@ -111,38 +151,37 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
111
151
  <div content-2>
112
152
  <div row>
113
153
  <span>- 건설구분 : </span>
114
- <span>${(_j = this.project.buildingComplex) === null || _j === void 0 ? void 0 : _j.constructionType}</span>
154
+ <span>${(_l = this.project.buildingComplex) === null || _l === void 0 ? void 0 : _l.constructionType}</span>
115
155
  </div>
116
156
  <div row>
117
157
  <span>- 공사금액 : </span>
118
- <span>${(_l = (_k = this.project.buildingComplex) === null || _k === void 0 ? void 0 : _k.constructionCost) === null || _l === void 0 ? void 0 : _l.toLocaleString()} 원</span>
158
+ <span>${(_o = (_m = this.project.buildingComplex) === null || _m === void 0 ? void 0 : _m.constructionCost) === null || _o === void 0 ? void 0 : _o.toLocaleString()} 억원</span>
119
159
  </div>
120
160
  <div row>
121
161
  <span>- 세대수 : </span>
122
- <span>${(_o = (_m = this.project.buildingComplex) === null || _m === void 0 ? void 0 : _m.householdCount) === null || _o === void 0 ? void 0 : _o.toLocaleString()}</span>
162
+ <span>${(_q = (_p = this.project.buildingComplex) === null || _p === void 0 ? void 0 : _p.householdCount) === null || _q === void 0 ? void 0 : _q.toLocaleString()}</span>
123
163
  </div>
124
164
  <div row>
125
165
  <span>- 기타 : </span>
126
- <span>${(_p = this.project.buildingComplex) === null || _p === void 0 ? void 0 : _p.etc}</span>
166
+ <span>${(_r = this.project.buildingComplex) === null || _r === void 0 ? void 0 : _r.etc}</span>
127
167
  </div>
128
168
  </div>
129
169
  </div>
130
170
 
131
171
  <div left-bottom>
132
- <h3>조감도(BIM도면)</h3>
133
- ${((_r = (_q = this.project.buildingComplex) === null || _q === void 0 ? void 0 : _q.drawing) === null || _r === void 0 ? void 0 : _r.fullpath)
172
+ <h3>
173
+ 조감도(BIM도면)
174
+ <md-elevated-button
175
+ target="_blank"
176
+ href=${((_s = this.project.buildingComplex) === null || _s === void 0 ? void 0 : _s.virtualTourLink) || ''}
177
+ ?disabled=${!((_t = this.project.buildingComplex) === null || _t === void 0 ? void 0 : _t.virtualTourLink)}
178
+ >
179
+ <md-icon slot="icon">smart_toy</md-icon>Virtual Tour
180
+ </md-elevated-button>
181
+ </h3>
182
+ ${((_v = (_u = this.project.buildingComplex) === null || _u === void 0 ? void 0 : _u.drawing) === null || _v === void 0 ? void 0 : _v.fullpath)
134
183
  ? html `<div building-complex-img></div>`
135
184
  : html `<img building-complex-img src="/assets/images/img-building-complex-default.jpg" />`}
136
- <div>
137
- <div subject bold>개별 단지 상세정보 바로가기</div>
138
- <div building-container>
139
- ${(_t = (_s = this.project.buildingComplex) === null || _s === void 0 ? void 0 : _s.buildings) === null || _t === void 0 ? void 0 : _t.map(building => {
140
- return html `<md-outlined-button href=${`building-complex-detail/${this.project.id}?buildingId=${building.id}`}>
141
- ${building.name}
142
- </md-outlined-button>`;
143
- })}
144
- </div>
145
- </div>
146
185
  </div>
147
186
  </div>
148
187
 
@@ -177,14 +216,14 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
177
216
  <div kpi-info-item>
178
217
  <span kpi-info-label>검측 통과율</span>
179
218
  <span kpi-info-value>
180
- <span bold>${((_u = this.inspectionSummary.pass) === null || _u === void 0 ? void 0 : _u.toLocaleString()) || 0}</span>
219
+ <span bold>${((_w = this.inspectionSummary.pass) === null || _w === void 0 ? void 0 : _w.toLocaleString()) || 0}</span>
181
220
  <span small> / ${(totalInspectionCount === null || totalInspectionCount === void 0 ? void 0 : totalInspectionCount.toLocaleString()) || 0}</span>
182
221
  </span>
183
222
  </div>
184
223
  <div kpi-info-item>
185
224
  <span kpi-info-label>작업 중 로봇</span>
186
225
  <span kpi-info-value>
187
- <span bold>${((_v = this.project.robotCount) === null || _v === void 0 ? void 0 : _v.toLocaleString()) || 0}</span>
226
+ <span bold>${((_x = this.project.robotCount) === null || _x === void 0 ? void 0 : _x.toLocaleString()) || 0}</span>
188
227
  <span small> 대</span>
189
228
  </span>
190
229
  </div>
@@ -279,36 +318,41 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
279
318
  </span>
280
319
  </div>
281
320
  </div>
321
+ <div notice>
322
+ <div name bold>공지사항</div>
323
+ <div content>${this.project.buildingComplex.notice}</div>
324
+ </div>
325
+
282
326
  <div inspection>
283
327
  <span name bold>
284
328
  <md-icon slot="icon">list_alt_add</md-icon>
285
- 시공검측<br />현황
329
+ 작업 현황
286
330
  </span>
287
- <span>
288
- <div>검측요청</div>
289
- <div bold>${this.inspectionSummary.wait}</div>
331
+ <span ?active=${this.statusFilter === 'WAIT'} @click=${() => this._onClickStatusFilter('WAIT')}>
332
+ <div>작업 완료</div>
333
+ <div bold wait>${(this.inspectionSummary.wait || 0) - (this.inspectionSummary.reWait || 0)}</div>
290
334
  </span>
291
- <span>
292
- <div>검측대기</div>
293
- <div bold>${this.inspectionSummary.request}</div>
335
+ <span ?active=${this.statusFilter === 'REQUEST'} @click=${() => this._onClickStatusFilter('REQUEST')}>
336
+ <div>감리 대기</div>
337
+ <div bold request>${this.inspectionSummary.request}</div>
294
338
  </span>
295
- <span>
296
- <div>합격</div>
297
- <div bold pass>${this.inspectionSummary.pass}</div>
298
- </span>
299
- <span>
300
- <div>불합격</div>
339
+ <span ?active=${this.statusFilter === 'FAIL'} @click=${() => this._onClickStatusFilter('FAIL')}>
340
+ <div>조치 필요</div>
301
341
  <div bold fail>${this.inspectionSummary.fail}</div>
302
342
  </span>
303
- </div>
304
- <div notice>
305
- <div name bold>공지사항</div>
306
- <div content>${this.project.buildingComplex.notice}</div>
343
+ <span ?active=${this.statusFilter === 'RE_WAIT'} @click=${() => this._onClickStatusFilter('RE_WAIT')}>
344
+ <div>재검측 대기</div>
345
+ <div bold re-wait>${this.inspectionSummary.reWait || 0}</div>
346
+ </span>
347
+ <span ?active=${this.statusFilter === 'PASS'} @click=${() => this._onClickStatusFilter('PASS')}>
348
+ <div>검측 완료</div>
349
+ <div bold pass>${this.inspectionSummary.pass}</div>
350
+ </span>
307
351
  </div>
308
352
  </div>
309
353
 
310
354
  <div right-bottom>
311
- <h3>검측 현황</h3>
355
+ <h3>검측 현황${this.statusFilter ? ` (${this._getStatusFilterLabel()} 목록)` : ''}</h3>
312
356
  <div table-container>
313
357
  <hr />
314
358
  <table>
@@ -319,7 +363,7 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
319
363
  <th width="10%">공종</th>
320
364
  <th width="22%">내용</th>
321
365
  <th width="15%">검측 요청일</th>
322
- <th width="10%">검측 결과</th>
366
+ <th width="10%">작업 상태</th>
323
367
  </tr>
324
368
  </thead>
325
369
  <tbody>
@@ -332,7 +376,8 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
332
376
  <td>${((_f = (_e = inspection.checklist) === null || _e === void 0 ? void 0 : _e.inspectionParts) === null || _f === void 0 ? void 0 : _f.join(', ')) || ''}</td>
333
377
  <td>${this._formatDate(inspection.requestDate)}</td>
334
378
  <td bold status=${inspection.status || ''}>
335
- ${inspection.status && BUILDING_INSPECTION_STATUS[inspection.status]}
379
+ ${inspection.status &&
380
+ ((inspection.failCount || 0) > 0 ? BUILDING_INSPECTION_RE_STATUS : BUILDING_INSPECTION_STATUS)[inspection.status]}
336
381
  </td>
337
382
  </tr>`;
338
383
  })}
@@ -346,10 +391,39 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
346
391
  }
347
392
  async pageInitialized(lifecycle) { }
348
393
  async pageUpdated(changes, lifecycle) {
394
+ var _a, _b;
349
395
  if (this.active) {
350
396
  this.projectId = lifecycle.resourceId || '';
351
- await this.initProject(lifecycle.resourceId);
397
+ // resourceId 없이 진입한 경우 (프로젝트 테넌트 → / 접속)
398
+ if (!this.projectId) {
399
+ const res = await client.query({
400
+ query: gql `
401
+ query {
402
+ currentProject {
403
+ id
404
+ }
405
+ }
406
+ `
407
+ });
408
+ const projectId = (_b = (_a = res.data) === null || _a === void 0 ? void 0 : _a.currentProject) === null || _b === void 0 ? void 0 : _b.id;
409
+ if (projectId) {
410
+ navigate(`project-detail/${projectId}`);
411
+ return;
412
+ }
413
+ }
414
+ await Promise.all([this.initProject(lifecycle.resourceId), this._fetchProjectType()]);
415
+ }
416
+ }
417
+ async _fetchProjectType() {
418
+ var _a;
419
+ const response = await client.query({
420
+ query: gql `
421
+ query {
422
+ currentProjectType
352
423
  }
424
+ `
425
+ });
426
+ this.configProjectType = ((_a = response.data) === null || _a === void 0 ? void 0 : _a.currentProjectType) || '';
353
427
  }
354
428
  async initProject(projectId = '') {
355
429
  var _a, _b, _c, _d, _e;
@@ -393,6 +467,7 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
393
467
  notice
394
468
  householdCount
395
469
  buildingCount
470
+ virtualTourLink
396
471
  buildings {
397
472
  id
398
473
  name
@@ -406,12 +481,14 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
406
481
  request
407
482
  pass
408
483
  fail
484
+ reWait
409
485
  }
410
486
 
411
487
  buildingInspectionsOfProject(params: $params) {
412
488
  items {
413
489
  id
414
490
  status
491
+ failCount
415
492
  requestDate
416
493
  buildingLevel {
417
494
  id
@@ -436,10 +513,7 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
436
513
  variables: {
437
514
  id: projectId,
438
515
  projectId,
439
- params: {
440
- projectId,
441
- limit: 10
442
- }
516
+ params: Object.assign({ projectId, limit: 10 }, (this.statusFilter ? { statusFilter: this.statusFilter } : {}))
443
517
  }
444
518
  });
445
519
  if (response.errors)
@@ -447,11 +521,27 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
447
521
  this.project = ((_a = response.data) === null || _a === void 0 ? void 0 : _a.project) || {};
448
522
  this.inspectionSummary = ((_b = response.data) === null || _b === void 0 ? void 0 : _b.inspectionSummary) || {};
449
523
  this.buildingInspections = ((_d = (_c = response.data) === null || _c === void 0 ? void 0 : _c.buildingInspectionsOfProject) === null || _d === void 0 ? void 0 : _d.items) || [];
524
+ this.updateContext();
450
525
  const { latitude, longitude } = (_e = this.project) === null || _e === void 0 ? void 0 : _e.buildingComplex;
451
526
  if (latitude && longitude) {
452
527
  this.weather = await _getWeather(latitude, longitude);
453
528
  }
454
529
  }
530
+ async _onClickStatusFilter(filter) {
531
+ // 같은 필터 클릭 시 해제
532
+ this.statusFilter = this.statusFilter === filter ? '' : filter;
533
+ await this.initProject(this.projectId);
534
+ }
535
+ _getStatusFilterLabel() {
536
+ const labels = {
537
+ WAIT: '작업 완료',
538
+ REQUEST: '감리 대기',
539
+ FAIL: '조치 필요',
540
+ RE_WAIT: '재검측 대기',
541
+ PASS: '검측 완료'
542
+ };
543
+ return labels[this.statusFilter] || '';
544
+ }
455
545
  _onClickInspection(buildingInspection) {
456
546
  var _a, _b, _c;
457
547
  console.log('buildingInspection :', buildingInspection);
@@ -463,14 +553,20 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
463
553
  }
464
554
  }
465
555
  _formatDate(date) {
466
- return date
467
- ? new Intl.DateTimeFormat('en-CA', {
556
+ if (!date)
557
+ return '';
558
+ try {
559
+ const parsed = typeof date === 'string' && /^\d+$/.test(date) ? new Date(Number(date)) : new Date(date);
560
+ return new Intl.DateTimeFormat('en-CA', {
468
561
  timeZone: 'Asia/Seoul',
469
562
  year: 'numeric',
470
563
  month: '2-digit',
471
564
  day: '2-digit'
472
- }).format(new Date(date))
473
- : '';
565
+ }).format(parsed);
566
+ }
567
+ catch (_a) {
568
+ return String(date).split('T')[0] || '';
569
+ }
474
570
  }
475
571
  };
476
572
  ProjectDetail.styles = [
@@ -505,9 +601,28 @@ ProjectDetail.styles = [
505
601
  margin: 0px var(--spacing-large, 12px);
506
602
 
507
603
  h2 {
604
+ display: flex;
605
+ gap: 7px;
508
606
  flex: 0.5;
509
607
  color: #3f71a0;
510
608
  font-size: 18px;
609
+
610
+ md-icon[back] {
611
+ background: linear-gradient(135deg, #3f71a0 0%, #5a8cc7 100%);
612
+ color: white;
613
+ padding: 8px;
614
+ border-radius: 50%;
615
+ cursor: pointer;
616
+ box-shadow: 0 2px 8px rgba(63, 113, 160, 0.3);
617
+ width: 14px;
618
+ height: 14px;
619
+ --md-icon-size: 20px;
620
+ }
621
+
622
+ md-icon[back]:hover {
623
+ background: linear-gradient(135deg, #2e5c89 0%, #4a7bb0 100%);
624
+ box-shadow: 0 4px 12px rgba(63, 113, 160, 0.4);
625
+ }
511
626
  }
512
627
 
513
628
  div[button-container] {
@@ -542,6 +657,9 @@ ProjectDetail.styles = [
542
657
  gap: var(--spacing-medium, 8px);
543
658
 
544
659
  h3 {
660
+ display: flex;
661
+ align-items: center;
662
+ justify-content: space-between;
545
663
  color: #2e79be;
546
664
  font-size: 16px;
547
665
  margin: 0px;
@@ -550,6 +668,20 @@ ProjectDetail.styles = [
550
668
  text-decoration: none;
551
669
  color: #2e79be;
552
670
  }
671
+
672
+ md-elevated-button {
673
+ --md-elevated-button-container-height: 28px;
674
+ --md-elevated-button-label-text-size: 13px;
675
+ --md-elevated-button-container-color: #0595e5;
676
+ --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);
677
+ --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);
678
+ --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);
679
+ --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);
680
+ --md-elevated-button-icon-color: var(--md-sys-color-on-primary);
681
+ --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);
682
+ --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);
683
+ --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);
684
+ }
553
685
  }
554
686
 
555
687
  & > div {
@@ -608,25 +740,6 @@ ProjectDetail.styles = [
608
740
  img {
609
741
  opacity: 0.5;
610
742
  }
611
-
612
- div[subject] {
613
- margin-bottom: var(--spacing-small, 4px);
614
- }
615
-
616
- div[building-container] {
617
- display: block;
618
-
619
- & > * {
620
- margin-right: var(--spacing-medium, 8px);
621
- margin-bottom: var(--spacing-medium, 8px);
622
- }
623
- md-outlined-button {
624
- --md-outlined-button-container-height: 30px;
625
- --md-outlined-button-trailing-space: var(--spacing-medium, 8px);
626
- --md-outlined-button-leading-space: var(--spacing-medium, 8px);
627
- --md-sys-color-outline: rgba(51, 51, 51, 0.2);
628
- }
629
- }
630
743
  }
631
744
 
632
745
  div[right-top] {
@@ -690,7 +803,7 @@ ProjectDetail.styles = [
690
803
  }
691
804
  div[inspection] {
692
805
  display: grid;
693
- grid-template-columns: 1.4fr 0.9fr 0.9fr 0.9fr 0.9fr;
806
+ grid-template-columns: 1.4fr 0.9fr 0.9fr 0.9fr 0.9fr 0.9fr;
694
807
  margin-top: 10px;
695
808
  background: #f6f6f6;
696
809
  border-radius: 7px;
@@ -701,6 +814,18 @@ ProjectDetail.styles = [
701
814
  flex-direction: column;
702
815
  align-items: center;
703
816
  justify-content: center;
817
+ border-radius: 5px;
818
+ padding: 4px 0;
819
+
820
+ &:not([name]) {
821
+ cursor: pointer;
822
+ }
823
+ &:not([name]):hover {
824
+ background: #e8e8e8;
825
+ }
826
+ &[active] {
827
+ background: #dceefb;
828
+ }
704
829
 
705
830
  div[wait] {
706
831
  color: #4e5055;
@@ -714,6 +839,9 @@ ProjectDetail.styles = [
714
839
  div[fail] {
715
840
  color: #ff4444;
716
841
  }
842
+ div[re-wait] {
843
+ color: #e89c0e;
844
+ }
717
845
  }
718
846
  & > span[name] {
719
847
  flex-direction: row;
@@ -918,6 +1046,14 @@ __decorate([
918
1046
  state(),
919
1047
  __metadata("design:type", Object)
920
1048
  ], ProjectDetail.prototype, "inspectionSummary", void 0);
1049
+ __decorate([
1050
+ state(),
1051
+ __metadata("design:type", String)
1052
+ ], ProjectDetail.prototype, "statusFilter", void 0);
1053
+ __decorate([
1054
+ state(),
1055
+ __metadata("design:type", String)
1056
+ ], ProjectDetail.prototype, "configProjectType", void 0);
921
1057
  __decorate([
922
1058
  state(),
923
1059
  __metadata("design:type", Object)