@dssp/dcsp 1.0.2 → 1.0.5

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 (119) hide show
  1. package/dist-client/components/kpi-2d-lookup-chart.d.ts +50 -0
  2. package/dist-client/components/kpi-2d-lookup-chart.js +263 -0
  3. package/dist-client/components/kpi-2d-lookup-chart.js.map +1 -0
  4. package/dist-client/components/kpi-boxplot-chart.d.ts +31 -0
  5. package/dist-client/components/kpi-boxplot-chart.js +306 -0
  6. package/dist-client/components/kpi-boxplot-chart.js.map +1 -0
  7. package/dist-client/components/kpi-lookup-chart.d.ts +58 -0
  8. package/dist-client/components/kpi-lookup-chart.js +464 -0
  9. package/dist-client/components/kpi-lookup-chart.js.map +1 -0
  10. package/dist-client/components/kpi-mini-trend-chart.d.ts +14 -0
  11. package/dist-client/components/kpi-mini-trend-chart.js +180 -0
  12. package/dist-client/components/kpi-mini-trend-chart.js.map +1 -0
  13. package/dist-client/components/kpi-radar-chart.d.ts +17 -0
  14. package/dist-client/components/kpi-radar-chart.js +259 -0
  15. package/dist-client/components/kpi-radar-chart.js.map +1 -0
  16. package/dist-client/components/kpi-single-boxplot-chart.d.ts +36 -0
  17. package/dist-client/components/kpi-single-boxplot-chart.js +417 -0
  18. package/dist-client/components/kpi-single-boxplot-chart.js.map +1 -0
  19. package/dist-client/components/kpi-step-lookup-chart.d.ts +33 -0
  20. package/dist-client/components/kpi-step-lookup-chart.js +181 -0
  21. package/dist-client/components/kpi-step-lookup-chart.js.map +1 -0
  22. package/dist-client/components/kpi-trend-chart.d.ts +25 -0
  23. package/dist-client/components/kpi-trend-chart.js +241 -0
  24. package/dist-client/components/kpi-trend-chart.js.map +1 -0
  25. package/dist-client/google-map/common-google-map.d.ts +35 -0
  26. package/dist-client/google-map/common-google-map.js +349 -0
  27. package/dist-client/google-map/common-google-map.js.map +1 -0
  28. package/dist-client/google-map/google-map-loader.d.ts +6 -0
  29. package/dist-client/google-map/google-map-loader.js +23 -0
  30. package/dist-client/google-map/google-map-loader.js.map +1 -0
  31. package/dist-client/pages/kpi-admin/dssp-kpi-overview.d.ts +47 -0
  32. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js +393 -0
  33. package/dist-client/pages/kpi-admin/dssp-kpi-overview.js.map +1 -0
  34. package/dist-client/pages/kpi-admin/kpi-system-guide.d.ts +18 -0
  35. package/dist-client/pages/kpi-admin/kpi-system-guide.js +696 -0
  36. package/dist-client/pages/kpi-admin/kpi-system-guide.js.map +1 -0
  37. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +46 -0
  38. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +945 -0
  39. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -0
  40. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +34 -0
  41. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +238 -0
  42. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -0
  43. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +37 -0
  44. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +689 -0
  45. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -0
  46. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +57 -0
  47. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +866 -0
  48. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -0
  49. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.d.ts +69 -0
  50. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js +790 -0
  51. package/dist-client/pages/project-complete-tabs/pc-tab1-plan.js.map +1 -0
  52. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.d.ts +22 -0
  53. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js +344 -0
  54. package/dist-client/pages/project-complete-tabs/pc-tab2-rating.js.map +1 -0
  55. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.d.ts +21 -0
  56. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js +335 -0
  57. package/dist-client/pages/project-complete-tabs/pc-tab3-upload.js.map +1 -0
  58. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.d.ts +51 -0
  59. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js +693 -0
  60. package/dist-client/pages/project-complete-tabs/pc-tab4-monthly.js.map +1 -0
  61. package/dist-client/pages/sv-project-complete.d.ts +31 -0
  62. package/dist-client/pages/sv-project-complete.js +364 -0
  63. package/dist-client/pages/sv-project-complete.js.map +1 -0
  64. package/dist-client/pages/sv-project-detail.d.ts +73 -0
  65. package/dist-client/pages/sv-project-detail.js +1387 -0
  66. package/dist-client/pages/sv-project-detail.js.map +1 -0
  67. package/dist-client/route.d.ts +1 -1
  68. package/dist-client/route.js +15 -0
  69. package/dist-client/route.js.map +1 -1
  70. package/dist-client/shared/complete-api.d.ts +45 -0
  71. package/dist-client/shared/complete-api.js +274 -0
  72. package/dist-client/shared/complete-api.js.map +1 -0
  73. package/dist-client/shared/func.d.ts +2 -0
  74. package/dist-client/shared/func.js +22 -0
  75. package/dist-client/shared/func.js.map +1 -0
  76. package/dist-client/shared/integration-fetch.d.ts +35 -0
  77. package/dist-client/shared/integration-fetch.js +53 -0
  78. package/dist-client/shared/integration-fetch.js.map +1 -0
  79. package/dist-client/shared/kpi-project-sync.d.ts +16 -0
  80. package/dist-client/shared/kpi-project-sync.js +129 -0
  81. package/dist-client/shared/kpi-project-sync.js.map +1 -0
  82. package/dist-client/tsconfig.tsbuildinfo +1 -1
  83. package/dist-client/viewparts/menu-tools.d.ts +5 -0
  84. package/dist-client/viewparts/menu-tools.js +149 -16
  85. package/dist-client/viewparts/menu-tools.js.map +1 -1
  86. package/dist-server/index.d.ts +1 -0
  87. package/dist-server/index.js +4 -0
  88. package/dist-server/index.js.map +1 -1
  89. package/dist-server/service/index.d.ts +4 -0
  90. package/dist-server/service/index.js +19 -0
  91. package/dist-server/service/index.js.map +1 -0
  92. package/dist-server/service/kpi-metric-value/index.d.ts +4 -0
  93. package/dist-server/service/kpi-metric-value/index.js +8 -0
  94. package/dist-server/service/kpi-metric-value/index.js.map +1 -0
  95. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +198 -0
  96. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +1067 -0
  97. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -0
  98. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +15 -0
  99. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +72 -0
  100. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -0
  101. package/dist-server/service/kpi-stat/index.d.ts +4 -0
  102. package/dist-server/service/kpi-stat/index.js +8 -0
  103. package/dist-server/service/kpi-stat/index.js.map +1 -0
  104. package/dist-server/service/kpi-stat/kpi-stat-query.d.ts +13 -0
  105. package/dist-server/service/kpi-stat/kpi-stat-query.js +751 -0
  106. package/dist-server/service/kpi-stat/kpi-stat-query.js.map +1 -0
  107. package/dist-server/service/kpi-stat/kpi-stat-types.d.ts +32 -0
  108. package/dist-server/service/kpi-stat/kpi-stat-types.js +126 -0
  109. package/dist-server/service/kpi-stat/kpi-stat-types.js.map +1 -0
  110. package/dist-server/service/kpi-value/index.d.ts +3 -0
  111. package/dist-server/service/kpi-value/index.js +7 -0
  112. package/dist-server/service/kpi-value/index.js.map +1 -0
  113. package/dist-server/service/kpi-value/kpi-value-query.d.ts +8 -0
  114. package/dist-server/service/kpi-value/kpi-value-query.js +90 -0
  115. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -0
  116. package/dist-server/tsconfig.tsbuildinfo +1 -1
  117. package/package.json +8 -7
  118. package/schema.graphql +1274 -22
  119. package/things-factory.config.js +7 -1
@@ -0,0 +1,866 @@
1
+ var KpiDashboardMapPage_1;
2
+ import { __decorate, __metadata } from "tslib";
3
+ import gql from 'graphql-tag';
4
+ import { html, css, nothing } from 'lit';
5
+ import { customElement, state } from 'lit/decorators.js';
6
+ import { PageView } from '@operato/shell';
7
+ import { ScrollbarStyles } from '@operato/styles';
8
+ import { client } from '@operato/graphql';
9
+ import { notify } from '@operato/layout';
10
+ import './components/kpi-map-panel';
11
+ import './components/kpi-left-panel';
12
+ import './components/kpi-region-popup';
13
+ let KpiDashboardMapPage = KpiDashboardMapPage_1 = class KpiDashboardMapPage extends PageView {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.selectedCategory = '전체 KPI';
17
+ this.selectedPeriod = '월';
18
+ this.startYearMonth = ''; // YYYY-MM 형식
19
+ this.endYearMonth = ''; // YYYY-MM 형식
20
+ this.selectedSectorType = ''; // PUBLIC | PRIVATE
21
+ this.selectedBuildingUsage = ''; // RESIDENTIAL | NON_RESIDENTIAL
22
+ this.currentZoom = 7.2;
23
+ this.sigunguData = []; // 시군구 단위 데이터
24
+ this.nationalData = null;
25
+ this.seoulData = null;
26
+ this.mapData = null;
27
+ this.monthlyTrendData = []; // 월별 추이 데이터
28
+ this.totalKpiYStats = []; // 전체 Y-level KPI 통계
29
+ this.regionalKpiStats = []; // 지역별 KPI 통계
30
+ // 팝업 관련 상태 추가
31
+ this.selectedRegion = null;
32
+ this.selectedGeoGroup = null; // 시군구 geo_group 코드
33
+ this.showRegionPopup = false;
34
+ }
35
+ connectedCallback() {
36
+ super.connectedCallback();
37
+ this.initializeDefaultPeriod();
38
+ this.fetchDashboardData();
39
+ this.setupKeyboardEvents();
40
+ }
41
+ initializeDefaultPeriod() {
42
+ const now = new Date();
43
+ const currentYear = now.getFullYear();
44
+ const currentMonth = now.getMonth() + 1; // 0-based이므로 +1
45
+ // 12개월 전 계산
46
+ const startDate = new Date(now);
47
+ startDate.setMonth(startDate.getMonth() - 11); // 현재 월 포함 12개월
48
+ const startYear = startDate.getFullYear();
49
+ const startMonth = startDate.getMonth() + 1;
50
+ this.startYearMonth = `${startYear}-${startMonth.toString().padStart(2, '0')}`;
51
+ this.endYearMonth = `${currentYear}-${currentMonth.toString().padStart(2, '0')}`;
52
+ }
53
+ setupKeyboardEvents() {
54
+ document.addEventListener('keydown', e => {
55
+ if (e.key === 'Escape' && this.showRegionPopup) {
56
+ this.closeRegionPopup();
57
+ }
58
+ });
59
+ }
60
+ async fetchDashboardData() {
61
+ try {
62
+ // 새로운 KpiStatistic 구조 사용 - 지역별 집계된 통계 데이터 조회
63
+ const currentMonth = new Date().toISOString().substring(0, 7); // YYYY-MM
64
+ const statisticsResponse = await client.query({
65
+ query: gql `
66
+ query GetDashboardStatistics($valueDate: String!) {
67
+ regionalKpiStatistics(periodType: MONTH, valueDate: $valueDate) {
68
+ id
69
+ mean
70
+ median
71
+ count
72
+ minimum
73
+ maximum
74
+ standardDeviation
75
+ kpi {
76
+ id
77
+ name
78
+ description
79
+ }
80
+ kpiOrgScope {
81
+ id
82
+ scope02
83
+ entityName
84
+ org
85
+ }
86
+ }
87
+ }
88
+ `,
89
+ variables: { valueDate: currentMonth }
90
+ });
91
+ this.nationalData = statisticsResponse.data.regionalKpiStatistics || [];
92
+ // 통계 데이터로부터 지도 데이터 생성
93
+ this.generateMapDataFromStatistics();
94
+ }
95
+ catch (e) {
96
+ // KpiStatistic이 없는 경우 기존 방식으로 폴백
97
+ await this.fetchDashboardDataFallback();
98
+ }
99
+ }
100
+ // 폴백: KpiValue를 직접 집계하는 기존 방식
101
+ async fetchDashboardDataFallback() {
102
+ try {
103
+ const kpiResponse = await client.query({
104
+ query: gql `
105
+ query {
106
+ kpisLevel1 {
107
+ id
108
+ name
109
+ description
110
+ isLeaf
111
+ children {
112
+ id
113
+ name
114
+ isLeaf
115
+ value {
116
+ id
117
+ value
118
+ score
119
+ valueDate
120
+ kpiOrgScope {
121
+ id
122
+ entityName
123
+ org
124
+ scope01
125
+ scope02
126
+ }
127
+ }
128
+ }
129
+ value {
130
+ id
131
+ value
132
+ score
133
+ valueDate
134
+ kpiOrgScope {
135
+ id
136
+ entityName
137
+ org
138
+ scope01
139
+ scope02
140
+ }
141
+ }
142
+ }
143
+ }
144
+ `
145
+ });
146
+ this.nationalData = kpiResponse.data.kpisLevel1 || [];
147
+ this.generateMapDataFromKpiValues();
148
+ }
149
+ catch (e) {
150
+ notify({
151
+ level: 'error',
152
+ message: '대시보드 데이터를 불러오지 못했습니다.'
153
+ });
154
+ }
155
+ }
156
+ generateMapDataFromKpiValues() {
157
+ // 실제 KPI 데이터로부터 지도 데이터 생성
158
+ const regionCoordinates = {
159
+ 서울: { lat: 37.5665, lng: 126.978 },
160
+ 부산: { lat: 35.1796, lng: 129.0756 },
161
+ 대구: { lat: 35.8714, lng: 128.6014 },
162
+ 인천: { lat: 37.4563, lng: 126.7052 },
163
+ 광주: { lat: 35.1595, lng: 126.8526 },
164
+ 대전: { lat: 36.3504, lng: 127.3845 },
165
+ 울산: { lat: 35.5384, lng: 129.3114 },
166
+ 세종: { lat: 36.4875, lng: 127.2816 },
167
+ 경기: { lat: 37.4138, lng: 127.5183 },
168
+ 강원: { lat: 37.8228, lng: 128.1555 },
169
+ 충북: { lat: 36.8, lng: 127.7 },
170
+ 충남: { lat: 36.5184, lng: 126.8 },
171
+ 전북: { lat: 35.7175, lng: 127.153 },
172
+ 전남: { lat: 34.8679, lng: 126.991 },
173
+ 경북: { lat: 36.4919, lng: 128.8889 },
174
+ 경남: { lat: 35.4606, lng: 128.2132 },
175
+ 제주: { lat: 33.4996, lng: 126.5312 }
176
+ };
177
+ const mapDataMap = new Map();
178
+ // nationalData에서 KPI 값들을 지역별로 집계
179
+ this.nationalData.forEach((kpi) => {
180
+ // KPI 자체에 값이 있는 경우 (leaf KPI)
181
+ if (kpi.value && kpi.value.kpiOrgScope) {
182
+ const region = kpi.value.kpiOrgScope.scope02; // 시도는 scope02에 저장
183
+ if (region && regionCoordinates[region]) {
184
+ if (!mapDataMap.has(region)) {
185
+ mapDataMap.set(region, Object.assign({ region, values: [], scores: [] }, regionCoordinates[region]));
186
+ }
187
+ mapDataMap.get(region).values.push(kpi.value.value);
188
+ mapDataMap.get(region).scores.push(kpi.value.score);
189
+ }
190
+ }
191
+ // 하위 KPI들의 값들도 처리
192
+ if (kpi.children) {
193
+ kpi.children.forEach((child) => {
194
+ if (child.value && child.value.kpiOrgScope) {
195
+ const region = child.value.kpiOrgScope.scope02; // 시도는 scope02에 저장
196
+ if (region && regionCoordinates[region]) {
197
+ if (!mapDataMap.has(region)) {
198
+ mapDataMap.set(region, Object.assign({ region, values: [], scores: [] }, regionCoordinates[region]));
199
+ }
200
+ mapDataMap.get(region).values.push(child.value.value);
201
+ mapDataMap.get(region).scores.push(child.value.score);
202
+ }
203
+ }
204
+ });
205
+ }
206
+ });
207
+ // 지역별 평균 계산 및 최종 지도 데이터 생성
208
+ this.mapData = Array.from(mapDataMap.values()).map(regionData => {
209
+ const avgValue = regionData.values.length > 0
210
+ ? regionData.values.reduce((sum, val) => sum + val, 0) / regionData.values.length
211
+ : 0;
212
+ const avgScore = regionData.scores.length > 0
213
+ ? regionData.scores.reduce((sum, val) => sum + val, 0) / regionData.scores.length
214
+ : 0;
215
+ // 간단한 변화율 계산 (실제로는 이전 기간과 비교해야 함)
216
+ const change = (Math.random() - 0.5) * 0.4; // 임시로 -0.2 ~ 0.2 범위
217
+ const trend = change >= 0 ? 'up' : 'down';
218
+ return {
219
+ region: regionData.region,
220
+ kpi: parseFloat(avgValue.toFixed(1)),
221
+ score: parseFloat(avgScore.toFixed(3)),
222
+ change: parseFloat(change.toFixed(2)),
223
+ trend,
224
+ lat: regionData.lat,
225
+ lng: regionData.lng,
226
+ dataCount: regionData.values.length
227
+ };
228
+ });
229
+ // 데이터가 없는 지역들도 기본값으로 추가
230
+ Object.keys(regionCoordinates).forEach(region => {
231
+ if (!mapDataMap.has(region)) {
232
+ this.mapData.push({
233
+ region,
234
+ kpi: 0,
235
+ score: 0,
236
+ change: 0,
237
+ trend: 'neutral',
238
+ lat: regionCoordinates[region].lat,
239
+ lng: regionCoordinates[region].lng,
240
+ dataCount: 0
241
+ });
242
+ }
243
+ });
244
+ }
245
+ generateMapDataFromStatistics() {
246
+ // KpiStatistic 데이터로부터 지도 데이터 생성 (최적화된 버전)
247
+ const regionCoordinates = {
248
+ 서울: { lat: 37.5665, lng: 126.978 },
249
+ 부산: { lat: 35.1796, lng: 129.0756 },
250
+ 대구: { lat: 35.8714, lng: 128.6014 },
251
+ 인천: { lat: 37.4563, lng: 126.7052 },
252
+ 광주: { lat: 35.1595, lng: 126.8526 },
253
+ 대전: { lat: 36.3504, lng: 127.3845 },
254
+ 울산: { lat: 35.5384, lng: 129.3114 },
255
+ 세종: { lat: 36.4875, lng: 127.2816 },
256
+ 경기: { lat: 37.4138, lng: 127.5183 },
257
+ 강원: { lat: 37.8228, lng: 128.1555 },
258
+ 충북: { lat: 36.8, lng: 127.7 },
259
+ 충남: { lat: 36.5184, lng: 126.8 },
260
+ 전북: { lat: 35.7175, lng: 127.153 },
261
+ 전남: { lat: 34.8679, lng: 126.991 },
262
+ 경북: { lat: 36.4919, lng: 128.8889 },
263
+ 경남: { lat: 35.4606, lng: 128.2132 },
264
+ 제주: { lat: 33.4996, lng: 126.5312 }
265
+ };
266
+ const mapDataMap = new Map();
267
+ // 통계 데이터를 지역별로 집계 (이미 서버에서 계산된 데이터 사용)
268
+ this.nationalData.forEach((statistic) => {
269
+ var _a;
270
+ const region = (_a = statistic.kpiOrgScope) === null || _a === void 0 ? void 0 : _a.scope02;
271
+ if (region && regionCoordinates[region]) {
272
+ if (!mapDataMap.has(region)) {
273
+ mapDataMap.set(region, Object.assign({ region, means: [], counts: [] }, regionCoordinates[region]));
274
+ }
275
+ // 통계값 집계 (이미 계산된 평균값들 사용)
276
+ mapDataMap.get(region).means.push(statistic.mean || 0);
277
+ mapDataMap.get(region).counts.push(statistic.count || 0);
278
+ }
279
+ });
280
+ // 지역별 최종 평균 계산 및 지도 데이터 생성
281
+ this.mapData = Array.from(mapDataMap.values()).map(regionData => {
282
+ const avgValue = regionData.means.length > 0
283
+ ? regionData.means.reduce((sum, val) => sum + val, 0) / regionData.means.length
284
+ : 0;
285
+ const totalCount = regionData.counts.reduce((sum, val) => sum + val, 0);
286
+ // 간단한 변화율 계산 (실제로는 이전 기간과 비교해야 함)
287
+ const change = (Math.random() - 0.5) * 0.4;
288
+ const trend = change >= 0 ? 'up' : 'down';
289
+ return {
290
+ region: regionData.region,
291
+ kpi: parseFloat(avgValue.toFixed(1)),
292
+ change: parseFloat(change.toFixed(2)),
293
+ trend,
294
+ lat: regionData.lat,
295
+ lng: regionData.lng,
296
+ dataCount: totalCount,
297
+ statisticsCount: regionData.means.length // 통계 항목 수
298
+ };
299
+ });
300
+ // 데이터가 없는 지역들도 기본값으로 추가
301
+ Object.keys(regionCoordinates).forEach(region => {
302
+ if (!mapDataMap.has(region)) {
303
+ this.mapData.push({
304
+ region,
305
+ kpi: 0,
306
+ change: 0,
307
+ trend: 'neutral',
308
+ lat: regionCoordinates[region].lat,
309
+ lng: regionCoordinates[region].lng,
310
+ dataCount: 0,
311
+ statisticsCount: 0
312
+ });
313
+ }
314
+ });
315
+ }
316
+ generateMapDataFromRegionalStats() {
317
+ // regionalKpiStats와 monthlyTrendData를 사용하여 지도 데이터 생성
318
+ const regionCoordinates = {
319
+ 서울특별시: { lat: 37.5665, lng: 126.978 },
320
+ 부산광역시: { lat: 35.1796, lng: 129.0756 },
321
+ 대구광역시: { lat: 35.8714, lng: 128.6014 },
322
+ 인천광역시: { lat: 37.4563, lng: 126.7052 },
323
+ 광주광역시: { lat: 35.1595, lng: 126.8526 },
324
+ 대전광역시: { lat: 36.3504, lng: 127.3845 },
325
+ 울산광역시: { lat: 35.5384, lng: 129.3114 },
326
+ 세종특별자치시: { lat: 36.4875, lng: 127.2816 },
327
+ 경기도: { lat: 37.4138, lng: 127.5183 },
328
+ 강원도: { lat: 37.8228, lng: 128.1555 },
329
+ 충청북도: { lat: 36.8, lng: 127.7 },
330
+ 충청남도: { lat: 36.5184, lng: 126.8 },
331
+ 전라북도: { lat: 35.7175, lng: 127.153 },
332
+ 전라남도: { lat: 34.8679, lng: 126.991 },
333
+ 경상북도: { lat: 36.4919, lng: 128.8889 },
334
+ 경상남도: { lat: 35.4606, lng: 128.2132 },
335
+ 제주특별자치도: { lat: 33.4996, lng: 126.5312 }
336
+ };
337
+ this.mapData = Object.keys(regionCoordinates).map(regionName => {
338
+ const stat = this.regionalKpiStats.find(s => s.geoGroup === regionName);
339
+ const changeRate = this.calculateChangeRate(regionName);
340
+ return {
341
+ region: regionName,
342
+ kpi: stat ? (stat.avgVal * 100).toFixed(1) : '0.0',
343
+ change: changeRate.toFixed(2),
344
+ trend: changeRate >= 0 ? 'up' : 'down',
345
+ lat: regionCoordinates[regionName].lat,
346
+ lng: regionCoordinates[regionName].lng,
347
+ dataCount: (stat === null || stat === void 0 ? void 0 : stat.projectCount) || 0
348
+ };
349
+ });
350
+ }
351
+ async fetchSigunguData() {
352
+ try {
353
+ const categoryToKpiName = {
354
+ '전체 KPI': null,
355
+ '일정 성과': '일정성과(Y1)',
356
+ '비용 성과': '비용성과(Y2)',
357
+ '품질 성과': '품질성과(Y3)',
358
+ '안전 성과': 'Y4. 안전성과',
359
+ '환경 성과': '환경성과(Y5)',
360
+ '생산성 성과': '생산성성과(Y6)'
361
+ };
362
+ const kpiName = categoryToKpiName[this.selectedCategory];
363
+ const response = await client.query({
364
+ query: gql `
365
+ query GetSigunguStats(
366
+ $kpiName: String
367
+ $startYearMonth: String
368
+ $endYearMonth: String
369
+ $sectorType: String
370
+ $buildingUsage: String
371
+ ) {
372
+ kpiZValueStatsBySigungu(
373
+ kpiName: $kpiName
374
+ startYearMonth: $startYearMonth
375
+ endYearMonth: $endYearMonth
376
+ sectorType: $sectorType
377
+ buildingUsage: $buildingUsage
378
+ ) {
379
+ geoGroup
380
+ avgVal
381
+ minVal
382
+ maxVal
383
+ projectCount
384
+ }
385
+ }
386
+ `,
387
+ variables: {
388
+ kpiName,
389
+ startYearMonth: this.startYearMonth || null,
390
+ endYearMonth: this.endYearMonth || null,
391
+ sectorType: this.selectedSectorType || null,
392
+ buildingUsage: this.selectedBuildingUsage || null
393
+ }
394
+ });
395
+ this.sigunguData = response.data.kpiZValueStatsBySigungu || [];
396
+ this.generateSigunguMapData();
397
+ }
398
+ catch (e) {
399
+ console.error('시군구 데이터 조회 실패:', e);
400
+ }
401
+ }
402
+ calculateChangeRate(metroName) {
403
+ const regionMonthlyData = this.monthlyTrendData
404
+ .filter((d) => d.geoGroup === metroName)
405
+ .sort((a, b) => a.yearMonth.localeCompare(b.yearMonth));
406
+ if (regionMonthlyData.length >= 2) {
407
+ const oldest = regionMonthlyData[0].avgVal;
408
+ const latest = regionMonthlyData[regionMonthlyData.length - 1].avgVal;
409
+ if (oldest !== 0) {
410
+ return ((latest - oldest) / oldest) * 100;
411
+ }
412
+ }
413
+ return 0;
414
+ }
415
+ generateSigunguMapData() {
416
+ const map = KpiDashboardMapPage_1.SIGUNGU_MAP;
417
+ const geoToMetro = KpiDashboardMapPage_1.GEO_TO_METRO;
418
+ this.mapData = this.sigunguData
419
+ .filter((s) => s.geoGroup && map[s.geoGroup])
420
+ .map((s) => {
421
+ const info = map[s.geoGroup];
422
+ const metro = geoToMetro[s.geoGroup] || '';
423
+ const changeRate = this.calculateChangeRate(metro);
424
+ return {
425
+ region: info.name,
426
+ kpi: (s.avgVal * 100).toFixed(1),
427
+ change: changeRate.toFixed(2),
428
+ trend: changeRate >= 0 ? 'up' : 'down',
429
+ lat: info.lat,
430
+ lng: info.lng,
431
+ dataCount: s.projectCount || 0
432
+ };
433
+ });
434
+ }
435
+ onZoomChanged(e) {
436
+ const newZoom = e.detail.zoom;
437
+ const threshold = KpiDashboardMapPage_1.SIGUNGU_ZOOM_THRESHOLD;
438
+ const wasAbove = this.currentZoom >= threshold;
439
+ const isAbove = newZoom >= threshold;
440
+ this.currentZoom = newZoom;
441
+ // 줌 레벨이 threshold를 넘나들 때만 데이터 전환
442
+ if (wasAbove !== isAbove) {
443
+ if (isAbove) {
444
+ this.fetchSigunguData();
445
+ }
446
+ else {
447
+ this.generateMapDataFromRegionalStats();
448
+ }
449
+ }
450
+ }
451
+ /**
452
+ * 필터/기간/카테고리 변경으로 데이터가 갱신될 때 현재 줌 레벨에 맞는 지도 마커로 갱신.
453
+ * 시군구 줌 상태면 시군구 데이터를 (현재 필터로) 다시 조회 — 광역으로 되돌아가지 않도록.
454
+ */
455
+ _refreshMapForZoom() {
456
+ if (this.currentZoom >= KpiDashboardMapPage_1.SIGUNGU_ZOOM_THRESHOLD) {
457
+ this.fetchSigunguData();
458
+ }
459
+ else {
460
+ this.generateMapDataFromRegionalStats();
461
+ }
462
+ }
463
+ focusMapOnRegion(regionName) {
464
+ var _a;
465
+ const bounds = KpiDashboardMapPage_1.METRO_BOUNDS[regionName];
466
+ if (!bounds)
467
+ return;
468
+ const mapPanel = (_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('kpi-map-panel');
469
+ mapPanel === null || mapPanel === void 0 ? void 0 : mapPanel.focusOnLocation(bounds.lat, bounds.lng, bounds.zoom);
470
+ }
471
+ downloadExcel() { }
472
+ onRegionClick(region) {
473
+ this.selectedRegion = region;
474
+ // 시군구 모드인 경우 region name → geo_group 코드 역매핑
475
+ const sigunguMap = KpiDashboardMapPage_1.SIGUNGU_MAP;
476
+ const entry = Object.entries(sigunguMap).find(([, v]) => v.name === region);
477
+ this.selectedGeoGroup = entry ? entry[0] : null;
478
+ this.showRegionPopup = true;
479
+ // fetchRegionData는 더 이상 필요하지 않음 (kpi-region-popup에서 직접 데이터 가져옴)
480
+ // this.fetchRegionData(region)
481
+ }
482
+ closeRegionPopup() {
483
+ this.showRegionPopup = false;
484
+ this.selectedRegion = null;
485
+ this.selectedGeoGroup = null; // 시군구 코드도 초기화 — 다음 선택에 이전 시군구가 남지 않도록
486
+ }
487
+ async fetchRegionData(region) {
488
+ try {
489
+ const response = await client.query({
490
+ query: gql `
491
+ query GetRegionKpiData($filters: [Filter!]) {
492
+ kpiValues: latestKpiValues(filters: $filters) {
493
+ items {
494
+ id
495
+ value
496
+ score
497
+ valueDate
498
+ kpiOrgScope {
499
+ id
500
+ org
501
+ scope01
502
+ scope02
503
+ entityName
504
+ }
505
+ kpi {
506
+ id
507
+ name
508
+ parent {
509
+ id
510
+ name
511
+ }
512
+ }
513
+ }
514
+ total
515
+ }
516
+ }
517
+ `,
518
+ variables: {
519
+ filters: [{ name: 'kpiOrgScope.scope02', operator: 'eq', value: region }]
520
+ }
521
+ });
522
+ this.seoulData = response.data.kpiValues.items || [];
523
+ }
524
+ catch (e) {
525
+ notify({
526
+ level: 'error',
527
+ message: '지역 데이터를 불러오지 못했습니다.'
528
+ });
529
+ }
530
+ }
531
+ get context() {
532
+ return {
533
+ title: 'KPI Oversight',
534
+ description: '전국 및 지역별 KPI 성과 분석 대시보드'
535
+ };
536
+ }
537
+ _onSectorTypeChange(e) {
538
+ this.selectedSectorType = e.target.value;
539
+ }
540
+ _onBuildingUsageChange(e) {
541
+ this.selectedBuildingUsage = e.target.value;
542
+ }
543
+ render() {
544
+ return html `
545
+ <div class="dashboard-container">
546
+ <!-- 좌측 패널: 전국 KPI -->
547
+ <kpi-left-panel
548
+ .selectedCategory=${this.selectedCategory}
549
+ .startYearMonth=${this.startYearMonth}
550
+ .endYearMonth=${this.endYearMonth}
551
+ .sectorType=${this.selectedSectorType}
552
+ .buildingUsage=${this.selectedBuildingUsage}
553
+ .mapData=${this.mapData}
554
+ @category-change=${(e) => {
555
+ this.selectedCategory = e.detail.category;
556
+ }}
557
+ @period-change=${(e) => {
558
+ // 좌측 패널 기간 변경을 부모로 동기화 → 지역 팝업도 같은 기간으로 조회 (기준 일치)
559
+ this.startYearMonth = e.detail.startYearMonth;
560
+ this.endYearMonth = e.detail.endYearMonth;
561
+ }}
562
+ @sector-change=${(e) => {
563
+ // 유형 필터를 부모로 동기화 → 지역 팝업도 같은 유형 필터 사용
564
+ this.selectedSectorType = e.detail.sectorType;
565
+ }}
566
+ @usage-change=${(e) => {
567
+ // 용도 필터를 부모로 동기화 → 지역 팝업도 같은 용도 필터 사용
568
+ this.selectedBuildingUsage = e.detail.buildingUsage;
569
+ }}
570
+ @region-click=${(e) => {
571
+ this.onRegionClick(e.detail.region);
572
+ }}
573
+ @focus-region=${(e) => {
574
+ this.focusMapOnRegion(e.detail.region);
575
+ }}
576
+ @monthly-trend-data-loaded=${(e) => {
577
+ this.monthlyTrendData = e.detail.data;
578
+ this._refreshMapForZoom();
579
+ }}
580
+ @total-kpi-y-stats-loaded=${(e) => {
581
+ this.totalKpiYStats = e.detail.data;
582
+ }}
583
+ @regional-kpi-stats-loaded=${(e) => {
584
+ this.regionalKpiStats = e.detail.data;
585
+ this._refreshMapForZoom();
586
+ }}
587
+ @download-excel=${this.downloadExcel}
588
+ ></kpi-left-panel>
589
+
590
+ <!-- 우측 패널: 지도 -->
591
+ <kpi-map-panel
592
+ class="right-panel"
593
+ .selectedCategory=${this.selectedCategory}
594
+ .mapData=${this.mapData}
595
+ .selectedRegion=${this.selectedRegion}
596
+ @region-click=${(e) => {
597
+ this.onRegionClick(e.detail.region);
598
+ }}
599
+ @zoom-changed=${(e) => {
600
+ this.onZoomChanged(e);
601
+ }}
602
+ ></kpi-map-panel>
603
+
604
+ <!-- 지역 상세 팝업 -->
605
+ ${this.showRegionPopup
606
+ ? html `
607
+ <kpi-region-popup
608
+ .selectedRegion=${this.selectedRegion}
609
+ .geoGroup=${this.selectedGeoGroup}
610
+ .selectedCategory=${this.selectedCategory}
611
+ .monthlyTrendData=${this.monthlyTrendData}
612
+ .totalKpiStats=${this.totalKpiYStats}
613
+ .startYearMonth=${this.startYearMonth}
614
+ .endYearMonth=${this.endYearMonth}
615
+ .sectorType=${this.selectedSectorType}
616
+ .buildingUsage=${this.selectedBuildingUsage}
617
+ @popup-close=${this.closeRegionPopup}
618
+ ></kpi-region-popup>
619
+ `
620
+ : nothing}
621
+ </div>
622
+ `;
623
+ }
624
+ };
625
+ KpiDashboardMapPage.styles = [
626
+ ScrollbarStyles,
627
+ css `
628
+ :host {
629
+ display: flex;
630
+ flex-direction: column;
631
+ overflow: hidden;
632
+ position: relative;
633
+ }
634
+
635
+ .dashboard-container {
636
+ display: flex;
637
+ flex: 1;
638
+ overflow: hidden;
639
+ }
640
+
641
+ .right-panel {
642
+ flex: 1;
643
+ background: #f8f9fa;
644
+ overflow: hidden;
645
+ position: relative;
646
+ }
647
+ `
648
+ ];
649
+ KpiDashboardMapPage.SIGUNGU_ZOOM_THRESHOLD = 10;
650
+ // 시군구별 좌표 (geo_group 2자리 코드 → { name, lat, lng })
651
+ KpiDashboardMapPage.SIGUNGU_MAP = {
652
+ '01': { name: '서울 종로구', lat: 37.5735, lng: 126.979 },
653
+ '02': { name: '서울 중구', lat: 37.5641, lng: 126.9979 },
654
+ '03': { name: '서울 용산구', lat: 37.5326, lng: 126.9906 },
655
+ '04': { name: '서울 성동구', lat: 37.5634, lng: 127.0369 },
656
+ '05': { name: '서울 광진구', lat: 37.5385, lng: 127.0823 },
657
+ '06': { name: '서울 강남구', lat: 37.5172, lng: 127.0473 },
658
+ '07': { name: '서울 송파구', lat: 37.5145, lng: 127.106 },
659
+ '08': { name: '서울 강서구', lat: 37.551, lng: 126.8495 },
660
+ '10': { name: '수원시', lat: 37.2636, lng: 127.0286 },
661
+ '11': { name: '성남시', lat: 37.42, lng: 127.1265 },
662
+ '12': { name: '고양시', lat: 37.6584, lng: 126.832 },
663
+ '13': { name: '용인시', lat: 37.2411, lng: 127.1776 },
664
+ '14': { name: '부천시', lat: 37.5034, lng: 126.766 },
665
+ '15': { name: '안산시', lat: 37.3219, lng: 126.8309 },
666
+ '16': { name: '화성시', lat: 37.1995, lng: 126.8312 },
667
+ '17': { name: '평택시', lat: 36.9921, lng: 127.1127 },
668
+ '18': { name: '파주시', lat: 37.7599, lng: 126.7799 },
669
+ '21': { name: '인천 남동구', lat: 37.4488, lng: 126.7308 },
670
+ '22': { name: '인천 부평구', lat: 37.5076, lng: 126.7218 },
671
+ '23': { name: '인천 서구', lat: 37.5458, lng: 126.676 },
672
+ '24': { name: '춘천시', lat: 37.8813, lng: 127.73 },
673
+ '25': { name: '원주시', lat: 37.3422, lng: 127.9202 },
674
+ '26': { name: '강릉시', lat: 37.7519, lng: 128.8761 },
675
+ '27': { name: '청주시', lat: 36.6424, lng: 127.489 },
676
+ '28': { name: '충주시', lat: 36.991, lng: 127.9259 },
677
+ '29': { name: '제천시', lat: 37.1327, lng: 128.191 },
678
+ '30': { name: '세종시', lat: 36.4875, lng: 127.2816 },
679
+ '31': { name: '천안시', lat: 36.8151, lng: 127.1139 },
680
+ '32': { name: '아산시', lat: 36.7898, lng: 127.0018 },
681
+ '33': { name: '속초시', lat: 38.2071, lng: 128.5918 },
682
+ '34': { name: '대전 서구', lat: 36.3555, lng: 127.3835 },
683
+ '35': { name: '대전 유성구', lat: 36.3622, lng: 127.3561 },
684
+ '36': { name: '포항시', lat: 36.019, lng: 129.3435 },
685
+ '37': { name: '경주시', lat: 35.8562, lng: 129.2247 },
686
+ '38': { name: '구미시', lat: 36.1196, lng: 128.3443 },
687
+ '39': { name: '안동시', lat: 36.5684, lng: 128.7294 },
688
+ '40': { name: '김천시', lat: 36.1398, lng: 128.1136 },
689
+ '41': { name: '대구 중구', lat: 35.8693, lng: 128.6062 },
690
+ '42': { name: '대구 수성구', lat: 35.8584, lng: 128.6308 },
691
+ '43': { name: '대구 달서구', lat: 35.8299, lng: 128.5327 },
692
+ '44': { name: '울산 남구', lat: 35.5444, lng: 129.3304 },
693
+ '45': { name: '울산 중구', lat: 35.5696, lng: 129.3324 },
694
+ '46': { name: '부산 중구', lat: 35.106, lng: 129.0324 },
695
+ '47': { name: '부산 해운대구', lat: 35.1631, lng: 129.1636 },
696
+ '48': { name: '부산 사하구', lat: 35.1046, lng: 128.9751 },
697
+ '49': { name: '부산 금정구', lat: 35.2431, lng: 129.0923 },
698
+ '50': { name: '창원시', lat: 35.2281, lng: 128.6812 },
699
+ '51': { name: '김해시', lat: 35.2285, lng: 128.8894 },
700
+ '52': { name: '진주시', lat: 35.1798, lng: 128.1076 },
701
+ '53': { name: '양산시', lat: 35.335, lng: 129.0373 },
702
+ '54': { name: '전주시', lat: 35.8242, lng: 127.148 },
703
+ '55': { name: '익산시', lat: 35.9483, lng: 126.9576 },
704
+ '56': { name: '군산시', lat: 35.9676, lng: 126.7369 },
705
+ '57': { name: '목포시', lat: 34.8118, lng: 126.3922 },
706
+ '58': { name: '여수시', lat: 34.7604, lng: 127.6622 },
707
+ '59': { name: '순천시', lat: 34.9506, lng: 127.4873 },
708
+ '61': { name: '광주 서구', lat: 35.1525, lng: 126.8895 },
709
+ '62': { name: '광주 북구', lat: 35.1744, lng: 126.912 },
710
+ '63': { name: '제주시', lat: 33.4996, lng: 126.5312 }
711
+ };
712
+ // geo_group 코드 → 광역시도 매핑
713
+ KpiDashboardMapPage.GEO_TO_METRO = {
714
+ '01': '서울특별시',
715
+ '02': '서울특별시',
716
+ '03': '서울특별시',
717
+ '04': '서울특별시',
718
+ '05': '서울특별시',
719
+ '06': '서울특별시',
720
+ '07': '서울특별시',
721
+ '08': '서울특별시',
722
+ '10': '경기도',
723
+ '11': '경기도',
724
+ '12': '경기도',
725
+ '13': '경기도',
726
+ '14': '경기도',
727
+ '15': '경기도',
728
+ '16': '경기도',
729
+ '17': '경기도',
730
+ '18': '경기도',
731
+ '21': '인천광역시',
732
+ '22': '인천광역시',
733
+ '23': '인천광역시',
734
+ '24': '강원도',
735
+ '25': '강원도',
736
+ '26': '강원도',
737
+ '33': '강원도',
738
+ '27': '충청북도',
739
+ '28': '충청북도',
740
+ '29': '충청북도',
741
+ '30': '세종특별자치시',
742
+ '31': '충청남도',
743
+ '32': '충청남도',
744
+ '34': '대전광역시',
745
+ '35': '대전광역시',
746
+ '36': '경상북도',
747
+ '37': '경상북도',
748
+ '38': '경상북도',
749
+ '39': '경상북도',
750
+ '40': '경상북도',
751
+ '41': '대구광역시',
752
+ '42': '대구광역시',
753
+ '43': '대구광역시',
754
+ '44': '울산광역시',
755
+ '45': '울산광역시',
756
+ '46': '부산광역시',
757
+ '47': '부산광역시',
758
+ '48': '부산광역시',
759
+ '49': '부산광역시',
760
+ '50': '경상남도',
761
+ '51': '경상남도',
762
+ '52': '경상남도',
763
+ '53': '경상남도',
764
+ '54': '전라북도',
765
+ '55': '전라북도',
766
+ '56': '전라북도',
767
+ '57': '전라남도',
768
+ '58': '전라남도',
769
+ '59': '전라남도',
770
+ '61': '광주광역시',
771
+ '62': '광주광역시',
772
+ '63': '제주특별자치도'
773
+ };
774
+ // 광역시도별 중심 좌표 + 줌 레벨 (시군구가 모두 보이는 수준)
775
+ KpiDashboardMapPage.METRO_BOUNDS = {
776
+ 서울특별시: { lat: 37.5665, lng: 126.978, zoom: 11 },
777
+ 부산광역시: { lat: 35.1796, lng: 129.0756, zoom: 11 },
778
+ 대구광역시: { lat: 35.8714, lng: 128.6014, zoom: 11 },
779
+ 인천광역시: { lat: 37.4563, lng: 126.7052, zoom: 11 },
780
+ 광주광역시: { lat: 35.1595, lng: 126.8526, zoom: 12 },
781
+ 대전광역시: { lat: 36.3504, lng: 127.3845, zoom: 12 },
782
+ 울산광역시: { lat: 35.5384, lng: 129.3114, zoom: 11 },
783
+ 세종특별자치시: { lat: 36.4875, lng: 127.2816, zoom: 12 },
784
+ 경기도: { lat: 37.4138, lng: 127.0183, zoom: 9 },
785
+ 강원도: { lat: 37.8228, lng: 128.1555, zoom: 9 },
786
+ 충청북도: { lat: 36.8, lng: 127.7, zoom: 9 },
787
+ 충청남도: { lat: 36.5184, lng: 126.8, zoom: 10 },
788
+ 전라북도: { lat: 35.7175, lng: 127.153, zoom: 10 },
789
+ 전라남도: { lat: 34.8679, lng: 126.991, zoom: 9 },
790
+ 경상북도: { lat: 36.4919, lng: 128.8889, zoom: 9 },
791
+ 경상남도: { lat: 35.4606, lng: 128.2132, zoom: 9 },
792
+ 제주특별자치도: { lat: 33.4996, lng: 126.5312, zoom: 11 }
793
+ };
794
+ __decorate([
795
+ state(),
796
+ __metadata("design:type", Object)
797
+ ], KpiDashboardMapPage.prototype, "selectedCategory", void 0);
798
+ __decorate([
799
+ state(),
800
+ __metadata("design:type", Object)
801
+ ], KpiDashboardMapPage.prototype, "selectedPeriod", void 0);
802
+ __decorate([
803
+ state(),
804
+ __metadata("design:type", Object)
805
+ ], KpiDashboardMapPage.prototype, "startYearMonth", void 0);
806
+ __decorate([
807
+ state(),
808
+ __metadata("design:type", Object)
809
+ ], KpiDashboardMapPage.prototype, "endYearMonth", void 0);
810
+ __decorate([
811
+ state(),
812
+ __metadata("design:type", Object)
813
+ ], KpiDashboardMapPage.prototype, "selectedSectorType", void 0);
814
+ __decorate([
815
+ state(),
816
+ __metadata("design:type", Object)
817
+ ], KpiDashboardMapPage.prototype, "selectedBuildingUsage", void 0);
818
+ __decorate([
819
+ state(),
820
+ __metadata("design:type", Object)
821
+ ], KpiDashboardMapPage.prototype, "currentZoom", void 0);
822
+ __decorate([
823
+ state(),
824
+ __metadata("design:type", Array)
825
+ ], KpiDashboardMapPage.prototype, "sigunguData", void 0);
826
+ __decorate([
827
+ state(),
828
+ __metadata("design:type", Object)
829
+ ], KpiDashboardMapPage.prototype, "nationalData", void 0);
830
+ __decorate([
831
+ state(),
832
+ __metadata("design:type", Object)
833
+ ], KpiDashboardMapPage.prototype, "seoulData", void 0);
834
+ __decorate([
835
+ state(),
836
+ __metadata("design:type", Object)
837
+ ], KpiDashboardMapPage.prototype, "mapData", void 0);
838
+ __decorate([
839
+ state(),
840
+ __metadata("design:type", Array)
841
+ ], KpiDashboardMapPage.prototype, "monthlyTrendData", void 0);
842
+ __decorate([
843
+ state(),
844
+ __metadata("design:type", Array)
845
+ ], KpiDashboardMapPage.prototype, "totalKpiYStats", void 0);
846
+ __decorate([
847
+ state(),
848
+ __metadata("design:type", Array)
849
+ ], KpiDashboardMapPage.prototype, "regionalKpiStats", void 0);
850
+ __decorate([
851
+ state(),
852
+ __metadata("design:type", Object)
853
+ ], KpiDashboardMapPage.prototype, "selectedRegion", void 0);
854
+ __decorate([
855
+ state(),
856
+ __metadata("design:type", Object)
857
+ ], KpiDashboardMapPage.prototype, "selectedGeoGroup", void 0);
858
+ __decorate([
859
+ state(),
860
+ __metadata("design:type", Object)
861
+ ], KpiDashboardMapPage.prototype, "showRegionPopup", void 0);
862
+ KpiDashboardMapPage = KpiDashboardMapPage_1 = __decorate([
863
+ customElement('kpi-dashboard-map')
864
+ ], KpiDashboardMapPage);
865
+ export { KpiDashboardMapPage };
866
+ //# sourceMappingURL=kpi-dashboard-map.js.map