@things-factory/kpi 9.0.30 → 9.0.32

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 (347) hide show
  1. package/README.md +1 -2
  2. package/client/charts/kpi-boxplot-chart.ts +182 -42
  3. package/client/charts/kpi-mini-trend-chart.ts +125 -0
  4. package/client/charts/kpi-radar-chart.ts +9 -9
  5. package/client/charts/kpi-trend-chart.ts +163 -0
  6. package/client/google-map/common-google-map.ts +45 -7
  7. package/client/google-map/google-map-loader.ts +1 -1
  8. package/client/pages/kpi/kpi-list-page.ts +196 -32
  9. package/client/pages/kpi/kpi-overview.ts +9 -11
  10. package/client/pages/kpi/kpi-tree-page.ts +409 -0
  11. package/client/pages/kpi/kpi-view.ts +187 -0
  12. package/client/pages/kpi-dashboard/cards/kpi-level1-card.ts +1 -1
  13. package/client/pages/kpi-dashboard/cards/kpi-level2-comparison.ts +1 -1
  14. package/client/pages/kpi-dashboard/cards/kpi-level3-comparison.ts +1 -1
  15. package/client/pages/kpi-dashboard/components/kpi-chart-toggle.ts +1 -2
  16. package/client/pages/kpi-dashboard/components/kpi-left-panel.ts +437 -0
  17. package/client/pages/kpi-dashboard/components/kpi-map-panel.ts +243 -30
  18. package/client/pages/kpi-dashboard/components/kpi-region-popup.ts +356 -0
  19. package/client/pages/kpi-dashboard/kpi-dashboard-map.ts +50 -592
  20. package/client/pages/kpi-dashboard/kpi-dashboard.ts +28 -30
  21. package/client/pages/kpi-history/kpi-history-list-page.ts +11 -11
  22. package/client/pages/kpi-metric/kpi-metric-list-page.ts +10 -2
  23. package/client/pages/kpi-metric-value/kpi-metric-value-editor-page.ts +7 -7
  24. package/client/pages/kpi-metric-value/kpi-metric-value-importer.ts +2 -2
  25. package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +16 -8
  26. package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.ts +5 -5
  27. package/client/pages/kpi-statistic/kpi-statistic-editor-page.ts +1 -2
  28. package/client/pages/kpi-statistic/kpi-statistic-list-page.ts +10 -2
  29. package/client/pages/kpi-value/kpi-value-editor-page.ts +11 -7
  30. package/client/pages/kpi-value/kpi-value-list-page.ts +31 -7
  31. package/client/route.ts +2 -9
  32. package/design-entities.md +8 -12
  33. package/dist-client/charts/kpi-boxplot-chart.d.ts +2 -0
  34. package/dist-client/charts/kpi-boxplot-chart.js +168 -42
  35. package/dist-client/charts/kpi-boxplot-chart.js.map +1 -1
  36. package/dist-client/charts/kpi-mini-trend-chart.d.ts +14 -0
  37. package/dist-client/charts/kpi-mini-trend-chart.js +148 -0
  38. package/dist-client/charts/kpi-mini-trend-chart.js.map +1 -0
  39. package/dist-client/charts/kpi-radar-chart.js +9 -9
  40. package/dist-client/charts/kpi-radar-chart.js.map +1 -1
  41. package/dist-client/charts/kpi-trend-chart.d.ts +25 -0
  42. package/dist-client/charts/kpi-trend-chart.js +186 -0
  43. package/dist-client/charts/kpi-trend-chart.js.map +1 -0
  44. package/dist-client/google-map/common-google-map.js +40 -7
  45. package/dist-client/google-map/common-google-map.js.map +1 -1
  46. package/dist-client/google-map/google-map-loader.js +1 -1
  47. package/dist-client/google-map/google-map-loader.js.map +1 -1
  48. package/dist-client/pages/kpi/kpi-list-page.d.ts +19 -3
  49. package/dist-client/pages/kpi/kpi-list-page.js +188 -32
  50. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  51. package/dist-client/pages/kpi/kpi-overview.js +9 -11
  52. package/dist-client/pages/kpi/kpi-overview.js.map +1 -1
  53. package/dist-client/pages/kpi/kpi-tree-page.d.ts +59 -0
  54. package/dist-client/pages/kpi/kpi-tree-page.js +403 -0
  55. package/dist-client/pages/kpi/kpi-tree-page.js.map +1 -0
  56. package/dist-client/pages/kpi/kpi-view.d.ts +12 -0
  57. package/dist-client/pages/kpi/kpi-view.js +191 -0
  58. package/dist-client/pages/kpi/kpi-view.js.map +1 -0
  59. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +1 -1
  60. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -1
  61. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +1 -1
  62. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -1
  63. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +1 -1
  64. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -1
  65. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +1 -2
  66. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +1 -1
  67. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +24 -0
  68. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +440 -0
  69. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -0
  70. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +11 -1
  71. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +243 -22
  72. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -1
  73. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +23 -0
  74. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +369 -0
  75. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -0
  76. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +6 -15
  77. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +47 -588
  78. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
  79. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +28 -30
  80. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -1
  81. package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +6 -1
  82. package/dist-client/pages/kpi-history/kpi-history-list-page.js +11 -11
  83. package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -1
  84. package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +5 -0
  85. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +10 -2
  86. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  87. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +1 -1
  88. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +8 -8
  89. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -1
  90. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +2 -2
  91. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -1
  92. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +5 -0
  93. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +16 -8
  94. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
  95. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +1 -1
  96. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +6 -6
  97. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -1
  98. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +1 -2
  99. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +1 -1
  100. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +5 -0
  101. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +10 -2
  102. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +1 -1
  103. package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +2 -1
  104. package/dist-client/pages/kpi-value/kpi-value-editor-page.js +16 -8
  105. package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -1
  106. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +5 -0
  107. package/dist-client/pages/kpi-value/kpi-value-list-page.js +31 -7
  108. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  109. package/dist-client/route.d.ts +1 -1
  110. package/dist-client/route.js +2 -8
  111. package/dist-client/route.js.map +1 -1
  112. package/dist-client/tsconfig.tsbuildinfo +1 -1
  113. package/dist-server/controllers/kpi-metric-value-provider.d.ts +1 -1
  114. package/dist-server/controllers/kpi-metric-value-provider.js +4 -4
  115. package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -1
  116. package/dist-server/controllers/kpi-value-provider.d.ts +1 -1
  117. package/dist-server/controllers/kpi-value-provider.js +3 -3
  118. package/dist-server/controllers/kpi-value-provider.js.map +1 -1
  119. package/dist-server/migrations/1752190849680-seed-kpi-metrics.d.ts +6 -0
  120. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js +101 -0
  121. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js.map +1 -0
  122. package/dist-server/migrations/1752190849681-seed-kpi.d.ts +5 -0
  123. package/dist-server/migrations/1752190849681-seed-kpi.js +315 -0
  124. package/dist-server/migrations/1752190849681-seed-kpi.js.map +1 -0
  125. package/dist-server/migrations/1752192090123-add-grades-to-kpi.d.ts +7 -0
  126. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js +51 -0
  127. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js.map +1 -0
  128. package/dist-server/migrations/1752192090124-add-kpi-statistics.d.ts +5 -0
  129. package/dist-server/migrations/1752192090124-add-kpi-statistics.js +710 -0
  130. package/dist-server/migrations/1752192090124-add-kpi-statistics.js.map +1 -0
  131. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.d.ts +6 -0
  132. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js +111 -0
  133. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js.map +1 -0
  134. package/dist-server/migrations/1752192090129-seed-kpi-values.d.ts +6 -0
  135. package/dist-server/migrations/1752192090129-seed-kpi-values.js +187 -0
  136. package/dist-server/migrations/1752192090129-seed-kpi-values.js.map +1 -0
  137. package/dist-server/migrations/grade-data/x11-performance-table.json +962 -0
  138. package/dist-server/migrations/grade-data/x12-performance-table.json +611 -0
  139. package/dist-server/migrations/grade-data/x14-performance-table.json +42 -0
  140. package/dist-server/migrations/grade-data/x21-performance-table.json +889 -0
  141. package/dist-server/migrations/grade-data/x22-performance-table.json +1064 -0
  142. package/dist-server/migrations/grade-data/x23-performance-table.json +42 -0
  143. package/dist-server/migrations/grade-data/x31-performance-table.json +644 -0
  144. package/dist-server/migrations/grade-data/x32-performance-table.json +993 -0
  145. package/dist-server/migrations/grade-data/x33-performance-table.json +195 -0
  146. package/dist-server/migrations/grade-data/x34-performance-table.json +12 -0
  147. package/dist-server/migrations/grade-data/x35-performance-table.json +42 -0
  148. package/dist-server/migrations/grade-data/x41-performance-table.json +825 -0
  149. package/dist-server/migrations/grade-data/x42-performance-table.json +786 -0
  150. package/dist-server/migrations/grade-data/x43-performance-table.json +12 -0
  151. package/dist-server/migrations/grade-data/x44-performance-table.json +42 -0
  152. package/dist-server/migrations/grade-data/x51-performance-table.json +924 -0
  153. package/dist-server/migrations/grade-data/x52-performance-table.json +42 -0
  154. package/dist-server/migrations/grade-data/x61-performance-table.json +261 -0
  155. package/dist-server/migrations/grade-data/x62-performance-table.json +42 -0
  156. package/dist-server/migrations/seed-data/kpi-metrics-seed.json +454 -0
  157. package/dist-server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
  158. package/dist-server/migrations/seed-data/kpi-values-seed.json +402 -0
  159. package/dist-server/migrations/seed-data/kpis-seed.json +488 -0
  160. package/dist-server/service/index.d.ts +3 -7
  161. package/dist-server/service/index.js +5 -12
  162. package/dist-server/service/index.js.map +1 -1
  163. package/dist-server/service/kpi/aggregate-kpi.js +30 -13
  164. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
  165. package/dist-server/service/kpi/kpi-formula.service.d.ts +15 -0
  166. package/dist-server/service/kpi/kpi-formula.service.js +90 -0
  167. package/dist-server/service/kpi/kpi-formula.service.js.map +1 -1
  168. package/dist-server/service/kpi/kpi-history.d.ts +0 -3
  169. package/dist-server/service/kpi/kpi-history.js +0 -10
  170. package/dist-server/service/kpi/kpi-history.js.map +1 -1
  171. package/dist-server/service/kpi/kpi-mutation.d.ts +1 -1
  172. package/dist-server/service/kpi/kpi-mutation.js +57 -20
  173. package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
  174. package/dist-server/service/kpi/kpi-query.d.ts +7 -3
  175. package/dist-server/service/kpi/kpi-query.js +126 -10
  176. package/dist-server/service/kpi/kpi-query.js.map +1 -1
  177. package/dist-server/service/kpi/kpi-type.d.ts +4 -2
  178. package/dist-server/service/kpi/kpi-type.js +12 -4
  179. package/dist-server/service/kpi/kpi-type.js.map +1 -1
  180. package/dist-server/service/kpi/kpi.d.ts +4 -3
  181. package/dist-server/service/kpi/kpi.js +20 -8
  182. package/dist-server/service/kpi/kpi.js.map +1 -1
  183. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +46 -11
  184. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -1
  185. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +1 -1
  186. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +6 -6
  187. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
  188. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.d.ts +2 -2
  189. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js +4 -4
  190. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js.map +1 -1
  191. package/dist-server/service/kpi-metric-value/kpi-metric-value.d.ts +1 -1
  192. package/dist-server/service/kpi-metric-value/kpi-metric-value.js +3 -3
  193. package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -1
  194. package/dist-server/service/kpi-org-scope/index.d.ts +9 -0
  195. package/dist-server/service/kpi-org-scope/index.js +14 -0
  196. package/dist-server/service/kpi-org-scope/index.js.map +1 -0
  197. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.d.ts +8 -0
  198. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js +170 -0
  199. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js.map +1 -0
  200. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.d.ts +14 -0
  201. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js +152 -0
  202. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js.map +1 -0
  203. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.d.ts +26 -0
  204. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js +101 -0
  205. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js.map +1 -0
  206. package/dist-server/service/kpi-org-scope/kpi-org-scope.d.ts +26 -0
  207. package/dist-server/service/kpi-org-scope/kpi-org-scope.js +135 -0
  208. package/dist-server/service/kpi-org-scope/kpi-org-scope.js.map +1 -0
  209. package/dist-server/service/kpi-statistic/kpi-statistic.d.ts +1 -0
  210. package/dist-server/service/kpi-statistic/kpi-statistic.js +11 -0
  211. package/dist-server/service/kpi-statistic/kpi-statistic.js.map +1 -1
  212. package/dist-server/service/kpi-value/kpi-value-mutation.js +71 -7
  213. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
  214. package/dist-server/service/kpi-value/kpi-value-type.d.ts +4 -2
  215. package/dist-server/service/kpi-value/kpi-value-type.js +12 -4
  216. package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
  217. package/dist-server/service/kpi-value/kpi-value.d.ts +3 -1
  218. package/dist-server/service/kpi-value/kpi-value.js +11 -5
  219. package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
  220. package/dist-server/service/utils/value-date-util.d.ts +1 -0
  221. package/dist-server/service/utils/value-date-util.js +41 -0
  222. package/dist-server/service/utils/value-date-util.js.map +1 -1
  223. package/dist-server/tsconfig.json +10 -0
  224. package/dist-server/tsconfig.tsbuildinfo +1 -1
  225. package/package.json +7 -6
  226. package/server/@types/index.d.ts +11 -0
  227. package/server/controllers/kpi-metric-value-provider.ts +5 -5
  228. package/server/controllers/kpi-value-provider.ts +4 -4
  229. package/server/migrations/1752190849680-seed-kpi-metrics.ts +124 -0
  230. package/server/migrations/1752190849681-seed-kpi.ts +356 -0
  231. package/server/migrations/1752192090123-add-grades-to-kpi.ts +67 -0
  232. package/server/migrations/1752192090124-add-kpi-statistics.ts +719 -0
  233. package/server/migrations/1752192090128-seed-kpi-org-scope.ts +132 -0
  234. package/server/migrations/1752192090129-seed-kpi-values.ts +207 -0
  235. package/server/migrations/grade-data/x11-performance-table.json +962 -0
  236. package/server/migrations/grade-data/x12-performance-table.json +611 -0
  237. package/server/migrations/grade-data/x14-performance-table.json +42 -0
  238. package/server/migrations/grade-data/x21-performance-table.json +889 -0
  239. package/server/migrations/grade-data/x22-performance-table.json +1064 -0
  240. package/server/migrations/grade-data/x23-performance-table.json +42 -0
  241. package/server/migrations/grade-data/x31-performance-table.json +644 -0
  242. package/server/migrations/grade-data/x32-performance-table.json +993 -0
  243. package/server/migrations/grade-data/x33-performance-table.json +195 -0
  244. package/server/migrations/grade-data/x34-performance-table.json +12 -0
  245. package/server/migrations/grade-data/x35-performance-table.json +42 -0
  246. package/server/migrations/grade-data/x41-performance-table.json +825 -0
  247. package/server/migrations/grade-data/x42-performance-table.json +786 -0
  248. package/server/migrations/grade-data/x43-performance-table.json +12 -0
  249. package/server/migrations/grade-data/x44-performance-table.json +42 -0
  250. package/server/migrations/grade-data/x51-performance-table.json +924 -0
  251. package/server/migrations/grade-data/x52-performance-table.json +42 -0
  252. package/server/migrations/grade-data/x61-performance-table.json +261 -0
  253. package/server/migrations/grade-data/x62-performance-table.json +42 -0
  254. package/server/migrations/seed-data/kpi-metrics-seed.json +454 -0
  255. package/server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
  256. package/server/migrations/seed-data/kpi-values-seed.json +402 -0
  257. package/server/migrations/seed-data/kpis-seed.json +488 -0
  258. package/server/service/index.ts +5 -12
  259. package/server/service/kpi/aggregate-kpi.ts +31 -13
  260. package/server/service/kpi/kpi-formula.service.ts +101 -0
  261. package/server/service/kpi/kpi-history.ts +0 -8
  262. package/server/service/kpi/kpi-mutation.ts +59 -19
  263. package/server/service/kpi/kpi-query.ts +118 -8
  264. package/server/service/kpi/kpi-type.ts +10 -4
  265. package/server/service/kpi/kpi.ts +17 -7
  266. package/server/service/kpi-metric/aggregate-kpi-metric.ts +55 -11
  267. package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +6 -6
  268. package/server/service/kpi-metric-value/kpi-metric-value-type.ts +4 -4
  269. package/server/service/kpi-metric-value/kpi-metric-value.ts +3 -3
  270. package/server/service/kpi-org-scope/index.ts +11 -0
  271. package/server/service/kpi-org-scope/kpi-org-scope-mutation.ts +173 -0
  272. package/server/service/kpi-org-scope/kpi-org-scope-query.ts +127 -0
  273. package/server/service/kpi-org-scope/kpi-org-scope-type.ts +68 -0
  274. package/server/service/kpi-org-scope/kpi-org-scope.ts +123 -0
  275. package/server/service/kpi-statistic/kpi-statistic.ts +10 -0
  276. package/server/service/kpi-value/kpi-value-mutation.ts +73 -7
  277. package/server/service/kpi-value/kpi-value-type.ts +10 -4
  278. package/server/service/kpi-value/kpi-value.ts +10 -5
  279. package/server/service/utils/value-date-util.ts +47 -0
  280. package/server/types/global.d.ts +8 -0
  281. package/things-factory.config.js +1 -0
  282. package/translations/en.json +15 -3
  283. package/translations/ja.json +13 -3
  284. package/translations/ko.json +15 -3
  285. package/translations/ms.json +13 -3
  286. package/translations/zh.json +13 -3
  287. package/client/google-map/script-loader.ts +0 -173
  288. package/client/pages/kpi-category/kpi-category-importer.ts +0 -90
  289. package/client/pages/kpi-category/kpi-category-list-page.ts +0 -537
  290. package/client/pages/kpi-category/kpi-category-value-calculator.ts +0 -233
  291. package/client/pages/kpi-category-value/kpi-category-value-list-page.ts +0 -404
  292. package/dist-client/google-map/script-loader.d.ts +0 -3
  293. package/dist-client/google-map/script-loader.js +0 -144
  294. package/dist-client/google-map/script-loader.js.map +0 -1
  295. package/dist-client/pages/kpi-category/kpi-category-importer.d.ts +0 -23
  296. package/dist-client/pages/kpi-category/kpi-category-importer.js +0 -92
  297. package/dist-client/pages/kpi-category/kpi-category-importer.js.map +0 -1
  298. package/dist-client/pages/kpi-category/kpi-category-list-page.d.ts +0 -74
  299. package/dist-client/pages/kpi-category/kpi-category-list-page.js +0 -517
  300. package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +0 -1
  301. package/dist-client/pages/kpi-category/kpi-category-value-calculator.d.ts +0 -13
  302. package/dist-client/pages/kpi-category/kpi-category-value-calculator.js +0 -256
  303. package/dist-client/pages/kpi-category/kpi-category-value-calculator.js.map +0 -1
  304. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.d.ts +0 -63
  305. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js +0 -393
  306. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js.map +0 -1
  307. package/dist-server/service/kpi-category/index.d.ts +0 -6
  308. package/dist-server/service/kpi-category/index.js +0 -10
  309. package/dist-server/service/kpi-category/index.js.map +0 -1
  310. package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +0 -9
  311. package/dist-server/service/kpi-category/kpi-category-mutation.js +0 -221
  312. package/dist-server/service/kpi-category/kpi-category-mutation.js.map +0 -1
  313. package/dist-server/service/kpi-category/kpi-category-query.d.ts +0 -18
  314. package/dist-server/service/kpi-category/kpi-category-query.js +0 -115
  315. package/dist-server/service/kpi-category/kpi-category-query.js.map +0 -1
  316. package/dist-server/service/kpi-category/kpi-category-type.d.ts +0 -24
  317. package/dist-server/service/kpi-category/kpi-category-type.js +0 -100
  318. package/dist-server/service/kpi-category/kpi-category-type.js.map +0 -1
  319. package/dist-server/service/kpi-category/kpi-category.d.ts +0 -22
  320. package/dist-server/service/kpi-category/kpi-category.js +0 -106
  321. package/dist-server/service/kpi-category/kpi-category.js.map +0 -1
  322. package/dist-server/service/kpi-category-value/index.d.ts +0 -6
  323. package/dist-server/service/kpi-category-value/index.js +0 -10
  324. package/dist-server/service/kpi-category-value/index.js.map +0 -1
  325. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.d.ts +0 -8
  326. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js +0 -102
  327. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js.map +0 -1
  328. package/dist-server/service/kpi-category-value/kpi-category-value-query.d.ts +0 -13
  329. package/dist-server/service/kpi-category-value/kpi-category-value-query.js +0 -91
  330. package/dist-server/service/kpi-category-value/kpi-category-value-query.js.map +0 -1
  331. package/dist-server/service/kpi-category-value/kpi-category-value-type.d.ts +0 -19
  332. package/dist-server/service/kpi-category-value/kpi-category-value-type.js +0 -73
  333. package/dist-server/service/kpi-category-value/kpi-category-value-type.js.map +0 -1
  334. package/dist-server/service/kpi-category-value/kpi-category-value.d.ts +0 -19
  335. package/dist-server/service/kpi-category-value/kpi-category-value.js +0 -91
  336. package/dist-server/service/kpi-category-value/kpi-category-value.js.map +0 -1
  337. package/helps/kpi/kpi-category.md +0 -160
  338. package/server/service/kpi-category/index.ts +0 -7
  339. package/server/service/kpi-category/kpi-category-mutation.ts +0 -217
  340. package/server/service/kpi-category/kpi-category-query.ts +0 -87
  341. package/server/service/kpi-category/kpi-category-type.ts +0 -73
  342. package/server/service/kpi-category/kpi-category.ts +0 -95
  343. package/server/service/kpi-category-value/index.ts +0 -7
  344. package/server/service/kpi-category-value/kpi-category-value-mutation.ts +0 -88
  345. package/server/service/kpi-category-value/kpi-category-value-query.ts +0 -62
  346. package/server/service/kpi-category-value/kpi-category-value-type.ts +0 -48
  347. package/server/service/kpi-category-value/kpi-category-value.ts +0 -79
@@ -1,21 +1,15 @@
1
+ import gql from 'graphql-tag'
1
2
  import { html, css, nothing } from 'lit'
2
3
  import { customElement, state } from 'lit/decorators.js'
4
+
3
5
  import { PageView } from '@operato/shell'
4
6
  import { ScrollbarStyles } from '@operato/styles'
5
7
  import { client } from '@operato/graphql'
6
- import gql from 'graphql-tag'
7
- import './components/kpi-map-panel'
8
+ import { notify } from '@operato/layout'
8
9
 
9
- // Google Maps API 사용을 위한 스크립트 로드
10
- declare global {
11
- interface Window {
12
- google: any
13
- }
14
- }
15
-
16
- // Google Maps API 키 (실제 구현 시 환경변수에서 가져와야 함)
17
- // 개발 중에는 무료 API 키를 사용하거나, 키 없이 테스트용 지도 사용
18
- const GOOGLE_MAPS_API_KEY = 'AIzaSyBgQZb-SFqjQBC_XTxNiz0XapejNwV9PgA' // 실제 API 키가 없으므로 빈 문자열로 설정
10
+ import './components/kpi-map-panel'
11
+ import './components/kpi-left-panel'
12
+ import './components/kpi-region-popup'
19
13
 
20
14
  @customElement('kpi-dashboard-map')
21
15
  export class KpiDashboardMapPage extends PageView {
@@ -25,380 +19,26 @@ export class KpiDashboardMapPage extends PageView {
25
19
  :host {
26
20
  display: flex;
27
21
  flex-direction: column;
28
- height: 100vh;
29
22
  overflow: hidden;
30
-
31
23
  position: relative;
32
24
  }
25
+
33
26
  .dashboard-container {
34
27
  display: flex;
35
28
  flex: 1;
36
29
  overflow: hidden;
37
30
  }
38
- .left-panel {
39
- width: 400px;
40
- background: #fff;
41
- border-right: 1px solid #e0e0e0;
42
- overflow: hidden;
43
- display: flex;
44
- flex-direction: column;
45
- box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
46
- }
47
- .left-panel-content {
48
- padding: 24px;
49
- overflow-y: auto;
50
- flex: 1;
51
- }
31
+
52
32
  .right-panel {
53
33
  flex: 1;
54
34
  background: #f8f9fa;
55
35
  overflow: hidden;
56
36
  position: relative;
57
- min-height: 500px;
58
- }
59
- .map-overlay {
60
- position: absolute;
61
- top: 16px;
62
- left: 16px;
63
- z-index: 10;
64
- background: rgba(255, 255, 255, 0.95);
65
- border-radius: 8px;
66
- padding: 12px 16px;
67
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
68
- backdrop-filter: blur(4px);
69
- }
70
- .category-buttons {
71
- display: flex;
72
- gap: 8px;
73
- flex-wrap: wrap;
74
- }
75
- .category-button {
76
- padding: 6px 12px;
77
- border: 1px solid #ced4da;
78
- background: #fff;
79
- border-radius: 4px;
80
- cursor: pointer;
81
- font-size: 0.85rem;
82
- transition: all 0.2s;
83
- white-space: nowrap;
84
- }
85
- .category-button.active {
86
- background: #667eea;
87
- color: white;
88
- border-color: #667eea;
89
- }
90
- .category-button:hover {
91
- background: #f8f9fa;
92
- }
93
- .category-button.active:hover {
94
- background: #5a6fd8;
95
- }
96
- .region-popup {
97
- position: absolute;
98
- top: 0;
99
- left: 402px; /* 왼쪽 패널 너비와 동일 */
100
- width: 400px; /* 왼쪽 패널과 동일한 너비 */
101
- height: 100%; /* 전체 화면 높이 */
102
- background: #fff;
103
- border-right: 1px solid #e0e0e0;
104
- z-index: 1000;
105
- overflow: hidden;
106
- display: flex;
107
- flex-direction: column;
108
- box-shadow: 2px 0 8px rgba(0, 0, 0, 0.1);
109
- }
110
- .popup-content {
111
- padding: 24px;
112
- overflow-y: auto;
113
- flex: 1;
114
- }
115
- .popup-header {
116
- display: flex;
117
- justify-content: space-between;
118
- align-items: center;
119
- padding: 20px 24px;
120
- border-bottom: 1px solid #e0e0e0;
121
- background: #fff;
122
- height: 70px;
123
- box-sizing: border-box;
124
- }
125
- .popup-title {
126
- font-size: 1.2rem;
127
- font-weight: bold;
128
- color: #333;
129
- }
130
- .popup-close {
131
- width: 32px;
132
- height: 32px;
133
- border: none;
134
- background: #fff;
135
- border-radius: 50%;
136
- cursor: pointer;
137
- display: flex;
138
- align-items: center;
139
- justify-content: center;
140
- font-size: 1.2rem;
141
- color: #666;
142
- transition: all 0.2s;
143
- }
144
- .popup-close:hover {
145
- background: #e9ecef;
146
- color: #333;
147
- }
148
- .panel-header {
149
- display: flex;
150
- justify-content: space-between;
151
- align-items: center;
152
- padding: 20px 24px;
153
- border-bottom: 1px solid #e0e0e0;
154
- background: #fff;
155
- height: 70px;
156
- box-sizing: border-box;
157
- }
158
- .panel-title {
159
- font-size: 1.3rem;
160
- font-weight: bold;
161
- color: #333;
162
- margin: 0;
163
- }
164
- .panel-close {
165
- width: 32px;
166
- height: 32px;
167
- border: none;
168
- background: #fff;
169
- border-radius: 50%;
170
- cursor: pointer;
171
- display: flex;
172
- align-items: center;
173
- justify-content: center;
174
- font-size: 1.2rem;
175
- color: #666;
176
- transition: all 0.2s;
177
- }
178
- .panel-close:hover {
179
- background: #e9ecef;
180
- color: #333;
181
- }
182
- .sub-title {
183
- font-size: 1rem;
184
- font-weight: 600;
185
- margin-bottom: 16px;
186
- color: #495057;
187
- }
188
- .chart-section {
189
- background: #f8f9fa;
190
- border-radius: 8px;
191
- padding: 16px;
192
- margin-bottom: 20px;
193
- }
194
- .chart-toggle {
195
- display: flex;
196
- gap: 8px;
197
- margin-bottom: 16px;
198
- }
199
- .toggle-button {
200
- padding: 8px 16px;
201
- border: 1px solid #ced4da;
202
- background: #fff;
203
- border-radius: 6px;
204
- cursor: pointer;
205
- font-size: 0.9rem;
206
- transition: all 0.2s;
207
- }
208
- .toggle-button.active {
209
- background: #667eea;
210
- color: white;
211
- border-color: #667eea;
212
- }
213
- .chart-container {
214
- height: 300px;
215
- display: flex;
216
- align-items: center;
217
- justify-content: center;
218
- background: white;
219
- border-radius: 6px;
220
- border: 1px solid #e9ecef;
221
- }
222
- .performance-table {
223
- width: 100%;
224
- border-collapse: collapse;
225
- margin-top: 16px;
226
- }
227
- .performance-table th,
228
- .performance-table td {
229
- padding: 12px 8px;
230
- text-align: left;
231
- border-bottom: 1px solid #e9ecef;
232
- }
233
- .performance-table th {
234
- background: #f8f9fa;
235
- font-weight: 600;
236
- color: #495057;
237
- }
238
- .performance-table td {
239
- color: #333;
240
- }
241
- .change-rate {
242
- display: flex;
243
- align-items: center;
244
- gap: 4px;
245
- }
246
- .change-up {
247
- color: #dc3545;
248
- }
249
- .change-down {
250
- color: #198754;
251
- }
252
- .change-neutral {
253
- color: #6c757d;
254
- }
255
- .trend-chart {
256
- width: 60px;
257
- height: 30px;
258
- background: #f8f9fa;
259
- border-radius: 4px;
260
- display: flex;
261
- align-items: center;
262
- justify-content: center;
263
- font-size: 0.8rem;
264
- color: #666;
265
- }
266
- .download-button {
267
- margin-top: 16px;
268
- padding: 8px 16px;
269
- background: #28a745;
270
- color: white;
271
- border: none;
272
- border-radius: 6px;
273
- cursor: pointer;
274
- font-size: 0.9rem;
275
- display: flex;
276
- align-items: center;
277
- gap: 8px;
278
- }
279
- .download-button:hover {
280
- background: #218838;
281
- }
282
- .period-selector {
283
- display: flex;
284
- gap: 8px;
285
- margin-bottom: 16px;
286
- }
287
- .period-button {
288
- padding: 6px 12px;
289
- border: 1px solid #ced4da;
290
- background: #fff;
291
- border-radius: 4px;
292
- cursor: pointer;
293
- font-size: 0.85rem;
294
- transition: all 0.2s;
295
- }
296
- .period-button.active {
297
- background: #667eea;
298
- color: white;
299
- border-color: #667eea;
300
- }
301
- .date-range-selector {
302
- display: flex;
303
- align-items: center;
304
- gap: 8px;
305
- margin-bottom: 16px;
306
- }
307
- .date-select {
308
- padding: 6px 12px;
309
- border: 1px solid #ced4da;
310
- border-radius: 4px;
311
- background: white;
312
- font-size: 0.9rem;
313
- }
314
- .map-container {
315
- width: 100%;
316
- height: 100%;
317
- position: relative;
318
- overflow: hidden;
319
- }
320
- #map-container {
321
- width: 100% !important;
322
- height: 100% !important;
323
- position: relative !important;
324
- }
325
- .region-cluster {
326
- cursor: pointer;
327
- transition: all 0.2s;
328
- }
329
- .region-cluster:hover {
330
- opacity: 0.9;
331
- transform: scale(1.1);
332
- }
333
- .map-controls {
334
- position: absolute;
335
- top: 16px;
336
- right: 16px;
337
- display: flex;
338
- flex-direction: column;
339
- gap: 8px;
340
- }
341
- .map-control-button {
342
- width: 40px;
343
- height: 40px;
344
- background: white;
345
- border: 1px solid #ced4da;
346
- border-radius: 6px;
347
- cursor: pointer;
348
- display: flex;
349
- align-items: center;
350
- justify-content: center;
351
- font-size: 1.2rem;
352
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
353
- }
354
- .map-control-button:hover {
355
- background: #f8f9fa;
356
- }
357
- .map-scale {
358
- position: absolute;
359
- bottom: 16px;
360
- right: 16px;
361
- background: white;
362
- padding: 8px 12px;
363
- border-radius: 6px;
364
- border: 1px solid #ced4da;
365
- font-size: 0.8rem;
366
- color: #666;
367
- }
368
- .region-tooltip {
369
- position: absolute;
370
- background: white;
371
- border: 1px solid #ced4da;
372
- border-radius: 6px;
373
- padding: 8px 12px;
374
- font-size: 0.9rem;
375
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
376
- z-index: 1000;
377
- pointer-events: none;
378
- }
379
- .loading {
380
- display: flex;
381
- align-items: center;
382
- justify-content: center;
383
- height: 200px;
384
- color: #666;
385
- font-size: 1rem;
386
- }
387
- .error {
388
- display: flex;
389
- align-items: center;
390
- justify-content: center;
391
- height: 200px;
392
- color: #d32f2f;
393
- font-size: 1rem;
394
37
  }
395
38
  `
396
39
  ]
397
40
 
398
- @state() loading = true
399
- @state() error = ''
400
41
  @state() selectedCategory = '전체 KPI'
401
- @state() selectedChartType = 'boxplot'
402
42
  @state() selectedPeriod = '월'
403
43
  @state() startDate = '전체'
404
44
  @state() endDate = '전체'
@@ -424,9 +64,6 @@ export class KpiDashboardMapPage extends PageView {
424
64
  }
425
65
 
426
66
  async fetchDashboardData() {
427
- this.loading = true
428
- this.error = ''
429
-
430
67
  try {
431
68
  // 전국 KPI 데이터 조회
432
69
  const nationalResponse = await client.query({
@@ -443,7 +80,7 @@ export class KpiDashboardMapPage extends PageView {
443
80
  kpi {
444
81
  id
445
82
  name
446
- category {
83
+ category: parent {
447
84
  id
448
85
  name
449
86
  }
@@ -461,16 +98,11 @@ export class KpiDashboardMapPage extends PageView {
461
98
 
462
99
  // 지도 데이터 생성 (시도별)
463
100
  this.generateMapData()
464
-
465
- // 지도 데이터가 생성된 후 지도 초기화
466
- if (this.mapData && this.mapData.length > 0) {
467
- console.log('지도 데이터 생성 완료')
468
- }
469
101
  } catch (e) {
470
- console.error('대시보드 데이터를 불러오지 못했습니다:', e)
471
- this.error = '대시보드 데이터를 불러오지 못했습니다.'
472
- } finally {
473
- this.loading = false
102
+ notify({
103
+ level: 'error',
104
+ message: '대시보드 데이터를 불러오지 못했습니다.'
105
+ })
474
106
  }
475
107
  }
476
108
 
@@ -495,24 +127,6 @@ export class KpiDashboardMapPage extends PageView {
495
127
  ]
496
128
  }
497
129
 
498
- private onCategoryChange(event: Event) {
499
- const target = event.target as HTMLSelectElement
500
- this.selectedCategory = target.value
501
- this.fetchDashboardData()
502
- }
503
-
504
- private onChartTypeChange(type: string) {
505
- this.selectedChartType = type
506
- }
507
-
508
- private onPeriodChange(period: string) {
509
- this.selectedPeriod = period
510
- }
511
-
512
- private onDateRangeChange() {
513
- // 날짜 범위 변경 처리
514
- }
515
-
516
130
  private downloadExcel() {
517
131
  // 엑셀 다운로드 기능
518
132
  console.log('엑셀 다운로드')
@@ -531,13 +145,13 @@ export class KpiDashboardMapPage extends PageView {
531
145
 
532
146
  private async fetchRegionData(region: string) {
533
147
  try {
534
- // 선택된 지역의 KPI 데이터 조회
535
148
  const response = await client.query({
536
149
  query: gql`
537
150
  query GetRegionKpiData($region: String) {
538
- kpiStatistics(filters: [{ field: "kpi.category.name", operator: "eq", value: $region }]) {
151
+ kpiStatistics(filters: [{ field: "scope", operator: "eq", value: $region }]) {
539
152
  items {
540
153
  id
154
+ scope
541
155
  valueDate
542
156
  periodType
543
157
  mean
@@ -546,7 +160,7 @@ export class KpiDashboardMapPage extends PageView {
546
160
  kpi {
547
161
  id
548
162
  name
549
- category {
163
+ category: parent {
550
164
  id
551
165
  name
552
166
  }
@@ -560,137 +174,36 @@ export class KpiDashboardMapPage extends PageView {
560
174
 
561
175
  this.seoulData = response.data.kpiStatistics.items || []
562
176
  } catch (e) {
563
- console.error('지역 데이터를 불러오지 못했습니다:', e)
177
+ notify({
178
+ level: 'error',
179
+ message: '지역 데이터를 불러오지 못했습니다.'
180
+ })
564
181
  }
565
182
  }
566
183
 
567
- private getChangeRateClass(change: number): string {
568
- if (change > 0) return 'change-up'
569
- if (change < 0) return 'change-down'
570
- return 'change-neutral'
571
- }
572
-
573
- private getChangeIcon(change: number): string {
574
- if (change > 0) return '▲'
575
- if (change < 0) return '▼'
576
- return '─'
577
- }
578
-
579
184
  get context() {
580
185
  return {
581
186
  title: '전국 KPI 대시보드',
582
187
  description: '전국 및 지역별 KPI 성과 분석 대시보드'
583
- } as any
188
+ }
584
189
  }
585
190
 
586
191
  render() {
587
- if (this.loading) {
588
- return html`
589
- <div style="display: flex; align-items: center; justify-content: center; height: 100vh;">
590
- <div style="color: #666; font-size: 1.1rem;">데이터 로딩 중...</div>
591
- </div>
592
- `
593
- }
594
-
595
- if (this.error) {
596
- return html`
597
- <div style="display: flex; align-items: center; justify-content: center; height: 100vh;">
598
- <div style="color: #d32f2f; font-size: 1.1rem;">${this.error}</div>
599
- </div>
600
- `
601
- }
602
-
603
192
  return html`
604
193
  <div class="dashboard-container">
605
194
  <!-- 좌측 패널: 전국 KPI -->
606
- <div class="left-panel">
607
- <div class="panel-header">
608
- <div class="panel-title">전국 KPI</div>
609
- <button class="panel-close" style="visibility: hidden;">×</button>
610
- </div>
611
- <div class="left-panel-content">
612
- <!-- KPI 카테고리 선택 -->
613
- <div style="margin-bottom: 20px;">
614
- <select
615
- .value=${this.selectedCategory}
616
- @change=${this.onCategoryChange}
617
- style="width: 100%; padding: 8px 12px; border: 1px solid #ced4da; border-radius: 6px; background: white;"
618
- >
619
- <option value="전체 KPI">전체 KPI</option>
620
- <option value="일정 성과">일정 성과</option>
621
- <option value="비용 성과">비용 성과</option>
622
- <option value="품질 성과">품질 성과</option>
623
- <option value="안전 성과">안전 성과</option>
624
- <option value="환경 성과">환경 성과</option>
625
- </select>
626
- </div>
627
-
628
- <!-- 종합 성과 -->
629
- <div class="chart-section">
630
- <div class="sub-title">종합 성과</div>
631
- <div class="chart-toggle">
632
- <button
633
- class="toggle-button ${this.selectedChartType === 'boxplot' ? 'active' : ''}"
634
- @click=${() => this.onChartTypeChange('boxplot')}
635
- >
636
- 박스플롯
637
- </button>
638
- <button
639
- class="toggle-button ${this.selectedChartType === 'radar' ? 'active' : ''}"
640
- @click=${() => this.onChartTypeChange('radar')}
641
- >
642
- 레이더차트
643
- </button>
644
- </div>
645
- <div class="chart-container">
646
- ${this.selectedChartType === 'boxplot'
647
- ? html`<div style="color: #666;">박스플롯 차트</div>`
648
- : html`<div style="color: #666;">레이더 차트</div>`}
649
- </div>
650
- </div>
651
-
652
- <!-- 시도별 성과 -->
653
- <div class="chart-section">
654
- <div class="sub-title">시도별 성과</div>
655
- <table class="performance-table">
656
- <thead>
657
- <tr>
658
- <th>지역명</th>
659
- <th>KPI</th>
660
- <th>변동률(%)</th>
661
- <th>성과 추이</th>
662
- </tr>
663
- </thead>
664
- <tbody>
665
- ${this.mapData?.slice(0, 5).map(
666
- (item: any) => html`
667
- <tr
668
- style="cursor: pointer; transition: background-color 0.2s;"
669
- @click=${() => this.onRegionClick(item.region)}
670
- @mouseenter=${(e: Event) => ((e.target as HTMLElement).style.backgroundColor = '#f8f9fa')}
671
- @mouseleave=${(e: Event) => ((e.target as HTMLElement).style.backgroundColor = '')}
672
- >
673
- <td>${item.region}</td>
674
- <td>${item.kpi}</td>
675
- <td>
676
- <div class="change-rate ${this.getChangeRateClass(item.change)}">
677
- ${this.getChangeIcon(item.change)}${Math.abs(item.change)}%
678
- </div>
679
- </td>
680
- <td>
681
- <div class="trend-chart">
682
- ${item.trend === 'up' ? '↗' : item.trend === 'down' ? '↘' : '→'}
683
- </div>
684
- </td>
685
- </tr>
686
- `
687
- )}
688
- </tbody>
689
- </table>
690
- <button class="download-button" @click=${this.downloadExcel}>📊 엑셀 다운로드</button>
691
- </div>
692
- </div>
693
- </div>
195
+ <kpi-left-panel
196
+ .selectedCategory=${this.selectedCategory}
197
+ .mapData=${this.mapData}
198
+ @category-change=${(e: CustomEvent) => {
199
+ this.selectedCategory = e.detail.category
200
+ this.fetchDashboardData()
201
+ }}
202
+ @region-click=${(e: CustomEvent) => {
203
+ this.onRegionClick(e.detail.region)
204
+ }}
205
+ @download-excel=${this.downloadExcel}
206
+ ></kpi-left-panel>
694
207
 
695
208
  <!-- 우측 패널: 지도 -->
696
209
  <kpi-map-panel
@@ -701,83 +214,28 @@ export class KpiDashboardMapPage extends PageView {
701
214
  this.selectedCategory = e.detail.category
702
215
  this.fetchDashboardData()
703
216
  }}
217
+ @region-click=${(e: CustomEvent) => {
218
+ this.onRegionClick(e.detail.region)
219
+ }}
704
220
  ></kpi-map-panel>
705
221
 
706
222
  <!-- 지역 상세 팝업 -->
707
223
  ${this.showRegionPopup
708
224
  ? html`
709
- <div class="region-popup">
710
- <div class="panel-header">
711
- <div class="panel-title">${this.selectedRegion} KPI</div>
712
- <button class="panel-close" @click=${this.closeRegionPopup}>×</button>
713
- </div>
714
- <div class="popup-content">
715
- <!-- 종합 성과 -->
716
- <div class="chart-section">
717
- <div class="sub-title">종합 성과</div>
718
- <div class="chart-toggle">
719
- <button
720
- class="toggle-button ${this.selectedChartType === 'boxplot' ? 'active' : ''}"
721
- @click=${() => this.onChartTypeChange('boxplot')}
722
- >
723
- 박스플롯
724
- </button>
725
- <button
726
- class="toggle-button ${this.selectedChartType === 'radar' ? 'active' : ''}"
727
- @click=${() => this.onChartTypeChange('radar')}
728
- >
729
- 레이더차트
730
- </button>
731
- </div>
732
- <div class="chart-container">
733
- ${this.selectedChartType === 'boxplot'
734
- ? html`<div style="color: #666;">${this.selectedRegion} 박스플롯</div>`
735
- : html`<div style="color: #666;">${this.selectedRegion} 레이더 차트</div>`}
736
- </div>
737
- </div>
738
-
739
- <!-- 기간별 성과 추이 -->
740
- <div class="chart-section">
741
- <div class="sub-title">기간별 성과 추이</div>
742
- <div class="period-selector">
743
- <button
744
- class="period-button ${this.selectedPeriod === '월' ? 'active' : ''}"
745
- @click=${() => this.onPeriodChange('월')}
746
- >
747
-
748
- </button>
749
- <button
750
- class="period-button ${this.selectedPeriod === '년' ? 'active' : ''}"
751
- @click=${() => this.onPeriodChange('년')}
752
- >
753
-
754
- </button>
755
- <button
756
- class="period-button ${this.selectedPeriod === '전체' ? 'active' : ''}"
757
- @click=${() => this.onPeriodChange('전체')}
758
- >
759
- 전체
760
- </button>
761
- </div>
762
- <div class="date-range-selector">
763
- <select class="date-select" .value=${this.startDate} @change=${this.onDateRangeChange}>
764
- <option value="전체">전체</option>
765
- <option value="2024">2024</option>
766
- <option value="2023">2023</option>
767
- </select>
768
- <span>~</span>
769
- <select class="date-select" .value=${this.endDate} @change=${this.onDateRangeChange}>
770
- <option value="전체">전체</option>
771
- <option value="12">12월</option>
772
- <option value="11">11월</option>
773
- </select>
774
- </div>
775
- <div class="chart-container">
776
- <div style="color: #666;">데이터 차트(꺾은선 그래프) 또는 테이블</div>
777
- </div>
778
- </div>
779
- </div>
780
- </div>
225
+ <kpi-region-popup
226
+ .selectedRegion=${this.selectedRegion}
227
+ .selectedPeriod=${this.selectedPeriod}
228
+ .startDate=${this.startDate}
229
+ .endDate=${this.endDate}
230
+ @popup-close=${this.closeRegionPopup}
231
+ @period-change=${(e: CustomEvent) => {
232
+ this.selectedPeriod = e.detail.period
233
+ }}
234
+ @date-range-change=${(e: CustomEvent) => {
235
+ this.startDate = e.detail.startDate
236
+ this.endDate = e.detail.endDate
237
+ }}
238
+ ></kpi-region-popup>
781
239
  `
782
240
  : nothing}
783
241
  </div>