@things-factory/kpi 10.1.248 → 10.1.250

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