@things-factory/kpi 10.1.248 → 10.1.249

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 (409) hide show
  1. package/dist-client/bootstrap.d.ts +2 -0
  2. package/dist-client/bootstrap.js +7 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/charts/kpi-boxplot-chart.d.ts +24 -0
  5. package/dist-client/charts/kpi-boxplot-chart.js +324 -0
  6. package/dist-client/charts/kpi-boxplot-chart.js.map +1 -0
  7. package/dist-client/charts/kpi-mini-trend-chart.d.ts +14 -0
  8. package/dist-client/charts/kpi-mini-trend-chart.js +148 -0
  9. package/dist-client/charts/kpi-mini-trend-chart.js.map +1 -0
  10. package/dist-client/charts/kpi-radar-chart.d.ts +16 -0
  11. package/dist-client/charts/kpi-radar-chart.js +138 -0
  12. package/dist-client/charts/kpi-radar-chart.js.map +1 -0
  13. package/dist-client/charts/kpi-trend-chart.d.ts +25 -0
  14. package/dist-client/charts/kpi-trend-chart.js +186 -0
  15. package/dist-client/charts/kpi-trend-chart.js.map +1 -0
  16. package/dist-client/google-map/common-google-map.d.ts +34 -0
  17. package/dist-client/google-map/common-google-map.js +333 -0
  18. package/dist-client/google-map/common-google-map.js.map +1 -0
  19. package/dist-client/google-map/google-map-loader.d.ts +8 -0
  20. package/dist-client/google-map/google-map-loader.js +22 -0
  21. package/dist-client/google-map/google-map-loader.js.map +1 -0
  22. package/dist-client/index.d.ts +1 -0
  23. package/dist-client/index.js +2 -0
  24. package/dist-client/index.js.map +1 -0
  25. package/dist-client/pages/kpi/kpi-grade-editor.d.ts +35 -0
  26. package/dist-client/pages/kpi/kpi-grade-editor.js +165 -0
  27. package/dist-client/pages/kpi/kpi-grade-editor.js.map +1 -0
  28. package/dist-client/pages/kpi/kpi-importer.d.ts +23 -0
  29. package/dist-client/pages/kpi/kpi-importer.js +92 -0
  30. package/dist-client/pages/kpi/kpi-importer.js.map +1 -0
  31. package/dist-client/pages/kpi/kpi-list-page.d.ts +136 -0
  32. package/dist-client/pages/kpi/kpi-list-page.js +948 -0
  33. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -0
  34. package/dist-client/pages/kpi/kpi-overview-sample.d.ts +36 -0
  35. package/dist-client/pages/kpi/kpi-overview-sample.js +264 -0
  36. package/dist-client/pages/kpi/kpi-overview-sample.js.map +1 -0
  37. package/dist-client/pages/kpi/kpi-overview.d.ts +14 -0
  38. package/dist-client/pages/kpi/kpi-overview.js +361 -0
  39. package/dist-client/pages/kpi/kpi-overview.js.map +1 -0
  40. package/dist-client/pages/kpi/kpi-tree-page.d.ts +51 -0
  41. package/dist-client/pages/kpi/kpi-tree-page.js +355 -0
  42. package/dist-client/pages/kpi/kpi-tree-page.js.map +1 -0
  43. package/dist-client/pages/kpi/kpi-view.d.ts +12 -0
  44. package/dist-client/pages/kpi/kpi-view.js +193 -0
  45. package/dist-client/pages/kpi/kpi-view.js.map +1 -0
  46. package/dist-client/pages/kpi/kpi-viz-editor.d.ts +19 -0
  47. package/dist-client/pages/kpi/kpi-viz-editor.js +562 -0
  48. package/dist-client/pages/kpi/kpi-viz-editor.js.map +1 -0
  49. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.d.ts +17 -0
  50. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +279 -0
  51. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -0
  52. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.d.ts +19 -0
  53. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +385 -0
  54. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -0
  55. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.d.ts +23 -0
  56. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +465 -0
  57. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -0
  58. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.d.ts +8 -0
  59. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js +78 -0
  60. package/dist-client/pages/kpi-dashboard/components/kpi-chart-toggle.js.map +1 -0
  61. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +24 -0
  62. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +440 -0
  63. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -0
  64. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +33 -0
  65. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +444 -0
  66. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -0
  67. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.d.ts +23 -0
  68. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +369 -0
  69. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -0
  70. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
  71. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +128 -0
  72. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
  73. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.d.ts +31 -0
  74. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +493 -0
  75. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -0
  76. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +50 -0
  77. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +884 -0
  78. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
  79. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
  80. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
  81. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
  82. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
  83. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
  84. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
  85. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
  86. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
  87. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
  88. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
  89. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +146 -0
  90. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
  91. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
  92. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
  93. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
  94. package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +21 -0
  95. package/dist-client/pages/kpi-history/kpi-history-list-page.js +160 -0
  96. package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -0
  97. package/dist-client/pages/kpi-metric/kpi-metric-importer.d.ts +23 -0
  98. package/dist-client/pages/kpi-metric/kpi-metric-importer.js +92 -0
  99. package/dist-client/pages/kpi-metric/kpi-metric-importer.js.map +1 -0
  100. package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +65 -0
  101. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +415 -0
  102. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -0
  103. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +52 -0
  104. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +678 -0
  105. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -0
  106. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.d.ts +23 -0
  107. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +75 -0
  108. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -0
  109. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +64 -0
  110. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +311 -0
  111. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -0
  112. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +12 -0
  113. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +175 -0
  114. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -0
  115. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.d.ts +35 -0
  116. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js +161 -0
  117. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-page.js.map +1 -0
  118. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.d.ts +47 -0
  119. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +655 -0
  120. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +1 -0
  121. package/dist-client/pages/kpi-statistic/kpi-statistic-importer.d.ts +23 -0
  122. package/dist-client/pages/kpi-statistic/kpi-statistic-importer.js +92 -0
  123. package/dist-client/pages/kpi-statistic/kpi-statistic-importer.js.map +1 -0
  124. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +65 -0
  125. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +416 -0
  126. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +1 -0
  127. package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +50 -0
  128. package/dist-client/pages/kpi-value/kpi-value-editor-page.js +700 -0
  129. package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -0
  130. package/dist-client/pages/kpi-value/kpi-value-importer.d.ts +23 -0
  131. package/dist-client/pages/kpi-value/kpi-value-importer.js +92 -0
  132. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -0
  133. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +73 -0
  134. package/dist-client/pages/kpi-value/kpi-value-list-page.js +403 -0
  135. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -0
  136. package/dist-client/route.d.ts +1 -0
  137. package/dist-client/route.js +47 -0
  138. package/dist-client/route.js.map +1 -0
  139. package/dist-client/tsconfig.tsbuildinfo +1 -0
  140. package/dist-client/viewparts/kpi-metric-input.d.ts +23 -0
  141. package/dist-client/viewparts/kpi-metric-input.js +140 -0
  142. package/dist-client/viewparts/kpi-metric-input.js.map +1 -0
  143. package/dist-client/viewparts/kpi-metric-meta-editor.d.ts +36 -0
  144. package/dist-client/viewparts/kpi-metric-meta-editor.js +321 -0
  145. package/dist-client/viewparts/kpi-metric-meta-editor.js.map +1 -0
  146. package/dist-client/viewparts/metric-input-hint.d.ts +26 -0
  147. package/dist-client/viewparts/metric-input-hint.js +19 -0
  148. package/dist-client/viewparts/metric-input-hint.js.map +1 -0
  149. package/dist-client/viewparts/metric-input.test.d.ts +1 -0
  150. package/dist-client/viewparts/metric-input.test.js +43 -0
  151. package/dist-client/viewparts/metric-input.test.js.map +1 -0
  152. package/dist-client/viewparts/metric-renderer-registry.d.ts +18 -0
  153. package/dist-client/viewparts/metric-renderer-registry.js +29 -0
  154. package/dist-client/viewparts/metric-renderer-registry.js.map +1 -0
  155. package/dist-client/viewparts/ox-grist-editor-metric-input-hint.d.ts +19 -0
  156. package/dist-client/viewparts/ox-grist-editor-metric-input-hint.js +76 -0
  157. package/dist-client/viewparts/ox-grist-editor-metric-input-hint.js.map +1 -0
  158. package/dist-server/calculator/calculator.test.d.ts +1 -0
  159. package/dist-server/calculator/calculator.test.js +126 -0
  160. package/dist-server/calculator/calculator.test.js.map +1 -0
  161. package/dist-server/calculator/evaluator.d.ts +8 -0
  162. package/dist-server/calculator/evaluator.js +42 -0
  163. package/dist-server/calculator/evaluator.js.map +1 -0
  164. package/dist-server/calculator/functions.d.ts +3 -0
  165. package/dist-server/calculator/functions.js +62 -0
  166. package/dist-server/calculator/functions.js.map +1 -0
  167. package/dist-server/calculator/index.d.ts +6 -0
  168. package/dist-server/calculator/index.js +10 -0
  169. package/dist-server/calculator/index.js.map +1 -0
  170. package/dist-server/calculator/parser.d.ts +34 -0
  171. package/dist-server/calculator/parser.js +185 -0
  172. package/dist-server/calculator/parser.js.map +1 -0
  173. package/dist-server/calculator/provider.d.ts +8 -0
  174. package/dist-server/calculator/provider.js +13 -0
  175. package/dist-server/calculator/provider.js.map +1 -0
  176. package/dist-server/calculator/score.d.ts +21 -0
  177. package/dist-server/calculator/score.js +36 -0
  178. package/dist-server/calculator/score.js.map +1 -0
  179. package/dist-server/calculator/score.test.d.ts +1 -0
  180. package/dist-server/calculator/score.test.js +47 -0
  181. package/dist-server/calculator/score.test.js.map +1 -0
  182. package/dist-server/calculator/validate.d.ts +15 -0
  183. package/dist-server/calculator/validate.js +30 -0
  184. package/dist-server/calculator/validate.js.map +1 -0
  185. package/dist-server/calculator/validate.test.d.ts +1 -0
  186. package/dist-server/calculator/validate.test.js +45 -0
  187. package/dist-server/calculator/validate.test.js.map +1 -0
  188. package/dist-server/controllers/index.d.ts +2 -0
  189. package/dist-server/controllers/index.js +6 -0
  190. package/dist-server/controllers/index.js.map +1 -0
  191. package/dist-server/controllers/kpi-metric-value-provider.d.ts +11 -0
  192. package/dist-server/controllers/kpi-metric-value-provider.js +97 -0
  193. package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -0
  194. package/dist-server/controllers/kpi-value-provider.d.ts +11 -0
  195. package/dist-server/controllers/kpi-value-provider.js +50 -0
  196. package/dist-server/controllers/kpi-value-provider.js.map +1 -0
  197. package/dist-server/index.d.ts +5 -0
  198. package/dist-server/index.js +9 -0
  199. package/dist-server/index.js.map +1 -0
  200. package/dist-server/migrations/1752190849680-seed-kpi-metrics.d.ts +6 -0
  201. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js +102 -0
  202. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js.map +1 -0
  203. package/dist-server/migrations/1752190849681-seed-kpi.d.ts +5 -0
  204. package/dist-server/migrations/1752190849681-seed-kpi.js +315 -0
  205. package/dist-server/migrations/1752190849681-seed-kpi.js.map +1 -0
  206. package/dist-server/migrations/1752192090123-add-grades-to-kpi.d.ts +7 -0
  207. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js +51 -0
  208. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js.map +1 -0
  209. package/dist-server/migrations/1752192090124-add-kpi-statistics.d.ts +5 -0
  210. package/dist-server/migrations/1752192090124-add-kpi-statistics.js +710 -0
  211. package/dist-server/migrations/1752192090124-add-kpi-statistics.js.map +1 -0
  212. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.d.ts +6 -0
  213. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js +111 -0
  214. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js.map +1 -0
  215. package/dist-server/migrations/1752192090129-seed-kpi-values.d.ts +6 -0
  216. package/dist-server/migrations/1752192090129-seed-kpi-values.js +187 -0
  217. package/dist-server/migrations/1752192090129-seed-kpi-values.js.map +1 -0
  218. package/dist-server/migrations/1752192090200-add-meta-to-kpi-metric.d.ts +10 -0
  219. package/dist-server/migrations/1752192090200-add-meta-to-kpi-metric.js +26 -0
  220. package/dist-server/migrations/1752192090200-add-meta-to-kpi-metric.js.map +1 -0
  221. package/dist-server/migrations/1752192090201-backfill-kpi-metric-meta.d.ts +11 -0
  222. package/dist-server/migrations/1752192090201-backfill-kpi-metric-meta.js +54 -0
  223. package/dist-server/migrations/1752192090201-backfill-kpi-metric-meta.js.map +1 -0
  224. package/dist-server/migrations/grade-data/x11-performance-table.json +962 -0
  225. package/dist-server/migrations/grade-data/x12-performance-table.json +611 -0
  226. package/dist-server/migrations/grade-data/x14-performance-table.json +42 -0
  227. package/dist-server/migrations/grade-data/x21-performance-table.json +889 -0
  228. package/dist-server/migrations/grade-data/x22-performance-table.json +1064 -0
  229. package/dist-server/migrations/grade-data/x23-performance-table.json +42 -0
  230. package/dist-server/migrations/grade-data/x31-performance-table.json +644 -0
  231. package/dist-server/migrations/grade-data/x32-performance-table.json +993 -0
  232. package/dist-server/migrations/grade-data/x33-performance-table.json +195 -0
  233. package/dist-server/migrations/grade-data/x34-performance-table.json +12 -0
  234. package/dist-server/migrations/grade-data/x35-performance-table.json +42 -0
  235. package/dist-server/migrations/grade-data/x41-performance-table.json +825 -0
  236. package/dist-server/migrations/grade-data/x42-performance-table.json +786 -0
  237. package/dist-server/migrations/grade-data/x43-performance-table.json +12 -0
  238. package/dist-server/migrations/grade-data/x44-performance-table.json +42 -0
  239. package/dist-server/migrations/grade-data/x51-performance-table.json +924 -0
  240. package/dist-server/migrations/grade-data/x52-performance-table.json +42 -0
  241. package/dist-server/migrations/grade-data/x61-performance-table.json +261 -0
  242. package/dist-server/migrations/grade-data/x62-performance-table.json +42 -0
  243. package/dist-server/migrations/index.d.ts +1 -0
  244. package/dist-server/migrations/index.js +12 -0
  245. package/dist-server/migrations/index.js.map +1 -0
  246. package/dist-server/migrations/seed-data/kpi-metrics-seed.json +517 -0
  247. package/dist-server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
  248. package/dist-server/migrations/seed-data/kpi-scopes-seed.json +121 -0
  249. package/dist-server/migrations/seed-data/kpi-values-seed.json +402 -0
  250. package/dist-server/migrations/seed-data/kpis-seed.json +488 -0
  251. package/dist-server/migrations/seed-data/scope-definitions-seed.json +90 -0
  252. package/dist-server/routes.d.ts +1 -0
  253. package/dist-server/routes.js +72 -0
  254. package/dist-server/routes.js.map +1 -0
  255. package/dist-server/service/index.d.ts +15 -0
  256. package/dist-server/service/index.js +49 -0
  257. package/dist-server/service/index.js.map +1 -0
  258. package/dist-server/service/kpi/aggregate-kpi.d.ts +8 -0
  259. package/dist-server/service/kpi/aggregate-kpi.js +123 -0
  260. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -0
  261. package/dist-server/service/kpi/event-subscriber.d.ts +9 -0
  262. package/dist-server/service/kpi/event-subscriber.js +31 -0
  263. package/dist-server/service/kpi/event-subscriber.js.map +1 -0
  264. package/dist-server/service/kpi/index.d.ts +8 -0
  265. package/dist-server/service/kpi/index.js +12 -0
  266. package/dist-server/service/kpi/index.js.map +1 -0
  267. package/dist-server/service/kpi/kpi-formula.service.d.ts +49 -0
  268. package/dist-server/service/kpi/kpi-formula.service.js +165 -0
  269. package/dist-server/service/kpi/kpi-formula.service.js.map +1 -0
  270. package/dist-server/service/kpi/kpi-grade.types.d.ts +22 -0
  271. package/dist-server/service/kpi/kpi-grade.types.js +3 -0
  272. package/dist-server/service/kpi/kpi-grade.types.js.map +1 -0
  273. package/dist-server/service/kpi/kpi-history.d.ts +29 -0
  274. package/dist-server/service/kpi/kpi-history.js +148 -0
  275. package/dist-server/service/kpi/kpi-history.js.map +1 -0
  276. package/dist-server/service/kpi/kpi-mutation.d.ts +14 -0
  277. package/dist-server/service/kpi/kpi-mutation.js +553 -0
  278. package/dist-server/service/kpi/kpi-mutation.js.map +1 -0
  279. package/dist-server/service/kpi/kpi-query.d.ts +24 -0
  280. package/dist-server/service/kpi/kpi-query.js +309 -0
  281. package/dist-server/service/kpi/kpi-query.js.map +1 -0
  282. package/dist-server/service/kpi/kpi-type.d.ts +48 -0
  283. package/dist-server/service/kpi/kpi-type.js +221 -0
  284. package/dist-server/service/kpi/kpi-type.js.map +1 -0
  285. package/dist-server/service/kpi/kpi.d.ts +130 -0
  286. package/dist-server/service/kpi/kpi.js +356 -0
  287. package/dist-server/service/kpi/kpi.js.map +1 -0
  288. package/dist-server/service/kpi-alert/index.d.ts +2 -0
  289. package/dist-server/service/kpi-alert/index.js +6 -0
  290. package/dist-server/service/kpi-alert/index.js.map +1 -0
  291. package/dist-server/service/kpi-alert/kpi-alert-query.d.ts +4 -0
  292. package/dist-server/service/kpi-alert/kpi-alert-query.js +72 -0
  293. package/dist-server/service/kpi-alert/kpi-alert-query.js.map +1 -0
  294. package/dist-server/service/kpi-alert/kpi-alert-type.d.ts +8 -0
  295. package/dist-server/service/kpi-alert/kpi-alert-type.js +33 -0
  296. package/dist-server/service/kpi-alert/kpi-alert-type.js.map +1 -0
  297. package/dist-server/service/kpi-metric/aggregate-kpi-metric.d.ts +8 -0
  298. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +126 -0
  299. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -0
  300. package/dist-server/service/kpi-metric/index.d.ts +6 -0
  301. package/dist-server/service/kpi-metric/index.js +10 -0
  302. package/dist-server/service/kpi-metric/index.js.map +1 -0
  303. package/dist-server/service/kpi-metric/kpi-metric-meta.d.ts +46 -0
  304. package/dist-server/service/kpi-metric/kpi-metric-meta.js +27 -0
  305. package/dist-server/service/kpi-metric/kpi-metric-meta.js.map +1 -0
  306. package/dist-server/service/kpi-metric/kpi-metric-meta.test.d.ts +1 -0
  307. package/dist-server/service/kpi-metric/kpi-metric-meta.test.js +43 -0
  308. package/dist-server/service/kpi-metric/kpi-metric-meta.test.js.map +1 -0
  309. package/dist-server/service/kpi-metric/kpi-metric-mutation.d.ts +10 -0
  310. package/dist-server/service/kpi-metric/kpi-metric-mutation.js +296 -0
  311. package/dist-server/service/kpi-metric/kpi-metric-mutation.js.map +1 -0
  312. package/dist-server/service/kpi-metric/kpi-metric-query.d.ts +14 -0
  313. package/dist-server/service/kpi-metric/kpi-metric-query.js +126 -0
  314. package/dist-server/service/kpi-metric/kpi-metric-query.js.map +1 -0
  315. package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +45 -0
  316. package/dist-server/service/kpi-metric/kpi-metric-type.js +177 -0
  317. package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -0
  318. package/dist-server/service/kpi-metric/kpi-metric.d.ts +39 -0
  319. package/dist-server/service/kpi-metric/kpi-metric.js +174 -0
  320. package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -0
  321. package/dist-server/service/kpi-metric-value/index.d.ts +6 -0
  322. package/dist-server/service/kpi-metric-value/index.js +10 -0
  323. package/dist-server/service/kpi-metric-value/index.js.map +1 -0
  324. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +11 -0
  325. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +283 -0
  326. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -0
  327. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.d.ts +13 -0
  328. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js +106 -0
  329. package/dist-server/service/kpi-metric-value/kpi-metric-value-query.js.map +1 -0
  330. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.d.ts +26 -0
  331. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js +112 -0
  332. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js.map +1 -0
  333. package/dist-server/service/kpi-metric-value/kpi-metric-value.d.ts +23 -0
  334. package/dist-server/service/kpi-metric-value/kpi-metric-value.js +107 -0
  335. package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -0
  336. package/dist-server/service/kpi-org-scope/index.d.ts +5 -0
  337. package/dist-server/service/kpi-org-scope/index.js +9 -0
  338. package/dist-server/service/kpi-org-scope/index.js.map +1 -0
  339. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.d.ts +8 -0
  340. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js +170 -0
  341. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js.map +1 -0
  342. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.d.ts +14 -0
  343. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js +152 -0
  344. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js.map +1 -0
  345. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.d.ts +26 -0
  346. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js +101 -0
  347. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js.map +1 -0
  348. package/dist-server/service/kpi-org-scope/kpi-org-scope.d.ts +26 -0
  349. package/dist-server/service/kpi-org-scope/kpi-org-scope.js +135 -0
  350. package/dist-server/service/kpi-org-scope/kpi-org-scope.js.map +1 -0
  351. package/dist-server/service/kpi-scope/index.d.ts +9 -0
  352. package/dist-server/service/kpi-scope/index.js +14 -0
  353. package/dist-server/service/kpi-scope/index.js.map +1 -0
  354. package/dist-server/service/kpi-scope/kpi-scope-mutation.d.ts +9 -0
  355. package/dist-server/service/kpi-scope/kpi-scope-mutation.js +140 -0
  356. package/dist-server/service/kpi-scope/kpi-scope-mutation.js.map +1 -0
  357. package/dist-server/service/kpi-scope/kpi-scope-query.d.ts +11 -0
  358. package/dist-server/service/kpi-scope/kpi-scope-query.js +89 -0
  359. package/dist-server/service/kpi-scope/kpi-scope-query.js.map +1 -0
  360. package/dist-server/service/kpi-scope/kpi-scope-type.d.ts +35 -0
  361. package/dist-server/service/kpi-scope/kpi-scope-type.js +138 -0
  362. package/dist-server/service/kpi-scope/kpi-scope-type.js.map +1 -0
  363. package/dist-server/service/kpi-scope/kpi-scope.d.ts +38 -0
  364. package/dist-server/service/kpi-scope/kpi-scope.js +144 -0
  365. package/dist-server/service/kpi-scope/kpi-scope.js.map +1 -0
  366. package/dist-server/service/kpi-statistic/index.d.ts +6 -0
  367. package/dist-server/service/kpi-statistic/index.js +10 -0
  368. package/dist-server/service/kpi-statistic/index.js.map +1 -0
  369. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.d.ts +43 -0
  370. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js +181 -0
  371. package/dist-server/service/kpi-statistic/kpi-statistic-batch.service.js.map +1 -0
  372. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.d.ts +50 -0
  373. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js +324 -0
  374. package/dist-server/service/kpi-statistic/kpi-statistic-calculation.service.js.map +1 -0
  375. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.d.ts +14 -0
  376. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js +279 -0
  377. package/dist-server/service/kpi-statistic/kpi-statistic-mutation.js.map +1 -0
  378. package/dist-server/service/kpi-statistic/kpi-statistic-query.d.ts +17 -0
  379. package/dist-server/service/kpi-statistic/kpi-statistic-query.js +183 -0
  380. package/dist-server/service/kpi-statistic/kpi-statistic-query.js.map +1 -0
  381. package/dist-server/service/kpi-statistic/kpi-statistic-type.d.ts +59 -0
  382. package/dist-server/service/kpi-statistic/kpi-statistic-type.js +200 -0
  383. package/dist-server/service/kpi-statistic/kpi-statistic-type.js.map +1 -0
  384. package/dist-server/service/kpi-statistic/kpi-statistic.d.ts +42 -0
  385. package/dist-server/service/kpi-statistic/kpi-statistic.js +210 -0
  386. package/dist-server/service/kpi-statistic/kpi-statistic.js.map +1 -0
  387. package/dist-server/service/kpi-value/index.d.ts +6 -0
  388. package/dist-server/service/kpi-value/index.js +10 -0
  389. package/dist-server/service/kpi-value/index.js.map +1 -0
  390. package/dist-server/service/kpi-value/kpi-value-mutation.d.ts +13 -0
  391. package/dist-server/service/kpi-value/kpi-value-mutation.js +447 -0
  392. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -0
  393. package/dist-server/service/kpi-value/kpi-value-query.d.ts +22 -0
  394. package/dist-server/service/kpi-value/kpi-value-query.js +149 -0
  395. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -0
  396. package/dist-server/service/kpi-value/kpi-value-score.service.d.ts +24 -0
  397. package/dist-server/service/kpi-value/kpi-value-score.service.js +61 -0
  398. package/dist-server/service/kpi-value/kpi-value-score.service.js.map +1 -0
  399. package/dist-server/service/kpi-value/kpi-value-type.d.ts +33 -0
  400. package/dist-server/service/kpi-value/kpi-value-type.js +156 -0
  401. package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -0
  402. package/dist-server/service/kpi-value/kpi-value.d.ts +32 -0
  403. package/dist-server/service/kpi-value/kpi-value.js +175 -0
  404. package/dist-server/service/kpi-value/kpi-value.js.map +1 -0
  405. package/dist-server/service/utils/value-date-util.d.ts +4 -0
  406. package/dist-server/service/utils/value-date-util.js +117 -0
  407. package/dist-server/service/utils/value-date-util.js.map +1 -0
  408. package/dist-server/tsconfig.tsbuildinfo +1 -0
  409. package/package.json +3 -3
@@ -0,0 +1,884 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { html, css, nothing } from 'lit';
3
+ import { customElement } from 'lit/decorators.js';
4
+ import { PageView } from '@operato/shell';
5
+ import { ScrollbarStyles } from '@operato/styles';
6
+ import { client } from '@operato/graphql';
7
+ import gql from 'graphql-tag';
8
+ import { state } from 'lit/decorators.js';
9
+ import '@material/web/icon/icon.js';
10
+ import './kpi-performance-summary';
11
+ import './kpi-grade-visualization';
12
+ import './kpi-history-viewer';
13
+ import './kpi-list-summary';
14
+ import './kpi-value-entry';
15
+ import './kpi-alert-panel';
16
+ import '../../charts/kpi-radar-chart';
17
+ import '../../charts/kpi-boxplot-chart';
18
+ // 3레벨 KPI 플로팅 컴포넌트들
19
+ import './cards/kpi-level1-card';
20
+ import './cards/kpi-level2-comparison';
21
+ import './cards/kpi-level3-comparison';
22
+ let KpiDashboardPage = class KpiDashboardPage extends PageView {
23
+ constructor() {
24
+ super(...arguments);
25
+ this.categories = [];
26
+ this.loading = true;
27
+ this.error = '';
28
+ this.alerts = [];
29
+ this.showHistoryModal = false;
30
+ this.modalHistories = [];
31
+ this.modalKpiName = '';
32
+ this.kpiStatistics = []; // 실제 KPI 통계 데이터
33
+ this.statisticsLoading = true; // 통계 데이터 로딩 상태
34
+ this.selectedPeriodType = 'MONTH'; // 선택된 기간 타입 (MONTH로 고정)
35
+ this.selectedValueDate = ''; // 선택된 값 날짜
36
+ }
37
+ static { this.styles = [
38
+ ScrollbarStyles,
39
+ css `
40
+ :host {
41
+ display: flex;
42
+ flex-direction: column;
43
+ overflow-y: auto;
44
+ }
45
+ .dashboard-root {
46
+ flex: 1;
47
+ padding: 24px;
48
+ }
49
+ .charts-section {
50
+ display: flex;
51
+ flex-direction: column;
52
+ gap: 40px;
53
+ margin-bottom: 48px;
54
+ align-items: flex-start;
55
+ }
56
+ .chart-card {
57
+ background: #fff;
58
+ border-radius: 12px;
59
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
60
+ border: 1px solid #ececec;
61
+ padding: 24px 32px;
62
+ min-width: 340px;
63
+ flex: 1;
64
+ display: flex;
65
+ flex-direction: column;
66
+ align-items: stretch;
67
+ min-height: 500px;
68
+ }
69
+ .chart-title {
70
+ font-size: 1.1rem;
71
+ font-weight: bold;
72
+ margin-bottom: 12px;
73
+ }
74
+ .chart-container {
75
+ width: 100%;
76
+ height: 340px;
77
+ min-height: 340px;
78
+ }
79
+ .category-section {
80
+ margin-bottom: 40px;
81
+ }
82
+ .category-title {
83
+ font-size: 1.3rem;
84
+ font-weight: bold;
85
+ margin-bottom: 16px;
86
+ }
87
+ .kpi-cards {
88
+ display: flex;
89
+ gap: 24px;
90
+ flex-wrap: wrap;
91
+ }
92
+ .kpi-card {
93
+ background: #fff;
94
+ border-radius: 12px;
95
+ padding: 24px 32px;
96
+ min-width: 220px;
97
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
98
+ display: flex;
99
+ flex-direction: column;
100
+ align-items: flex-start;
101
+ margin-bottom: 8px;
102
+ border: 1px solid #ececec;
103
+ }
104
+ .kpi-name {
105
+ font-size: 1.1rem;
106
+ font-weight: 500;
107
+ margin-bottom: 8px;
108
+ }
109
+ .kpi-value {
110
+ font-size: 2.2rem;
111
+ font-weight: bold;
112
+ color: #3a3ad6;
113
+ margin-bottom: 4px;
114
+ }
115
+ .kpi-target {
116
+ font-size: 1rem;
117
+ color: #888;
118
+ }
119
+ `
120
+ ]; }
121
+ // 현재 월을 YYYY-MM 형식으로 반환
122
+ get currentMonth() {
123
+ const now = new Date();
124
+ const year = now.getFullYear();
125
+ const month = String(now.getMonth() + 1).padStart(2, '0');
126
+ return `${year}-${month}`;
127
+ }
128
+ // 필터링된 KPI 통계 데이터
129
+ get filteredKpiStatistics() {
130
+ if (!this.kpiStatistics || this.kpiStatistics.length === 0)
131
+ return [];
132
+ return this.kpiStatistics.filter(stat => stat.periodType === 'MONTH' && stat.valueDate === this.selectedValueDate);
133
+ }
134
+ // 사용 가능한 기간 타입들 (MONTH로 고정)
135
+ get availablePeriodTypes() {
136
+ return ['MONTH'];
137
+ }
138
+ // MONTH 기간에 사용 가능한 날짜들
139
+ get availableValueDates() {
140
+ if (!this.kpiStatistics || this.kpiStatistics.length === 0)
141
+ return [];
142
+ const valueDates = new Set();
143
+ this.kpiStatistics.forEach(stat => {
144
+ if (stat.periodType === 'MONTH' && stat.valueDate) {
145
+ valueDates.add(stat.valueDate);
146
+ }
147
+ });
148
+ return Array.from(valueDates).sort().reverse(); // 최신 날짜부터 정렬
149
+ }
150
+ // 통계 요약 정보
151
+ get statisticsSummary() {
152
+ const filteredStats = this.filteredKpiStatistics;
153
+ if (filteredStats.length === 0)
154
+ return null;
155
+ const totalKpis = filteredStats.length;
156
+ const categories = new Set(filteredStats.map(s => s.kpi?.category?.name).filter(Boolean));
157
+ const totalCategories = categories.size;
158
+ const means = filteredStats.map(s => s.mean || 0).filter(v => v > 0);
159
+ const medians = filteredStats.map(s => s.median || 0).filter(v => v > 0);
160
+ const stdDevs = filteredStats.map(s => s.standardDeviation || 0).filter(v => v > 0);
161
+ const avgMean = means.length > 0 ? means.reduce((a, b) => a + b, 0) / means.length : 0;
162
+ const avgMedian = medians.length > 0 ? medians.reduce((a, b) => a + b, 0) / medians.length : 0;
163
+ const avgStdDev = stdDevs.length > 0 ? stdDevs.reduce((a, b) => a + b, 0) / stdDevs.length : 0;
164
+ return {
165
+ totalKpis,
166
+ totalCategories,
167
+ avgMean: avgMean.toFixed(2),
168
+ avgMedian: avgMedian.toFixed(2),
169
+ avgStdDev: avgStdDev.toFixed(2),
170
+ periodType: this.selectedPeriodType,
171
+ valueDate: this.selectedValueDate
172
+ };
173
+ }
174
+ // 기간 타입 변경 핸들러 (사용하지 않음 - MONTH로 고정)
175
+ _onPeriodTypeChange(event) {
176
+ // MONTH로 고정되어 있으므로 변경하지 않음
177
+ }
178
+ // 날짜 변경 핸들러
179
+ _onValueDateChange(event) {
180
+ const target = event.target;
181
+ this.selectedValueDate = target.value;
182
+ }
183
+ // 실제 KPI 통계 데이터를 기반으로 한 레이더 차트 데이터
184
+ get realKpiRadarData() {
185
+ const filteredStats = this.filteredKpiStatistics;
186
+ if (filteredStats.length === 0)
187
+ return [];
188
+ // 카테고리별로 통계 데이터 그룹화
189
+ const categoryStats = new Map();
190
+ filteredStats.forEach(stat => {
191
+ if (stat.kpi?.category?.name) {
192
+ const categoryName = stat.kpi.category.name;
193
+ if (!categoryStats.has(categoryName)) {
194
+ categoryStats.set(categoryName, []);
195
+ }
196
+ categoryStats.get(categoryName).push(stat);
197
+ }
198
+ });
199
+ // 각 카테고리별로 평균, 중앙값, 표준편차 계산
200
+ const result = [];
201
+ const categories = Array.from(categoryStats.keys());
202
+ categories.forEach(category => {
203
+ const stats = categoryStats.get(category);
204
+ const means = stats.map(s => s.mean || 0).filter(v => v > 0);
205
+ const medians = stats.map(s => s.median || 0).filter(v => v > 0);
206
+ const stdDevs = stats.map(s => s.standardDeviation || 0).filter(v => v > 0);
207
+ if (means.length > 0) {
208
+ result.push({ group: '평균', category, value: means.reduce((a, b) => a + b, 0) / means.length });
209
+ }
210
+ if (medians.length > 0) {
211
+ result.push({ group: '중앙값', category, value: medians.reduce((a, b) => a + b, 0) / medians.length });
212
+ }
213
+ if (stdDevs.length > 0) {
214
+ result.push({ group: '표준편차', category, value: stdDevs.reduce((a, b) => a + b, 0) / stdDevs.length });
215
+ }
216
+ });
217
+ return result;
218
+ }
219
+ get realKpiRadarCategories() {
220
+ const filteredStats = this.filteredKpiStatistics;
221
+ if (filteredStats.length === 0)
222
+ return [];
223
+ const categories = new Set();
224
+ filteredStats.forEach(stat => {
225
+ if (stat.kpi?.category?.name) {
226
+ categories.add(stat.kpi.category.name);
227
+ }
228
+ });
229
+ return Array.from(categories);
230
+ }
231
+ get realKpiRadarGroups() {
232
+ return ['평균', '중앙값', '표준편차'];
233
+ }
234
+ // 실제 KPI 통계 데이터를 기반으로 한 박스플롯 데이터
235
+ get realKpiBoxplotData() {
236
+ const filteredStats = this.filteredKpiStatistics;
237
+ if (filteredStats.length === 0)
238
+ return [];
239
+ // 카테고리별로 통계 데이터 그룹화
240
+ const categoryStats = new Map();
241
+ filteredStats.forEach(stat => {
242
+ if (stat.kpi?.category?.name) {
243
+ const categoryName = stat.kpi.category.name;
244
+ if (!categoryStats.has(categoryName)) {
245
+ categoryStats.set(categoryName, []);
246
+ }
247
+ categoryStats.get(categoryName).push(stat);
248
+ }
249
+ });
250
+ const result = [];
251
+ const categories = Array.from(categoryStats.keys());
252
+ categories.forEach(category => {
253
+ const stats = categoryStats.get(category);
254
+ // 각 KPI의 통계값들을 수집
255
+ const allMeans = stats.map(s => s.mean || 0).filter(v => v > 0);
256
+ const allMedians = stats.map(s => s.median || 0).filter(v => v > 0);
257
+ const allMins = stats.map(s => s.minimum || 0).filter(v => v > 0);
258
+ const allMaxs = stats.map(s => s.maximum || 0).filter(v => v > 0);
259
+ const allQ1s = stats.map(s => s.percentile25 || 0).filter(v => v > 0);
260
+ const allQ3s = stats.map(s => s.percentile75 || 0).filter(v => v > 0);
261
+ if (allMeans.length > 0) {
262
+ const sortedMeans = [...allMeans].sort((a, b) => a - b);
263
+ const min = sortedMeans[0];
264
+ const max = sortedMeans[sortedMeans.length - 1];
265
+ const mean = allMeans.reduce((a, b) => a + b, 0) / allMeans.length;
266
+ const median = allMedians.length > 0 ? allMedians.reduce((a, b) => a + b, 0) / allMedians.length : mean;
267
+ const q1 = sortedMeans[Math.floor(sortedMeans.length / 4)];
268
+ const q3 = sortedMeans[Math.floor((sortedMeans.length * 3) / 4)];
269
+ result.push({
270
+ group: category,
271
+ min,
272
+ q1,
273
+ median,
274
+ q3,
275
+ max,
276
+ mean,
277
+ value: mean // 현재 값으로 평균 사용
278
+ });
279
+ }
280
+ });
281
+ return result;
282
+ }
283
+ get realKpiBoxplotGroups() {
284
+ const filteredStats = this.filteredKpiStatistics;
285
+ if (filteredStats.length === 0)
286
+ return [];
287
+ const categories = new Set();
288
+ filteredStats.forEach(stat => {
289
+ if (stat.kpi?.category?.name) {
290
+ categories.add(stat.kpi.category.name);
291
+ }
292
+ });
293
+ return Array.from(categories);
294
+ }
295
+ get realKpiCurrentGroup() {
296
+ return '평균';
297
+ }
298
+ connectedCallback() {
299
+ super.connectedCallback();
300
+ this.fetchCategories();
301
+ this.fetchKpiStatistics();
302
+ }
303
+ pageUpdated(changes, lifecycle) {
304
+ if (this.active) {
305
+ this.fetchCategories();
306
+ this.fetchKpiStatistics();
307
+ }
308
+ }
309
+ async fetchCategories() {
310
+ this.loading = true;
311
+ this.error = '';
312
+ try {
313
+ const response = await client.query({
314
+ query: gql `
315
+ query {
316
+ kpiCategories: kpisLevel1 {
317
+ id
318
+ name
319
+ kpis: children {
320
+ id
321
+ name
322
+ value {
323
+ value
324
+ valueDate
325
+ }
326
+ targetValue
327
+ unit
328
+ grades
329
+ vizType
330
+ vizMeta
331
+ histories(limit: 1) {
332
+ version
333
+ updatedAt
334
+ updater {
335
+ name
336
+ }
337
+ }
338
+ }
339
+ }
340
+ kpiAlerts {
341
+ id
342
+ kpi {
343
+ id
344
+ }
345
+ message
346
+ level
347
+ createdAt
348
+ }
349
+ }
350
+ `
351
+ });
352
+ this.categories = response.data.kpiCategories || [];
353
+ this.alerts = response.data.kpiAlerts || [];
354
+ }
355
+ catch (e) {
356
+ this.error = 'KPI 카테고리 데이터를 불러오지 못했습니다.';
357
+ }
358
+ finally {
359
+ this.loading = false;
360
+ }
361
+ }
362
+ async fetchKpiStatistics() {
363
+ this.statisticsLoading = true;
364
+ try {
365
+ const response = await client.query({
366
+ query: gql `
367
+ query {
368
+ kpiStatistics {
369
+ items {
370
+ id
371
+ valueDate
372
+ periodType
373
+ count
374
+ sum
375
+ range
376
+ mean
377
+ median
378
+ minimum
379
+ maximum
380
+ standardDeviation
381
+ variance
382
+ percentile25
383
+ percentile75
384
+ iqr
385
+ lowerFence
386
+ upperFence
387
+ additionalStatistics
388
+ metadata
389
+ kpi {
390
+ id
391
+ name
392
+ unit
393
+ category: parent {
394
+ id
395
+ name
396
+ }
397
+ }
398
+ }
399
+ }
400
+ }
401
+ `
402
+ });
403
+ this.kpiStatistics = response.data.kpiStatistics.items || [];
404
+ // 현재 월을 기본값으로 설정
405
+ const currentMonth = this.currentMonth;
406
+ const availableDates = this.availableValueDates;
407
+ if (availableDates.includes(currentMonth)) {
408
+ // 현재 월 데이터가 있으면 현재 월로 설정
409
+ this.selectedValueDate = currentMonth;
410
+ }
411
+ else if (availableDates.length > 0) {
412
+ // 현재 월 데이터가 없으면 가장 최근 데이터로 설정
413
+ this.selectedValueDate = availableDates[0];
414
+ }
415
+ else {
416
+ // 데이터가 없으면 현재 월로 설정
417
+ this.selectedValueDate = currentMonth;
418
+ }
419
+ }
420
+ catch (e) {
421
+ console.error('KPI 통계 데이터를 불러오지 못했습니다:', e);
422
+ }
423
+ finally {
424
+ this.statisticsLoading = false;
425
+ }
426
+ }
427
+ async openHistoryModal(kpi) {
428
+ // 전체 이력 fetch (limit 없이)
429
+ try {
430
+ const response = await client.query({
431
+ query: gql `
432
+ query ($kpiId: String!) {
433
+ kpi(id: $kpiId) {
434
+ name
435
+ histories {
436
+ version
437
+ updatedAt
438
+ updater {
439
+ name
440
+ }
441
+ }
442
+ }
443
+ }
444
+ `,
445
+ variables: { kpiId: kpi.id }
446
+ });
447
+ this.modalHistories = response.data.kpi.histories || [];
448
+ this.modalKpiName = response.data.kpi.name || '';
449
+ this.showHistoryModal = true;
450
+ }
451
+ catch (e) {
452
+ alert('이력 데이터를 불러오지 못했습니다.');
453
+ }
454
+ }
455
+ closeHistoryModal() {
456
+ this.showHistoryModal = false;
457
+ this.modalHistories = [];
458
+ this.modalKpiName = '';
459
+ }
460
+ _renderKpiValue(kpi) {
461
+ const kpiValue = kpi.value?.value ?? 0;
462
+ const targetValue = kpi.targetValue ?? 100;
463
+ const unit = kpi.unit ?? '';
464
+ const vizType = kpi.vizType || 'CARD';
465
+ const vizMeta = kpi.vizMeta || {};
466
+ const color = vizMeta.color || '#3a3ad6';
467
+ const icon = vizMeta.icon || 'trending_up';
468
+ const minValue = vizMeta.minValue || 0;
469
+ const maxValue = vizMeta.maxValue || 100;
470
+ const decimalPlaces = vizMeta.decimalPlaces || 0;
471
+ const formattedValue = typeof kpiValue === 'number' ? kpiValue.toFixed(decimalPlaces) : kpiValue;
472
+ switch (vizType) {
473
+ case 'GAUGE':
474
+ const gaugePercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100);
475
+ return html `
476
+ <div style="text-align:center;margin:16px 0;">
477
+ <div
478
+ style="width:120px;height:60px;border-radius:60px 60px 0 0;background:conic-gradient(${color} 0deg ${gaugePercentage *
479
+ 3.6}deg, #e0e0e0 ${gaugePercentage * 3.6}deg 360deg);margin:0 auto;position:relative;"
480
+ >
481
+ <div
482
+ style="position:absolute;bottom:0;left:50%;transform:translateX(-50%);font-size:1.2rem;font-weight:bold;color:${color};"
483
+ >
484
+ ${formattedValue}${unit}
485
+ </div>
486
+ </div>
487
+ </div>
488
+ `;
489
+ case 'PROGRESS':
490
+ const progressPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100);
491
+ return html `
492
+ <div style="margin:16px 0;">
493
+ <div style="background:#e0e0e0;height:20px;border-radius:10px;overflow:hidden;">
494
+ <div style="background:${color};height:100%;width:${progressPercentage}%;transition:width 0.3s;"></div>
495
+ </div>
496
+ <div style="text-align:center;margin-top:8px;font-weight:bold;color:${color};font-size:1.2rem;">
497
+ ${formattedValue}${unit}
498
+ </div>
499
+ </div>
500
+ `;
501
+ case 'ICON':
502
+ return html `
503
+ <div style="text-align:center;margin:16px 0;">
504
+ <md-icon style="color:${color};font-size:48px;">${icon}</md-icon>
505
+ <div style="font-size:1.5rem;font-weight:bold;color:${color};margin-top:8px;">${formattedValue}${unit}</div>
506
+ </div>
507
+ `;
508
+ case 'THERMOMETER':
509
+ const thermoPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100);
510
+ return html `
511
+ <div style="text-align:center;margin:16px 0;">
512
+ <div
513
+ style="width:40px;height:120px;background:#e0e0e0;border-radius:20px;margin:0 auto;position:relative;overflow:hidden;"
514
+ >
515
+ <div
516
+ style="position:absolute;bottom:0;width:100%;height:${thermoPercentage}%;background:${color};border-radius:20px;"
517
+ ></div>
518
+ </div>
519
+ <div style="font-size:1.2rem;font-weight:bold;color:${color};margin-top:8px;">${formattedValue}${unit}</div>
520
+ </div>
521
+ `;
522
+ case 'SPEEDOMETER':
523
+ const speedPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100);
524
+ const angle = (speedPercentage / 100) * 180 - 90; // -90도에서 90도까지
525
+ return html `
526
+ <div style="text-align:center;margin:16px 0;">
527
+ <div
528
+ style="width:120px;height:60px;border-radius:60px 60px 0 0;background:conic-gradient(${color} -90deg ${angle}deg, #e0e0e0 ${angle}deg 90deg);margin:0 auto;position:relative;"
529
+ >
530
+ <div
531
+ style="position:absolute;bottom:0;left:50%;transform:translateX(-50%);font-size:1.2rem;font-weight:bold;color:${color};"
532
+ >
533
+ ${formattedValue}${unit}
534
+ </div>
535
+ </div>
536
+ </div>
537
+ `;
538
+ case 'BULLET':
539
+ const bulletPercentage = Math.min(((kpiValue - minValue) / (maxValue - minValue)) * 100, 100);
540
+ const targetPercentage = Math.min(((targetValue - minValue) / (maxValue - minValue)) * 100, 100);
541
+ return html `
542
+ <div style="margin:16px 0;">
543
+ <div style="background:#e0e0e0;height:30px;border-radius:15px;overflow:hidden;position:relative;">
544
+ <div style="background:${color};height:100%;width:${bulletPercentage}%;transition:width 0.3s;"></div>
545
+ <div
546
+ style="position:absolute;top:0;left:${targetPercentage}%;width:2px;height:100%;background:#333;"
547
+ ></div>
548
+ </div>
549
+ <div style="text-align:center;margin-top:8px;font-weight:bold;color:${color};font-size:1.2rem;">
550
+ ${formattedValue}${unit}
551
+ </div>
552
+ </div>
553
+ `;
554
+ case 'TEXT':
555
+ return html `
556
+ <div style="text-align:center;margin:16px 0;">
557
+ <div style="font-size:1.5rem;font-weight:bold;color:${color};">${formattedValue}${unit}</div>
558
+ </div>
559
+ `;
560
+ case 'BADGE':
561
+ return html `
562
+ <div style="text-align:center;margin:16px 0;">
563
+ <span
564
+ style="display:inline-block;padding:8px 16px;background:${color};color:white;border-radius:20px;font-size:1.2rem;font-weight:bold;"
565
+ >${formattedValue}${unit}</span
566
+ >
567
+ </div>
568
+ `;
569
+ default: // CARD, BAR, LINE, PIE, DONUT, RADAR, TABLE
570
+ return html ` <div class="kpi-value">${formattedValue}${unit}</div> `;
571
+ }
572
+ }
573
+ get context() {
574
+ return {
575
+ title: 'KPI 대시보드',
576
+ description: '조직 KPI 실적, 등급, 이력, 시각화 등 KPI 전용 대시보드'
577
+ };
578
+ }
579
+ render() {
580
+ if (this.loading)
581
+ return nothing;
582
+ if (this.error)
583
+ return html `<div>${this.error}</div>`;
584
+ return html `
585
+ <div class="dashboard-root">
586
+ <!-- KPI 통계 차트 — kpiStatistics 를 그린다 -->
587
+ <div class="charts-section">
588
+ <!-- 통계 필터 및 요약 -->
589
+ <div style="margin-bottom: 24px; background: #f8f9fa; padding: 16px; border-radius: 8px;">
590
+ <div style="display: flex; gap: 16px; align-items: center; flex-wrap: wrap;">
591
+ <div style="display: flex; align-items: center; gap: 8px;">
592
+ <label style="font-weight: 500; color: #333;">기간:</label>
593
+ <span style="padding: 6px 12px; background: #e9ecef; border-radius: 4px; color: #495057;">
594
+ MONTH (월별)
595
+ </span>
596
+ </div>
597
+ <div style="display: flex; align-items: center; gap: 8px;">
598
+ <label style="font-weight: 500; color: #333;">날짜:</label>
599
+ <select
600
+ .value=${this.selectedValueDate}
601
+ @change=${this._onValueDateChange}
602
+ style="padding: 6px 12px; border: 1px solid #ddd; border-radius: 4px; background: white;"
603
+ >
604
+ ${this.availableValueDates.map(date => html `<option value="${date}">${date}${date === this.currentMonth ? ' (현재)' : ''}</option>`)}
605
+ </select>
606
+ </div>
607
+ ${this.statisticsSummary
608
+ ? html `
609
+ <div style="display: flex; gap: 16px; margin-left: auto;">
610
+ <span style="color: #666; font-size: 0.9em;">
611
+ <b>KPI:</b> ${this.statisticsSummary.totalKpis}개
612
+ </span>
613
+ <span style="color: #666; font-size: 0.9em;">
614
+ <b>카테고리:</b> ${this.statisticsSummary.totalCategories}개
615
+ </span>
616
+ <span style="color: #666; font-size: 0.9em;">
617
+ <b>평균:</b> ${this.statisticsSummary.avgMean}
618
+ </span>
619
+ <span style="color: #666; font-size: 0.9em;">
620
+ <b>중앙값:</b> ${this.statisticsSummary.avgMedian}
621
+ </span>
622
+ <span style="color: #666; font-size: 0.9em;">
623
+ <b>표준편차:</b> ${this.statisticsSummary.avgStdDev}
624
+ </span>
625
+ </div>
626
+ `
627
+ : nothing}
628
+ </div>
629
+ </div>
630
+
631
+ <div class="chart-card">
632
+ <div class="chart-title">실제 KPI 통계 비교 (Radar)</div>
633
+ <div class="chart-container">
634
+ ${this.statisticsLoading
635
+ ? html `<div style="display:flex;align-items:center;justify-content:center;height:100%;color:#666;">
636
+ 통계 데이터 로딩 중...
637
+ </div>`
638
+ : this.realKpiRadarData.length > 0
639
+ ? html `<kpi-radar-chart
640
+ .data=${this.realKpiRadarData}
641
+ .categories=${this.realKpiRadarCategories}
642
+ .currentGroup=${'평균'}
643
+ ></kpi-radar-chart>`
644
+ : html `<div style="display:flex;align-items:center;justify-content:center;height:100%;color:#666;">
645
+ 선택된 기간에 통계 데이터가 없습니다.
646
+ </div>`}
647
+ </div>
648
+ <div style="margin-top:12px;color:#666;font-size:0.98em;">
649
+ ※ <b>실제 KPI 통계 Radar 차트</b>는 실제 KPIStatistic 데이터를 기반으로 각 카테고리별 평균, 중앙값,
650
+ 표준편차를 비교합니다.<br />
651
+ <b>평균</b>은 산술평균, <b>중앙값</b>은 50분위수, <b>표준편차</b>는 데이터 분산 정도를 나타냅니다.
652
+ </div>
653
+ </div>
654
+ <div class="chart-card">
655
+ <div class="chart-title">실제 KPI 통계 분포 (Boxplot)</div>
656
+ <div class="chart-container">
657
+ ${this.statisticsLoading
658
+ ? html `<div style="display:flex;align-items:center;justify-content:center;height:100%;color:#666;">
659
+ 통계 데이터 로딩 중...
660
+ </div>`
661
+ : this.realKpiBoxplotData.length > 0
662
+ ? html `<kpi-boxplot-chart
663
+ .data=${this.realKpiBoxplotData}
664
+ .groups=${this.realKpiBoxplotGroups}
665
+ .currentGroup=${'평균'}
666
+ ></kpi-boxplot-chart>`
667
+ : html `<div style="display:flex;align-items:center;justify-content:center;height:100%;color:#666;">
668
+ 선택된 기간에 통계 데이터가 없습니다.
669
+ </div>`}
670
+ </div>
671
+ <div style="margin-top:12px;color:#666;font-size:0.98em;">
672
+ ※ <b>실제 KPI 통계 Boxplot</b>은 실제 KPIStatistic 데이터를 기반으로 각 카테고리별 통계값의 분포를
673
+ 보여줍니다.<br />
674
+ 각 카테고리의 <b>평균값들</b>을 기준으로 분포를 계산하여, 카테고리 간 통계적 특성을 비교할 수 있습니다.
675
+ </div>
676
+ </div>
677
+ </div>
678
+
679
+ <!-- 3레벨 KPI 플로팅 섹션 -->
680
+ <div class="charts-section">
681
+ <div style="margin-bottom: 24px;">
682
+ <h2 style="font-size: 1.5rem; font-weight: bold; color: #333; text-align: center; margin-bottom: 8px;">
683
+ 3레벨 KPI 분석
684
+ </h2>
685
+ <p style="text-align: center; color: #666; font-size: 0.95rem;">
686
+ 실제 KPIStatistic 데이터를 기반으로 한 다층적 분석
687
+ </p>
688
+ </div>
689
+
690
+ <!-- 1레벨: 그룹 총 스코어 -->
691
+ <div style="margin-bottom: 32px;">
692
+ <h3 style="font-size: 1.2rem; font-weight: 600; color: #495057; margin-bottom: 16px;">
693
+ 📊 1레벨: 그룹 총 스코어
694
+ </h3>
695
+ <kpi-level1-card></kpi-level1-card>
696
+ </div>
697
+
698
+ <!-- 2레벨: 카테고리 비교 -->
699
+ <div style="margin-bottom: 32px;">
700
+ <h3 style="font-size: 1.2rem; font-weight: 600; color: #495057; margin-bottom: 16px;">
701
+ 📈 2레벨: 카테고리 비교 분석
702
+ </h3>
703
+ <kpi-level2-comparison></kpi-level2-comparison>
704
+ </div>
705
+
706
+ <!-- 3레벨: 개별 KPI 비교 -->
707
+ <div style="margin-bottom: 32px;">
708
+ <h3 style="font-size: 1.2rem; font-weight: 600; color: #495057; margin-bottom: 16px;">
709
+ 🔍 3레벨: 개별 KPI 상세 분석
710
+ </h3>
711
+ <kpi-level3-comparison></kpi-level3-comparison>
712
+ </div>
713
+ </div>
714
+ ${this.showHistoryModal
715
+ ? html `
716
+ <div
717
+ style="position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0,0,0,0.25);z-index:1000;display:flex;align-items:center;justify-content:center;"
718
+ >
719
+ <div
720
+ style="background:#fff;padding:32px 40px;border-radius:16px;min-width:340px;max-width:90vw;max-height:80vh;overflow:auto;box-shadow:0 4px 24px rgba(0,0,0,0.15);"
721
+ >
722
+ <div style="font-size:1.2rem;font-weight:bold;margin-bottom:16px;">
723
+ ${this.modalKpiName} 변경 이력
724
+ </div>
725
+ <ul style="padding:0;list-style:none;">
726
+ ${this.modalHistories.length === 0
727
+ ? html `<li style="color:#bbb;">이력이 없습니다.</li>`
728
+ : this.modalHistories.map(h => html `<li style="margin-bottom:8px;">
729
+ v${h.version} (${h.updatedAt?.slice(0, 10) ?? ''} ${h.updater?.name ?? ''})
730
+ </li>`)}
731
+ </ul>
732
+ <button style="margin-top:16px;padding:6px 18px;" @click=${() => this.closeHistoryModal()}>
733
+ 닫기
734
+ </button>
735
+ </div>
736
+ </div>
737
+ `
738
+ : nothing}
739
+ ${this.categories.map(cat => html `
740
+ <div class="category-section">
741
+ <div class="category-title">${cat.name}</div>
742
+ <div class="kpi-cards">
743
+ ${(cat.kpis || []).map(kpi => html `
744
+ <div class="kpi-card">
745
+ <div class="kpi-name">${kpi.name}</div>
746
+ ${this._renderKpiValue(kpi)}
747
+ <div class="kpi-target">목표: ${kpi.targetValue ?? '-'}${kpi.unit ?? ''}</div>
748
+ <!-- 등급 시각화 -->
749
+ <div style="margin-top:8px;">
750
+ <b>등급:</b>
751
+ ${(() => {
752
+ const grades = kpi.grades || [];
753
+ const kpiValue = kpi.value?.value;
754
+ if (grades.length > 5) {
755
+ // 5개를 넘으면 현재 값에 해당하는 grade만 표시
756
+ const currentGrade = grades.find(g => kpiValue >= g.minValue && kpiValue <= g.maxValue);
757
+ if (currentGrade) {
758
+ return html `<span
759
+ style="display:inline-block;margin-right:8px;padding:4px 12px;border-radius:12px;background:${currentGrade.color ??
760
+ '#3a3ad6'};color:white;font-size:1em;font-weight:bold;box-shadow:0 2px 8px rgba(58,58,214,0.3);border:2px solid ${currentGrade.color ??
761
+ '#3a3ad6'};"
762
+ >${currentGrade.name}(${currentGrade.minValue}~${currentGrade.maxValue}${kpi.unit ??
763
+ ''},
764
+ ${currentGrade.score ?? ''}점)</span
765
+ >`;
766
+ }
767
+ else {
768
+ return html `<span style="color:#bbb;font-size:0.95em;">등급 없음</span>`;
769
+ }
770
+ }
771
+ else {
772
+ // 5개 이하면 전체 리스트 표시하되 현재 등급은 강조
773
+ return grades.map(g => {
774
+ const isCurrentGrade = kpiValue >= g.minValue && kpiValue <= g.maxValue;
775
+ return html `<span
776
+ style="display:inline-block;margin-right:8px;padding:${isCurrentGrade
777
+ ? '4px 12px'
778
+ : '2px 8px'};border-radius:${isCurrentGrade
779
+ ? '12px'
780
+ : '8px'};background:${isCurrentGrade
781
+ ? (g.color ?? '#3a3ad6')
782
+ : (g.color ?? '#eee')};color:${isCurrentGrade
783
+ ? 'white'
784
+ : '#222'};font-size:${isCurrentGrade ? '1em' : '0.95em'};font-weight:${isCurrentGrade
785
+ ? 'bold'
786
+ : 'normal'};box-shadow:${isCurrentGrade
787
+ ? '0 2px 8px rgba(58,58,214,0.3)'
788
+ : 'none'};border:${isCurrentGrade ? `2px solid ${g.color ?? '#3a3ad6'}` : 'none'};"
789
+ >${g.name}(${g.minValue}~${g.maxValue}${kpi.unit ?? ''}, ${g.score ?? ''}점)</span
790
+ >`;
791
+ });
792
+ }
793
+ })()}
794
+ </div>
795
+ <!-- 최근 변경 이력(1건만) -->
796
+ <div style="margin-top:8px;font-size:0.95em;color:#888;">
797
+ <b>최근 변경:</b>
798
+ ${kpi.histories && kpi.histories.length > 0
799
+ ? html `<span style="margin-right:8px;"
800
+ >v${kpi.histories[0].version} (${kpi.histories[0].updatedAt?.slice(0, 10) ?? ''}
801
+ ${kpi.histories[0].updater?.name ?? ''})</span
802
+ >`
803
+ : html `<span style="color:#bbb">없음</span>`}
804
+ <button
805
+ style="margin-left:8px;font-size:0.95em;padding:2px 8px;"
806
+ @click=${() => this.openHistoryModal(kpi)}
807
+ >
808
+ 더보기
809
+ </button>
810
+ </div>
811
+ <!-- 경고/알림 -->
812
+ <div style="margin-top:8px;">
813
+ ${this.alerts.filter(a => a.kpi?.id === kpi.id).length > 0
814
+ ? this.alerts
815
+ .filter(a => a.kpi?.id === kpi.id)
816
+ .map(a => html `<span
817
+ style="display:inline-block;margin-right:8px;padding:2px 8px;border-radius:8px;background:${a.level ===
818
+ 'critical'
819
+ ? '#ffb3b3'
820
+ : a.level === 'warning'
821
+ ? '#ffe082'
822
+ : '#e0e0e0'};color:#b71c1c;font-size:0.95em;"
823
+ >${a.message}</span
824
+ >`)
825
+ : html `<span style="color:#4caf50;font-size:0.95em;">이상/경고 없음</span>`}
826
+ </div>
827
+ </div>
828
+ `)}
829
+ </div>
830
+ </div>
831
+ `)}
832
+ </div>
833
+ `;
834
+ }
835
+ };
836
+ __decorate([
837
+ state(),
838
+ __metadata("design:type", Array)
839
+ ], KpiDashboardPage.prototype, "categories", void 0);
840
+ __decorate([
841
+ state(),
842
+ __metadata("design:type", Object)
843
+ ], KpiDashboardPage.prototype, "loading", void 0);
844
+ __decorate([
845
+ state(),
846
+ __metadata("design:type", Object)
847
+ ], KpiDashboardPage.prototype, "error", void 0);
848
+ __decorate([
849
+ state(),
850
+ __metadata("design:type", Array)
851
+ ], KpiDashboardPage.prototype, "alerts", void 0);
852
+ __decorate([
853
+ state(),
854
+ __metadata("design:type", Boolean)
855
+ ], KpiDashboardPage.prototype, "showHistoryModal", void 0);
856
+ __decorate([
857
+ state(),
858
+ __metadata("design:type", Array)
859
+ ], KpiDashboardPage.prototype, "modalHistories", void 0);
860
+ __decorate([
861
+ state(),
862
+ __metadata("design:type", String)
863
+ ], KpiDashboardPage.prototype, "modalKpiName", void 0);
864
+ __decorate([
865
+ state(),
866
+ __metadata("design:type", Array)
867
+ ], KpiDashboardPage.prototype, "kpiStatistics", void 0);
868
+ __decorate([
869
+ state(),
870
+ __metadata("design:type", Object)
871
+ ], KpiDashboardPage.prototype, "statisticsLoading", void 0);
872
+ __decorate([
873
+ state(),
874
+ __metadata("design:type", String)
875
+ ], KpiDashboardPage.prototype, "selectedPeriodType", void 0);
876
+ __decorate([
877
+ state(),
878
+ __metadata("design:type", String)
879
+ ], KpiDashboardPage.prototype, "selectedValueDate", void 0);
880
+ KpiDashboardPage = __decorate([
881
+ customElement('kpi-dashboard')
882
+ ], KpiDashboardPage);
883
+ export { KpiDashboardPage };
884
+ //# sourceMappingURL=kpi-dashboard.js.map