@dssp/supervision 1.0.0-alpha.47 → 1.0.0-alpha.49
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.
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.d.ts +57 -0
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js +800 -0
- package/dist-client/pages/building-inspection/building-inspection-detail-ai-measurement.js.map +1 -0
- package/dist-client/pages/building-inspection/building-inspection-detail-camera.d.ts +6 -33
- package/dist-client/pages/building-inspection/building-inspection-detail-camera.js +58 -427
- package/dist-client/pages/building-inspection/building-inspection-detail-camera.js.map +1 -1
- package/dist-client/pages/building-inspection/component/building-inspection-detail-header.d.ts +3 -0
- package/dist-client/pages/building-inspection/component/building-inspection-detail-header.js +77 -8
- package/dist-client/pages/building-inspection/component/building-inspection-detail-header.js.map +1 -1
- package/dist-client/pages/building-inspection/component/inspection-document/photo-album-popup.js +21 -6
- package/dist-client/pages/building-inspection/component/inspection-document/photo-album-popup.js.map +1 -1
- package/dist-client/route.d.ts +1 -1
- package/dist-client/route.js +3 -0
- package/dist-client/route.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/checklist/checklist-query.d.ts +1 -0
- package/dist-server/service/checklist/checklist-query.js +20 -0
- package/dist-server/service/checklist/checklist-query.js.map +1 -1
- package/dist-server/service/checklist-template-item/index.d.ts +1 -1
- package/dist-server/service/index.d.ts +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -2
- package/things-factory.config.js +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"building-inspection-detail-camera.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-camera.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/input/ox-input-switch.js'\nimport '@operato/mini-map/ox-zoomable-image.js'\nimport '@material/web/progress/circular-progress.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, state, query } from 'lit/decorators.js'\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'\n\nimport './component/building-inspection-detail-header'\n\n@customElement('building-inspection-detail-camera')\nexport class BuildingInspectionCamera extends PageView {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 75px 1fr;\n color: #4e5055;\n width: 100%;\n height: 100%;\n background-color: #f7f7f7;\n }\n\n div[body] {\n display: flex;\n justify-items: center;\n gap: var(--spacing-medium);\n margin: var(--spacing-medium);\n min-height: 0;\n }\n\n div[preview] {\n flex: 1;\n border: 2px solid #ddd;\n border-radius: 10px;\n\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 0;\n overflow: hidden;\n }\n\n div[preview] img {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n }\n\n div[preview] video {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n }\n\n div[preview] md-icon {\n --md-icon-size: 160px;\n }\n\n .loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n }\n\n .loading-text {\n font-size: 14px;\n color: #666;\n }\n\n .frame-container {\n width: 100%;\n height: 100%;\n max-height: 100%;\n min-height: 0;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 12px;\n }\n\n .frames-header {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 12px;\n font-size: 20px;\n font-weight: 700;\n color: #333;\n text-align: center;\n padding-block: 8px;\n }\n\n .frames-count {\n font-size: 16px;\n color: #777;\n font-weight: 600;\n }\n\n .frames-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(160px, 1fr));\n gap: 12px;\n }\n\n .frame-item {\n border: 1px solid #ddd;\n border-radius: 8px;\n overflow: hidden;\n background: #fff;\n cursor: pointer;\n transition:\n box-shadow 0.2s,\n transform 0.1s;\n }\n\n .frame-item:hover {\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n transform: translateY(-1px);\n }\n\n .frame-item img {\n display: block;\n width: 100%;\n height: 120px;\n object-fit: cover;\n }\n\n .image-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n align-content: center;\n }\n\n .point-marker {\n position: absolute;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n border: 2px solid #fff;\n transform: translate(-50%, -50%);\n pointer-events: none;\n box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.25);\n }\n\n .point-1 {\n background-color: #e53935;\n }\n\n .point-2 {\n background-color: #1e88e5;\n }\n\n .line-overlay {\n position: absolute;\n pointer-events: none;\n }\n\n .distance-label {\n position: absolute;\n background: rgba(0, 0, 0, 0.7);\n color: #fff;\n font-size: 14px;\n padding: 2px 6px;\n border-radius: 4px;\n transform: translate(-50%, -120%);\n pointer-events: none;\n white-space: nowrap;\n }\n\n div[controls] {\n width: 240px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: center;\n }\n\n div[action-buttons] {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n gap: 15px;\n }\n\n .switch-container {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 24px;\n font-weight: bold;\n }\n\n ox-input-switch {\n --ox-simple-switch-fullwidth: 68px;\n --ox-simple-switch-fullheight: 34px;\n --ox-simple-switch-thumbnail-size: 34px;\n }\n\n .camera-shutter {\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n position: relative;\n }\n\n .controls-title {\n font-size: 18px;\n font-weight: 700;\n color: #333;\n margin-bottom: 8px;\n text-align: center;\n }\n\n .camera-shutter md-icon {\n --md-icon-size: 100px;\n }\n\n .camera-shutter input {\n opacity: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n left: 0;\n top: 0;\n cursor: pointer;\n }\n\n button {\n padding: 10px 20px;\n font-size: 16px;\n border-radius: 5px;\n border: none;\n cursor: pointer;\n }\n\n button.save {\n background-color: #4caf50;\n color: white;\n\n &:disabled {\n background-color: #ccc;\n cursor: default;\n }\n }\n\n button.retry {\n background-color: #f0ad4e;\n color: white;\n }\n\n button.photo {\n background-color: #1e88e5;\n color: white;\n\n &:disabled {\n background-color: #ccc;\n cursor: default;\n }\n }\n `\n ]\n\n private KEYPOINT_RULER_API_BASE_URL: string = 'https://hatiolab-korea-uni.ettisoft.com'\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n @state() buildingInspectionId: string = ''\n @state() capturedVideoUrl: string | null = null\n @state() videoFile: File | null = null\n @state() frame: any | null = null\n @state() analyzing: boolean = false\n @state() selectedPoints: { x1: number | null; y1: number | null; x2: number | null; y2: number | null } = {\n x1: null,\n y1: null,\n x2: null,\n y2: null\n }\n @state() frameNaturalWidth: number = 0\n @state() frameNaturalHeight: number = 0\n @state() displayedImageRect: { width: number; height: number; left: number; top: number } | null = null\n @state() distance: number | null = null\n @state() unit: string | null = null\n\n @query('img#frameImage') private frameImageEl!: HTMLImageElement\n @query('div.image-wrapper') private imageWrapperEl!: HTMLDivElement\n @query('#cameraInput') private cameraInputEl!: HTMLInputElement\n\n get context() {\n return {\n title: '검측 관리 상세 - 사진 촬영'\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 ></building-inspection-detail-header>\n\n <div body>\n <!-- Preview selected or recorded video -->\n <div preview>\n <!-- analyzing 로딩 중일 때 -->\n ${this.analyzing\n ? html`<div class=\"loading-container\">\n <md-circular-progress indeterminate></md-circular-progress>\n <div class=\"loading-text\">분석 중...</div>\n </div>`\n : // 동영상 분석 완료 단일 프레임 표시\n this.frame\n ? html`\n <div class=\"image-wrapper\" @click=${this._onImageClick}>\n <img\n id=\"frameImage\"\n src=\"${this.KEYPOINT_RULER_API_BASE_URL + this.frame?.download_url}\"\n alt=\"frame\"\n loading=\"eager\"\n @load=${this._onImageLoad}\n />\n ${this._renderMarkers()}\n </div>\n `\n : // 동영상 선택 후 동영상 프리뷰\n this.capturedVideoUrl\n ? html`<video src=${this.capturedVideoUrl} controls playsinline></video>`\n : // 초기 상태, 동영상 선택 전\n html`<md-icon>videocam</md-icon>`}\n </div>\n\n <div controls>\n <span class=\"controls-title\">동영상 촬영</span>\n\n <!-- Camera shutter button (record video) -->\n <div class=\"camera-shutter\">\n <md-icon>camera</md-icon>\n <input id=\"cameraInput\" type=\"file\" accept=\"video/*\" capture @change=\"${this._onVideoSelected}\" />\n </div>\n\n <!-- Action buttons -->\n <div action-buttons>\n ${this.frame\n ? html`\n <button class=\"photo\" ?disabled=${this.analyzing || !this._hasTwoPoints()} @click=${this._onAnalyzePhoto}>\n 사진 분석\n </button>\n `\n : html`\n <button class=\"save\" ?disabled=${this.analyzing || !this.capturedVideoUrl} @click=${this._onAnalyzeVideo}>\n 동영상 분석\n </button>\n `}\n <button class=\"retry\" @click=${this._onRetry}>초기화</button>\n </div>\n </div>\n </div>\n `\n }\n\n protected async updated(changes: PropertyValues): Promise<void> {}\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 }\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 private _onVideoSelected(event: Event) {\n const input = event.target as HTMLInputElement\n const file = input?.files?.[0]\n if (!file) return\n\n // Only allow video files\n if (!file.type.startsWith('video/')) {\n console.warn('선택된 파일이 동영상이 아닙니다.')\n return\n }\n\n // Revoke old object URL if exists\n if (this.capturedVideoUrl) {\n URL.revokeObjectURL(this.capturedVideoUrl)\n }\n\n this.videoFile = file\n this.capturedVideoUrl = URL.createObjectURL(file)\n }\n\n private async _onAnalyzeVideo() {\n if (!this.videoFile) {\n console.warn('선택된 동영상이 없습니다.')\n return\n }\n\n try {\n this.analyzing = true\n const form = new FormData()\n form.append('files', this.videoFile, this.videoFile.name)\n const response = await fetch(`${this.KEYPOINT_RULER_API_BASE_URL}/api/run/keypoint-ruler`, {\n method: 'POST',\n headers: { Authorization: `Basic ${btoa('admin:admin1234')}` },\n body: form\n })\n\n const data = await response.json()\n\n this.frame = {\n file_id: data?.result?.output_files[0]?.file_id,\n download_url: data?.result?.output_files[0]?.download_url,\n file_path: data?.result?.frames[0]?.file_path,\n calibration: data?.result?.calibration\n }\n } catch (error) {\n console.error('동영상 업로드 실패:', error)\n } finally {\n this.analyzing = false\n }\n }\n\n private _onRetry() {\n // Clear current selection and reopen camera\n if (this.capturedVideoUrl) {\n URL.revokeObjectURL(this.capturedVideoUrl)\n }\n this.capturedVideoUrl = null\n this.videoFile = null\n this.frame = null\n this.selectedPoints = { x1: null, y1: null, x2: null, y2: null }\n this.displayedImageRect = null\n this.frameNaturalWidth = 0\n this.frameNaturalHeight = 0\n this.cameraInputEl.value = ''\n this.distance = null\n this.unit = null\n }\n\n private _onImageLoad = () => {\n if (!this.frameImageEl || !this.imageWrapperEl) return\n const img = this.frameImageEl\n const wrapperRect = this.imageWrapperEl.getBoundingClientRect()\n const imgRect = img.getBoundingClientRect()\n this.frameNaturalWidth = img.naturalWidth\n this.frameNaturalHeight = img.naturalHeight\n this.displayedImageRect = {\n width: imgRect.width,\n height: imgRect.height,\n left: imgRect.left - wrapperRect.left,\n top: imgRect.top - wrapperRect.top\n }\n }\n\n private _onImageClick = (event: MouseEvent) => {\n if (!this.frameImageEl || !this.imageWrapperEl) return\n const imgRect = this.frameImageEl.getBoundingClientRect()\n const wrapperRect = this.imageWrapperEl.getBoundingClientRect()\n const clientX = event.clientX\n const clientY = event.clientY\n\n // Ignore clicks outside the displayed image area\n if (clientX < imgRect.left || clientX > imgRect.right || clientY < imgRect.top || clientY > imgRect.bottom) {\n return\n }\n\n const relativeX = clientX - imgRect.left\n const relativeY = clientY - imgRect.top\n\n const xOnNatural = Math.round((relativeX * this.frameNaturalWidth) / imgRect.width)\n const yOnNatural = Math.round((relativeY * this.frameNaturalHeight) / imgRect.height)\n\n if (this.selectedPoints.x1 === null || this.selectedPoints.y1 === null) {\n this.selectedPoints = { ...this.selectedPoints, x1: xOnNatural, y1: yOnNatural }\n } else if (this.selectedPoints.x2 === null || this.selectedPoints.y2 === null) {\n this.selectedPoints = { ...this.selectedPoints, x2: xOnNatural, y2: yOnNatural }\n } else {\n // 세 번째 클릭부터는 초기화 후 첫 점으로 설정\n this.selectedPoints = { x1: xOnNatural, y1: yOnNatural, x2: null, y2: null }\n }\n\n // Update displayed rect cache (in case layout changed)\n this.displayedImageRect = {\n width: imgRect.width,\n height: imgRect.height,\n left: imgRect.left - wrapperRect.left,\n top: imgRect.top - wrapperRect.top\n }\n }\n\n private _hasTwoPoints(): boolean {\n const { x1, y1, x2, y2 } = this.selectedPoints\n return x1 !== null && y1 !== null && x2 !== null && y2 !== null\n }\n\n private _renderMarkers() {\n if (!this.displayedImageRect) return html``\n const { left, top, width, height } = this.displayedImageRect\n const { x1, y1, x2, y2 } = this.selectedPoints\n const toDisplay = (x: number, y: number) => {\n const dx = left + (x * width) / (this.frameNaturalWidth || 1)\n const dy = top + (y * height) / (this.frameNaturalHeight || 1)\n return { dx, dy }\n }\n\n return html`\n ${x1 !== null && y1 !== null\n ? (() => {\n const p = toDisplay(x1, y1)\n return html`<div class=\"point-marker point-1\" style=\"left:${p.dx}px; top:${p.dy}px;\"></div>`\n })()\n : ''}\n ${x2 !== null && y2 !== null\n ? (() => {\n const p = toDisplay(x2, y2)\n return html`<div class=\"point-marker point-2\" style=\"left:${p.dx}px; top:${p.dy}px;\"></div>`\n })()\n : ''}\n ${this._hasTwoPoints()\n ? (() => {\n const p1 = toDisplay(x1 as number, y1 as number)\n const p2 = toDisplay(x2 as number, y2 as number)\n const x = Math.min(p1.dx, p2.dx)\n const y = Math.min(p1.dy, p2.dy)\n const w = Math.abs(p1.dx - p2.dx)\n const h = Math.abs(p1.dy - p2.dy)\n const cx = (p1.dx + p2.dx) / 2\n const cy = (p1.dy + p2.dy) / 2\n\n return html`\n <svg class=\"line-overlay\" style=\"left:${x}px; top:${y}px; width:${w}px; height:${h}px;\">\n <line\n x1=${p1.dx < p2.dx ? 0 : w}\n y1=${p1.dy < p2.dy ? 0 : h}\n x2=${p1.dx < p2.dx ? w : 0}\n y2=${p1.dy < p2.dy ? h : 0}\n stroke=\"#ff9800\"\n stroke-width=\"3\"\n />\n </svg>\n ${this.distance !== null && this.unit\n ? html`<div class=\"distance-label\" style=\"left:${cx}px; top:${cy}px;\">${this.distance} ${this.unit}</div>`\n : ''}\n `\n })()\n : ''}\n `\n }\n\n private async _onAnalyzePhoto() {\n if (!this.frame) {\n console.warn('분석할 사진이 없습니다.')\n return\n }\n if (!this._hasTwoPoints()) {\n console.warn('두 점을 먼저 선택해 주세요.')\n return\n }\n\n try {\n this.analyzing = true\n const payload = {\n x1: this.selectedPoints.x1,\n y1: this.selectedPoints.y1,\n x2: this.selectedPoints.x2,\n y2: this.selectedPoints.y2,\n file_path: this.frame.file_path,\n calibration: this.frame.calibration\n }\n\n const form = new FormData()\n form.append('input', JSON.stringify(payload))\n const response = await fetch(`${this.KEYPOINT_RULER_API_BASE_URL}/api/run/keypoint-ruler`, {\n method: 'POST',\n headers: { Authorization: `Basic ${btoa('admin:admin1234')}` },\n body: form\n })\n\n const result = await response.json()\n const { distance, unit } = result.result || {}\n this.distance = distance\n this.unit = unit\n } catch (error) {\n console.error('사진 분석 실패:', error)\n } finally {\n this.analyzing = false\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"building-inspection-detail-camera.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-detail-camera.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/progress/circular-progress.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, PropertyValues } from 'lit'\nimport { customElement, state, query } from 'lit/decorators.js'\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'\n\nimport './component/building-inspection-detail-header'\n\n@customElement('building-inspection-detail-camera')\nexport class BuildingInspectionCamera extends PageView {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 75px 1fr;\n color: #4e5055;\n width: 100%;\n height: 100%;\n background-color: #f7f7f7;\n }\n\n div[body] {\n display: flex;\n justify-items: center;\n gap: var(--spacing-medium);\n margin: var(--spacing-medium);\n min-height: 0;\n }\n\n div[preview] {\n flex: 1;\n border: 2px solid #ddd;\n border-radius: 10px;\n\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 0;\n overflow: hidden;\n }\n\n div[preview] img {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n }\n\n div[preview] video {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n }\n\n div[preview] md-icon {\n --md-icon-size: 160px;\n }\n\n .image-wrapper {\n position: relative;\n width: 100%;\n height: 100%;\n align-content: center;\n text-align: center;\n }\n\n div[controls] {\n width: 240px;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n align-items: center;\n }\n\n div[action-buttons] {\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n gap: 15px;\n }\n\n .camera-shutter {\n display: flex;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n position: relative;\n }\n\n .controls-title {\n font-size: 18px;\n font-weight: 700;\n color: #333;\n margin-bottom: 8px;\n text-align: center;\n }\n\n .camera-shutter md-icon {\n --md-icon-size: 100px;\n }\n\n .camera-shutter input {\n opacity: 0;\n width: 100%;\n height: 100%;\n position: absolute;\n left: 0;\n top: 0;\n cursor: pointer;\n }\n\n button {\n padding: 10px 20px;\n font-size: 16px;\n border-radius: 5px;\n border: none;\n cursor: pointer;\n }\n\n button.save {\n background-color: #4caf50;\n color: white;\n\n &:disabled {\n background-color: #ccc;\n cursor: default;\n }\n }\n\n button.retry {\n background-color: #f0ad4e;\n color: white;\n }\n `\n ]\n\n @state() project: any = {}\n @state() buildingInspection: any = {}\n @state() buildingInspectionId: string = ''\n @state() capturedImageUrl: string | null = null\n @state() imageFile: File | null = null\n @state() isSaved: boolean = false\n\n @query('#imageInput') private imageInputEl!: HTMLInputElement\n\n get context() {\n return {\n title: '검측 관리 상세 - 사진 촬영'\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 ></building-inspection-detail-header>\n\n <div body>\n <div preview>\n <div class=\"image-wrapper\">\n ${this.capturedImageUrl\n ? html`<img id=\"imageImage\" src=\"${this.capturedImageUrl}\" alt=\"image\" />`\n : html`<md-icon>add_a_photo</md-icon>`}\n </div>\n </div>\n\n <div controls>\n <span class=\"controls-title\">사진 촬영</span>\n\n <div class=\"camera-shutter\">\n <md-icon>camera</md-icon>\n <input id=\"imageInput\" type=\"file\" accept=\"image/*\" @change=\"${this._onImageSelected}\" />\n </div>\n\n <!-- Action buttons -->\n <div action-buttons>\n <button class=\"save\" ?disabled=${!this.imageFile || this.isSaved} @click=${this._savePhoto}>사진 저장</button>\n <button class=\"retry\" @click=${this._onRetry}>초기화</button>\n </div>\n </div>\n </div>\n `\n }\n\n protected async updated(changes: PropertyValues): Promise<void> {}\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this._onRetry()\n this.buildingInspectionId = lifecycle.resourceId || ''\n await this.initBuildingInspection(this.buildingInspectionId)\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 checklist {\n id\n }\n buildingLevel {\n id\n floor\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 private _onImageSelected(event: Event) {\n const input = event.target as HTMLInputElement\n const file = input?.files?.[0]\n if (!file) return\n\n // Only allow video files\n if (!file.type.startsWith('image/')) {\n console.warn('선택된 파일이 이미지가 아닙니다.')\n return\n }\n\n // Revoke old object URL if exists\n if (this.capturedImageUrl) {\n URL.revokeObjectURL(this.capturedImageUrl)\n }\n\n this.imageFile = file\n this.capturedImageUrl = URL.createObjectURL(file)\n this.isSaved = false // 새 이미지 선택 시 저장 상태 초기화\n }\n\n private _onRetry() {\n // Clear current selection and reopen camera\n if (this.capturedImageUrl) {\n URL.revokeObjectURL(this.capturedImageUrl)\n }\n this.capturedImageUrl = null\n this.imageFile = null\n this.isSaved = false // 초기화 시 저장 상태도 리셋\n this.imageInputEl.value = ''\n }\n\n async _savePhoto() {\n if (!this.imageFile) {\n notify({ message: '사진을 선택한 후 저장할 수 있습니다.', level: 'warn' })\n return\n }\n\n const checklistId = this.buildingInspection?.checklist?.id\n const file = this.imageFile\n\n const response = await client.mutate({\n mutation: gql`\n mutation ($attachments: [NewAttachment!]!) {\n createAttachments(attachments: $attachments) {\n id\n }\n }\n `,\n variables: {\n attachments: [{ file, refBy: checklistId, refType: 'Checklist', description: this.buildingInspection?.status }]\n },\n context: { hasUpload: true }\n })\n\n if (!response.errors) {\n notify({ message: '사진 대지를 저장하였습니다.', level: 'info' })\n this.isSaved = true // 저장 성공 시 상태 업데이트\n return\n }\n\n return response.data.createAttachments\n }\n}\n"]}
|
package/dist-client/pages/building-inspection/component/building-inspection-detail-header.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { __decorate, __metadata } from "tslib";
|
|
2
2
|
import '@material/web/icon/icon.js';
|
|
3
|
+
import '@material/web/menu/menu.js';
|
|
4
|
+
import '@material/web/menu/menu-item.js';
|
|
5
|
+
import '@material/web/divider/divider.js';
|
|
3
6
|
import { css, html, LitElement } from 'lit';
|
|
4
|
-
import { customElement, property } from 'lit/decorators.js';
|
|
7
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
|
5
8
|
import { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles';
|
|
9
|
+
import { navigate } from '@operato/shell';
|
|
6
10
|
let BuildingInspectionDetailHeader = class BuildingInspectionDetailHeader extends LitElement {
|
|
7
11
|
constructor() {
|
|
8
12
|
super(...arguments);
|
|
@@ -11,6 +15,7 @@ let BuildingInspectionDetailHeader = class BuildingInspectionDetailHeader extend
|
|
|
11
15
|
this.projectName = '';
|
|
12
16
|
this.buildingName = '';
|
|
13
17
|
this.buildingLevelFloor = '';
|
|
18
|
+
this.isPhotoMenuOpen = false;
|
|
14
19
|
}
|
|
15
20
|
render() {
|
|
16
21
|
const path = window.location.pathname;
|
|
@@ -39,13 +44,27 @@ let BuildingInspectionDetailHeader = class BuildingInspectionDetailHeader extend
|
|
|
39
44
|
>
|
|
40
45
|
<md-icon slot="icon">task</md-icon>검측 체크리스트
|
|
41
46
|
</md-elevated-button>
|
|
42
|
-
<
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
<div class="photo-menu-container">
|
|
48
|
+
<md-elevated-button @click=${this.togglePhotoMenu} id="photo-menu-anchor">
|
|
49
|
+
<md-icon slot="icon">arrow_drop_down</md-icon>사진촬영
|
|
50
|
+
</md-elevated-button>
|
|
51
|
+
<md-menu .open=${this.isPhotoMenuOpen} anchor="photo-menu-anchor" @closed=${() => (this.isPhotoMenuOpen = false)}>
|
|
52
|
+
<md-menu-item @click=${() => navigate(`building-inspection-detail-camera/${this.buildingInspectionId}`)}>
|
|
53
|
+
<md-icon slot="start">photo_camera</md-icon>
|
|
54
|
+
사진 촬영
|
|
55
|
+
</md-menu-item>
|
|
56
|
+
<md-divider></md-divider>
|
|
57
|
+
<md-menu-item @click=${() => navigate(`building-inspection-detail-ai-measurement/${this.buildingInspectionId}`)}>
|
|
58
|
+
<md-icon slot="start">straighten</md-icon>
|
|
59
|
+
AI 길이 측정
|
|
60
|
+
</md-menu-item>
|
|
61
|
+
<md-divider></md-divider>
|
|
62
|
+
<md-menu-item @click=${this.handleDefectAnalysis}>
|
|
63
|
+
<md-icon slot="start">manga</md-icon>
|
|
64
|
+
AI 하자 분석
|
|
65
|
+
</md-menu-item>
|
|
66
|
+
</md-menu>
|
|
67
|
+
</div>
|
|
49
68
|
<md-elevated-button
|
|
50
69
|
?disabled=${path.includes('building-inspection-detail-history/')}
|
|
51
70
|
href=${`building-inspection-detail-history/${this.buildingInspectionId}`}
|
|
@@ -57,6 +76,13 @@ let BuildingInspectionDetailHeader = class BuildingInspectionDetailHeader extend
|
|
|
57
76
|
</div>
|
|
58
77
|
`;
|
|
59
78
|
}
|
|
79
|
+
handleDefectAnalysis() {
|
|
80
|
+
// 하자 분석 기능 - 추후 구현
|
|
81
|
+
console.log('하자 분석 기능');
|
|
82
|
+
}
|
|
83
|
+
togglePhotoMenu() {
|
|
84
|
+
this.isPhotoMenuOpen = !this.isPhotoMenuOpen;
|
|
85
|
+
}
|
|
60
86
|
};
|
|
61
87
|
BuildingInspectionDetailHeader.styles = [
|
|
62
88
|
ButtonContainerStyles,
|
|
@@ -140,6 +166,45 @@ BuildingInspectionDetailHeader.styles = [
|
|
|
140
166
|
margin-right: -2px;
|
|
141
167
|
}
|
|
142
168
|
}
|
|
169
|
+
|
|
170
|
+
/* 드롭다운 메뉴 컨테이너 */
|
|
171
|
+
.photo-menu-container {
|
|
172
|
+
position: relative;
|
|
173
|
+
display: inline-block;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
md-menu {
|
|
177
|
+
--md-menu-container-color: #fff;
|
|
178
|
+
--md-menu-container-elevation: 2;
|
|
179
|
+
border-radius: 8px;
|
|
180
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
|
181
|
+
min-width: 150px;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
md-menu-item {
|
|
185
|
+
--md-menu-item-container-height: 20px;
|
|
186
|
+
--md-menu-item-one-line-container-height: 30px;
|
|
187
|
+
--md-menu-item-label-text-size: 15px;
|
|
188
|
+
--md-menu-item-label-text-color: #333;
|
|
189
|
+
--md-menu-item-hover-state-layer-color: #f5f5f5;
|
|
190
|
+
--md-menu-item-top-space: 0px;
|
|
191
|
+
--md-menu-item-bottom-space: 0px;
|
|
192
|
+
|
|
193
|
+
cursor: pointer;
|
|
194
|
+
padding: 2px 4px !important;
|
|
195
|
+
min-height: 18px !important;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
md-menu-item md-icon {
|
|
199
|
+
margin-right: 2px;
|
|
200
|
+
color: #666;
|
|
201
|
+
--md-icon-size: 14px;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
md-divider {
|
|
205
|
+
margin: 1px 0;
|
|
206
|
+
--md-divider-thickness: 1px;
|
|
207
|
+
}
|
|
143
208
|
`
|
|
144
209
|
];
|
|
145
210
|
__decorate([
|
|
@@ -162,6 +227,10 @@ __decorate([
|
|
|
162
227
|
property({ type: String }),
|
|
163
228
|
__metadata("design:type", String)
|
|
164
229
|
], BuildingInspectionDetailHeader.prototype, "buildingLevelFloor", void 0);
|
|
230
|
+
__decorate([
|
|
231
|
+
state(),
|
|
232
|
+
__metadata("design:type", Object)
|
|
233
|
+
], BuildingInspectionDetailHeader.prototype, "isPhotoMenuOpen", void 0);
|
|
165
234
|
BuildingInspectionDetailHeader = __decorate([
|
|
166
235
|
customElement('building-inspection-detail-header')
|
|
167
236
|
], BuildingInspectionDetailHeader);
|
package/dist-client/pages/building-inspection/component/building-inspection-detail-header.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"building-inspection-detail-header.js","sourceRoot":"","sources":["../../../../client/pages/building-inspection/component/building-inspection-detail-header.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"building-inspection-detail-header.js","sourceRoot":"","sources":["../../../../client/pages/building-inspection/component/building-inspection-detail-header.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/menu/menu.js'\nimport '@material/web/menu/menu-item.js'\nimport '@material/web/divider/divider.js'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles'\nimport { navigate } from '@operato/shell'\n\n@customElement('building-inspection-detail-header')\nclass BuildingInspectionDetailHeader extends LitElement {\n static styles = [\n ButtonContainerStyles,\n ScrollbarStyles,\n css`\n md-filled-button {\n --md-filled-button-container-color: #0595e5;\n --md-filled-button-container-height: 30px;\n --md-filled-button-trailing-space: 15px;\n --md-filled-button-leading-space: 15px;\n }\n md-outlined-button {\n --md-outlined-button-container-height: 30px;\n --md-outlined-button-trailing-space: 15px;\n --md-outlined-button-leading-space: 15px;\n }\n\n *[bold] {\n font-weight: bold;\n }\n\n div[header] {\n display: flex;\n margin: 0px var(--spacing-large, 12px);\n\n h2 {\n display: flex;\n gap: 7px;\n flex: 0.5;\n color: #3f71a0;\n font-size: 18px;\n\n md-icon[back] {\n background: linear-gradient(135deg, #3f71a0 0%, #5a8cc7 100%);\n color: white;\n padding: 8px;\n border-radius: 50%;\n cursor: pointer;\n box-shadow: 0 2px 8px rgba(63, 113, 160, 0.3);\n width: 14px;\n height: 14px;\n --md-icon-size: 20px;\n }\n\n md-icon[back]:hover {\n background: linear-gradient(135deg, #2e5c89 0%, #4a7bb0 100%);\n box-shadow: 0 4px 12px rgba(63, 113, 160, 0.4);\n }\n }\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: end;\n flex: 0.5;\n }\n\n md-elevated-button {\n margin-left: var(--spacing-small, 4px);\n letter-spacing: -1px;\n\n --md-elevated-button-container-height: 32px;\n --md-elevated-button-label-text-size: 16px;\n --md-elevated-button-container-color: #0595e5;\n\n --md-elevated-button-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-hover-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-pressed-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-focus-label-text-color: var(--md-sys-color-on-primary);\n --md-elevated-button-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-hover-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-pressed-icon-color: var(--md-sys-color-on-primary);\n --md-elevated-button-focus-icon-color: var(--md-sys-color-on-primary);\n --_leading-space: var(--spacing-tiny, 2px);\n\n --_with-leading-icon-leading-space: var(--spacing-medium, 8px);\n --_with-leading-icon-trailing-space: var(--spacing-medium, 8px);\n\n md-icon {\n margin-right: -2px;\n }\n }\n\n /* 드롭다운 메뉴 컨테이너 */\n .photo-menu-container {\n position: relative;\n display: inline-block;\n }\n\n md-menu {\n --md-menu-container-color: #fff;\n --md-menu-container-elevation: 2;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n min-width: 150px;\n }\n\n md-menu-item {\n --md-menu-item-container-height: 20px;\n --md-menu-item-one-line-container-height: 30px;\n --md-menu-item-label-text-size: 15px;\n --md-menu-item-label-text-color: #333;\n --md-menu-item-hover-state-layer-color: #f5f5f5;\n --md-menu-item-top-space: 0px;\n --md-menu-item-bottom-space: 0px;\n\n cursor: pointer;\n padding: 2px 4px !important;\n min-height: 18px !important;\n }\n\n md-menu-item md-icon {\n margin-right: 2px;\n color: #666;\n --md-icon-size: 14px;\n }\n\n md-divider {\n margin: 1px 0;\n --md-divider-thickness: 1px;\n }\n `\n ]\n\n @property({ type: String }) buildingInspectionId: string = ''\n @property({ type: String }) buildingLevelId: string = ''\n @property({ type: String }) projectName: string = ''\n @property({ type: String }) buildingName: string = ''\n @property({ type: String }) buildingLevelFloor: string = ''\n\n @state() private isPhotoMenuOpen = false\n\n render() {\n const path = window.location.pathname\n\n return html`\n <div header>\n <h2>\n <md-icon slot=\"icon\" back @click=${() => history.back()}>arrow_back</md-icon>\n ${this.projectName || ''} ${this.buildingName || ''} ${this.buildingLevelFloor || ''}층\n </h2>\n <div button-container>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-list/')}\n href=${`building-inspection-list/${this.buildingLevelId}`}\n >\n <md-icon slot=\"icon\">list_alt</md-icon>검측 리스트\n </md-elevated-button>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-drawing/')}\n href=${`building-inspection-detail-drawing/${this.buildingInspectionId}`}\n >\n <md-icon slot=\"icon\">fact_check</md-icon>검측도면\n </md-elevated-button>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-checklist/')}\n href=${`building-inspection-detail-checklist/${this.buildingInspectionId}`}\n >\n <md-icon slot=\"icon\">task</md-icon>검측 체크리스트\n </md-elevated-button>\n <div class=\"photo-menu-container\">\n <md-elevated-button @click=${this.togglePhotoMenu} id=\"photo-menu-anchor\">\n <md-icon slot=\"icon\">arrow_drop_down</md-icon>사진촬영\n </md-elevated-button>\n <md-menu .open=${this.isPhotoMenuOpen} anchor=\"photo-menu-anchor\" @closed=${() => (this.isPhotoMenuOpen = false)}>\n <md-menu-item @click=${() => navigate(`building-inspection-detail-camera/${this.buildingInspectionId}`)}>\n <md-icon slot=\"start\">photo_camera</md-icon>\n 사진 촬영\n </md-menu-item>\n <md-divider></md-divider>\n <md-menu-item @click=${() => navigate(`building-inspection-detail-ai-measurement/${this.buildingInspectionId}`)}>\n <md-icon slot=\"start\">straighten</md-icon>\n AI 길이 측정\n </md-menu-item>\n <md-divider></md-divider>\n <md-menu-item @click=${this.handleDefectAnalysis}>\n <md-icon slot=\"start\">manga</md-icon>\n AI 하자 분석\n </md-menu-item>\n </md-menu>\n </div>\n <md-elevated-button\n ?disabled=${path.includes('building-inspection-detail-history/')}\n href=${`building-inspection-detail-history/${this.buildingInspectionId}`}\n disabled\n >\n <md-icon slot=\"icon\">pending_actions</md-icon>감리이력\n </md-elevated-button>\n </div>\n </div>\n `\n }\n\n private handleDefectAnalysis() {\n // 하자 분석 기능 - 추후 구현\n console.log('하자 분석 기능')\n }\n\n private togglePhotoMenu() {\n this.isPhotoMenuOpen = !this.isPhotoMenuOpen\n }\n}\n"]}
|
package/dist-client/pages/building-inspection/component/inspection-document/photo-album-popup.js
CHANGED
|
@@ -104,13 +104,23 @@ let PhotoAlbumPopup = class PhotoAlbumPopup extends LitElement {
|
|
|
104
104
|
await this._loadPhotos();
|
|
105
105
|
}
|
|
106
106
|
async _loadPhotos() {
|
|
107
|
-
var _a;
|
|
107
|
+
var _a, _b;
|
|
108
108
|
try {
|
|
109
109
|
const response = await client.query({
|
|
110
110
|
query: gql `
|
|
111
111
|
query ChecklistPhotos($checklistId: String!) {
|
|
112
112
|
checklist(id: $checklistId) {
|
|
113
113
|
id
|
|
114
|
+
checklistAttachments {
|
|
115
|
+
id
|
|
116
|
+
name
|
|
117
|
+
fullpath
|
|
118
|
+
description
|
|
119
|
+
creator {
|
|
120
|
+
name
|
|
121
|
+
}
|
|
122
|
+
createdAt
|
|
123
|
+
}
|
|
114
124
|
checklistItems {
|
|
115
125
|
id
|
|
116
126
|
name
|
|
@@ -139,11 +149,16 @@ let PhotoAlbumPopup = class PhotoAlbumPopup extends LitElement {
|
|
|
139
149
|
return;
|
|
140
150
|
}
|
|
141
151
|
const checklist = response.data.checklist;
|
|
142
|
-
// 모든
|
|
143
|
-
const allAttachments =
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
152
|
+
// 모든 첨부파일을 수집 (체크리스트 레벨 + 아이템 레벨)
|
|
153
|
+
const allAttachments = [
|
|
154
|
+
// 체크리스트 레벨 첨부파일
|
|
155
|
+
...(((_a = checklist.checklistAttachments) === null || _a === void 0 ? void 0 : _a.map((attachment) => (Object.assign(Object.assign({}, attachment), { previewTitle: `사진 대지` })))) || []),
|
|
156
|
+
// 체크리스트 아이템 레벨 첨부파일
|
|
157
|
+
...(((_b = checklist.checklistItems) === null || _b === void 0 ? void 0 : _b.flatMap((item) => {
|
|
158
|
+
var _a;
|
|
159
|
+
return ((_a = item.checklistItemAttachments) === null || _a === void 0 ? void 0 : _a.map((attachment) => (Object.assign(Object.assign({}, attachment), { previewTitle: `[검사 항목] ${item.name}` })))) || [];
|
|
160
|
+
})) || [])
|
|
161
|
+
];
|
|
147
162
|
// 시공자와 감리자로 분류 (이메일 도메인이나 역할로 구분)
|
|
148
163
|
this.constructorFiles = allAttachments.filter(attachment => [BuildingInspectionStatus.WAIT, BuildingInspectionStatus.OVERALL_WAIT, BuildingInspectionStatus.FAIL].includes(attachment.description));
|
|
149
164
|
this.supervisorFiles = allAttachments.filter(attachment => [BuildingInspectionStatus.REQUEST, BuildingInspectionStatus.OVERALL_REQUEST].includes(attachment.description));
|
package/dist-client/pages/building-inspection/component/inspection-document/photo-album-popup.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"photo-album-popup.js","sourceRoot":"","sources":["../../../../../client/pages/building-inspection/component/inspection-document/photo-album-popup.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/elevated-button.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/tabs/tabs.js'\nimport '@material/web/tabs/primary-tab.js'\n\nimport gql from 'graphql-tag'\nimport { client } from '@operato/graphql'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles'\nimport { notify, openPopup } from '@operato/layout'\nimport '../image-preview-popup'\nimport { BuildingInspectionStatus } from '../../building-inspection-list'\n\nexport enum PhotoTab {\n CONSTRUCTOR = 'constructor',\n SUPERVISOR = 'supervisor'\n}\n\n@customElement('photo-album-popup')\nexport class PhotoAlbumPopup extends LitElement {\n static styles = [\n ButtonContainerStyles,\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: #fff;\n width: 100%;\n max-height: 80vh;\n }\n\n div[body] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n .tabs-container {\n margin-bottom: 20px;\n border-bottom: 2px solid #ddd;\n }\n\n md-tabs {\n --md-primary-tab-container-color: transparent;\n --md-primary-tab-active-indicator-color: #2196f3;\n --md-primary-tab-label-text-color: #666;\n --md-primary-tab-active-label-text-color: #2196f3;\n }\n\n .photo-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n gap: 15px;\n margin-bottom: 20px;\n }\n\n .photo-item {\n position: relative;\n aspect-ratio: 1;\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 2px solid #ddd;\n }\n\n .photo-item:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n border-color: #2196f3;\n }\n\n .photo-item img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .photo-overlay {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n background: linear-gradient(transparent, rgba(0, 0, 0, 0.8));\n color: white;\n padding: 10px 8px 8px;\n font-size: 12px;\n line-height: 1.2;\n }\n\n .photo-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .photo-name {\n font-weight: bold;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .photo-creator {\n font-size: 10px;\n opacity: 0.9;\n display: flex;\n align-items: center;\n gap: 3px;\n }\n\n .photo-date {\n font-size: 10px;\n opacity: 0.8;\n }\n\n .file-icon-container {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background-color: #f5f5f5;\n position: relative;\n }\n\n .file-icon {\n --md-icon-size: 48px;\n color: #666;\n margin-bottom: 8px;\n }\n\n .file-extension {\n font-size: 12px;\n font-weight: bold;\n color: #444;\n background-color: #e0e0e0;\n padding: 2px 6px;\n border-radius: 3px;\n text-transform: uppercase;\n }\n\n .empty-state {\n text-align: center;\n color: #666;\n padding: 60px 20px;\n }\n\n .empty-state md-icon {\n --md-icon-size: 64px;\n color: #ccc;\n margin-bottom: 16px;\n }\n\n .tab-content {\n min-height: 300px;\n }\n\n .photo-count {\n color: #666;\n font-size: 14px;\n margin-bottom: 15px;\n padding: 10px;\n background-color: #f5f5f5;\n border-radius: 5px;\n text-align: center;\n }\n\n h3 {\n position: relative;\n color: rgb(5, 149, 229);\n font-size: 17px;\n font-weight: 700;\n margin: 0px 0px 20px 0px;\n padding-top: 0px;\n }\n\n .button-container {\n display: flex;\n justify-content: center;\n padding: 15px;\n border-top: 1px solid #ddd;\n background-color: #f9f9f9;\n margin-left: unset;\n }\n `\n ]\n\n @property({ type: String }) checklistId: string = ''\n\n @state() activeTab: PhotoTab = PhotoTab.CONSTRUCTOR\n @state() constructorFiles: any[] = []\n @state() supervisorFiles: any[] = []\n\n render() {\n const currentFiles = this.activeTab === PhotoTab.CONSTRUCTOR ? this.constructorFiles : this.supervisorFiles\n const constructorCount = this.constructorFiles.length\n const supervisorCount = this.supervisorFiles.length\n\n return html`\n <div body>\n <div class=\"tabs-container\">\n <md-tabs>\n <md-primary-tab\n ?active=${this.activeTab === PhotoTab.CONSTRUCTOR}\n @click=${() => this._setActiveTab(PhotoTab.CONSTRUCTOR)}\n >\n 시공자 (${constructorCount})\n </md-primary-tab>\n <md-primary-tab\n ?active=${this.activeTab === PhotoTab.SUPERVISOR}\n @click=${() => this._setActiveTab(PhotoTab.SUPERVISOR)}\n >\n 감리자 (${supervisorCount})\n </md-primary-tab>\n </md-tabs>\n </div>\n\n <div class=\"tab-content\">\n <div class=\"photo-count\">\n ${this.activeTab === PhotoTab.CONSTRUCTOR ? '시공자' : '감리자'} 첨부파일: ${currentFiles.length}건\n </div>\n\n ${currentFiles.length > 0\n ? html`\n <div class=\"photo-grid\">\n ${currentFiles.map(\n (file, index) => html`\n <div class=\"photo-item\" @click=${() => this._openFilePreview(currentFiles, index)}>\n ${this._isImageFile(file.fullpath)\n ? html`<img\n src=\"${file.fullpath}\"\n alt=\"${file.name}\"\n @error=${(e: Event) => this._onImageError(e, file)}\n />`\n : html`\n <div class=\"file-icon-container\">\n <md-icon class=\"file-icon\">description</md-icon>\n <div class=\"file-extension\">${this._getFileExtension(file.fullpath)}</div>\n </div>\n `}\n <div class=\"photo-overlay\">\n <div class=\"photo-info\">\n <div class=\"photo-name\">${file.name}</div>\n <div class=\"photo-creator\">\n <md-icon style=\"--md-icon-size: 10px;\">account_circle</md-icon>\n ${file.creator?.name || ''}\n </div>\n <div class=\"photo-date\">${this._formatDate(file.createdAt)}</div>\n </div>\n </div>\n </div>\n `\n )}\n </div>\n `\n : html`\n <div class=\"empty-state\">\n <md-icon>attach_file</md-icon>\n <div>${this.activeTab === PhotoTab.CONSTRUCTOR ? '시공자' : '감리자'}가 업로드한 첨부파일이 없습니다.</div>\n </div>\n `}\n </div>\n </div>\n\n <div class=\"button-container\">\n <md-elevated-button @click=${this._close}> <md-icon slot=\"icon\">close</md-icon>닫기 </md-elevated-button>\n </div>\n `\n }\n\n async firstUpdated() {\n await this._loadPhotos()\n }\n\n private async _loadPhotos() {\n try {\n const response = await client.query({\n query: gql`\n query ChecklistPhotos($checklistId: String!) {\n checklist(id: $checklistId) {\n id\n checklistItems {\n id\n name\n checklistItemAttachments {\n id\n name\n fullpath\n description\n creator {\n id\n name\n email\n }\n createdAt\n }\n }\n }\n }\n `,\n variables: {\n checklistId: this.checklistId\n }\n })\n\n if (response.errors) {\n notify({ message: '사진 목록을 불러오는데 실패했습니다.', level: 'error' })\n return\n }\n\n const checklist = response.data.checklist\n // 모든 체크리스트 아이템의 첨부파일을 수집 (이미지와 일반 파일 모두)\n const allAttachments =\n checklist.checklistItems?.flatMap(\n (item: any) =>\n item.checklistItemAttachments?.map((attachment: any) => ({\n ...attachment,\n previewTitle: `[검사 항목] ${item.name}`\n })) || []\n ) || []\n\n // 시공자와 감리자로 분류 (이메일 도메인이나 역할로 구분)\n this.constructorFiles = allAttachments.filter(attachment =>\n [BuildingInspectionStatus.WAIT, BuildingInspectionStatus.OVERALL_WAIT, BuildingInspectionStatus.FAIL].includes(\n attachment.description\n )\n )\n\n this.supervisorFiles = allAttachments.filter(attachment =>\n [BuildingInspectionStatus.REQUEST, BuildingInspectionStatus.OVERALL_REQUEST].includes(attachment.description)\n )\n } catch (error) {\n console.error('사진 목록 로딩 중 오류 발생:', error)\n notify({ message: '사진 목록을 불러오는데 실패했습니다.', level: 'error' })\n }\n }\n\n private _isImageFile(filepath: string): boolean {\n if (!filepath) return false\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg']\n const extension = filepath.toLowerCase().split('.').pop()\n return imageExtensions.includes(extension || '')\n }\n\n private _getFileExtension(filepath: string): string {\n if (!filepath) return ''\n const extension = filepath.toLowerCase().split('.').pop()\n return extension || 'file'\n }\n\n private _setActiveTab(tab: PhotoTab) {\n this.activeTab = tab\n }\n\n private _openFilePreview(files: any[], startIndex: number) {\n const file = files[startIndex]\n\n if (this._isImageFile(file.fullpath)) {\n // 이미지들만 필터링해서 이미지 미리보기 팝업 열기\n const imageFiles = files.filter(f => this._isImageFile(f.fullpath))\n const imageIndex = imageFiles.findIndex(f => f.id === file.id)\n\n openPopup(\n html` <image-preview-popup .images=${imageFiles} .currentIndex=${Math.max(0, imageIndex)}></image-preview-popup> `,\n { backdrop: true, size: 'large', title: '사진 미리보기' }\n )\n } else {\n // 일반 파일은 새 탭에서 열기 또는 다운로드\n window.open(file.fullpath, '_blank')\n }\n }\n\n private _onImageError(e: Event, file: any) {\n const target = e.target as HTMLImageElement\n target.style.display = 'none'\n\n // 오류 발생 시 기본 아이콘 표시\n const container = target.parentElement!\n container.innerHTML += `\n <div style=\"display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; background-color: #f5f5f5;\">\n <md-icon style=\"--md-icon-size: 48px; color: #ccc;\">broken_image</md-icon>\n </div>\n `\n }\n\n private _formatDate(date: string | Date): string {\n const _date = new Date(date)\n\n if (isNaN(_date.getTime())) {\n return '날짜 없음'\n }\n\n const year = _date.getFullYear()\n const month = String(_date.getMonth() + 1).padStart(2, '0')\n const day = String(_date.getDate()).padStart(2, '0')\n const hours = String(_date.getHours()).padStart(2, '0')\n const minutes = String(_date.getMinutes()).padStart(2, '0')\n\n return `${year}.${month}.${day} ${hours}:${minutes}`\n }\n\n private _close() {\n history.back()\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"photo-album-popup.js","sourceRoot":"","sources":["../../../../../client/pages/building-inspection/component/inspection-document/photo-album-popup.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/button/elevated-button.js'\nimport '@material/web/icon/icon.js'\nimport '@material/web/tabs/tabs.js'\nimport '@material/web/tabs/primary-tab.js'\n\nimport gql from 'graphql-tag'\nimport { client } from '@operato/graphql'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { ButtonContainerStyles, ScrollbarStyles } from '@operato/styles'\nimport { notify, openPopup } from '@operato/layout'\nimport '../image-preview-popup'\nimport { BuildingInspectionStatus } from '../../building-inspection-list'\n\nexport enum PhotoTab {\n CONSTRUCTOR = 'constructor',\n SUPERVISOR = 'supervisor'\n}\n\n@customElement('photo-album-popup')\nexport class PhotoAlbumPopup extends LitElement {\n static styles = [\n ButtonContainerStyles,\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: #fff;\n width: 100%;\n max-height: 80vh;\n }\n\n div[body] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n }\n\n .tabs-container {\n margin-bottom: 20px;\n border-bottom: 2px solid #ddd;\n }\n\n md-tabs {\n --md-primary-tab-container-color: transparent;\n --md-primary-tab-active-indicator-color: #2196f3;\n --md-primary-tab-label-text-color: #666;\n --md-primary-tab-active-label-text-color: #2196f3;\n }\n\n .photo-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));\n gap: 15px;\n margin-bottom: 20px;\n }\n\n .photo-item {\n position: relative;\n aspect-ratio: 1;\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n transition: all 0.2s ease;\n border: 2px solid #ddd;\n }\n\n .photo-item:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\n border-color: #2196f3;\n }\n\n .photo-item img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .photo-overlay {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n background: linear-gradient(transparent, rgba(0, 0, 0, 0.8));\n color: white;\n padding: 10px 8px 8px;\n font-size: 12px;\n line-height: 1.2;\n }\n\n .photo-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n }\n\n .photo-name {\n font-weight: bold;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .photo-creator {\n font-size: 10px;\n opacity: 0.9;\n display: flex;\n align-items: center;\n gap: 3px;\n }\n\n .photo-date {\n font-size: 10px;\n opacity: 0.8;\n }\n\n .file-icon-container {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n background-color: #f5f5f5;\n position: relative;\n }\n\n .file-icon {\n --md-icon-size: 48px;\n color: #666;\n margin-bottom: 8px;\n }\n\n .file-extension {\n font-size: 12px;\n font-weight: bold;\n color: #444;\n background-color: #e0e0e0;\n padding: 2px 6px;\n border-radius: 3px;\n text-transform: uppercase;\n }\n\n .empty-state {\n text-align: center;\n color: #666;\n padding: 60px 20px;\n }\n\n .empty-state md-icon {\n --md-icon-size: 64px;\n color: #ccc;\n margin-bottom: 16px;\n }\n\n .tab-content {\n min-height: 300px;\n }\n\n .photo-count {\n color: #666;\n font-size: 14px;\n margin-bottom: 15px;\n padding: 10px;\n background-color: #f5f5f5;\n border-radius: 5px;\n text-align: center;\n }\n\n h3 {\n position: relative;\n color: rgb(5, 149, 229);\n font-size: 17px;\n font-weight: 700;\n margin: 0px 0px 20px 0px;\n padding-top: 0px;\n }\n\n .button-container {\n display: flex;\n justify-content: center;\n padding: 15px;\n border-top: 1px solid #ddd;\n background-color: #f9f9f9;\n margin-left: unset;\n }\n `\n ]\n\n @property({ type: String }) checklistId: string = ''\n\n @state() activeTab: PhotoTab = PhotoTab.CONSTRUCTOR\n @state() constructorFiles: any[] = []\n @state() supervisorFiles: any[] = []\n\n render() {\n const currentFiles = this.activeTab === PhotoTab.CONSTRUCTOR ? this.constructorFiles : this.supervisorFiles\n const constructorCount = this.constructorFiles.length\n const supervisorCount = this.supervisorFiles.length\n\n return html`\n <div body>\n <div class=\"tabs-container\">\n <md-tabs>\n <md-primary-tab\n ?active=${this.activeTab === PhotoTab.CONSTRUCTOR}\n @click=${() => this._setActiveTab(PhotoTab.CONSTRUCTOR)}\n >\n 시공자 (${constructorCount})\n </md-primary-tab>\n <md-primary-tab\n ?active=${this.activeTab === PhotoTab.SUPERVISOR}\n @click=${() => this._setActiveTab(PhotoTab.SUPERVISOR)}\n >\n 감리자 (${supervisorCount})\n </md-primary-tab>\n </md-tabs>\n </div>\n\n <div class=\"tab-content\">\n <div class=\"photo-count\">\n ${this.activeTab === PhotoTab.CONSTRUCTOR ? '시공자' : '감리자'} 첨부파일: ${currentFiles.length}건\n </div>\n\n ${currentFiles.length > 0\n ? html`\n <div class=\"photo-grid\">\n ${currentFiles.map(\n (file, index) => html`\n <div class=\"photo-item\" @click=${() => this._openFilePreview(currentFiles, index)}>\n ${this._isImageFile(file.fullpath)\n ? html`<img\n src=\"${file.fullpath}\"\n alt=\"${file.name}\"\n @error=${(e: Event) => this._onImageError(e, file)}\n />`\n : html`\n <div class=\"file-icon-container\">\n <md-icon class=\"file-icon\">description</md-icon>\n <div class=\"file-extension\">${this._getFileExtension(file.fullpath)}</div>\n </div>\n `}\n <div class=\"photo-overlay\">\n <div class=\"photo-info\">\n <div class=\"photo-name\">${file.name}</div>\n <div class=\"photo-creator\">\n <md-icon style=\"--md-icon-size: 10px;\">account_circle</md-icon>\n ${file.creator?.name || ''}\n </div>\n <div class=\"photo-date\">${this._formatDate(file.createdAt)}</div>\n </div>\n </div>\n </div>\n `\n )}\n </div>\n `\n : html`\n <div class=\"empty-state\">\n <md-icon>attach_file</md-icon>\n <div>${this.activeTab === PhotoTab.CONSTRUCTOR ? '시공자' : '감리자'}가 업로드한 첨부파일이 없습니다.</div>\n </div>\n `}\n </div>\n </div>\n\n <div class=\"button-container\">\n <md-elevated-button @click=${this._close}> <md-icon slot=\"icon\">close</md-icon>닫기 </md-elevated-button>\n </div>\n `\n }\n\n async firstUpdated() {\n await this._loadPhotos()\n }\n\n private async _loadPhotos() {\n try {\n const response = await client.query({\n query: gql`\n query ChecklistPhotos($checklistId: String!) {\n checklist(id: $checklistId) {\n id\n checklistAttachments {\n id\n name\n fullpath\n description\n creator {\n name\n }\n createdAt\n }\n checklistItems {\n id\n name\n checklistItemAttachments {\n id\n name\n fullpath\n description\n creator {\n id\n name\n email\n }\n createdAt\n }\n }\n }\n }\n `,\n variables: {\n checklistId: this.checklistId\n }\n })\n\n if (response.errors) {\n notify({ message: '사진 목록을 불러오는데 실패했습니다.', level: 'error' })\n return\n }\n\n const checklist = response.data.checklist\n // 모든 첨부파일을 수집 (체크리스트 레벨 + 아이템 레벨)\n const allAttachments = [\n // 체크리스트 레벨 첨부파일\n ...(checklist.checklistAttachments?.map((attachment: any) => ({\n ...attachment,\n previewTitle: `사진 대지`\n })) || []),\n // 체크리스트 아이템 레벨 첨부파일\n ...(checklist.checklistItems?.flatMap(\n (item: any) =>\n item.checklistItemAttachments?.map((attachment: any) => ({\n ...attachment,\n previewTitle: `[검사 항목] ${item.name}`\n })) || []\n ) || [])\n ]\n\n // 시공자와 감리자로 분류 (이메일 도메인이나 역할로 구분)\n this.constructorFiles = allAttachments.filter(attachment =>\n [BuildingInspectionStatus.WAIT, BuildingInspectionStatus.OVERALL_WAIT, BuildingInspectionStatus.FAIL].includes(\n attachment.description\n )\n )\n\n this.supervisorFiles = allAttachments.filter(attachment =>\n [BuildingInspectionStatus.REQUEST, BuildingInspectionStatus.OVERALL_REQUEST].includes(attachment.description)\n )\n } catch (error) {\n console.error('사진 목록 로딩 중 오류 발생:', error)\n notify({ message: '사진 목록을 불러오는데 실패했습니다.', level: 'error' })\n }\n }\n\n private _isImageFile(filepath: string): boolean {\n if (!filepath) return false\n const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg']\n const extension = filepath.toLowerCase().split('.').pop()\n return imageExtensions.includes(extension || '')\n }\n\n private _getFileExtension(filepath: string): string {\n if (!filepath) return ''\n const extension = filepath.toLowerCase().split('.').pop()\n return extension || 'file'\n }\n\n private _setActiveTab(tab: PhotoTab) {\n this.activeTab = tab\n }\n\n private _openFilePreview(files: any[], startIndex: number) {\n const file = files[startIndex]\n\n if (this._isImageFile(file.fullpath)) {\n // 이미지들만 필터링해서 이미지 미리보기 팝업 열기\n const imageFiles = files.filter(f => this._isImageFile(f.fullpath))\n const imageIndex = imageFiles.findIndex(f => f.id === file.id)\n\n openPopup(\n html` <image-preview-popup .images=${imageFiles} .currentIndex=${Math.max(0, imageIndex)}></image-preview-popup> `,\n { backdrop: true, size: 'large', title: '사진 미리보기' }\n )\n } else {\n // 일반 파일은 새 탭에서 열기 또는 다운로드\n window.open(file.fullpath, '_blank')\n }\n }\n\n private _onImageError(e: Event, file: any) {\n const target = e.target as HTMLImageElement\n target.style.display = 'none'\n\n // 오류 발생 시 기본 아이콘 표시\n const container = target.parentElement!\n container.innerHTML += `\n <div style=\"display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; background-color: #f5f5f5;\">\n <md-icon style=\"--md-icon-size: 48px; color: #ccc;\">broken_image</md-icon>\n </div>\n `\n }\n\n private _formatDate(date: string | Date): string {\n const _date = new Date(date)\n\n if (isNaN(_date.getTime())) {\n return '날짜 없음'\n }\n\n const year = _date.getFullYear()\n const month = String(_date.getMonth() + 1).padStart(2, '0')\n const day = String(_date.getDate()).padStart(2, '0')\n const hours = String(_date.getHours()).padStart(2, '0')\n const minutes = String(_date.getMinutes()).padStart(2, '0')\n\n return `${year}.${month}.${day} ${hours}:${minutes}`\n }\n\n private _close() {\n history.back()\n }\n}\n"]}
|
package/dist-client/route.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export default function route(page: string): "checklist-
|
|
1
|
+
export default function route(page: string): "checklist-type-management" | "building-inspection-list" | "checklist-template-list" | "building-inspection-detail-drawing" | "building-inspection-detail-checklist" | "building-inspection-detail-camera" | "building-inspection-detail-ai-measurement" | "building-inspection-grid-detail" | undefined;
|
package/dist-client/route.js
CHANGED
|
@@ -18,6 +18,9 @@ export default function route(page) {
|
|
|
18
18
|
case 'building-inspection-detail-camera':
|
|
19
19
|
import('./pages/building-inspection/building-inspection-detail-camera');
|
|
20
20
|
return page;
|
|
21
|
+
case 'building-inspection-detail-ai-measurement':
|
|
22
|
+
import('./pages/building-inspection/building-inspection-detail-ai-measurement');
|
|
23
|
+
return page;
|
|
21
24
|
case 'building-inspection-grid-detail':
|
|
22
25
|
import('./pages/building-inspection-grid/building-inspection-grid-detail');
|
|
23
26
|
return page;
|
package/dist-client/route.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAY;IACxC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,yBAAyB;YAC5B,MAAM,CAAC,oDAAoD,CAAC,CAAA;YAC5D,OAAO,IAAI,CAAA;QAEb,KAAK,2BAA2B;YAC9B,MAAM,CAAC,sDAAsD,CAAC,CAAA;YAC9D,OAAO,IAAI,CAAA;QAEb,KAAK,0BAA0B;YAC7B,MAAM,CAAC,sDAAsD,CAAC,CAAA;YAC9D,OAAO,IAAI,CAAA;QAEb,KAAK,oCAAoC;YACvC,MAAM,CAAC,gEAAgE,CAAC,CAAA;YACxE,OAAO,IAAI,CAAA;QAEb,KAAK,sCAAsC;YACzC,MAAM,CAAC,kEAAkE,CAAC,CAAA;YAC1E,OAAO,IAAI,CAAA;QAEb,KAAK,mCAAmC;YACtC,MAAM,CAAC,+DAA+D,CAAC,CAAA;YACvE,OAAO,IAAI,CAAA;QAEb,KAAK,iCAAiC;YACpC,MAAM,CAAC,kEAAkE,CAAC,CAAA;YAC1E,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["export default function route(page: string) {\n switch (page) {\n case 'checklist-template-list':\n import('./pages/checklist-template/checklist-template-list')\n return page\n\n case 'checklist-type-management':\n import('./pages/checklist-template/checklist-type-management')\n return page\n\n case 'building-inspection-list':\n import('./pages/building-inspection/building-inspection-list')\n return page\n\n case 'building-inspection-detail-drawing':\n import('./pages/building-inspection/building-inspection-detail-drawing')\n return page\n\n case 'building-inspection-detail-checklist':\n import('./pages/building-inspection/building-inspection-detail-checklist')\n return page\n\n case 'building-inspection-detail-camera':\n import('./pages/building-inspection/building-inspection-detail-camera')\n return page\n\n case 'building-inspection-grid-detail':\n import('./pages/building-inspection-grid/building-inspection-grid-detail')\n return page\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"route.js","sourceRoot":"","sources":["../client/route.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,IAAY;IACxC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,yBAAyB;YAC5B,MAAM,CAAC,oDAAoD,CAAC,CAAA;YAC5D,OAAO,IAAI,CAAA;QAEb,KAAK,2BAA2B;YAC9B,MAAM,CAAC,sDAAsD,CAAC,CAAA;YAC9D,OAAO,IAAI,CAAA;QAEb,KAAK,0BAA0B;YAC7B,MAAM,CAAC,sDAAsD,CAAC,CAAA;YAC9D,OAAO,IAAI,CAAA;QAEb,KAAK,oCAAoC;YACvC,MAAM,CAAC,gEAAgE,CAAC,CAAA;YACxE,OAAO,IAAI,CAAA;QAEb,KAAK,sCAAsC;YACzC,MAAM,CAAC,kEAAkE,CAAC,CAAA;YAC1E,OAAO,IAAI,CAAA;QAEb,KAAK,mCAAmC;YACtC,MAAM,CAAC,+DAA+D,CAAC,CAAA;YACvE,OAAO,IAAI,CAAA;QAEb,KAAK,2CAA2C;YAC9C,MAAM,CAAC,uEAAuE,CAAC,CAAA;YAC/E,OAAO,IAAI,CAAA;QAEb,KAAK,iCAAiC;YACpC,MAAM,CAAC,kEAAkE,CAAC,CAAA;YAC1E,OAAO,IAAI,CAAA;IACf,CAAC;AACH,CAAC","sourcesContent":["export default function route(page: string) {\n switch (page) {\n case 'checklist-template-list':\n import('./pages/checklist-template/checklist-template-list')\n return page\n\n case 'checklist-type-management':\n import('./pages/checklist-template/checklist-type-management')\n return page\n\n case 'building-inspection-list':\n import('./pages/building-inspection/building-inspection-list')\n return page\n\n case 'building-inspection-detail-drawing':\n import('./pages/building-inspection/building-inspection-detail-drawing')\n return page\n\n case 'building-inspection-detail-checklist':\n import('./pages/building-inspection/building-inspection-detail-checklist')\n return page\n\n case 'building-inspection-detail-camera':\n import('./pages/building-inspection/building-inspection-detail-camera')\n return page\n\n case 'building-inspection-detail-ai-measurement':\n import('./pages/building-inspection/building-inspection-detail-ai-measurement')\n return page\n\n case 'building-inspection-grid-detail':\n import('./pages/building-inspection-grid/building-inspection-grid-detail')\n return page\n }\n}\n"]}
|