@dssp/supervision 1.0.0-alpha.92 → 1.0.0-alpha.93
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-management.d.ts +1 -0
- package/dist-client/pages/building-inspection/building-inspection-management.js +19 -4
- package/dist-client/pages/building-inspection/building-inspection-management.js.map +1 -1
- package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.js +9 -8
- package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.js.map +1 -1
- package/dist-client/pages/building-inspection/component/field-document/field-document-popup.d.ts +3 -0
- package/dist-client/pages/building-inspection/component/field-document/field-document-popup.js +86 -23
- package/dist-client/pages/building-inspection/component/field-document/field-document-popup.js.map +1 -1
- package/dist-client/pages/checklist/checklist-view.d.ts +1 -0
- package/dist-client/pages/checklist/checklist-view.js +12 -68
- package/dist-client/pages/checklist/checklist-view.js.map +1 -1
- package/dist-client/pages/checklist/kcs-criteria-popup.d.ts +15 -0
- package/dist-client/pages/checklist/kcs-criteria-popup.js +174 -0
- package/dist-client/pages/checklist/kcs-criteria-popup.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/field-document/field-document-mutation.js +8 -5
- package/dist-server/service/field-document/field-document-mutation.js.map +1 -1
- package/dist-server/service/field-document/field-document-summary-service.d.ts +8 -0
- package/dist-server/service/field-document/field-document-summary-service.js +44 -20
- package/dist-server/service/field-document/field-document-summary-service.js.map +1 -1
- package/dist-server/service/field-document/field-document-type.d.ts +1 -0
- package/dist-server/service/field-document/field-document-type.js +4 -0
- package/dist-server/service/field-document/field-document-type.js.map +1 -1
- package/dist-server/service/project-checklist/spec-matching-service.js +9 -3
- package/dist-server/service/project-checklist/spec-matching-service.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
|
@@ -69,6 +69,7 @@ export declare class BuildingInspectionManagement extends BuildingInspectionMana
|
|
|
69
69
|
private _openDailyWorklogPopup;
|
|
70
70
|
private _deleteInspections;
|
|
71
71
|
private _openCreateInspection;
|
|
72
|
+
private _refreshByScope;
|
|
72
73
|
private _openFieldDocuments;
|
|
73
74
|
private _openDrawingPopup;
|
|
74
75
|
private _openInspectionRequestDocument;
|
|
@@ -468,6 +468,8 @@ let BuildingInspectionManagement = class BuildingInspectionManagement extends Sc
|
|
|
468
468
|
}
|
|
469
469
|
async _getBuilding(buildingId = '') {
|
|
470
470
|
var _a;
|
|
471
|
+
if (!buildingId)
|
|
472
|
+
return; // 동 미선택(프로젝트 모드) 시 빈 id로 쿼리하지 않음
|
|
471
473
|
const response = await client.query({
|
|
472
474
|
query: gql `
|
|
473
475
|
query Building($id: String!) {
|
|
@@ -589,6 +591,8 @@ let BuildingInspectionManagement = class BuildingInspectionManagement extends Sc
|
|
|
589
591
|
}
|
|
590
592
|
async _initBuildingLevel(buildingLevelId) {
|
|
591
593
|
var _a;
|
|
594
|
+
if (!buildingLevelId)
|
|
595
|
+
return; // 층 미선택 시 빈 id로 쿼리하지 않음
|
|
592
596
|
const response = await client.query({
|
|
593
597
|
query: gql `
|
|
594
598
|
query BuildingInspectionSummaryOfBuildingLevel($buildingLevelId: String!) {
|
|
@@ -891,13 +895,24 @@ let BuildingInspectionManagement = class BuildingInspectionManagement extends Sc
|
|
|
891
895
|
.projectId=${this.project.id}
|
|
892
896
|
.selectedBuildingId=${this.selectedBuilding.id}
|
|
893
897
|
.selectedBuildingLevelId=${this.buildingLevelId}
|
|
894
|
-
@requestRefresh="${() =>
|
|
895
|
-
this._initBuildingLevel(this.buildingLevelId);
|
|
896
|
-
this._getBuilding(this.selectedBuilding.id);
|
|
897
|
-
}}"
|
|
898
|
+
@requestRefresh="${() => this._refreshByScope()}"
|
|
898
899
|
></inspection-with-checklist-create-popup>
|
|
899
900
|
`, { backdrop: true, size: 'large', title: '검측 등록' });
|
|
900
901
|
}
|
|
902
|
+
// 현재 스코프(프로젝트/동/층)에 맞춰 검측 현황·달력·목록을 갱신
|
|
903
|
+
async _refreshByScope() {
|
|
904
|
+
if (this.buildingLevelId) {
|
|
905
|
+
await this._getBuilding(this.selectedBuilding.id);
|
|
906
|
+
await this._initBuildingLevel(this.buildingLevelId);
|
|
907
|
+
}
|
|
908
|
+
else if (this._isBuildingMode) {
|
|
909
|
+
await this._getBuilding(this.selectedBuilding.id);
|
|
910
|
+
await this._initBuildingData(this.selectedBuilding.id);
|
|
911
|
+
}
|
|
912
|
+
else {
|
|
913
|
+
await this._initProjectLevel();
|
|
914
|
+
}
|
|
915
|
+
}
|
|
901
916
|
_openFieldDocuments() {
|
|
902
917
|
openPopup(html `<field-document-popup .projectId=${this.projectId}></field-document-popup>`, {
|
|
903
918
|
backdrop: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"building-inspection-management.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-management.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/elevated-button.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\nimport '@operato/image-marker/ox-image-marker-view.js'\nimport '@operato/input/ox-select-floor.js'\nimport '@operato/data-grist'\nimport '@operato/event-view/ox-event-view.js'\nimport './inspection-create-popup'\nimport './inspection-with-checklist-create-popup'\nimport './component/daily-worklog-popup'\nimport './component/inspection-document/photo-album-popup'\nimport './component/inspection-document/inspection-request-document'\nimport './component/inspection-document/inspection-result-notification'\nimport './component/image-preview-popup'\nimport './component/field-document/field-document-popup'\n\nimport { CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageView, navigate } from '@operato/shell'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { css, html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { notify, openPopup } from '@operato/layout'\nimport gql from 'graphql-tag'\nimport moment from 'moment-timezone'\n\nimport {\n BuildingInspectionStatus,\n BUILDING_INSPECTION_STATUS_DISPLAY,\n BUILDING_INSPECTION_RE_STATUS_DISPLAY\n} from './building-inspection-list'\nimport { InspectionEventProvider } from './component/inspection-event-provider'\nimport { EventProvider } from '@operato/event-view'\nimport { DailyWorklogMode } from './component/daily-worklog-popup'\nimport '../checklist/checklist-view'\nimport { ChecklistMode } from '../checklist/checklist-view'\nimport { getBuildingInspectionForChecklist } from '../../graphql/building-inspection'\nimport { InspectionMode } from './component/inspection-document/inspection-request-document'\nimport { DrawingImageProvider } from '@dssp/drawing/dist-client/drawing-management/drawing-image-provider.js'\n\n@customElement('building-inspection-management')\nexport class BuildingInspectionManagement extends ScopedElementsMixin(PageView) {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 55px 1fr;\n color: #4e5055;\n\n width: 100%;\n height: 100%;\n background-color: var(--md-sys-color-background, #f6f6f6);\n overflow: hidden;\n }\n\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\n md-filled-button[green] {\n --md-filled-button-container-color: #008000;\n }\n\n md-outlined-button {\n --md-outlined-button-container-height: 30px;\n --md-outlined-button-trailing-space: var(--spacing-medium, 8px);\n --md-outlined-button-leading-space: var(--spacing-medium, 8px);\n --md-sys-color-outline: rgba(51, 51, 51, 0.2);\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[header] div[button-container] {\n display: flex;\n align-items: center;\n justify-content: end;\n flex: 0.5;\n }\n\n div[body] {\n display: grid;\n grid-template-columns: 4fr 6fr;\n margin: var(--spacing-large, 12px);\n margin-top: 0;\n gap: var(--spacing-medium, 8px);\n overflow: hidden;\n }\n\n h3 {\n color: #2e79be;\n font-size: 16px;\n margin: 0px;\n }\n\n div[body] > div {\n display: flex;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-large, 12px);\n border-radius: 5px;\n }\n\n div[left] {\n flex-direction: column;\n background-color: var(--md-sys-color-on-primary);\n border: 1px solid #cccccc80;\n overflow-y: auto;\n }\n\n div[subject] {\n margin-bottom: var(--spacing-small, 4px);\n }\n\n div[building-container] {\n display: block;\n\n & > * {\n margin-right: var(--spacing-medium, 8px);\n margin-bottom: var(--spacing-medium, 8px);\n }\n }\n\n div[right] {\n height: auto;\n overflow-x: hidden;\n overflow-y: auto;\n flex-direction: column;\n position: relative;\n }\n\n ox-select-floor {\n width: 100%;\n align-content: flex-end;\n\n --ox-select-floor-rotate-x: 60deg;\n --ox-select-floor-rotate-x-active: 30deg;\n --ox-select-floor-perspective: 1200px;\n\n user-select: none;\n overflow-y: auto;\n flex: 1;\n }\n\n div[status] {\n display: flex;\n position: absolute;\n right: 0px;\n bottom: 0px;\n align-items: center;\n z-index: 2;\n right: 3%;\n }\n\n div[status] > div[content] {\n display: flex;\n background-color: #4e5055;\n color: #fff;\n padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n border-radius: 5px;\n gap: var(--spacing-medium, 8px);\n font-size: 14px;\n }\n\n div[status] span {\n display: flex;\n align-items: center;\n width: 40px;\n font-weight: bold;\n }\n\n div[status] md-icon {\n width: 16px;\n height: 16px;\n margin-right: var(--spacing-small, 4px);\n border-radius: 5px;\n font-size: 16px;\n font-weight: 700;\n }\n div[status] md-icon[wait] {\n background-color: #f7f7f7;\n color: #4e5055;\n }\n div[status] md-icon[request] {\n background-color: #f7f7f7;\n color: #4e5055;\n }\n div[status] md-icon[pass] {\n background-color: #4bbb4a;\n }\n div[status] md-icon[fail] {\n background-color: #ff4444;\n }\n\n span[name] {\n color: #4e5055;\n margin-left: var(--spacing-small, 4px);\n padding: var(--spacing-tiny, 2px) var(--spacing-small, 4px);\n }\n\n span[name][active] {\n color: var(--md-sys-color-on-error);\n background-color: var(--md-sys-color-error);\n border-radius: 5px;\n opacity: 0.7;\n }\n\n /* 오른쪽 패널 */\n div[right-panel] {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n div[scope-header] {\n display: flex;\n align-items: center;\n gap: var(--spacing-medium, 8px);\n margin-bottom: var(--spacing-small, 4px);\n\n h3 {\n margin: 0;\n }\n\n span[scope-label] {\n font-size: 12px;\n color: #888;\n background: #f0f0f0;\n padding: 2px 8px;\n border-radius: 4px;\n }\n }\n\n div[inspection-container] {\n gap: var(--spacing-medium, 8px);\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n\n div[inspection] {\n display: grid;\n grid-template-columns: 90px 1fr 1fr 1fr 1fr 1fr;\n background: #ebc8321a;\n border-radius: 5px;\n padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n\n & > div {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n span::before {\n display: inline-block;\n position: relative;\n content: '';\n width: 10px;\n height: 10px;\n border-radius: 6px;\n top: -1px;\n margin-right: 2px;\n }\n\n span[status='wait']::before {\n background-color: #4e5055;\n }\n span[status='request']::before {\n background-color: #2e79be;\n }\n span[status='pass']::before {\n background-color: #1bb401;\n }\n span[status='fail']::before {\n background-color: #ff4444;\n }\n span[status='re-wait']::before {\n background-color: #e89c0e;\n }\n }\n & > div[name] {\n flex-direction: row;\n text-align: right;\n gap: var(--spacing-small, 4px);\n padding-right: var(--spacing-large, 12px);\n border-right: 2px dotted #ccc;\n max-width: 100%;\n line-height: 1.3;\n\n md-icon {\n width: 40px;\n height: 40px;\n border-radius: 5px;\n color: #fff;\n background: #f16154;\n }\n }\n }\n }\n\n div[view-toggle] {\n display: flex;\n justify-content: flex-end;\n gap: var(--spacing-small, 4px);\n\n md-icon {\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n font-size: 24px;\n }\n\n md-icon[active] {\n background-color: #0595e5;\n color: white;\n }\n }\n\n ox-event-view {\n flex: 1;\n overflow-y: auto;\n --calendar-monthly-date-min-height: 50px;\n height: 100%;\n }\n\n div[calendar-wrapper] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n div[list-wrapper] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n div[action-buttons] {\n flex-shrink: 0;\n }\n\n div[list-view] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n overflow-y: auto;\n flex: 1;\n }\n\n div[list-section] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n\n h3[section-title] {\n color: #e15757;\n font-size: 14px;\n margin: 0;\n }\n\n h3[section-title][blue] {\n color: #3395f1;\n }\n\n h3[section-title][green] {\n color: #1bb401;\n }\n }\n\n ox-grist {\n padding: 0px 16px 10px;\n }\n\n div[action-buttons] {\n display: flex;\n justify-content: center;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) 0;\n\n md-filled-button {\n --md-filled-button-container-height: 40px;\n --md-filled-button-trailing-space: 20px;\n --md-filled-button-leading-space: 20px;\n }\n\n md-filled-button[green] {\n --md-filled-button-container-color: #008000;\n }\n\n md-filled-button[red] {\n --md-filled-button-container-color: #e15757;\n }\n\n md-filled-button[navy] {\n --md-filled-button-container-color: #3f71a0;\n }\n\n md-filled-button[navy-light] {\n --md-filled-button-container-color: #2e8b8b;\n }\n }\n `\n ]\n\n get context() {\n return {\n title: this.project?.name ? `업무 대시보드 - ${this.project.name}` : '업무 대시보드'\n }\n }\n\n // 동 미선택 시 프로젝트 전체 데이터 모드\n get _isProjectMode(): boolean {\n return !this.selectedBuilding?.id\n }\n\n // 동 선택 + 층 미선택 시 동 전체 데이터 모드\n get _isBuildingMode(): boolean {\n return !!this.selectedBuilding?.id && !this.buildingLevelId\n }\n\n // 현재 데이터 스코프 표시 라벨\n get _scopeLabel(): string {\n if (this.buildingLevelId) {\n const level = this.building?.buildingLevels?.find(l => l.id === this.buildingLevelId)\n return `${this.selectedBuilding?.name || ''} ${level?.floorDisplayName || ''}층`\n }\n if (this.selectedBuilding?.id) {\n return `${this.selectedBuilding.name} 전체`\n }\n return '프로젝트 전체'\n }\n\n private defaultProject = {\n name: '',\n buildingComplex: {\n buildings: []\n }\n }\n\n @state() projectId: string = ''\n @state() project: any = { ...this.defaultProject }\n @state() selectedBuilding: any = {}\n @state() building: any = {}\n @state() currentFloor: number = 1\n\n @state() buildingLevelId: string = ''\n @state() buildingInspectionSummary: any = {}\n @state() calendarData?: EventProvider\n @state() selectedYearMonth: string = moment().tz('Asia/Seoul').format('YYYY-MM')\n @state() selectedDate?: string = moment().tz('Asia/Seoul').format('YYYY-MM-DD')\n @state() dailyWorklog: any = {}\n\n @state() viewMode: 'calendar' | 'list' = 'calendar'\n @state() gristConfig: any\n\n @query('div[left]') private leftPanel!: HTMLElement\n @query('ox-grist[section=\"wait-fail\"]') private gristWaitFail!: DataGrist\n @query('ox-grist[section=\"request\"]') private gristRequest!: DataGrist\n @query('ox-grist[section=\"pass\"]') private gristPass!: DataGrist\n @query('ox-event-view') private eventView!: HTMLElement\n\n render() {\n const cards =\n this.building?.buildingLevels?.map(({ mainDrawingImage, floor }) => {\n return {\n image: mainDrawingImage || '/assets/images/img-drawing-default.png',\n name: floor\n }\n }) || []\n\n return html`\n <div header>\n <h2>\n <md-icon slot=\"icon\" back @click=${() => history.back()}>arrow_back</md-icon>\n 업무 대시보드\n </h2>\n </div>\n\n <div body>\n <div left>\n <div>\n <div subject bold>개별 단지 상세정보 바로가기</div>\n <div building-container>\n ${this.project.buildingComplex?.buildings?.map(building => {\n return this.selectedBuilding.id === building.id\n ? html`\n <md-filled-button @click=${() => this._onClickBuilding(building)}> ${building.name} </md-filled-button>\n `\n : html`\n <md-outlined-button @click=${() => this._onClickBuilding(building)}> ${building.name} </md-outlined-button>\n `\n })}\n </div>\n </div>\n\n <ox-select-floor\n .cards=${cards}\n .bottomLimit=${70}\n .interval=${50}\n @change=${(e: CustomEvent) => {\n this.currentFloor = e.detail\n }}\n >\n ${this.building?.buildingLevels?.map(({ id, floor, floorDisplayName, inspectionSummary }, idx) => {\n return html`\n <div slot=\"template-${idx}\" @click=${() => this._onSelectFloor(id)} style=\"cursor: pointer;\">\n <div status>\n <div content>\n <span><md-icon wait slot=\"icon\">frame_inspect</md-icon>${inspectionSummary.wait}</span>\n <span><md-icon request slot=\"icon\">exclamation</md-icon>${inspectionSummary.request}</span>\n <span><md-icon pass slot=\"icon\">check</md-icon>${inspectionSummary.pass}</span>\n <span><md-icon fail slot=\"icon\">close</md-icon>${inspectionSummary.fail}</span>\n </div>\n <span name ?active=${this.currentFloor == floor}>${floorDisplayName}층</span>\n </div>\n </div>\n `\n })}\n </ox-select-floor>\n </div>\n\n <div right-panel>\n ${this.buildingLevelId || this._isBuildingMode || this._isProjectMode\n ? html`\n <div inspection-container>\n <div scope-header>\n <h3>검측 현황</h3>\n <span scope-label>${this._scopeLabel}</span>\n </div>\n <div inspection>\n <div name bold>\n <md-icon slot=\"icon\">fact_check</md-icon>\n 검측 현황\n </div>\n\n <div>\n <label>${BUILDING_INSPECTION_STATUS_DISPLAY[BuildingInspectionStatus.WAIT]}</label>\n <span bold status=\"wait\"> ${this.buildingInspectionSummary.wait}</span>\n </div>\n <div>\n <label>${BUILDING_INSPECTION_STATUS_DISPLAY[BuildingInspectionStatus.REQUEST]}</label>\n <span bold status=\"request\"> ${this.buildingInspectionSummary.request}</span>\n </div>\n <div>\n <label>${BUILDING_INSPECTION_STATUS_DISPLAY[BuildingInspectionStatus.FAIL]}</label>\n <span bold status=\"fail\"> ${this.buildingInspectionSummary.fail}</span>\n </div>\n <div>\n <label>재검측 대기</label>\n <span bold status=\"re-wait\"> ${this.buildingInspectionSummary.reWait}</span>\n </div>\n <div>\n <label>${BUILDING_INSPECTION_STATUS_DISPLAY[BuildingInspectionStatus.PASS]}</label>\n <span bold status=\"pass\"> ${this.buildingInspectionSummary.pass}</span>\n </div>\n </div>\n\n <div view-toggle>\n <md-icon ?active=${this.viewMode === 'calendar'} @click=${() => this._setViewMode('calendar')}>\n calendar_month\n </md-icon>\n <md-icon ?active=${this.viewMode === 'list'} @click=${() => this._setViewMode('list')}> view_list </md-icon>\n </div>\n\n <div calendar-wrapper style=\"display:${this.viewMode === 'calendar' ? 'block' : 'none'}\">\n <ox-event-view\n .mode=${'monthly'}\n .eventProvider=${this.calendarData}\n @select-date=${(e: CustomEvent) => {\n this.selectedDate = moment(e.detail[0]).format('YYYY-MM-DD')\n this._fetchDailyWorklog(this.selectedDate)\n }}\n @change-month=${(e: CustomEvent) => {\n const year = e.detail.year\n const month = e.detail?.month?.toString()?.padStart(2, '0')\n this.selectedYearMonth = `${year}-${month}`\n this._refreshListGrists()\n }}\n @open-worklog=${(e: CustomEvent) => {\n this._openWorklogForDate(e.detail.date)\n }}\n ></ox-event-view>\n </div>\n <div list-wrapper style=\"display:${this.viewMode === 'list' ? 'block' : 'none'}\">\n <div list-view>\n <div list-section>\n <h3 section-title>작업 완료 / 조치 필요</h3>\n <ox-grist\n section=\"wait-fail\"\n .mode=${'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this._fetchWaitFail.bind(this)}\n ></ox-grist>\n </div>\n <div list-section>\n <h3 section-title blue>감리 / 재검측 대기</h3>\n <ox-grist\n section=\"request\"\n .mode=${'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this._fetchRequest.bind(this)}\n ></ox-grist>\n </div>\n <div list-section>\n <h3 section-title green>검측 완료</h3>\n <ox-grist\n section=\"pass\"\n .mode=${'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this._fetchPass.bind(this)}\n ></ox-grist>\n </div>\n </div>\n </div>\n </div>\n\n <div action-buttons>\n <md-filled-button navy @click=${this._openFieldDocuments}>\n <md-icon slot=\"icon\">search</md-icon>현장 문서 확인\n </md-filled-button>\n <div style=\"flex:1\"></div>\n ${this.viewMode === 'calendar'\n ? this.dailyWorklog.id\n ? html`<md-filled-button green @click=${this._openDailyWorklogPopup}>\n <md-icon slot=\"icon\">edit</md-icon>일일 업무일지 수정\n </md-filled-button>`\n : html`<md-filled-button @click=${this._openDailyWorklogPopup}>\n <md-icon slot=\"icon\">note_add</md-icon>일일 업무일지 작성\n </md-filled-button>`\n : ''}\n ${this.viewMode === 'list'\n ? html`<md-filled-button red @click=${this._deleteInspections}>\n <md-icon slot=\"icon\">delete</md-icon>검측 삭제\n </md-filled-button>`\n : ''}\n <md-filled-button navy-light @click=${this._openCreateInspection}>\n <md-icon slot=\"icon\">check_circle</md-icon>검측 등록\n </md-filled-button>\n </div>\n `\n : html`\n <div style=\"display:flex;align-items:center;justify-content:center;flex:1;color:#999;\">\n 층을 선택하면 작업 현황이 표시됩니다.\n </div>\n `}\n </div>\n </div>\n `\n }\n\n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties)\n // ox-grist shadow DOM 내부 #wrap의 overflow를 제어\n this.renderRoot?.querySelectorAll('ox-grist').forEach(grist => {\n const oxGrid = grist.shadowRoot?.querySelector('ox-grid')\n const gridBody = oxGrid?.shadowRoot?.querySelector('ox-grid-body') as HTMLElement\n if (gridBody) {\n gridBody.style.maxHeight = '150px'\n }\n })\n }\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this.projectId = lifecycle.resourceId || ''\n await this._initProject(this.projectId)\n }\n }\n\n async pageInitialized(lifecycle: any) {\n this.gristConfig = {\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'open_in_new',\n header: '상세보기',\n width: 60,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n navigate(`building-inspection-detail-drawing/${record.id}`)\n }\n }\n },\n {\n type: 'string',\n name: 'id',\n hidden: true\n },\n {\n type: 'string',\n name: 'statusDisplay',\n header: '검측 상태',\n record: { align: 'center' },\n width: 100\n },\n {\n type: 'string',\n name: 'location',\n header: '위치',\n width: 130\n },\n {\n type: 'string',\n name: 'constructionType',\n header: '공종',\n width: 120\n },\n {\n type: 'string',\n name: 'inspectionParts',\n header: '검측 부위',\n record: {\n renderer: value => value?.join(', ') || ''\n },\n width: 200\n },\n {\n type: 'string',\n name: 'createdDate',\n header: '검측 등록일시',\n width: 110\n },\n {\n type: 'string',\n name: 'requestDate',\n header: '검측 요청일시',\n width: 150\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'fact_check',\n header: '도면',\n width: 50,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this._openDrawingPopup(record)\n }\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'edit_square',\n header: '요청서/결과통보',\n width: 100,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this._openInspectionRequestDocument(record.id)\n }\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'task',\n header: '체크리스트',\n width: 70,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this._openChecklistPopup(record.id)\n }\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'photo_camera',\n header: '사진대지',\n width: 60,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this._openPhotoAlbumPopup(record.checklistId)\n }\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'engineering',\n header: '실명부',\n width: 50,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this._showNameListPreview(record)\n }\n }\n }\n ],\n rows: {\n selectable: {\n multiple: true\n },\n appendable: false\n },\n sorters: [{ name: 'requestDate' }]\n }\n }\n\n private async _initProject(projectId: string = '') {\n const response = await client.query({\n query: gql`\n query Project($id: String!) {\n project(id: $id) {\n id\n name\n projectType\n mainPhoto {\n fullpath\n }\n buildingComplex {\n id\n drawing {\n id\n name\n fullpath\n }\n buildings {\n id\n name\n drawing {\n id\n name\n fullpath\n }\n }\n }\n }\n }\n `,\n variables: {\n id: projectId\n }\n })\n\n if (response.errors) return\n\n this.project = response.data?.project\n this.updateContext()\n\n // 동 미선택 상태 → 프로젝트 전체 데이터 로드\n this.selectedBuilding = {}\n this.building = {}\n this.buildingLevelId = ''\n await this._initProjectLevel()\n }\n\n private async _getBuilding(buildingId: string = '') {\n const response = await client.query({\n query: gql`\n query Building($id: String!) {\n building(id: $id) {\n id\n buildingLevels {\n id\n floor\n floorDisplayName\n mainDrawing {\n id\n name\n fullpath\n }\n mainDrawingImage\n inspectionSummary {\n wait\n request\n pass\n fail\n }\n }\n }\n }\n `,\n variables: {\n id: buildingId\n }\n })\n\n if (response.errors) return\n\n this.building = response.data?.building\n\n // 왼쪽 패널 스크롤을 맨 아래로\n await this.updateComplete\n if (this.leftPanel) {\n this.leftPanel.scrollTop = this.leftPanel.scrollHeight\n }\n }\n\n private async _onClickBuilding(building) {\n if (this.selectedBuilding?.id === building.id) {\n // 토글: 이미 선택된 동 클릭 시 해제 → 프로젝트 전체 데이터\n this.selectedBuilding = {}\n this.building = {}\n this.buildingLevelId = ''\n this.currentFloor = 0\n await this._initProjectLevel()\n return\n }\n this.selectedBuilding = { ...building }\n this.buildingLevelId = ''\n this.buildingInspectionSummary = {}\n await this._getBuilding(this.selectedBuilding.id)\n await this._initBuildingData(this.selectedBuilding.id)\n }\n\n private async _onSelectFloor(levelId: string) {\n this.buildingLevelId = levelId\n await this._initBuildingLevel(levelId)\n }\n\n private async _initProjectLevel() {\n if (!this.projectId) return\n\n // 프로젝트 전체 검측 현황 조회\n const response = await client.query({\n query: gql`\n query BuildingInspectionSummaryOfProject($projectId: String!) {\n buildingInspectionSummaryOfProject(projectId: $projectId) {\n wait\n request\n pass\n fail\n reWait\n }\n }\n `,\n variables: { projectId: this.projectId }\n })\n\n if (response.errors) return\n\n this.buildingInspectionSummary = response.data?.buildingInspectionSummaryOfProject\n\n // 달력 데이터 생성 (프로젝트 레벨 - buildingLevelId 없이)\n this.calendarData = new InspectionEventProvider('', this.projectId)\n\n await this.updateComplete\n\n // 일일 업무일지 조회\n await this._fetchDailyWorklog(this.selectedDate)\n\n // 목록 모드일 경우 그리스트 갱신\n this._refreshListGrists()\n }\n\n private async _initBuildingData(buildingId: string) {\n if (!buildingId) return\n\n // 동 전체 검측 현황 조회\n const response = await client.query({\n query: gql`\n query BuildingInspectionSummaryOfBuilding($buildingId: String!) {\n buildingInspectionSummaryOfBuilding(buildingId: $buildingId) {\n wait\n request\n pass\n fail\n reWait\n }\n }\n `,\n variables: { buildingId }\n })\n\n if (response.errors) return\n\n this.buildingInspectionSummary = response.data?.buildingInspectionSummaryOfBuilding\n\n // 달력 데이터 생성 (동 레벨)\n this.calendarData = new InspectionEventProvider('', this.projectId, buildingId)\n\n await this.updateComplete\n\n // 일일 업무일지 조회\n await this._fetchDailyWorklog(this.selectedDate)\n\n // 목록 모드일 경우 그리스트 갱신\n this._refreshListGrists()\n }\n\n private async _initBuildingLevel(buildingLevelId: string) {\n const response = await client.query({\n query: gql`\n query BuildingInspectionSummaryOfBuildingLevel($buildingLevelId: String!) {\n buildingInspectionSummaryOfBuildingLevel(buildingLevelId: $buildingLevelId) {\n wait\n request\n pass\n fail\n reWait\n }\n }\n `,\n variables: {\n buildingLevelId\n }\n })\n\n if (response.errors) return\n\n this.buildingInspectionSummary = response.data?.buildingInspectionSummaryOfBuildingLevel\n\n // 달력 데이터 생성\n this.calendarData = new InspectionEventProvider(buildingLevelId, this.project.id)\n\n // 달력 최소 높이 속성 수정\n await this.updateComplete\n\n // 일일 업무일지 조회\n await this._fetchDailyWorklog(this.selectedDate)\n\n // 목록 모드일 경우 그리스트 갱신\n this._refreshListGrists()\n }\n\n private async _fetchInspectionsByStatus(\n statuses: string[],\n { page = 1, limit = 100 }: FetchOption,\n extraFilter?: (item: any) => boolean\n ) {\n if (!this.buildingLevelId && !this._isBuildingMode && !this._isProjectMode) return { total: 0, records: [] }\n if ((this._isProjectMode || this._isBuildingMode) && !this.projectId) return { total: 0, records: [] }\n\n let items: any[]\n\n if (this.buildingLevelId) {\n // 층 레벨 조회\n const response = await client.query({\n query: gql`\n query BuildingInspectionsOfBuildingLevel($params: BuildingInspectionsOfBuildingLevel!) {\n buildingInspectionsOfBuildingLevel(params: $params) {\n items {\n id\n status\n failCount\n requestDate\n createdAt\n\n checklist {\n checklistId: id\n name\n constructionType\n constructionDetailType\n location\n inspectionParts\n inspectionDrawingType\n\n nameListAttachment {\n id\n name\n fullpath\n }\n }\n drawingMarker\n }\n total\n }\n }\n `,\n variables: {\n params: {\n buildingLevelId: this.buildingLevelId,\n limit: 0\n }\n }\n })\n items = response.data?.buildingInspectionsOfBuildingLevel?.items || []\n } else if (this._isBuildingMode) {\n // 동 레벨 조회\n const response = await client.query({\n query: gql`\n query BuildingInspectionsOfBuilding($params: BuildingInspectionsOfBuilding!) {\n buildingInspectionsOfBuilding(params: $params) {\n items {\n id\n status\n failCount\n requestDate\n createdAt\n\n checklist {\n checklistId: id\n name\n constructionType\n constructionDetailType\n location\n inspectionParts\n inspectionDrawingType\n\n nameListAttachment {\n id\n name\n fullpath\n }\n }\n drawingMarker\n }\n total\n }\n }\n `,\n variables: {\n params: {\n buildingId: this.selectedBuilding.id,\n limit: 0\n }\n }\n })\n items = response.data?.buildingInspectionsOfBuilding?.items || []\n } else {\n // 프로젝트 레벨 조회 (동 미선택 시)\n const response = await client.query({\n query: gql`\n query BuildingInspectionsOfProject($params: BuildingInspectionsOfProject!) {\n buildingInspectionsOfProject(params: $params) {\n items {\n id\n status\n failCount\n requestDate\n createdAt\n\n checklist {\n checklistId: id\n name\n constructionType\n constructionDetailType\n location\n inspectionParts\n inspectionDrawingType\n\n nameListAttachment {\n id\n name\n fullpath\n }\n }\n drawingMarker\n }\n total\n }\n }\n `,\n variables: {\n params: {\n projectId: this.projectId,\n limit: 0\n }\n }\n })\n items = response.data?.buildingInspectionsOfProject?.items || []\n }\n\n // 상태별 필터링\n items = items.filter(item => statuses.includes(item.status))\n\n if (extraFilter) {\n items = items.filter(extraFilter)\n }\n\n items = items.map(item => ({\n ...item,\n ...item.checklist,\n statusDisplay: (item.failCount > 0 ? BUILDING_INSPECTION_RE_STATUS_DISPLAY : BUILDING_INSPECTION_STATUS_DISPLAY)[\n item.status\n ],\n createdDate: this._formatDate(item.createdAt),\n requestDate: this._formatDateTime(item.requestDate)\n }))\n\n return {\n total: items.length,\n records: items\n }\n }\n\n private async _fetchWaitFail(options: FetchOption) {\n return this._fetchInspectionsByStatus(\n [BuildingInspectionStatus.WAIT, BuildingInspectionStatus.OVERALL_WAIT, BuildingInspectionStatus.FAIL],\n options,\n // 재검측 대기(failCount > 0인 WAIT) 제외\n item =>\n !(\n (item.status === BuildingInspectionStatus.WAIT || item.status === BuildingInspectionStatus.OVERALL_WAIT) &&\n (item.failCount || 0) > 0\n )\n )\n }\n\n private async _fetchRequest(options: FetchOption) {\n return this._fetchInspectionsByStatus(\n [\n BuildingInspectionStatus.REQUEST,\n BuildingInspectionStatus.OVERALL_REQUEST,\n BuildingInspectionStatus.WAIT,\n BuildingInspectionStatus.OVERALL_WAIT\n ],\n options,\n // REQUEST/OVERALL_REQUEST 전체 + 재검측 대기(failCount > 0인 WAIT)만\n item =>\n item.status === BuildingInspectionStatus.REQUEST ||\n item.status === BuildingInspectionStatus.OVERALL_REQUEST ||\n ((item.status === BuildingInspectionStatus.WAIT || item.status === BuildingInspectionStatus.OVERALL_WAIT) &&\n (item.failCount || 0) > 0)\n )\n }\n\n private async _fetchPass(options: FetchOption) {\n return this._fetchInspectionsByStatus([BuildingInspectionStatus.PASS], options)\n }\n\n private _setViewMode(mode: 'calendar' | 'list') {\n this.viewMode = mode\n\n if (mode === 'list') {\n this.updateComplete.then(() => this._refreshListGrists())\n }\n }\n\n private _refreshListGrists() {\n if (this.viewMode === 'list') {\n this.updateComplete.then(() => {\n this.gristWaitFail?.fetch()\n this.gristRequest?.fetch()\n this.gristPass?.fetch()\n })\n }\n }\n\n private _formatDateTime(date: Date | string | number | undefined) {\n if (!date) return ''\n try {\n const parsed = typeof date === 'string' && /^\\d+$/.test(date) ? new Date(Number(date)) : new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n }).format(parsed)\n } catch {\n return ''\n }\n }\n\n private _formatDate(date: Date | string | number | undefined) {\n if (!date) return ''\n try {\n const parsed = typeof date === 'string' && /^\\d+$/.test(date) ? new Date(Number(date)) : new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).format(parsed)\n } catch {\n return ''\n }\n }\n\n private async _openWorklogForDate(date: string) {\n this.selectedDate = date\n await this._fetchDailyWorklog(date)\n this._openDailyWorklogPopup()\n }\n\n private _openDailyWorklogPopup() {\n const date = this.selectedDate\n\n openPopup(\n html`<daily-worklog-popup\n .project=${this.project}\n .date=${date}\n .dailyWorklog=${this.dailyWorklog}\n .mode=${this.dailyWorklog.id ? DailyWorklogMode.EDIT : DailyWorklogMode.CREATE}\n @createdDailyWorklog=${this._refreshCalendar.bind(this)}\n @updatedDailyWorklog=${() => this._fetchDailyWorklog(this.selectedDate)}\n ></daily-worklog-popup>`,\n {\n backdrop: true,\n size: 'large',\n title: '일일 업무일지 작성'\n }\n )\n }\n\n private async _deleteInspections() {\n const allSelected = [\n ...(this.gristWaitFail?.selected || []),\n ...(this.gristRequest?.selected || []),\n ...(this.gristPass?.selected || [])\n ]\n const ids = allSelected.map(record => record.id)\n\n if (!ids.length) {\n notify({ message: '삭제할 항목을 선택해주세요.', level: 'info' })\n return\n }\n\n if (confirm('삭제하시겠습니까?')) {\n const response = await client.mutate({\n mutation: gql`\n mutation ($ids: [String!]!) {\n deleteBuildingInspections(ids: $ids)\n }\n `,\n variables: { ids }\n })\n\n if (!response.errors) {\n this._refreshListGrists()\n this._initBuildingLevel(this.buildingLevelId)\n notify({ message: '삭제되었습니다.' })\n }\n }\n }\n\n private _openCreateInspection() {\n openPopup(\n html`\n <inspection-with-checklist-create-popup\n .projectId=${this.project.id}\n .selectedBuildingId=${this.selectedBuilding.id}\n .selectedBuildingLevelId=${this.buildingLevelId}\n @requestRefresh=\"${() => {\n this._initBuildingLevel(this.buildingLevelId)\n this._getBuilding(this.selectedBuilding.id)\n }}\"\n ></inspection-with-checklist-create-popup>\n `,\n { backdrop: true, size: 'large', title: '검측 등록' }\n )\n }\n\n private _openFieldDocuments() {\n openPopup(html`<field-document-popup .projectId=${this.projectId}></field-document-popup>`, {\n backdrop: true,\n size: 'full',\n title: '현장 문서 확인'\n })\n }\n\n private async _openDrawingPopup(buildingInspection: any) {\n const drawingImageProvider: DrawingImageProvider = new DrawingImageProvider()\n const inspectionDrawingType = buildingInspection.inspectionDrawingType\n\n const drawingShapes = JSON.parse(buildingInspection?.drawingMarker || null) || []\n const markers = await drawingImageProvider.getMarkers(inspectionDrawingType)\n\n const imageUrl = String(inspectionDrawingType).normalize('NFC')\n const shapes = [...drawingShapes, ...markers]\n\n openPopup(\n html`<ox-image-marker-view\n style=\"pointer-events: none;\"\n id=\"image-marker\"\n .imageUrl=${imageUrl}\n .shapes=${shapes}\n .imageProvider=${drawingImageProvider}\n ></ox-image-marker-view>`,\n { backdrop: true, size: 'large', title: '검측 도면' }\n )\n }\n\n private async _openInspectionRequestDocument(buildingInspectionId: string) {\n const buildingInspection = await getBuildingInspectionForChecklist(buildingInspectionId)\n\n if (!buildingInspection.checklist.inspectionRequestUpdatedAt) {\n notify({ message: '검측 요청서가 없습니다.', level: 'info' })\n return\n }\n\n openPopup(\n html`\n <div style=\"overflow-y: auto;\">\n <inspection-request-document\n .checklist=${buildingInspection.checklist}\n .buildingInspection=${buildingInspection}\n .mode=${InspectionMode.VIEW}\n ></inspection-request-document>\n\n ${buildingInspection.checklist.inspectionResultUpdatedAt\n ? html`\n <hr />\n <inspection-result-notification\n .checklist=${buildingInspection.checklist}\n .buildingInspection=${buildingInspection}\n .mode=${InspectionMode.VIEW}\n ></inspection-result-notification>\n `\n : ''}\n </div>\n `,\n { backdrop: true, size: 'large', title: '검측요청결과 통보내용' }\n )\n }\n\n private async _openChecklistPopup(buildingInspectionId: string) {\n const buildingInspection = await getBuildingInspectionForChecklist(buildingInspectionId)\n\n openPopup(\n html`\n <div style=\"overflow-y: auto;\">\n <checklist-view\n .mode=${ChecklistMode.VIEWER}\n .checklist=${buildingInspection?.checklist}\n .buildingComplex=${buildingInspection?.buildingLevel?.building?.buildingComplex || {}}\n .status=${buildingInspection?.status}\n .failCount=${buildingInspection?.failCount || 0}\n .projectType=${this.project.projectType}\n ></checklist-view>\n </div>\n `,\n { backdrop: true, size: 'large', title: '체크 리스트 미리보기' }\n )\n }\n\n private _openPhotoAlbumPopup(checklistId: string) {\n openPopup(html`<photo-album-popup .checklistId=${checklistId}></photo-album-popup>`, {\n backdrop: true,\n size: 'large',\n title: '사진대지'\n })\n }\n\n private _showNameListPreview(record: any) {\n const nameListAttachment = record.nameListAttachment\n\n if (!nameListAttachment) {\n notify({ message: '실명부 파일이 없습니다.', level: 'info' })\n return\n }\n\n openPopup(\n html`\n <image-preview-popup\n .images=${[{ fullpath: nameListAttachment.fullpath, name: nameListAttachment.name }]}\n .currentIndex=${0}\n ></image-preview-popup>\n `,\n { backdrop: true, size: 'large', title: '실명부' }\n )\n }\n\n private async _refreshCalendar() {\n this.calendarData = new InspectionEventProvider(this.buildingLevelId, this.project.id)\n await this._fetchDailyWorklog(this.selectedDate)\n }\n\n private async _fetchDailyWorklog(date: string = '') {\n if (!date || !this.project.id) return\n\n const response = await client.query({\n query: gql`\n query ($projectId: String!, $date: String!) {\n buildingInspectionDailyWorklogByProjectIdAndDate(projectId: $projectId, date: $date) {\n id\n date\n documentNo\n worklogs\n memo\n directiveMemo\n taskSupervisorySignature\n overallSupervisorySignature\n\n taskSupervisory {\n id\n name\n }\n overallSupervisory {\n id\n name\n }\n\n buildingInspections {\n id\n\n checklist {\n overallSupervisorySignature\n taskSupervisorySignature\n taskSupervisory {\n id\n name\n }\n overallSupervisory {\n id\n name\n }\n }\n }\n }\n }\n `,\n variables: { projectId: this.project.id, date }\n })\n\n this.dailyWorklog = response.data?.buildingInspectionDailyWorklogByProjectIdAndDate || {}\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"building-inspection-management.js","sourceRoot":"","sources":["../../../client/pages/building-inspection/building-inspection-management.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/button/elevated-button.js'\nimport '@material/web/button/filled-button.js'\nimport '@material/web/button/outlined-button.js'\nimport '@operato/image-marker/ox-image-marker-view.js'\nimport '@operato/input/ox-select-floor.js'\nimport '@operato/data-grist'\nimport '@operato/event-view/ox-event-view.js'\nimport './inspection-create-popup'\nimport './inspection-with-checklist-create-popup'\nimport './component/daily-worklog-popup'\nimport './component/inspection-document/photo-album-popup'\nimport './component/inspection-document/inspection-request-document'\nimport './component/inspection-document/inspection-result-notification'\nimport './component/image-preview-popup'\nimport './component/field-document/field-document-popup'\n\nimport { CommonGristStyles, ScrollbarStyles } from '@operato/styles'\nimport { PageView, navigate } from '@operato/shell'\nimport { PageLifecycle } from '@operato/shell/dist/src/app/pages/page-view'\nimport { css, html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\nimport { ScopedElementsMixin } from '@open-wc/scoped-elements'\nimport { DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { notify, openPopup } from '@operato/layout'\nimport gql from 'graphql-tag'\nimport moment from 'moment-timezone'\n\nimport {\n BuildingInspectionStatus,\n BUILDING_INSPECTION_STATUS_DISPLAY,\n BUILDING_INSPECTION_RE_STATUS_DISPLAY\n} from './building-inspection-list'\nimport { InspectionEventProvider } from './component/inspection-event-provider'\nimport { EventProvider } from '@operato/event-view'\nimport { DailyWorklogMode } from './component/daily-worklog-popup'\nimport '../checklist/checklist-view'\nimport { ChecklistMode } from '../checklist/checklist-view'\nimport { getBuildingInspectionForChecklist } from '../../graphql/building-inspection'\nimport { InspectionMode } from './component/inspection-document/inspection-request-document'\nimport { DrawingImageProvider } from '@dssp/drawing/dist-client/drawing-management/drawing-image-provider.js'\n\n@customElement('building-inspection-management')\nexport class BuildingInspectionManagement extends ScopedElementsMixin(PageView) {\n static styles = [\n ScrollbarStyles,\n CommonGristStyles,\n css`\n :host {\n display: grid;\n grid-template-rows: 55px 1fr;\n color: #4e5055;\n\n width: 100%;\n height: 100%;\n background-color: var(--md-sys-color-background, #f6f6f6);\n overflow: hidden;\n }\n\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\n md-filled-button[green] {\n --md-filled-button-container-color: #008000;\n }\n\n md-outlined-button {\n --md-outlined-button-container-height: 30px;\n --md-outlined-button-trailing-space: var(--spacing-medium, 8px);\n --md-outlined-button-leading-space: var(--spacing-medium, 8px);\n --md-sys-color-outline: rgba(51, 51, 51, 0.2);\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[header] div[button-container] {\n display: flex;\n align-items: center;\n justify-content: end;\n flex: 0.5;\n }\n\n div[body] {\n display: grid;\n grid-template-columns: 4fr 6fr;\n margin: var(--spacing-large, 12px);\n margin-top: 0;\n gap: var(--spacing-medium, 8px);\n overflow: hidden;\n }\n\n h3 {\n color: #2e79be;\n font-size: 16px;\n margin: 0px;\n }\n\n div[body] > div {\n display: flex;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-large, 12px);\n border-radius: 5px;\n }\n\n div[left] {\n flex-direction: column;\n background-color: var(--md-sys-color-on-primary);\n border: 1px solid #cccccc80;\n overflow-y: auto;\n }\n\n div[subject] {\n margin-bottom: var(--spacing-small, 4px);\n }\n\n div[building-container] {\n display: block;\n\n & > * {\n margin-right: var(--spacing-medium, 8px);\n margin-bottom: var(--spacing-medium, 8px);\n }\n }\n\n div[right] {\n height: auto;\n overflow-x: hidden;\n overflow-y: auto;\n flex-direction: column;\n position: relative;\n }\n\n ox-select-floor {\n width: 100%;\n align-content: flex-end;\n\n --ox-select-floor-rotate-x: 60deg;\n --ox-select-floor-rotate-x-active: 30deg;\n --ox-select-floor-perspective: 1200px;\n\n user-select: none;\n overflow-y: auto;\n flex: 1;\n }\n\n div[status] {\n display: flex;\n position: absolute;\n right: 0px;\n bottom: 0px;\n align-items: center;\n z-index: 2;\n right: 3%;\n }\n\n div[status] > div[content] {\n display: flex;\n background-color: #4e5055;\n color: #fff;\n padding: var(--spacing-small, 4px) var(--spacing-medium, 8px);\n border-radius: 5px;\n gap: var(--spacing-medium, 8px);\n font-size: 14px;\n }\n\n div[status] span {\n display: flex;\n align-items: center;\n width: 40px;\n font-weight: bold;\n }\n\n div[status] md-icon {\n width: 16px;\n height: 16px;\n margin-right: var(--spacing-small, 4px);\n border-radius: 5px;\n font-size: 16px;\n font-weight: 700;\n }\n div[status] md-icon[wait] {\n background-color: #f7f7f7;\n color: #4e5055;\n }\n div[status] md-icon[request] {\n background-color: #f7f7f7;\n color: #4e5055;\n }\n div[status] md-icon[pass] {\n background-color: #4bbb4a;\n }\n div[status] md-icon[fail] {\n background-color: #ff4444;\n }\n\n span[name] {\n color: #4e5055;\n margin-left: var(--spacing-small, 4px);\n padding: var(--spacing-tiny, 2px) var(--spacing-small, 4px);\n }\n\n span[name][active] {\n color: var(--md-sys-color-on-error);\n background-color: var(--md-sys-color-error);\n border-radius: 5px;\n opacity: 0.7;\n }\n\n /* 오른쪽 패널 */\n div[right-panel] {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n div[scope-header] {\n display: flex;\n align-items: center;\n gap: var(--spacing-medium, 8px);\n margin-bottom: var(--spacing-small, 4px);\n\n h3 {\n margin: 0;\n }\n\n span[scope-label] {\n font-size: 12px;\n color: #888;\n background: #f0f0f0;\n padding: 2px 8px;\n border-radius: 4px;\n }\n }\n\n div[inspection-container] {\n gap: var(--spacing-medium, 8px);\n display: flex;\n flex-direction: column;\n flex: 1;\n min-height: 0;\n\n div[inspection] {\n display: grid;\n grid-template-columns: 90px 1fr 1fr 1fr 1fr 1fr;\n background: #ebc8321a;\n border-radius: 5px;\n padding: var(--spacing-medium, 8px) var(--spacing-large, 12px);\n\n & > div {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n span::before {\n display: inline-block;\n position: relative;\n content: '';\n width: 10px;\n height: 10px;\n border-radius: 6px;\n top: -1px;\n margin-right: 2px;\n }\n\n span[status='wait']::before {\n background-color: #4e5055;\n }\n span[status='request']::before {\n background-color: #2e79be;\n }\n span[status='pass']::before {\n background-color: #1bb401;\n }\n span[status='fail']::before {\n background-color: #ff4444;\n }\n span[status='re-wait']::before {\n background-color: #e89c0e;\n }\n }\n & > div[name] {\n flex-direction: row;\n text-align: right;\n gap: var(--spacing-small, 4px);\n padding-right: var(--spacing-large, 12px);\n border-right: 2px dotted #ccc;\n max-width: 100%;\n line-height: 1.3;\n\n md-icon {\n width: 40px;\n height: 40px;\n border-radius: 5px;\n color: #fff;\n background: #f16154;\n }\n }\n }\n }\n\n div[view-toggle] {\n display: flex;\n justify-content: flex-end;\n gap: var(--spacing-small, 4px);\n\n md-icon {\n cursor: pointer;\n padding: 4px;\n border-radius: 4px;\n font-size: 24px;\n }\n\n md-icon[active] {\n background-color: #0595e5;\n color: white;\n }\n }\n\n ox-event-view {\n flex: 1;\n overflow-y: auto;\n --calendar-monthly-date-min-height: 50px;\n height: 100%;\n }\n\n div[calendar-wrapper] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n div[list-wrapper] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n div[action-buttons] {\n flex-shrink: 0;\n }\n\n div[list-view] {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-medium, 8px);\n overflow-y: auto;\n flex: 1;\n }\n\n div[list-section] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n\n h3[section-title] {\n color: #e15757;\n font-size: 14px;\n margin: 0;\n }\n\n h3[section-title][blue] {\n color: #3395f1;\n }\n\n h3[section-title][green] {\n color: #1bb401;\n }\n }\n\n ox-grist {\n padding: 0px 16px 10px;\n }\n\n div[action-buttons] {\n display: flex;\n justify-content: center;\n gap: var(--spacing-medium, 8px);\n padding: var(--spacing-medium, 8px) 0;\n\n md-filled-button {\n --md-filled-button-container-height: 40px;\n --md-filled-button-trailing-space: 20px;\n --md-filled-button-leading-space: 20px;\n }\n\n md-filled-button[green] {\n --md-filled-button-container-color: #008000;\n }\n\n md-filled-button[red] {\n --md-filled-button-container-color: #e15757;\n }\n\n md-filled-button[navy] {\n --md-filled-button-container-color: #3f71a0;\n }\n\n md-filled-button[navy-light] {\n --md-filled-button-container-color: #2e8b8b;\n }\n }\n `\n ]\n\n get context() {\n return {\n title: this.project?.name ? `업무 대시보드 - ${this.project.name}` : '업무 대시보드'\n }\n }\n\n // 동 미선택 시 프로젝트 전체 데이터 모드\n get _isProjectMode(): boolean {\n return !this.selectedBuilding?.id\n }\n\n // 동 선택 + 층 미선택 시 동 전체 데이터 모드\n get _isBuildingMode(): boolean {\n return !!this.selectedBuilding?.id && !this.buildingLevelId\n }\n\n // 현재 데이터 스코프 표시 라벨\n get _scopeLabel(): string {\n if (this.buildingLevelId) {\n const level = this.building?.buildingLevels?.find(l => l.id === this.buildingLevelId)\n return `${this.selectedBuilding?.name || ''} ${level?.floorDisplayName || ''}층`\n }\n if (this.selectedBuilding?.id) {\n return `${this.selectedBuilding.name} 전체`\n }\n return '프로젝트 전체'\n }\n\n private defaultProject = {\n name: '',\n buildingComplex: {\n buildings: []\n }\n }\n\n @state() projectId: string = ''\n @state() project: any = { ...this.defaultProject }\n @state() selectedBuilding: any = {}\n @state() building: any = {}\n @state() currentFloor: number = 1\n\n @state() buildingLevelId: string = ''\n @state() buildingInspectionSummary: any = {}\n @state() calendarData?: EventProvider\n @state() selectedYearMonth: string = moment().tz('Asia/Seoul').format('YYYY-MM')\n @state() selectedDate?: string = moment().tz('Asia/Seoul').format('YYYY-MM-DD')\n @state() dailyWorklog: any = {}\n\n @state() viewMode: 'calendar' | 'list' = 'calendar'\n @state() gristConfig: any\n\n @query('div[left]') private leftPanel!: HTMLElement\n @query('ox-grist[section=\"wait-fail\"]') private gristWaitFail!: DataGrist\n @query('ox-grist[section=\"request\"]') private gristRequest!: DataGrist\n @query('ox-grist[section=\"pass\"]') private gristPass!: DataGrist\n @query('ox-event-view') private eventView!: HTMLElement\n\n render() {\n const cards =\n this.building?.buildingLevels?.map(({ mainDrawingImage, floor }) => {\n return {\n image: mainDrawingImage || '/assets/images/img-drawing-default.png',\n name: floor\n }\n }) || []\n\n return html`\n <div header>\n <h2>\n <md-icon slot=\"icon\" back @click=${() => history.back()}>arrow_back</md-icon>\n 업무 대시보드\n </h2>\n </div>\n\n <div body>\n <div left>\n <div>\n <div subject bold>개별 단지 상세정보 바로가기</div>\n <div building-container>\n ${this.project.buildingComplex?.buildings?.map(building => {\n return this.selectedBuilding.id === building.id\n ? html`\n <md-filled-button @click=${() => this._onClickBuilding(building)}> ${building.name} </md-filled-button>\n `\n : html`\n <md-outlined-button @click=${() => this._onClickBuilding(building)}> ${building.name} </md-outlined-button>\n `\n })}\n </div>\n </div>\n\n <ox-select-floor\n .cards=${cards}\n .bottomLimit=${70}\n .interval=${50}\n @change=${(e: CustomEvent) => {\n this.currentFloor = e.detail\n }}\n >\n ${this.building?.buildingLevels?.map(({ id, floor, floorDisplayName, inspectionSummary }, idx) => {\n return html`\n <div slot=\"template-${idx}\" @click=${() => this._onSelectFloor(id)} style=\"cursor: pointer;\">\n <div status>\n <div content>\n <span><md-icon wait slot=\"icon\">frame_inspect</md-icon>${inspectionSummary.wait}</span>\n <span><md-icon request slot=\"icon\">exclamation</md-icon>${inspectionSummary.request}</span>\n <span><md-icon pass slot=\"icon\">check</md-icon>${inspectionSummary.pass}</span>\n <span><md-icon fail slot=\"icon\">close</md-icon>${inspectionSummary.fail}</span>\n </div>\n <span name ?active=${this.currentFloor == floor}>${floorDisplayName}층</span>\n </div>\n </div>\n `\n })}\n </ox-select-floor>\n </div>\n\n <div right-panel>\n ${this.buildingLevelId || this._isBuildingMode || this._isProjectMode\n ? html`\n <div inspection-container>\n <div scope-header>\n <h3>검측 현황</h3>\n <span scope-label>${this._scopeLabel}</span>\n </div>\n <div inspection>\n <div name bold>\n <md-icon slot=\"icon\">fact_check</md-icon>\n 검측 현황\n </div>\n\n <div>\n <label>${BUILDING_INSPECTION_STATUS_DISPLAY[BuildingInspectionStatus.WAIT]}</label>\n <span bold status=\"wait\"> ${this.buildingInspectionSummary.wait}</span>\n </div>\n <div>\n <label>${BUILDING_INSPECTION_STATUS_DISPLAY[BuildingInspectionStatus.REQUEST]}</label>\n <span bold status=\"request\"> ${this.buildingInspectionSummary.request}</span>\n </div>\n <div>\n <label>${BUILDING_INSPECTION_STATUS_DISPLAY[BuildingInspectionStatus.FAIL]}</label>\n <span bold status=\"fail\"> ${this.buildingInspectionSummary.fail}</span>\n </div>\n <div>\n <label>재검측 대기</label>\n <span bold status=\"re-wait\"> ${this.buildingInspectionSummary.reWait}</span>\n </div>\n <div>\n <label>${BUILDING_INSPECTION_STATUS_DISPLAY[BuildingInspectionStatus.PASS]}</label>\n <span bold status=\"pass\"> ${this.buildingInspectionSummary.pass}</span>\n </div>\n </div>\n\n <div view-toggle>\n <md-icon ?active=${this.viewMode === 'calendar'} @click=${() => this._setViewMode('calendar')}>\n calendar_month\n </md-icon>\n <md-icon ?active=${this.viewMode === 'list'} @click=${() => this._setViewMode('list')}> view_list </md-icon>\n </div>\n\n <div calendar-wrapper style=\"display:${this.viewMode === 'calendar' ? 'block' : 'none'}\">\n <ox-event-view\n .mode=${'monthly'}\n .eventProvider=${this.calendarData}\n @select-date=${(e: CustomEvent) => {\n this.selectedDate = moment(e.detail[0]).format('YYYY-MM-DD')\n this._fetchDailyWorklog(this.selectedDate)\n }}\n @change-month=${(e: CustomEvent) => {\n const year = e.detail.year\n const month = e.detail?.month?.toString()?.padStart(2, '0')\n this.selectedYearMonth = `${year}-${month}`\n this._refreshListGrists()\n }}\n @open-worklog=${(e: CustomEvent) => {\n this._openWorklogForDate(e.detail.date)\n }}\n ></ox-event-view>\n </div>\n <div list-wrapper style=\"display:${this.viewMode === 'list' ? 'block' : 'none'}\">\n <div list-view>\n <div list-section>\n <h3 section-title>작업 완료 / 조치 필요</h3>\n <ox-grist\n section=\"wait-fail\"\n .mode=${'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this._fetchWaitFail.bind(this)}\n ></ox-grist>\n </div>\n <div list-section>\n <h3 section-title blue>감리 / 재검측 대기</h3>\n <ox-grist\n section=\"request\"\n .mode=${'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this._fetchRequest.bind(this)}\n ></ox-grist>\n </div>\n <div list-section>\n <h3 section-title green>검측 완료</h3>\n <ox-grist\n section=\"pass\"\n .mode=${'GRID'}\n .config=${this.gristConfig}\n .fetchHandler=${this._fetchPass.bind(this)}\n ></ox-grist>\n </div>\n </div>\n </div>\n </div>\n\n <div action-buttons>\n <md-filled-button navy @click=${this._openFieldDocuments}>\n <md-icon slot=\"icon\">search</md-icon>현장 문서 확인\n </md-filled-button>\n <div style=\"flex:1\"></div>\n ${this.viewMode === 'calendar'\n ? this.dailyWorklog.id\n ? html`<md-filled-button green @click=${this._openDailyWorklogPopup}>\n <md-icon slot=\"icon\">edit</md-icon>일일 업무일지 수정\n </md-filled-button>`\n : html`<md-filled-button @click=${this._openDailyWorklogPopup}>\n <md-icon slot=\"icon\">note_add</md-icon>일일 업무일지 작성\n </md-filled-button>`\n : ''}\n ${this.viewMode === 'list'\n ? html`<md-filled-button red @click=${this._deleteInspections}>\n <md-icon slot=\"icon\">delete</md-icon>검측 삭제\n </md-filled-button>`\n : ''}\n <md-filled-button navy-light @click=${this._openCreateInspection}>\n <md-icon slot=\"icon\">check_circle</md-icon>검측 등록\n </md-filled-button>\n </div>\n `\n : html`\n <div style=\"display:flex;align-items:center;justify-content:center;flex:1;color:#999;\">\n 층을 선택하면 작업 현황이 표시됩니다.\n </div>\n `}\n </div>\n </div>\n `\n }\n\n updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties)\n // ox-grist shadow DOM 내부 #wrap의 overflow를 제어\n this.renderRoot?.querySelectorAll('ox-grist').forEach(grist => {\n const oxGrid = grist.shadowRoot?.querySelector('ox-grid')\n const gridBody = oxGrid?.shadowRoot?.querySelector('ox-grid-body') as HTMLElement\n if (gridBody) {\n gridBody.style.maxHeight = '150px'\n }\n })\n }\n\n async pageUpdated(changes: any, lifecycle: PageLifecycle) {\n if (this.active) {\n this.projectId = lifecycle.resourceId || ''\n await this._initProject(this.projectId)\n }\n }\n\n async pageInitialized(lifecycle: any) {\n this.gristConfig = {\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'open_in_new',\n header: '상세보기',\n width: 60,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n navigate(`building-inspection-detail-drawing/${record.id}`)\n }\n }\n },\n {\n type: 'string',\n name: 'id',\n hidden: true\n },\n {\n type: 'string',\n name: 'statusDisplay',\n header: '검측 상태',\n record: { align: 'center' },\n width: 100\n },\n {\n type: 'string',\n name: 'location',\n header: '위치',\n width: 130\n },\n {\n type: 'string',\n name: 'constructionType',\n header: '공종',\n width: 120\n },\n {\n type: 'string',\n name: 'inspectionParts',\n header: '검측 부위',\n record: {\n renderer: value => value?.join(', ') || ''\n },\n width: 200\n },\n {\n type: 'string',\n name: 'createdDate',\n header: '검측 등록일시',\n width: 110\n },\n {\n type: 'string',\n name: 'requestDate',\n header: '검측 요청일시',\n width: 150\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'fact_check',\n header: '도면',\n width: 50,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this._openDrawingPopup(record)\n }\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'edit_square',\n header: '요청서/결과통보',\n width: 100,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this._openInspectionRequestDocument(record.id)\n }\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'task',\n header: '체크리스트',\n width: 70,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this._openChecklistPopup(record.id)\n }\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'photo_camera',\n header: '사진대지',\n width: 60,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this._openPhotoAlbumPopup(record.checklistId)\n }\n }\n },\n {\n type: 'gutter',\n gutterName: 'button',\n icon: 'engineering',\n header: '실명부',\n width: 50,\n handlers: {\n click: (columns, data, column, record, rowIndex) => {\n this._showNameListPreview(record)\n }\n }\n }\n ],\n rows: {\n selectable: {\n multiple: true\n },\n appendable: false\n },\n sorters: [{ name: 'requestDate' }]\n }\n }\n\n private async _initProject(projectId: string = '') {\n const response = await client.query({\n query: gql`\n query Project($id: String!) {\n project(id: $id) {\n id\n name\n projectType\n mainPhoto {\n fullpath\n }\n buildingComplex {\n id\n drawing {\n id\n name\n fullpath\n }\n buildings {\n id\n name\n drawing {\n id\n name\n fullpath\n }\n }\n }\n }\n }\n `,\n variables: {\n id: projectId\n }\n })\n\n if (response.errors) return\n\n this.project = response.data?.project\n this.updateContext()\n\n // 동 미선택 상태 → 프로젝트 전체 데이터 로드\n this.selectedBuilding = {}\n this.building = {}\n this.buildingLevelId = ''\n await this._initProjectLevel()\n }\n\n private async _getBuilding(buildingId: string = '') {\n if (!buildingId) return // 동 미선택(프로젝트 모드) 시 빈 id로 쿼리하지 않음\n\n const response = await client.query({\n query: gql`\n query Building($id: String!) {\n building(id: $id) {\n id\n buildingLevels {\n id\n floor\n floorDisplayName\n mainDrawing {\n id\n name\n fullpath\n }\n mainDrawingImage\n inspectionSummary {\n wait\n request\n pass\n fail\n }\n }\n }\n }\n `,\n variables: {\n id: buildingId\n }\n })\n\n if (response.errors) return\n\n this.building = response.data?.building\n\n // 왼쪽 패널 스크롤을 맨 아래로\n await this.updateComplete\n if (this.leftPanel) {\n this.leftPanel.scrollTop = this.leftPanel.scrollHeight\n }\n }\n\n private async _onClickBuilding(building) {\n if (this.selectedBuilding?.id === building.id) {\n // 토글: 이미 선택된 동 클릭 시 해제 → 프로젝트 전체 데이터\n this.selectedBuilding = {}\n this.building = {}\n this.buildingLevelId = ''\n this.currentFloor = 0\n await this._initProjectLevel()\n return\n }\n this.selectedBuilding = { ...building }\n this.buildingLevelId = ''\n this.buildingInspectionSummary = {}\n await this._getBuilding(this.selectedBuilding.id)\n await this._initBuildingData(this.selectedBuilding.id)\n }\n\n private async _onSelectFloor(levelId: string) {\n this.buildingLevelId = levelId\n await this._initBuildingLevel(levelId)\n }\n\n private async _initProjectLevel() {\n if (!this.projectId) return\n\n // 프로젝트 전체 검측 현황 조회\n const response = await client.query({\n query: gql`\n query BuildingInspectionSummaryOfProject($projectId: String!) {\n buildingInspectionSummaryOfProject(projectId: $projectId) {\n wait\n request\n pass\n fail\n reWait\n }\n }\n `,\n variables: { projectId: this.projectId }\n })\n\n if (response.errors) return\n\n this.buildingInspectionSummary = response.data?.buildingInspectionSummaryOfProject\n\n // 달력 데이터 생성 (프로젝트 레벨 - buildingLevelId 없이)\n this.calendarData = new InspectionEventProvider('', this.projectId)\n\n await this.updateComplete\n\n // 일일 업무일지 조회\n await this._fetchDailyWorklog(this.selectedDate)\n\n // 목록 모드일 경우 그리스트 갱신\n this._refreshListGrists()\n }\n\n private async _initBuildingData(buildingId: string) {\n if (!buildingId) return\n\n // 동 전체 검측 현황 조회\n const response = await client.query({\n query: gql`\n query BuildingInspectionSummaryOfBuilding($buildingId: String!) {\n buildingInspectionSummaryOfBuilding(buildingId: $buildingId) {\n wait\n request\n pass\n fail\n reWait\n }\n }\n `,\n variables: { buildingId }\n })\n\n if (response.errors) return\n\n this.buildingInspectionSummary = response.data?.buildingInspectionSummaryOfBuilding\n\n // 달력 데이터 생성 (동 레벨)\n this.calendarData = new InspectionEventProvider('', this.projectId, buildingId)\n\n await this.updateComplete\n\n // 일일 업무일지 조회\n await this._fetchDailyWorklog(this.selectedDate)\n\n // 목록 모드일 경우 그리스트 갱신\n this._refreshListGrists()\n }\n\n private async _initBuildingLevel(buildingLevelId: string) {\n if (!buildingLevelId) return // 층 미선택 시 빈 id로 쿼리하지 않음\n\n const response = await client.query({\n query: gql`\n query BuildingInspectionSummaryOfBuildingLevel($buildingLevelId: String!) {\n buildingInspectionSummaryOfBuildingLevel(buildingLevelId: $buildingLevelId) {\n wait\n request\n pass\n fail\n reWait\n }\n }\n `,\n variables: {\n buildingLevelId\n }\n })\n\n if (response.errors) return\n\n this.buildingInspectionSummary = response.data?.buildingInspectionSummaryOfBuildingLevel\n\n // 달력 데이터 생성\n this.calendarData = new InspectionEventProvider(buildingLevelId, this.project.id)\n\n // 달력 최소 높이 속성 수정\n await this.updateComplete\n\n // 일일 업무일지 조회\n await this._fetchDailyWorklog(this.selectedDate)\n\n // 목록 모드일 경우 그리스트 갱신\n this._refreshListGrists()\n }\n\n private async _fetchInspectionsByStatus(\n statuses: string[],\n { page = 1, limit = 100 }: FetchOption,\n extraFilter?: (item: any) => boolean\n ) {\n if (!this.buildingLevelId && !this._isBuildingMode && !this._isProjectMode) return { total: 0, records: [] }\n if ((this._isProjectMode || this._isBuildingMode) && !this.projectId) return { total: 0, records: [] }\n\n let items: any[]\n\n if (this.buildingLevelId) {\n // 층 레벨 조회\n const response = await client.query({\n query: gql`\n query BuildingInspectionsOfBuildingLevel($params: BuildingInspectionsOfBuildingLevel!) {\n buildingInspectionsOfBuildingLevel(params: $params) {\n items {\n id\n status\n failCount\n requestDate\n createdAt\n\n checklist {\n checklistId: id\n name\n constructionType\n constructionDetailType\n location\n inspectionParts\n inspectionDrawingType\n\n nameListAttachment {\n id\n name\n fullpath\n }\n }\n drawingMarker\n }\n total\n }\n }\n `,\n variables: {\n params: {\n buildingLevelId: this.buildingLevelId,\n limit: 0\n }\n }\n })\n items = response.data?.buildingInspectionsOfBuildingLevel?.items || []\n } else if (this._isBuildingMode) {\n // 동 레벨 조회\n const response = await client.query({\n query: gql`\n query BuildingInspectionsOfBuilding($params: BuildingInspectionsOfBuilding!) {\n buildingInspectionsOfBuilding(params: $params) {\n items {\n id\n status\n failCount\n requestDate\n createdAt\n\n checklist {\n checklistId: id\n name\n constructionType\n constructionDetailType\n location\n inspectionParts\n inspectionDrawingType\n\n nameListAttachment {\n id\n name\n fullpath\n }\n }\n drawingMarker\n }\n total\n }\n }\n `,\n variables: {\n params: {\n buildingId: this.selectedBuilding.id,\n limit: 0\n }\n }\n })\n items = response.data?.buildingInspectionsOfBuilding?.items || []\n } else {\n // 프로젝트 레벨 조회 (동 미선택 시)\n const response = await client.query({\n query: gql`\n query BuildingInspectionsOfProject($params: BuildingInspectionsOfProject!) {\n buildingInspectionsOfProject(params: $params) {\n items {\n id\n status\n failCount\n requestDate\n createdAt\n\n checklist {\n checklistId: id\n name\n constructionType\n constructionDetailType\n location\n inspectionParts\n inspectionDrawingType\n\n nameListAttachment {\n id\n name\n fullpath\n }\n }\n drawingMarker\n }\n total\n }\n }\n `,\n variables: {\n params: {\n projectId: this.projectId,\n limit: 0\n }\n }\n })\n items = response.data?.buildingInspectionsOfProject?.items || []\n }\n\n // 상태별 필터링\n items = items.filter(item => statuses.includes(item.status))\n\n if (extraFilter) {\n items = items.filter(extraFilter)\n }\n\n items = items.map(item => ({\n ...item,\n ...item.checklist,\n statusDisplay: (item.failCount > 0 ? BUILDING_INSPECTION_RE_STATUS_DISPLAY : BUILDING_INSPECTION_STATUS_DISPLAY)[\n item.status\n ],\n createdDate: this._formatDate(item.createdAt),\n requestDate: this._formatDateTime(item.requestDate)\n }))\n\n return {\n total: items.length,\n records: items\n }\n }\n\n private async _fetchWaitFail(options: FetchOption) {\n return this._fetchInspectionsByStatus(\n [BuildingInspectionStatus.WAIT, BuildingInspectionStatus.OVERALL_WAIT, BuildingInspectionStatus.FAIL],\n options,\n // 재검측 대기(failCount > 0인 WAIT) 제외\n item =>\n !(\n (item.status === BuildingInspectionStatus.WAIT || item.status === BuildingInspectionStatus.OVERALL_WAIT) &&\n (item.failCount || 0) > 0\n )\n )\n }\n\n private async _fetchRequest(options: FetchOption) {\n return this._fetchInspectionsByStatus(\n [\n BuildingInspectionStatus.REQUEST,\n BuildingInspectionStatus.OVERALL_REQUEST,\n BuildingInspectionStatus.WAIT,\n BuildingInspectionStatus.OVERALL_WAIT\n ],\n options,\n // REQUEST/OVERALL_REQUEST 전체 + 재검측 대기(failCount > 0인 WAIT)만\n item =>\n item.status === BuildingInspectionStatus.REQUEST ||\n item.status === BuildingInspectionStatus.OVERALL_REQUEST ||\n ((item.status === BuildingInspectionStatus.WAIT || item.status === BuildingInspectionStatus.OVERALL_WAIT) &&\n (item.failCount || 0) > 0)\n )\n }\n\n private async _fetchPass(options: FetchOption) {\n return this._fetchInspectionsByStatus([BuildingInspectionStatus.PASS], options)\n }\n\n private _setViewMode(mode: 'calendar' | 'list') {\n this.viewMode = mode\n\n if (mode === 'list') {\n this.updateComplete.then(() => this._refreshListGrists())\n }\n }\n\n private _refreshListGrists() {\n if (this.viewMode === 'list') {\n this.updateComplete.then(() => {\n this.gristWaitFail?.fetch()\n this.gristRequest?.fetch()\n this.gristPass?.fetch()\n })\n }\n }\n\n private _formatDateTime(date: Date | string | number | undefined) {\n if (!date) return ''\n try {\n const parsed = typeof date === 'string' && /^\\d+$/.test(date) ? new Date(Number(date)) : new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: false\n }).format(parsed)\n } catch {\n return ''\n }\n }\n\n private _formatDate(date: Date | string | number | undefined) {\n if (!date) return ''\n try {\n const parsed = typeof date === 'string' && /^\\d+$/.test(date) ? new Date(Number(date)) : new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).format(parsed)\n } catch {\n return ''\n }\n }\n\n private async _openWorklogForDate(date: string) {\n this.selectedDate = date\n await this._fetchDailyWorklog(date)\n this._openDailyWorklogPopup()\n }\n\n private _openDailyWorklogPopup() {\n const date = this.selectedDate\n\n openPopup(\n html`<daily-worklog-popup\n .project=${this.project}\n .date=${date}\n .dailyWorklog=${this.dailyWorklog}\n .mode=${this.dailyWorklog.id ? DailyWorklogMode.EDIT : DailyWorklogMode.CREATE}\n @createdDailyWorklog=${this._refreshCalendar.bind(this)}\n @updatedDailyWorklog=${() => this._fetchDailyWorklog(this.selectedDate)}\n ></daily-worklog-popup>`,\n {\n backdrop: true,\n size: 'large',\n title: '일일 업무일지 작성'\n }\n )\n }\n\n private async _deleteInspections() {\n const allSelected = [\n ...(this.gristWaitFail?.selected || []),\n ...(this.gristRequest?.selected || []),\n ...(this.gristPass?.selected || [])\n ]\n const ids = allSelected.map(record => record.id)\n\n if (!ids.length) {\n notify({ message: '삭제할 항목을 선택해주세요.', level: 'info' })\n return\n }\n\n if (confirm('삭제하시겠습니까?')) {\n const response = await client.mutate({\n mutation: gql`\n mutation ($ids: [String!]!) {\n deleteBuildingInspections(ids: $ids)\n }\n `,\n variables: { ids }\n })\n\n if (!response.errors) {\n this._refreshListGrists()\n this._initBuildingLevel(this.buildingLevelId)\n notify({ message: '삭제되었습니다.' })\n }\n }\n }\n\n private _openCreateInspection() {\n openPopup(\n html`\n <inspection-with-checklist-create-popup\n .projectId=${this.project.id}\n .selectedBuildingId=${this.selectedBuilding.id}\n .selectedBuildingLevelId=${this.buildingLevelId}\n @requestRefresh=\"${() => this._refreshByScope()}\"\n ></inspection-with-checklist-create-popup>\n `,\n { backdrop: true, size: 'large', title: '검측 등록' }\n )\n }\n\n // 현재 스코프(프로젝트/동/층)에 맞춰 검측 현황·달력·목록을 갱신\n private async _refreshByScope() {\n if (this.buildingLevelId) {\n await this._getBuilding(this.selectedBuilding.id)\n await this._initBuildingLevel(this.buildingLevelId)\n } else if (this._isBuildingMode) {\n await this._getBuilding(this.selectedBuilding.id)\n await this._initBuildingData(this.selectedBuilding.id)\n } else {\n await this._initProjectLevel()\n }\n }\n\n private _openFieldDocuments() {\n openPopup(html`<field-document-popup .projectId=${this.projectId}></field-document-popup>`, {\n backdrop: true,\n size: 'full',\n title: '현장 문서 확인'\n })\n }\n\n private async _openDrawingPopup(buildingInspection: any) {\n const drawingImageProvider: DrawingImageProvider = new DrawingImageProvider()\n const inspectionDrawingType = buildingInspection.inspectionDrawingType\n\n const drawingShapes = JSON.parse(buildingInspection?.drawingMarker || null) || []\n const markers = await drawingImageProvider.getMarkers(inspectionDrawingType)\n\n const imageUrl = String(inspectionDrawingType).normalize('NFC')\n const shapes = [...drawingShapes, ...markers]\n\n openPopup(\n html`<ox-image-marker-view\n style=\"pointer-events: none;\"\n id=\"image-marker\"\n .imageUrl=${imageUrl}\n .shapes=${shapes}\n .imageProvider=${drawingImageProvider}\n ></ox-image-marker-view>`,\n { backdrop: true, size: 'large', title: '검측 도면' }\n )\n }\n\n private async _openInspectionRequestDocument(buildingInspectionId: string) {\n const buildingInspection = await getBuildingInspectionForChecklist(buildingInspectionId)\n\n if (!buildingInspection.checklist.inspectionRequestUpdatedAt) {\n notify({ message: '검측 요청서가 없습니다.', level: 'info' })\n return\n }\n\n openPopup(\n html`\n <div style=\"overflow-y: auto;\">\n <inspection-request-document\n .checklist=${buildingInspection.checklist}\n .buildingInspection=${buildingInspection}\n .mode=${InspectionMode.VIEW}\n ></inspection-request-document>\n\n ${buildingInspection.checklist.inspectionResultUpdatedAt\n ? html`\n <hr />\n <inspection-result-notification\n .checklist=${buildingInspection.checklist}\n .buildingInspection=${buildingInspection}\n .mode=${InspectionMode.VIEW}\n ></inspection-result-notification>\n `\n : ''}\n </div>\n `,\n { backdrop: true, size: 'large', title: '검측요청결과 통보내용' }\n )\n }\n\n private async _openChecklistPopup(buildingInspectionId: string) {\n const buildingInspection = await getBuildingInspectionForChecklist(buildingInspectionId)\n\n openPopup(\n html`\n <div style=\"overflow-y: auto;\">\n <checklist-view\n .mode=${ChecklistMode.VIEWER}\n .checklist=${buildingInspection?.checklist}\n .buildingComplex=${buildingInspection?.buildingLevel?.building?.buildingComplex || {}}\n .status=${buildingInspection?.status}\n .failCount=${buildingInspection?.failCount || 0}\n .projectType=${this.project.projectType}\n ></checklist-view>\n </div>\n `,\n { backdrop: true, size: 'large', title: '체크 리스트 미리보기' }\n )\n }\n\n private _openPhotoAlbumPopup(checklistId: string) {\n openPopup(html`<photo-album-popup .checklistId=${checklistId}></photo-album-popup>`, {\n backdrop: true,\n size: 'large',\n title: '사진대지'\n })\n }\n\n private _showNameListPreview(record: any) {\n const nameListAttachment = record.nameListAttachment\n\n if (!nameListAttachment) {\n notify({ message: '실명부 파일이 없습니다.', level: 'info' })\n return\n }\n\n openPopup(\n html`\n <image-preview-popup\n .images=${[{ fullpath: nameListAttachment.fullpath, name: nameListAttachment.name }]}\n .currentIndex=${0}\n ></image-preview-popup>\n `,\n { backdrop: true, size: 'large', title: '실명부' }\n )\n }\n\n private async _refreshCalendar() {\n this.calendarData = new InspectionEventProvider(this.buildingLevelId, this.project.id)\n await this._fetchDailyWorklog(this.selectedDate)\n }\n\n private async _fetchDailyWorklog(date: string = '') {\n if (!date || !this.project.id) return\n\n const response = await client.query({\n query: gql`\n query ($projectId: String!, $date: String!) {\n buildingInspectionDailyWorklogByProjectIdAndDate(projectId: $projectId, date: $date) {\n id\n date\n documentNo\n worklogs\n memo\n directiveMemo\n taskSupervisorySignature\n overallSupervisorySignature\n\n taskSupervisory {\n id\n name\n }\n overallSupervisory {\n id\n name\n }\n\n buildingInspections {\n id\n\n checklist {\n overallSupervisorySignature\n taskSupervisorySignature\n taskSupervisory {\n id\n name\n }\n overallSupervisory {\n id\n name\n }\n }\n }\n }\n }\n `,\n variables: { projectId: this.project.id, date }\n })\n\n this.dailyWorklog = response.data?.buildingInspectionDailyWorklogByProjectIdAndDate || {}\n }\n}\n"]}
|
package/dist-client/pages/building-inspection/component/field-document/field-document-list-panel.js
CHANGED
|
@@ -115,11 +115,8 @@ let FieldDocumentListPanel = class FieldDocumentListPanel extends LitElement {
|
|
|
115
115
|
${this.selectedDoc.aiSummary
|
|
116
116
|
? html `
|
|
117
117
|
<div ai-summary>
|
|
118
|
-
<md-icon>auto_awesome</md-icon>
|
|
119
|
-
|
|
120
|
-
<strong>AI 브리핑</strong><br />
|
|
121
|
-
${this.selectedDoc.aiSummary}
|
|
122
|
-
</div>
|
|
118
|
+
<strong><md-icon>auto_awesome</md-icon>AI 브리핑</strong>
|
|
119
|
+
${this.selectedDoc.aiSummary}
|
|
123
120
|
</div>
|
|
124
121
|
`
|
|
125
122
|
: this.selectedDoc.aiSummaryStatus === '10'
|
|
@@ -473,15 +470,19 @@ FieldDocumentListPanel.styles = [
|
|
|
473
470
|
}
|
|
474
471
|
|
|
475
472
|
div[ai-summary] {
|
|
476
|
-
display: flex;
|
|
477
|
-
align-items: flex-start;
|
|
478
|
-
gap: 6px;
|
|
479
473
|
padding: 8px 12px;
|
|
480
474
|
background: #e8f5e9;
|
|
481
475
|
border-radius: 6px;
|
|
482
476
|
font-size: 12px;
|
|
483
477
|
color: #333;
|
|
484
478
|
|
|
479
|
+
strong {
|
|
480
|
+
display: flex;
|
|
481
|
+
align-items: center;
|
|
482
|
+
gap: 6px;
|
|
483
|
+
margin-bottom: 4px;
|
|
484
|
+
}
|
|
485
|
+
|
|
485
486
|
md-icon {
|
|
486
487
|
--md-icon-size: 18px;
|
|
487
488
|
color: #4caf50;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-document-list-panel.js","sourceRoot":"","sources":["../../../../../client/pages/building-inspection/component/field-document/field-document-list-panel.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,qCAAqC,CAAA;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAGpC,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,UAAU;IAA/C;;QA4PuB,cAAS,GAAW,EAAE,CAAA;QACtB,SAAI,GAAW,EAAE,CAAA;QACjB,eAAU,GAAW,EAAE,CAAA;QACxB,cAAS,GAAU,EAAE,CAAA;QAE/B,gBAAW,GAAgB,IAAI,GAAG,EAAE,CAAA;QACpC,eAAU,GAAY,KAAK,CAAA;QAC3B,gBAAW,GAAQ,IAAI,CAAA;IAwP1C,CAAC;IAtPC,MAAM;QACJ,OAAO,IAAI,CAAA;;mBAEI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE;0BACvC,IAAI,CAAC,SAAS,CAAC,MAAM;;;QAGvC,IAAI,CAAC,IAAI;YACT,CAAC,CAAC,IAAI,CAAA;;;;;;4BAMc,IAAI,CAAC,UAAU;6BACd,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM;;;;;;;;;;;;;;0BAc/E,IAAI,CAAC,eAAe;2BACnB,IAAI,CAAC,gBAAgB;sBAC1B,IAAI,CAAC,WAAW;;gBAEtB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAA,gDAAgD,CAAC,CAAC,CAAC,EAAE;;gBAE3E,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;gBACzB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAChB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;;oBAAC,OAAA,IAAI,CAAA;;;;oCAIF,CAAA,MAAA,IAAI,CAAC,WAAW,0CAAE,EAAE,MAAK,GAAG,CAAC,EAAE;qCAC9B,CAAC,CAAY,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC;iCAClD,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;;;;;qCAKtB,CAAC,CAAQ,EAAE,EAAE;wBACpB,CAAC,CAAC,eAAe,EAAE,CAAA;wBACnB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;oBACxB,CAAC;;;;;;uCAMU,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;sCAC7B,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;qCACzC,CAAC,CAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,EAAE;;;+BAGvC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;;4BAE9C,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAA,kCAAkC,CAAC,CAAC,CAAC,EAAE;kCACtD,GAAG,CAAC,IAAI;;;+BAGX,CAAA,MAAA,GAAG,CAAC,OAAO,0CAAE,IAAI,KAAI,EAAE;;;+BAGvB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;;qBAEzC,CAAA;iBAAA,CACF;gBACH,CAAC,CAAC,IAAI,CAAA;;;;;;mBAMH;;;cAGL,IAAI,CAAC,WAAW;gBAChB,CAAC,CAAC,IAAI,CAAA;;;;;yCAKqB,IAAI,CAAC,WAAW,CAAC,IAAI;;yCAErB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;4BAC7D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAA,YAAY,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;;0BAE1G,IAAI,CAAC,WAAW,CAAC,SAAS;oBAC1B,CAAC,CAAC,IAAI,CAAA;;;;;oCAKI,IAAI,CAAC,WAAW,CAAC,SAAS;;;6BAGjC;oBACH,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,eAAe,KAAK,IAAI;wBACzC,CAAC,CAAC,IAAI,CAAA;;;;;+BAKH;wBACH,CAAC,CAAC,EAAE;;;;iBAIf;gBACH,CAAC,CAAC,EAAE;WACP;YACH,CAAC,CAAC,IAAI,CAAA;;;;;WAKH;KACN,CAAA;IACH,CAAC;IAEO,UAAU,CAAC,GAAQ;QACzB,IAAI,CAAC,WAAW,GAAG,GAAG,CAAA;IACxB,CAAC;IAEO,YAAY,CAAC,GAAQ;QAC3B,IAAI,CAAC,WAAW,GAAG,GAAG,CAAA;QAEtB,IAAI,CAAC,GAAG,CAAC,QAAQ;YAAE,OAAM;QAEzB,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAA;QAC7D,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QAEjF,IAAI,OAAO,EAAE,CAAC;YACZ,SAAS,CACP,IAAI,CAAA;oBACQ,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;0BACtC,CAAC;gCACK,EACxB,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CACnD,CAAA;QACH,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,CAAQ,EAAE,EAAU;QACrC,MAAM,OAAO,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAA;QACtD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACxC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAChB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACnB,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,MAAM,CAAA;QACzB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;IAC9E,CAAC;IAEO,UAAU,CAAC,CAAQ;QACzB,MAAM,OAAO,GAAI,CAAC,CAAC,MAA2B,CAAC,OAAO,CAAA;QACtD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAC3D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAA;QAC9B,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;IACxF,CAAC;IAED,8BAA8B;IACtB,eAAe,CAAC,CAAY;;QAClC,MAAM,KAAK,GAAG,CAAA,MAAA,CAAC,CAAC,YAAY,0CAAE,KAAK,KAAI,EAAE,CAAA;QACzC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,CAAC,CAAC,cAAc,EAAE,CAAA;YAClB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QACxB,CAAC;IACH,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;IACzB,CAAC;IAEO,WAAW,CAAC,CAAY;;QAC9B,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAA;QAEvB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA,MAAA,CAAC,CAAC,YAAY,0CAAE,KAAK,KAAI,EAAE,CAAC,CAAA;QACrD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;IAED,kBAAkB;IACV,eAAe,CAAC,CAAY,EAAE,GAAQ;;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QAClF,MAAA,CAAC,CAAC,YAAY,0CAAE,OAAO,CAAC,kCAAkC,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAA;QAChF,CAAC,CAAC,YAAa,CAAC,aAAa,GAAG,MAAM,CAAA;IACxC,CAAC;IAEO,WAAW,CAAC,IAAS;QAC3B,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAA;QACpB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAA;YACxB,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;gBACtC,QAAQ,EAAE,YAAY;gBACtB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,SAAS;aACf,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACd,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;IAEO,eAAe,CAAC,IAAY;QAClC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAC1B,IAAI,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAC7B,IAAI,KAAK,GAAG,IAAI;YAAE,OAAO,GAAG,KAAK,IAAI,CAAA;QACrC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;YAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;QACjE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;IACnD,CAAC;IAEO,eAAe,CAAC,IAAS;QAC/B,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAA;QACpB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAA;YACxB,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;gBACtC,QAAQ,EAAE,YAAY;gBACtB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,SAAS;gBAChB,GAAG,EAAE,SAAS;gBACd,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,IAAI;aACb,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACd,CAAC;QAAC,WAAM,CAAC;YACP,OAAO,EAAE,CAAA;QACX,CAAC;IACH,CAAC;;AAzfM,6BAAM,GAAG;IACd,eAAe;IACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsPF;CACF,AAzPY,CAyPZ;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;yDAAuB;AACtB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;oDAAkB;AACjB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;0DAAwB;AACxB;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;yDAAsB;AAE/B;IAAhB,KAAK,EAAE;8BAAsB,GAAG;2DAAoB;AACpC;IAAhB,KAAK,EAAE;;0DAAoC;AAC3B;IAAhB,KAAK,EAAE;;2DAAgC;AAnQ7B,sBAAsB;IADlC,aAAa,CAAC,2BAA2B,CAAC;GAC9B,sBAAsB,CA2flC","sourcesContent":["import '@material/web/icon/icon.js'\nimport '../../component/image-preview-popup'\n\nimport { ScrollbarStyles } from '@operato/styles'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { openPopup } from '@operato/layout'\n\n@customElement('field-document-list-panel')\nexport class FieldDocumentListPanel extends LitElement {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n div[panel-header] {\n display: flex;\n align-items: center;\n padding: 10px 16px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n\n h3 {\n margin: 0;\n font-size: 14px;\n color: #333;\n flex: 1;\n }\n\n span[doc-count] {\n font-size: 12px;\n color: #999;\n }\n }\n\n div[table-header] {\n display: grid;\n grid-template-columns: 30px 40px 80px 1fr 80px 80px 80px 80px 100px;\n padding: 8px 16px;\n background: #f0e6e6;\n font-size: 12px;\n font-weight: bold;\n color: #666;\n border-bottom: 1px solid #ddd;\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n div[doc-list] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n }\n\n div[doc-item] {\n display: grid;\n grid-template-columns: 30px 40px 80px 1fr 80px 80px 80px 80px 100px;\n padding: 8px 16px;\n border-bottom: 1px solid #f0f0f0;\n font-size: 13px;\n cursor: pointer;\n transition: background-color 0.15s;\n align-items: center;\n\n &:hover {\n background-color: #f5f5f5;\n }\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n md-icon[preview] {\n --md-icon-size: 18px;\n cursor: pointer;\n color: #999;\n border-radius: 50%;\n padding: 2px;\n }\n\n md-icon[preview]:hover {\n color: #0595e5;\n background: #e3f2fd;\n }\n\n div[name-cell] {\n justify-content: flex-start;\n gap: 6px;\n\n md-icon[favorite] {\n --md-icon-size: 16px;\n color: #ffc107;\n flex-shrink: 0;\n }\n\n span {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n div[ai-cell] {\n font-size: 11px;\n\n span[ai-done] {\n display: flex;\n align-items: center;\n gap: 2px;\n color: #2e7d32;\n\n md-icon {\n --md-icon-size: 14px;\n color: #4caf50;\n }\n }\n\n span[ai-pending] {\n color: #ef6c00;\n }\n }\n\n input[type='checkbox'] {\n cursor: pointer;\n }\n }\n\n div[doc-item][selected] {\n background-color: #e3f2fd;\n }\n\n div[doc-item][draggable='true'] {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n div[drop-zone] {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(33, 150, 243, 0.08);\n border: 3px dashed #1976d2;\n border-radius: 8px;\n z-index: 10;\n pointer-events: none;\n\n span {\n font-size: 16px;\n color: #1976d2;\n font-weight: bold;\n }\n }\n\n div[empty-state] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: #999;\n flex: 1;\n\n md-icon {\n --md-icon-size: 48px;\n color: #ddd;\n margin-bottom: 12px;\n }\n }\n\n div[doc-detail] {\n padding: 12px 16px;\n background: #fafafa;\n border-top: 1px solid #e0e0e0;\n overflow-y: auto;\n\n div[detail-content] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n\n md-icon[file-icon] {\n --md-icon-size: 36px;\n color: #0595e5;\n background: #e3f2fd;\n padding: 8px;\n border-radius: 8px;\n flex-shrink: 0;\n }\n\n div[detail-info] {\n flex: 1;\n\n div[file-name] {\n font-weight: bold;\n font-size: 14px;\n margin-bottom: 4px;\n }\n\n div[file-meta] {\n font-size: 12px;\n color: #666;\n margin-bottom: 8px;\n }\n\n div[ai-summary] {\n display: flex;\n align-items: flex-start;\n gap: 6px;\n padding: 8px 12px;\n background: #e8f5e9;\n border-radius: 6px;\n font-size: 12px;\n color: #333;\n\n md-icon {\n --md-icon-size: 18px;\n color: #4caf50;\n flex-shrink: 0;\n }\n }\n\n div[ai-pending] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: #fff3e0;\n border-radius: 6px;\n font-size: 12px;\n color: #ef6c00;\n\n md-icon {\n --md-icon-size: 18px;\n flex-shrink: 0;\n }\n }\n }\n }\n\n }\n `\n ]\n\n @property({ type: String }) projectId: string = ''\n @property({ type: String }) code: string = ''\n @property({ type: String }) folderName: string = ''\n @property({ type: Array }) documents: any[] = []\n\n @state() private selectedIds: Set<string> = new Set()\n @state() private isDragOver: boolean = false\n @state() private selectedDoc: any = null\n\n render() {\n return html`\n <div panel-header>\n <h3>문서 목록${this.folderName ? ` - ${this.folderName}` : ''}</h3>\n <span doc-count>${this.documents.length}건</span>\n </div>\n\n ${this.code\n ? html`\n <div table-header>\n <div></div>\n <div>\n <input\n type=\"checkbox\"\n @change=${this._toggleAll}\n .checked=${this.selectedIds.size > 0 && this.selectedIds.size === this.documents.length}\n />\n </div>\n <div>문서번호</div>\n <div style=\"justify-content:flex-start; padding-left:8px;\">제 목</div>\n <div>등록부서</div>\n <div>등록자</div>\n <div>자료분류</div>\n <div>기술분야</div>\n <div>등록일자</div>\n </div>\n\n <div\n doc-list\n @dragover=${this._onListDragOver}\n @dragleave=${this._onListDragLeave}\n @drop=${this._onListDrop}\n >\n ${this.isDragOver ? html`<div drop-zone><span>여기에 파일을 놓으세요</span></div>` : ''}\n\n ${this.documents.length > 0\n ? this.documents.map(\n (doc, idx) => html`\n <div\n doc-item\n draggable=\"true\"\n ?selected=${this.selectedDoc?.id === doc.id}\n @dragstart=${(e: DragEvent) => this._onDocDragStart(e, doc)}\n @click=${() => this._selectDoc(doc)}\n >\n <div>\n <md-icon\n preview\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openPreview(doc)\n }}\n >visibility</md-icon>\n </div>\n <div>\n <input\n type=\"checkbox\"\n .checked=${this.selectedIds.has(doc.id)}\n @change=${(e: Event) => this._toggleDoc(e, doc.id)}\n @click=${(e: Event) => e.stopPropagation()}\n />\n </div>\n <div>${doc.code}${String(idx + 1).padStart(2, '0')}</div>\n <div name-cell>\n ${doc.isFavorite ? html`<md-icon favorite>star</md-icon>` : ''}\n <span>${doc.name}</span>\n </div>\n <div></div>\n <div>${doc.creator?.name || ''}</div>\n <div></div>\n <div></div>\n <div>${this._formatDate(doc.createdAt)}</div>\n </div>\n `\n )\n : html`\n <div empty-state>\n <md-icon>folder_open</md-icon>\n <div>등록된 문서가 없습니다.</div>\n <div style=\"font-size:12px; margin-top:4px;\">파일을 드래그하여 업로드하세요.</div>\n </div>\n `}\n </div>\n\n ${this.selectedDoc\n ? html`\n <div doc-detail>\n <div detail-content>\n <md-icon file-icon>description</md-icon>\n <div detail-info>\n <div file-name>${this.selectedDoc.name}</div>\n <div file-meta>\n <div>수정한 날짜: ${this._formatDateTime(this.selectedDoc.createdAt)}</div>\n ${this.selectedDoc.fileSize ? html`<div>크기: ${this._formatFileSize(this.selectedDoc.fileSize)}</div>` : ''}\n </div>\n ${this.selectedDoc.aiSummary\n ? html`\n <div ai-summary>\n <md-icon>auto_awesome</md-icon>\n <div>\n <strong>AI 브리핑</strong><br />\n ${this.selectedDoc.aiSummary}\n </div>\n </div>\n `\n : this.selectedDoc.aiSummaryStatus === '10'\n ? html`\n <div ai-pending>\n <md-icon>hourglass_top</md-icon>\n AI 요약 생성 중...\n </div>\n `\n : ''}\n </div>\n </div>\n </div>\n `\n : ''}\n `\n : html`\n <div empty-state>\n <md-icon>folder</md-icon>\n <div>소분류 폴더를 선택해주세요.</div>\n </div>\n `}\n `\n }\n\n private _selectDoc(doc: any) {\n this.selectedDoc = doc\n }\n\n private _openPreview(doc: any) {\n this.selectedDoc = doc\n\n if (!doc.fullpath) return\n\n const ext = doc.fullpath.toLowerCase().split('.').pop() || ''\n const isImage = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'].includes(ext)\n\n if (isImage) {\n openPopup(\n html`<image-preview-popup\n .images=${[{ fullpath: doc.fullpath, name: doc.name }]}\n .currentIndex=${0}\n ></image-preview-popup>`,\n { backdrop: true, size: 'large', title: doc.name }\n )\n } else {\n // PDF 등 기타 파일은 새 탭에서 열기\n window.open(doc.fullpath, '_blank')\n }\n }\n\n private _toggleDoc(e: Event, id: string) {\n const checked = (e.target as HTMLInputElement).checked\n const newSet = new Set(this.selectedIds)\n if (checked) {\n newSet.add(id)\n } else {\n newSet.delete(id)\n }\n this.selectedIds = newSet\n this.dispatchEvent(new CustomEvent('document-selected', { detail: newSet }))\n }\n\n private _toggleAll(e: Event) {\n const checked = (e.target as HTMLInputElement).checked\n if (checked) {\n this.selectedIds = new Set(this.documents.map(d => d.id))\n } else {\n this.selectedIds = new Set()\n }\n this.dispatchEvent(new CustomEvent('document-selected', { detail: this.selectedIds }))\n }\n\n /* Drag & Drop: 데스크톱 파일 업로드 */\n private _onListDragOver(e: DragEvent) {\n const types = e.dataTransfer?.types || []\n if (types.includes('Files')) {\n e.preventDefault()\n this.isDragOver = true\n }\n }\n\n private _onListDragLeave() {\n this.isDragOver = false\n }\n\n private _onListDrop(e: DragEvent) {\n e.preventDefault()\n this.isDragOver = false\n\n const files = Array.from(e.dataTransfer?.files || [])\n if (files.length > 0) {\n this.dispatchEvent(new CustomEvent('documents-changed', { detail: { files } }))\n }\n }\n\n /* Drag: 문서 이동용 */\n private _onDocDragStart(e: DragEvent, doc: any) {\n const ids = this.selectedIds.has(doc.id) ? Array.from(this.selectedIds) : [doc.id]\n e.dataTransfer?.setData('application/x-field-document-ids', JSON.stringify(ids))\n e.dataTransfer!.effectAllowed = 'move'\n }\n\n private _formatDate(date: any): string {\n if (!date) return ''\n try {\n const d = new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).format(d)\n } catch {\n return ''\n }\n }\n\n private _formatFileSize(size: string): string {\n const bytes = Number(size)\n if (isNaN(bytes)) return size\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n }\n\n private _formatDateTime(date: any): string {\n if (!date) return ''\n try {\n const d = new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n }).format(d)\n } catch {\n return ''\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"field-document-list-panel.js","sourceRoot":"","sources":["../../../../../client/pages/building-inspection/component/field-document/field-document-list-panel.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '../../component/image-preview-popup'\n\nimport { ScrollbarStyles } from '@operato/styles'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { openPopup } from '@operato/layout'\n\n@customElement('field-document-list-panel')\nexport class FieldDocumentListPanel extends LitElement {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n div[panel-header] {\n display: flex;\n align-items: center;\n padding: 10px 16px;\n background: #fafafa;\n border-bottom: 1px solid #e0e0e0;\n\n h3 {\n margin: 0;\n font-size: 14px;\n color: #333;\n flex: 1;\n }\n\n span[doc-count] {\n font-size: 12px;\n color: #999;\n }\n }\n\n div[table-header] {\n display: grid;\n grid-template-columns: 30px 40px 80px 1fr 80px 80px 80px 80px 100px;\n padding: 8px 16px;\n background: #f0e6e6;\n font-size: 12px;\n font-weight: bold;\n color: #666;\n border-bottom: 1px solid #ddd;\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n }\n }\n\n div[doc-list] {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\n position: relative;\n }\n\n div[doc-item] {\n display: grid;\n grid-template-columns: 30px 40px 80px 1fr 80px 80px 80px 80px 100px;\n padding: 8px 16px;\n border-bottom: 1px solid #f0f0f0;\n font-size: 13px;\n cursor: pointer;\n transition: background-color 0.15s;\n align-items: center;\n\n &:hover {\n background-color: #f5f5f5;\n }\n\n & > div {\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n md-icon[preview] {\n --md-icon-size: 18px;\n cursor: pointer;\n color: #999;\n border-radius: 50%;\n padding: 2px;\n }\n\n md-icon[preview]:hover {\n color: #0595e5;\n background: #e3f2fd;\n }\n\n div[name-cell] {\n justify-content: flex-start;\n gap: 6px;\n\n md-icon[favorite] {\n --md-icon-size: 16px;\n color: #ffc107;\n flex-shrink: 0;\n }\n\n span {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n\n div[ai-cell] {\n font-size: 11px;\n\n span[ai-done] {\n display: flex;\n align-items: center;\n gap: 2px;\n color: #2e7d32;\n\n md-icon {\n --md-icon-size: 14px;\n color: #4caf50;\n }\n }\n\n span[ai-pending] {\n color: #ef6c00;\n }\n }\n\n input[type='checkbox'] {\n cursor: pointer;\n }\n }\n\n div[doc-item][selected] {\n background-color: #e3f2fd;\n }\n\n div[doc-item][draggable='true'] {\n cursor: grab;\n\n &:active {\n cursor: grabbing;\n }\n }\n\n div[drop-zone] {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: rgba(33, 150, 243, 0.08);\n border: 3px dashed #1976d2;\n border-radius: 8px;\n z-index: 10;\n pointer-events: none;\n\n span {\n font-size: 16px;\n color: #1976d2;\n font-weight: bold;\n }\n }\n\n div[empty-state] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 60px 20px;\n color: #999;\n flex: 1;\n\n md-icon {\n --md-icon-size: 48px;\n color: #ddd;\n margin-bottom: 12px;\n }\n }\n\n div[doc-detail] {\n padding: 12px 16px;\n background: #fafafa;\n border-top: 1px solid #e0e0e0;\n overflow-y: auto;\n\n div[detail-content] {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n\n md-icon[file-icon] {\n --md-icon-size: 36px;\n color: #0595e5;\n background: #e3f2fd;\n padding: 8px;\n border-radius: 8px;\n flex-shrink: 0;\n }\n\n div[detail-info] {\n flex: 1;\n\n div[file-name] {\n font-weight: bold;\n font-size: 14px;\n margin-bottom: 4px;\n }\n\n div[file-meta] {\n font-size: 12px;\n color: #666;\n margin-bottom: 8px;\n }\n\n div[ai-summary] {\n padding: 8px 12px;\n background: #e8f5e9;\n border-radius: 6px;\n font-size: 12px;\n color: #333;\n\n strong {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-bottom: 4px;\n }\n\n md-icon {\n --md-icon-size: 18px;\n color: #4caf50;\n flex-shrink: 0;\n }\n }\n\n div[ai-pending] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 12px;\n background: #fff3e0;\n border-radius: 6px;\n font-size: 12px;\n color: #ef6c00;\n\n md-icon {\n --md-icon-size: 18px;\n flex-shrink: 0;\n }\n }\n }\n }\n\n }\n `\n ]\n\n @property({ type: String }) projectId: string = ''\n @property({ type: String }) code: string = ''\n @property({ type: String }) folderName: string = ''\n @property({ type: Array }) documents: any[] = []\n\n @state() private selectedIds: Set<string> = new Set()\n @state() private isDragOver: boolean = false\n @state() private selectedDoc: any = null\n\n render() {\n return html`\n <div panel-header>\n <h3>문서 목록${this.folderName ? ` - ${this.folderName}` : ''}</h3>\n <span doc-count>${this.documents.length}건</span>\n </div>\n\n ${this.code\n ? html`\n <div table-header>\n <div></div>\n <div>\n <input\n type=\"checkbox\"\n @change=${this._toggleAll}\n .checked=${this.selectedIds.size > 0 && this.selectedIds.size === this.documents.length}\n />\n </div>\n <div>문서번호</div>\n <div style=\"justify-content:flex-start; padding-left:8px;\">제 목</div>\n <div>등록부서</div>\n <div>등록자</div>\n <div>자료분류</div>\n <div>기술분야</div>\n <div>등록일자</div>\n </div>\n\n <div\n doc-list\n @dragover=${this._onListDragOver}\n @dragleave=${this._onListDragLeave}\n @drop=${this._onListDrop}\n >\n ${this.isDragOver ? html`<div drop-zone><span>여기에 파일을 놓으세요</span></div>` : ''}\n\n ${this.documents.length > 0\n ? this.documents.map(\n (doc, idx) => html`\n <div\n doc-item\n draggable=\"true\"\n ?selected=${this.selectedDoc?.id === doc.id}\n @dragstart=${(e: DragEvent) => this._onDocDragStart(e, doc)}\n @click=${() => this._selectDoc(doc)}\n >\n <div>\n <md-icon\n preview\n @click=${(e: Event) => {\n e.stopPropagation()\n this._openPreview(doc)\n }}\n >visibility</md-icon>\n </div>\n <div>\n <input\n type=\"checkbox\"\n .checked=${this.selectedIds.has(doc.id)}\n @change=${(e: Event) => this._toggleDoc(e, doc.id)}\n @click=${(e: Event) => e.stopPropagation()}\n />\n </div>\n <div>${doc.code}${String(idx + 1).padStart(2, '0')}</div>\n <div name-cell>\n ${doc.isFavorite ? html`<md-icon favorite>star</md-icon>` : ''}\n <span>${doc.name}</span>\n </div>\n <div></div>\n <div>${doc.creator?.name || ''}</div>\n <div></div>\n <div></div>\n <div>${this._formatDate(doc.createdAt)}</div>\n </div>\n `\n )\n : html`\n <div empty-state>\n <md-icon>folder_open</md-icon>\n <div>등록된 문서가 없습니다.</div>\n <div style=\"font-size:12px; margin-top:4px;\">파일을 드래그하여 업로드하세요.</div>\n </div>\n `}\n </div>\n\n ${this.selectedDoc\n ? html`\n <div doc-detail>\n <div detail-content>\n <md-icon file-icon>description</md-icon>\n <div detail-info>\n <div file-name>${this.selectedDoc.name}</div>\n <div file-meta>\n <div>수정한 날짜: ${this._formatDateTime(this.selectedDoc.createdAt)}</div>\n ${this.selectedDoc.fileSize ? html`<div>크기: ${this._formatFileSize(this.selectedDoc.fileSize)}</div>` : ''}\n </div>\n ${this.selectedDoc.aiSummary\n ? html`\n <div ai-summary>\n <strong><md-icon>auto_awesome</md-icon>AI 브리핑</strong>\n ${this.selectedDoc.aiSummary}\n </div>\n `\n : this.selectedDoc.aiSummaryStatus === '10'\n ? html`\n <div ai-pending>\n <md-icon>hourglass_top</md-icon>\n AI 요약 생성 중...\n </div>\n `\n : ''}\n </div>\n </div>\n </div>\n `\n : ''}\n `\n : html`\n <div empty-state>\n <md-icon>folder</md-icon>\n <div>소분류 폴더를 선택해주세요.</div>\n </div>\n `}\n `\n }\n\n private _selectDoc(doc: any) {\n this.selectedDoc = doc\n }\n\n private _openPreview(doc: any) {\n this.selectedDoc = doc\n\n if (!doc.fullpath) return\n\n const ext = doc.fullpath.toLowerCase().split('.').pop() || ''\n const isImage = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'].includes(ext)\n\n if (isImage) {\n openPopup(\n html`<image-preview-popup\n .images=${[{ fullpath: doc.fullpath, name: doc.name }]}\n .currentIndex=${0}\n ></image-preview-popup>`,\n { backdrop: true, size: 'large', title: doc.name }\n )\n } else {\n // PDF 등 기타 파일은 새 탭에서 열기\n window.open(doc.fullpath, '_blank')\n }\n }\n\n private _toggleDoc(e: Event, id: string) {\n const checked = (e.target as HTMLInputElement).checked\n const newSet = new Set(this.selectedIds)\n if (checked) {\n newSet.add(id)\n } else {\n newSet.delete(id)\n }\n this.selectedIds = newSet\n this.dispatchEvent(new CustomEvent('document-selected', { detail: newSet }))\n }\n\n private _toggleAll(e: Event) {\n const checked = (e.target as HTMLInputElement).checked\n if (checked) {\n this.selectedIds = new Set(this.documents.map(d => d.id))\n } else {\n this.selectedIds = new Set()\n }\n this.dispatchEvent(new CustomEvent('document-selected', { detail: this.selectedIds }))\n }\n\n /* Drag & Drop: 데스크톱 파일 업로드 */\n private _onListDragOver(e: DragEvent) {\n const types = e.dataTransfer?.types || []\n if (types.includes('Files')) {\n e.preventDefault()\n this.isDragOver = true\n }\n }\n\n private _onListDragLeave() {\n this.isDragOver = false\n }\n\n private _onListDrop(e: DragEvent) {\n e.preventDefault()\n this.isDragOver = false\n\n const files = Array.from(e.dataTransfer?.files || [])\n if (files.length > 0) {\n this.dispatchEvent(new CustomEvent('documents-changed', { detail: { files } }))\n }\n }\n\n /* Drag: 문서 이동용 */\n private _onDocDragStart(e: DragEvent, doc: any) {\n const ids = this.selectedIds.has(doc.id) ? Array.from(this.selectedIds) : [doc.id]\n e.dataTransfer?.setData('application/x-field-document-ids', JSON.stringify(ids))\n e.dataTransfer!.effectAllowed = 'move'\n }\n\n private _formatDate(date: any): string {\n if (!date) return ''\n try {\n const d = new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).format(d)\n } catch {\n return ''\n }\n }\n\n private _formatFileSize(size: string): string {\n const bytes = Number(size)\n if (isNaN(bytes)) return size\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n }\n\n private _formatDateTime(date: any): string {\n if (!date) return ''\n try {\n const d = new Date(date)\n return new Intl.DateTimeFormat('ko-KR', {\n timeZone: 'Asia/Seoul',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n hour12: true\n }).format(d)\n } catch {\n return ''\n }\n }\n}\n"]}
|
package/dist-client/pages/building-inspection/component/field-document/field-document-popup.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import '@material/web/icon/icon.js';
|
|
2
2
|
import '@material/web/button/filled-button.js';
|
|
3
3
|
import '@material/web/button/outlined-button.js';
|
|
4
|
+
import '@material/web/progress/circular-progress.js';
|
|
4
5
|
import './field-document-list-panel';
|
|
5
6
|
import { LitElement } from 'lit';
|
|
6
7
|
export declare class FieldDocumentPopup extends LitElement {
|
|
@@ -13,6 +14,8 @@ export declare class FieldDocumentPopup extends LitElement {
|
|
|
13
14
|
private selectedDocIds;
|
|
14
15
|
private codeCounts;
|
|
15
16
|
private dragOverItem;
|
|
17
|
+
private uploading;
|
|
18
|
+
private uploadingFile;
|
|
16
19
|
private _tooltipText;
|
|
17
20
|
private _tooltipX;
|
|
18
21
|
private _tooltipY;
|