@dssp/supervision 1.0.13 → 1.0.15

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.
@@ -1,7 +1,6 @@
1
1
  import '@material/web/icon/icon.js';
2
2
  import '@operato/image-marker/ox-image-marker.js';
3
3
  import '@operato/image-marker/ox-image-marker-view.js';
4
- import { PropertyValues } from 'lit';
5
4
  import { PageView } from '@operato/shell';
6
5
  import { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view';
7
6
  import { Shape } from '@operato/image-marker';
@@ -38,7 +37,14 @@ export declare class BuildingInspectionDetailDrawing extends BuildingInspectionD
38
37
  render(): import("lit-html").TemplateResult<1>;
39
38
  /** 번들이 없는 검측(기존 데이터·DSSP 경로)은 예전 방식 그대로 그린다 */
40
39
  private renderLegacyDrawing;
41
- protected updated(changes: PropertyValues): Promise<void>;
40
+ /**
41
+ * 검측·프로젝트가 모두 로드된 뒤에 도면을 준비한다.
42
+ *
43
+ * 예전엔 updated(buildingInspection) 에서 했는데, 그 시점엔 project 조회가 아직 안 끝나
44
+ * 번들 조건(projectId)을 못 맞추고 매번 구버전 경로로 떨어졌다. 새로고침하면 이미지가
45
+ * 안 뜨던 원인이라 호출 시점을 명시적으로 옮겼다.
46
+ */
47
+ private initDrawing;
42
48
  pageUpdated(changes: any, lifecycle: PageLifecycle): Promise<void>;
43
49
  initBuildingInspection(buildingInspectionId?: string): Promise<void>;
44
50
  private _getProjectByBuildingComplexId;
@@ -150,31 +150,28 @@ let BuildingInspectionDetailDrawing = class BuildingInspectionDetailDrawing exte
150
150
  </div>
151
151
  `;
152
152
  }
153
- async updated(changes) {
153
+ /**
154
+ * 검측·프로젝트가 모두 로드된 뒤에 도면을 준비한다.
155
+ *
156
+ * 예전엔 updated(buildingInspection) 에서 했는데, 그 시점엔 project 조회가 아직 안 끝나
157
+ * 번들 조건(projectId)을 못 맞추고 매번 구버전 경로로 떨어졌다. 새로고침하면 이미지가
158
+ * 안 뜨던 원인이라 호출 시점을 명시적으로 옮겼다.
159
+ */
160
+ async initDrawing() {
154
161
  var _a, _b, _c;
155
- if (changes.has('buildingInspection') && ((_a = this.buildingInspection) === null || _a === void 0 ? void 0 : _a.checklist)) {
156
- // 도면 번들이 있으면 하이퍼링크 뷰어로 그린다. 없으면 아래 기존 방식으로 떨어진다.
157
- if (await this.initBundle())
158
- return;
159
- // 1-1. 위치 정보 - 체크리스트에 들어가는 위치정보 텍스트
160
- const location_1 = (_b = this.buildingInspection.checklist) === null || _b === void 0 ? void 0 : _b.location;
161
- // 1-2. 위치 정보 - 실제 위치정보 텍스트 (동 + 층) - ID 필드를 사용하면 DB ID 필드입니다.
162
- const location_building = this.buildingInspection.buildingLevel.building.name;
163
- const location_floor = this.buildingInspection.buildingLevel.floor;
164
- // 2. 평면도 pdf 파일
165
- // mainDrawing {
166
- // id
167
- // name
168
- // fullpath
169
- // }
170
- const mainDrawing = this.buildingInspection.buildingLevel.mainDrawing;
171
- // 3. 선택 도면
172
- const inspectionDrawingType = this.buildingInspection.checklist.inspectionDrawingType;
173
- const shapes = JSON.parse(((_c = this.buildingInspection) === null || _c === void 0 ? void 0 : _c.drawingMarker) || null) || [];
174
- const markers = await this.drawingImageProvider.getMarkers(inspectionDrawingType);
175
- this.imageUrl = String(inspectionDrawingType).normalize('NFC');
176
- this.shapes = [...shapes, ...markers];
177
- }
162
+ if (!((_a = this.buildingInspection) === null || _a === void 0 ? void 0 : _a.checklist))
163
+ return;
164
+ // 도면 번들이 있으면 하이퍼링크 뷰어로 그린다. 없으면 아래 기존 방식으로 떨어진다.
165
+ if (await this.initBundle())
166
+ return;
167
+ const inspectionDrawingType = this.buildingInspection.checklist.inspectionDrawingType;
168
+ // drawingMarker 는 구버전이 Shape 배열, 신버전이 { root, markers: { 도면id: Shape[] } } 다.
169
+ // 번들 없이 이 경로로 떨어지는 검측에도 신버전 값이 들어 있을 수 있어 둘 다 받아야 한다.
170
+ const stored = JSON.parse(((_b = this.buildingInspection) === null || _b === void 0 ? void 0 : _b.drawingMarker) || null);
171
+ const shapes = Array.isArray(stored) ? stored : ((_c = stored === null || stored === void 0 ? void 0 : stored.markers) === null || _c === void 0 ? void 0 : _c[stored === null || stored === void 0 ? void 0 : stored.root]) || [];
172
+ const markers = await this.drawingImageProvider.getMarkers(inspectionDrawingType);
173
+ this.imageUrl = String(inspectionDrawingType).normalize('NFC');
174
+ this.shapes = [...shapes, ...markers];
178
175
  }
179
176
  async pageUpdated(changes, lifecycle) {
180
177
  var _a, _b;
@@ -229,6 +226,7 @@ let BuildingInspectionDetailDrawing = class BuildingInspectionDetailDrawing exte
229
226
  return;
230
227
  this.buildingInspection = response.data.buildingInspection;
231
228
  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);
229
+ await this.initDrawing();
232
230
  }
233
231
  async _getProjectByBuildingComplexId(buildingComplexId) {
234
232
  const response = await client.query({
@@ -294,6 +292,8 @@ let BuildingInspectionDetailDrawing = class BuildingInspectionDetailDrawing exte
294
292
  */
295
293
  async onBundleMarkersSave(e) {
296
294
  const { root, markers } = e.detail;
295
+ // 뷰어가 올려준 값을 부모도 같이 들고 있어야, 이후 렌더에서 낡은 값이 되밀리지 않는다
296
+ this.bundleMarkers = markers;
297
297
  const response = await client.query({
298
298
  query: gql `
299
299
  mutation UpdateBuildingInspection($patch: UpdateBuildingInspection!) {
@@ -1 +1 @@
1
- {"version":3,"file":"building-inspection-detail-drawing.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-drawing.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/image-marker/ox-image-marker.js'\nimport '@operato/image-marker/ox-image-marker-view.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { consume } from '@lit/context'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\n\nimport { PageView } from '@operato/shell'\nimport { CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport { Shape } from '@operato/image-marker'\n\nimport { DrawingImageProvider } from '@dssp/drawing/dist-client/drawing-management/drawing-image-provider.js'\nimport '@dssp/drawing/dist-client/drawing-bundle/drawing-bundle-viewer.js'\nimport { DrawingBundleModel } from '@dssp/drawing/dist-client/drawing-bundle/drawing-bundle-model.js'\nimport { loadDrawingBundle } from '@dssp/drawing/dist-client/drawing-bundle/drawing-bundle-loader.js'\n\nimport './component/building-inspection-detail-header'\nimport { BuildingInspectionStatus } from './building-inspection-list'\n\n@customElement('building-inspection-detail-drawing')\nexport class BuildingInspectionDetailDrawing extends ScopedElementsMixin(PageView) {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 55px auto;\n color: #4e5055;\n\n width: 100%;\n background-color: var(--md-sys-color-background, #f6f6f6);\n overflow-y: auto;\n\n --grid-record-emphasized-background-color: red;\n --grid-record-emphasized-color: yellow;\n }\n\n div[body][bundle] {\n display: block;\n height: calc(100vh - 120px);\n padding: 0 var(--spacing-large, 12px) var(--spacing-large, 12px);\n }\n\n drawing-bundle-viewer {\n width: 100%;\n height: 100%;\n }\n\n div[body] {\n display: flex;\n justify-content: center;\n\n ox-image-marker-view {\n width: 100%;\n }\n }\n\n dialog ox-image-marker-view {\n width: 80vw;\n height: 80vh;\n }\n `\n ]\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n @state() buildingInspectionId: string = ''\n @state() imageUrl?: string\n @state() shapes: Shape[] = []\n @state() linkUrl?: string\n @state() linkShapes: Shape[] = []\n\n @state() drawingImageProvider: DrawingImageProvider = new DrawingImageProvider()\n\n /** 도면 번들 (있으면 하이퍼링크 뷰어로, 없으면 기존 외부 도면 방식으로 그린다) */\n @state() bundleModel?: DrawingBundleModel\n /** 번들 뷰어가 열 첫 도면 — 검측에 할당된 패키지 루트 */\n @state() bundleRootId: string = ''\n /** 도면별 사용자 그림 — { [도면 id]: Shape[] } */\n @state() bundleMarkers: { [drawingId: string]: Shape[] } = {}\n // @consume({ context: OxUserPreferencesContext, subscribe: true })\n\n @query('#image-marker') imageMarker!: any\n @query('#link-viewer') linkViewer!: any\n @query('dialog') dialog!: HTMLDialogElement\n\n get context() {\n return {\n title: '검측 관리 상세 - 검측 도면'\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n requestAnimationFrame(() => {\n this.dialog.addEventListener('click', event => {\n const rect = this.dialog.getBoundingClientRect()\n const isInDialog =\n rect.top <= event.clientY && event.clientY <= rect.bottom && rect.left <= event.clientX && event.clientX <= rect.right\n\n // 다이아로그 내부를 클릭한 것이 아니면 다이아로그 닫기\n if (!isInDialog) {\n this.dialog.close()\n }\n })\n })\n }\n\n render() {\n return html`\n <building-inspection-detail-header\n .buildingInspectionId=${this.buildingInspection?.id}\n .buildingLevelId=${this.buildingInspection?.buildingLevel?.id}\n .projectName=${this.project.name}\n .buildingName=${this.buildingInspection?.buildingLevel?.building?.name}\n .buildingLevelFloor=${this.buildingInspection?.buildingLevel?.floor}\n .projectId=${this.project.id}\n ></building-inspection-detail-header>\n\n ${this.bundleModel\n ? html`\n <div body bundle>\n <drawing-bundle-viewer\n .model=${this.bundleModel}\n .rootId=${this.bundleRootId}\n .markers=${this.bundleMarkers}\n ?readonly=${this.buildingInspection?.status == BuildingInspectionStatus.PASS}\n @markers-changed=${this.onBundleMarkersSave}\n @switch-unavailable=${(e: CustomEvent) => notify({ message: e.detail.message, level: 'warn' })}\n ></drawing-bundle-viewer>\n </div>\n `\n : this.renderLegacyDrawing()}\n\n <dialog>\n <ox-image-marker-view\n id=\"link-viewer\"\n .imageUrl=${this.linkUrl}\n .shapes=${this.linkShapes}\n .imageProvider=${this.drawingImageProvider}\n ></ox-image-marker-view>\n </dialog>\n `\n }\n\n /** 번들이 없는 검측(기존 데이터·DSSP 경로)은 예전 방식 그대로 그린다 */\n private renderLegacyDrawing() {\n return html`\n <div\n body\n @link-clicked=${async (e: CustomEvent) => {\n const { link } = e.detail\n const { id, type, symbol, box, dwgId } = JSON.parse(link) || {}\n\n // 좌표 파싱 및 유효성 검증\n const coordinates = this.parseBoxCoordinates(box, {\n id,\n type,\n symbol,\n dwgId,\n currentPdfId: this.linkUrl || 'unknown',\n buildingInspectionId: this.buildingInspectionId\n })\n\n this.linkUrl = `DWGID:${dwgId}`\n\n // 유효한 좌표가 있으면 마커 표시, 없으면 빈 배열\n if (coordinates) {\n this.linkShapes = [\n {\n id: id || 'unknown',\n type: 'link' as const,\n ...coordinates,\n link: JSON.stringify({ id, type, symbol, dwgId })\n }\n ]\n } else {\n // 좌표가 유효하지 않아도 팝업은 열고 마커만 숨김\n this.linkShapes = []\n console.warn('Invalid link coordinates, popup will open without marker:', {\n box,\n id,\n type,\n symbol,\n dwgId,\n currentPdfId: this.linkUrl || 'unknown',\n buildingInspectionId: this.buildingInspectionId,\n fullLink: link\n })\n }\n\n if (this.dialog) {\n this.dialog.showModal()\n\n requestAnimationFrame(() => {\n this.linkViewer.reset()\n })\n }\n }}\n >\n ${this.buildingInspection?.status == BuildingInspectionStatus.PASS\n ? html`<ox-image-marker-view\n id=\"image-marker\"\n .imageUrl=${this.imageUrl}\n .shapes=${this.shapes}\n .imageProvider=${this.drawingImageProvider}\n ></ox-image-marker-view>`\n : html` <ox-image-marker\n id=\"image-marker\"\n .imageUrl=${this.imageUrl}\n .shapes=${this.shapes}\n .imageProvider=${this.drawingImageProvider}\n @shapes-changed=${this.onClickMarkerSave}\n .currentMode=${'view'}\n ></ox-image-marker>`}\n </div>\n `\n }\n\n protected async updated(changes: PropertyValues): Promise<void> {\n if (changes.has('buildingInspection') && this.buildingInspection?.checklist) {\n // 도면 번들이 있으면 하이퍼링크 뷰어로 그린다. 없으면 아래 기존 방식으로 떨어진다.\n if (await this.initBundle()) return\n\n // 1-1. 위치 정보 - 체크리스트에 들어가는 위치정보 텍스트\n const location_1 = this.buildingInspection.checklist?.location\n\n // 1-2. 위치 정보 - 실제 위치정보 텍스트 (동 + 층) - ID 필드를 사용하면 DB ID 필드입니다.\n const location_building = this.buildingInspection.buildingLevel.building.name\n const location_floor = this.buildingInspection.buildingLevel.floor\n\n // 2. 평면도 pdf 파일\n // mainDrawing {\n // id\n // name\n // fullpath\n // }\n const mainDrawing = this.buildingInspection.buildingLevel.mainDrawing\n\n // 3. 선택 도면\n const inspectionDrawingType = this.buildingInspection.checklist.inspectionDrawingType\n\n const shapes = JSON.parse(this.buildingInspection?.drawingMarker || null) || []\n const markers = await this.drawingImageProvider.getMarkers(inspectionDrawingType)\n\n this.imageUrl = String(inspectionDrawingType).normalize('NFC')\n this.shapes = [...shapes, ...markers]\n }\n }\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this.buildingInspectionId = lifecycle.resourceId || ''\n await this.initBuildingInspection(this.buildingInspectionId)\n\n this.imageMarker?.reset()\n } else {\n this.dialog?.close()\n }\n }\n\n async initBuildingInspection(buildingInspectionId: string = '') {\n const response = await client.query({\n query: gql`\n query BuildingInspection($buildingInspectionId: String!) {\n buildingInspection(id: $buildingInspectionId) {\n id\n status\n requestDate\n drawingMarker\n checklist {\n location\n inspectionDrawingType\n }\n buildingLevel {\n id\n floor\n mainDrawing {\n id\n name\n fullpath\n }\n mainDrawingImage\n building {\n id\n name\n buildingComplex {\n id\n }\n }\n }\n }\n }\n `,\n variables: {\n buildingInspectionId\n }\n })\n\n if (response.errors) return\n\n this.buildingInspection = response.data.buildingInspection\n\n await this._getProjectByBuildingComplexId(this.buildingInspection?.buildingLevel?.building?.buildingComplex?.id)\n }\n\n private async _getProjectByBuildingComplexId(buildingComplexId) {\n const response = await client.query({\n query: gql`\n query ProjectByBuildingComplexId($buildingComplexId: String!) {\n project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {\n id\n name\n }\n }\n `,\n variables: {\n buildingComplexId\n }\n })\n\n if (response.errors) return\n\n this.project = response.data.project\n }\n\n /**\n * 검측에 할당된 도면 패키지를 찾아 번들 뷰어를 준비한다.\n *\n * checklist.inspectionDrawingType 에는 패키지 루트 도면 id 가 들어 있다.\n * 예전 데이터는 검측 도면 '이름' 이 들어 있으므로, 그 경우엔 동·층으로 패키지를 찾아본다.\n * 둘 다 실패하면 false 를 돌려 기존 방식으로 그리게 한다.\n */\n private async initBundle(): Promise<boolean> {\n const projectId = this.project?.id\n if (!projectId) return false\n\n const model = await loadDrawingBundle(projectId, { withLinks: true })\n if (!model) return false\n\n const buildingLevel = this.buildingInspection?.buildingLevel\n const assigned = this.buildingInspection?.checklist?.inspectionDrawingType\n\n const rootId =\n (assigned && model.drawing(assigned) && assigned) ||\n model.packageOfLevel(buildingLevel?.building?.name, buildingLevel?.floor)?.root\n\n if (!rootId) return false\n\n this.bundleModel = model\n this.bundleRootId = rootId\n this.bundleMarkers = this.parseDrawingMarker(rootId)\n\n return true\n }\n\n /**\n * 저장된 도면 마커를 읽는다.\n * 예전 형식은 Shape 배열 하나였고, 지금은 { root, markers: { 도면 id: Shape[] } } 다.\n * 예전 값은 루트 도면의 그림으로 옮겨 읽는다.\n */\n private parseDrawingMarker(rootId: string): { [drawingId: string]: Shape[] } {\n const stored = JSON.parse(this.buildingInspection?.drawingMarker || null)\n\n if (!stored) return {}\n if (Array.isArray(stored)) return { [rootId]: stored }\n\n return stored.markers || {}\n }\n\n /**\n * 번들 뷰어의 저장.\n * 전체 패키지가 아니라 루트 한 장 + 그림이 그려진 하위 도면만 묶어 저장한다(하이퍼링크는 죽은 상태).\n */\n private async onBundleMarkersSave(e: CustomEvent) {\n const { root, markers } = e.detail\n\n const response = await client.query({\n query: gql`\n mutation UpdateBuildingInspection($patch: UpdateBuildingInspection!) {\n updateBuildingInspection(patch: $patch) {\n id\n drawingMarker\n }\n }\n `,\n variables: {\n patch: {\n id: this.buildingInspectionId,\n drawingMarker: JSON.stringify({ root, markers })\n }\n }\n })\n\n if (response.errors) return\n\n notify({ message: '저장되었습니다.' })\n }\n\n private async onClickMarkerSave(e) {\n const response = await client.query({\n query: gql`\n mutation UpdateBuildingInspection($patch: UpdateBuildingInspection!) {\n updateBuildingInspection(patch: $patch) {\n id\n drawingMarker\n }\n }\n `,\n variables: {\n patch: {\n id: this.buildingInspectionId,\n drawingMarker: JSON.stringify(e.detail)\n }\n }\n })\n\n if (response.errors) return\n\n notify({ message: '저장되었습니다.' })\n }\n\n private parseBoxCoordinates(\n box: string | undefined,\n context: {\n id?: string\n type?: string\n symbol?: string\n dwgId?: string\n currentPdfId?: string\n buildingInspectionId?: string\n } = {}\n ): {\n x: number\n y: number\n width: number\n height: number\n } | null {\n if (!box || typeof box !== 'string') {\n console.warn('Invalid box coordinate for link:', {\n box,\n context,\n reason: 'Box is undefined, null, or not a string'\n })\n return null\n }\n\n try {\n const coords = box.split(',').map(str => {\n const num = Number(str.trim())\n return Number.isFinite(num) ? num : NaN\n })\n\n if (coords.length !== 4 || coords.some(coord => isNaN(coord))) {\n console.warn('Box coordinate should have 4 valid numbers:', {\n box,\n parsedCoords: coords,\n context,\n reason: `Expected 4 numbers, got ${coords.length} values with NaN: ${coords.some(coord => isNaN(coord))}`\n })\n return null\n }\n\n const [x, y, width, height] = coords\n\n // width, height가 0 이하면 유효하지 않음\n if (width <= 0 || height <= 0) {\n console.warn('Invalid width or height for link:', {\n box,\n coords: { x, y, width, height },\n context,\n reason: `Width (${width}) or height (${height}) is <= 0`\n })\n return null\n }\n\n return { x, y, width, height }\n } catch (error) {\n console.warn('Error parsing box coordinates:', {\n box,\n context,\n error: error instanceof Error ? error.message : String(error),\n reason: 'Exception thrown during parsing'\n })\n return null\n }\n }\n}\n"]}
1
+ {"version":3,"file":"building-inspection-detail-drawing.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-drawing.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/image-marker/ox-image-marker.js'\nimport '@operato/image-marker/ox-image-marker-view.js'\n\nimport gql from 'graphql-tag'\nimport { css, html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { consume } from '@lit/context'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\n\nimport { PageView } from '@operato/shell'\nimport { CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport { Shape } from '@operato/image-marker'\n\nimport { DrawingImageProvider } from '@dssp/drawing/dist-client/drawing-management/drawing-image-provider.js'\nimport '@dssp/drawing/dist-client/drawing-bundle/drawing-bundle-viewer.js'\nimport { DrawingBundleModel } from '@dssp/drawing/dist-client/drawing-bundle/drawing-bundle-model.js'\nimport { loadDrawingBundle } from '@dssp/drawing/dist-client/drawing-bundle/drawing-bundle-loader.js'\n\nimport './component/building-inspection-detail-header'\nimport { BuildingInspectionStatus } from './building-inspection-list'\n\n@customElement('building-inspection-detail-drawing')\nexport class BuildingInspectionDetailDrawing extends ScopedElementsMixin(PageView) {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 55px auto;\n color: #4e5055;\n\n width: 100%;\n background-color: var(--md-sys-color-background, #f6f6f6);\n overflow-y: auto;\n\n --grid-record-emphasized-background-color: red;\n --grid-record-emphasized-color: yellow;\n }\n\n div[body][bundle] {\n display: block;\n height: calc(100vh - 120px);\n padding: 0 var(--spacing-large, 12px) var(--spacing-large, 12px);\n }\n\n drawing-bundle-viewer {\n width: 100%;\n height: 100%;\n }\n\n div[body] {\n display: flex;\n justify-content: center;\n\n ox-image-marker-view {\n width: 100%;\n }\n }\n\n dialog ox-image-marker-view {\n width: 80vw;\n height: 80vh;\n }\n `\n ]\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n @state() buildingInspectionId: string = ''\n @state() imageUrl?: string\n @state() shapes: Shape[] = []\n @state() linkUrl?: string\n @state() linkShapes: Shape[] = []\n\n @state() drawingImageProvider: DrawingImageProvider = new DrawingImageProvider()\n\n /** 도면 번들 (있으면 하이퍼링크 뷰어로, 없으면 기존 외부 도면 방식으로 그린다) */\n @state() bundleModel?: DrawingBundleModel\n /** 번들 뷰어가 열 첫 도면 — 검측에 할당된 패키지 루트 */\n @state() bundleRootId: string = ''\n /** 도면별 사용자 그림 — { [도면 id]: Shape[] } */\n @state() bundleMarkers: { [drawingId: string]: Shape[] } = {}\n // @consume({ context: OxUserPreferencesContext, subscribe: true })\n\n @query('#image-marker') imageMarker!: any\n @query('#link-viewer') linkViewer!: any\n @query('dialog') dialog!: HTMLDialogElement\n\n get context() {\n return {\n title: '검측 관리 상세 - 검측 도면'\n }\n }\n\n connectedCallback(): void {\n super.connectedCallback()\n\n requestAnimationFrame(() => {\n this.dialog.addEventListener('click', event => {\n const rect = this.dialog.getBoundingClientRect()\n const isInDialog =\n rect.top <= event.clientY && event.clientY <= rect.bottom && rect.left <= event.clientX && event.clientX <= rect.right\n\n // 다이아로그 내부를 클릭한 것이 아니면 다이아로그 닫기\n if (!isInDialog) {\n this.dialog.close()\n }\n })\n })\n }\n\n render() {\n return html`\n <building-inspection-detail-header\n .buildingInspectionId=${this.buildingInspection?.id}\n .buildingLevelId=${this.buildingInspection?.buildingLevel?.id}\n .projectName=${this.project.name}\n .buildingName=${this.buildingInspection?.buildingLevel?.building?.name}\n .buildingLevelFloor=${this.buildingInspection?.buildingLevel?.floor}\n .projectId=${this.project.id}\n ></building-inspection-detail-header>\n\n ${this.bundleModel\n ? html`\n <div body bundle>\n <drawing-bundle-viewer\n .model=${this.bundleModel}\n .rootId=${this.bundleRootId}\n .markers=${this.bundleMarkers}\n ?readonly=${this.buildingInspection?.status == BuildingInspectionStatus.PASS}\n @markers-changed=${this.onBundleMarkersSave}\n @switch-unavailable=${(e: CustomEvent) => notify({ message: e.detail.message, level: 'warn' })}\n ></drawing-bundle-viewer>\n </div>\n `\n : this.renderLegacyDrawing()}\n\n <dialog>\n <ox-image-marker-view\n id=\"link-viewer\"\n .imageUrl=${this.linkUrl}\n .shapes=${this.linkShapes}\n .imageProvider=${this.drawingImageProvider}\n ></ox-image-marker-view>\n </dialog>\n `\n }\n\n /** 번들이 없는 검측(기존 데이터·DSSP 경로)은 예전 방식 그대로 그린다 */\n private renderLegacyDrawing() {\n return html`\n <div\n body\n @link-clicked=${async (e: CustomEvent) => {\n const { link } = e.detail\n const { id, type, symbol, box, dwgId } = JSON.parse(link) || {}\n\n // 좌표 파싱 및 유효성 검증\n const coordinates = this.parseBoxCoordinates(box, {\n id,\n type,\n symbol,\n dwgId,\n currentPdfId: this.linkUrl || 'unknown',\n buildingInspectionId: this.buildingInspectionId\n })\n\n this.linkUrl = `DWGID:${dwgId}`\n\n // 유효한 좌표가 있으면 마커 표시, 없으면 빈 배열\n if (coordinates) {\n this.linkShapes = [\n {\n id: id || 'unknown',\n type: 'link' as const,\n ...coordinates,\n link: JSON.stringify({ id, type, symbol, dwgId })\n }\n ]\n } else {\n // 좌표가 유효하지 않아도 팝업은 열고 마커만 숨김\n this.linkShapes = []\n console.warn('Invalid link coordinates, popup will open without marker:', {\n box,\n id,\n type,\n symbol,\n dwgId,\n currentPdfId: this.linkUrl || 'unknown',\n buildingInspectionId: this.buildingInspectionId,\n fullLink: link\n })\n }\n\n if (this.dialog) {\n this.dialog.showModal()\n\n requestAnimationFrame(() => {\n this.linkViewer.reset()\n })\n }\n }}\n >\n ${this.buildingInspection?.status == BuildingInspectionStatus.PASS\n ? html`<ox-image-marker-view\n id=\"image-marker\"\n .imageUrl=${this.imageUrl}\n .shapes=${this.shapes}\n .imageProvider=${this.drawingImageProvider}\n ></ox-image-marker-view>`\n : html` <ox-image-marker\n id=\"image-marker\"\n .imageUrl=${this.imageUrl}\n .shapes=${this.shapes}\n .imageProvider=${this.drawingImageProvider}\n @shapes-changed=${this.onClickMarkerSave}\n .currentMode=${'view'}\n ></ox-image-marker>`}\n </div>\n `\n }\n\n /**\n * 검측·프로젝트가 모두 로드된 뒤에 도면을 준비한다.\n *\n * 예전엔 updated(buildingInspection) 에서 했는데, 그 시점엔 project 조회가 아직 안 끝나\n * 번들 조건(projectId)을 못 맞추고 매번 구버전 경로로 떨어졌다. 새로고침하면 이미지가\n * 안 뜨던 원인이라 호출 시점을 명시적으로 옮겼다.\n */\n private async initDrawing() {\n if (!this.buildingInspection?.checklist) return\n\n // 도면 번들이 있으면 하이퍼링크 뷰어로 그린다. 없으면 아래 기존 방식으로 떨어진다.\n if (await this.initBundle()) return\n\n const inspectionDrawingType = this.buildingInspection.checklist.inspectionDrawingType\n\n // drawingMarker 는 구버전이 Shape 배열, 신버전이 { root, markers: { 도면id: Shape[] } } 다.\n // 번들 없이 이 경로로 떨어지는 검측에도 신버전 값이 들어 있을 수 있어 둘 다 받아야 한다.\n const stored = JSON.parse(this.buildingInspection?.drawingMarker || null)\n const shapes: Shape[] = Array.isArray(stored) ? stored : stored?.markers?.[stored?.root] || []\n const markers = await this.drawingImageProvider.getMarkers(inspectionDrawingType)\n\n this.imageUrl = String(inspectionDrawingType).normalize('NFC')\n this.shapes = [...shapes, ...markers]\n }\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this.buildingInspectionId = lifecycle.resourceId || ''\n await this.initBuildingInspection(this.buildingInspectionId)\n\n this.imageMarker?.reset()\n } else {\n this.dialog?.close()\n }\n }\n\n async initBuildingInspection(buildingInspectionId: string = '') {\n const response = await client.query({\n query: gql`\n query BuildingInspection($buildingInspectionId: String!) {\n buildingInspection(id: $buildingInspectionId) {\n id\n status\n requestDate\n drawingMarker\n checklist {\n location\n inspectionDrawingType\n }\n buildingLevel {\n id\n floor\n mainDrawing {\n id\n name\n fullpath\n }\n mainDrawingImage\n building {\n id\n name\n buildingComplex {\n id\n }\n }\n }\n }\n }\n `,\n variables: {\n buildingInspectionId\n }\n })\n\n if (response.errors) return\n\n this.buildingInspection = response.data.buildingInspection\n\n await this._getProjectByBuildingComplexId(this.buildingInspection?.buildingLevel?.building?.buildingComplex?.id)\n\n await this.initDrawing()\n }\n\n private async _getProjectByBuildingComplexId(buildingComplexId) {\n const response = await client.query({\n query: gql`\n query ProjectByBuildingComplexId($buildingComplexId: String!) {\n project: projectByBuildingComplexId(buildingComplexId: $buildingComplexId) {\n id\n name\n }\n }\n `,\n variables: {\n buildingComplexId\n }\n })\n\n if (response.errors) return\n\n this.project = response.data.project\n }\n\n /**\n * 검측에 할당된 도면 패키지를 찾아 번들 뷰어를 준비한다.\n *\n * checklist.inspectionDrawingType 에는 패키지 루트 도면 id 가 들어 있다.\n * 예전 데이터는 검측 도면 '이름' 이 들어 있으므로, 그 경우엔 동·층으로 패키지를 찾아본다.\n * 둘 다 실패하면 false 를 돌려 기존 방식으로 그리게 한다.\n */\n private async initBundle(): Promise<boolean> {\n const projectId = this.project?.id\n if (!projectId) return false\n\n const model = await loadDrawingBundle(projectId, { withLinks: true })\n if (!model) return false\n\n const buildingLevel = this.buildingInspection?.buildingLevel\n const assigned = this.buildingInspection?.checklist?.inspectionDrawingType\n\n const rootId =\n (assigned && model.drawing(assigned) && assigned) ||\n model.packageOfLevel(buildingLevel?.building?.name, buildingLevel?.floor)?.root\n\n if (!rootId) return false\n\n this.bundleModel = model\n this.bundleRootId = rootId\n this.bundleMarkers = this.parseDrawingMarker(rootId)\n\n return true\n }\n\n /**\n * 저장된 도면 마커를 읽는다.\n * 예전 형식은 Shape 배열 하나였고, 지금은 { root, markers: { 도면 id: Shape[] } } 다.\n * 예전 값은 루트 도면의 그림으로 옮겨 읽는다.\n */\n private parseDrawingMarker(rootId: string): { [drawingId: string]: Shape[] } {\n const stored = JSON.parse(this.buildingInspection?.drawingMarker || null)\n\n if (!stored) return {}\n if (Array.isArray(stored)) return { [rootId]: stored }\n\n return stored.markers || {}\n }\n\n /**\n * 번들 뷰어의 저장.\n * 전체 패키지가 아니라 루트 한 장 + 그림이 그려진 하위 도면만 묶어 저장한다(하이퍼링크는 죽은 상태).\n */\n private async onBundleMarkersSave(e: CustomEvent) {\n const { root, markers } = e.detail\n\n // 뷰어가 올려준 값을 부모도 같이 들고 있어야, 이후 렌더에서 낡은 값이 되밀리지 않는다\n this.bundleMarkers = markers\n\n const response = await client.query({\n query: gql`\n mutation UpdateBuildingInspection($patch: UpdateBuildingInspection!) {\n updateBuildingInspection(patch: $patch) {\n id\n drawingMarker\n }\n }\n `,\n variables: {\n patch: {\n id: this.buildingInspectionId,\n drawingMarker: JSON.stringify({ root, markers })\n }\n }\n })\n\n if (response.errors) return\n\n notify({ message: '저장되었습니다.' })\n }\n\n private async onClickMarkerSave(e) {\n const response = await client.query({\n query: gql`\n mutation UpdateBuildingInspection($patch: UpdateBuildingInspection!) {\n updateBuildingInspection(patch: $patch) {\n id\n drawingMarker\n }\n }\n `,\n variables: {\n patch: {\n id: this.buildingInspectionId,\n drawingMarker: JSON.stringify(e.detail)\n }\n }\n })\n\n if (response.errors) return\n\n notify({ message: '저장되었습니다.' })\n }\n\n private parseBoxCoordinates(\n box: string | undefined,\n context: {\n id?: string\n type?: string\n symbol?: string\n dwgId?: string\n currentPdfId?: string\n buildingInspectionId?: string\n } = {}\n ): {\n x: number\n y: number\n width: number\n height: number\n } | null {\n if (!box || typeof box !== 'string') {\n console.warn('Invalid box coordinate for link:', {\n box,\n context,\n reason: 'Box is undefined, null, or not a string'\n })\n return null\n }\n\n try {\n const coords = box.split(',').map(str => {\n const num = Number(str.trim())\n return Number.isFinite(num) ? num : NaN\n })\n\n if (coords.length !== 4 || coords.some(coord => isNaN(coord))) {\n console.warn('Box coordinate should have 4 valid numbers:', {\n box,\n parsedCoords: coords,\n context,\n reason: `Expected 4 numbers, got ${coords.length} values with NaN: ${coords.some(coord => isNaN(coord))}`\n })\n return null\n }\n\n const [x, y, width, height] = coords\n\n // width, height가 0 이하면 유효하지 않음\n if (width <= 0 || height <= 0) {\n console.warn('Invalid width or height for link:', {\n box,\n coords: { x, y, width, height },\n context,\n reason: `Width (${width}) or height (${height}) is <= 0`\n })\n return null\n }\n\n return { x, y, width, height }\n } catch (error) {\n console.warn('Error parsing box coordinates:', {\n box,\n context,\n error: error instanceof Error ? error.message : String(error),\n reason: 'Exception thrown during parsing'\n })\n return null\n }\n }\n}\n"]}
@@ -49,7 +49,7 @@ export declare class BuildingInspectionGridDetail extends BuildingInspectionGrid
49
49
  _onClickCreateInspection(): void;
50
50
  _onClickUpdateInspection(initialTab?: number): void;
51
51
  refresh(buildingInspectionId?: string): Promise<void>;
52
- _getIconHtmlByStatus(status: string): "" | import("lit-html").TemplateResult<1>;
52
+ _getIconHtmlByStatus(status: string): import("lit-html").TemplateResult<1> | "";
53
53
  private _groupInspectionsByCell;
54
54
  private _openListLayer;
55
55
  private _closeListLayer;
@@ -1 +1 @@
1
- export default function route(page: string): "building-inspection-list" | "checklist-template-list" | "construction-checklist-template-list" | "building-inspection-detail-drawing" | "building-inspection-detail-checklist" | "building-inspection-grid-detail" | "building-inspection-management" | "project-checklist-management" | "checklist-database" | "checklist-type-management" | "building-inspection-detail-camera" | "building-inspection-detail-ai-measurement" | "building-inspection-detail-ai-defect" | undefined;
1
+ export default function route(page: string): "checklist-type-management" | "building-inspection-list" | "checklist-template-list" | "construction-checklist-template-list" | "building-inspection-detail-drawing" | "building-inspection-detail-checklist" | "building-inspection-detail-camera" | "building-inspection-detail-ai-measurement" | "building-inspection-detail-ai-defect" | "building-inspection-grid-detail" | "building-inspection-management" | "project-checklist-management" | "checklist-database" | undefined;