@dssp/supervision 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 (446) hide show
  1. package/dist-client/graphql/building-inspection.d.ts +1 -0
  2. package/dist-client/graphql/building-inspection.js +102 -0
  3. package/dist-client/graphql/building-inspection.js.map +1 -0
  4. package/dist-client/pages/action-plan/action-plan-importer.js.map +1 -1
  5. package/dist-client/pages/action-plan/action-plan-list-page.d.ts +1 -2
  6. package/dist-client/pages/action-plan/action-plan-list-page.js +1 -2
  7. package/dist-client/pages/action-plan/action-plan-list-page.js.map +1 -1
  8. package/dist-client/pages/building-inspection/building-inspection-detail-ai-defect.d.ts +22 -0
  9. package/dist-client/pages/building-inspection/building-inspection-detail-ai-defect.js +171 -0
  10. package/dist-client/pages/building-inspection/building-inspection-detail-ai-defect.js.map +1 -0
  11. package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.d.ts +71 -0
  12. package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js +1406 -0
  13. package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js.map +1 -0
  14. package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement_old_ai.d.ts +59 -0
  15. package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement_old_ai.js +868 -0
  16. package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement_old_ai.js.map +1 -0
  17. package/dist-client/pages/building-inspection/building-inspection-detail-camera.d.ts +8 -6
  18. package/dist-client/pages/building-inspection/building-inspection-detail-camera.js +116 -65
  19. package/dist-client/pages/building-inspection/building-inspection-detail-camera.js.map +1 -1
  20. package/dist-client/pages/building-inspection/building-inspection-detail-checklist.d.ts +11 -0
  21. package/dist-client/pages/building-inspection/building-inspection-detail-checklist.js +147 -72
  22. package/dist-client/pages/building-inspection/building-inspection-detail-checklist.js.map +1 -1
  23. package/dist-client/pages/building-inspection/building-inspection-detail-drawing.d.ts +1 -1
  24. package/dist-client/pages/building-inspection/building-inspection-detail-drawing.js +94 -25
  25. package/dist-client/pages/building-inspection/building-inspection-detail-drawing.js.map +1 -1
  26. package/dist-client/pages/building-inspection/building-inspection-list.d.ts +28 -4
  27. package/dist-client/pages/building-inspection/building-inspection-list.js +377 -35
  28. package/dist-client/pages/building-inspection/building-inspection-list.js.map +1 -1
  29. package/dist-client/pages/building-inspection/building-inspection-management.d.ts +82 -0
  30. package/dist-client/pages/building-inspection/building-inspection-management.js +1527 -0
  31. package/dist-client/pages/building-inspection/building-inspection-management.js.map +1 -0
  32. package/dist-client/pages/building-inspection/component/building-inspection-detail-header.js +46 -14
  33. package/dist-client/pages/building-inspection/component/building-inspection-detail-header.js.map +1 -1
  34. package/dist-client/pages/building-inspection/component/daily-worklog-popup.d.ts +27 -0
  35. package/dist-client/pages/building-inspection/component/daily-worklog-popup.js +542 -0
  36. package/dist-client/pages/building-inspection/component/daily-worklog-popup.js.map +1 -0
  37. package/dist-client/pages/building-inspection/component/field-document/field-document-constants.d.ts +18 -0
  38. package/dist-client/pages/building-inspection/component/field-document/field-document-constants.js +630 -0
  39. package/dist-client/pages/building-inspection/component/field-document/field-document-constants.js.map +1 -0
  40. package/dist-client/pages/building-inspection/component/field-document/field-document-detail-popup.d.ts +10 -0
  41. package/dist-client/pages/building-inspection/component/field-document/field-document-detail-popup.js +219 -0
  42. package/dist-client/pages/building-inspection/component/field-document/field-document-detail-popup.js.map +1 -0
  43. package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.d.ts +25 -0
  44. package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.js +546 -0
  45. package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.js.map +1 -0
  46. package/dist-client/pages/building-inspection/component/field-document/field-document-popup.d.ts +42 -0
  47. package/dist-client/pages/building-inspection/component/field-document/field-document-popup.js +738 -0
  48. package/dist-client/pages/building-inspection/component/field-document/field-document-popup.js.map +1 -0
  49. package/dist-client/pages/building-inspection/component/image-preview-popup.d.ts +15 -0
  50. package/dist-client/pages/building-inspection/component/image-preview-popup.js +348 -0
  51. package/dist-client/pages/building-inspection/component/image-preview-popup.js.map +1 -0
  52. package/dist-client/pages/building-inspection/component/inspection-document/inspection-request-document.d.ts +25 -0
  53. package/dist-client/pages/building-inspection/component/inspection-document/inspection-request-document.js +491 -0
  54. package/dist-client/pages/building-inspection/component/inspection-document/inspection-request-document.js.map +1 -0
  55. package/dist-client/pages/building-inspection/component/inspection-document/inspection-result-notification.d.ts +31 -0
  56. package/dist-client/pages/building-inspection/component/inspection-document/inspection-result-notification.js +485 -0
  57. package/dist-client/pages/building-inspection/component/inspection-document/inspection-result-notification.js.map +1 -0
  58. package/dist-client/pages/building-inspection/component/inspection-document/photo-album-popup.d.ts +27 -0
  59. package/dist-client/pages/building-inspection/component/inspection-document/photo-album-popup.js +416 -0
  60. package/dist-client/pages/building-inspection/component/inspection-document/photo-album-popup.js.map +1 -0
  61. package/dist-client/pages/building-inspection/component/inspection-event-provider.d.ts +4 -2
  62. package/dist-client/pages/building-inspection/component/inspection-event-provider.js +156 -37
  63. package/dist-client/pages/building-inspection/component/inspection-event-provider.js.map +1 -1
  64. package/dist-client/pages/building-inspection/inspection-create-popup.js +27 -13
  65. package/dist-client/pages/building-inspection/inspection-create-popup.js.map +1 -1
  66. package/dist-client/pages/building-inspection/inspection-with-checklist-create-popup.d.ts +4 -0
  67. package/dist-client/pages/building-inspection/inspection-with-checklist-create-popup.js +844 -0
  68. package/dist-client/pages/building-inspection/inspection-with-checklist-create-popup.js.map +1 -0
  69. package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.d.ts +60 -0
  70. package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.js +1135 -0
  71. package/dist-client/pages/building-inspection-grid/building-inspection-grid-detail.js.map +1 -0
  72. package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.d.ts +2 -0
  73. package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.js +740 -0
  74. package/dist-client/pages/building-inspection-grid/component/grid-inspection-create-popup.js.map +1 -0
  75. package/dist-client/pages/building-inspection-grid/component/grid-inspection-list-layer.d.ts +19 -0
  76. package/dist-client/pages/building-inspection-grid/component/grid-inspection-list-layer.js +205 -0
  77. package/dist-client/pages/building-inspection-grid/component/grid-inspection-list-layer.js.map +1 -0
  78. package/dist-client/pages/building-inspection-grid/component/notice-comment-popup.d.ts +1 -0
  79. package/dist-client/pages/building-inspection-grid/component/notice-comment-popup.js +304 -0
  80. package/dist-client/pages/building-inspection-grid/component/notice-comment-popup.js.map +1 -0
  81. package/dist-client/pages/building-inspection-grid/component/plan-preview-popup.d.ts +15 -0
  82. package/dist-client/pages/building-inspection-grid/component/plan-preview-popup.js +430 -0
  83. package/dist-client/pages/building-inspection-grid/component/plan-preview-popup.js.map +1 -0
  84. package/dist-client/pages/checklist/attachment-list-popup.d.ts +1 -0
  85. package/dist-client/pages/checklist/attachment-list-popup.js +251 -69
  86. package/dist-client/pages/checklist/attachment-list-popup.js.map +1 -1
  87. package/dist-client/pages/checklist/checklist-view.d.ts +8 -0
  88. package/dist-client/pages/checklist/checklist-view.js +557 -191
  89. package/dist-client/pages/checklist/checklist-view.js.map +1 -1
  90. package/dist-client/pages/checklist/comment-list-popup.js +15 -5
  91. package/dist-client/pages/checklist/comment-list-popup.js.map +1 -1
  92. package/dist-client/pages/checklist/file-preview-popup.js +0 -1
  93. package/dist-client/pages/checklist/file-preview-popup.js.map +1 -1
  94. package/dist-client/pages/checklist/inspection-info-popup.d.ts +49 -0
  95. package/dist-client/pages/checklist/inspection-info-popup.js +683 -0
  96. package/dist-client/pages/checklist/inspection-info-popup.js.map +1 -0
  97. package/dist-client/pages/checklist/inspection-tab-popup.d.ts +18 -0
  98. package/dist-client/pages/checklist/inspection-tab-popup.js +196 -0
  99. package/dist-client/pages/checklist/inspection-tab-popup.js.map +1 -0
  100. package/dist-client/pages/checklist/kcs-criteria-popup.d.ts +16 -0
  101. package/dist-client/pages/checklist/kcs-criteria-popup.js +179 -0
  102. package/dist-client/pages/checklist/kcs-criteria-popup.js.map +1 -0
  103. package/dist-client/pages/checklist-database/checklist-database.d.ts +35 -0
  104. package/dist-client/pages/checklist-database/checklist-database.js +540 -0
  105. package/dist-client/pages/checklist-database/checklist-database.js.map +1 -0
  106. package/dist-client/pages/checklist-template/checklist-template-item.js +44 -3
  107. package/dist-client/pages/checklist-template/checklist-template-item.js.map +1 -1
  108. package/dist-client/pages/checklist-template/checklist-template-list.js +4 -3
  109. package/dist-client/pages/checklist-template/checklist-template-list.js.map +1 -1
  110. package/dist-client/pages/checklist-template/checklist-type-management.d.ts +2 -2
  111. package/dist-client/pages/checklist-template/checklist-type-management.js.map +1 -1
  112. package/dist-client/pages/checklist-template/construction-checklist-template-item-popup.d.ts +2 -0
  113. package/dist-client/pages/checklist-template/construction-checklist-template-item-popup.js +223 -0
  114. package/dist-client/pages/checklist-template/construction-checklist-template-item-popup.js.map +1 -0
  115. package/dist-client/pages/checklist-template/construction-checklist-template-list.d.ts +55 -0
  116. package/dist-client/pages/checklist-template/construction-checklist-template-list.js +404 -0
  117. package/dist-client/pages/checklist-template/construction-checklist-template-list.js.map +1 -0
  118. package/dist-client/pages/issue/issue-importer.js.map +1 -1
  119. package/dist-client/pages/issue/issue-list-page.d.ts +1 -2
  120. package/dist-client/pages/issue/issue-list-page.js +1 -2
  121. package/dist-client/pages/issue/issue-list-page.js.map +1 -1
  122. package/dist-client/pages/project-checklist/project-checklist-management.d.ts +62 -0
  123. package/dist-client/pages/project-checklist/project-checklist-management.js +1145 -0
  124. package/dist-client/pages/project-checklist/project-checklist-management.js.map +1 -0
  125. package/dist-client/pages/project-report/project-report-importer.js.map +1 -1
  126. package/dist-client/pages/project-report/project-report-list-page.d.ts +1 -2
  127. package/dist-client/pages/project-report/project-report-list-page.js +1 -2
  128. package/dist-client/pages/project-report/project-report-list-page.js.map +1 -1
  129. package/dist-client/pages/supervisor/supervisor-importer.js.map +1 -1
  130. package/dist-client/pages/supervisor/supervisor-list-page.d.ts +1 -2
  131. package/dist-client/pages/supervisor/supervisor-list-page.js +1 -2
  132. package/dist-client/pages/supervisor/supervisor-list-page.js.map +1 -1
  133. package/dist-client/route.d.ts +1 -1
  134. package/dist-client/route.js +21 -0
  135. package/dist-client/route.js.map +1 -1
  136. package/dist-client/stt/speech-to-text.d.ts +41 -0
  137. package/dist-client/stt/speech-to-text.js +331 -0
  138. package/dist-client/stt/speech-to-text.js.map +1 -0
  139. package/dist-client/stt/stt-utils.d.ts +28 -0
  140. package/dist-client/stt/stt-utils.js +146 -0
  141. package/dist-client/stt/stt-utils.js.map +1 -0
  142. package/dist-client/tsconfig.tsbuildinfo +1 -1
  143. package/dist-server/middlewares/index.js +1 -2
  144. package/dist-server/middlewares/index.js.map +1 -1
  145. package/dist-server/service/action-plan/action-plan-mutation.js +7 -8
  146. package/dist-server/service/action-plan/action-plan-mutation.js.map +1 -1
  147. package/dist-server/service/action-plan/action-plan-query.d.ts +2 -2
  148. package/dist-server/service/action-plan/action-plan-query.js +7 -13
  149. package/dist-server/service/action-plan/action-plan-query.js.map +1 -1
  150. package/dist-server/service/action-plan/action-plan-type.js +6 -6
  151. package/dist-server/service/action-plan/action-plan-type.js.map +1 -1
  152. package/dist-server/service/action-plan/action-plan.js +3 -3
  153. package/dist-server/service/action-plan/action-plan.js.map +1 -1
  154. package/dist-server/service/action-plan/index.d.ts +0 -1
  155. package/dist-server/service/action-plan/index.js +1 -2
  156. package/dist-server/service/action-plan/index.js.map +1 -1
  157. package/dist-server/service/building-inspection/building-inspection-mutation.d.ts +3 -3
  158. package/dist-server/service/building-inspection/building-inspection-mutation.js +185 -40
  159. package/dist-server/service/building-inspection/building-inspection-mutation.js.map +1 -1
  160. package/dist-server/service/building-inspection/building-inspection-query.d.ts +9 -6
  161. package/dist-server/service/building-inspection/building-inspection-query.js +199 -54
  162. package/dist-server/service/building-inspection/building-inspection-query.js.map +1 -1
  163. package/dist-server/service/building-inspection/building-inspection-type.d.ts +38 -10
  164. package/dist-server/service/building-inspection/building-inspection-type.js +142 -29
  165. package/dist-server/service/building-inspection/building-inspection-type.js.map +1 -1
  166. package/dist-server/service/building-inspection/building-inspection.d.ts +14 -0
  167. package/dist-server/service/building-inspection/building-inspection.js +78 -7
  168. package/dist-server/service/building-inspection/building-inspection.js.map +1 -1
  169. package/dist-server/service/building-inspection/index.d.ts +4 -7
  170. package/dist-server/service/building-inspection/index.js +11 -6
  171. package/dist-server/service/building-inspection/index.js.map +1 -1
  172. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-mutation.d.ts +6 -0
  173. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-mutation.js +66 -0
  174. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-mutation.js.map +1 -0
  175. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-query.d.ts +16 -0
  176. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-query.js +171 -0
  177. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-query.js.map +1 -0
  178. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-type.d.ts +23 -0
  179. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-type.js +90 -0
  180. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog-type.js.map +1 -0
  181. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog.d.ts +33 -0
  182. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog.js +132 -0
  183. package/dist-server/service/building-inspection-daily-worklog/building-inspection-daily-worklog.js.map +1 -0
  184. package/dist-server/service/building-inspection-daily-worklog/index.d.ts +5 -0
  185. package/dist-server/service/building-inspection-daily-worklog/index.js +9 -0
  186. package/dist-server/service/building-inspection-daily-worklog/index.js.map +1 -0
  187. package/dist-server/service/building-inspection-history/building-inspection-history-query.d.ts +16 -0
  188. package/dist-server/service/building-inspection-history/building-inspection-history-query.js +120 -0
  189. package/dist-server/service/building-inspection-history/building-inspection-history-query.js.map +1 -0
  190. package/dist-server/service/building-inspection-history/building-inspection-history-type.d.ts +5 -0
  191. package/dist-server/service/building-inspection-history/building-inspection-history-type.js +21 -0
  192. package/dist-server/service/building-inspection-history/building-inspection-history-type.js.map +1 -0
  193. package/dist-server/service/building-inspection-history/building-inspection-history.d.ts +35 -0
  194. package/dist-server/service/building-inspection-history/building-inspection-history.js +162 -0
  195. package/dist-server/service/building-inspection-history/building-inspection-history.js.map +1 -0
  196. package/dist-server/service/{building-inspection → building-inspection-history}/event-subscriber.d.ts +1 -1
  197. package/dist-server/service/{building-inspection → building-inspection-history}/event-subscriber.js +3 -3
  198. package/dist-server/service/building-inspection-history/event-subscriber.js.map +1 -0
  199. package/dist-server/service/building-inspection-history/index.d.ts +6 -0
  200. package/dist-server/service/building-inspection-history/index.js +10 -0
  201. package/dist-server/service/building-inspection-history/index.js.map +1 -0
  202. package/dist-server/service/checklist/checklist-mutation.d.ts +0 -5
  203. package/dist-server/service/checklist/checklist-mutation.js +3 -69
  204. package/dist-server/service/checklist/checklist-mutation.js.map +1 -1
  205. package/dist-server/service/checklist/checklist-query.d.ts +7 -0
  206. package/dist-server/service/checklist/checklist-query.js +85 -2
  207. package/dist-server/service/checklist/checklist-query.js.map +1 -1
  208. package/dist-server/service/checklist/checklist-type.d.ts +0 -13
  209. package/dist-server/service/checklist/checklist-type.js +3 -51
  210. package/dist-server/service/checklist/checklist-type.js.map +1 -1
  211. package/dist-server/service/checklist/checklist.d.ts +38 -3
  212. package/dist-server/service/checklist/checklist.js +133 -17
  213. package/dist-server/service/checklist/checklist.js.map +1 -1
  214. package/dist-server/service/checklist/event-subscriber.d.ts +2 -2
  215. package/dist-server/service/checklist/event-subscriber.js +4 -4
  216. package/dist-server/service/checklist/event-subscriber.js.map +1 -1
  217. package/dist-server/service/checklist/index.d.ts +1 -4
  218. package/dist-server/service/checklist/index.js +2 -5
  219. package/dist-server/service/checklist/index.js.map +1 -1
  220. package/dist-server/service/checklist-history/checklist-history-query.d.ts +11 -0
  221. package/dist-server/service/checklist-history/checklist-history-query.js +77 -0
  222. package/dist-server/service/checklist-history/checklist-history-query.js.map +1 -0
  223. package/dist-server/service/checklist-history/checklist-history-type.d.ts +5 -0
  224. package/dist-server/service/checklist-history/checklist-history-type.js +21 -0
  225. package/dist-server/service/checklist-history/checklist-history-type.js.map +1 -0
  226. package/dist-server/service/checklist-history/checklist-history.d.ts +50 -0
  227. package/dist-server/service/checklist-history/checklist-history.js +239 -0
  228. package/dist-server/service/checklist-history/checklist-history.js.map +1 -0
  229. package/dist-server/service/checklist-history/event-subscriber.d.ts +7 -0
  230. package/dist-server/service/checklist-history/event-subscriber.js +21 -0
  231. package/dist-server/service/checklist-history/event-subscriber.js.map +1 -0
  232. package/dist-server/service/checklist-history/index.d.ts +6 -0
  233. package/dist-server/service/checklist-history/index.js +10 -0
  234. package/dist-server/service/checklist-history/index.js.map +1 -0
  235. package/dist-server/service/checklist-item/checklist-item-mutation.d.ts +2 -0
  236. package/dist-server/service/checklist-item/checklist-item-mutation.js +28 -2
  237. package/dist-server/service/checklist-item/checklist-item-mutation.js.map +1 -1
  238. package/dist-server/service/checklist-item/checklist-item-query.d.ts +1 -1
  239. package/dist-server/service/checklist-item/checklist-item-query.js +7 -5
  240. package/dist-server/service/checklist-item/checklist-item-query.js.map +1 -1
  241. package/dist-server/service/checklist-item/checklist-item-type.d.ts +5 -1
  242. package/dist-server/service/checklist-item/checklist-item-type.js +17 -3
  243. package/dist-server/service/checklist-item/checklist-item-type.js.map +1 -1
  244. package/dist-server/service/checklist-item/checklist-item.d.ts +2 -0
  245. package/dist-server/service/checklist-item/checklist-item.js +14 -4
  246. package/dist-server/service/checklist-item/checklist-item.js.map +1 -1
  247. package/dist-server/service/checklist-item/index.d.ts +2 -2
  248. package/dist-server/service/checklist-item/index.js +1 -2
  249. package/dist-server/service/checklist-item/index.js.map +1 -1
  250. package/dist-server/service/checklist-item-comment/checklist-item-comment-history.js +2 -2
  251. package/dist-server/service/checklist-item-comment/checklist-item-comment-history.js.map +1 -1
  252. package/dist-server/service/checklist-item-comment/checklist-item-comment-mutation.d.ts +1 -0
  253. package/dist-server/service/checklist-item-comment/checklist-item-comment-mutation.js +35 -8
  254. package/dist-server/service/checklist-item-comment/checklist-item-comment-mutation.js.map +1 -1
  255. package/dist-server/service/checklist-item-comment/checklist-item-comment-query.js +2 -2
  256. package/dist-server/service/checklist-item-comment/checklist-item-comment-query.js.map +1 -1
  257. package/dist-server/service/checklist-item-comment/checklist-item-comment-type.js +6 -6
  258. package/dist-server/service/checklist-item-comment/checklist-item-comment-type.js.map +1 -1
  259. package/dist-server/service/checklist-item-comment/checklist-item-comment.js +2 -2
  260. package/dist-server/service/checklist-item-comment/checklist-item-comment.js.map +1 -1
  261. package/dist-server/service/checklist-item-comment/index.d.ts +0 -2
  262. package/dist-server/service/checklist-item-comment/index.js +1 -3
  263. package/dist-server/service/checklist-item-comment/index.js.map +1 -1
  264. package/dist-server/service/checklist-item-history/checklist-item-history-query.d.ts +16 -0
  265. package/dist-server/service/checklist-item-history/checklist-item-history-query.js +123 -0
  266. package/dist-server/service/checklist-item-history/checklist-item-history-query.js.map +1 -0
  267. package/dist-server/service/checklist-item-history/checklist-item-history-type.d.ts +5 -0
  268. package/dist-server/service/checklist-item-history/checklist-item-history-type.js +21 -0
  269. package/dist-server/service/checklist-item-history/checklist-item-history-type.js.map +1 -0
  270. package/dist-server/service/checklist-item-history/checklist-item-history.d.ts +27 -0
  271. package/dist-server/service/checklist-item-history/checklist-item-history.js +133 -0
  272. package/dist-server/service/checklist-item-history/checklist-item-history.js.map +1 -0
  273. package/dist-server/service/checklist-item-history/event-subscriber.d.ts +7 -0
  274. package/dist-server/service/checklist-item-history/event-subscriber.js +21 -0
  275. package/dist-server/service/checklist-item-history/event-subscriber.js.map +1 -0
  276. package/dist-server/service/checklist-item-history/index.d.ts +6 -0
  277. package/dist-server/service/checklist-item-history/index.js +10 -0
  278. package/dist-server/service/checklist-item-history/index.js.map +1 -0
  279. package/dist-server/service/checklist-template/checklist-template-mutation.js +2 -2
  280. package/dist-server/service/checklist-template/checklist-template-mutation.js.map +1 -1
  281. package/dist-server/service/checklist-template/checklist-template-query.d.ts +1 -1
  282. package/dist-server/service/checklist-template/checklist-template-query.js +4 -7
  283. package/dist-server/service/checklist-template/checklist-template-query.js.map +1 -1
  284. package/dist-server/service/checklist-template/checklist-template-type.js +4 -4
  285. package/dist-server/service/checklist-template/checklist-template-type.js.map +1 -1
  286. package/dist-server/service/checklist-template/checklist-template.js +2 -2
  287. package/dist-server/service/checklist-template/checklist-template.js.map +1 -1
  288. package/dist-server/service/checklist-template-item/checklist-template-item-mutation.js +15 -3
  289. package/dist-server/service/checklist-template-item/checklist-template-item-mutation.js.map +1 -1
  290. package/dist-server/service/checklist-template-item/checklist-template-item-query.js +2 -2
  291. package/dist-server/service/checklist-template-item/checklist-template-item-query.js.map +1 -1
  292. package/dist-server/service/checklist-template-item/checklist-template-item-type.d.ts +3 -0
  293. package/dist-server/service/checklist-template-item/checklist-template-item-type.js +13 -4
  294. package/dist-server/service/checklist-template-item/checklist-template-item-type.js.map +1 -1
  295. package/dist-server/service/checklist-template-item/checklist-template-item.d.ts +7 -0
  296. package/dist-server/service/checklist-template-item/checklist-template-item.js +26 -8
  297. package/dist-server/service/checklist-template-item/checklist-template-item.js.map +1 -1
  298. package/dist-server/service/checklist-template-item/spec-matching-service.d.ts +2 -0
  299. package/dist-server/service/checklist-template-item/spec-matching-service.js +51 -0
  300. package/dist-server/service/checklist-template-item/spec-matching-service.js.map +1 -0
  301. package/dist-server/service/checklist-type/checklist-type-mutation.js +2 -2
  302. package/dist-server/service/checklist-type/checklist-type-mutation.js.map +1 -1
  303. package/dist-server/service/checklist-type/checklist-type-query.d.ts +1 -1
  304. package/dist-server/service/checklist-type/checklist-type-query.js +4 -7
  305. package/dist-server/service/checklist-type/checklist-type-query.js.map +1 -1
  306. package/dist-server/service/checklist-type/checklist-type-type.js +4 -4
  307. package/dist-server/service/checklist-type/checklist-type-type.js.map +1 -1
  308. package/dist-server/service/checklist-type/checklist-type.js +3 -3
  309. package/dist-server/service/checklist-type/checklist-type.js.map +1 -1
  310. package/dist-server/service/construction-checklist-template/construction-checklist-template-mutation.d.ts +7 -0
  311. package/dist-server/service/construction-checklist-template/construction-checklist-template-mutation.js +107 -0
  312. package/dist-server/service/construction-checklist-template/construction-checklist-template-mutation.js.map +1 -0
  313. package/dist-server/service/construction-checklist-template/construction-checklist-template-query.d.ts +10 -0
  314. package/dist-server/service/construction-checklist-template/construction-checklist-template-query.js +62 -0
  315. package/dist-server/service/construction-checklist-template/construction-checklist-template-query.js.map +1 -0
  316. package/dist-server/service/construction-checklist-template/construction-checklist-template-type.d.ts +11 -0
  317. package/dist-server/service/construction-checklist-template/construction-checklist-template-type.js +43 -0
  318. package/dist-server/service/construction-checklist-template/construction-checklist-template-type.js.map +1 -0
  319. package/dist-server/service/construction-checklist-template/construction-checklist-template.d.ts +18 -0
  320. package/dist-server/service/construction-checklist-template/construction-checklist-template.js +80 -0
  321. package/dist-server/service/construction-checklist-template/construction-checklist-template.js.map +1 -0
  322. package/dist-server/service/construction-checklist-template/index.d.ts +5 -0
  323. package/dist-server/service/construction-checklist-template/index.js +9 -0
  324. package/dist-server/service/construction-checklist-template/index.js.map +1 -0
  325. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item-mutation.d.ts +6 -0
  326. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item-mutation.js +56 -0
  327. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item-mutation.js.map +1 -0
  328. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item-query.d.ts +9 -0
  329. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item-query.js +53 -0
  330. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item-query.js.map +1 -0
  331. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item-type.d.ts +17 -0
  332. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item-type.js +67 -0
  333. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item-type.js.map +1 -0
  334. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item.d.ts +24 -0
  335. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item.js +113 -0
  336. package/dist-server/service/construction-checklist-template-item/construction-checklist-template-item.js.map +1 -0
  337. package/dist-server/service/construction-checklist-template-item/index.d.ts +5 -0
  338. package/dist-server/service/construction-checklist-template-item/index.js +9 -0
  339. package/dist-server/service/construction-checklist-template-item/index.js.map +1 -0
  340. package/dist-server/service/field-document/field-document-auto-file.d.ts +21 -0
  341. package/dist-server/service/field-document/field-document-auto-file.js +47 -0
  342. package/dist-server/service/field-document/field-document-auto-file.js.map +1 -0
  343. package/dist-server/service/field-document/field-document-mutation.d.ts +9 -0
  344. package/dist-server/service/field-document/field-document-mutation.js +139 -0
  345. package/dist-server/service/field-document/field-document-mutation.js.map +1 -0
  346. package/dist-server/service/field-document/field-document-query.d.ts +14 -0
  347. package/dist-server/service/field-document/field-document-query.js +120 -0
  348. package/dist-server/service/field-document/field-document-query.js.map +1 -0
  349. package/dist-server/service/field-document/field-document-summary-service.d.ts +10 -0
  350. package/dist-server/service/field-document/field-document-summary-service.js +79 -0
  351. package/dist-server/service/field-document/field-document-summary-service.js.map +1 -0
  352. package/dist-server/service/field-document/field-document-type.d.ts +24 -0
  353. package/dist-server/service/field-document/field-document-type.js +88 -0
  354. package/dist-server/service/field-document/field-document-type.js.map +1 -0
  355. package/dist-server/service/field-document/field-document.d.ts +29 -0
  356. package/dist-server/service/field-document/field-document.js +127 -0
  357. package/dist-server/service/field-document/field-document.js.map +1 -0
  358. package/dist-server/service/field-document/index.d.ts +5 -0
  359. package/dist-server/service/field-document/index.js +9 -0
  360. package/dist-server/service/field-document/index.js.map +1 -0
  361. package/dist-server/service/index.d.ts +10 -3
  362. package/dist-server/service/index.js +42 -13
  363. package/dist-server/service/index.js.map +1 -1
  364. package/dist-server/service/issue/index.d.ts +0 -1
  365. package/dist-server/service/issue/index.js +1 -2
  366. package/dist-server/service/issue/index.js.map +1 -1
  367. package/dist-server/service/issue/issue-mutation.js +7 -8
  368. package/dist-server/service/issue/issue-mutation.js.map +1 -1
  369. package/dist-server/service/issue/issue-query.d.ts +2 -2
  370. package/dist-server/service/issue/issue-query.js +7 -13
  371. package/dist-server/service/issue/issue-query.js.map +1 -1
  372. package/dist-server/service/issue/issue-type.js +6 -6
  373. package/dist-server/service/issue/issue-type.js.map +1 -1
  374. package/dist-server/service/issue/issue.js +3 -3
  375. package/dist-server/service/issue/issue.js.map +1 -1
  376. package/dist-server/service/project-checklist/index.d.ts +5 -0
  377. package/dist-server/service/project-checklist/index.js +9 -0
  378. package/dist-server/service/project-checklist/index.js.map +1 -0
  379. package/dist-server/service/project-checklist/project-checklist-mutation.d.ts +7 -0
  380. package/dist-server/service/project-checklist/project-checklist-mutation.js +118 -0
  381. package/dist-server/service/project-checklist/project-checklist-mutation.js.map +1 -0
  382. package/dist-server/service/project-checklist/project-checklist-query.d.ts +12 -0
  383. package/dist-server/service/project-checklist/project-checklist-query.js +76 -0
  384. package/dist-server/service/project-checklist/project-checklist-query.js.map +1 -0
  385. package/dist-server/service/project-checklist/project-checklist-type.d.ts +18 -0
  386. package/dist-server/service/project-checklist/project-checklist-type.js +69 -0
  387. package/dist-server/service/project-checklist/project-checklist-type.js.map +1 -0
  388. package/dist-server/service/project-checklist/project-checklist.d.ts +20 -0
  389. package/dist-server/service/project-checklist/project-checklist.js +90 -0
  390. package/dist-server/service/project-checklist/project-checklist.js.map +1 -0
  391. package/dist-server/service/project-checklist/spec-matching-service.d.ts +17 -0
  392. package/dist-server/service/project-checklist/spec-matching-service.js +140 -0
  393. package/dist-server/service/project-checklist/spec-matching-service.js.map +1 -0
  394. package/dist-server/service/project-checklist-item/index.d.ts +4 -0
  395. package/dist-server/service/project-checklist-item/index.js +9 -0
  396. package/dist-server/service/project-checklist-item/index.js.map +1 -0
  397. package/dist-server/service/project-checklist-item/project-checklist-item-mutation.d.ts +2 -0
  398. package/dist-server/service/project-checklist-item/project-checklist-item-mutation.js +13 -0
  399. package/dist-server/service/project-checklist-item/project-checklist-item-mutation.js.map +1 -0
  400. package/dist-server/service/project-checklist-item/project-checklist-item-query.d.ts +5 -0
  401. package/dist-server/service/project-checklist-item/project-checklist-item-query.js +34 -0
  402. package/dist-server/service/project-checklist-item/project-checklist-item-query.js.map +1 -0
  403. package/dist-server/service/project-checklist-item/project-checklist-item-type.d.ts +5 -0
  404. package/dist-server/service/project-checklist-item/project-checklist-item-type.js +21 -0
  405. package/dist-server/service/project-checklist-item/project-checklist-item-type.js.map +1 -0
  406. package/dist-server/service/project-checklist-item/project-checklist-item.d.ts +19 -0
  407. package/dist-server/service/project-checklist-item/project-checklist-item.js +92 -0
  408. package/dist-server/service/project-checklist-item/project-checklist-item.js.map +1 -0
  409. package/dist-server/service/project-report/index.d.ts +0 -1
  410. package/dist-server/service/project-report/index.js +1 -2
  411. package/dist-server/service/project-report/index.js.map +1 -1
  412. package/dist-server/service/project-report/project-report-mutation.js +7 -8
  413. package/dist-server/service/project-report/project-report-mutation.js.map +1 -1
  414. package/dist-server/service/project-report/project-report-query.d.ts +2 -2
  415. package/dist-server/service/project-report/project-report-query.js +7 -13
  416. package/dist-server/service/project-report/project-report-query.js.map +1 -1
  417. package/dist-server/service/project-report/project-report-type.js +6 -6
  418. package/dist-server/service/project-report/project-report-type.js.map +1 -1
  419. package/dist-server/service/project-report/project-report.d.ts +0 -2
  420. package/dist-server/service/project-report/project-report.js +3 -9
  421. package/dist-server/service/project-report/project-report.js.map +1 -1
  422. package/dist-server/service/supervisor/index.d.ts +0 -1
  423. package/dist-server/service/supervisor/index.js +1 -2
  424. package/dist-server/service/supervisor/index.js.map +1 -1
  425. package/dist-server/service/supervisor/supervisor-mutation.js +7 -8
  426. package/dist-server/service/supervisor/supervisor-mutation.js.map +1 -1
  427. package/dist-server/service/supervisor/supervisor-query.d.ts +2 -2
  428. package/dist-server/service/supervisor/supervisor-query.js +7 -13
  429. package/dist-server/service/supervisor/supervisor-query.js.map +1 -1
  430. package/dist-server/service/supervisor/supervisor-type.js +6 -6
  431. package/dist-server/service/supervisor/supervisor-type.js.map +1 -1
  432. package/dist-server/service/supervisor/supervisor.js +3 -3
  433. package/dist-server/service/supervisor/supervisor.js.map +1 -1
  434. package/dist-server/tsconfig.tsbuildinfo +1 -1
  435. package/package.json +16 -13
  436. package/things-factory.config.js +11 -1
  437. package/dist-server/service/building-inspection/building-inspection-history.d.ts +0 -17
  438. package/dist-server/service/building-inspection/building-inspection-history.js +0 -86
  439. package/dist-server/service/building-inspection/building-inspection-history.js.map +0 -1
  440. package/dist-server/service/building-inspection/event-subscriber.js.map +0 -1
  441. package/dist-server/service/checklist/checklist-history.d.ts +0 -24
  442. package/dist-server/service/checklist/checklist-history.js +0 -120
  443. package/dist-server/service/checklist/checklist-history.js.map +0 -1
  444. package/dist-server/service/checklist-item-comment/event-subscriber.d.ts +0 -7
  445. package/dist-server/service/checklist-item-comment/event-subscriber.js +0 -21
  446. package/dist-server/service/checklist-item-comment/event-subscriber.js.map +0 -1
@@ -0,0 +1,1406 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ /**
3
+ * 검측 관리 상세 - AI 자동 검측
4
+ *
5
+ * 검측 체크리스트 항목을 AI 엔진(inspection-ai)에 보내:
6
+ * 1) 촬영 가이드(plan-shots)를 받아 단계별 촬영 슬롯을 표시하고
7
+ * 2) 촬영된 사진으로 자동 판정(inspect)을 실행한 뒤
8
+ * 3) 항목별 상세 / 추가 촬영(재검사) / 종합 리포트를 거쳐
9
+ * 4) 검사 등록 시 감리자 적합/부적합 자동 반영 + AI판단 근거를 첨부한다.
10
+ */
11
+ import '@material/web/icon/icon.js';
12
+ import '@material/web/progress/circular-progress.js';
13
+ import gql from 'graphql-tag';
14
+ import { css, html } from 'lit';
15
+ import { customElement, state, query } from 'lit/decorators.js';
16
+ import { PageView, navigate } from '@operato/shell';
17
+ import { ScrollbarStyles } from '@operato/styles';
18
+ import { client } from '@operato/graphql';
19
+ import { notify } from '@operato/layout';
20
+ import './component/building-inspection-detail-header';
21
+ const ENGINE_BASE_URL = 'https://hatiolab-korea-uni.ettisoft.com';
22
+ const ENGINE_RUN_URL = `${ENGINE_BASE_URL}/api/run/inspection-ai`;
23
+ const ENGINE_AUTH = `Basic ${btoa('admin:admin1234')}`;
24
+ const MAX_IMAGES = 8;
25
+ /* 엔진 verdict(기계값) → 화면 라벨. pass/fail만 합/불로 자동 체크, 나머지(보류/미지원/오류)는 감리자 판단 */
26
+ const VERDICT_LABEL = {
27
+ pass: '적합',
28
+ fail: '부적합',
29
+ hold: '보류',
30
+ pending: '미지원',
31
+ error: '오류'
32
+ };
33
+ /* 엔진 routing(기계값) → 화면 라벨 */
34
+ const ROUTING_LABEL = {
35
+ vlm: 'AI 사진판독',
36
+ cv: '자동 측정',
37
+ cv_missing: '자동 측정 누락'
38
+ };
39
+ let BuildingInspectionAiMeasurement = class BuildingInspectionAiMeasurement extends PageView {
40
+ constructor() {
41
+ super(...arguments);
42
+ this.project = {};
43
+ this.buildingInspection = {};
44
+ this.buildingInspectionId = '';
45
+ this.guide = null; // plan-shots 응답 {shots, total_shots, markdown}
46
+ this.photos = [];
47
+ this.result = null; // inspect 응답
48
+ this.mainPhotoIndex = 0;
49
+ this.panel = 'none';
50
+ this.selectedItem = null;
51
+ this.recaptureBase = 0; // 재촬영 패널 진입 시점의 사진 수
52
+ this.expandedReportId = null; // 종합 리포트에서 펼친 항목(아코디언)
53
+ this.loading = false;
54
+ this.loadingText = '';
55
+ /* 슬롯 클릭으로 선택기를 연 경우 대상 슬롯 인덱스 (null이면 뒤에 추가) */
56
+ this.pendingSlotIndex = null;
57
+ this._resetPhotos = () => {
58
+ this.photos.forEach(p => URL.revokeObjectURL(p.url));
59
+ this.photos = [];
60
+ };
61
+ this._openReport = () => {
62
+ this.panel = 'report';
63
+ this.selectedItem = null;
64
+ this.expandedReportId = null;
65
+ };
66
+ this._closePanel = () => {
67
+ this.panel = 'none';
68
+ this.selectedItem = null;
69
+ };
70
+ }
71
+ get context() {
72
+ return {
73
+ title: '검측 관리 상세 - AI 자동 검측'
74
+ };
75
+ }
76
+ /* 엔진에 보낼 검측요청서: 체크리스트 항목 → {item_id, category, text} */
77
+ get engineChecklist() {
78
+ var _a, _b;
79
+ const items = ((_b = (_a = this.buildingInspection) === null || _a === void 0 ? void 0 : _a.checklist) === null || _b === void 0 ? void 0 : _b.checklistItems) || [];
80
+ return [...items]
81
+ .sort((a, b) => (a.sequence || 0) - (b.sequence || 0))
82
+ .map(item => ({
83
+ item_id: item.id,
84
+ category: [item.mainType, item.detailType].filter(Boolean).join(' · '),
85
+ text: item.name || ''
86
+ }));
87
+ }
88
+ render() {
89
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
90
+ return html `
91
+ <building-inspection-detail-header
92
+ .buildingInspectionId=${(_a = this.buildingInspection) === null || _a === void 0 ? void 0 : _a.id}
93
+ .buildingLevelId=${(_c = (_b = this.buildingInspection) === null || _b === void 0 ? void 0 : _b.buildingLevel) === null || _c === void 0 ? void 0 : _c.id}
94
+ .projectName=${this.project.name}
95
+ .buildingName=${(_f = (_e = (_d = this.buildingInspection) === null || _d === void 0 ? void 0 : _d.buildingLevel) === null || _e === void 0 ? void 0 : _e.building) === null || _f === void 0 ? void 0 : _f.name}
96
+ .buildingLevelFloor=${(_h = (_g = this.buildingInspection) === null || _g === void 0 ? void 0 : _g.buildingLevel) === null || _h === void 0 ? void 0 : _h.floor}
97
+ .projectId=${this.project.id}
98
+ ></building-inspection-detail-header>
99
+
100
+ <div body>
101
+ <div class="page-title">
102
+ AI 자동 검측 – ${((_k = (_j = this.buildingInspection) === null || _j === void 0 ? void 0 : _j.checklist) === null || _k === void 0 ? void 0 : _k.location) || ''}
103
+ <span target>${((_m = (_l = this.buildingInspection) === null || _l === void 0 ? void 0 : _l.checklist) === null || _m === void 0 ? void 0 : _m.name) || ''}</span>
104
+ </div>
105
+
106
+ ${this.result ? this._renderResult() : this._renderGuide()}
107
+ </div>
108
+
109
+ <!-- 모바일에서 촬영/앨범 선택이 함께 뜨도록 capture 속성 없이 사용 -->
110
+ <input id="photoInput" type="file" accept="image/*" multiple @change=${this._onPhotosSelected} />
111
+
112
+ ${this.loading
113
+ ? html `
114
+ <div class="loading-overlay">
115
+ <div class="box">
116
+ <md-circular-progress indeterminate></md-circular-progress>
117
+ <span>${this.loadingText}</span>
118
+ </div>
119
+ </div>
120
+ `
121
+ : ''}
122
+ `;
123
+ }
124
+ /* ─── 1단계: 촬영 가이드 화면 ─── */
125
+ _renderGuide() {
126
+ if (!this.guide) {
127
+ return html `<div class="empty-state">촬영 가이드를 준비 중입니다...</div>`;
128
+ }
129
+ const shots = this.guide.shots || [];
130
+ const total = this.guide.total_shots || shots.length;
131
+ const taken = this.photos.length;
132
+ const current = shots[Math.min(taken, shots.length - 1)];
133
+ const done = taken >= total;
134
+ return html `
135
+ <div class="guide-container">
136
+ <div class="step-badge">${Math.min(taken + 1, total)}단계 · ${(current === null || current === void 0 ? void 0 : current.target) || '촬영'}</div>
137
+ <div class="guide-title">${(current === null || current === void 0 ? void 0 : current.target) || ''}${done ? ' 촬영 완료' : ''}</div>
138
+ <div class="guide-desc">이 사진을 토대로 AI가 적용할 체크리스트를 결정하고 일부를 자동 판정합니다.</div>
139
+
140
+ <div class="card">
141
+ <h4>촬영 가이드</h4>
142
+ <ul>
143
+ ${shots.map(s => html `<li>${s.target} — ${s.how}</li>`)}
144
+ </ul>
145
+ </div>
146
+
147
+ <div class="card" style="display: flex; flex-direction: column; gap: 10px;">
148
+ <div class="progress-row">
149
+ <span>사진 진행</span>
150
+ <span>${taken} / ${total}</span>
151
+ </div>
152
+ <div class="progress-bar"><div style="width: ${total ? (taken / total) * 100 : 0}%"></div></div>
153
+ ${!done ? html `<div class="next-shot">다음 촬영: ${(current === null || current === void 0 ? void 0 : current.how) || (current === null || current === void 0 ? void 0 : current.target) || ''}</div>` : ''}
154
+ <div class="slot-grid">
155
+ ${shots.map((s, i) => html `
156
+ <div class="slot" @click=${() => this._openPhotoPicker(i)}>
157
+ ${this.photos[i]
158
+ ? html `<img src=${this.photos[i].url} alt=${s.target} />`
159
+ : html `<md-icon>add_a_photo</md-icon>${s.target}`}
160
+ </div>
161
+ `)}
162
+ </div>
163
+ </div>
164
+
165
+ <button class="primary-button" ?disabled=${taken === 0} @click=${() => this._runInspection()}>
166
+ 사진 선택 ${taken ? `(${taken}/${total})` : ''}
167
+ </button>
168
+ ${taken > 0
169
+ ? html `
170
+ <div style="display: flex; justify-content: flex-end;">
171
+ <button class="text-button" @click=${this._resetPhotos}>사진 초기화</button>
172
+ </div>
173
+ `
174
+ : ''}
175
+ </div>
176
+ `;
177
+ }
178
+ /* ─── 2단계: 판정 결과 화면 ─── */
179
+ _renderResult() {
180
+ const items = this._sortedItems();
181
+ const autoItems = items.filter(it => it.verdict === 'pass' || it.verdict === 'fail');
182
+ const moreItems = items.filter(it => it.verdict !== 'pass' && it.verdict !== 'fail');
183
+ // 클릭한 항목의 used_images만 표시 (선택 없으면 전체 항목 합집합). used_images는 전체 사진 기준 1-based
184
+ const focusItems = this.selectedItem ? [this.selectedItem] : items;
185
+ const usedNos = new Set();
186
+ for (const it of focusItems)
187
+ for (const n of it.used_images || [])
188
+ usedNos.add(n);
189
+ const usedPhotos = this.photos.map((photo, i) => ({ photo, no: i + 1 })).filter(x => usedNos.has(x.no));
190
+ const mainPhoto = usedPhotos[this.mainPhotoIndex];
191
+ return html `
192
+ <div class="result-body">
193
+ <div class="photo-pane">
194
+ <div class="caption">판정에 사용된 사진</div>
195
+ <div class="photo-main">${mainPhoto ? html `<img src=${mainPhoto.photo.url} alt="현장 사진" />` : ''}</div>
196
+ <div class="photo-thumbs">
197
+ ${usedPhotos.map((x, i) => html `
198
+ <img
199
+ src=${x.photo.url}
200
+ alt="사진 ${x.no}"
201
+ ?selected=${i === this.mainPhotoIndex}
202
+ @click=${() => (this.mainPhotoIndex = i)}
203
+ />
204
+ `)}
205
+ </div>
206
+ </div>
207
+
208
+ <div class="items-pane">
209
+ <div class="summary-banner">
210
+ 적용 항목 ${items.length}개 · 자동 판정 ${autoItems.length}개 · 추가 촬영 ${moreItems.length}개
211
+ </div>
212
+
213
+ ${autoItems.length
214
+ ? html `
215
+ <div class="group-title">자동 판정 완료 (${autoItems.length})</div>
216
+ ${autoItems.map((it, i) => this._renderItemCard(it, i + 1))}
217
+ `
218
+ : ''}
219
+ ${moreItems.length
220
+ ? html `
221
+ <div class="group-title">추가 촬영 필요 (${moreItems.length} 남음)</div>
222
+ ${moreItems.map((it, i) => this._renderItemCard(it, i + 1))}
223
+ `
224
+ : ''}
225
+
226
+ <button class="primary-button" @click=${this._openReport}>종합 검사 리포트</button>
227
+ </div>
228
+
229
+ ${this.panel !== 'none' ? this._renderSidePane() : ''}
230
+ </div>
231
+ `;
232
+ }
233
+ _renderItemCard(item, no) {
234
+ var _a;
235
+ const auto = item.verdict === 'pass' || item.verdict === 'fail';
236
+ return html `
237
+ <div class="item-card" ?selected=${((_a = this.selectedItem) === null || _a === void 0 ? void 0 : _a.item_id) === item.item_id} @click=${() => this._openDetail(item)}>
238
+ <div class="item-no">${no}</div>
239
+ <div class="item-main">
240
+ <div class="item-name">${item.text}</div>
241
+ <div>
242
+ <span class="chip">${ROUTING_LABEL[item.routing] || item.routing}</span>
243
+ <span class="chip-verdict">${VERDICT_LABEL[item.verdict] || item.verdict}</span>
244
+ </div>
245
+ <div class="item-desc">${item.observation ? `관찰: ${item.observation}` : item.reason || ''}</div>
246
+ </div>
247
+ ${auto
248
+ ? html `
249
+ <div class="badge" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>
250
+ ${VERDICT_LABEL[item.verdict]}
251
+ </div>
252
+ `
253
+ : item.verdict === 'hold'
254
+ ? html `
255
+ <button
256
+ class="capture-button"
257
+ @click=${(e) => {
258
+ e.stopPropagation();
259
+ this._openRecapture(item);
260
+ }}
261
+ >
262
+ 촬영하기
263
+ </button>
264
+ `
265
+ : html `<div class="badge" etc>${VERDICT_LABEL[item.verdict] || item.verdict}</div>`}
266
+ </div>
267
+ `;
268
+ }
269
+ /* ─── 우측 패널: 상세 / 재촬영 / 리포트 ─── */
270
+ _renderSidePane() {
271
+ if (this.panel === 'detail' && this.selectedItem)
272
+ return this._renderDetailPane(this.selectedItem);
273
+ if (this.panel === 'recapture' && this.selectedItem)
274
+ return this._renderRecapturePane(this.selectedItem);
275
+ if (this.panel === 'report')
276
+ return this._renderReportPane();
277
+ return '';
278
+ }
279
+ _renderDetailPane(item) {
280
+ const auto = item.verdict === 'pass' || item.verdict === 'fail';
281
+ const routingLabel = ROUTING_LABEL[item.routing] || item.routing;
282
+ const verdictLabel = VERDICT_LABEL[item.verdict] || item.verdict;
283
+ return html `
284
+ <div class="side-pane">
285
+ <div class="detail-header">
286
+ <span class="badge" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'} ?etc=${!auto}>
287
+ ${routingLabel}
288
+ </span>
289
+ <h3>${verdictLabel}</h3>
290
+ </div>
291
+ <div class="detail-summary">${(item.observation || item.ai_report || '').trim()}</div>
292
+ <div class="kv-grid">
293
+ <div class="kv">
294
+ <label>판정</label>
295
+ <span class="verdict-value" ?pass=${item.verdict === 'pass'} ?fail=${item.verdict === 'fail'}>
296
+ ${verdictLabel || '-'}
297
+ </span>
298
+ </div>
299
+ ${item.confidence != null
300
+ ? html `
301
+ <div class="kv">
302
+ <label>신뢰도</label>
303
+ <span>${Math.round(item.confidence * 100)}%</span>
304
+ </div>
305
+ `
306
+ : ''}
307
+ <div class="kv">
308
+ <label>처리</label>
309
+ <span>${ROUTING_LABEL[item.routing] || item.routing || '-'}</span>
310
+ </div>
311
+ </div>
312
+
313
+ <div class="reason-box">
314
+ <div class="reason-verdict">
315
+ <label style="font-size: 11px;color: #7d2f2f; display: block; font-weight: bold;">판단 근거</label>
316
+ ${item.reason}
317
+ </div>
318
+ </div>
319
+
320
+ <button class="text-button" @click=${this._closePanel}>닫기</button>
321
+ </div>
322
+ `;
323
+ }
324
+ _renderRecapturePane(item) {
325
+ var _a;
326
+ const shots = ((_a = item.recapture_shots) === null || _a === void 0 ? void 0 : _a.length)
327
+ ? item.recapture_shots
328
+ : [{ target: '추가 사진', how: '항목이 잘 보이도록 촬영해주세요.' }];
329
+ const taken = this.photos.length - this.recaptureBase;
330
+ const total = shots.length;
331
+ return html `
332
+ <div class="side-pane">
333
+ <h3>${item.text}</h3>
334
+ <div class="why-box">
335
+ <b>왜 추가 촬영이 필요한가요?</b><br />
336
+ ${item.reason || '판정을 위해 추가 사진이 필요합니다.'}
337
+ </div>
338
+ <div>
339
+ <h4 style="margin: 0 0 8px 0; font-size: 13px;">촬영 가이드</h4>
340
+ <ul
341
+ style="margin: 0; padding-left: 18px; font-size: 12px; color: #555; display: flex; flex-direction: column; gap: 6px;"
342
+ >
343
+ ${shots.map(s => html `<li>${s.target} — ${s.how}</li>`)}
344
+ </ul>
345
+ </div>
346
+ <div class="progress-row">
347
+ <span>사진 진행</span>
348
+ <span>${Math.min(taken, total)} / ${total}</span>
349
+ </div>
350
+ <div class="progress-bar"><div style="width: ${total ? Math.min(taken / total, 1) * 100 : 0}%"></div></div>
351
+ <div class="slot-grid">
352
+ ${shots.map((s, i) => {
353
+ const photo = this.photos[this.recaptureBase + i];
354
+ return html `
355
+ <div class="slot" @click=${() => this._openPhotoPicker(this.recaptureBase + i)}>
356
+ ${photo ? html `<img src=${photo.url} alt=${s.target} />` : html `<md-icon>add_a_photo</md-icon>${s.target}`}
357
+ </div>
358
+ `;
359
+ })}
360
+ </div>
361
+ ${taken > 0
362
+ ? html `<button class="primary-button" @click=${() => this._runInspection()}>재검사 실행 (${taken}장)</button>`
363
+ : ''}
364
+ <button class="text-button" @click=${this._closePanel}>닫기</button>
365
+ </div>
366
+ `;
367
+ }
368
+ _renderReportPane() {
369
+ var _a;
370
+ const items = this._sortedItems();
371
+ const summary = ((_a = this.result) === null || _a === void 0 ? void 0 : _a.summary) || {};
372
+ const etcCount = (summary.hold || 0) + (summary.pending || 0) + (summary.error || 0);
373
+ return html `
374
+ <div class="side-pane">
375
+ <h3>종합 검사 리포트</h3>
376
+ <div class="report-counts">
377
+ <div pass><b>${summary.pass || 0}</b><small>적합</small></div>
378
+ <div fail><b>${summary.fail || 0}</b><small>부적합</small></div>
379
+ <div etc><b>${etcCount}</b><small>미검사</small></div>
380
+ </div>
381
+ <div style="overflow-y: auto; max-height: 380px;">
382
+ ${items.map((it, i) => {
383
+ var _a;
384
+ const expanded = this.expandedReportId === it.item_id;
385
+ return html `
386
+ <div class="report-item">
387
+ <div class="report-head" @click=${() => this._toggleReportItem(it.item_id)}>
388
+ <span class="report-text">${i + 1}. ${it.text}</span>
389
+ <span
390
+ class="verdict"
391
+ ?pass=${it.verdict === 'pass'}
392
+ ?fail=${it.verdict === 'fail'}
393
+ ?etc=${it.verdict !== 'pass' && it.verdict !== 'fail'}
394
+ >
395
+ ${VERDICT_LABEL[it.verdict] || it.verdict}
396
+ </span>
397
+ <md-icon class="report-caret" ?open=${expanded}>expand_more</md-icon>
398
+ </div>
399
+ ${expanded
400
+ ? html `
401
+ <div class="report-basis">
402
+ ${it.ai_report ? html `<div class="report-ai">${(it.ai_report || '').trim()}</div>` : ''}
403
+ ${it.observation ? html `<div>관찰: ${it.observation}</div>` : ''}
404
+ ${it.reason ? html `<div>판단: ${it.reason}</div>` : ''}
405
+ ${((_a = it.used_images) === null || _a === void 0 ? void 0 : _a.length)
406
+ ? html `<div class="report-used">근거 사진: ${it.used_images.map(n => `#${n}`).join(', ')}</div>`
407
+ : ''}
408
+ </div>
409
+ `
410
+ : ''}
411
+ </div>
412
+ `;
413
+ })}
414
+ </div>
415
+ <button class="primary-button" @click=${this._registerInspection}>검사 등록</button>
416
+ <button class="text-button" @click=${this._closePanel}>닫기</button>
417
+ </div>
418
+ `;
419
+ }
420
+ /* ─── 라이프사이클 ─── */
421
+ async pageUpdated(changes, lifecycle) {
422
+ if (this.active) {
423
+ this._resetAll();
424
+ this.buildingInspectionId = lifecycle.resourceId || '';
425
+ await this.initBuildingInspection(this.buildingInspectionId);
426
+ await this._loadShotGuide();
427
+ }
428
+ }
429
+ async initBuildingInspection(buildingInspectionId = '') {
430
+ var _a, _b, _c, _d;
431
+ const response = await client.query({
432
+ query: gql `
433
+ query BuildingInspection($buildingInspectionId: String!) {
434
+ buildingInspection(id: $buildingInspectionId) {
435
+ id
436
+ status
437
+ checklist {
438
+ id
439
+ name
440
+ location
441
+ checklistItems {
442
+ id
443
+ sequence
444
+ mainType
445
+ detailType
446
+ name
447
+ }
448
+ }
449
+ buildingLevel {
450
+ id
451
+ floor
452
+ building {
453
+ id
454
+ name
455
+ buildingComplex {
456
+ id
457
+ }
458
+ }
459
+ }
460
+ }
461
+ }
462
+ `,
463
+ variables: { buildingInspectionId }
464
+ });
465
+ if (response.errors)
466
+ return;
467
+ this.buildingInspection = response.data.buildingInspection;
468
+ await this._getProjectByBuildingComplexId((_d = (_c = (_b = (_a = this.buildingInspection) === null || _a === void 0 ? void 0 : _a.buildingLevel) === null || _b === void 0 ? void 0 : _b.building) === null || _c === void 0 ? void 0 : _c.buildingComplex) === null || _d === void 0 ? void 0 : _d.id);
469
+ }
470
+ async _getProjectByBuildingComplexId(buildingComplexId) {
471
+ const response = await client.query({
472
+ query: gql `
473
+ query ProjectByBuildingComplexId($buildingComplexId: String!) {
474
+ project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {
475
+ id
476
+ name
477
+ }
478
+ }
479
+ `,
480
+ variables: { buildingComplexId }
481
+ });
482
+ if (response.errors)
483
+ return;
484
+ this.project = response.data.project;
485
+ }
486
+ /* ─── 엔진 호출 ─── */
487
+ /* 엔진 실행 공통 호출: input(JSON) + 사진 파일들을 multipart로 전송 */
488
+ async _callEngine(input, files = []) {
489
+ const form = new FormData();
490
+ form.append('input', JSON.stringify(input));
491
+ for (const file of files)
492
+ form.append('files', file, file.name);
493
+ const response = await fetch(ENGINE_RUN_URL, {
494
+ method: 'POST',
495
+ headers: { Authorization: ENGINE_AUTH },
496
+ body: form
497
+ });
498
+ const raw = await response.json();
499
+ const data = (raw === null || raw === void 0 ? void 0 : raw.result) || {};
500
+ if ((data === null || data === void 0 ? void 0 : data.status) !== 'success') {
501
+ throw new Error((data === null || data === void 0 ? void 0 : data.error) || (raw === null || raw === void 0 ? void 0 : raw.error) || 'AI 엔진 호출에 실패했습니다.');
502
+ }
503
+ return data.result;
504
+ }
505
+ /* [1단계] 촬영 가이드 생성 (plan-shots) */
506
+ async _loadShotGuide() {
507
+ const checklist = this.engineChecklist;
508
+ if (!checklist.length) {
509
+ notify({ message: '체크리스트 항목이 없습니다.', level: 'warn' });
510
+ return;
511
+ }
512
+ try {
513
+ this.loading = true;
514
+ this.loadingText = 'AI 촬영 가이드 생성 중...';
515
+ this.guide = await this._callEngine({ action: 'plan-shots', checklist });
516
+ }
517
+ catch (error) {
518
+ console.error('촬영 가이드 생성 실패:', error);
519
+ notify({ message: error.message, level: 'error' });
520
+ }
521
+ finally {
522
+ this.loading = false;
523
+ }
524
+ }
525
+ /* [2단계] 자동 판정 실행 (inspect)
526
+ * - 최초 판정: 전체 사진 + 전체 체크리스트
527
+ * - 재검사(재촬영 패널): 이번에 새로 찍은 사진만 + 해당 항목만 재판정 후 결과 병합 */
528
+ async _runInspection() {
529
+ const isRecapture = this.panel === 'recapture' && !!this.selectedItem;
530
+ // 재검사는 recaptureBase 이후에 찍은 사진만 전송
531
+ const files = (isRecapture ? this.photos.slice(this.recaptureBase) : this.photos).map(p => p.file);
532
+ if (!files.length) {
533
+ notify({ message: '촬영된 사진이 없습니다.', level: 'warn' });
534
+ return;
535
+ }
536
+ const checklist = isRecapture
537
+ ? this.engineChecklist.filter(c => c.item_id === this.selectedItem.item_id)
538
+ : this.engineChecklist;
539
+ try {
540
+ this.loading = true;
541
+ this.loadingText = 'AI 자동 판정 중... (최대 1~2분 소요)';
542
+ const result = await this._callEngine({ action: 'inspect', checklist }, files);
543
+ if (isRecapture) {
544
+ this._mergeRecaptureResult(result);
545
+ }
546
+ else {
547
+ this.result = result;
548
+ }
549
+ this.panel = 'none';
550
+ this.selectedItem = null;
551
+ this.mainPhotoIndex = 0;
552
+ }
553
+ catch (error) {
554
+ console.error('AI 자동 판정 실패:', error);
555
+ notify({ message: error.message, level: 'error' });
556
+ }
557
+ finally {
558
+ this.loading = false;
559
+ }
560
+ }
561
+ /* 재검사(부분 전송) 결과를 기존 전체 결과에 병합
562
+ * - used_images는 전송한 부분집합 기준 1-based → 전체 사진 인덱스로 보정(recaptureBase 가산)
563
+ * - 해당 항목만 교체 후 summary 재계산 */
564
+ _mergeRecaptureResult(result) {
565
+ var _a, _b;
566
+ const base = this.recaptureBase;
567
+ const updated = ((result === null || result === void 0 ? void 0 : result.items_sorted) || (result === null || result === void 0 ? void 0 : result.items) || []).map((it) => (Object.assign(Object.assign({}, it), { used_images: (it.used_images || []).map((n) => n + base) })));
568
+ const byId = new Map(updated.map((it) => [it.item_id, it]));
569
+ const replace = (arr) => (arr || []).map(it => byId.get(it.item_id) || it);
570
+ const items = replace((_a = this.result) === null || _a === void 0 ? void 0 : _a.items);
571
+ const itemsSorted = ((_b = this.result) === null || _b === void 0 ? void 0 : _b.items_sorted) ? replace(this.result.items_sorted) : undefined;
572
+ const summary = { pass: 0, fail: 0, hold: 0, pending: 0, error: 0 };
573
+ for (const it of itemsSorted || items)
574
+ summary[it.verdict] = (summary[it.verdict] || 0) + 1;
575
+ this.result = Object.assign(Object.assign(Object.assign(Object.assign({}, this.result), { items }), (itemsSorted ? { items_sorted: itemsSorted } : {})), { summary });
576
+ }
577
+ /* ─── 사진 선택 ─── */
578
+ /* 슬롯 클릭 → 사진 선택기 열기 (모바일: 촬영/앨범 선택 팝업, 채워진 슬롯이면 교체) */
579
+ _openPhotoPicker(slotIndex = null) {
580
+ var _a;
581
+ this.pendingSlotIndex = slotIndex;
582
+ (_a = this.photoInputEl) === null || _a === void 0 ? void 0 : _a.click();
583
+ }
584
+ _onPhotosSelected(event) {
585
+ const input = event.target;
586
+ const files = Array.from((input === null || input === void 0 ? void 0 : input.files) || []).filter(f => f.type.startsWith('image/') || /\.heic$/i.test(f.name));
587
+ input.value = '';
588
+ const slotIndex = this.pendingSlotIndex;
589
+ this.pendingSlotIndex = null;
590
+ if (!files.length)
591
+ return;
592
+ // 채워진 슬롯을 클릭한 경우 → 해당 사진 교체 (첫 파일만 사용)
593
+ if (slotIndex !== null && slotIndex < this.photos.length) {
594
+ URL.revokeObjectURL(this.photos[slotIndex].url);
595
+ const next = [...this.photos];
596
+ next[slotIndex] = { file: files[0], url: URL.createObjectURL(files[0]) };
597
+ this.photos = next;
598
+ return;
599
+ }
600
+ // 빈 슬롯/추가 → 순서대로 뒤에 추가
601
+ // 엔진 제한은 요청(호출)당 MAX_IMAGES장. 재검사는 새로 찍은 사진만 별도 전송되므로
602
+ // 누적 합계가 아니라 이번 회차(최초=전체, 재검사=recaptureBase 이후) 기준으로만 제한한다.
603
+ const batchBase = this.panel === 'recapture' ? this.recaptureBase : 0;
604
+ const cap = batchBase + MAX_IMAGES;
605
+ if (this.photos.length + files.length > cap) {
606
+ notify({ message: `사진은 회차당 최대 ${MAX_IMAGES}장까지 사용할 수 있습니다.`, level: 'warn' });
607
+ files.length = Math.max(0, cap - this.photos.length);
608
+ if (!files.length)
609
+ return;
610
+ }
611
+ this.photos = [...this.photos, ...files.map(file => ({ file, url: URL.createObjectURL(file) }))];
612
+ }
613
+ _resetAll() {
614
+ this._resetPhotos();
615
+ this.guide = null;
616
+ this.result = null;
617
+ this.panel = 'none';
618
+ this.selectedItem = null;
619
+ this.mainPhotoIndex = 0;
620
+ this.recaptureBase = 0;
621
+ }
622
+ /* ─── 패널 열기/닫기 ─── */
623
+ _openDetail(item) {
624
+ // 보류(hold)는 추가 촬영이 필요한 케이스 → 상세 대신 추가 촬영 UI를 바로 표시
625
+ if (item.verdict === 'hold') {
626
+ this._openRecapture(item);
627
+ return;
628
+ }
629
+ this.selectedItem = item;
630
+ this.mainPhotoIndex = 0; // 선택 항목의 첫 사용 사진부터 표시
631
+ this.panel = 'detail';
632
+ }
633
+ _openRecapture(item) {
634
+ this.selectedItem = item;
635
+ this.recaptureBase = this.photos.length;
636
+ this.panel = 'recapture';
637
+ }
638
+ /* 종합 리포트 항목 펼치기/접기 (한 번에 하나만 펼침) */
639
+ _toggleReportItem(id) {
640
+ this.expandedReportId = this.expandedReportId === id ? null : id;
641
+ }
642
+ _sortedItems() {
643
+ var _a, _b;
644
+ return ((_a = this.result) === null || _a === void 0 ? void 0 : _a.items_sorted) || ((_b = this.result) === null || _b === void 0 ? void 0 : _b.items) || [];
645
+ }
646
+ /* ─── [6단계] 검사 등록: 감리자 판정 자동 반영 + AI판단 근거 첨부 ─── */
647
+ async _registerInspection() {
648
+ var _a, _b;
649
+ const items = this._sortedItems();
650
+ if (!items.length) {
651
+ notify({ message: '판정 결과가 없습니다.', level: 'warn' });
652
+ return;
653
+ }
654
+ const judged = items.filter(it => it.supervisor_mark);
655
+ try {
656
+ this.loading = true;
657
+ this.loadingText = '검사 결과 등록 중...';
658
+ // 1) 감리자 적합/부적합 자동 채움 (적합/부적합 판정된 항목만, 없으면 건너뜀)
659
+ if (judged.length) {
660
+ const response = await client.mutate({
661
+ mutation: gql `
662
+ mutation UpdateChecklistItemsAiJudgment($items: [ChecklistItemAiJudgment!]!) {
663
+ updateChecklistItemsAiJudgment(items: $items)
664
+ }
665
+ `,
666
+ variables: {
667
+ items: judged.map(it => ({
668
+ id: it.item_id,
669
+ supervisoryConfirmStatus: it.supervisor_mark === '적합' ? 'T' : 'F'
670
+ }))
671
+ }
672
+ });
673
+ if (response.errors)
674
+ throw new Error(((_a = response.errors[0]) === null || _a === void 0 ? void 0 : _a.message) || '검사 등록에 실패했습니다.');
675
+ }
676
+ // 2) 항목별 첨부: 판단 근거(AI판단 텍스트) + 근거 사진 (판정 여부와 무관하게 전체 항목)
677
+ const attachments = [];
678
+ for (const it of items) {
679
+ if (it.ai_report) {
680
+ attachments.push({
681
+ file: new File([it.ai_report], `AI판단_${(it.text || it.item_id).slice(0, 30)}.txt`, { type: 'text/plain' }),
682
+ refBy: it.item_id,
683
+ refType: 'ChecklistItem',
684
+ description: 'AI판단'
685
+ });
686
+ }
687
+ for (const n of it.used_images || []) {
688
+ const photo = this.photos[n - 1];
689
+ if (photo) {
690
+ attachments.push({ file: photo.file, refBy: it.item_id, refType: 'ChecklistItem', description: 'AI판단' });
691
+ }
692
+ }
693
+ }
694
+ if (attachments.length) {
695
+ const attachResponse = await client.mutate({
696
+ mutation: gql `
697
+ mutation CreateAttachments($attachments: [NewAttachment!]!) {
698
+ createAttachments(attachments: $attachments) {
699
+ id
700
+ }
701
+ }
702
+ `,
703
+ variables: { attachments },
704
+ context: { hasUpload: true }
705
+ });
706
+ if (attachResponse.errors)
707
+ throw new Error(((_b = attachResponse.errors[0]) === null || _b === void 0 ? void 0 : _b.message) || 'AI판단 자료 첨부에 실패했습니다.');
708
+ }
709
+ notify({ message: `검사 결과를 등록하였습니다. (자동 판정 ${judged.length}건 반영)` });
710
+ // 등록 후 체크리스트 화면으로 이동
711
+ navigate(`building-inspection-detail-checklist/${this.buildingInspectionId}`);
712
+ }
713
+ catch (error) {
714
+ console.error('검사 등록 실패:', error);
715
+ notify({ message: error.message, level: 'error' });
716
+ }
717
+ finally {
718
+ this.loading = false;
719
+ }
720
+ }
721
+ };
722
+ BuildingInspectionAiMeasurement.styles = [
723
+ ScrollbarStyles,
724
+ css `
725
+ :host {
726
+ display: grid;
727
+ grid-template-rows: 75px 1fr;
728
+ color: #4e5055;
729
+ width: 100%;
730
+ height: 100%;
731
+ background-color: #f7f7f7;
732
+ }
733
+
734
+ * {
735
+ box-sizing: border-box;
736
+ }
737
+
738
+ div[body] {
739
+ display: flex;
740
+ flex-direction: column;
741
+ min-height: 0;
742
+ overflow-y: auto;
743
+ padding: var(--spacing-medium);
744
+ gap: 12px;
745
+ }
746
+
747
+ .page-title {
748
+ text-align: center;
749
+ font-size: 16px;
750
+ font-weight: 700;
751
+ color: #333;
752
+ }
753
+
754
+ .page-title span[target] {
755
+ color: #7d2f2f;
756
+ text-decoration: underline;
757
+ }
758
+
759
+ /* ─── 1단계: 촬영 가이드 ─── */
760
+ .guide-container {
761
+ max-width: 560px;
762
+ width: 100%;
763
+ margin: 0 auto;
764
+ display: flex;
765
+ flex-direction: column;
766
+ gap: 14px;
767
+ }
768
+
769
+ .step-badge {
770
+ align-self: flex-start;
771
+ background: #f7e9e9;
772
+ color: #7d2f2f;
773
+ font-size: 12px;
774
+ font-weight: 700;
775
+ padding: 4px 10px;
776
+ border-radius: 12px;
777
+ }
778
+
779
+ .guide-title {
780
+ font-size: 26px;
781
+ font-weight: 800;
782
+ color: #222;
783
+ line-height: 1.3;
784
+ white-space: pre-line;
785
+ }
786
+
787
+ .guide-desc {
788
+ font-size: 13px;
789
+ color: #777;
790
+ }
791
+
792
+ .card {
793
+ background: #fff;
794
+ border: 1px solid #e5e5e5;
795
+ border-radius: 10px;
796
+ padding: 16px;
797
+ }
798
+
799
+ .card h4 {
800
+ margin: 0 0 10px 0;
801
+ font-size: 14px;
802
+ color: #333;
803
+ }
804
+
805
+ .card ul {
806
+ margin: 0;
807
+ padding-left: 4px;
808
+ list-style: none;
809
+ display: flex;
810
+ flex-direction: column;
811
+ gap: 8px;
812
+ }
813
+
814
+ .card ul li {
815
+ font-size: 13px;
816
+ color: #555;
817
+ display: flex;
818
+ gap: 8px;
819
+ }
820
+
821
+ .card ul li::before {
822
+ content: '';
823
+ flex-shrink: 0;
824
+ width: 6px;
825
+ height: 6px;
826
+ border-radius: 50%;
827
+ background: #7d2f2f;
828
+ margin-top: 6px;
829
+ }
830
+
831
+ .progress-row {
832
+ display: flex;
833
+ justify-content: space-between;
834
+ align-items: center;
835
+ font-size: 13px;
836
+ color: #555;
837
+ font-weight: 600;
838
+ }
839
+
840
+ .progress-bar {
841
+ height: 6px;
842
+ border-radius: 3px;
843
+ background: #eee;
844
+ overflow: hidden;
845
+ }
846
+
847
+ .progress-bar div {
848
+ height: 100%;
849
+ background: #7d2f2f;
850
+ transition: width 0.3s;
851
+ }
852
+
853
+ .next-shot {
854
+ font-size: 13px;
855
+ font-weight: 700;
856
+ color: #333;
857
+ }
858
+
859
+ .slot-grid {
860
+ display: flex;
861
+ gap: 8px;
862
+ }
863
+
864
+ .slot {
865
+ flex: 1;
866
+ aspect-ratio: 1;
867
+ border: 1px dashed #ccc;
868
+ border-radius: 8px;
869
+ background: #fafafa;
870
+ display: flex;
871
+ flex-direction: column;
872
+ justify-content: center;
873
+ align-items: center;
874
+ gap: 4px;
875
+ font-size: 12px;
876
+ color: #999;
877
+ text-align: center;
878
+ padding: 4px;
879
+ overflow: hidden;
880
+ cursor: pointer;
881
+ }
882
+
883
+ .slot md-icon {
884
+ --md-icon-size: 28px;
885
+ color: #b5b5b5;
886
+ }
887
+
888
+ .slot img {
889
+ width: 100%;
890
+ height: 100%;
891
+ object-fit: cover;
892
+ border-radius: 6px;
893
+ }
894
+
895
+ .primary-button {
896
+ width: 100%;
897
+ border: none;
898
+ border-radius: 8px;
899
+ background: #7d2f2f;
900
+ color: #fff;
901
+ font-size: 16px;
902
+ font-weight: 700;
903
+ padding: 14px;
904
+ cursor: pointer;
905
+ }
906
+
907
+ .primary-button:disabled {
908
+ background: #ccc;
909
+ cursor: default;
910
+ }
911
+
912
+ .text-button {
913
+ border: 1px solid #ddd;
914
+ border-radius: 8px;
915
+ background: #fff;
916
+ color: #555;
917
+ font-size: 13px;
918
+ padding: 8px 14px;
919
+ cursor: pointer;
920
+ }
921
+
922
+ input[type='file'] {
923
+ display: none;
924
+ }
925
+
926
+ /* ─── 2단계: 판정 결과 ─── */
927
+ .result-body {
928
+ display: flex;
929
+ gap: 14px;
930
+ align-items: flex-start;
931
+ min-height: 0;
932
+ }
933
+
934
+ .photo-pane {
935
+ flex: 1.1;
936
+ min-width: 0;
937
+ display: flex;
938
+ flex-direction: column;
939
+ gap: 8px;
940
+ }
941
+
942
+ .photo-pane .caption {
943
+ text-align: center;
944
+ font-size: 12px;
945
+ color: #999;
946
+ }
947
+
948
+ .photo-main {
949
+ border-radius: 10px;
950
+ overflow: hidden;
951
+ background: #000;
952
+ display: flex;
953
+ justify-content: center;
954
+ max-height: 480px;
955
+ }
956
+
957
+ .photo-main img {
958
+ max-width: 100%;
959
+ max-height: 480px;
960
+ object-fit: contain;
961
+ }
962
+
963
+ .photo-thumbs {
964
+ display: flex;
965
+ gap: 8px;
966
+ overflow-x: auto;
967
+ padding-bottom: 4px;
968
+ }
969
+
970
+ .photo-thumbs img {
971
+ width: 96px;
972
+ height: 72px;
973
+ object-fit: cover;
974
+ border-radius: 6px;
975
+ cursor: pointer;
976
+ border: 2px solid transparent;
977
+ }
978
+
979
+ .photo-thumbs img[selected] {
980
+ border-color: #7d2f2f;
981
+ }
982
+
983
+ .items-pane {
984
+ flex: 1.4;
985
+ min-width: 0;
986
+ display: flex;
987
+ flex-direction: column;
988
+ gap: 10px;
989
+ }
990
+
991
+ .summary-banner {
992
+ background: #f7e9e9;
993
+ border: 1px solid #eedada;
994
+ color: #7d2f2f;
995
+ font-size: 13px;
996
+ font-weight: 700;
997
+ border-radius: 8px;
998
+ padding: 10px 14px;
999
+ }
1000
+
1001
+ .group-title {
1002
+ font-size: 14px;
1003
+ font-weight: 700;
1004
+ color: #333;
1005
+ margin-top: 4px;
1006
+ }
1007
+
1008
+ .item-card {
1009
+ display: flex;
1010
+ gap: 10px;
1011
+ align-items: flex-start;
1012
+ background: #fff;
1013
+ border: 1px solid #e5e5e5;
1014
+ border-radius: 10px;
1015
+ padding: 12px;
1016
+ cursor: pointer;
1017
+ }
1018
+
1019
+ .item-card[selected] {
1020
+ border-color: #7d2f2f;
1021
+ box-shadow: 0 0 0 1px #7d2f2f inset;
1022
+ }
1023
+
1024
+ .item-no {
1025
+ flex-shrink: 0;
1026
+ width: 24px;
1027
+ height: 24px;
1028
+ border-radius: 50%;
1029
+ background: #7d2f2f;
1030
+ color: #fff;
1031
+ font-size: 12px;
1032
+ font-weight: 700;
1033
+ display: flex;
1034
+ justify-content: center;
1035
+ align-items: center;
1036
+ }
1037
+
1038
+ .item-main {
1039
+ flex: 1;
1040
+ min-width: 0;
1041
+ }
1042
+
1043
+ .item-name {
1044
+ font-size: 14px;
1045
+ font-weight: 700;
1046
+ color: #222;
1047
+ margin-bottom: 4px;
1048
+ }
1049
+
1050
+ .item-desc {
1051
+ font-size: 12px;
1052
+ color: #777;
1053
+ display: -webkit-box;
1054
+ -webkit-line-clamp: 2;
1055
+ -webkit-box-orient: vertical;
1056
+ overflow: hidden;
1057
+ }
1058
+
1059
+ .chip {
1060
+ display: inline-block;
1061
+ font-size: 11px;
1062
+ font-weight: 700;
1063
+ border-radius: 4px;
1064
+ padding: 2px 6px;
1065
+ margin-right: 6px;
1066
+ background: #eef2f7;
1067
+ color: #3f71a0;
1068
+ }
1069
+
1070
+ .chip-verdict {
1071
+ font-size: 12px;
1072
+ font-weight: 700;
1073
+ color: #555;
1074
+ }
1075
+
1076
+ .badge {
1077
+ flex-shrink: 0;
1078
+ font-size: 12px;
1079
+ font-weight: 700;
1080
+ border-radius: 14px;
1081
+ padding: 5px 12px;
1082
+ white-space: nowrap;
1083
+ }
1084
+
1085
+ .badge[pass] {
1086
+ background: #e8f5e9;
1087
+ color: #2e7d32;
1088
+ }
1089
+
1090
+ .badge[fail] {
1091
+ background: #fdecea;
1092
+ color: #c62828;
1093
+ }
1094
+
1095
+ .badge[etc] {
1096
+ background: #fff8e1;
1097
+ color: #b7791f;
1098
+ }
1099
+
1100
+ .capture-button {
1101
+ flex-shrink: 0;
1102
+ border: none;
1103
+ border-radius: 14px;
1104
+ background: #fff3e0;
1105
+ color: #b7791f;
1106
+ font-size: 12px;
1107
+ font-weight: 700;
1108
+ padding: 6px 12px;
1109
+ cursor: pointer;
1110
+ }
1111
+
1112
+ /* ─── 우측 패널 (상세/재촬영/리포트) ─── */
1113
+ .side-pane {
1114
+ flex: 1;
1115
+ min-width: 280px;
1116
+ max-width: 360px;
1117
+ background: #fff;
1118
+ border: 1px solid #e5e5e5;
1119
+ border-radius: 10px;
1120
+ padding: 16px;
1121
+ display: flex;
1122
+ flex-direction: column;
1123
+ gap: 12px;
1124
+ }
1125
+
1126
+ .side-pane h3 {
1127
+ margin: 0;
1128
+ font-size: 16px;
1129
+ color: #222;
1130
+ }
1131
+
1132
+ .detail-header {
1133
+ display: flex;
1134
+ align-items: center;
1135
+ gap: 8px;
1136
+ }
1137
+
1138
+ .detail-header h3 {
1139
+ font-size: 18px;
1140
+ }
1141
+
1142
+ .detail-summary {
1143
+ font-size: 12px;
1144
+ color: #555;
1145
+ line-height: 1.7;
1146
+ white-space: pre-line;
1147
+ border-bottom: 1px solid #f0f0f0;
1148
+ padding-bottom: 10px;
1149
+ }
1150
+
1151
+ .kv-grid {
1152
+ display: grid;
1153
+ grid-template-columns: 1fr 1fr;
1154
+ gap: 10px;
1155
+ }
1156
+
1157
+ .kv {
1158
+ display: flex;
1159
+ flex-direction: column;
1160
+ gap: 2px;
1161
+ border: 1px solid #eee;
1162
+ border-radius: 8px;
1163
+ padding: 10px 12px;
1164
+ background: #fff;
1165
+ }
1166
+
1167
+ .kv label {
1168
+ font-size: 11px;
1169
+ color: #999;
1170
+ }
1171
+
1172
+ .kv span {
1173
+ font-size: 15px;
1174
+ font-weight: 700;
1175
+ color: #333;
1176
+ }
1177
+
1178
+ .kv .verdict-value[pass] {
1179
+ color: #2e7d32;
1180
+ }
1181
+
1182
+ .kv .verdict-value[fail] {
1183
+ color: #c62828;
1184
+ }
1185
+
1186
+ .reason-box {
1187
+ display: flex;
1188
+ flex-direction: column;
1189
+ gap: 10px;
1190
+ font-size: 12px;
1191
+ line-height: 1.7;
1192
+ }
1193
+
1194
+ .reason-verdict {
1195
+ border-left: 3px solid #7d2f2f;
1196
+ background: #fdf6f6;
1197
+ color: #333;
1198
+ padding: 8px 10px;
1199
+ }
1200
+
1201
+ .why-box {
1202
+ background: #fff8e1;
1203
+ border: 1px solid #f4e4b5;
1204
+ border-radius: 8px;
1205
+ padding: 10px;
1206
+ font-size: 12px;
1207
+ color: #7a5c14;
1208
+ line-height: 1.6;
1209
+ }
1210
+
1211
+ .report-counts {
1212
+ display: flex;
1213
+ text-align: center;
1214
+ border: 1px solid #eee;
1215
+ border-radius: 8px;
1216
+ overflow: hidden;
1217
+ }
1218
+
1219
+ .report-counts div {
1220
+ flex: 1;
1221
+ padding: 10px 0;
1222
+ }
1223
+
1224
+ .report-counts b {
1225
+ display: block;
1226
+ font-size: 20px;
1227
+ }
1228
+
1229
+ .report-counts small {
1230
+ font-size: 11px;
1231
+ color: #888;
1232
+ }
1233
+
1234
+ .report-counts div[pass] b {
1235
+ color: #2e7d32;
1236
+ }
1237
+
1238
+ .report-counts div[fail] b {
1239
+ color: #c62828;
1240
+ }
1241
+
1242
+ .report-counts div[etc] b {
1243
+ color: #b7791f;
1244
+ }
1245
+
1246
+ .report-item {
1247
+ border-bottom: 1px solid #f0f0f0;
1248
+ font-size: 13px;
1249
+ color: #333;
1250
+ }
1251
+
1252
+ .report-head {
1253
+ display: flex;
1254
+ align-items: center;
1255
+ gap: 6px;
1256
+ padding: 10px 0;
1257
+ cursor: pointer;
1258
+ }
1259
+
1260
+ .report-head .report-text {
1261
+ flex: 1;
1262
+ min-width: 0;
1263
+ }
1264
+
1265
+ .report-caret {
1266
+ --md-icon-size: 20px;
1267
+ color: #999;
1268
+ transition: transform 0.2s;
1269
+ }
1270
+
1271
+ .report-caret[open] {
1272
+ transform: rotate(180deg);
1273
+ }
1274
+
1275
+ .report-basis {
1276
+ display: flex;
1277
+ flex-direction: column;
1278
+ gap: 6px;
1279
+ font-size: 12px;
1280
+ color: #555;
1281
+ background: #f7f7f7;
1282
+ border-radius: 6px;
1283
+ padding: 10px;
1284
+ margin: 0 0 10px 0;
1285
+ }
1286
+
1287
+ .report-basis .report-ai {
1288
+ white-space: pre-line;
1289
+ color: #333;
1290
+ }
1291
+
1292
+ .report-basis .report-used {
1293
+ color: #888;
1294
+ }
1295
+
1296
+ .report-item .verdict {
1297
+ font-weight: 700;
1298
+ flex-shrink: 0;
1299
+ }
1300
+
1301
+ .report-item .verdict[pass] {
1302
+ color: #2e7d32;
1303
+ }
1304
+
1305
+ .report-item .verdict[fail] {
1306
+ color: #c62828;
1307
+ }
1308
+
1309
+ .report-item .verdict[etc] {
1310
+ color: #b7791f;
1311
+ }
1312
+
1313
+ /* ─── 로딩 오버레이 ─── */
1314
+ .loading-overlay {
1315
+ position: fixed;
1316
+ inset: 0;
1317
+ background: rgba(0, 0, 0, 0.5);
1318
+ display: flex;
1319
+ justify-content: center;
1320
+ align-items: center;
1321
+ z-index: 2000;
1322
+ }
1323
+
1324
+ .loading-overlay .box {
1325
+ background: #fff;
1326
+ padding: 32px 48px;
1327
+ border-radius: 12px;
1328
+ display: flex;
1329
+ flex-direction: column;
1330
+ align-items: center;
1331
+ gap: 12px;
1332
+ font-size: 14px;
1333
+ color: #555;
1334
+ }
1335
+
1336
+ .empty-state {
1337
+ text-align: center;
1338
+ color: #999;
1339
+ font-size: 14px;
1340
+ padding: 60px 0;
1341
+ }
1342
+ `
1343
+ ];
1344
+ __decorate([
1345
+ state(),
1346
+ __metadata("design:type", Object)
1347
+ ], BuildingInspectionAiMeasurement.prototype, "project", void 0);
1348
+ __decorate([
1349
+ state(),
1350
+ __metadata("design:type", Object)
1351
+ ], BuildingInspectionAiMeasurement.prototype, "buildingInspection", void 0);
1352
+ __decorate([
1353
+ state(),
1354
+ __metadata("design:type", String)
1355
+ ], BuildingInspectionAiMeasurement.prototype, "buildingInspectionId", void 0);
1356
+ __decorate([
1357
+ state(),
1358
+ __metadata("design:type", Object)
1359
+ ], BuildingInspectionAiMeasurement.prototype, "guide", void 0);
1360
+ __decorate([
1361
+ state(),
1362
+ __metadata("design:type", Array)
1363
+ ], BuildingInspectionAiMeasurement.prototype, "photos", void 0);
1364
+ __decorate([
1365
+ state(),
1366
+ __metadata("design:type", Object)
1367
+ ], BuildingInspectionAiMeasurement.prototype, "result", void 0);
1368
+ __decorate([
1369
+ state(),
1370
+ __metadata("design:type", Number)
1371
+ ], BuildingInspectionAiMeasurement.prototype, "mainPhotoIndex", void 0);
1372
+ __decorate([
1373
+ state(),
1374
+ __metadata("design:type", String)
1375
+ ], BuildingInspectionAiMeasurement.prototype, "panel", void 0);
1376
+ __decorate([
1377
+ state(),
1378
+ __metadata("design:type", Object)
1379
+ ], BuildingInspectionAiMeasurement.prototype, "selectedItem", void 0);
1380
+ __decorate([
1381
+ state(),
1382
+ __metadata("design:type", Number)
1383
+ ], BuildingInspectionAiMeasurement.prototype, "recaptureBase", void 0);
1384
+ __decorate([
1385
+ state(),
1386
+ __metadata("design:type", Object)
1387
+ ], BuildingInspectionAiMeasurement.prototype, "expandedReportId", void 0);
1388
+ __decorate([
1389
+ state(),
1390
+ __metadata("design:type", Boolean)
1391
+ ], BuildingInspectionAiMeasurement.prototype, "loading", void 0);
1392
+ __decorate([
1393
+ state(),
1394
+ __metadata("design:type", String)
1395
+ ], BuildingInspectionAiMeasurement.prototype, "loadingText", void 0);
1396
+ __decorate([
1397
+ query('#photoInput'),
1398
+ __metadata("design:type", HTMLInputElement
1399
+ /* 슬롯 클릭으로 선택기를 연 경우 대상 슬롯 인덱스 (null이면 뒤에 추가) */
1400
+ )
1401
+ ], BuildingInspectionAiMeasurement.prototype, "photoInputEl", void 0);
1402
+ BuildingInspectionAiMeasurement = __decorate([
1403
+ customElement('building-inspection-detail-ai-measurement')
1404
+ ], BuildingInspectionAiMeasurement);
1405
+ export { BuildingInspectionAiMeasurement };
1406
+ //# sourceMappingURL=building-inspection-detail-ai-measurement.js.map