@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,678 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/icon/icon.js';
3
+ import '@material/web/button/elevated-button.js';
4
+ import '@material/web/textfield/outlined-text-field.js';
5
+ import { CommonButtonStyles, CommonHeaderStyles, ScrollbarStyles } from '@operato/styles';
6
+ import { PageView } from '@operato/shell';
7
+ import { css, html } from 'lit';
8
+ import { customElement, property, state } from 'lit/decorators.js';
9
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements';
10
+ import { client } from '@operato/graphql';
11
+ import { i18next, localize } from '@operato/i18n';
12
+ import { notify } from '@operato/layout';
13
+ import gql from 'graphql-tag';
14
+ let KpiMetricValueEditorPage = class KpiMetricValueEditorPage extends localize(i18next)(ScopedElementsMixin(PageView)) {
15
+ constructor() {
16
+ super(...arguments);
17
+ this.org = '';
18
+ this.startDate = '';
19
+ this.endDate = '';
20
+ this.metrics = [];
21
+ this.dates = [];
22
+ this.loading = false;
23
+ this.error = '';
24
+ this.editingCell = null;
25
+ this._existingValues = [];
26
+ }
27
+ static { this.styles = [
28
+ CommonHeaderStyles,
29
+ ScrollbarStyles,
30
+ css `
31
+ :host { display: flex;
32
+ flex-direction: column;
33
+ padding: 20px;
34
+ overflow-x: auto;
35
+ }
36
+
37
+ .header { display: flex;
38
+ gap: 16px;
39
+ align-items: center;
40
+ margin-bottom: 20px;
41
+ padding: 16px;
42
+ background: var(--md-sys-color-surface-container);
43
+ border-radius: 8px;
44
+ }
45
+
46
+ .controls { display: flex;
47
+ gap: 12px;
48
+ align-items: center;
49
+ }
50
+
51
+ .table-container { flex: 1;
52
+ overflow: auto;
53
+ border: 1px solid var(--md-sys-color-outline);
54
+ border-radius: 8px;
55
+ }
56
+
57
+ table { width: 100%;
58
+ border-collapse: collapse;
59
+ min-width: max-content;
60
+ }
61
+
62
+ th { background: var(--md-sys-color-surface-container-low);
63
+ font-weight: 500;
64
+ padding: 8px 12px;
65
+ border: 1px solid var(--md-sys-color-outline-variant);
66
+ min-width: 80px;
67
+ height: 120px;
68
+ vertical-align: middle;
69
+ }
70
+
71
+ td { padding: 8px 12px;
72
+ border: 1px solid var(--md-sys-color-outline-variant);
73
+ min-width: 80px;
74
+ height: 60px;
75
+ text-align: right;
76
+ vertical-align: middle;
77
+ }
78
+
79
+ .metric-header { position: sticky;
80
+ left: 0;
81
+ top: 0;
82
+ z-index: 3;
83
+ }
84
+
85
+ .metric-name { position: sticky;
86
+ left: 0;
87
+ background: var(--md-sys-color-surface);
88
+ font-weight: 500;
89
+ min-width: 200px;
90
+ text-align: left;
91
+ z-index: 2;
92
+ }
93
+
94
+ tr:hover { background: var(--md-sys-color-surface-container-high);
95
+ }
96
+
97
+ th.date-header { position: sticky;
98
+ top: 0;
99
+ z-index: 2;
100
+ text-align: center;
101
+ font-size: 11px;
102
+ color: var(--md-sys-color-on-surface-variant);
103
+ writing-mode: vertical-rl;
104
+ text-orientation: mixed;
105
+ min-height: 120px;
106
+ display: flex;
107
+ align-items: center;
108
+ justify-content: center;
109
+ }
110
+
111
+ td.editable-cell { cursor: pointer;
112
+ background: var(--md-sys-color-primary-container);
113
+ color: var(--md-sys-color-on-primary-container);
114
+ }
115
+
116
+ td.editable-cell:hover { background: var(--md-sys-color-primary-container);
117
+ }
118
+
119
+ td.highlighted-cell { background: var(--md-sys-color-secondary-container);
120
+ color: var(--md-sys-color-on-secondary-container);
121
+ font-weight: 500;
122
+ }
123
+
124
+ td.highlighted-cell:hover { background: var(--md-sys-color-secondary-container);
125
+ }
126
+
127
+ td.disabled-cell { background: var(--md-sys-color-surface-container);
128
+ color: var(--md-sys-color-on-surface-variant);
129
+ cursor: not-allowed;
130
+ }
131
+
132
+ .value-input { width: 100%;
133
+ text-align: center;
134
+ border: none;
135
+ background: transparent;
136
+ color: inherit;
137
+ font-size: 12px;
138
+ padding: 2px;
139
+ }
140
+
141
+ .value-input:focus { outline: 2px solid var(--md-sys-color-primary);
142
+ border-radius: 4px;
143
+ }
144
+
145
+ .period-type-badge { font-size: 10px;
146
+ padding: 2px 6px;
147
+ border-radius: 4px;
148
+ background: var(--md-sys-color-tertiary-container);
149
+ color: var(--md-sys-color-on-tertiary-container);
150
+ margin-left: 8px;
151
+ }
152
+
153
+ .loading { display: flex;
154
+ justify-content: center;
155
+ align-items: center;
156
+ height: 200px;
157
+ color: var(--md-sys-color-on-surface-variant);
158
+ }
159
+
160
+ .error { color: var(--md-sys-color-error);
161
+ padding: 16px;
162
+ text-align: center;
163
+ }
164
+
165
+ .legend { display: flex;
166
+ gap: 16px;
167
+ margin-top: 16px;
168
+ font-size: 12px;
169
+ }
170
+
171
+ .legend-item { display: flex;
172
+ align-items: center;
173
+ gap: 4px;
174
+ }
175
+
176
+ .legend-color { width: 16px;
177
+ height: 16px;
178
+ border-radius: 2px;
179
+ }
180
+ `
181
+ ]; }
182
+ get context() {
183
+ return { title: i18next.t('title.kpi metric value editor'),
184
+ actions: [
185
+ { title: i18next.t('button.save'),
186
+ action: this._saveValues.bind(this),
187
+ ...CommonButtonStyles.save
188
+ },
189
+ { title: i18next.t('button.cancel'),
190
+ action: this._cancel.bind(this),
191
+ ...CommonButtonStyles.cancel
192
+ }
193
+ ]
194
+ };
195
+ }
196
+ render() {
197
+ if (this.loading) {
198
+ return html `
199
+ <div class="loading">
200
+ <md-icon>hourglass_empty</md-icon>
201
+ <span>데이터를 불러오는 중...</span>
202
+ </div>
203
+ `;
204
+ }
205
+ if (this.error) {
206
+ return html `
207
+ <div class="error">
208
+ <md-icon>error</md-icon>
209
+ <span>${this.error}</span>
210
+ </div>
211
+ `;
212
+ }
213
+ return html `
214
+ <div class="header">
215
+ <div class="controls">
216
+ <md-outlined-text-field
217
+ label="그룹"
218
+ .value=${this.org}
219
+ @input=${(e) => (this.org = e.target.value)}
220
+ style="width: 150px;"
221
+ ></md-outlined-text-field>
222
+
223
+ <md-outlined-text-field
224
+ label="시작일"
225
+ type="date"
226
+ .value=${this.startDate}
227
+ @input=${(e) => (this.startDate = e.target.value)}
228
+ style="width: 150px;"
229
+ ></md-outlined-text-field>
230
+
231
+ <md-outlined-text-field
232
+ label="종료일"
233
+ type="date"
234
+ .value=${this.endDate}
235
+ @input=${(e) => (this.endDate = e.target.value)}
236
+ style="width: 150px;"
237
+ ></md-outlined-text-field>
238
+
239
+ <md-elevated-button @click=${this._loadData}>
240
+ <md-icon slot="icon">refresh</md-icon>
241
+ 새로고침
242
+ </md-elevated-button>
243
+ </div>
244
+ </div>
245
+
246
+ <div class="table-container">
247
+ <table style="border-collapse: collapse; width: 100%;">
248
+ <thead>
249
+ <tr>
250
+ <th
251
+ style="border: 1px solid #ccc; padding: 8px; background: #f5f5f5; min-width: 200px; left: 0; top: 0;"
252
+ class="metric-header"
253
+ >
254
+ Metric명
255
+ </th>
256
+ ${this.dates.map(date => html `
257
+ <th
258
+ style="border: 1px solid #ccc; padding: 8px; background: #f5f5f5; min-width: 80px; position: sticky; top: 0;"
259
+ >
260
+ ${this._formatDate(date)}
261
+ </th>
262
+ `)}
263
+ </tr>
264
+ </thead>
265
+ <tbody>
266
+ ${this.metrics.map(metric => html `
267
+ <tr>
268
+ <td
269
+ style="border: 1px solid #ccc; padding: 8px; background: #fff; min-width: 200px;"
270
+ class="metric-name"
271
+ >
272
+ ${metric.metricName}
273
+ <span
274
+ style="font-size: 10px; padding: 2px 6px; background: #e0e0e0; border-radius: 4px; margin-left: 8px;"
275
+ >${metric.periodType}</span
276
+ >
277
+ </td>
278
+ ${this.dates.map(date => html `
279
+ <td
280
+ style="border: 1px solid #ccc; padding: 8px; background: #e3f2fd; text-align: center; min-width: 80px; cursor: pointer;"
281
+ @click=${() => this._startEdit(metric.metricId, date)}
282
+ >
283
+ ${this._renderCellContent(metric, date)}
284
+ </td>
285
+ `)}
286
+ </tr>
287
+ `)}
288
+ </tbody>
289
+ </table>
290
+ </div>
291
+
292
+ <div class="legend">
293
+ <div class="legend-item">
294
+ <div class="legend-color" style="background: var(--md-sys-color-primary-container);"></div>
295
+ <span>편집 가능</span>
296
+ </div>
297
+ <div class="legend-item">
298
+ <div class="legend-color" style="background: var(--md-sys-color-secondary-container);"></div>
299
+ <span>하이라이트 (PeriodType에 따라)</span>
300
+ </div>
301
+ <div class="legend-item">
302
+ <div class="legend-color" style="background: var(--md-sys-color-surface-container);"></div>
303
+ <span>편집 불가</span>
304
+ </div>
305
+ </div>
306
+ `;
307
+ }
308
+ _renderCellContent(metric, date) {
309
+ const isEditing = this.editingCell?.metricId === metric.metricId && this.editingCell?.date === date;
310
+ // periodType에 따라 값을 가져오는 방식 결정
311
+ let value = null;
312
+ if (metric.periodType === 'DAY') { // DAY인 경우 해당 날짜의 값을 사용
313
+ value = metric.values[date]?.value;
314
+ }
315
+ else if (metric.periodType === 'WEEK') { // WEEK인 경우 해당 주의 월요일의 값을 사용
316
+ const weekKey = this._getWeekKey(date);
317
+ value = metric.values[weekKey]?.value;
318
+ }
319
+ else if (metric.periodType === 'MONTH') { // MONTH인 경우 해당 월의 값을 사용
320
+ const monthKey = this._getMonthKey(date);
321
+ value = metric.values[monthKey]?.value;
322
+ }
323
+ else if (metric.periodType === 'QUARTER') { // QUARTER인 경우 해당 분기의 값을 사용
324
+ const quarterKey = this._getQuarterKey(date);
325
+ value = metric.values[quarterKey]?.value;
326
+ }
327
+ else if (metric.periodType === 'YEAR') { // YEAR인 경우 해당 연도의 값을 사용
328
+ const yearKey = this._getYearKey(date);
329
+ value = metric.values[yearKey]?.value;
330
+ }
331
+ else { // 기본값: DAY와 동일
332
+ value = metric.values[date]?.value;
333
+ }
334
+ if (isEditing) {
335
+ console.log('Rendering input for editing, value:', value);
336
+ return html `
337
+ <input
338
+ type="number"
339
+ step="0.01"
340
+ .value=${(value || '').toString()}
341
+ @blur=${(e) => this._finishEdit(metric.metricId, date, parseFloat(e.target.value) || 0)}
342
+ @keydown=${(e) => e.key === 'Enter' && e.target.blur()}
343
+ style="width: 100%; text-align: center; border: none; background: transparent;"
344
+ autofocus
345
+ />
346
+ `;
347
+ }
348
+ return html `
349
+ <div style="display: flex; flex-direction: column; gap: 2px;">
350
+ <span style="font-weight: 500; color: ${value !== null && value !== undefined ? 'inherit' : '#999'};">
351
+ ${value !== null && value !== undefined ? value.toLocaleString() : '클릭하여 입력'}
352
+ </span>
353
+ </div>
354
+ `;
355
+ }
356
+ _formatDate(date) {
357
+ const d = new Date(date);
358
+ return d.toLocaleDateString('ko-KR', { month: 'numeric', day: 'numeric' });
359
+ }
360
+ _startEdit(metricId, date) {
361
+ this.editingCell = { metricId, date };
362
+ }
363
+ _finishEdit(metricId, date, value) {
364
+ const metric = this.metrics.find(m => m.metricId === metricId);
365
+ if (metric) { // periodType에 따라 저장할 키 결정
366
+ let storageKey = date;
367
+ if (metric.periodType === 'WEEK') {
368
+ storageKey = this._getWeekKey(date);
369
+ }
370
+ else if (metric.periodType === 'MONTH') {
371
+ storageKey = this._getMonthKey(date);
372
+ }
373
+ else if (metric.periodType === 'QUARTER') {
374
+ storageKey = this._getQuarterKey(date);
375
+ }
376
+ else if (metric.periodType === 'YEAR') {
377
+ storageKey = this._getYearKey(date);
378
+ }
379
+ if (!metric.values[storageKey]) {
380
+ metric.values[storageKey] = { value: 0, isDirty: false };
381
+ }
382
+ // 값이 변경되었는지 확인
383
+ const originalValue = this._findExistingValue(metricId, storageKey)?.value;
384
+ const isChanged = originalValue !== value;
385
+ metric.values[storageKey].value = value;
386
+ metric.values[storageKey].isDirty = isChanged;
387
+ }
388
+ this.editingCell = null;
389
+ }
390
+ async _loadData() {
391
+ if (!this.startDate || !this.endDate) {
392
+ this.error = '시작일, 종료일을 모두 입력해주세요.';
393
+ return;
394
+ }
395
+ this.loading = true;
396
+ this.error = '';
397
+ try { // KPI Metric 목록 조회
398
+ const metricsResponse = await client.query({ query: gql `
399
+ query ($filters: [Filter!]) { kpiMetrics(filters: $filters) { items { id
400
+ name
401
+ periodType
402
+ active
403
+ }
404
+ total
405
+ }
406
+ }
407
+ `,
408
+ variables: { filters: [{ name: 'active', operator: 'eq', value: true }]
409
+ }
410
+ });
411
+ // KPI Metric Value 데이터 조회
412
+ const valuesResponse = await client.query({ query: gql `
413
+ query ($filters: [Filter!]) { kpiMetricValues(filters: $filters) { items { id
414
+ metricId
415
+ valueDate
416
+ value
417
+ org
418
+ }
419
+ total
420
+ }
421
+ }
422
+ `,
423
+ variables: { filters: [
424
+ ...(this.org ? [{ name: 'org', operator: 'eq', value: this.org }] : []),
425
+ { name: 'valueDate', operator: 'between', value: [this.startDate, this.endDate] }
426
+ ]
427
+ }
428
+ });
429
+ // 날짜 배열 생성
430
+ this.dates = this._generateDateArray(this.startDate, this.endDate);
431
+ // KPI Metric 목록을 기준으로 데이터 구성
432
+ this.metrics = metricsResponse.data.kpiMetrics.items.map((metric) => ({ metricId: metric.id,
433
+ metricName: metric.name,
434
+ periodType: metric.periodType,
435
+ values: {}
436
+ }));
437
+ // 기존 KPI Metric Value 데이터 저장
438
+ this._existingValues = valuesResponse.data.kpiMetricValues.items;
439
+ // KPI Metric Value 데이터를 해당 Metric에 매핑
440
+ valuesResponse.data.kpiMetricValues.items.forEach((value) => {
441
+ const metric = this.metrics.find(m => m.metricId === value.metricId);
442
+ if (metric) {
443
+ metric.values[value.valueDate] = { value: value.value,
444
+ isDirty: false
445
+ };
446
+ }
447
+ });
448
+ // KPI Metric Value가 없는 Metric도 빈 값으로 초기화
449
+ this.metrics.forEach(metric => {
450
+ this.dates.forEach(date => {
451
+ if (!metric.values[date]) {
452
+ metric.values[date] = { value: null, isDirty: false };
453
+ }
454
+ });
455
+ });
456
+ this.requestUpdate();
457
+ }
458
+ catch (error) {
459
+ console.error('데이터 로드 중 오류:', error);
460
+ this.error = '데이터를 불러오는 중 오류가 발생했습니다.';
461
+ }
462
+ finally {
463
+ this.loading = false;
464
+ }
465
+ }
466
+ _generateDateArray(startDate, endDate) {
467
+ const dates = [];
468
+ const start = new Date(startDate);
469
+ const end = new Date(endDate);
470
+ // 일별로 생성 (기본)
471
+ for (let d = new Date(start); d <= end; d.setDate(d.getDate() + 1)) {
472
+ dates.push(d.toLocaleDateString('sv-SE'));
473
+ }
474
+ return dates;
475
+ }
476
+ async _saveValues() {
477
+ try {
478
+ const patches = [];
479
+ this.metrics.forEach(metric => {
480
+ Object.entries(metric.values).forEach(([date, data]) => {
481
+ if (data.isDirty && data.value !== null && data.value !== undefined) {
482
+ const existingValue = this._findExistingValue(metric.metricId, date);
483
+ if (existingValue) {
484
+ patches.push({ id: existingValue.id,
485
+ value: data.value,
486
+ org: this.org,
487
+ cuFlag: 'M'
488
+ });
489
+ }
490
+ else {
491
+ console.log('Creating new value for metric:', metric.metricName, 'periodType:', metric.periodType, 'date:', date);
492
+ const normalizedDate = this._normalizeDateByPeriodType(date, metric.periodType);
493
+ console.log('Normalized date:', normalizedDate);
494
+ patches.push({ metricId: metric.metricId,
495
+ valueDate: normalizedDate,
496
+ value: data.value,
497
+ org: this.org,
498
+ cuFlag: '+'
499
+ });
500
+ }
501
+ }
502
+ });
503
+ });
504
+ if (patches.length === 0) {
505
+ notify({ message: '저장할 데이터가 없습니다.' });
506
+ return;
507
+ }
508
+ // 디버깅: patches 내용 확인
509
+ console.log('Sending patches:', patches);
510
+ // 단일 mutation으로 생성과 업데이트 처리
511
+ const response = await client.mutate({ mutation: gql `
512
+ mutation ($patches: [KpiMetricValuePatch!]!) { updateMultipleKpiMetricValue(patches: $patches) { id
513
+ value
514
+ valueDate
515
+ metricId
516
+ }
517
+ }
518
+ `,
519
+ variables: { patches }
520
+ });
521
+ if (!response.errors) { // 저장 후 dirty 상태 해제
522
+ response.data.updateMultipleKpiMetricValue.forEach((savedValue) => {
523
+ const metric = this.metrics.find(m => m.metricId === savedValue.metricId);
524
+ if (metric && metric.values[savedValue.valueDate]) {
525
+ metric.values[savedValue.valueDate].isDirty = false;
526
+ }
527
+ });
528
+ notify({ message: 'KPI Metric 값이 성공적으로 저장되었습니다.' });
529
+ this.requestUpdate();
530
+ }
531
+ }
532
+ catch (error) {
533
+ console.error('저장 중 오류:', error);
534
+ notify({ message: '저장 중 오류가 발생했습니다.' });
535
+ }
536
+ }
537
+ _findExistingValue(metricId, date) {
538
+ return this._existingValues?.find((v) => v.metricId === metricId && v.valueDate === date);
539
+ }
540
+ _getMonthKey(date) {
541
+ const dateObj = new Date(date);
542
+ return `${dateObj.getFullYear()}-${String(dateObj.getMonth() + 1).padStart(2, '0')}`;
543
+ }
544
+ _getQuarterKey(date) {
545
+ const dateObj = new Date(date);
546
+ const quarter = Math.floor(dateObj.getMonth() / 3) + 1;
547
+ return `${dateObj.getFullYear()}-Q${quarter}`;
548
+ }
549
+ _getYearKey(date) {
550
+ const dateObj = new Date(date);
551
+ return `${dateObj.getFullYear()}`;
552
+ }
553
+ _getWeekKey(date) {
554
+ const dateObj = new Date(date);
555
+ const dayOfWeek = dateObj.getDay();
556
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
557
+ const monday = new Date(dateObj);
558
+ monday.setDate(dateObj.getDate() - daysToMonday);
559
+ return monday.toLocaleDateString('sv-SE');
560
+ }
561
+ _getMondayOfWeek(date) {
562
+ const dateObj = new Date(date);
563
+ const dayOfWeek = dateObj.getDay();
564
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
565
+ const monday = new Date(dateObj);
566
+ monday.setDate(dateObj.getDate() - daysToMonday);
567
+ return monday.toLocaleDateString('sv-SE');
568
+ }
569
+ _getFirstDayOfMonth(date) {
570
+ const dateObj = new Date(date);
571
+ return new Date(dateObj.getFullYear(), dateObj.getMonth(), 1).toLocaleDateString('sv-SE');
572
+ }
573
+ _getFirstDayOfQuarter(date) {
574
+ const dateObj = new Date(date);
575
+ const quarter = Math.floor(dateObj.getMonth() / 3);
576
+ const firstMonthOfQuarter = quarter * 3;
577
+ return new Date(dateObj.getFullYear(), firstMonthOfQuarter, 1).toLocaleDateString('sv-SE');
578
+ }
579
+ _getFirstDayOfYear(date) {
580
+ const dateObj = new Date(date);
581
+ return new Date(dateObj.getFullYear(), 0, 1).toLocaleDateString('sv-SE');
582
+ }
583
+ _normalizeDateByPeriodType(date, periodType) {
584
+ console.log('Normalizing date:', date, 'for periodType:', periodType);
585
+ const dateObj = new Date(date);
586
+ switch (periodType) {
587
+ case 'DAY':
588
+ console.log('DAY - returning original date:', date);
589
+ return date; // 그대로 사용
590
+ case 'WEEK':
591
+ // 해당 주의 월요일로 설정
592
+ const dayOfWeek = dateObj.getDay();
593
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1; // 일요일이면 6일 전, 아니면 dayOfWeek - 1
594
+ const monday = new Date(dateObj);
595
+ monday.setDate(dateObj.getDate() - daysToMonday);
596
+ const weeklyDate = monday.toLocaleDateString('sv-SE');
597
+ console.log('WEEK - returning monday:', weeklyDate);
598
+ return weeklyDate;
599
+ case 'MONTH':
600
+ // 년-월 형식으로 설정 (예: "2025-01")
601
+ const monthlyDate = `${dateObj.getFullYear()}-${String(dateObj.getMonth() + 1).padStart(2, '0')}`;
602
+ console.log('MONTH - returning year-month format:', monthlyDate);
603
+ return monthlyDate;
604
+ case 'QUARTER':
605
+ // 분기 형식으로 설정 (예: "2025-Q1")
606
+ const quarter = Math.floor(dateObj.getMonth() / 3) + 1;
607
+ const quarterlyDate = `${dateObj.getFullYear()}-Q${quarter}`;
608
+ console.log('QUARTER - returning quarter format:', quarterlyDate);
609
+ return quarterlyDate;
610
+ case 'YEAR':
611
+ // 년도 형식으로 설정 (예: "2025")
612
+ const yearlyDate = `${dateObj.getFullYear()}`;
613
+ console.log('YEAR - returning year format:', yearlyDate);
614
+ return yearlyDate;
615
+ default:
616
+ console.log('DEFAULT - returning original date:', date);
617
+ return date; // 기본값
618
+ }
619
+ }
620
+ _cancel() {
621
+ this.editingCell = null;
622
+ this._loadData(); // 원본 데이터로 복원
623
+ }
624
+ async pageInitialized(lifecycle) {
625
+ if (!this.startDate) {
626
+ const today = new Date();
627
+ const oneMonthAgo = new Date(today.getFullYear(), today.getMonth() - 1, today.getDate());
628
+ this.startDate = oneMonthAgo.toLocaleDateString('sv-SE');
629
+ }
630
+ if (!this.endDate) {
631
+ const today = new Date();
632
+ this.endDate = today.toLocaleDateString('sv-SE');
633
+ }
634
+ // 페이지 초기화 시 자동으로 데이터 로드
635
+ await this._loadData();
636
+ }
637
+ };
638
+ __decorate([
639
+ property({ type: String }),
640
+ __metadata("design:type", String)
641
+ ], KpiMetricValueEditorPage.prototype, "org", void 0);
642
+ __decorate([
643
+ property({ type: String }),
644
+ __metadata("design:type", String)
645
+ ], KpiMetricValueEditorPage.prototype, "startDate", void 0);
646
+ __decorate([
647
+ property({ type: String }),
648
+ __metadata("design:type", String)
649
+ ], KpiMetricValueEditorPage.prototype, "endDate", void 0);
650
+ __decorate([
651
+ state(),
652
+ __metadata("design:type", Array)
653
+ ], KpiMetricValueEditorPage.prototype, "metrics", void 0);
654
+ __decorate([
655
+ state(),
656
+ __metadata("design:type", Array)
657
+ ], KpiMetricValueEditorPage.prototype, "dates", void 0);
658
+ __decorate([
659
+ state(),
660
+ __metadata("design:type", Boolean)
661
+ ], KpiMetricValueEditorPage.prototype, "loading", void 0);
662
+ __decorate([
663
+ state(),
664
+ __metadata("design:type", String)
665
+ ], KpiMetricValueEditorPage.prototype, "error", void 0);
666
+ __decorate([
667
+ state(),
668
+ __metadata("design:type", Object)
669
+ ], KpiMetricValueEditorPage.prototype, "editingCell", void 0);
670
+ __decorate([
671
+ state(),
672
+ __metadata("design:type", Array)
673
+ ], KpiMetricValueEditorPage.prototype, "_existingValues", void 0);
674
+ KpiMetricValueEditorPage = __decorate([
675
+ customElement('kpi-metric-value-editor-page')
676
+ ], KpiMetricValueEditorPage);
677
+ export { KpiMetricValueEditorPage };
678
+ //# sourceMappingURL=kpi-metric-value-editor-page.js.map