@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.
- package/dist-client/pages/lib/waether.d.ts +2 -1
- package/dist-client/pages/lib/waether.js +7 -3
- package/dist-client/pages/lib/waether.js.map +1 -1
- package/dist-client/pages/project/popup/popup-plan-export.d.ts +10 -0
- package/dist-client/pages/project/popup/popup-plan-export.js +236 -0
- package/dist-client/pages/project/popup/popup-plan-export.js.map +1 -0
- package/dist-client/pages/project/popup/popup-plan-upload.d.ts +3 -0
- package/dist-client/pages/project/popup/popup-plan-upload.js +130 -4
- package/dist-client/pages/project/popup/popup-plan-upload.js.map +1 -1
- package/dist-client/pages/project/project-detail.d.ts +2 -1
- package/dist-client/pages/project/project-detail.js +269 -80
- package/dist-client/pages/project/project-detail.js.map +1 -1
- package/dist-client/pages/project/project-list.d.ts +12 -0
- package/dist-client/pages/project/project-list.js +6 -0
- package/dist-client/pages/project/project-list.js.map +1 -1
- package/dist-client/pages/project/project-plan-management.js +29 -13
- package/dist-client/pages/project/project-plan-management.js.map +1 -1
- package/dist-client/pages/project/project-update.d.ts +1 -0
- package/dist-client/pages/project/project-update.js +128 -17
- package/dist-client/pages/project/project-update.js.map +1 -1
- package/dist-client/tsconfig.tsbuildinfo +1 -1
- package/dist-server/service/project/project-mutation.d.ts +1 -0
- package/dist-server/service/project/project-mutation.js +102 -3
- package/dist-server/service/project/project-mutation.js.map +1 -1
- package/dist-server/service/project/project-type.d.ts +1 -0
- package/dist-server/service/project/project-type.js +5 -1
- package/dist-server/service/project/project-type.js.map +1 -1
- package/dist-server/service/project/project.d.ts +3 -1
- package/dist-server/service/project/project.js +6 -0
- package/dist-server/service/project/project.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -12
|
@@ -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
|
|
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
|
-
|
|
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,
|
|
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":"AAAA,MAAM,OAAO,GAAG,oGAAoG,CAAA;AACpH,MAAM,GAAG,GAAG,yEAAyE,CAAA;AACrF,MAAM,WAAW,GAAG,EAAE,CAAA;AACtB,MAAM,SAAS,GAAG,MAAM,CAAA;AAExB,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,SAAiB;;IAC3E,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC7D,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,gBAAgB,EAAE,CAAA;IACnD,MAAM,MAAM,GAAG,MAAM,KAAK,CACxB,GAAG,GAAG,eAAe,OAAO,cAAc,SAAS,cAAc,SAAS,OAAO,EAAE,OAAO,EAAE,uBAAuB,WAAW,aAAa,SAAS,EAAE,CACvJ,CAAA;IAED,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,WAAW,GAAG,CAAC,CAAA;IACnB,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,IAAI,GAAG,EAAE,CAAA;IAEb,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACzB,IAAI,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,WAAC,OAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,0CAAE,IAAI,CAAA,EAAA,CAAC,CAAA;QACpE,OAAO,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,0CAAE,IAAI,CAAA;QAE9B,KAAK,IAAI,GAAG,IAAI,OAAO,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAG,GAAG,CAAC,KAAI,EAAE,CAAA;YAEjC,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC5B,IAAI,GAAG,IAAI,CAAC,SAAS,CAAA;YACvB,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC5B,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAA;YAC3B,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC5B,WAAW,GAAG,IAAI,CAAC,SAAS,CAAA;YAC9B,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;gBAC5B,IAAI,GAAG,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;IACnC,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AAC9C,CAAC;AAED,MAAM,EAAE,GAAG,UAAU,CAAA,CAAC,YAAY;AAClC,MAAM,IAAI,GAAG,GAAG,CAAA,CAAC,YAAY;AAC7B,MAAM,KAAK,GAAG,IAAI,CAAA,CAAC,iBAAiB;AACpC,MAAM,KAAK,GAAG,IAAI,CAAA,CAAC,iBAAiB;AACpC,MAAM,IAAI,GAAG,KAAK,CAAA,CAAC,iBAAiB;AACpC,MAAM,IAAI,GAAG,IAAI,CAAA,CAAC,iBAAiB;AACnC,MAAM,EAAE,GAAG,EAAE,CAAA,CAAC,gBAAgB;AAC9B,MAAM,EAAE,GAAG,GAAG,CAAA,CAAC,iBAAiB;AAEhC,gBAAgB;AAChB,SAAS,qBAAqB,CAAC,QAAgB,EAAE,SAAiB;IAChE,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAA;IAC9B,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;IACpB,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;IAC5B,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAA;IAC5B,MAAM,IAAI,GAAG,IAAI,GAAG,MAAM,CAAA;IAC1B,MAAM,IAAI,GAAG,IAAI,GAAG,MAAM,CAAA;IAE1B,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC,CAAA;IACxF,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;IAC/D,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,CAAC,CAAA;IAC/C,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAA;IAC9C,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,CAAC,CAAA;IAC9C,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACjC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,GAAG,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAC,CAAA;IAC3D,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACjC,IAAI,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAAA;IACrC,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE;QAAE,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,CAAA;IAC3C,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE;QAAE,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,EAAE,CAAA;IAC5C,KAAK,IAAI,EAAE,CAAA;IAEX,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;QAC/C,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC;QACpD,QAAQ;QACR,SAAS;KACV,CAAA;AACH,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;IACtB,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAClE,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAA;IAC/B,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAA;IAC1C,MAAM,aAAa,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAE5E,yEAAyE;IACzE,IAAI,SAAS,CAAA;IACb,IAAI,SAAS,CAAA;IAEb,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC3E,SAAS,GAAG,aAAa,CAAA;QACzB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAClF,SAAS,GAAG,SAAS,CAAA;QACrB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAClF,SAAS,GAAG,SAAS,CAAA;QACrB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1D,SAAS,GAAG,SAAS,CAAA;QACrB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpF,SAAS,GAAG,SAAS,CAAA;QACrB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpF,SAAS,GAAG,SAAS,CAAA;QACrB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpF,SAAS,GAAG,SAAS,CAAA;QACrB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;SAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACpF,SAAS,GAAG,SAAS,CAAA;QACrB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,SAAS,CAAA;QACrB,SAAS,GAAG,MAAM,CAAA;IACpB,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAA;AACjC,CAAC;AAED,MAAM,SAAS,GAAG;IAChB,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,IAAI;IACP,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,KAAK;IACR,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,IAAI;IACR,EAAE,EAAE,KAAK;IACT,EAAE,EAAE,GAAG;CACR,CAAA;AACD,MAAM,gBAAgB,GAAG;IACvB,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;IACN,CAAC,EAAE,GAAG;CACP,CAAA;AAED,SAAS,wBAAwB,CAAC,KAAa;;IAC7C,MAAM,IAAI,GAAkB,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAA;IAEnF,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,CAAA;IAE5B,OAAO,CAAA,MAAA,SAAS,CAAC,IAAI,CAAC,0CAAE,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,KAAI,EAAE,CAAA;AACpF,CAAC","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
|
|
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
|
|
81
|
-
|
|
82
|
-
|
|
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
|
-
|
|
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 {
|