@things-factory/kpi 1.0.0-alpha.5 → 9.0.9

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 (309) hide show
  1. package/README.md +74 -0
  2. package/client/pages/kpi/kpi-list-page.ts +97 -47
  3. package/client/pages/kpi/kpi-overview-sample.ts +260 -0
  4. package/client/pages/kpi/kpi-overview.ts +271 -0
  5. package/client/pages/kpi-category/kpi-category-list-page.ts +39 -50
  6. package/client/pages/kpi-dashboard/kpi-alert-panel.ts +114 -0
  7. package/client/pages/kpi-dashboard/kpi-dashboard.ts +285 -0
  8. package/client/pages/kpi-dashboard/kpi-grade-visualization.ts +75 -0
  9. package/client/pages/kpi-dashboard/kpi-history-viewer.ts +58 -0
  10. package/client/pages/kpi-dashboard/kpi-list-summary.ts +100 -0
  11. package/client/pages/kpi-dashboard/kpi-performance-summary.ts +124 -0
  12. package/client/pages/kpi-dashboard/kpi-value-entry.ts +78 -0
  13. package/client/pages/kpi-grade/kpi-grade-list-page.ts +58 -68
  14. package/client/pages/kpi-history/kpi-history-list-page.ts +146 -0
  15. package/client/pages/kpi-metric/kpi-metric-list-page.ts +67 -63
  16. package/client/pages/kpi-value/kpi-value-list-page.ts +73 -72
  17. package/client/pages/kpi-value/kpi-value-manual-entry-form.ts +168 -0
  18. package/client/pages/kpi-value/kpi-value-manual-entry-page.ts +173 -0
  19. package/client/route.ts +35 -0
  20. package/dist-client/pages/kpi/kpi-importer.js +16 -17
  21. package/dist-client/pages/kpi/kpi-importer.js.map +1 -1
  22. package/dist-client/pages/kpi/kpi-list-page.js +128 -68
  23. package/dist-client/pages/kpi/kpi-list-page.js.map +1 -1
  24. package/dist-client/pages/kpi/kpi-overview-sample.d.ts +36 -0
  25. package/dist-client/pages/kpi/kpi-overview-sample.js +264 -0
  26. package/dist-client/pages/kpi/kpi-overview-sample.js.map +1 -0
  27. package/dist-client/pages/kpi/kpi-overview.d.ts +14 -0
  28. package/dist-client/pages/kpi/kpi-overview.js +290 -0
  29. package/dist-client/pages/kpi/kpi-overview.js.map +1 -0
  30. package/dist-client/pages/kpi-category/kpi-category-importer.js +16 -17
  31. package/dist-client/pages/kpi-category/kpi-category-importer.js.map +1 -1
  32. package/dist-client/pages/kpi-category/kpi-category-list-page.js +70 -71
  33. package/dist-client/pages/kpi-category/kpi-category-list-page.js.map +1 -1
  34. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.d.ts +18 -0
  35. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js +128 -0
  36. package/dist-client/pages/kpi-dashboard/kpi-alert-panel.js.map +1 -0
  37. package/dist-client/pages/kpi-dashboard/kpi-dashboard.d.ts +24 -0
  38. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js +305 -0
  39. package/dist-client/pages/kpi-dashboard/kpi-dashboard.js.map +1 -0
  40. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.d.ts +12 -0
  41. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js +82 -0
  42. package/dist-client/pages/kpi-dashboard/kpi-grade-visualization.js.map +1 -0
  43. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.d.ts +11 -0
  44. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js +65 -0
  45. package/dist-client/pages/kpi-dashboard/kpi-history-viewer.js.map +1 -0
  46. package/dist-client/pages/kpi-dashboard/kpi-list-summary.d.ts +13 -0
  47. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js +115 -0
  48. package/dist-client/pages/kpi-dashboard/kpi-list-summary.js.map +1 -0
  49. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.d.ts +15 -0
  50. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js +139 -0
  51. package/dist-client/pages/kpi-dashboard/kpi-performance-summary.js.map +1 -0
  52. package/dist-client/pages/kpi-dashboard/kpi-value-entry.d.ts +7 -0
  53. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js +86 -0
  54. package/dist-client/pages/kpi-dashboard/kpi-value-entry.js.map +1 -0
  55. package/dist-client/pages/kpi-grade/kpi-grade-importer.js +16 -17
  56. package/dist-client/pages/kpi-grade/kpi-grade-importer.js.map +1 -1
  57. package/dist-client/pages/kpi-grade/kpi-grade-list-page.js +89 -89
  58. package/dist-client/pages/kpi-grade/kpi-grade-list-page.js.map +1 -1
  59. package/dist-client/pages/kpi-history/kpi-history-list-page.d.ts +16 -0
  60. package/dist-client/pages/kpi-history/kpi-history-list-page.js +155 -0
  61. package/dist-client/pages/kpi-history/kpi-history-list-page.js.map +1 -0
  62. package/dist-client/pages/kpi-metric/kpi-metric-importer.js +16 -17
  63. package/dist-client/pages/kpi-metric/kpi-metric-importer.js.map +1 -1
  64. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js +98 -84
  65. package/dist-client/pages/kpi-metric/kpi-metric-list-page.js.map +1 -1
  66. package/dist-client/pages/kpi-value/kpi-value-importer.js +16 -17
  67. package/dist-client/pages/kpi-value/kpi-value-importer.js.map +1 -1
  68. package/dist-client/pages/kpi-value/kpi-value-list-page.js +104 -93
  69. package/dist-client/pages/kpi-value/kpi-value-list-page.js.map +1 -1
  70. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.d.ts +14 -0
  71. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js +201 -0
  72. package/dist-client/pages/kpi-value/kpi-value-manual-entry-form.js.map +1 -0
  73. package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.d.ts +41 -0
  74. package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.js +180 -0
  75. package/dist-client/pages/kpi-value/kpi-value-manual-entry-page.js.map +1 -0
  76. package/dist-client/route.d.ts +1 -1
  77. package/dist-client/route.js +27 -0
  78. package/dist-client/route.js.map +1 -1
  79. package/dist-client/tsconfig.tsbuildinfo +1 -1
  80. package/dist-server/index.d.ts +2 -1
  81. package/dist-server/index.js +2 -1
  82. package/dist-server/index.js.map +1 -1
  83. package/dist-server/migrations/1752188906708-SeedKpiCategory.d.ts +5 -0
  84. package/dist-server/migrations/1752188906708-SeedKpiCategory.js +56 -0
  85. package/dist-server/migrations/1752188906708-SeedKpiCategory.js.map +1 -0
  86. package/dist-server/migrations/1752190849681-SeedKpi.d.ts +5 -0
  87. package/dist-server/migrations/1752190849681-SeedKpi.js +107 -0
  88. package/dist-server/migrations/1752190849681-SeedKpi.js.map +1 -0
  89. package/dist-server/migrations/1752191090459-SeedKpiGrade.d.ts +5 -0
  90. package/dist-server/migrations/1752191090459-SeedKpiGrade.js +271 -0
  91. package/dist-server/migrations/1752191090459-SeedKpiGrade.js.map +1 -0
  92. package/dist-server/migrations/index.d.ts +1 -0
  93. package/dist-server/migrations/index.js +12 -0
  94. package/dist-server/migrations/index.js.map +1 -0
  95. package/dist-server/routes.d.ts +1 -0
  96. package/dist-server/routes.js +48 -0
  97. package/dist-server/routes.js.map +1 -1
  98. package/dist-server/service/index.d.ts +3 -4
  99. package/dist-server/service/index.js +4 -6
  100. package/dist-server/service/index.js.map +1 -1
  101. package/dist-server/service/kpi/aggregate-kpi.d.ts +8 -0
  102. package/dist-server/service/kpi/aggregate-kpi.js +88 -0
  103. package/dist-server/service/kpi/aggregate-kpi.js.map +1 -0
  104. package/dist-server/service/kpi/event-subscriber.d.ts +2 -0
  105. package/dist-server/service/kpi/event-subscriber.js +10 -0
  106. package/dist-server/service/kpi/event-subscriber.js.map +1 -1
  107. package/dist-server/service/kpi/index.d.ts +2 -1
  108. package/dist-server/service/kpi/kpi-formula.service.d.ts +24 -0
  109. package/dist-server/service/kpi/kpi-formula.service.js +64 -0
  110. package/dist-server/service/kpi/kpi-formula.service.js.map +1 -0
  111. package/dist-server/service/kpi/kpi-history.d.ts +6 -2
  112. package/dist-server/service/kpi/kpi-history.js +29 -11
  113. package/dist-server/service/kpi/kpi-history.js.map +1 -1
  114. package/dist-server/service/kpi/kpi-mutation.d.ts +2 -0
  115. package/dist-server/service/kpi/kpi-mutation.js +215 -10
  116. package/dist-server/service/kpi/kpi-mutation.js.map +1 -1
  117. package/dist-server/service/kpi/kpi-query.d.ts +10 -0
  118. package/dist-server/service/kpi/kpi-query.js +87 -3
  119. package/dist-server/service/kpi/kpi-query.js.map +1 -1
  120. package/dist-server/service/kpi/kpi-type.d.ts +14 -3
  121. package/dist-server/service/kpi/kpi-type.js +81 -18
  122. package/dist-server/service/kpi/kpi-type.js.map +1 -1
  123. package/dist-server/service/kpi/kpi.d.ts +14 -3
  124. package/dist-server/service/kpi/kpi.js +96 -19
  125. package/dist-server/service/kpi/kpi.js.map +1 -1
  126. package/dist-server/service/kpi-alert/index.d.ts +2 -0
  127. package/dist-server/service/kpi-alert/index.js +6 -0
  128. package/dist-server/service/kpi-alert/index.js.map +1 -0
  129. package/dist-server/service/kpi-alert/kpi-alert-query.d.ts +4 -0
  130. package/dist-server/service/kpi-alert/kpi-alert-query.js +71 -0
  131. package/dist-server/service/kpi-alert/kpi-alert-query.js.map +1 -0
  132. package/dist-server/service/kpi-alert/kpi-alert-type.d.ts +8 -0
  133. package/dist-server/service/kpi-alert/kpi-alert-type.js +33 -0
  134. package/dist-server/service/kpi-alert/kpi-alert-type.js.map +1 -0
  135. package/dist-server/service/kpi-category/kpi-category-mutation.d.ts +1 -1
  136. package/dist-server/service/kpi-category/kpi-category-mutation.js +36 -10
  137. package/dist-server/service/kpi-category/kpi-category-mutation.js.map +1 -1
  138. package/dist-server/service/kpi-category/kpi-category-query.d.ts +2 -0
  139. package/dist-server/service/kpi-category/kpi-category-query.js +18 -2
  140. package/dist-server/service/kpi-category/kpi-category-query.js.map +1 -1
  141. package/dist-server/service/kpi-category/kpi-category-type.d.ts +3 -5
  142. package/dist-server/service/kpi-category/kpi-category-type.js +16 -20
  143. package/dist-server/service/kpi-category/kpi-category-type.js.map +1 -1
  144. package/dist-server/service/kpi-category/kpi-category.d.ts +7 -9
  145. package/dist-server/service/kpi-category/kpi-category.js +40 -38
  146. package/dist-server/service/kpi-category/kpi-category.js.map +1 -1
  147. package/dist-server/service/kpi-grade/index.d.ts +1 -2
  148. package/dist-server/service/kpi-grade/index.js +2 -4
  149. package/dist-server/service/kpi-grade/index.js.map +1 -1
  150. package/dist-server/service/kpi-grade/kpi-grade-mutation.d.ts +1 -1
  151. package/dist-server/service/kpi-grade/kpi-grade-mutation.js +33 -10
  152. package/dist-server/service/kpi-grade/kpi-grade-mutation.js.map +1 -1
  153. package/dist-server/service/kpi-grade/kpi-grade-query.js +2 -2
  154. package/dist-server/service/kpi-grade/kpi-grade-query.js.map +1 -1
  155. package/dist-server/service/kpi-grade/kpi-grade-type.d.ts +13 -4
  156. package/dist-server/service/kpi-grade/kpi-grade-type.js +54 -18
  157. package/dist-server/service/kpi-grade/kpi-grade-type.js.map +1 -1
  158. package/dist-server/service/kpi-grade/kpi-grade.d.ts +8 -8
  159. package/dist-server/service/kpi-grade/kpi-grade.js +48 -40
  160. package/dist-server/service/kpi-grade/kpi-grade.js.map +1 -1
  161. package/dist-server/service/kpi-metric/aggregate-kpi-metric.d.ts +8 -0
  162. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js +134 -0
  163. package/dist-server/service/kpi-metric/aggregate-kpi-metric.js.map +1 -0
  164. package/dist-server/service/kpi-metric/index.d.ts +1 -2
  165. package/dist-server/service/kpi-metric/index.js +2 -4
  166. package/dist-server/service/kpi-metric/index.js.map +1 -1
  167. package/dist-server/service/kpi-metric/kpi-metric-mutation.d.ts +1 -1
  168. package/dist-server/service/kpi-metric/kpi-metric-mutation.js +139 -13
  169. package/dist-server/service/kpi-metric/kpi-metric-mutation.js.map +1 -1
  170. package/dist-server/service/kpi-metric/kpi-metric-query.js +3 -3
  171. package/dist-server/service/kpi-metric/kpi-metric-query.js.map +1 -1
  172. package/dist-server/service/kpi-metric/kpi-metric-type.d.ts +17 -4
  173. package/dist-server/service/kpi-metric/kpi-metric-type.js +69 -11
  174. package/dist-server/service/kpi-metric/kpi-metric-type.js.map +1 -1
  175. package/dist-server/service/kpi-metric/kpi-metric.d.ts +11 -8
  176. package/dist-server/service/kpi-metric/kpi-metric.js +62 -37
  177. package/dist-server/service/kpi-metric/kpi-metric.js.map +1 -1
  178. package/dist-server/service/kpi-value/kpi-value-mutation.js +66 -11
  179. package/dist-server/service/kpi-value/kpi-value-mutation.js.map +1 -1
  180. package/dist-server/service/kpi-value/kpi-value-query.d.ts +2 -0
  181. package/dist-server/service/kpi-value/kpi-value-query.js +15 -2
  182. package/dist-server/service/kpi-value/kpi-value-query.js.map +1 -1
  183. package/dist-server/service/kpi-value/kpi-value-type.d.ts +19 -10
  184. package/dist-server/service/kpi-value/kpi-value-type.js +87 -24
  185. package/dist-server/service/kpi-value/kpi-value-type.js.map +1 -1
  186. package/dist-server/service/kpi-value/kpi-value.d.ts +15 -9
  187. package/dist-server/service/kpi-value/kpi-value.js +86 -32
  188. package/dist-server/service/kpi-value/kpi-value.js.map +1 -1
  189. package/dist-server/tsconfig.tsbuildinfo +1 -1
  190. package/implement-plan/01-entity-type-resolver.md +57 -0
  191. package/implement-plan/02-dataset-integration.md +35 -0
  192. package/implement-plan/03-kpivalue-automation.md +34 -0
  193. package/implement-plan/04-version-history.md +33 -0
  194. package/implement-plan/05-grade-visualization.md +33 -0
  195. package/implement-plan/06-graphql-frontend.md +30 -0
  196. package/implement-plan/07-test-docs.md +35 -0
  197. package/implement-plan/TODO.md +41 -0
  198. package/package.json +18 -6
  199. package/server/index.ts +2 -1
  200. package/server/migrations/1752188906708-SeedKpiCategory.ts +61 -0
  201. package/server/migrations/1752190849681-SeedKpi.ts +112 -0
  202. package/server/migrations/1752191090459-SeedKpiGrade.ts +270 -0
  203. package/server/migrations/index.ts +9 -0
  204. package/server/routes.ts +55 -0
  205. package/server/service/index.ts +4 -6
  206. package/server/service/kpi/aggregate-kpi.ts +82 -0
  207. package/server/service/kpi/event-subscriber.ts +12 -0
  208. package/server/service/kpi/kpi-formula.service.ts +63 -0
  209. package/server/service/kpi/kpi-history.ts +29 -21
  210. package/server/service/kpi/kpi-mutation.ts +194 -12
  211. package/server/service/kpi/kpi-query.ts +57 -2
  212. package/server/service/kpi/kpi-type.ts +72 -19
  213. package/server/service/kpi/kpi.ts +96 -20
  214. package/server/service/kpi-alert/index.ts +3 -0
  215. package/server/service/kpi-alert/kpi-alert-query.ts +59 -0
  216. package/server/service/kpi-alert/kpi-alert-type.ts +20 -0
  217. package/server/service/kpi-category/kpi-category-mutation.ts +17 -4
  218. package/server/service/kpi-category/kpi-category-query.ts +20 -3
  219. package/server/service/kpi-category/kpi-category-type.ts +17 -19
  220. package/server/service/kpi-category/kpi-category.ts +39 -37
  221. package/server/service/kpi-grade/index.ts +2 -4
  222. package/server/service/kpi-grade/kpi-grade-mutation.ts +13 -4
  223. package/server/service/kpi-grade/kpi-grade-query.ts +5 -2
  224. package/server/service/kpi-grade/kpi-grade-type.ts +46 -19
  225. package/server/service/kpi-grade/kpi-grade.ts +44 -38
  226. package/server/service/kpi-metric/aggregate-kpi-metric.ts +128 -0
  227. package/server/service/kpi-metric/index.ts +2 -4
  228. package/server/service/kpi-metric/kpi-metric-mutation.ts +123 -7
  229. package/server/service/kpi-metric/kpi-metric-query.ts +9 -3
  230. package/server/service/kpi-metric/kpi-metric-type.ts +56 -13
  231. package/server/service/kpi-metric/kpi-metric.ts +55 -35
  232. package/server/service/kpi-value/kpi-value-mutation.ts +52 -14
  233. package/server/service/kpi-value/kpi-value-query.ts +12 -2
  234. package/server/service/kpi-value/kpi-value-type.ts +80 -25
  235. package/server/service/kpi-value/kpi-value.ts +81 -29
  236. package/things-factory.config.js +12 -4
  237. package/translations/en.json +12 -1
  238. package/translations/ja.json +12 -1
  239. package/translations/ko.json +12 -1
  240. package/translations/ms.json +12 -1
  241. package/translations/zh.json +12 -1
  242. package/client/pages/kpe-metric/kpe-metric-importer.ts +0 -90
  243. package/client/pages/kpe-metric/kpe-metric-list-page.ts +0 -398
  244. package/client/pages/kpi-formula/kpi-formula-importer.ts +0 -90
  245. package/client/pages/kpi-formula/kpi-formula-list-page.ts +0 -398
  246. package/client/pages/metric/metric-importer.ts +0 -90
  247. package/client/pages/metric/metric-list-page.ts +0 -398
  248. package/dist-client/pages/kpe-metric/kpe-metric-importer.d.ts +0 -23
  249. package/dist-client/pages/kpe-metric/kpe-metric-importer.js +0 -93
  250. package/dist-client/pages/kpe-metric/kpe-metric-importer.js.map +0 -1
  251. package/dist-client/pages/kpe-metric/kpe-metric-list-page.d.ts +0 -66
  252. package/dist-client/pages/kpe-metric/kpe-metric-list-page.js +0 -370
  253. package/dist-client/pages/kpe-metric/kpe-metric-list-page.js.map +0 -1
  254. package/dist-client/pages/kpi-formula/kpi-formula-importer.d.ts +0 -23
  255. package/dist-client/pages/kpi-formula/kpi-formula-importer.js +0 -93
  256. package/dist-client/pages/kpi-formula/kpi-formula-importer.js.map +0 -1
  257. package/dist-client/pages/kpi-formula/kpi-formula-list-page.d.ts +0 -66
  258. package/dist-client/pages/kpi-formula/kpi-formula-list-page.js +0 -370
  259. package/dist-client/pages/kpi-formula/kpi-formula-list-page.js.map +0 -1
  260. package/dist-client/pages/metric/metric-importer.d.ts +0 -23
  261. package/dist-client/pages/metric/metric-importer.js +0 -93
  262. package/dist-client/pages/metric/metric-importer.js.map +0 -1
  263. package/dist-client/pages/metric/metric-list-page.d.ts +0 -66
  264. package/dist-client/pages/metric/metric-list-page.js +0 -370
  265. package/dist-client/pages/metric/metric-list-page.js.map +0 -1
  266. package/dist-server/service/kpi-formula/event-subscriber.d.ts +0 -7
  267. package/dist-server/service/kpi-formula/event-subscriber.js +0 -21
  268. package/dist-server/service/kpi-formula/event-subscriber.js.map +0 -1
  269. package/dist-server/service/kpi-formula/index.d.ts +0 -7
  270. package/dist-server/service/kpi-formula/index.js +0 -12
  271. package/dist-server/service/kpi-formula/index.js.map +0 -1
  272. package/dist-server/service/kpi-formula/kpi-formula-history.d.ts +0 -25
  273. package/dist-server/service/kpi-formula/kpi-formula-history.js +0 -128
  274. package/dist-server/service/kpi-formula/kpi-formula-history.js.map +0 -1
  275. package/dist-server/service/kpi-formula/kpi-formula-mutation.d.ts +0 -10
  276. package/dist-server/service/kpi-formula/kpi-formula-mutation.js +0 -128
  277. package/dist-server/service/kpi-formula/kpi-formula-mutation.js.map +0 -1
  278. package/dist-server/service/kpi-formula/kpi-formula-query.d.ts +0 -11
  279. package/dist-server/service/kpi-formula/kpi-formula-query.js +0 -79
  280. package/dist-server/service/kpi-formula/kpi-formula-query.js.map +0 -1
  281. package/dist-server/service/kpi-formula/kpi-formula-type.d.ts +0 -20
  282. package/dist-server/service/kpi-formula/kpi-formula-type.js +0 -77
  283. package/dist-server/service/kpi-formula/kpi-formula-type.js.map +0 -1
  284. package/dist-server/service/kpi-formula/kpi-formula.d.ts +0 -24
  285. package/dist-server/service/kpi-formula/kpi-formula.js +0 -109
  286. package/dist-server/service/kpi-formula/kpi-formula.js.map +0 -1
  287. package/dist-server/service/kpi-grade/event-subscriber.d.ts +0 -7
  288. package/dist-server/service/kpi-grade/event-subscriber.js +0 -21
  289. package/dist-server/service/kpi-grade/event-subscriber.js.map +0 -1
  290. package/dist-server/service/kpi-grade/kpi-grade-history.d.ts +0 -25
  291. package/dist-server/service/kpi-grade/kpi-grade-history.js +0 -128
  292. package/dist-server/service/kpi-grade/kpi-grade-history.js.map +0 -1
  293. package/dist-server/service/kpi-metric/event-subscriber.d.ts +0 -7
  294. package/dist-server/service/kpi-metric/event-subscriber.js +0 -21
  295. package/dist-server/service/kpi-metric/event-subscriber.js.map +0 -1
  296. package/dist-server/service/kpi-metric/kpi-metric-history.d.ts +0 -25
  297. package/dist-server/service/kpi-metric/kpi-metric-history.js +0 -128
  298. package/dist-server/service/kpi-metric/kpi-metric-history.js.map +0 -1
  299. package/server/service/kpi-formula/event-subscriber.ts +0 -17
  300. package/server/service/kpi-formula/index.ts +0 -9
  301. package/server/service/kpi-formula/kpi-formula-history.ts +0 -116
  302. package/server/service/kpi-formula/kpi-formula-mutation.ts +0 -137
  303. package/server/service/kpi-formula/kpi-formula-query.ts +0 -48
  304. package/server/service/kpi-formula/kpi-formula-type.ts +0 -55
  305. package/server/service/kpi-formula/kpi-formula.ts +0 -95
  306. package/server/service/kpi-grade/event-subscriber.ts +0 -17
  307. package/server/service/kpi-grade/kpi-grade-history.ts +0 -116
  308. package/server/service/kpi-metric/event-subscriber.ts +0 -17
  309. package/server/service/kpi-metric/kpi-metric-history.ts +0 -116
@@ -0,0 +1,78 @@
1
+ import { html, css, LitElement } from 'lit'
2
+ import { customElement, state } from 'lit/decorators.js'
3
+
4
+ @customElement('kpi-value-entry')
5
+ export class KpiValueEntry extends LitElement {
6
+ static styles = css`
7
+ .entry-container {
8
+ background: #fff;
9
+ border-radius: 16px;
10
+ padding: 32px;
11
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
12
+ margin-bottom: 16px;
13
+ }
14
+ .entry-title {
15
+ font-size: 1.5rem;
16
+ font-weight: bold;
17
+ margin-bottom: 16px;
18
+ }
19
+ .entry-form {
20
+ display: flex;
21
+ gap: 12px;
22
+ align-items: center;
23
+ }
24
+ .entry-input {
25
+ padding: 8px 12px;
26
+ border-radius: 8px;
27
+ border: 1px solid #ccc;
28
+ font-size: 1rem;
29
+ width: 120px;
30
+ }
31
+ .entry-btn {
32
+ padding: 8px 20px;
33
+ border-radius: 8px;
34
+ background: #3a3ad6;
35
+ color: #fff;
36
+ border: none;
37
+ font-size: 1rem;
38
+ cursor: pointer;
39
+ transition: background 0.2s;
40
+ }
41
+ .entry-btn:hover {
42
+ background: #2222aa;
43
+ }
44
+ .entry-note {
45
+ font-size: 0.95rem;
46
+ color: #888;
47
+ margin-top: 8px;
48
+ }
49
+ `
50
+
51
+ @state() value = ''
52
+
53
+ render() {
54
+ return html`
55
+ <div class="entry-container">
56
+ <div class="entry-title">KPI 실적 수동입력/자동집계</div>
57
+ <form class="entry-form" @submit=${this.onSubmit}>
58
+ <input
59
+ class="entry-input"
60
+ type="text"
61
+ .value=${this.value}
62
+ @input=${e => (this.value = e.target.value)}
63
+ placeholder="실적값 입력"
64
+ />
65
+ <button class="entry-btn" type="submit">저장</button>
66
+ </form>
67
+ <div class="entry-note">자동집계는 스케줄에 따라 별도 처리됩니다.</div>
68
+ </div>
69
+ `
70
+ }
71
+
72
+ onSubmit(e: Event) {
73
+ e.preventDefault()
74
+ // TODO: 저장 로직 구현
75
+ alert(`입력값: ${this.value}`)
76
+ this.value = ''
77
+ }
78
+ }
@@ -23,7 +23,6 @@ import { KpiGradeImporter } from './kpi-grade-importer'
23
23
 
24
24
  @customElement('kpi-grade-list-page')
25
25
  export class KpiGradeListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {
26
-
27
26
  static styles = [
28
27
  ScrollbarStyles,
29
28
  CommonGristStyles,
@@ -34,8 +33,8 @@ export class KpiGradeListPage extends connect(store)(localize(i18next)(ScopedEle
34
33
 
35
34
  width: 100%;
36
35
 
37
- --grid-record-emphasized-background-color: #8B0000;
38
- --grid-record-emphasized-color: #FF6B6B;
36
+ --grid-record-emphasized-background-color: #8b0000;
37
+ --grid-record-emphasized-color: #ff6b6b;
39
38
  }
40
39
 
41
40
  ox-grist {
@@ -62,7 +61,7 @@ export class KpiGradeListPage extends connect(store)(localize(i18next)(ScopedEle
62
61
 
63
62
  get context() {
64
63
  return {
65
- title: i18next.t('title.kpi-grade list'),
64
+ title: i18next.t('title.kpi grade list'),
66
65
  search: {
67
66
  handler: (search: string) => {
68
67
  this.grist.searchText = search
@@ -88,7 +87,7 @@ export class KpiGradeListPage extends connect(store)(localize(i18next)(ScopedEle
88
87
  }
89
88
  ],
90
89
  exportable: {
91
- name: i18next.t('title.kpi-grade list'),
90
+ name: i18next.t('title.kpi grade list'),
92
91
  data: this.exportHandler.bind(this)
93
92
  },
94
93
  importable: {
@@ -101,11 +100,7 @@ export class KpiGradeListPage extends connect(store)(localize(i18next)(ScopedEle
101
100
  const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')
102
101
 
103
102
  return html`
104
- <ox-grist
105
- .mode=${mode}
106
- .config=${this.gristConfig}
107
- .fetchHandler=${this.fetchHandler.bind(this)}
108
- >
103
+ <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
109
104
  <div slot="headroom" class="header">
110
105
  <div class="filters">
111
106
  <ox-filters-form autofocus without-search></ox-filters-form>
@@ -121,7 +116,6 @@ export class KpiGradeListPage extends connect(store)(localize(i18next)(ScopedEle
121
116
  <md-icon>add</md-icon>
122
117
  </button>
123
118
  </ox-record-creator>
124
-
125
119
  </div>
126
120
  </div>
127
121
  </ox-grist>
@@ -131,64 +125,70 @@ export class KpiGradeListPage extends connect(store)(localize(i18next)(ScopedEle
131
125
  async pageInitialized(lifecycle: any) {
132
126
  this.gristConfig = {
133
127
  list: {
134
- fields: ['name', 'description'],
135
- details: ['active', 'updatedAt']
128
+ fields: [
129
+ 'kpi',
130
+ 'version',
131
+ 'name',
132
+ 'description',
133
+ 'minValue',
134
+ 'maxValue',
135
+ 'score',
136
+ 'color',
137
+ 'active',
138
+ 'createdAt',
139
+ 'updatedAt',
140
+ 'creator',
141
+ 'updater'
142
+ ],
143
+ details: [
144
+ 'kpi',
145
+ 'version',
146
+ 'name',
147
+ 'description',
148
+ 'minValue',
149
+ 'maxValue',
150
+ 'score',
151
+ 'color',
152
+ 'active',
153
+ 'createdAt',
154
+ 'updatedAt',
155
+ 'creator',
156
+ 'updater'
157
+ ]
136
158
  },
137
159
  columns: [
138
160
  { type: 'gutter', gutterName: 'sequence' },
139
161
  { type: 'gutter', gutterName: 'row-selector', multiple: true },
140
162
  {
141
163
  type: 'string',
142
- name: 'name',
143
- header: i18next.t('field.name'),
144
- record: {
145
- editable: true
146
- },
147
- filter: 'search',
148
- sortable: true,
164
+ name: 'kpi',
165
+ header: 'KPI',
166
+ record: { editable: false, renderer: (v, c, r) => r.kpi?.name },
149
167
  width: 150
150
168
  },
169
+ { type: 'number', name: 'version', header: '버전', record: { editable: false }, width: 80 },
170
+ { type: 'string', name: 'name', header: '등급명', record: { editable: true }, width: 120 },
171
+ { type: 'string', name: 'description', header: '설명', record: { editable: true }, width: 200 },
172
+ { type: 'number', name: 'minValue', header: '최소값', record: { editable: true }, width: 100 },
173
+ { type: 'number', name: 'maxValue', header: '최대값', record: { editable: true }, width: 100 },
174
+ { type: 'number', name: 'score', header: '점수', record: { editable: true }, width: 80 },
175
+ { type: 'string', name: 'color', header: '색상', record: { editable: true }, width: 80 },
176
+ { type: 'checkbox', name: 'active', label: true, header: '활성', record: { editable: true }, width: 60 },
177
+ { type: 'datetime', name: 'createdAt', header: '생성일', record: { editable: false }, width: 180 },
178
+ { type: 'datetime', name: 'updatedAt', header: '수정일', record: { editable: false }, width: 180 },
151
179
  {
152
- type: 'string',
153
- name: 'description',
154
- header: i18next.t('field.description'),
155
- record: {
156
- editable: true
157
- },
158
- filter: 'search',
159
- width: 200
160
- },
161
- {
162
- type: 'checkbox',
163
- name: 'active',
164
- label: true,
165
- header: i18next.t('field.active'),
166
- record: {
167
- editable: true
168
- },
169
- filter: true,
170
- sortable: true,
171
- width: 60
180
+ type: 'resource-object',
181
+ name: 'creator',
182
+ header: '생성자',
183
+ record: { editable: false, renderer: (v, c, r) => r.creator?.name },
184
+ width: 120
172
185
  },
173
186
  {
174
187
  type: 'resource-object',
175
188
  name: 'updater',
176
- header: i18next.t('field.updater'),
177
- record: {
178
- editable: false
179
- },
180
- sortable: true,
189
+ header: '수정자',
190
+ record: { editable: false, renderer: (v, c, r) => r.updater?.name },
181
191
  width: 120
182
- },
183
- {
184
- type: 'datetime',
185
- name: 'updatedAt',
186
- header: i18next.t('field.updated_at'),
187
- record: {
188
- editable: false
189
- },
190
- sortable: true,
191
- width: 180
192
192
  }
193
193
  ],
194
194
  rows: {
@@ -197,11 +197,7 @@ export class KpiGradeListPage extends connect(store)(localize(i18next)(ScopedEle
197
197
  multiple: true
198
198
  }
199
199
  },
200
- sorters: [
201
- {
202
- name: 'name'
203
- }
204
- ]
200
+ sorters: [{ name: 'name' }]
205
201
  }
206
202
  }
207
203
 
@@ -355,12 +351,7 @@ export class KpiGradeListPage extends connect(store)(localize(i18next)(ScopedEle
355
351
 
356
352
  async exportHandler() {
357
353
  const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records
358
- const targetFieldSet = new Set([
359
- 'id',
360
- 'name',
361
- 'description',
362
- 'active'
363
- ])
354
+ const targetFieldSet = new Set(['id', 'name', 'description', 'active'])
364
355
 
365
356
  return exportTargets.map(kpiGrade => {
366
357
  let tempObj = {}
@@ -389,10 +380,9 @@ export class KpiGradeListPage extends connect(store)(localize(i18next)(ScopedEle
389
380
  title: i18next.t('title.import kpi-grade')
390
381
  }
391
382
  )
392
-
383
+
393
384
  popup.onclosed = () => {
394
385
  this.grist.fetch()
395
386
  }
396
387
  }
397
388
  }
398
-
@@ -0,0 +1,146 @@
1
+ import '@material/web/icon/icon.js'
2
+ import '@operato/data-grist'
3
+ import { css, html } from 'lit'
4
+ import { customElement, query, state } from 'lit/decorators.js'
5
+ import { DataGrist, FetchOption } from '@operato/data-grist'
6
+ import { client } from '@operato/graphql'
7
+ import { i18next, localize } from '@operato/i18n'
8
+ import { PageView } from '@operato/shell'
9
+ import { gql } from '@apollo/client'
10
+
11
+ const KPI_HISTORY_LIST_QUERY = gql`
12
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
13
+ kpiHistories(params: { filters: $filters, pagination: $pagination, sortings: $sortings }) {
14
+ items {
15
+ id
16
+ kpi {
17
+ name
18
+ }
19
+ version
20
+ state
21
+ createdAt
22
+ updater {
23
+ name
24
+ }
25
+ updatedAt
26
+ }
27
+ total
28
+ }
29
+ }
30
+ `
31
+
32
+ @customElement('kpi-history-list-page')
33
+ export class KpiHistoryListPage extends localize(i18next)(PageView) {
34
+ static styles = css`
35
+ :host {
36
+ display: flex;
37
+ width: 100%;
38
+ background: #f4f6fa;
39
+ min-height: 100vh;
40
+ }
41
+ ox-grist {
42
+ overflow-y: auto;
43
+ flex: 1;
44
+ background: #fff;
45
+ border-radius: 8px;
46
+ margin: 32px auto;
47
+ max-width: 1200px;
48
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
49
+ }
50
+ `
51
+
52
+ @state() gristConfig: any = {
53
+ list: {
54
+ fields: [
55
+ 'kpi',
56
+ 'version',
57
+ 'name',
58
+ 'description',
59
+ 'category',
60
+ 'formula',
61
+ 'active',
62
+ 'state',
63
+ 'createdAt',
64
+ 'updatedAt',
65
+ 'creator',
66
+ 'updater'
67
+ ],
68
+ details: [
69
+ 'kpi',
70
+ 'version',
71
+ 'name',
72
+ 'description',
73
+ 'category',
74
+ 'formula',
75
+ 'active',
76
+ 'state',
77
+ 'createdAt',
78
+ 'updatedAt',
79
+ 'creator',
80
+ 'updater'
81
+ ]
82
+ },
83
+ columns: [
84
+ { type: 'gutter', gutterName: 'sequence', fixed: true },
85
+ { type: 'gutter', gutterName: 'row-selector', multiple: true, fixed: true },
86
+ {
87
+ type: 'string',
88
+ name: 'kpi',
89
+ header: 'KPI',
90
+ record: { editable: false, renderer: (v, c, r) => r.kpi?.name },
91
+ width: 150
92
+ },
93
+ { type: 'number', name: 'version', header: '버전', record: { editable: false }, width: 80 },
94
+ { type: 'string', name: 'name', header: '이름', record: { editable: false }, width: 150 },
95
+ { type: 'string', name: 'description', header: '설명', record: { editable: false }, width: 200 },
96
+ {
97
+ type: 'string',
98
+ name: 'category',
99
+ header: '카테고리',
100
+ record: { editable: false, renderer: (v, c, r) => r.category?.name },
101
+ width: 120
102
+ },
103
+ { type: 'string', name: 'formula', header: '산식', record: { editable: false }, width: 200 },
104
+ { type: 'checkbox', name: 'active', label: true, header: '활성', record: { editable: false }, width: 60 },
105
+ { type: 'string', name: 'state', header: '상태', record: { editable: false }, width: 100 },
106
+ { type: 'datetime', name: 'createdAt', header: '생성일', record: { editable: false }, width: 180 },
107
+ { type: 'datetime', name: 'updatedAt', header: '수정일', record: { editable: false }, width: 180 },
108
+ {
109
+ type: 'resource-object',
110
+ name: 'creator',
111
+ header: '생성자',
112
+ record: { editable: false, renderer: (v, c, r) => r.creator?.name },
113
+ width: 120
114
+ },
115
+ {
116
+ type: 'resource-object',
117
+ name: 'updater',
118
+ header: '수정자',
119
+ record: { editable: false, renderer: (v, c, r) => r.updater?.name },
120
+ width: 120
121
+ }
122
+ ]
123
+ }
124
+
125
+ @query('ox-grist') private grist!: DataGrist
126
+
127
+ render() {
128
+ return html` <ox-grist .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist> `
129
+ }
130
+
131
+ async fetchHandler({ page, limit, sortings = [], filters = [] }: FetchOption) {
132
+ const response = await client.query({
133
+ query: KPI_HISTORY_LIST_QUERY,
134
+ variables: {
135
+ filters,
136
+ pagination: { page, limit },
137
+ sortings
138
+ },
139
+ fetchPolicy: 'network-only'
140
+ })
141
+ return {
142
+ total: response.data.kpiHistories.total || 0,
143
+ records: response.data.kpiHistories.items || []
144
+ }
145
+ }
146
+ }
@@ -23,7 +23,6 @@ import { KpiMetricImporter } from './kpi-metric-importer'
23
23
 
24
24
  @customElement('kpi-metric-list-page')
25
25
  export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {
26
-
27
26
  static styles = [
28
27
  ScrollbarStyles,
29
28
  CommonGristStyles,
@@ -34,8 +33,8 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
34
33
 
35
34
  width: 100%;
36
35
 
37
- --grid-record-emphasized-background-color: #8B0000;
38
- --grid-record-emphasized-color: #FF6B6B;
36
+ --grid-record-emphasized-background-color: #8b0000;
37
+ --grid-record-emphasized-color: #ff6b6b;
39
38
  }
40
39
 
41
40
  ox-grist {
@@ -62,7 +61,7 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
62
61
 
63
62
  get context() {
64
63
  return {
65
- title: i18next.t('title.kpi-metric list'),
64
+ title: i18next.t('title.kpi metric list'),
66
65
  search: {
67
66
  handler: (search: string) => {
68
67
  this.grist.searchText = search
@@ -88,7 +87,7 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
88
87
  }
89
88
  ],
90
89
  exportable: {
91
- name: i18next.t('title.kpi-metric list'),
90
+ name: i18next.t('title.kpi metric list'),
92
91
  data: this.exportHandler.bind(this)
93
92
  },
94
93
  importable: {
@@ -101,11 +100,7 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
101
100
  const mode = this.mode || (isMobileDevice() ? 'CARD' : 'GRID')
102
101
 
103
102
  return html`
104
- <ox-grist
105
- .mode=${mode}
106
- .config=${this.gristConfig}
107
- .fetchHandler=${this.fetchHandler.bind(this)}
108
- >
103
+ <ox-grist .mode=${mode} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
109
104
  <div slot="headroom" class="header">
110
105
  <div class="filters">
111
106
  <ox-filters-form autofocus without-search></ox-filters-form>
@@ -121,7 +116,6 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
121
116
  <md-icon>add</md-icon>
122
117
  </button>
123
118
  </ox-record-creator>
124
-
125
119
  </div>
126
120
  </div>
127
121
  </ox-grist>
@@ -131,8 +125,40 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
131
125
  async pageInitialized(lifecycle: any) {
132
126
  this.gristConfig = {
133
127
  list: {
134
- fields: ['name', 'description'],
135
- details: ['active', 'updatedAt']
128
+ fields: [
129
+ 'name',
130
+ 'description',
131
+ 'unit',
132
+ 'source',
133
+ 'dataSet',
134
+ 'fieldName',
135
+ 'formula',
136
+ 'active',
137
+ 'schedule',
138
+ 'scheduleId',
139
+ 'timezone',
140
+ 'createdAt',
141
+ 'updatedAt',
142
+ 'creator',
143
+ 'updater'
144
+ ],
145
+ details: [
146
+ 'name',
147
+ 'description',
148
+ 'unit',
149
+ 'source',
150
+ 'dataSet',
151
+ 'fieldName',
152
+ 'formula',
153
+ 'active',
154
+ 'schedule',
155
+ 'scheduleId',
156
+ 'timezone',
157
+ 'createdAt',
158
+ 'updatedAt',
159
+ 'creator',
160
+ 'updater'
161
+ ]
136
162
  },
137
163
  columns: [
138
164
  { type: 'gutter', gutterName: 'sequence' },
@@ -140,55 +166,43 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
140
166
  {
141
167
  type: 'string',
142
168
  name: 'name',
143
- header: i18next.t('field.name'),
144
- record: {
145
- editable: true
146
- },
169
+ header: '코드',
170
+ record: { editable: true },
147
171
  filter: 'search',
148
172
  sortable: true,
149
- width: 150
173
+ width: 120
150
174
  },
175
+ { type: 'string', name: 'description', header: '설명', record: { editable: true }, width: 200 },
176
+ { type: 'string', name: 'unit', header: '단위', record: { editable: true }, width: 80 },
177
+ { type: 'string', name: 'source', header: '데이터출처', record: { editable: true }, width: 120 },
151
178
  {
152
179
  type: 'string',
153
- name: 'description',
154
- header: i18next.t('field.description'),
155
- record: {
156
- editable: true
157
- },
158
- filter: 'search',
159
- width: 200
180
+ name: 'dataSet',
181
+ header: '데이터셋',
182
+ record: { editable: false, renderer: (v, c, r) => r.dataSet?.name },
183
+ width: 120
160
184
  },
185
+ { type: 'string', name: 'fieldName', header: '필드명', record: { editable: true }, width: 120 },
186
+ { type: 'string', name: 'formula', header: '산식', record: { editable: true }, width: 200 },
187
+ { type: 'checkbox', name: 'active', label: true, header: '활성', record: { editable: true }, width: 60 },
188
+ { type: 'string', name: 'schedule', header: '스케줄', record: { editable: true }, width: 120 },
189
+ { type: 'string', name: 'scheduleId', header: '스케줄ID', record: { editable: false }, width: 120 },
190
+ { type: 'string', name: 'timezone', header: '타임존', record: { editable: true }, width: 100 },
191
+ { type: 'datetime', name: 'createdAt', header: '생성일', record: { editable: false }, width: 180 },
192
+ { type: 'datetime', name: 'updatedAt', header: '수정일', record: { editable: false }, width: 180 },
161
193
  {
162
- type: 'checkbox',
163
- name: 'active',
164
- label: true,
165
- header: i18next.t('field.active'),
166
- record: {
167
- editable: true
168
- },
169
- filter: true,
170
- sortable: true,
171
- width: 60
194
+ type: 'resource-object',
195
+ name: 'creator',
196
+ header: '생성자',
197
+ record: { editable: false, renderer: (v, c, r) => r.creator?.name },
198
+ width: 120
172
199
  },
173
200
  {
174
201
  type: 'resource-object',
175
202
  name: 'updater',
176
- header: i18next.t('field.updater'),
177
- record: {
178
- editable: false
179
- },
180
- sortable: true,
203
+ header: '수정자',
204
+ record: { editable: false, renderer: (v, c, r) => r.updater?.name },
181
205
  width: 120
182
- },
183
- {
184
- type: 'datetime',
185
- name: 'updatedAt',
186
- header: i18next.t('field.updated_at'),
187
- record: {
188
- editable: false
189
- },
190
- sortable: true,
191
- width: 180
192
206
  }
193
207
  ],
194
208
  rows: {
@@ -197,11 +211,7 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
197
211
  multiple: true
198
212
  }
199
213
  },
200
- sorters: [
201
- {
202
- name: 'name'
203
- }
204
- ]
214
+ sorters: [{ name: 'name' }]
205
215
  }
206
216
  }
207
217
 
@@ -355,12 +365,7 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
355
365
 
356
366
  async exportHandler() {
357
367
  const exportTargets = this.grist.selected.length ? this.grist.selected : this.grist.dirtyData.records
358
- const targetFieldSet = new Set([
359
- 'id',
360
- 'name',
361
- 'description',
362
- 'active'
363
- ])
368
+ const targetFieldSet = new Set(['id', 'name', 'description', 'active'])
364
369
 
365
370
  return exportTargets.map(kpiMetric => {
366
371
  let tempObj = {}
@@ -389,10 +394,9 @@ export class KpiMetricListPage extends connect(store)(localize(i18next)(ScopedEl
389
394
  title: i18next.t('title.import kpi-metric')
390
395
  }
391
396
  )
392
-
397
+
393
398
  popup.onclosed = () => {
394
399
  this.grist.fetch()
395
400
  }
396
401
  }
397
402
  }
398
-