@things-factory/kpi 9.0.31 → 9.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/README.md +1 -2
  2. package/client/charts/kpi-boxplot-chart.ts +182 -42
  3. package/client/charts/kpi-radar-chart.ts +9 -9
  4. package/client/pages/kpi/kpi-list-page.ts +196 -32
  5. package/client/pages/kpi/kpi-overview.ts +9 -11
  6. package/client/pages/kpi/kpi-tree-page.ts +409 -0
  7. package/client/pages/kpi/kpi-view.ts +187 -0
  8. package/client/pages/kpi-dashboard/cards/kpi-level1-card.ts +1 -1
  9. package/client/pages/kpi-dashboard/cards/kpi-level2-comparison.ts +1 -1
  10. package/client/pages/kpi-dashboard/cards/kpi-level3-comparison.ts +1 -1
  11. package/client/pages/kpi-dashboard/components/kpi-left-panel.ts +198 -160
  12. package/client/pages/kpi-dashboard/components/kpi-map-panel.ts +133 -0
  13. package/client/pages/kpi-dashboard/components/kpi-region-popup.ts +3 -2
  14. package/client/pages/kpi-dashboard/kpi-dashboard-map.ts +4 -3
  15. package/client/pages/kpi-dashboard/kpi-dashboard.ts +28 -30
  16. package/client/pages/kpi-history/kpi-history-list-page.ts +11 -11
  17. package/client/pages/kpi-metric/kpi-metric-list-page.ts +10 -2
  18. package/client/pages/kpi-metric-value/kpi-metric-value-editor-page.ts +7 -7
  19. package/client/pages/kpi-metric-value/kpi-metric-value-importer.ts +2 -2
  20. package/client/pages/kpi-metric-value/kpi-metric-value-list-page.ts +16 -8
  21. package/client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.ts +5 -5
  22. package/client/pages/kpi-statistic/kpi-statistic-editor-page.ts +1 -2
  23. package/client/pages/kpi-statistic/kpi-statistic-list-page.ts +10 -2
  24. package/client/pages/kpi-value/kpi-value-editor-page.ts +11 -7
  25. package/client/pages/kpi-value/kpi-value-list-page.ts +31 -7
  26. package/client/route.ts +2 -9
  27. package/design-entities.md +8 -12
  28. package/dist-client/charts/kpi-boxplot-chart.d.ts +2 -0
  29. package/dist-client/charts/kpi-boxplot-chart.js +168 -42
  30. package/dist-client/charts/kpi-boxplot-chart.js.map +1 -1
  31. package/dist-client/charts/kpi-radar-chart.js +9 -9
  32. package/dist-client/charts/kpi-radar-chart.js.map +1 -1
  33. package/dist-client/pages/kpi/kpi-list-page.d.ts +19 -3
  34. package/dist-client/pages/kpi/kpi-list-page.js +188 -32
  35. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  36. package/dist-client/pages/kpi/kpi-overview.js +9 -11
  37. package/dist-client/pages/kpi/kpi-overview.js.map +1 -1
  38. package/dist-client/pages/kpi/kpi-tree-page.d.ts +59 -0
  39. package/dist-client/pages/kpi/kpi-tree-page.js +403 -0
  40. package/dist-client/pages/kpi/kpi-tree-page.js.map +1 -0
  41. package/dist-client/pages/kpi/kpi-view.d.ts +12 -0
  42. package/dist-client/pages/kpi/kpi-view.js +191 -0
  43. package/dist-client/pages/kpi/kpi-view.js.map +1 -0
  44. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js +1 -1
  45. package/dist-client/pages/kpi-dashboard/cards/kpi-level1-card.js.map +1 -1
  46. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js +1 -1
  47. package/dist-client/pages/kpi-dashboard/cards/kpi-level2-comparison.js.map +1 -1
  48. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js +1 -1
  49. package/dist-client/pages/kpi-dashboard/cards/kpi-level3-comparison.js.map +1 -1
  50. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.d.ts +3 -1
  51. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js +197 -161
  52. package/dist-client/pages/kpi-dashboard/components/kpi-left-panel.js.map +1 -1
  53. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.d.ts +5 -0
  54. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js +146 -0
  55. package/dist-client/pages/kpi-dashboard/components/kpi-map-panel.js.map +1 -1
  56. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js +3 -2
  57. package/dist-client/pages/kpi-dashboard/components/kpi-region-popup.js.map +1 -1
  58. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js +4 -3
  59. package/dist-client/pages/kpi-dashboard/kpi-dashboard-map.js.map +1 -1
  60. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +28 -30
  61. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -1
  62. package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +6 -1
  63. package/dist-client/pages/kpi-history/kpi-history-list-page.js +11 -11
  64. package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -1
  65. package/dist-client/pages/kpi-metric/kpi-metric-list-page.d.ts +5 -0
  66. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +10 -2
  67. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  68. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.d.ts +1 -1
  69. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js +8 -8
  70. package/dist-client/pages/kpi-metric-value/kpi-metric-value-editor-page.js.map +1 -1
  71. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js +2 -2
  72. package/dist-client/pages/kpi-metric-value/kpi-metric-value-importer.js.map +1 -1
  73. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.d.ts +5 -0
  74. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js +16 -8
  75. package/dist-client/pages/kpi-metric-value/kpi-metric-value-list-page.js.map +1 -1
  76. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.d.ts +1 -1
  77. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js +6 -6
  78. package/dist-client/pages/kpi-metric-value/kpi-metric-value-manual-entry-form.js.map +1 -1
  79. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js +1 -2
  80. package/dist-client/pages/kpi-statistic/kpi-statistic-editor-page.js.map +1 -1
  81. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.d.ts +5 -0
  82. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js +10 -2
  83. package/dist-client/pages/kpi-statistic/kpi-statistic-list-page.js.map +1 -1
  84. package/dist-client/pages/kpi-value/kpi-value-editor-page.d.ts +2 -1
  85. package/dist-client/pages/kpi-value/kpi-value-editor-page.js +16 -8
  86. package/dist-client/pages/kpi-value/kpi-value-editor-page.js.map +1 -1
  87. package/dist-client/pages/kpi-value/kpi-value-list-page.d.ts +5 -0
  88. package/dist-client/pages/kpi-value/kpi-value-list-page.js +31 -7
  89. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  90. package/dist-client/route.d.ts +1 -1
  91. package/dist-client/route.js +2 -8
  92. package/dist-client/route.js.map +1 -1
  93. package/dist-client/tsconfig.tsbuildinfo +1 -1
  94. package/dist-server/controllers/kpi-metric-value-provider.d.ts +1 -1
  95. package/dist-server/controllers/kpi-metric-value-provider.js +4 -4
  96. package/dist-server/controllers/kpi-metric-value-provider.js.map +1 -1
  97. package/dist-server/controllers/kpi-value-provider.d.ts +1 -1
  98. package/dist-server/controllers/kpi-value-provider.js +3 -3
  99. package/dist-server/controllers/kpi-value-provider.js.map +1 -1
  100. package/dist-server/migrations/1752190849680-seed-kpi-metrics.d.ts +6 -0
  101. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js +101 -0
  102. package/dist-server/migrations/1752190849680-seed-kpi-metrics.js.map +1 -0
  103. package/dist-server/migrations/1752190849681-seed-kpi.d.ts +5 -0
  104. package/dist-server/migrations/1752190849681-seed-kpi.js +315 -0
  105. package/dist-server/migrations/1752190849681-seed-kpi.js.map +1 -0
  106. package/dist-server/migrations/1752192090123-add-grades-to-kpi.d.ts +7 -0
  107. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js +51 -0
  108. package/dist-server/migrations/1752192090123-add-grades-to-kpi.js.map +1 -0
  109. package/dist-server/migrations/1752192090124-add-kpi-statistics.d.ts +5 -0
  110. package/dist-server/migrations/1752192090124-add-kpi-statistics.js +710 -0
  111. package/dist-server/migrations/1752192090124-add-kpi-statistics.js.map +1 -0
  112. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.d.ts +6 -0
  113. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js +111 -0
  114. package/dist-server/migrations/1752192090128-seed-kpi-org-scope.js.map +1 -0
  115. package/dist-server/migrations/1752192090129-seed-kpi-values.d.ts +6 -0
  116. package/dist-server/migrations/1752192090129-seed-kpi-values.js +187 -0
  117. package/dist-server/migrations/1752192090129-seed-kpi-values.js.map +1 -0
  118. package/dist-server/migrations/grade-data/x11-performance-table.json +962 -0
  119. package/dist-server/migrations/grade-data/x12-performance-table.json +611 -0
  120. package/dist-server/migrations/grade-data/x14-performance-table.json +42 -0
  121. package/dist-server/migrations/grade-data/x21-performance-table.json +889 -0
  122. package/dist-server/migrations/grade-data/x22-performance-table.json +1064 -0
  123. package/dist-server/migrations/grade-data/x23-performance-table.json +42 -0
  124. package/dist-server/migrations/grade-data/x31-performance-table.json +644 -0
  125. package/dist-server/migrations/grade-data/x32-performance-table.json +993 -0
  126. package/dist-server/migrations/grade-data/x33-performance-table.json +195 -0
  127. package/dist-server/migrations/grade-data/x34-performance-table.json +12 -0
  128. package/dist-server/migrations/grade-data/x35-performance-table.json +42 -0
  129. package/dist-server/migrations/grade-data/x41-performance-table.json +825 -0
  130. package/dist-server/migrations/grade-data/x42-performance-table.json +786 -0
  131. package/dist-server/migrations/grade-data/x43-performance-table.json +12 -0
  132. package/dist-server/migrations/grade-data/x44-performance-table.json +42 -0
  133. package/dist-server/migrations/grade-data/x51-performance-table.json +924 -0
  134. package/dist-server/migrations/grade-data/x52-performance-table.json +42 -0
  135. package/dist-server/migrations/grade-data/x61-performance-table.json +261 -0
  136. package/dist-server/migrations/grade-data/x62-performance-table.json +42 -0
  137. package/dist-server/migrations/seed-data/kpi-metrics-seed.json +454 -0
  138. package/dist-server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
  139. package/dist-server/migrations/seed-data/kpi-values-seed.json +402 -0
  140. package/dist-server/migrations/seed-data/kpis-seed.json +488 -0
  141. package/dist-server/service/index.d.ts +3 -7
  142. package/dist-server/service/index.js +5 -12
  143. package/dist-server/service/index.js.map +1 -1
  144. package/dist-server/service/kpi/aggregate-kpi.js +30 -13
  145. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -1
  146. package/dist-server/service/kpi/kpi-formula.service.d.ts +15 -0
  147. package/dist-server/service/kpi/kpi-formula.service.js +90 -0
  148. package/dist-server/service/kpi/kpi-formula.service.js.map +1 -1
  149. package/dist-server/service/kpi/kpi-history.d.ts +0 -3
  150. package/dist-server/service/kpi/kpi-history.js +0 -10
  151. package/dist-server/service/kpi/kpi-history.js.map +1 -1
  152. package/dist-server/service/kpi/kpi-mutation.d.ts +1 -1
  153. package/dist-server/service/kpi/kpi-mutation.js +57 -20
  154. package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
  155. package/dist-server/service/kpi/kpi-query.d.ts +7 -3
  156. package/dist-server/service/kpi/kpi-query.js +126 -10
  157. package/dist-server/service/kpi/kpi-query.js.map +1 -1
  158. package/dist-server/service/kpi/kpi-type.d.ts +4 -2
  159. package/dist-server/service/kpi/kpi-type.js +12 -4
  160. package/dist-server/service/kpi/kpi-type.js.map +1 -1
  161. package/dist-server/service/kpi/kpi.d.ts +4 -3
  162. package/dist-server/service/kpi/kpi.js +20 -8
  163. package/dist-server/service/kpi/kpi.js.map +1 -1
  164. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +46 -11
  165. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -1
  166. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.d.ts +1 -1
  167. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js +6 -6
  168. package/dist-server/service/kpi-metric-value/kpi-metric-value-mutation.js.map +1 -1
  169. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.d.ts +2 -2
  170. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js +4 -4
  171. package/dist-server/service/kpi-metric-value/kpi-metric-value-type.js.map +1 -1
  172. package/dist-server/service/kpi-metric-value/kpi-metric-value.d.ts +1 -1
  173. package/dist-server/service/kpi-metric-value/kpi-metric-value.js +3 -3
  174. package/dist-server/service/kpi-metric-value/kpi-metric-value.js.map +1 -1
  175. package/dist-server/service/kpi-org-scope/index.d.ts +9 -0
  176. package/dist-server/service/kpi-org-scope/index.js +14 -0
  177. package/dist-server/service/kpi-org-scope/index.js.map +1 -0
  178. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.d.ts +8 -0
  179. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js +170 -0
  180. package/dist-server/service/kpi-org-scope/kpi-org-scope-mutation.js.map +1 -0
  181. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.d.ts +14 -0
  182. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js +152 -0
  183. package/dist-server/service/kpi-org-scope/kpi-org-scope-query.js.map +1 -0
  184. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.d.ts +26 -0
  185. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js +101 -0
  186. package/dist-server/service/kpi-org-scope/kpi-org-scope-type.js.map +1 -0
  187. package/dist-server/service/kpi-org-scope/kpi-org-scope.d.ts +26 -0
  188. package/dist-server/service/kpi-org-scope/kpi-org-scope.js +135 -0
  189. package/dist-server/service/kpi-org-scope/kpi-org-scope.js.map +1 -0
  190. package/dist-server/service/kpi-statistic/kpi-statistic.d.ts +1 -0
  191. package/dist-server/service/kpi-statistic/kpi-statistic.js +11 -0
  192. package/dist-server/service/kpi-statistic/kpi-statistic.js.map +1 -1
  193. package/dist-server/service/kpi-value/kpi-value-mutation.js +71 -7
  194. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
  195. package/dist-server/service/kpi-value/kpi-value-type.d.ts +4 -2
  196. package/dist-server/service/kpi-value/kpi-value-type.js +12 -4
  197. package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
  198. package/dist-server/service/kpi-value/kpi-value.d.ts +3 -1
  199. package/dist-server/service/kpi-value/kpi-value.js +11 -5
  200. package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
  201. package/dist-server/service/utils/value-date-util.d.ts +1 -0
  202. package/dist-server/service/utils/value-date-util.js +41 -0
  203. package/dist-server/service/utils/value-date-util.js.map +1 -1
  204. package/dist-server/tsconfig.json +10 -0
  205. package/dist-server/tsconfig.tsbuildinfo +1 -1
  206. package/package.json +7 -6
  207. package/server/@types/index.d.ts +11 -0
  208. package/server/controllers/kpi-metric-value-provider.ts +5 -5
  209. package/server/controllers/kpi-value-provider.ts +4 -4
  210. package/server/migrations/1752190849680-seed-kpi-metrics.ts +124 -0
  211. package/server/migrations/1752190849681-seed-kpi.ts +356 -0
  212. package/server/migrations/1752192090123-add-grades-to-kpi.ts +67 -0
  213. package/server/migrations/1752192090124-add-kpi-statistics.ts +719 -0
  214. package/server/migrations/1752192090128-seed-kpi-org-scope.ts +132 -0
  215. package/server/migrations/1752192090129-seed-kpi-values.ts +207 -0
  216. package/server/migrations/grade-data/x11-performance-table.json +962 -0
  217. package/server/migrations/grade-data/x12-performance-table.json +611 -0
  218. package/server/migrations/grade-data/x14-performance-table.json +42 -0
  219. package/server/migrations/grade-data/x21-performance-table.json +889 -0
  220. package/server/migrations/grade-data/x22-performance-table.json +1064 -0
  221. package/server/migrations/grade-data/x23-performance-table.json +42 -0
  222. package/server/migrations/grade-data/x31-performance-table.json +644 -0
  223. package/server/migrations/grade-data/x32-performance-table.json +993 -0
  224. package/server/migrations/grade-data/x33-performance-table.json +195 -0
  225. package/server/migrations/grade-data/x34-performance-table.json +12 -0
  226. package/server/migrations/grade-data/x35-performance-table.json +42 -0
  227. package/server/migrations/grade-data/x41-performance-table.json +825 -0
  228. package/server/migrations/grade-data/x42-performance-table.json +786 -0
  229. package/server/migrations/grade-data/x43-performance-table.json +12 -0
  230. package/server/migrations/grade-data/x44-performance-table.json +42 -0
  231. package/server/migrations/grade-data/x51-performance-table.json +924 -0
  232. package/server/migrations/grade-data/x52-performance-table.json +42 -0
  233. package/server/migrations/grade-data/x61-performance-table.json +261 -0
  234. package/server/migrations/grade-data/x62-performance-table.json +42 -0
  235. package/server/migrations/seed-data/kpi-metrics-seed.json +454 -0
  236. package/server/migrations/seed-data/kpi-org-scope-seed.json +1676 -0
  237. package/server/migrations/seed-data/kpi-values-seed.json +402 -0
  238. package/server/migrations/seed-data/kpis-seed.json +488 -0
  239. package/server/service/index.ts +5 -12
  240. package/server/service/kpi/aggregate-kpi.ts +31 -13
  241. package/server/service/kpi/kpi-formula.service.ts +101 -0
  242. package/server/service/kpi/kpi-history.ts +0 -8
  243. package/server/service/kpi/kpi-mutation.ts +59 -19
  244. package/server/service/kpi/kpi-query.ts +118 -8
  245. package/server/service/kpi/kpi-type.ts +10 -4
  246. package/server/service/kpi/kpi.ts +17 -7
  247. package/server/service/kpi-metric/aggregate-kpi-metric.ts +55 -11
  248. package/server/service/kpi-metric-value/kpi-metric-value-mutation.ts +6 -6
  249. package/server/service/kpi-metric-value/kpi-metric-value-type.ts +4 -4
  250. package/server/service/kpi-metric-value/kpi-metric-value.ts +3 -3
  251. package/server/service/kpi-org-scope/index.ts +11 -0
  252. package/server/service/kpi-org-scope/kpi-org-scope-mutation.ts +173 -0
  253. package/server/service/kpi-org-scope/kpi-org-scope-query.ts +127 -0
  254. package/server/service/kpi-org-scope/kpi-org-scope-type.ts +68 -0
  255. package/server/service/kpi-org-scope/kpi-org-scope.ts +123 -0
  256. package/server/service/kpi-statistic/kpi-statistic.ts +10 -0
  257. package/server/service/kpi-value/kpi-value-mutation.ts +73 -7
  258. package/server/service/kpi-value/kpi-value-type.ts +10 -4
  259. package/server/service/kpi-value/kpi-value.ts +10 -5
  260. package/server/service/utils/value-date-util.ts +47 -0
  261. package/server/types/global.d.ts +8 -0
  262. package/things-factory.config.js +1 -0
  263. package/translations/en.json +15 -3
  264. package/translations/ja.json +13 -3
  265. package/translations/ko.json +15 -3
  266. package/translations/ms.json +13 -3
  267. package/translations/zh.json +13 -3
  268. package/client/pages/kpi-category/kpi-category-importer.ts +0 -90
  269. package/client/pages/kpi-category/kpi-category-list-page.ts +0 -537
  270. package/client/pages/kpi-category/kpi-category-value-calculator.ts +0 -233
  271. package/client/pages/kpi-category-value/kpi-category-value-list-page.ts +0 -404
  272. package/dist-client/pages/kpi-category/kpi-category-importer.d.ts +0 -23
  273. package/dist-client/pages/kpi-category/kpi-category-importer.js +0 -92
  274. package/dist-client/pages/kpi-category/kpi-category-importer.js.map +0 -1
  275. package/dist-client/pages/kpi-category/kpi-category-list-page.d.ts +0 -74
  276. package/dist-client/pages/kpi-category/kpi-category-list-page.js +0 -517
  277. package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +0 -1
  278. package/dist-client/pages/kpi-category/kpi-category-value-calculator.d.ts +0 -13
  279. package/dist-client/pages/kpi-category/kpi-category-value-calculator.js +0 -256
  280. package/dist-client/pages/kpi-category/kpi-category-value-calculator.js.map +0 -1
  281. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.d.ts +0 -63
  282. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js +0 -393
  283. package/dist-client/pages/kpi-category-value/kpi-category-value-list-page.js.map +0 -1
  284. package/dist-server/service/kpi-category/index.d.ts +0 -6
  285. package/dist-server/service/kpi-category/index.js +0 -10
  286. package/dist-server/service/kpi-category/index.js.map +0 -1
  287. package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +0 -9
  288. package/dist-server/service/kpi-category/kpi-category-mutation.js +0 -221
  289. package/dist-server/service/kpi-category/kpi-category-mutation.js.map +0 -1
  290. package/dist-server/service/kpi-category/kpi-category-query.d.ts +0 -18
  291. package/dist-server/service/kpi-category/kpi-category-query.js +0 -115
  292. package/dist-server/service/kpi-category/kpi-category-query.js.map +0 -1
  293. package/dist-server/service/kpi-category/kpi-category-type.d.ts +0 -24
  294. package/dist-server/service/kpi-category/kpi-category-type.js +0 -100
  295. package/dist-server/service/kpi-category/kpi-category-type.js.map +0 -1
  296. package/dist-server/service/kpi-category/kpi-category.d.ts +0 -22
  297. package/dist-server/service/kpi-category/kpi-category.js +0 -106
  298. package/dist-server/service/kpi-category/kpi-category.js.map +0 -1
  299. package/dist-server/service/kpi-category-value/index.d.ts +0 -6
  300. package/dist-server/service/kpi-category-value/index.js +0 -10
  301. package/dist-server/service/kpi-category-value/index.js.map +0 -1
  302. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.d.ts +0 -8
  303. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js +0 -102
  304. package/dist-server/service/kpi-category-value/kpi-category-value-mutation.js.map +0 -1
  305. package/dist-server/service/kpi-category-value/kpi-category-value-query.d.ts +0 -13
  306. package/dist-server/service/kpi-category-value/kpi-category-value-query.js +0 -91
  307. package/dist-server/service/kpi-category-value/kpi-category-value-query.js.map +0 -1
  308. package/dist-server/service/kpi-category-value/kpi-category-value-type.d.ts +0 -19
  309. package/dist-server/service/kpi-category-value/kpi-category-value-type.js +0 -73
  310. package/dist-server/service/kpi-category-value/kpi-category-value-type.js.map +0 -1
  311. package/dist-server/service/kpi-category-value/kpi-category-value.d.ts +0 -19
  312. package/dist-server/service/kpi-category-value/kpi-category-value.js +0 -91
  313. package/dist-server/service/kpi-category-value/kpi-category-value.js.map +0 -1
  314. package/helps/kpi/kpi-category.md +0 -160
  315. package/server/service/kpi-category/index.ts +0 -7
  316. package/server/service/kpi-category/kpi-category-mutation.ts +0 -217
  317. package/server/service/kpi-category/kpi-category-query.ts +0 -87
  318. package/server/service/kpi-category/kpi-category-type.ts +0 -73
  319. package/server/service/kpi-category/kpi-category.ts +0 -95
  320. package/server/service/kpi-category-value/index.ts +0 -7
  321. package/server/service/kpi-category-value/kpi-category-value-mutation.ts +0 -88
  322. package/server/service/kpi-category-value/kpi-category-value-query.ts +0 -62
  323. package/server/service/kpi-category-value/kpi-category-value-type.ts +0 -48
  324. package/server/service/kpi-category-value/kpi-category-value.ts +0 -79
@@ -8,20 +8,18 @@ import gql from 'graphql-tag'
8
8
 
9
9
  const GET_KPI_OVERVIEW = gql`
10
10
  query {
11
- kpiCategories {
12
- items {
11
+ kpiCategories: kpisLevel1 {
12
+ id
13
+ name
14
+ description
15
+ active
16
+ kpis: children {
13
17
  id
14
18
  name
15
19
  description
20
+ formula
16
21
  active
17
- kpis {
18
- id
19
- name
20
- description
21
- formula
22
- active
23
- grades
24
- }
22
+ grades
25
23
  }
26
24
  }
27
25
  }
@@ -184,7 +182,7 @@ export class KpiOverview extends PageView {
184
182
  async firstUpdated() {
185
183
  try {
186
184
  const { data } = await client.query({ query: GET_KPI_OVERVIEW })
187
- this.kpiCategories = data.kpiCategories.items
185
+ this.kpiCategories = data.kpiCategories
188
186
  this.loading = false
189
187
  } catch (e) {
190
188
  this.error = e instanceof Error ? e : new Error(String(e))
@@ -0,0 +1,409 @@
1
+ import '@operato/data-tree'
2
+ import '@operato/context/ox-context-page-toolbar.js'
3
+ import './kpi-view'
4
+
5
+ import gql from 'graphql-tag'
6
+ import { css, html, PropertyValues } from 'lit'
7
+ import { customElement, property, query, state } from 'lit/decorators.js'
8
+ import { connect } from 'pwa-helpers/connect-mixin'
9
+ import { ScopedElementsMixin } from '@open-wc/scoped-elements'
10
+ import { client } from '@operato/graphql'
11
+ import { i18next, localize } from '@operato/i18n'
12
+ import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'
13
+ import { CustomAlert, PageView, store } from '@operato/shell'
14
+
15
+ import { KpiImporter } from './kpi-importer'
16
+ import { KpiView } from './kpi-view'
17
+
18
+ const SubKpiFragment = gql`
19
+ fragment SubKpiFragment on Kpi {
20
+ id
21
+ name
22
+ description
23
+ active
24
+ formula
25
+ periodType
26
+ scoreFormula
27
+ grades
28
+ vizType
29
+ vizMeta
30
+ weight
31
+ schedule
32
+ scheduleId
33
+ timezone
34
+ version
35
+ isLeaf
36
+ parent {
37
+ id
38
+ name
39
+ }
40
+ updater {
41
+ id
42
+ name
43
+ }
44
+ updatedAt
45
+ creator {
46
+ id
47
+ name
48
+ }
49
+ createdAt
50
+ }
51
+ `
52
+
53
+ @customElement('kpi-tree-page')
54
+ export class KpiTreePage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {
55
+ static styles = [
56
+ CommonHeaderStyles,
57
+ ScrollbarStyles,
58
+ css`
59
+ :host {
60
+ display: flex;
61
+ flex-direction: column;
62
+ width: 100%;
63
+ overflow: auto;
64
+ }
65
+
66
+ content {
67
+ flex: 1;
68
+ display: flex;
69
+ flex-direction: row;
70
+ }
71
+
72
+ div[editor] {
73
+ width: 400px;
74
+ display: flex;
75
+ flex-direction: column;
76
+ border-left: 1px solid var(--md-sys-color-outline-variant);
77
+ }
78
+
79
+ ox-tree-horizontal {
80
+ flex: 1;
81
+ overflow: auto;
82
+ }
83
+
84
+ kpi-view {
85
+ flex: 1;
86
+ padding: var(--spacing-medium);
87
+ background-color: var(--md-sys-color-surface-variant);
88
+ overflow: auto;
89
+ }
90
+
91
+ .footer {
92
+ display: flex;
93
+ gap: var(--spacing-small);
94
+ padding: var(--spacing-medium);
95
+ border-top: 1px solid var(--md-sys-color-outline-variant);
96
+ background-color: var(--md-sys-color-surface);
97
+ }
98
+
99
+ .footer button {
100
+ display: flex;
101
+ align-items: center;
102
+ gap: var(--spacing-small);
103
+ padding: var(--spacing-small) var(--spacing-medium);
104
+ border: 1px solid var(--md-sys-color-outline);
105
+ border-radius: var(--md-sys-shape-corner-small);
106
+ background-color: var(--md-sys-color-surface);
107
+ color: var(--md-sys-color-on-surface);
108
+ cursor: pointer;
109
+ }
110
+
111
+ .footer button:hover {
112
+ background-color: var(--md-sys-color-secondary-container);
113
+ }
114
+
115
+ .footer button[disabled] {
116
+ color: var(--md-sys-color-surface-dim);
117
+ background-color: transparent;
118
+ cursor: not-allowed;
119
+ }
120
+
121
+ .footer button[done] {
122
+ background-color: var(--md-sys-color-primary);
123
+ color: var(--md-sys-color-on-primary);
124
+ }
125
+
126
+ .footer div[filler] {
127
+ flex: 1;
128
+ }
129
+ `
130
+ ]
131
+
132
+ static get scopedElements() {
133
+ return {
134
+ 'kpi-importer': KpiImporter
135
+ }
136
+ }
137
+
138
+ @state() root?: any
139
+ @state() selected?: any
140
+ @state() kpi?: any
141
+ @state() modified: boolean = false
142
+ @state() appendable: boolean = false
143
+
144
+ @query('kpi-view') kpiView!: KpiView
145
+
146
+ get context() {
147
+ return {
148
+ title: i18next.t('title.kpi tree'),
149
+ help: 'kpi/kpi',
150
+ actions: [
151
+ {
152
+ icon: 'delete',
153
+ title: i18next.t('button.delete'),
154
+ action: this.delete.bind(this),
155
+ emphasis: {
156
+ danger: true
157
+ }
158
+ }
159
+ ].filter(Boolean),
160
+ exportable: {
161
+ name: i18next.t('title.kpi tree'),
162
+ data: this.exportHandler.bind(this)
163
+ },
164
+ importable: {
165
+ handler: this.importHandler.bind(this)
166
+ },
167
+ toolbar: false
168
+ }
169
+ }
170
+
171
+ render() {
172
+ return html`
173
+ <div class="header">
174
+ <ox-context-page-toolbar class="actions" .context=${this.context}></ox-context-page-toolbar>
175
+ </div>
176
+
177
+ <content>
178
+ <ox-tree-horizontal
179
+ .data=${this.root}
180
+ .selected=${this.selected}
181
+ @select=${this.onSelect.bind(this)}
182
+ id-property="name"
183
+ label-property=""
184
+ description-property="description"
185
+ ></ox-tree-horizontal>
186
+
187
+ <div editor>
188
+ <kpi-view
189
+ .kpi=${this.kpi}
190
+ @property-change=${(e: CustomEvent) => {
191
+ const { name } = e.detail || {}
192
+ this.modified = true
193
+ this.appendable = name && name !== this.selected?.name
194
+ }}
195
+ ></kpi-view>
196
+ <div class="footer">
197
+ <button @click=${this.reset.bind(this)}>
198
+ <md-icon>restart_alt</md-icon>
199
+ ${i18next.t('button.reset')}
200
+ </button>
201
+ <div filler></div>
202
+ <button @click=${this.create.bind(this)} ?disabled=${!this.appendable}>
203
+ <md-icon>add</md-icon>
204
+ ${i18next.t('button.add')}
205
+ </button>
206
+ <button @click=${this.save.bind(this)} ?disabled=${!this.modified} done>
207
+ <md-icon>save</md-icon>
208
+ ${i18next.t('button.save')}
209
+ </button>
210
+ </div>
211
+ </div>
212
+ </content>
213
+ `
214
+ }
215
+
216
+ updated(changes: PropertyValues<this>) {
217
+ if (changes.has('selected')) {
218
+ this.modified = false
219
+ this.kpi = { ...this.selected }
220
+ }
221
+ }
222
+
223
+ onSelect(e: CustomEvent) {
224
+ this.selected = e.detail
225
+ this.updateContext()
226
+ }
227
+
228
+ reset() {
229
+ if (this.kpiView) {
230
+ this.kpiView.kpi = {}
231
+ }
232
+ }
233
+
234
+ async create() {
235
+ const { id: parentId } = this.selected || {}
236
+ const { name, description, formula, active, isLeaf, weight } = this.kpi || {}
237
+
238
+ const kpi = {
239
+ name,
240
+ description,
241
+ formula,
242
+ active: active !== false,
243
+ isLeaf: isLeaf !== false,
244
+ weight: weight || 1
245
+ } as any
246
+
247
+ if (parentId) {
248
+ kpi.parent = { id: parentId }
249
+ }
250
+
251
+ const response = await client.mutate({
252
+ mutation: gql`
253
+ mutation ($kpi: NewKpi!) {
254
+ createKpi(kpi: $kpi) {
255
+ ...SubKpiFragment
256
+ }
257
+ }
258
+ ${SubKpiFragment}
259
+ `,
260
+ variables: {
261
+ kpi
262
+ }
263
+ })
264
+
265
+ this.selected = response.data.createKpi
266
+ this.updateContext()
267
+
268
+ await this.fetch()
269
+ }
270
+
271
+ async save() {
272
+ const { id, name, description, formula, active, isLeaf, weight } = this.kpi || {}
273
+
274
+ if (!id) {
275
+ await CustomAlert({
276
+ type: 'warning',
277
+ title: i18next.t('message.kpi_not_selected'),
278
+ text: i18next.t('message.select_kpi_first'),
279
+ confirmButton: { text: i18next.t('button.confirm') }
280
+ })
281
+ return
282
+ }
283
+
284
+ const patch = {
285
+ name,
286
+ description,
287
+ formula,
288
+ active,
289
+ isLeaf,
290
+ weight
291
+ } as any
292
+
293
+ const response = await client.mutate({
294
+ mutation: gql`
295
+ mutation ($id: String!, $patch: KpiPatch!) {
296
+ updateKpi(id: $id, patch: $patch) {
297
+ ...SubKpiFragment
298
+ }
299
+ }
300
+ ${SubKpiFragment}
301
+ `,
302
+ variables: {
303
+ id,
304
+ patch
305
+ }
306
+ })
307
+
308
+ this.selected = response.data.updateKpi
309
+ this.fetch()
310
+ }
311
+
312
+ async delete() {
313
+ if (!this.selected) {
314
+ await CustomAlert({
315
+ type: 'warning',
316
+ title: i18next.t('message.kpi_not_selected'),
317
+ text: i18next.t('message.select_kpi_first'),
318
+ confirmButton: { text: i18next.t('button.confirm') }
319
+ })
320
+ return
321
+ }
322
+
323
+ const children = this.selected?.children
324
+ if (children && children.length > 0) {
325
+ await CustomAlert({
326
+ type: 'warning',
327
+ title: i18next.t('message.kpis_with_children_cannot_be_deleted'),
328
+ text: i18next.t('message.kpi_having_children_cannot_be_deleted'),
329
+ confirmButton: { text: i18next.t('button.confirm') }
330
+ })
331
+ return
332
+ }
333
+
334
+ if (confirm(i18next.t('text.sure_to_x', { x: i18next.t('text.delete') }))) {
335
+ const { id } = this.selected || {}
336
+
337
+ await client.mutate({
338
+ mutation: gql`
339
+ mutation ($ids: [String!]!) {
340
+ deleteKpis(ids: $ids)
341
+ }
342
+ `,
343
+ variables: {
344
+ ids: [id]
345
+ }
346
+ })
347
+
348
+ this.selected = {}
349
+ this.updateContext()
350
+ await this.fetch()
351
+ }
352
+ }
353
+
354
+ async pageInitialized(lifecycle: any) {
355
+ this.fetch()
356
+ }
357
+
358
+ async pageUpdated(changes: any, lifecycle: any) {
359
+ if (this.active) {
360
+ // do something here when this page just became as active
361
+ }
362
+ }
363
+
364
+ async fetch() {
365
+ const response = await client.query({
366
+ query: gql`
367
+ query {
368
+ kpiTree {
369
+ ...SubKpiFragment
370
+ children {
371
+ ...SubKpiFragment
372
+ children {
373
+ ...SubKpiFragment
374
+ children {
375
+ ...SubKpiFragment
376
+ children {
377
+ ...SubKpiFragment
378
+ children {
379
+ ...SubKpiFragment
380
+ children {
381
+ ...SubKpiFragment
382
+ children {
383
+ ...SubKpiFragment
384
+ }
385
+ }
386
+ }
387
+ }
388
+ }
389
+ }
390
+ }
391
+ }
392
+ }
393
+ ${SubKpiFragment}
394
+ `
395
+ })
396
+
397
+ const records = response.data.kpiTree || []
398
+ /* 다중루트를 지원하기 위해서 this.root 에 모든 루트를 저장하라. */
399
+ this.root = records
400
+ }
401
+
402
+ async exportHandler() {
403
+ // Export functionality can be implemented here
404
+ }
405
+
406
+ async importHandler(records: any[]) {
407
+ // Import functionality can be implemented here
408
+ }
409
+ }
@@ -0,0 +1,187 @@
1
+ import '@material/web/textfield/outlined-text-field.js'
2
+ import '@material/web/textfield/filled-text-field.js'
3
+ import '@material/web/checkbox/checkbox.js'
4
+
5
+ import { css, html, LitElement } from 'lit'
6
+ import { customElement, property } from 'lit/decorators.js'
7
+ import { i18next, localize } from '@operato/i18n'
8
+
9
+ @customElement('kpi-view')
10
+ export class KpiView extends localize(i18next)(LitElement) {
11
+ static styles = [
12
+ css`
13
+ :host {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: var(--spacing-medium);
17
+ padding: var(--spacing-medium);
18
+ }
19
+
20
+ .form-group {
21
+ display: flex;
22
+ flex-direction: column;
23
+ gap: var(--spacing-small);
24
+ }
25
+
26
+ .form-row {
27
+ display: flex;
28
+ gap: var(--spacing-medium);
29
+ align-items: center;
30
+ }
31
+
32
+ .form-row > * {
33
+ flex: 1;
34
+ }
35
+
36
+ label {
37
+ font-weight: 500;
38
+ color: var(--md-sys-color-on-surface);
39
+ margin-bottom: var(--spacing-small);
40
+ }
41
+
42
+ md-outlined-text-field,
43
+ md-filled-text-field,
44
+ md-outlined-select {
45
+ width: 100%;
46
+ }
47
+
48
+ .checkbox-group {
49
+ display: flex;
50
+ align-items: center;
51
+ gap: var(--spacing-small);
52
+ }
53
+
54
+ .section-title {
55
+ font-size: 1.1rem;
56
+ font-weight: 600;
57
+ color: var(--md-sys-color-primary);
58
+ margin-top: var(--spacing-large);
59
+ margin-bottom: var(--spacing-medium);
60
+ border-bottom: 1px solid var(--md-sys-color-outline-variant);
61
+ padding-bottom: var(--spacing-small);
62
+ }
63
+
64
+ textarea {
65
+ width: 100%;
66
+ min-height: 100px;
67
+ padding: var(--spacing-small);
68
+ border: 1px solid var(--md-sys-color-outline);
69
+ border-radius: var(--md-sys-shape-corner-small);
70
+ font-family: monospace;
71
+ resize: vertical;
72
+ }
73
+ `
74
+ ]
75
+
76
+ @property({ type: Object }) kpi: any = {}
77
+
78
+ render() {
79
+ return html`
80
+ <div class="section-title">${i18next.t('label.basic_information')}</div>
81
+
82
+ <div class="form-group">
83
+ <label>Name *</label>
84
+ <md-outlined-text-field
85
+ .value=${this.kpi?.name || ''}
86
+ @input=${(e: any) => this.updateProperty('name', e.target.value)}
87
+ required
88
+ ></md-outlined-text-field>
89
+ </div>
90
+
91
+ <div class="form-group">
92
+ <label>Description</label>
93
+ <md-outlined-text-field
94
+ .value=${this.kpi?.description || ''}
95
+ @input=${(e: any) => this.updateProperty('description', e.target.value)}
96
+ type="textarea"
97
+ rows="3"
98
+ ></md-outlined-text-field>
99
+ </div>
100
+
101
+ <div class="form-group">
102
+ <label>Weight</label>
103
+ <md-outlined-text-field
104
+ type="number"
105
+ .value=${this.kpi?.weight?.toString() || '1'}
106
+ @input=${(e: any) => this.updateProperty('weight', parseFloat(e.target.value) || 1)}
107
+ min="0"
108
+ step="0.1"
109
+ ></md-outlined-text-field>
110
+ </div>
111
+
112
+ <div class="form-row">
113
+ <div class="checkbox-group">
114
+ <md-checkbox
115
+ ?checked=${this.kpi?.active !== false}
116
+ @change=${(e: any) => this.updateProperty('active', e.target.checked)}
117
+ ></md-checkbox>
118
+ <label>Active</label>
119
+ </div>
120
+
121
+ <div class="checkbox-group">
122
+ <md-checkbox
123
+ ?checked=${this.kpi?.isLeaf !== false}
124
+ @change=${(e: any) => this.updateProperty('isLeaf', e.target.checked)}
125
+ ></md-checkbox>
126
+ <label>${i18next.t('label.is_leaf_node')}</label>
127
+ </div>
128
+ </div>
129
+
130
+ <div class="section-title">${i18next.t('label.formula_calculation')}</div>
131
+
132
+ <div class="form-group">
133
+ <label>${i18next.t('label.kpi_formula')}</label>
134
+ <textarea
135
+ .value=${this.kpi?.formula || ''}
136
+ @input=${(e: any) => this.updateProperty('formula', e.target.value)}
137
+ placeholder="${i18next.t('placeholder.enter_formula')}"
138
+ ></textarea>
139
+ </div>
140
+
141
+ <div class="form-group">
142
+ <label>${i18next.t('label.score_formula')}</label>
143
+ <textarea
144
+ .value=${this.kpi?.scoreFormula || ''}
145
+ @input=${(e: any) => this.updateProperty('scoreFormula', e.target.value)}
146
+ placeholder="${i18next.t('placeholder.enter_score_formula')}"
147
+ ></textarea>
148
+ </div>
149
+
150
+ <div class="section-title">Schedule</div>
151
+
152
+ <div class="form-group">
153
+ <label>Cron Schedule</label>
154
+ <md-outlined-text-field
155
+ .value=${this.kpi?.schedule || ''}
156
+ @input=${(e: any) => this.updateProperty('schedule', e.target.value)}
157
+ placeholder="${i18next.t('placeholder.cron_schedule')}"
158
+ ></md-outlined-text-field>
159
+ </div>
160
+
161
+ <div class="form-group">
162
+ <label>Timezone</label>
163
+ <md-outlined-text-field
164
+ .value=${this.kpi?.timezone || ''}
165
+ @input=${(e: any) => this.updateProperty('timezone', e.target.value)}
166
+ placeholder="${i18next.t('placeholder.timezone')}"
167
+ ></md-outlined-text-field>
168
+ </div>
169
+ `
170
+ }
171
+
172
+ updateProperty(property: string, value: any) {
173
+ this.kpi = {
174
+ ...this.kpi,
175
+ [property]: value
176
+ }
177
+
178
+ this.dispatchEvent(new CustomEvent('property-change', {
179
+ detail: this.kpi,
180
+ bubbles: true,
181
+ composed: true
182
+ }))
183
+
184
+ this.requestUpdate()
185
+ }
186
+
187
+ }
@@ -149,7 +149,7 @@ export class KpiLevel1Card extends LitElement {
149
149
  name
150
150
  targetValue
151
151
  unit
152
- category {
152
+ category: parent {
153
153
  id
154
154
  name
155
155
  }
@@ -134,7 +134,7 @@ export class KpiLevel2Comparison extends LitElement {
134
134
  name
135
135
  targetValue
136
136
  unit
137
- category {
137
+ category: parent {
138
138
  id
139
139
  name
140
140
  }
@@ -170,7 +170,7 @@ export class KpiLevel3Comparison extends LitElement {
170
170
  name
171
171
  targetValue
172
172
  unit
173
- category {
173
+ category: parent {
174
174
  id
175
175
  name
176
176
  }