@dssp/project 1.0.0-alpha.1 → 1.0.0-alpha.101

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 (235) 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 +36 -36
  9. package/dist-client/pages/lib/select2-component.js.map +1 -1
  10. package/dist-client/pages/lib/waether.d.ts +2 -1
  11. package/dist-client/pages/lib/waether.js +7 -3
  12. package/dist-client/pages/lib/waether.js.map +1 -1
  13. package/dist-client/pages/project/component/pagenation.d.ts +18 -0
  14. package/dist-client/pages/project/component/pagenation.js +142 -0
  15. package/dist-client/pages/project/component/pagenation.js.map +1 -0
  16. package/dist-client/pages/project/component/project-update-header.js +26 -3
  17. package/dist-client/pages/project/component/project-update-header.js.map +1 -1
  18. package/dist-client/pages/project/popup/checklist/task-checklist-attachment-list-popup.d.ts +1 -0
  19. package/dist-client/pages/project/popup/checklist/task-checklist-attachment-list-popup.js +308 -0
  20. package/dist-client/pages/project/popup/checklist/task-checklist-attachment-list-popup.js.map +1 -0
  21. package/dist-client/pages/project/popup/checklist/task-checklist-comment-list-popup.d.ts +1 -0
  22. package/dist-client/pages/project/popup/checklist/task-checklist-comment-list-popup.js +356 -0
  23. package/dist-client/pages/project/popup/checklist/task-checklist-comment-list-popup.js.map +1 -0
  24. package/dist-client/pages/project/popup/checklist/task-checklist-create-popup.d.ts +1 -0
  25. package/dist-client/pages/project/popup/checklist/task-checklist-create-popup.js +682 -0
  26. package/dist-client/pages/project/popup/checklist/task-checklist-create-popup.js.map +1 -0
  27. package/dist-client/pages/project/popup/checklist/task-checklist-view.d.ts +33 -0
  28. package/dist-client/pages/project/popup/checklist/task-checklist-view.js +676 -0
  29. package/dist-client/pages/project/popup/checklist/task-checklist-view.js.map +1 -0
  30. package/dist-client/pages/project/popup/popup-plan-export.d.ts +10 -0
  31. package/dist-client/pages/project/popup/popup-plan-export.js +242 -0
  32. package/dist-client/pages/project/popup/popup-plan-export.js.map +1 -0
  33. package/dist-client/pages/project/popup/popup-plan-upload.d.ts +3 -0
  34. package/dist-client/pages/project/popup/popup-plan-upload.js +130 -4
  35. package/dist-client/pages/project/popup/popup-plan-upload.js.map +1 -1
  36. package/dist-client/pages/project/popup/popup-project-create.js.map +1 -1
  37. package/dist-client/pages/project/popup/{popup-schedule-upload.d.ts → popup-task-upload.d.ts} +1 -1
  38. package/dist-client/pages/project/popup/{popup-schedule-upload.js → popup-task-upload.js} +9 -9
  39. package/dist-client/pages/project/popup/popup-task-upload.js.map +1 -0
  40. package/dist-client/pages/project/project-completed-list.d.ts +5 -0
  41. package/dist-client/pages/project/project-completed-list.js +32 -4
  42. package/dist-client/pages/project/project-completed-list.js.map +1 -1
  43. package/dist-client/pages/project/project-detail.d.ts +8 -1
  44. package/dist-client/pages/project/project-detail.js +488 -163
  45. package/dist-client/pages/project/project-detail.js.map +1 -1
  46. package/dist-client/pages/project/project-list.d.ts +69 -0
  47. package/dist-client/pages/project/project-list.js +94 -16
  48. package/dist-client/pages/project/project-list.js.map +1 -1
  49. package/dist-client/pages/project/project-plan-management.js +35 -14
  50. package/dist-client/pages/project/project-plan-management.js.map +1 -1
  51. package/dist-client/pages/project/project-setting-list.d.ts +7 -0
  52. package/dist-client/pages/project/project-setting-list.js +82 -27
  53. package/dist-client/pages/project/project-setting-list.js.map +1 -1
  54. package/dist-client/pages/project/{project-schedule-list.d.ts → project-task-list.d.ts} +2 -2
  55. package/dist-client/pages/project/{project-schedule-list.js → project-task-list.js} +11 -11
  56. package/dist-client/pages/project/project-task-list.js.map +1 -0
  57. package/dist-client/pages/project/{project-schedule.d.ts → project-task.d.ts} +17 -4
  58. package/dist-client/pages/project/project-task.js +692 -0
  59. package/dist-client/pages/project/project-task.js.map +1 -0
  60. package/dist-client/pages/project/project-update.d.ts +35 -0
  61. package/dist-client/pages/project/project-update.js +633 -49
  62. package/dist-client/pages/project/project-update.js.map +1 -1
  63. package/dist-client/pages/resource/construction-detail-type-popup.js.map +1 -1
  64. package/dist-client/pages/resource/construction-type-management.js +14 -0
  65. package/dist-client/pages/resource/construction-type-management.js.map +1 -1
  66. package/dist-client/pages/resource/inspection-drawing-type-management.js.map +1 -1
  67. package/dist-client/pages/resource/inspection-part-popup.js.map +1 -1
  68. package/dist-client/pages/resource/resource-importer.js.map +1 -1
  69. package/dist-client/pages/resource/resource-list-page.d.ts +1 -2
  70. package/dist-client/pages/resource/resource-list-page.js +1 -2
  71. package/dist-client/pages/resource/resource-list-page.js.map +1 -1
  72. package/dist-client/pages/resource/worker-type-management.js.map +1 -1
  73. package/dist-client/pages/task/task-importer.js.map +1 -1
  74. package/dist-client/pages/task/task-list-page.d.ts +1 -2
  75. package/dist-client/pages/task/task-list-page.js +1 -2
  76. package/dist-client/pages/task/task-list-page.js.map +1 -1
  77. package/dist-client/pages/task-resource/task-resource-importer.js.map +1 -1
  78. package/dist-client/pages/task-resource/task-resource-list-page.d.ts +1 -2
  79. package/dist-client/pages/task-resource/task-resource-list-page.js +1 -2
  80. package/dist-client/pages/task-resource/task-resource-list-page.js.map +1 -1
  81. package/dist-client/route.d.ts +1 -1
  82. package/dist-client/route.js +4 -4
  83. package/dist-client/route.js.map +1 -1
  84. package/dist-client/shared/domain-context.d.ts +18 -0
  85. package/dist-client/shared/domain-context.js +28 -0
  86. package/dist-client/shared/domain-context.js.map +1 -0
  87. package/dist-client/tsconfig.tsbuildinfo +1 -1
  88. package/dist-client/viewparts/domain-switch.d.ts +19 -0
  89. package/dist-client/viewparts/domain-switch.js +274 -0
  90. package/dist-client/viewparts/domain-switch.js.map +1 -0
  91. package/dist-server/controllers/export-tasks.js +1 -2
  92. package/dist-server/controllers/export-tasks.js.map +1 -1
  93. package/dist-server/controllers/import-task.js +1 -2
  94. package/dist-server/controllers/import-task.js.map +1 -1
  95. package/dist-server/controllers/parse-excel.d.ts +0 -2
  96. package/dist-server/controllers/parse-excel.js +1 -2
  97. package/dist-server/controllers/parse-excel.js.map +1 -1
  98. package/dist-server/middlewares/index.js +1 -2
  99. package/dist-server/middlewares/index.js.map +1 -1
  100. package/dist-server/migrations/1723861466413-seed-roles.js.map +1 -1
  101. package/dist-server/migrations/1723861466414-seed-codes.js +1 -1
  102. package/dist-server/migrations/1723861466414-seed-codes.js.map +1 -1
  103. package/dist-server/migrations/1723861476419-seed-resources.js.map +1 -1
  104. package/dist-server/migrations/1723861478420-seed-/bsample-project.js.map +1 -1
  105. package/dist-server/migrations/1723861478421-seed-/bsample-tasks.js.map +1 -1
  106. package/dist-server/service/construction-detail-type/construction-detail-type-mutation.js +2 -2
  107. package/dist-server/service/construction-detail-type/construction-detail-type-mutation.js.map +1 -1
  108. package/dist-server/service/construction-detail-type/construction-detail-type-query.js +2 -2
  109. package/dist-server/service/construction-detail-type/construction-detail-type-query.js.map +1 -1
  110. package/dist-server/service/construction-detail-type/construction-detail-type-type.js +4 -4
  111. package/dist-server/service/construction-detail-type/construction-detail-type-type.js.map +1 -1
  112. package/dist-server/service/construction-detail-type/construction-detail-type.js +2 -2
  113. package/dist-server/service/construction-detail-type/construction-detail-type.js.map +1 -1
  114. package/dist-server/service/construction-type/construction-type-mutation.js +2 -2
  115. package/dist-server/service/construction-type/construction-type-mutation.js.map +1 -1
  116. package/dist-server/service/construction-type/construction-type-query.d.ts +2 -2
  117. package/dist-server/service/construction-type/construction-type-query.js +7 -12
  118. package/dist-server/service/construction-type/construction-type-query.js.map +1 -1
  119. package/dist-server/service/construction-type/construction-type-type.d.ts +1 -0
  120. package/dist-server/service/construction-type/construction-type-type.js +8 -4
  121. package/dist-server/service/construction-type/construction-type-type.js.map +1 -1
  122. package/dist-server/service/construction-type/construction-type.d.ts +1 -0
  123. package/dist-server/service/construction-type/construction-type.js +7 -2
  124. package/dist-server/service/construction-type/construction-type.js.map +1 -1
  125. package/dist-server/service/index.d.ts +3 -2
  126. package/dist-server/service/index.js +6 -2
  127. package/dist-server/service/index.js.map +1 -1
  128. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-mutation.js +2 -2
  129. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-mutation.js.map +1 -1
  130. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.d.ts +2 -2
  131. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.js +7 -12
  132. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-query.js.map +1 -1
  133. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-type.js +4 -4
  134. package/dist-server/service/inspection-drawing-type/inspection-drawing-type-type.js.map +1 -1
  135. package/dist-server/service/inspection-drawing-type/inspection-drawing-type.js +2 -2
  136. package/dist-server/service/inspection-drawing-type/inspection-drawing-type.js.map +1 -1
  137. package/dist-server/service/inspection-part/inspection-part-mutation.js +2 -2
  138. package/dist-server/service/inspection-part/inspection-part-mutation.js.map +1 -1
  139. package/dist-server/service/inspection-part/inspection-part-query.js +2 -2
  140. package/dist-server/service/inspection-part/inspection-part-query.js.map +1 -1
  141. package/dist-server/service/inspection-part/inspection-part-type.js +4 -4
  142. package/dist-server/service/inspection-part/inspection-part-type.js.map +1 -1
  143. package/dist-server/service/inspection-part/inspection-part.js +2 -2
  144. package/dist-server/service/inspection-part/inspection-part.js.map +1 -1
  145. package/dist-server/service/manager/index.d.ts +2 -0
  146. package/dist-server/service/manager/index.js +3 -1
  147. package/dist-server/service/manager/index.js.map +1 -1
  148. package/dist-server/service/manager/manager-mutation.js +2 -2
  149. package/dist-server/service/manager/manager-mutation.js.map +1 -1
  150. package/dist-server/service/manager/manager-query.d.ts +1 -1
  151. package/dist-server/service/manager/manager-query.js +5 -9
  152. package/dist-server/service/manager/manager-query.js.map +1 -1
  153. package/dist-server/service/manager/manager-type.js +4 -4
  154. package/dist-server/service/manager/manager-type.js.map +1 -1
  155. package/dist-server/service/manager/manager.js +2 -2
  156. package/dist-server/service/manager/manager.js.map +1 -1
  157. package/dist-server/service/project/issue-project-code.d.ts +7 -0
  158. package/dist-server/service/project/issue-project-code.js +27 -0
  159. package/dist-server/service/project/issue-project-code.js.map +1 -0
  160. package/dist-server/service/project/project-mutation.d.ts +3 -0
  161. package/dist-server/service/project/project-mutation.js +231 -24
  162. package/dist-server/service/project/project-mutation.js.map +1 -1
  163. package/dist-server/service/project/project-query.d.ts +14 -2
  164. package/dist-server/service/project/project-query.js +167 -16
  165. package/dist-server/service/project/project-query.js.map +1 -1
  166. package/dist-server/service/project/project-type.d.ts +14 -2
  167. package/dist-server/service/project/project-type.js +57 -11
  168. package/dist-server/service/project/project-type.js.map +1 -1
  169. package/dist-server/service/project/project.d.ts +29 -0
  170. package/dist-server/service/project/project.js +103 -5
  171. package/dist-server/service/project/project.js.map +1 -1
  172. package/dist-server/service/resource/resource-mutation.js +7 -8
  173. package/dist-server/service/resource/resource-mutation.js.map +1 -1
  174. package/dist-server/service/resource/resource-query.d.ts +2 -2
  175. package/dist-server/service/resource/resource-query.js +7 -12
  176. package/dist-server/service/resource/resource-query.js.map +1 -1
  177. package/dist-server/service/resource/resource-type.js +6 -6
  178. package/dist-server/service/resource/resource-type.js.map +1 -1
  179. package/dist-server/service/resource/resource.js +3 -3
  180. package/dist-server/service/resource/resource.js.map +1 -1
  181. package/dist-server/service/task/task-mutation.js +2 -2
  182. package/dist-server/service/task/task-mutation.js.map +1 -1
  183. package/dist-server/service/task/task-query.d.ts +2 -0
  184. package/dist-server/service/task/task-query.js +15 -4
  185. package/dist-server/service/task/task-query.js.map +1 -1
  186. package/dist-server/service/task/task-type.js +10 -10
  187. package/dist-server/service/task/task-type.js.map +1 -1
  188. package/dist-server/service/task/task.d.ts +2 -0
  189. package/dist-server/service/task/task.js +13 -8
  190. package/dist-server/service/task/task.js.map +1 -1
  191. package/dist-server/service/task-checklist-binding/index.d.ts +5 -0
  192. package/dist-server/service/task-checklist-binding/index.js +9 -0
  193. package/dist-server/service/task-checklist-binding/index.js.map +1 -0
  194. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.d.ts +5 -0
  195. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.js +188 -0
  196. package/dist-server/service/task-checklist-binding/task-checklist-binding-mutation.js.map +1 -0
  197. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.d.ts +8 -0
  198. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.js +61 -0
  199. package/dist-server/service/task-checklist-binding/task-checklist-binding-query.js.map +1 -0
  200. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.d.ts +15 -0
  201. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.js +57 -0
  202. package/dist-server/service/task-checklist-binding/task-checklist-binding-type.js.map +1 -0
  203. package/dist-server/service/task-checklist-binding/task-checklist-binding.d.ts +22 -0
  204. package/dist-server/service/task-checklist-binding/task-checklist-binding.js +106 -0
  205. package/dist-server/service/task-checklist-binding/task-checklist-binding.js.map +1 -0
  206. package/dist-server/service/task-resource/task-resource-mutation.js +2 -2
  207. package/dist-server/service/task-resource/task-resource-mutation.js.map +1 -1
  208. package/dist-server/service/task-resource/task-resource-query.d.ts +2 -2
  209. package/dist-server/service/task-resource/task-resource-query.js +6 -11
  210. package/dist-server/service/task-resource/task-resource-query.js.map +1 -1
  211. package/dist-server/service/task-resource/task-resource-type.js +6 -6
  212. package/dist-server/service/task-resource/task-resource-type.js.map +1 -1
  213. package/dist-server/service/task-resource/task-resource.js +2 -2
  214. package/dist-server/service/task-resource/task-resource.js.map +1 -1
  215. package/dist-server/service/worker-type/worker-type-mutation.js +2 -2
  216. package/dist-server/service/worker-type/worker-type-mutation.js.map +1 -1
  217. package/dist-server/service/worker-type/worker-type-query.d.ts +2 -2
  218. package/dist-server/service/worker-type/worker-type-query.js +7 -12
  219. package/dist-server/service/worker-type/worker-type-query.js.map +1 -1
  220. package/dist-server/service/worker-type/worker-type-type.js +4 -4
  221. package/dist-server/service/worker-type/worker-type-type.js.map +1 -1
  222. package/dist-server/service/worker-type/worker-type.js +2 -2
  223. package/dist-server/service/worker-type/worker-type.js.map +1 -1
  224. package/dist-server/tsconfig.tsbuildinfo +1 -1
  225. package/package.json +15 -11
  226. package/things-factory.config.js +3 -3
  227. package/translations/en.json +10 -9
  228. package/translations/ja.json +15 -1
  229. package/translations/ko.json +3 -0
  230. package/translations/ms.json +15 -1
  231. package/translations/zh.json +15 -1
  232. package/dist-client/pages/project/popup/popup-schedule-upload.js.map +0 -1
  233. package/dist-client/pages/project/project-schedule-list.js.map +0 -1
  234. package/dist-client/pages/project/project-schedule.js +0 -407
  235. 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 } 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,52 +37,93 @@ 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,
44
48
  humidity: 0,
45
- wind: ''
49
+ windDirection: '',
50
+ windSpeed: 0
46
51
  };
47
52
  }
48
53
  get context() {
54
+ var _a;
49
55
  return {
50
- title: '진행 프로젝트 상세 정보'
56
+ title: !isProjectTypeDomain() && ((_a = this.project) === null || _a === void 0 ? void 0 : _a.name)
57
+ ? `진행 중 프로젝트 상세 정보 - ${this.project.name}`
58
+ : '진행 중 프로젝트 상세 정보'
51
59
  };
52
60
  }
53
61
  render() {
54
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
62
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x;
63
+ let totalInspectionCount = this.inspectionSummary.pass + this.inspectionSummary.fail + this.inspectionSummary.request + this.inspectionSummary.wait;
55
64
  return html `
56
65
  <div header>
57
- <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>
58
70
  <div button-container>
59
- <md-elevated-button href=${`project-update/${this.project.id}`}>
60
- <md-icon slot="icon">assignment</md-icon>프로젝트 정보 수정
61
- </md-elevated-button>
62
- <md-elevated-button href=${`project-plan-management/${this.project.id}`}>
63
- <md-icon slot="icon">description</md-icon>도면 관리
64
- </md-elevated-button>
65
- <md-elevated-button href=${`project-schedule/${this.project.id}`}>
66
- <md-icon slot="icon">event_note</md-icon>공정표 관리
67
- </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
+ `}
68
105
  </div>
69
106
  </div>
70
107
 
71
108
  <div body>
72
109
  <div>
73
110
  <div left-top>
74
- <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>
75
117
  <div content-1>
76
118
  <img
77
- ?no-image=${!((_a = this.project.mainPhoto) === null || _a === void 0 ? void 0 : _a.fullpath)}
78
- 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'}
79
121
  />
80
122
 
81
123
  <div>
82
124
  <div row>
83
125
  <span>- 면적 : </span>
84
- <span>${(_d = (_c = this.project.buildingComplex) === null || _c === void 0 ? void 0 : _c.area) === null || _d === void 0 ? void 0 : _d.toLocaleString()} ㎡</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>
85
127
  </div>
86
128
  <div row>
87
129
  <span>- 착공~준공 : </span>
@@ -89,19 +131,19 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
89
131
  </div>
90
132
  <div row>
91
133
  <span>- 발주처 : </span>
92
- <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>
93
135
  </div>
94
136
  <div row>
95
137
  <span>- 건설사 : </span>
96
- <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>
97
139
  </div>
98
140
  <div row>
99
141
  <span>- 감리사 : </span>
100
- <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>
101
143
  </div>
102
144
  <div row>
103
145
  <span>- 설계사 : </span>
104
- <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>
105
147
  </div>
106
148
  </div>
107
149
  </div>
@@ -109,125 +151,208 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
109
151
  <div content-2>
110
152
  <div row>
111
153
  <span>- 건설구분 : </span>
112
- <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>
113
155
  </div>
114
156
  <div row>
115
157
  <span>- 공사금액 : </span>
116
- <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>
117
159
  </div>
118
160
  <div row>
119
161
  <span>- 세대수 : </span>
120
- <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>
121
163
  </div>
122
164
  <div row>
123
165
  <span>- 기타 : </span>
124
- <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>
125
167
  </div>
126
168
  </div>
127
169
  </div>
128
170
 
129
171
  <div left-bottom>
130
- <h3>조감도(BIM도면)</h3>
131
- ${((_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)
132
183
  ? html `<div building-complex-img></div>`
133
184
  : html `<img building-complex-img src="/assets/images/img-building-complex-default.jpg" />`}
134
- <div>
135
- <div subject bold>개별 단지 상세정보 바로가기</div>
136
- <div building-container>
137
- ${(_t = (_s = this.project.buildingComplex) === null || _s === void 0 ? void 0 : _s.buildings) === null || _t === void 0 ? void 0 : _t.map(building => {
138
- return html `<md-outlined-button href=${`building-complex-detail/${this.project.id}?buildingId=${building.id}`}>
139
- ${building.name}
140
- </md-outlined-button>`;
141
- })}
142
- </div>
143
- </div>
144
185
  </div>
145
186
  </div>
146
187
 
147
188
  <div>
148
189
  <div right-top>
149
190
  <h3>프로젝트 현황</h3>
191
+
192
+ <div kpi-header>
193
+ <span kpi-datetime
194
+ >${new Date().toLocaleDateString('ko-KR')}
195
+ ${new Date().toLocaleTimeString('ko-KR', { hour: '2-digit', minute: '2-digit', hour12: false })}</span
196
+ >
197
+ </div>
150
198
  <div state>
151
- <span progress>
152
- <ox-progress-circle
153
- .value=${this.project.totalProgress}
154
- titleText="전체"
155
- suffix="%"
156
- fontSize="27px"
157
- fontColor="#4E5055"
158
- borderStyle="none"
159
- innerCircleSize="28%"
160
- circleColor="#0595E5"
161
- shadow="#00000026 4px 4px 4px"
162
- background="#eaf5fd"
163
- ></ox-progress-circle>
164
- <div>전체공정율(%)</div>
165
- </span>
166
- <span progress>
167
- <ox-progress-circle
168
- .value=${this.project.weeklyProgress}
169
- titleText="주간"
170
- suffix="%"
171
- fontSize="27px"
172
- fontColor="#4E5055"
173
- borderStyle="none"
174
- innerCircleSize="28%"
175
- circleColor="#06B5AF"
176
- shadow="#00000026 4px 4px 4px"
177
- background="#eaf7f7"
178
- ></ox-progress-circle>
179
- <div week>주간공정율(%)</div>
180
- </span>
181
- <span weather>
182
- <div bold>현장현황</div>
183
- <div>
184
- <span><md-icon slot="icon">rainy</md-icon>강수확률</span>
185
- <span bold>${this.weather.rain}%</span>
199
+ <div kpi-container>
200
+ <div kpi-info-item kpi>
201
+ <ox-progress-circle
202
+ .value=${this.project.kpi || 0}
203
+ fontColor="transparent"
204
+ borderStyle="none"
205
+ innerCircleSize="30%"
206
+ circleColor="#E15757"
207
+ background="#f6f6f6"
208
+ size="120px"
209
+ ></ox-progress-circle>
210
+
211
+ <div kpi-info-label>
212
+ <span kpi-info-label>KPI 지수</span>
213
+ <span kpi-info-value bold>${this.project.kpi || 0}%</span>
214
+ </div>
186
215
  </div>
187
- <div>
188
- <span><md-icon slot="icon">humidity_percentage</md-icon> 습도</span>
189
- <span bold>${this.weather.humidity}%</span>
216
+ <div kpi-info-item>
217
+ <span kpi-info-label>검측 통과율</span>
218
+ <span kpi-info-value>
219
+ <span bold>${((_w = this.inspectionSummary.pass) === null || _w === void 0 ? void 0 : _w.toLocaleString()) || 0}</span>
220
+ <span small> / ${(totalInspectionCount === null || totalInspectionCount === void 0 ? void 0 : totalInspectionCount.toLocaleString()) || 0}</span>
221
+ </span>
190
222
  </div>
191
- <div>
192
- <span><md-icon slot="icon">thermostat</md-icon> 온도</span>
193
- <span bold>${this.weather.temperature}°C</span>
223
+ <div kpi-info-item>
224
+ <span kpi-info-label>작업 중 로봇</span>
225
+ <span kpi-info-value>
226
+ <span bold>${((_x = this.project.robotCount) === null || _x === void 0 ? void 0 : _x.toLocaleString()) || 0}</span>
227
+ <span small> 대</span>
228
+ </span>
194
229
  </div>
195
- <div>
196
- <span><md-icon slot="icon">air</md-icon> 풍향</span>
197
- <span bold>${this.weather.wind}</span>
230
+ <div kpi-info-item weather>
231
+ <div>
232
+ <span><md-icon slot="icon">rainy</md-icon>강수확률</span>
233
+ <span bold>${this.weather.rain}%</span>
234
+ </div>
235
+ <div>
236
+ <span><md-icon slot="icon">humidity_percentage</md-icon> 습도</span>
237
+ <span bold>${this.weather.humidity}%</span>
238
+ </div>
239
+ <div>
240
+ <span><md-icon slot="icon">thermostat</md-icon> 온도</span>
241
+ <span bold>${this.weather.temperature}°C</span>
242
+ </div>
243
+
244
+ <!--
245
+ <div>
246
+ <span><md-icon slot="icon">arrows_output</md-icon> 풍향</span>
247
+ <span bold>${this.weather.windDirection}</span>
248
+ </div>
249
+ <div>
250
+ <span><md-icon slot="icon">air</md-icon> 풍속</span>
251
+ <span bold>${this.weather.windSpeed} m/s</span>
252
+ </div>
253
+ -->
198
254
  </div>
199
- </span>
255
+ </div>
256
+
257
+ <div progress-container>
258
+ <span progress>
259
+ <ox-progress-circle
260
+ .value=${this.project.totalProgress}
261
+ titleText="전체"
262
+ suffix="%"
263
+ fontSize="27px"
264
+ fontColor="#4E5055"
265
+ borderStyle="none"
266
+ innerCircleSize="28%"
267
+ circleColor="#0595E5"
268
+ shadow="#00000026 4px 4px 4px"
269
+ background="#eaf5fd"
270
+ ></ox-progress-circle>
271
+ <div>전체공정율(%)</div>
272
+ </span>
273
+ <span progress>
274
+ <ox-progress-circle
275
+ .value=${this.project.weeklyProgress}
276
+ titleText="주간"
277
+ suffix="%"
278
+ fontSize="27px"
279
+ fontColor="#4E5055"
280
+ borderStyle="none"
281
+ innerCircleSize="28%"
282
+ circleColor="#06B5AF"
283
+ shadow="#00000026 4px 4px 4px"
284
+ background="#eaf7f7"
285
+ ></ox-progress-circle>
286
+ <div week>주간공정율(%)</div>
287
+ </span>
288
+
289
+ <span progress>
290
+ <ox-progress-circle
291
+ .value=${this.project.inspPassRate}
292
+ titleText="검측 통과"
293
+ suffix="%"
294
+ fontSize="27px"
295
+ fontColor="#4E5055"
296
+ borderStyle="none"
297
+ innerCircleSize="28%"
298
+ circleColor="#1BB401"
299
+ shadow="#00000026 4px 4px 4px"
300
+ background="#e8f7e5"
301
+ ></ox-progress-circle>
302
+ <div insp-pass-rate>통과 비율(%)</div>
303
+ </span>
304
+ <span progress>
305
+ <ox-progress-circle
306
+ .value=${this.project.robotProgressRate}
307
+ titleText="로봇작업"
308
+ suffix="%"
309
+ fontSize="27px"
310
+ fontColor="#4E5055"
311
+ borderStyle="none"
312
+ innerCircleSize="28%"
313
+ circleColor="#8957D8"
314
+ shadow="#00000026 4px 4px 4px"
315
+ background="#f3eefb"
316
+ ></ox-progress-circle>
317
+ <div robot-progress-rate>진행률(%)</div>
318
+ </span>
319
+ </div>
320
+ </div>
321
+ <div notice>
322
+ <div name bold>공지사항</div>
323
+ <div content>${this.project.buildingComplex.notice}</div>
200
324
  </div>
325
+
201
326
  <div inspection>
202
327
  <span name bold>
203
328
  <md-icon slot="icon">list_alt_add</md-icon>
204
- 시공검측<br />현황
205
- </span>
206
- <span>
207
- <div>검측요청</div>
208
- <div bold>${this.inspectionSummary.wait}</div>
329
+ 작업 현황
209
330
  </span>
210
- <span>
211
- <div>검측대기</div>
212
- <div bold>${this.inspectionSummary.request}</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>
213
334
  </span>
214
- <span>
215
- <div>합격</div>
216
- <div bold pass>${this.inspectionSummary.pass}</div>
335
+ <span ?active=${this.statusFilter === 'REQUEST'} @click=${() => this._onClickStatusFilter('REQUEST')}>
336
+ <div>감리 대기</div>
337
+ <div bold request>${this.inspectionSummary.request}</div>
217
338
  </span>
218
- <span>
219
- <div>불합격</div>
339
+ <span ?active=${this.statusFilter === 'FAIL'} @click=${() => this._onClickStatusFilter('FAIL')}>
340
+ <div>조치 필요</div>
220
341
  <div bold fail>${this.inspectionSummary.fail}</div>
221
342
  </span>
222
- </div>
223
- <div notice>
224
- <div name bold>공지사항</div>
225
- <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>
226
351
  </div>
227
352
  </div>
228
353
 
229
354
  <div right-bottom>
230
- <h3>검측 현황</h3>
355
+ <h3>검측 현황${this.statusFilter ? ` (${this._getStatusFilterLabel()} 목록)` : ''}</h3>
231
356
  <div table-container>
232
357
  <hr />
233
358
  <table>
@@ -238,19 +363,22 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
238
363
  <th width="10%">공종</th>
239
364
  <th width="22%">내용</th>
240
365
  <th width="15%">검측 요청일</th>
241
- <th width="10%">검측 결과</th>
366
+ <th width="10%">작업 상태</th>
242
367
  </tr>
243
368
  </thead>
244
369
  <tbody>
245
370
  ${this.buildingInspections.map((inspection, idx) => {
246
371
  var _a, _b, _c, _d, _e, _f;
247
- return html ` <tr @click=${() => this._onClickInspection(inspection.id || '')}>
372
+ return html ` <tr @click=${() => this._onClickInspection(inspection)}>
248
373
  <td>${idx + 1}</td>
249
- <td>${(_b = (_a = inspection === null || inspection === void 0 ? void 0 : inspection.buildingLevel) === null || _a === void 0 ? void 0 : _a.building) === null || _b === void 0 ? void 0 : _b.name} ${(_c = inspection === null || inspection === void 0 ? void 0 : inspection.buildingLevel) === null || _c === void 0 ? void 0 : _c.floor}층</td>
374
+ <td>${(_b = (_a = inspection === null || inspection === void 0 ? void 0 : inspection.buildingLevel) === null || _a === void 0 ? void 0 : _a.building) === null || _b === void 0 ? void 0 : _b.name} ${(_c = inspection === null || inspection === void 0 ? void 0 : inspection.buildingLevel) === null || _c === void 0 ? void 0 : _c.floorDisplayName}층</td>
250
375
  <td bold>${(_d = inspection.checklist) === null || _d === void 0 ? void 0 : _d.constructionType}</td>
251
376
  <td>${((_f = (_e = inspection.checklist) === null || _e === void 0 ? void 0 : _e.inspectionParts) === null || _f === void 0 ? void 0 : _f.join(', ')) || ''}</td>
252
377
  <td>${this._formatDate(inspection.requestDate)}</td>
253
- <td bold>${inspection.status && BUILDING_INSPECTION_STATUS[inspection.status]}</td>
378
+ <td bold status=${inspection.status || ''}>
379
+ ${inspection.status &&
380
+ ((inspection.failCount || 0) > 0 ? BUILDING_INSPECTION_RE_STATUS : BUILDING_INSPECTION_STATUS)[inspection.status]}
381
+ </td>
254
382
  </tr>`;
255
383
  })}
256
384
  </tbody>
@@ -263,10 +391,39 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
263
391
  }
264
392
  async pageInitialized(lifecycle) { }
265
393
  async pageUpdated(changes, lifecycle) {
394
+ var _a, _b;
266
395
  if (this.active) {
267
396
  this.projectId = lifecycle.resourceId || '';
268
- 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
269
423
  }
424
+ `
425
+ });
426
+ this.configProjectType = ((_a = response.data) === null || _a === void 0 ? void 0 : _a.currentProjectType) || '';
270
427
  }
271
428
  async initProject(projectId = '') {
272
429
  var _a, _b, _c, _d, _e;
@@ -278,6 +435,7 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
278
435
  name
279
436
  startDate
280
437
  endDate
438
+ projectType
281
439
  mainPhoto {
282
440
  fullpath
283
441
  }
@@ -287,6 +445,7 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
287
445
  inspPassRate
288
446
  robotProgressRate
289
447
  structuralSafetyRate
448
+ robotCount
290
449
  buildingComplex {
291
450
  id
292
451
  address
@@ -308,6 +467,7 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
308
467
  notice
309
468
  householdCount
310
469
  buildingCount
470
+ virtualTourLink
311
471
  buildings {
312
472
  id
313
473
  name
@@ -321,16 +481,21 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
321
481
  request
322
482
  pass
323
483
  fail
484
+ reWait
324
485
  }
325
486
 
326
487
  buildingInspectionsOfProject(params: $params) {
327
488
  items {
328
489
  id
329
490
  status
491
+ failCount
330
492
  requestDate
331
493
  buildingLevel {
494
+ id
332
495
  floor
496
+ floorDisplayName
333
497
  building {
498
+ id
334
499
  name
335
500
  }
336
501
  }
@@ -348,10 +513,7 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
348
513
  variables: {
349
514
  id: projectId,
350
515
  projectId,
351
- params: {
352
- projectId,
353
- limit: 10
354
- }
516
+ params: Object.assign({ projectId, limit: 10 }, (this.statusFilter ? { statusFilter: this.statusFilter } : {}))
355
517
  }
356
518
  });
357
519
  if (response.errors)
@@ -359,23 +521,52 @@ let ProjectDetail = class ProjectDetail extends ScopedElementsMixin(PageView) {
359
521
  this.project = ((_a = response.data) === null || _a === void 0 ? void 0 : _a.project) || {};
360
522
  this.inspectionSummary = ((_b = response.data) === null || _b === void 0 ? void 0 : _b.inspectionSummary) || {};
361
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();
362
525
  const { latitude, longitude } = (_e = this.project) === null || _e === void 0 ? void 0 : _e.buildingComplex;
363
526
  if (latitude && longitude) {
364
527
  this.weather = await _getWeather(latitude, longitude);
365
528
  }
366
529
  }
367
- _onClickInspection(buildingInspectionId) {
368
- navigate(`building-inspection-detail-drawing/${buildingInspectionId}`);
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
+ }
545
+ _onClickInspection(buildingInspection) {
546
+ var _a, _b, _c;
547
+ console.log('buildingInspection :', buildingInspection);
548
+ if (this.project.projectType === ProjectType.DSSP) {
549
+ navigate(`building-inspection-grid-detail/${this.project.id}?buildingId=${(_b = (_a = buildingInspection === null || buildingInspection === void 0 ? void 0 : buildingInspection.buildingLevel) === null || _a === void 0 ? void 0 : _a.building) === null || _b === void 0 ? void 0 : _b.id}&levelId=${(_c = buildingInspection === null || buildingInspection === void 0 ? void 0 : buildingInspection.buildingLevel) === null || _c === void 0 ? void 0 : _c.id}`);
550
+ }
551
+ else if (this.project.projectType === ProjectType.DCSP) {
552
+ navigate(`building-inspection-detail-drawing/${buildingInspection.id}`);
553
+ }
369
554
  }
370
555
  _formatDate(date) {
371
- return date
372
- ? 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', {
373
561
  timeZone: 'Asia/Seoul',
374
562
  year: 'numeric',
375
563
  month: '2-digit',
376
564
  day: '2-digit'
377
- }).format(new Date(date))
378
- : '';
565
+ }).format(parsed);
566
+ }
567
+ catch (_a) {
568
+ return String(date).split('T')[0] || '';
569
+ }
379
570
  }
380
571
  };
381
572
  ProjectDetail.styles = [
@@ -398,7 +589,7 @@ ProjectDetail.styles = [
398
589
  --md-outlined-button-container-height: 30px;
399
590
  --md-outlined-button-trailing-space: var(--spacing-medium, 8px);
400
591
  --md-outlined-button-leading-space: var(--spacing-medium, 8px);
401
- --md-sys-color-outline: rgba(51,51,51,.20);
592
+ --md-sys-color-outline: rgba(51, 51, 51, 0.2);
402
593
  }
403
594
 
404
595
  *[bold] {
@@ -410,9 +601,28 @@ ProjectDetail.styles = [
410
601
  margin: 0px var(--spacing-large, 12px);
411
602
 
412
603
  h2 {
604
+ display: flex;
605
+ gap: 7px;
413
606
  flex: 0.5;
414
607
  color: #3f71a0;
415
- font-size:18px;
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
+ }
416
626
  }
417
627
 
418
628
  div[button-container] {
@@ -443,10 +653,13 @@ ProjectDetail.styles = [
443
653
  div[body] {
444
654
  display: flex;
445
655
  margin: var(--spacing-large, 12px);
446
- margin-top:0;
656
+ margin-top: 0;
447
657
  gap: var(--spacing-medium, 8px);
448
658
 
449
659
  h3 {
660
+ display: flex;
661
+ align-items: center;
662
+ justify-content: space-between;
450
663
  color: #2e79be;
451
664
  font-size: 16px;
452
665
  margin: 0px;
@@ -455,6 +668,20 @@ ProjectDetail.styles = [
455
668
  text-decoration: none;
456
669
  color: #2e79be;
457
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
+ }
458
685
  }
459
686
 
460
687
  & > div {
@@ -513,57 +740,52 @@ ProjectDetail.styles = [
513
740
  img {
514
741
  opacity: 0.5;
515
742
  }
516
-
517
- div[subject] {
518
- margin-bottom: var(--spacing-small, 4px);
519
- }
520
-
521
- div[building-container] {
522
- display: block;
523
-
524
- & > * {
525
- margin-right: var(--spacing-medium, 8px);
526
- margin-bottom: var(--spacing-medium, 8px);
527
- }
528
- md-outlined-button {
529
- --md-outlined-button-container-height: 30px;
530
- --md-outlined-button-trailing-space: var(--spacing-medium, 8px);
531
- --md-outlined-button-leading-space: var(--spacing-medium, 8px);
532
- --md-sys-color-outline: rgba(51,51,51,.20);
533
- }
534
- }
535
743
  }
536
744
 
537
745
  div[right-top] {
538
746
  div[state] {
539
- display: grid;
540
- grid-template-columns: 0.95fr 0.95fr 1.1fr;
747
+ display: flex;
748
+ flex-direction: column;
541
749
  gap: var(--spacing-large, 12px);
542
750
 
543
- span[progress] {
544
- max-width: 150px;
545
- text-align: center;
751
+ div[progress-container] {
546
752
  display: flex;
547
- justify-self: center;
548
- flex-direction: column;
549
- width: 100%;
753
+ justify-content: space-around;
754
+ gap: 8px;
550
755
 
551
- & > div {
552
- font-weight: bold;
553
- color: #2e79be;
554
- font-size: 12px;
555
- margin-top: var(--spacing-small, 4px);
556
- }
557
- & > div[week] {
558
- color: #06b5af;
756
+ span[progress] {
757
+ max-width: 165px;
758
+ text-align: center;
759
+ display: flex;
760
+ justify-self: center;
761
+ flex-direction: column;
762
+ width: 100%;
763
+ margin-inline: 12px;
764
+
765
+ & > div {
766
+ font-weight: bold;
767
+ color: #2e79be;
768
+ font-size: 16px;
769
+ margin-top: 9px;
770
+ }
771
+ & > div[week] {
772
+ color: #06b5af;
773
+ }
774
+ & > div[insp-pass-rate] {
775
+ color: #1bb401;
776
+ }
777
+ & > div[robot-progress-rate] {
778
+ color: #8957d8;
779
+ }
559
780
  }
560
781
  }
561
- span[weather] {
782
+
783
+ div[weather] {
562
784
  display: flex;
563
785
  flex-direction: column;
564
786
  gap: var(--spacing-small, 4px);
565
787
  margin-left: var(--spacing-medium, 8px);
566
- font-size:14px;
788
+ font-size: 14px;
567
789
 
568
790
  & > div {
569
791
  display: flex;
@@ -573,16 +795,16 @@ ProjectDetail.styles = [
573
795
 
574
796
  & > span {
575
797
  display: flex;
576
- align-item:center;
577
- var(--spacing-tiny, 2px);
798
+ align-items: center;
799
+ gap: var(--spacing-tiny, 2px);
578
800
  }
579
801
  }
580
802
  }
581
803
  }
582
804
  div[inspection] {
583
805
  display: grid;
584
- grid-template-columns: 1.4fr 0.9fr 0.9fr 0.9fr 0.9fr;
585
- margin-top: var(--spacing-small, 4px);
806
+ grid-template-columns: 1.4fr 0.9fr 0.9fr 0.9fr 0.9fr 0.9fr;
807
+ margin-top: 10px;
586
808
  background: #f6f6f6;
587
809
  border-radius: 7px;
588
810
  padding: var(--spacing-small, 4px) 0px;
@@ -592,6 +814,18 @@ ProjectDetail.styles = [
592
814
  flex-direction: column;
593
815
  align-items: center;
594
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
+ }
595
829
 
596
830
  div[wait] {
597
831
  color: #4e5055;
@@ -605,12 +839,15 @@ ProjectDetail.styles = [
605
839
  div[fail] {
606
840
  color: #ff4444;
607
841
  }
842
+ div[re-wait] {
843
+ color: #e89c0e;
844
+ }
608
845
  }
609
846
  & > span[name] {
610
847
  flex-direction: row;
611
848
  text-align: right;
612
849
  gap: var(--spacing-medium, 8px);
613
- line-height:1.3;
850
+ line-height: 1.3;
614
851
 
615
852
  md-icon {
616
853
  width: 40px;
@@ -621,6 +858,82 @@ ProjectDetail.styles = [
621
858
  }
622
859
  }
623
860
  }
861
+ div[kpi-container] {
862
+ display: flex;
863
+ gap: 8px;
864
+ margin-bottom: 8px;
865
+ align-items: center;
866
+
867
+ div[kpi-header] {
868
+ grid-column: 1 / -1;
869
+ display: flex;
870
+ justify-content: space-between;
871
+ align-items: center;
872
+ margin-bottom: var(--spacing-small, 4px);
873
+
874
+ span[kpi-title] {
875
+ font-weight: bold;
876
+ font-size: 16px;
877
+ color: #2e79be;
878
+ }
879
+
880
+ span[kpi-datetime] {
881
+ font-size: 12px;
882
+ color: #666;
883
+ }
884
+ }
885
+
886
+ div[kpi-info-item] {
887
+ display: flex;
888
+ flex: 1;
889
+ flex-direction: column;
890
+ align-items: center;
891
+ padding: 5px;
892
+ background: #f6f6f6;
893
+ border-radius: 4px;
894
+ min-height: 50px;
895
+ justify-content: center;
896
+ margin-inline: 12px;
897
+ border-radius: 7px;
898
+
899
+ span[kpi-info-label] {
900
+ font-size: 16px;
901
+ color: #4e5055;
902
+ margin-bottom: 2px;
903
+ }
904
+
905
+ span[kpi-info-value] {
906
+ font-size: 18px;
907
+
908
+ & > span[small] {
909
+ font-size: 17px;
910
+ }
911
+ }
912
+
913
+ &[weather] {
914
+ background: none;
915
+ align-items: flex-start;
916
+
917
+ & > div {
918
+ width: 100%;
919
+ }
920
+ }
921
+
922
+ &[kpi] {
923
+ flex-direction: row;
924
+ justify-content: space-around;
925
+
926
+ div[kpi-info-label] {
927
+ display: flex;
928
+ flex-direction: column;
929
+ }
930
+
931
+ ox-progress-circle {
932
+ width: 45px;
933
+ }
934
+ }
935
+ }
936
+ }
624
937
  div[notice] {
625
938
  margin-top: var(--spacing-medium, 8px);
626
939
 
@@ -679,7 +992,7 @@ ProjectDetail.styles = [
679
992
  }
680
993
 
681
994
  tbody td {
682
- border-bottom: 1px solid rgba(51,51,51,.20);
995
+ border-bottom: 1px solid rgba(51, 51, 51, 0.2);
683
996
  padding: var(--spacing-small, 4px);
684
997
  text-align: center;
685
998
  white-space: nowrap;
@@ -688,6 +1001,10 @@ ProjectDetail.styles = [
688
1001
  font-size: 13px;
689
1002
  }
690
1003
 
1004
+ tbody td[status='FAIL'] {
1005
+ color: #e15757;
1006
+ }
1007
+
691
1008
  md-elevated-button {
692
1009
  margin: 0 var(--spacing-small, 4px);
693
1010
 
@@ -729,6 +1046,14 @@ __decorate([
729
1046
  state(),
730
1047
  __metadata("design:type", Object)
731
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);
732
1057
  __decorate([
733
1058
  state(),
734
1059
  __metadata("design:type", Object)