@dssp/project 1.0.0-alpha.5 → 1.0.0-alpha.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/dist-client/pages/lib/waether.d.ts +2 -1
  2. package/dist-client/pages/lib/waether.js +7 -3
  3. package/dist-client/pages/lib/waether.js.map +1 -1
  4. package/dist-client/pages/project/popup/popup-plan-export.d.ts +10 -0
  5. package/dist-client/pages/project/popup/popup-plan-export.js +236 -0
  6. package/dist-client/pages/project/popup/popup-plan-export.js.map +1 -0
  7. package/dist-client/pages/project/popup/popup-plan-upload.d.ts +3 -0
  8. package/dist-client/pages/project/popup/popup-plan-upload.js +130 -4
  9. package/dist-client/pages/project/popup/popup-plan-upload.js.map +1 -1
  10. package/dist-client/pages/project/project-detail.d.ts +2 -1
  11. package/dist-client/pages/project/project-detail.js +269 -80
  12. package/dist-client/pages/project/project-detail.js.map +1 -1
  13. package/dist-client/pages/project/project-list.d.ts +12 -0
  14. package/dist-client/pages/project/project-list.js +6 -0
  15. package/dist-client/pages/project/project-list.js.map +1 -1
  16. package/dist-client/pages/project/project-plan-management.js +29 -13
  17. package/dist-client/pages/project/project-plan-management.js.map +1 -1
  18. package/dist-client/pages/project/project-update.d.ts +1 -0
  19. package/dist-client/pages/project/project-update.js +128 -17
  20. package/dist-client/pages/project/project-update.js.map +1 -1
  21. package/dist-client/tsconfig.tsbuildinfo +1 -1
  22. package/dist-server/service/project/project-mutation.d.ts +1 -0
  23. package/dist-server/service/project/project-mutation.js +102 -3
  24. package/dist-server/service/project/project-mutation.js.map +1 -1
  25. package/dist-server/service/project/project-type.d.ts +1 -0
  26. package/dist-server/service/project/project-type.js +5 -1
  27. package/dist-server/service/project/project-type.js.map +1 -1
  28. package/dist-server/service/project/project.d.ts +3 -1
  29. package/dist-server/service/project/project.js +6 -0
  30. package/dist-server/service/project/project.js.map +1 -1
  31. package/dist-server/tsconfig.tsbuildinfo +1 -1
  32. package/package.json +13 -12
@@ -2,5 +2,6 @@ export default function _getWeather(latitude: number, longitude: number): Promis
2
2
  rain: number;
3
3
  temperature: number;
4
4
  humidity: number;
5
- wind: string;
5
+ windDirection: string;
6
+ windSpeed: number;
6
7
  }>;
@@ -10,7 +10,8 @@ export default async function _getWeather(latitude, longitude) {
10
10
  let rain = 0;
11
11
  let temperature = 0;
12
12
  let humidity = 0;
13
- let wind = '';
13
+ let windDirection = '';
14
+ let windSpeed = 0;
14
15
  if (result.status == 200) {
15
16
  let weather = await result.json().then(data => { var _a; return (_a = data === null || data === void 0 ? void 0 : data.response) === null || _a === void 0 ? void 0 : _a.body; });
16
17
  weather = (_a = weather === null || weather === void 0 ? void 0 : weather.items) === null || _a === void 0 ? void 0 : _a.item;
@@ -26,12 +27,15 @@ export default async function _getWeather(latitude, longitude) {
26
27
  temperature = data.fcstValue;
27
28
  }
28
29
  if (data.category === 'VEC') {
29
- wind = _getWindDirectionByValue(data.fcstValue);
30
+ windDirection = _getWindDirectionByValue(data.fcstValue);
31
+ }
32
+ if (data.category === 'WSD') {
33
+ windSpeed = data.fcstValue;
30
34
  }
31
35
  }
32
36
  console.log('weather :', weather);
33
37
  }
34
- return { rain, temperature, humidity, wind };
38
+ return { rain, temperature, humidity, windDirection, windSpeed };
35
39
  }
36
40
  const RE = 6371.00877; // 지구 반경(km)
37
41
  const GRID = 5.0; // 격자 간격(km)
@@ -1 +1 @@
1
- {"version":3,"file":"waether.js","sourceRoot":"","sources":["../../../client/pages/lib/waether.ts"],"names":[],"mappings":"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","sourcesContent":["const API_KEY = '9epdR01s19phfu%2B3%2F0elTxTi92Nibl3qEO1HSm2QydrWOlrDqyNn9qzeQRJ3jPOh3hV8TesHg1L%2BQ9D6UOPmWQ%3D%3D'\nconst URL = 'https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst'\nconst NUM_OF_ROWS = 12\nconst DATA_TYPE = 'JSON'\n\nexport default async function _getWeather(latitude: number, longitude: number) {\n const { nx, ny } = _getIndexByLatAndLong(latitude, longitude)\n const { base_date, base_time } = _getTodayAndHour()\n const result = await fetch(\n `${URL}?serviceKey=${API_KEY}&base_date=${base_date}&base_time=${base_time}&nx=${nx}&ny=${ny}&pageNo=1&numOfRows=${NUM_OF_ROWS}&dataType=${DATA_TYPE}`\n )\n\n let rain = 0\n let temperature = 0\n let humidity = 0\n let wind = ''\n\n if (result.status == 200) {\n let weather = await result.json().then(data => data?.response?.body)\n weather = weather?.items?.item\n\n for (let key in weather) {\n const data = weather?.[key] || {}\n\n if (data.category === 'POP') {\n rain = data.fcstValue\n }\n if (data.category === 'REH') {\n humidity = data.fcstValue\n }\n if (data.category === 'TMP') {\n temperature = data.fcstValue\n }\n if (data.category === 'VEC') {\n wind = _getWindDirectionByValue(data.fcstValue)\n }\n }\n\n console.log('weather :', weather)\n }\n\n return { rain, temperature, humidity, wind }\n}\n\nconst RE = 6371.00877 // 지구 반경(km)\nconst GRID = 5.0 // 격자 간격(km)\nconst SLAT1 = 30.0 // 투영 위도1(degree)\nconst SLAT2 = 60.0 // 투영 위도2(degree)\nconst OLON = 126.0 // 기준점 경도(degree)\nconst OLAT = 38.0 // 기준점 위도(degree)\nconst XO = 43 // 기준점 X좌표(GRID)\nconst YO = 136 // 기1준점 Y좌표(GRID)\n\n// 위경도 -> 기상청 좌표\nfunction _getIndexByLatAndLong(latitude: number, longitude: number) {\n const DEGRAD = Math.PI / 180.0\n const re = RE / GRID\n const slat1 = SLAT1 * DEGRAD\n const slat2 = SLAT2 * DEGRAD\n const olon = OLON * DEGRAD\n const olat = OLAT * DEGRAD\n\n let sn = Math.tan(Math.PI * 0.25 + slat2 * 0.5) / Math.tan(Math.PI * 0.25 + slat1 * 0.5)\n sn = Math.log(Math.cos(slat1) / Math.cos(slat2)) / Math.log(sn)\n let sf = Math.tan(Math.PI * 0.25 + slat1 * 0.5)\n sf = (Math.pow(sf, sn) * Math.cos(slat1)) / sn\n let ro = Math.tan(Math.PI * 0.25 + olat * 0.5)\n ro = (re * sf) / Math.pow(ro, sn)\n let ra = Math.tan(Math.PI * 0.25 + latitude * DEGRAD * 0.5)\n ra = (re * sf) / Math.pow(ra, sn)\n let theta = longitude * DEGRAD - olon\n if (theta > Math.PI) theta -= 2.0 * Math.PI\n if (theta < -Math.PI) theta += 2.0 * Math.PI\n theta *= sn\n\n return {\n nx: Math.floor(ra * Math.sin(theta) + XO + 0.5),\n ny: Math.floor(ro - ra * Math.cos(theta) + YO + 0.5),\n latitude,\n longitude\n }\n}\n\nfunction _getTodayAndHour() {\n const now = new Date()\n const todayDate = now.toISOString().slice(0, 10).replace(/-/g, '')\n const yesterday = new Date(now)\n yesterday.setDate(yesterday.getDate() - 1)\n const yesterdayDate = yesterday.toISOString().slice(0, 10).replace(/-/g, '')\n\n // 1일 총 8번 데이터가 업데이트 된다. (0200, 0500, 0800, 1100, 1400, 1700, 2000, 2300)\n let base_date\n let base_time\n\n if (now.getHours() < 2 || (now.getHours() === 2 && now.getMinutes() <= 10)) {\n base_date = yesterdayDate\n base_time = '2300'\n } else if (now.getHours() < 5 || (now.getHours() === 5 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '0200'\n } else if (now.getHours() < 8 || (now.getHours() === 8 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '0500'\n } else if (now.getHours() <= 11 || now.getMinutes() <= 10) {\n base_date = todayDate\n base_time = '0800'\n } else if (now.getHours() < 14 || (now.getHours() === 14 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '1100'\n } else if (now.getHours() < 17 || (now.getHours() === 17 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '1400'\n } else if (now.getHours() < 20 || (now.getHours() === 20 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '1700'\n } else if (now.getHours() < 23 || (now.getHours() === 23 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '2000'\n } else {\n base_date = todayDate\n base_time = '2300'\n }\n\n return { base_time, base_date }\n}\n\nconst windTable = {\n 0: 'N',\n 1: 'NNE',\n 2: 'NE',\n 3: 'ENE',\n 4: 'E',\n 5: 'ESE',\n 6: 'SE',\n 7: 'SSE',\n 8: 'S',\n 9: 'SSW',\n 10: 'SW',\n 11: 'WSW',\n 12: 'W',\n 13: 'WNW',\n 14: 'NW',\n 15: 'NNW',\n 16: 'N'\n}\nconst directoinMapping = {\n N: '북',\n S: '남',\n E: '동',\n W: '서'\n}\n\nfunction _getWindDirectionByValue(value: number): string {\n const calc: number | null = Math.floor((Number(value) + 22.5 * 0.5) / 22.5) || null\n\n if (calc === null) return ''\n\n return windTable[calc]?.replace(/[NSEW]/g, match => directoinMapping[match]) || ''\n}\n"]}
1
+ {"version":3,"file":"waether.js","sourceRoot":"","sources":["../../../client/pages/lib/waether.ts"],"names":[],"mappings":"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","sourcesContent":["const API_KEY = '9epdR01s19phfu%2B3%2F0elTxTi92Nibl3qEO1HSm2QydrWOlrDqyNn9qzeQRJ3jPOh3hV8TesHg1L%2BQ9D6UOPmWQ%3D%3D'\nconst URL = 'https://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst'\nconst NUM_OF_ROWS = 12\nconst DATA_TYPE = 'JSON'\n\nexport default async function _getWeather(latitude: number, longitude: number) {\n const { nx, ny } = _getIndexByLatAndLong(latitude, longitude)\n const { base_date, base_time } = _getTodayAndHour()\n const result = await fetch(\n `${URL}?serviceKey=${API_KEY}&base_date=${base_date}&base_time=${base_time}&nx=${nx}&ny=${ny}&pageNo=1&numOfRows=${NUM_OF_ROWS}&dataType=${DATA_TYPE}`\n )\n\n let rain = 0\n let temperature = 0\n let humidity = 0\n let windDirection = ''\n let windSpeed = 0\n\n if (result.status == 200) {\n let weather = await result.json().then(data => data?.response?.body)\n weather = weather?.items?.item\n\n for (let key in weather) {\n const data = weather?.[key] || {}\n\n if (data.category === 'POP') {\n rain = data.fcstValue\n }\n if (data.category === 'REH') {\n humidity = data.fcstValue\n }\n if (data.category === 'TMP') {\n temperature = data.fcstValue\n }\n if (data.category === 'VEC') {\n windDirection = _getWindDirectionByValue(data.fcstValue)\n }\n if (data.category === 'WSD') {\n windSpeed = data.fcstValue\n }\n }\n\n console.log('weather :', weather)\n }\n\n return { rain, temperature, humidity, windDirection, windSpeed }\n}\n\nconst RE = 6371.00877 // 지구 반경(km)\nconst GRID = 5.0 // 격자 간격(km)\nconst SLAT1 = 30.0 // 투영 위도1(degree)\nconst SLAT2 = 60.0 // 투영 위도2(degree)\nconst OLON = 126.0 // 기준점 경도(degree)\nconst OLAT = 38.0 // 기준점 위도(degree)\nconst XO = 43 // 기준점 X좌표(GRID)\nconst YO = 136 // 기1준점 Y좌표(GRID)\n\n// 위경도 -> 기상청 좌표\nfunction _getIndexByLatAndLong(latitude: number, longitude: number) {\n const DEGRAD = Math.PI / 180.0\n const re = RE / GRID\n const slat1 = SLAT1 * DEGRAD\n const slat2 = SLAT2 * DEGRAD\n const olon = OLON * DEGRAD\n const olat = OLAT * DEGRAD\n\n let sn = Math.tan(Math.PI * 0.25 + slat2 * 0.5) / Math.tan(Math.PI * 0.25 + slat1 * 0.5)\n sn = Math.log(Math.cos(slat1) / Math.cos(slat2)) / Math.log(sn)\n let sf = Math.tan(Math.PI * 0.25 + slat1 * 0.5)\n sf = (Math.pow(sf, sn) * Math.cos(slat1)) / sn\n let ro = Math.tan(Math.PI * 0.25 + olat * 0.5)\n ro = (re * sf) / Math.pow(ro, sn)\n let ra = Math.tan(Math.PI * 0.25 + latitude * DEGRAD * 0.5)\n ra = (re * sf) / Math.pow(ra, sn)\n let theta = longitude * DEGRAD - olon\n if (theta > Math.PI) theta -= 2.0 * Math.PI\n if (theta < -Math.PI) theta += 2.0 * Math.PI\n theta *= sn\n\n return {\n nx: Math.floor(ra * Math.sin(theta) + XO + 0.5),\n ny: Math.floor(ro - ra * Math.cos(theta) + YO + 0.5),\n latitude,\n longitude\n }\n}\n\nfunction _getTodayAndHour() {\n const now = new Date()\n const todayDate = now.toISOString().slice(0, 10).replace(/-/g, '')\n const yesterday = new Date(now)\n yesterday.setDate(yesterday.getDate() - 1)\n const yesterdayDate = yesterday.toISOString().slice(0, 10).replace(/-/g, '')\n\n // 1일 총 8번 데이터가 업데이트 된다. (0200, 0500, 0800, 1100, 1400, 1700, 2000, 2300)\n let base_date\n let base_time\n\n if (now.getHours() < 2 || (now.getHours() === 2 && now.getMinutes() <= 10)) {\n base_date = yesterdayDate\n base_time = '2300'\n } else if (now.getHours() < 5 || (now.getHours() === 5 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '0200'\n } else if (now.getHours() < 8 || (now.getHours() === 8 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '0500'\n } else if (now.getHours() <= 11 || now.getMinutes() <= 10) {\n base_date = todayDate\n base_time = '0800'\n } else if (now.getHours() < 14 || (now.getHours() === 14 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '1100'\n } else if (now.getHours() < 17 || (now.getHours() === 17 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '1400'\n } else if (now.getHours() < 20 || (now.getHours() === 20 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '1700'\n } else if (now.getHours() < 23 || (now.getHours() === 23 && now.getMinutes() <= 10)) {\n base_date = todayDate\n base_time = '2000'\n } else {\n base_date = todayDate\n base_time = '2300'\n }\n\n return { base_time, base_date }\n}\n\nconst windTable = {\n 0: 'N',\n 1: 'NNE',\n 2: 'NE',\n 3: 'ENE',\n 4: 'E',\n 5: 'ESE',\n 6: 'SE',\n 7: 'SSE',\n 8: 'S',\n 9: 'SSW',\n 10: 'SW',\n 11: 'WSW',\n 12: 'W',\n 13: 'WNW',\n 14: 'NW',\n 15: 'NNW',\n 16: 'N'\n}\nconst directoinMapping = {\n N: '북',\n S: '남',\n E: '동',\n W: '서'\n}\n\nfunction _getWindDirectionByValue(value: number): string {\n const calc: number | null = Math.floor((Number(value) + 22.5 * 0.5) / 22.5) || null\n\n if (calc === null) return ''\n\n return windTable[calc]?.replace(/[NSEW]/g, match => directoinMapping[match]) || ''\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import { LitElement } from 'lit';
2
+ export declare class PopupPlanExport extends LitElement {
3
+ static styles: import("lit").CSSResult[];
4
+ private buildingLevel;
5
+ private selectedFileIds;
6
+ render(): import("lit-html").TemplateResult<1>;
7
+ private _onFileItemClick;
8
+ private _exportFiles;
9
+ private _close;
10
+ }
@@ -0,0 +1,236 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { css, html, LitElement } from 'lit';
3
+ import { customElement, property, state } from 'lit/decorators.js';
4
+ import { client } from '@operato/graphql';
5
+ import { notify } from '@operato/layout';
6
+ import gql from 'graphql-tag';
7
+ let PopupPlanExport = class PopupPlanExport extends LitElement {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.buildingLevel = {};
11
+ this.selectedFileIds = [];
12
+ }
13
+ render() {
14
+ const { mainDrawing, elevationDrawing, rebarDistributionDrawing, etcDrawings } = this.buildingLevel;
15
+ // 메인 도면 파일들
16
+ const mainFiles = [];
17
+ if (mainDrawing === null || mainDrawing === void 0 ? void 0 : mainDrawing.id) {
18
+ mainFiles.push({ id: mainDrawing.id, name: mainDrawing.name, type: '평면도' });
19
+ }
20
+ if (elevationDrawing === null || elevationDrawing === void 0 ? void 0 : elevationDrawing.id) {
21
+ mainFiles.push({ id: elevationDrawing.id, name: elevationDrawing.name, type: '입면도' });
22
+ }
23
+ if (rebarDistributionDrawing === null || rebarDistributionDrawing === void 0 ? void 0 : rebarDistributionDrawing.id) {
24
+ mainFiles.push({ id: rebarDistributionDrawing.id, name: rebarDistributionDrawing.name, type: '철근배근도' });
25
+ }
26
+ // 기타 도면 파일들
27
+ const etcFiles = (etcDrawings === null || etcDrawings === void 0 ? void 0 : etcDrawings.map(drawing => ({ id: drawing.id, name: drawing.name, type: '기타 도면' }))) || [];
28
+ return html `
29
+ <div body>
30
+ <div file-list-container>
31
+ ${mainFiles.length > 0
32
+ ? html `
33
+ <div section-title>주요 도면</div>
34
+ ${mainFiles.map(file => html `
35
+ <div file-item @click=${() => this._onFileItemClick(file.id)}>
36
+ <input
37
+ type="checkbox"
38
+ .checked=${this.selectedFileIds.includes(file.id)}
39
+ @click=${(e) => e.stopPropagation()}
40
+ />
41
+ <div file-info>
42
+ <md-icon>description</md-icon>
43
+ <span file-name>${file.name || ''}</span>
44
+ <span file-type>${file.type}</span>
45
+ </div>
46
+ </div>
47
+ `)}
48
+ `
49
+ : ''}
50
+ ${etcFiles.length > 0
51
+ ? html `
52
+ <div section-title>기타 도면</div>
53
+ ${etcFiles.map(file => html `
54
+ <div file-item @click=${() => this._onFileItemClick(file.id)}>
55
+ <input
56
+ type="checkbox"
57
+ .checked=${this.selectedFileIds.includes(file.id)}
58
+ @click=${(e) => e.stopPropagation()}
59
+ />
60
+ <div file-info>
61
+ <md-icon>attachment</md-icon>
62
+ <span file-name>${file.name || ''}</span>
63
+ <span file-type>${file.type}</span>
64
+ </div>
65
+ </div>
66
+ `)}
67
+ `
68
+ : ''}
69
+ ${mainFiles.length === 0 && etcFiles.length === 0
70
+ ? html ` <div style="text-align: center; color: #666; padding: 40px;">내보낼 도면 파일이 없습니다.</div> `
71
+ : ''}
72
+ </div>
73
+
74
+ <div button-container>
75
+ <md-outlined-button @click=${this._close}> <md-icon slot="icon">cancel</md-icon>취소 </md-outlined-button>
76
+ <md-filled-button @click=${this._exportFiles} .disabled=${this.selectedFileIds.length === 0}>
77
+ <md-icon slot="icon">download</md-icon>내보내기 (${this.selectedFileIds.length})
78
+ </md-filled-button>
79
+ </div>
80
+ </div>
81
+ `;
82
+ }
83
+ _onFileItemClick(fileId) {
84
+ if (this.selectedFileIds.includes(fileId)) {
85
+ this.selectedFileIds = this.selectedFileIds.filter(id => id !== fileId);
86
+ }
87
+ else {
88
+ this.selectedFileIds = [...this.selectedFileIds, fileId];
89
+ }
90
+ }
91
+ async _exportFiles() {
92
+ var _a;
93
+ if (this.selectedFileIds.length === 0) {
94
+ notify({ message: '내보낼 파일을 선택해주세요.', level: 'warn' });
95
+ return;
96
+ }
97
+ try {
98
+ const response = await client.mutate({
99
+ mutation: gql `
100
+ mutation DownloadPlanFiles($fileIds: [String!]!) {
101
+ downloadPlanFiles(fileIds: $fileIds)
102
+ }
103
+ `,
104
+ variables: {
105
+ fileIds: this.selectedFileIds
106
+ }
107
+ });
108
+ if ((_a = response.data) === null || _a === void 0 ? void 0 : _a.downloadPlanFiles) {
109
+ // 서버에서 ZIP 파일 다운로드 URL을 반환하는 경우
110
+ const link = document.createElement('a');
111
+ link.href = response.data.downloadPlanFiles;
112
+ link.download = `${this.buildingLevel.building.name} ${this.buildingLevel.floorDisplayName}층 도면.zip`;
113
+ document.body.appendChild(link);
114
+ link.click();
115
+ document.body.removeChild(link);
116
+ notify({ message: `${this.selectedFileIds.length}개 파일이 ZIP으로 압축되어 다운로드 되었습니다.` });
117
+ this._close();
118
+ }
119
+ }
120
+ catch (error) {
121
+ console.error('파일 내보내기 중 오류 발생:', error);
122
+ notify({ message: '파일 내보내기 중 오류가 발생했습니다.', level: 'error' });
123
+ }
124
+ }
125
+ _close() {
126
+ history.back();
127
+ }
128
+ };
129
+ PopupPlanExport.styles = [
130
+ css `
131
+ :host {
132
+ display: flex;
133
+ flex-direction: column;
134
+ background-color: #fff;
135
+ width: 100%;
136
+ max-height: 80vh;
137
+ }
138
+
139
+ div[body] {
140
+ flex: 1;
141
+ overflow-y: auto;
142
+ padding: 20px;
143
+
144
+ div[file-list-container] {
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: 15px;
148
+ background-color: #f7f7f7;
149
+ padding: 20px;
150
+ border-radius: 8px;
151
+ margin-bottom: 20px;
152
+
153
+ div[file-item] {
154
+ display: flex;
155
+ align-items: center;
156
+ gap: 12px;
157
+ padding: 12px;
158
+ background-color: #fff;
159
+ border-radius: 6px;
160
+ border: 1px solid #ddd;
161
+ cursor: pointer;
162
+ transition: background-color 0.2s ease;
163
+
164
+ &:hover {
165
+ background-color: #f5f5f5;
166
+ }
167
+
168
+ input[type='checkbox'] {
169
+ width: 18px;
170
+ height: 18px;
171
+ cursor: pointer;
172
+ }
173
+
174
+ div[file-info] {
175
+ flex: 1;
176
+ display: flex;
177
+ align-items: center;
178
+ gap: 10px;
179
+
180
+ md-icon {
181
+ --md-icon-size: 24px;
182
+ color: #666;
183
+ }
184
+
185
+ span[file-name] {
186
+ font-size: 14px;
187
+ font-weight: 500;
188
+ color: #333;
189
+ }
190
+
191
+ span[file-type] {
192
+ font-size: 12px;
193
+ color: #666;
194
+ background-color: #f0f0f0;
195
+ padding: 2px 6px;
196
+ border-radius: 4px;
197
+ }
198
+ }
199
+ }
200
+
201
+ div[section-title] {
202
+ font-size: 16px;
203
+ font-weight: 600;
204
+ color: #333;
205
+ margin-top: 10px;
206
+ margin-bottom: 5px;
207
+ border-bottom: 2px solid #ddd;
208
+ padding-bottom: 5px;
209
+ }
210
+ }
211
+
212
+ div[button-container] {
213
+ display: flex;
214
+ align-items: center;
215
+ justify-content: center;
216
+ gap: 10px;
217
+ margin-top: 20px;
218
+ padding-top: 20px;
219
+ border-top: 1px solid #eee;
220
+ }
221
+ }
222
+ `
223
+ ];
224
+ __decorate([
225
+ property({ type: Object }),
226
+ __metadata("design:type", Object)
227
+ ], PopupPlanExport.prototype, "buildingLevel", void 0);
228
+ __decorate([
229
+ state(),
230
+ __metadata("design:type", Array)
231
+ ], PopupPlanExport.prototype, "selectedFileIds", void 0);
232
+ PopupPlanExport = __decorate([
233
+ customElement('popup-plan-export')
234
+ ], PopupPlanExport);
235
+ export { PopupPlanExport };
236
+ //# sourceMappingURL=popup-plan-export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popup-plan-export.js","sourceRoot":"","sources":["../../../../client/pages/project/popup/popup-plan-export.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { BuildingLevel } from '../project-list'\nimport { client } from '@operato/graphql'\nimport { notify } from '@operato/layout'\nimport gql from 'graphql-tag'\n\ninterface FileItem {\n id: string\n name?: string\n type: string\n}\n\n@customElement('popup-plan-export')\nexport class PopupPlanExport extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: #fff;\n width: 100%;\n max-height: 80vh;\n }\n\n div[body] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n\n div[file-list-container] {\n display: flex;\n flex-direction: column;\n gap: 15px;\n background-color: #f7f7f7;\n padding: 20px;\n border-radius: 8px;\n margin-bottom: 20px;\n\n div[file-item] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px;\n background-color: #fff;\n border-radius: 6px;\n border: 1px solid #ddd;\n cursor: pointer;\n transition: background-color 0.2s ease;\n\n &:hover {\n background-color: #f5f5f5;\n }\n\n input[type='checkbox'] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n }\n\n div[file-info] {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n\n md-icon {\n --md-icon-size: 24px;\n color: #666;\n }\n\n span[file-name] {\n font-size: 14px;\n font-weight: 500;\n color: #333;\n }\n\n span[file-type] {\n font-size: 12px;\n color: #666;\n background-color: #f0f0f0;\n padding: 2px 6px;\n border-radius: 4px;\n }\n }\n }\n\n div[section-title] {\n font-size: 16px;\n font-weight: 600;\n color: #333;\n margin-top: 10px;\n margin-bottom: 5px;\n border-bottom: 2px solid #ddd;\n padding-bottom: 5px;\n }\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n margin-top: 20px;\n padding-top: 20px;\n border-top: 1px solid #eee;\n }\n }\n `\n ]\n\n @property({ type: Object }) private buildingLevel: BuildingLevel = {}\n @state() private selectedFileIds: string[] = []\n\n render() {\n const { mainDrawing, elevationDrawing, rebarDistributionDrawing, etcDrawings } = this.buildingLevel\n\n // 메인 도면 파일들\n const mainFiles: FileItem[] = []\n if (mainDrawing?.id) {\n mainFiles.push({ id: mainDrawing.id, name: mainDrawing.name, type: '평면도' })\n }\n if (elevationDrawing?.id) {\n mainFiles.push({ id: elevationDrawing.id, name: elevationDrawing.name, type: '입면도' })\n }\n if (rebarDistributionDrawing?.id) {\n mainFiles.push({ id: rebarDistributionDrawing.id, name: rebarDistributionDrawing.name, type: '철근배근도' })\n }\n\n // 기타 도면 파일들\n const etcFiles: FileItem[] = etcDrawings?.map(drawing => ({ id: drawing.id!, name: drawing.name, type: '기타 도면' })) || []\n\n return html`\n <div body>\n <div file-list-container>\n ${mainFiles.length > 0\n ? html`\n <div section-title>주요 도면</div>\n ${mainFiles.map(\n file => html`\n <div file-item @click=${() => this._onFileItemClick(file.id)}>\n <input\n type=\"checkbox\"\n .checked=${this.selectedFileIds.includes(file.id)}\n @click=${(e: Event) => e.stopPropagation()}\n />\n <div file-info>\n <md-icon>description</md-icon>\n <span file-name>${file.name || ''}</span>\n <span file-type>${file.type}</span>\n </div>\n </div>\n `\n )}\n `\n : ''}\n ${etcFiles.length > 0\n ? html`\n <div section-title>기타 도면</div>\n ${etcFiles.map(\n file => html`\n <div file-item @click=${() => this._onFileItemClick(file.id)}>\n <input\n type=\"checkbox\"\n .checked=${this.selectedFileIds.includes(file.id)}\n @click=${(e: Event) => e.stopPropagation()}\n />\n <div file-info>\n <md-icon>attachment</md-icon>\n <span file-name>${file.name || ''}</span>\n <span file-type>${file.type}</span>\n </div>\n </div>\n `\n )}\n `\n : ''}\n ${mainFiles.length === 0 && etcFiles.length === 0\n ? html` <div style=\"text-align: center; color: #666; padding: 40px;\">내보낼 도면 파일이 없습니다.</div> `\n : ''}\n </div>\n\n <div button-container>\n <md-outlined-button @click=${this._close}> <md-icon slot=\"icon\">cancel</md-icon>취소 </md-outlined-button>\n <md-filled-button @click=${this._exportFiles} .disabled=${this.selectedFileIds.length === 0}>\n <md-icon slot=\"icon\">download</md-icon>내보내기 (${this.selectedFileIds.length})\n </md-filled-button>\n </div>\n </div>\n `\n }\n\n private _onFileItemClick(fileId: string) {\n if (this.selectedFileIds.includes(fileId)) {\n this.selectedFileIds = this.selectedFileIds.filter(id => id !== fileId)\n } else {\n this.selectedFileIds = [...this.selectedFileIds, fileId]\n }\n }\n\n private async _exportFiles() {\n if (this.selectedFileIds.length === 0) {\n notify({ message: '내보낼 파일을 선택해주세요.', level: 'warn' })\n return\n }\n\n try {\n const response = await client.mutate({\n mutation: gql`\n mutation DownloadPlanFiles($fileIds: [String!]!) {\n downloadPlanFiles(fileIds: $fileIds)\n }\n `,\n variables: {\n fileIds: this.selectedFileIds\n }\n })\n\n if (response.data?.downloadPlanFiles) {\n // 서버에서 ZIP 파일 다운로드 URL을 반환하는 경우\n const link = document.createElement('a')\n link.href = response.data.downloadPlanFiles\n link.download = `${this.buildingLevel!.building!.name} ${this.buildingLevel!.floorDisplayName}층 도면.zip`\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n\n notify({ message: `${this.selectedFileIds.length}개 파일이 ZIP으로 압축되어 다운로드 되었습니다.` })\n this._close()\n }\n } catch (error) {\n console.error('파일 내보내기 중 오류 발생:', error)\n notify({ message: '파일 내보내기 중 오류가 발생했습니다.', level: 'error' })\n }\n }\n\n private _close() {\n history.back()\n }\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { LitElement } from 'lit';
2
+ import './popup-plan-export';
2
3
  export declare class PopupPlanUpload extends LitElement {
3
4
  static styles: import("lit").CSSResult[];
4
5
  private buildingLevel;
@@ -6,5 +7,7 @@ export declare class PopupPlanUpload extends LitElement {
6
7
  render(): import("lit-html").TemplateResult<1>;
7
8
  private _close;
8
9
  _onChangeAttachment(e: CustomEvent): Promise<void>;
10
+ private _deleteDrawing;
11
+ private _openExportPopup;
9
12
  private _getThumbnailStyle;
10
13
  }
@@ -1,6 +1,8 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
2
  import { css, html, LitElement } from 'lit';
3
3
  import { customElement, property } from 'lit/decorators.js';
4
+ import { openPopup } from '@operato/layout';
5
+ import './popup-plan-export';
4
6
  let PopupPlanUpload = class PopupPlanUpload extends LitElement {
5
7
  constructor() {
6
8
  super(...arguments);
@@ -31,6 +33,8 @@ let PopupPlanUpload = class PopupPlanUpload extends LitElement {
31
33
  const rebarDistributionDrawingThumbnailStyle = rebarDistributionDrawingThumbnail
32
34
  ? this._getThumbnailStyle(rebarDistributionDrawingThumbnail)
33
35
  : '';
36
+ // 기타 도면 스타일
37
+ const { etcDrawings } = this.buildingLevel;
34
38
  return html `
35
39
  <div body>
36
40
  <div input-container>
@@ -65,8 +69,32 @@ let PopupPlanUpload = class PopupPlanUpload extends LitElement {
65
69
  ></ox-input-file>
66
70
  </div>
67
71
 
72
+ <div etc-drawing-container>
73
+ <ox-input-file
74
+ name="etcDrawings"
75
+ accept="*/*"
76
+ multiple="true"
77
+ hide-filelist
78
+ icon="upload"
79
+ label="업로드"
80
+ description="기타 파일"
81
+ @change=${this._onChangeAttachment.bind(this)}
82
+ ></ox-input-file>
83
+
84
+ ${etcDrawings === null || etcDrawings === void 0 ? void 0 : etcDrawings.map((drawing, index) => html `
85
+ <div file-box>
86
+ <md-icon slot="icon" outline>files</md-icon>
87
+ <span file-name>${drawing.name}</span>
88
+ <button delete-btn @click=${() => this._deleteDrawing(index)}>X</button>
89
+ </div>
90
+ `)}
91
+ </div>
92
+
68
93
  <div button-container>
69
- <md-outlined-button @click=${this._close}><md-icon slot="icon">cancel</md-icon>취소</md-outlined-button>
94
+ <md-outlined-button @click=${this._close}><md-icon slot="icon">cancel</md-icon>닫기</md-outlined-button>
95
+ <md-filled-button @click=${this._openExportPopup}
96
+ ><md-icon slot="icon" outline>archive</md-icon>파일 내보내기</md-filled-button
97
+ >
70
98
  </div>
71
99
  </div>
72
100
  `;
@@ -77,13 +105,39 @@ let PopupPlanUpload = class PopupPlanUpload extends LitElement {
77
105
  // 이미지 업로드
78
106
  async _onChangeAttachment(e) {
79
107
  const target = e.target;
80
- const file = e.detail[0] || null;
81
- this.buildingLevel[target.name] = file;
82
- this.buildingLevel[`${target.name}Upload`] = file;
108
+ const isMultiple = target.getAttribute('multiple') === 'true';
109
+ // multiple 속성이 있으면 배열로 처리
110
+ if (isMultiple) {
111
+ const originFiles = this.buildingLevel[target.name] || [];
112
+ const originUploads = this.buildingLevel[`${target.name}Upload`] || [];
113
+ const file = e.detail || [];
114
+ this.buildingLevel[target.name] = [...originFiles, ...file];
115
+ this.buildingLevel[`${target.name}Upload`] = [...originUploads, ...file];
116
+ }
117
+ else {
118
+ const file = e.detail[0] || null;
119
+ this.buildingLevel[target.name] = file;
120
+ this.buildingLevel[`${target.name}Upload`] = file;
121
+ }
83
122
  this.buildingLevel = Object.assign({}, this.buildingLevel);
84
123
  const detail = { buildingLevel: this.buildingLevel, selectedIdx: this.selectedIdx };
85
124
  this.dispatchEvent(new CustomEvent('file_change', { bubbles: false, detail: detail }));
86
125
  }
126
+ _deleteDrawing(index) {
127
+ if (this.buildingLevel.etcDrawings && Array.isArray(this.buildingLevel.etcDrawings)) {
128
+ this.buildingLevel.etcDrawings.splice(index, 1);
129
+ this.buildingLevel = Object.assign({}, this.buildingLevel);
130
+ const detail = { buildingLevel: this.buildingLevel, selectedIdx: this.selectedIdx };
131
+ this.dispatchEvent(new CustomEvent('file_change', { bubbles: false, detail: detail }));
132
+ }
133
+ }
134
+ _openExportPopup() {
135
+ openPopup(html `<popup-plan-export .buildingLevel=${this.buildingLevel}></popup-plan-export>`, {
136
+ backdrop: true,
137
+ size: 'medium',
138
+ title: `도면 내보내기`
139
+ });
140
+ }
87
141
  _getThumbnailStyle(path) {
88
142
  return `background: url(${path}); background-size: cover; background-repeat: round; justify-content: flex-end;`;
89
143
  }
@@ -115,12 +169,84 @@ PopupPlanUpload.styles = [
115
169
  }
116
170
  }
117
171
 
172
+ div[etc-drawing-container] {
173
+ display: flex;
174
+ align-items: center;
175
+ margin-top: 15px;
176
+ padding: 10px;
177
+ gap: 25px;
178
+ background-color: #f7f7f7;
179
+ overflow-y: auto;
180
+
181
+ ox-input-file {
182
+ height: 120px;
183
+ width: 100px;
184
+ min-width: 100px;
185
+ line-height: 100%;
186
+ }
187
+
188
+ div[file-box] {
189
+ display: flex;
190
+ flex-direction: column;
191
+ align-items: center;
192
+ justify-content: center;
193
+ height: 120px;
194
+ width: 100px;
195
+ min-width: 100px;
196
+ background-color: #fff;
197
+ border: 2px solid #aaa;
198
+ border-radius: 8px;
199
+ position: relative;
200
+
201
+ span[file-name] {
202
+ font-size: 12px;
203
+ text-align: center;
204
+ padding: 5px;
205
+ word-break: break-all;
206
+ max-width: 90px;
207
+ color: #333;
208
+ }
209
+
210
+ button[delete-btn] {
211
+ position: absolute;
212
+ top: -8px;
213
+ right: -8px;
214
+ width: 20px;
215
+ height: 20px;
216
+ border-radius: 50%;
217
+ background-color: #ff4444;
218
+ color: white;
219
+ border: none;
220
+ cursor: pointer;
221
+ display: flex;
222
+ align-items: center;
223
+ justify-content: center;
224
+ font-size: 12px;
225
+ font-weight: bold;
226
+
227
+ &:hover {
228
+ background-color: #cc0000;
229
+ }
230
+ }
231
+ }
232
+ }
233
+
118
234
  div[button-container] {
119
235
  display: flex;
120
236
  align-items: center;
121
237
  justify-content: center;
238
+ gap: 10px;
122
239
  margin-top: 20px;
123
240
  }
241
+
242
+ md-icon[outline] {
243
+ --md-icon-size: 35px;
244
+ font-variation-settings:
245
+ 'FILL' 0,
246
+ 'wght' 400,
247
+ 'GRAD' 0,
248
+ 'opsz' 24;
249
+ }
124
250
  }
125
251
  `
126
252
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"popup-plan-upload.js","sourceRoot":"","sources":["../../../../client/pages/project/popup/popup-plan-upload.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { BuildingLevel } from '../project-list'\n\n@customElement('popup-plan-upload')\nexport class PopupPlanUpload extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: #fff;\n width: 100%;\n }\n\n div[body] {\n flex: 1;\n\n div[input-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 25px;\n background-color: #f7f7f7;\n padding: 35px 27px 27px 27px;\n\n ox-input-file {\n height: 100px;\n width: 120px;\n line-height: 100%;\n }\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n margin-top: 20px;\n }\n }\n `\n ]\n\n @property({ type: Object }) private buildingLevel: BuildingLevel = {}\n @property({ type: Number }) private selectedIdx: number | undefined\n\n render() {\n const noUploadStyle = '--file-uploader-icon-size: 0; --file-uploader-label-padding; 0;'\n\n // 메인 도면 스타일\n const { mainDrawing, mainDrawingThumbnail } = this.buildingLevel\n const mainDrawingIcon = mainDrawing ? '' : 'upload'\n const mainDrawingStyle = mainDrawing ? noUploadStyle : ''\n const mainDrawingLabel = mainDrawingThumbnail ? ' ' : '업로드'\n const mainDrawingDesc = mainDrawingThumbnail ? ' ' : '평면 파일'\n const mainDrawingThumbnailStyle = mainDrawingThumbnail ? this._getThumbnailStyle(mainDrawingThumbnail) : ''\n\n // 입면 도면 스타일\n const { elevationDrawing, elevationDrawingThumbnail } = this.buildingLevel\n const elevationDrawingIcon = elevationDrawing ? '' : 'upload'\n const elevationDrawingLabel = elevationDrawingThumbnail ? ' ' : '업로드'\n const elevationDrawingDesc = elevationDrawingThumbnail ? ' ' : '입면 파일'\n const elevationDrawingStyle = elevationDrawing ? noUploadStyle : ''\n const elevationDrawingThumbnailStyle = elevationDrawingThumbnail ? this._getThumbnailStyle(elevationDrawingThumbnail) : ''\n\n // 철근배근도 도면 스타일\n const { rebarDistributionDrawing, rebarDistributionDrawingThumbnail } = this.buildingLevel\n const rebarDistributionDrawingIcon = rebarDistributionDrawing ? '' : 'upload'\n const rebarDistributionDrawingStyle = rebarDistributionDrawing ? noUploadStyle : ''\n const rebarDistributionDrawingLabel = rebarDistributionDrawingThumbnail ? ' ' : '업로드'\n const rebarDistributionDrawingDesc = rebarDistributionDrawingThumbnail ? ' ' : '철근배근도 파일'\n const rebarDistributionDrawingThumbnailStyle = rebarDistributionDrawingThumbnail\n ? this._getThumbnailStyle(rebarDistributionDrawingThumbnail)\n : ''\n\n return html`\n <div body>\n <div input-container>\n <ox-input-file\n name=\"mainDrawing\"\n .value=${mainDrawing || undefined}\n icon=${mainDrawingIcon}\n label=${mainDrawingLabel}\n description=${mainDrawingDesc}\n @change=${this._onChangeAttachment.bind(this)}\n style=\"${mainDrawingStyle + mainDrawingThumbnailStyle}\"\n ></ox-input-file>\n\n <ox-input-file\n name=\"elevationDrawing\"\n .value=${elevationDrawing || undefined}\n icon=${elevationDrawingIcon}\n label=${elevationDrawingLabel}\n description=${elevationDrawingDesc}\n @change=${this._onChangeAttachment.bind(this)}\n style=\"${elevationDrawingStyle + elevationDrawingThumbnailStyle}\"\n ></ox-input-file>\n\n <ox-input-file\n name=\"rebarDistributionDrawing\"\n .value=${rebarDistributionDrawing || undefined}\n icon=${rebarDistributionDrawingIcon}\n label=${rebarDistributionDrawingLabel}\n description=${rebarDistributionDrawingDesc}\n @change=${this._onChangeAttachment.bind(this)}\n style=\"${rebarDistributionDrawingStyle + rebarDistributionDrawingThumbnailStyle}\"\n ></ox-input-file>\n </div>\n\n <div button-container>\n <md-outlined-button @click=${this._close}><md-icon slot=\"icon\">cancel</md-icon>취소</md-outlined-button>\n </div>\n </div>\n `\n }\n\n private _close() {\n history.back()\n }\n\n // 이미지 업로드\n async _onChangeAttachment(e: CustomEvent) {\n const target = e.target as HTMLInputElement\n const file = e.detail[0] || null\n\n this.buildingLevel[target.name] = file\n this.buildingLevel[`${target.name}Upload`] = file\n\n this.buildingLevel = { ...this.buildingLevel }\n\n const detail = { buildingLevel: this.buildingLevel, selectedIdx: this.selectedIdx }\n this.dispatchEvent(new CustomEvent('file_change', { bubbles: false, detail: detail }))\n }\n\n private _getThumbnailStyle(path) {\n return `background: url(${path}); background-size: cover; background-repeat: round; justify-content: flex-end;`\n }\n}\n"]}
1
+ {"version":3,"file":"popup-plan-upload.js","sourceRoot":"","sources":["../../../../client/pages/project/popup/popup-plan-upload.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { BuildingLevel } from '../project-list'\nimport { openPopup } from '@operato/layout'\nimport './popup-plan-export'\n\n@customElement('popup-plan-upload')\nexport class PopupPlanUpload extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: #fff;\n width: 100%;\n }\n\n div[body] {\n flex: 1;\n\n div[input-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 25px;\n background-color: #f7f7f7;\n padding: 35px 27px 27px 27px;\n\n ox-input-file {\n height: 100px;\n width: 120px;\n line-height: 100%;\n }\n }\n\n div[etc-drawing-container] {\n display: flex;\n align-items: center;\n margin-top: 15px;\n padding: 10px;\n gap: 25px;\n background-color: #f7f7f7;\n overflow-y: auto;\n\n ox-input-file {\n height: 120px;\n width: 100px;\n min-width: 100px;\n line-height: 100%;\n }\n\n div[file-box] {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 120px;\n width: 100px;\n min-width: 100px;\n background-color: #fff;\n border: 2px solid #aaa;\n border-radius: 8px;\n position: relative;\n\n span[file-name] {\n font-size: 12px;\n text-align: center;\n padding: 5px;\n word-break: break-all;\n max-width: 90px;\n color: #333;\n }\n\n button[delete-btn] {\n position: absolute;\n top: -8px;\n right: -8px;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background-color: #ff4444;\n color: white;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: bold;\n\n &:hover {\n background-color: #cc0000;\n }\n }\n }\n }\n\n div[button-container] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 10px;\n margin-top: 20px;\n }\n\n md-icon[outline] {\n --md-icon-size: 35px;\n font-variation-settings:\n 'FILL' 0,\n 'wght' 400,\n 'GRAD' 0,\n 'opsz' 24;\n }\n }\n `\n ]\n\n @property({ type: Object }) private buildingLevel: BuildingLevel = {}\n @property({ type: Number }) private selectedIdx: number | undefined\n\n render() {\n const noUploadStyle = '--file-uploader-icon-size: 0; --file-uploader-label-padding; 0;'\n\n // 메인 도면 스타일\n const { mainDrawing, mainDrawingThumbnail } = this.buildingLevel\n const mainDrawingIcon = mainDrawing ? '' : 'upload'\n const mainDrawingStyle = mainDrawing ? noUploadStyle : ''\n const mainDrawingLabel = mainDrawingThumbnail ? ' ' : '업로드'\n const mainDrawingDesc = mainDrawingThumbnail ? ' ' : '평면 파일'\n const mainDrawingThumbnailStyle = mainDrawingThumbnail ? this._getThumbnailStyle(mainDrawingThumbnail) : ''\n\n // 입면 도면 스타일\n const { elevationDrawing, elevationDrawingThumbnail } = this.buildingLevel\n const elevationDrawingIcon = elevationDrawing ? '' : 'upload'\n const elevationDrawingLabel = elevationDrawingThumbnail ? ' ' : '업로드'\n const elevationDrawingDesc = elevationDrawingThumbnail ? ' ' : '입면 파일'\n const elevationDrawingStyle = elevationDrawing ? noUploadStyle : ''\n const elevationDrawingThumbnailStyle = elevationDrawingThumbnail ? this._getThumbnailStyle(elevationDrawingThumbnail) : ''\n\n // 철근배근도 도면 스타일\n const { rebarDistributionDrawing, rebarDistributionDrawingThumbnail } = this.buildingLevel\n const rebarDistributionDrawingIcon = rebarDistributionDrawing ? '' : 'upload'\n const rebarDistributionDrawingStyle = rebarDistributionDrawing ? noUploadStyle : ''\n const rebarDistributionDrawingLabel = rebarDistributionDrawingThumbnail ? ' ' : '업로드'\n const rebarDistributionDrawingDesc = rebarDistributionDrawingThumbnail ? ' ' : '철근배근도 파일'\n const rebarDistributionDrawingThumbnailStyle = rebarDistributionDrawingThumbnail\n ? this._getThumbnailStyle(rebarDistributionDrawingThumbnail)\n : ''\n\n // 기타 도면 스타일\n const { etcDrawings } = this.buildingLevel\n\n return html`\n <div body>\n <div input-container>\n <ox-input-file\n name=\"mainDrawing\"\n .value=${mainDrawing || undefined}\n icon=${mainDrawingIcon}\n label=${mainDrawingLabel}\n description=${mainDrawingDesc}\n @change=${this._onChangeAttachment.bind(this)}\n style=\"${mainDrawingStyle + mainDrawingThumbnailStyle}\"\n ></ox-input-file>\n\n <ox-input-file\n name=\"elevationDrawing\"\n .value=${elevationDrawing || undefined}\n icon=${elevationDrawingIcon}\n label=${elevationDrawingLabel}\n description=${elevationDrawingDesc}\n @change=${this._onChangeAttachment.bind(this)}\n style=\"${elevationDrawingStyle + elevationDrawingThumbnailStyle}\"\n ></ox-input-file>\n\n <ox-input-file\n name=\"rebarDistributionDrawing\"\n .value=${rebarDistributionDrawing || undefined}\n icon=${rebarDistributionDrawingIcon}\n label=${rebarDistributionDrawingLabel}\n description=${rebarDistributionDrawingDesc}\n @change=${this._onChangeAttachment.bind(this)}\n style=\"${rebarDistributionDrawingStyle + rebarDistributionDrawingThumbnailStyle}\"\n ></ox-input-file>\n </div>\n\n <div etc-drawing-container>\n <ox-input-file\n name=\"etcDrawings\"\n accept=\"*/*\"\n multiple=\"true\"\n hide-filelist\n icon=\"upload\"\n label=\"업로드\"\n description=\"기타 파일\"\n @change=${this._onChangeAttachment.bind(this)}\n ></ox-input-file>\n\n ${etcDrawings?.map(\n (drawing, index) => html`\n <div file-box>\n <md-icon slot=\"icon\" outline>files</md-icon>\n <span file-name>${drawing.name}</span>\n <button delete-btn @click=${() => this._deleteDrawing(index)}>X</button>\n </div>\n `\n )}\n </div>\n\n <div button-container>\n <md-outlined-button @click=${this._close}><md-icon slot=\"icon\">cancel</md-icon>닫기</md-outlined-button>\n <md-filled-button @click=${this._openExportPopup}\n ><md-icon slot=\"icon\" outline>archive</md-icon>파일 내보내기</md-filled-button\n >\n </div>\n </div>\n `\n }\n\n private _close() {\n history.back()\n }\n\n // 이미지 업로드\n async _onChangeAttachment(e: CustomEvent) {\n const target = e.target as HTMLInputElement\n const isMultiple = target.getAttribute('multiple') === 'true'\n\n // multiple 속성이 있으면 배열로 처리\n if (isMultiple) {\n const originFiles = this.buildingLevel[target.name] || []\n const originUploads = this.buildingLevel[`${target.name}Upload`] || []\n const file = e.detail || []\n this.buildingLevel[target.name] = [...originFiles, ...file]\n this.buildingLevel[`${target.name}Upload`] = [...originUploads, ...file]\n } else {\n const file = e.detail[0] || null\n this.buildingLevel[target.name] = file\n this.buildingLevel[`${target.name}Upload`] = file\n }\n\n this.buildingLevel = { ...this.buildingLevel }\n\n const detail = { buildingLevel: this.buildingLevel, selectedIdx: this.selectedIdx }\n this.dispatchEvent(new CustomEvent('file_change', { bubbles: false, detail: detail }))\n }\n\n private _deleteDrawing(index: number) {\n if (this.buildingLevel.etcDrawings && Array.isArray(this.buildingLevel.etcDrawings)) {\n this.buildingLevel.etcDrawings.splice(index, 1)\n this.buildingLevel = { ...this.buildingLevel }\n\n const detail = { buildingLevel: this.buildingLevel, selectedIdx: this.selectedIdx }\n this.dispatchEvent(new CustomEvent('file_change', { bubbles: false, detail: detail }))\n }\n }\n\n private _openExportPopup() {\n openPopup(html`<popup-plan-export .buildingLevel=${this.buildingLevel}></popup-plan-export>`, {\n backdrop: true,\n size: 'medium',\n title: `도면 내보내기`\n })\n }\n\n private _getThumbnailStyle(path) {\n return `background: url(${path}); background-size: cover; background-repeat: round; justify-content: flex-end;`\n }\n}\n"]}
@@ -16,7 +16,8 @@ interface Weather {
16
16
  rain: number;
17
17
  temperature: number;
18
18
  humidity: number;
19
- wind: string;
19
+ windDirection: string;
20
+ windSpeed: number;
20
21
  }
21
22
  declare const ProjectDetail_base: typeof PageView & import("@open-wc/dedupe-mixin").Constructor<import("@open-wc/scoped-elements/types/src/types").ScopedElementsHost>;
22
23
  export declare class ProjectDetail extends ProjectDetail_base {