@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
@@ -23,7 +23,6 @@ import { KpiValueImporter } from './kpi-value-importer'
23
23
 
24
24
  @customElement('kpi-value-list-page')
25
25
  export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedElementsMixin(PageView))) {
26
-
27
26
  static styles = [
28
27
  ScrollbarStyles,
29
28
  CommonGristStyles,
@@ -34,8 +33,8 @@ export class KpiValueListPage 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 KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
62
61
 
63
62
  get context() {
64
63
  return {
65
- title: i18next.t('title.kpi-value list'),
64
+ title: i18next.t('title.kpi value list'),
66
65
  search: {
67
66
  handler: (search: string) => {
68
67
  this.grist.searchText = search
@@ -88,7 +87,7 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
88
87
  }
89
88
  ],
90
89
  exportable: {
91
- name: i18next.t('title.kpi-value list'),
90
+ name: i18next.t('title.kpi value list'),
92
91
  data: this.exportHandler.bind(this)
93
92
  },
94
93
  importable: {
@@ -101,11 +100,7 @@ export class KpiValueListPage 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 KpiValueListPage 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 KpiValueListPage 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
+ 'valueDate',
132
+ 'value',
133
+ 'groupId',
134
+ 'groupType',
135
+ 'inputType',
136
+ 'source',
137
+ 'meta',
138
+ 'createdAt',
139
+ 'updatedAt',
140
+ 'creator',
141
+ 'updater'
142
+ ],
143
+ details: [
144
+ 'kpi',
145
+ 'version',
146
+ 'valueDate',
147
+ 'value',
148
+ 'groupId',
149
+ 'groupType',
150
+ 'inputType',
151
+ 'source',
152
+ 'meta',
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: 'date', name: 'valueDate', header: '실적일', record: { editable: true }, width: 120 },
171
+ { type: 'number', name: 'value', header: '실적값', record: { editable: true }, width: 120 },
172
+ { type: 'string', name: 'groupId', header: '그룹ID', record: { editable: false }, width: 120 },
173
+ { type: 'string', name: 'groupType', header: '그룹유형', record: { editable: false }, width: 100 },
174
+ { type: 'string', name: 'inputType', header: '입력방식', record: { editable: false }, width: 100 },
175
+ { type: 'string', name: 'source', header: '수집출처', record: { editable: false }, width: 120 },
176
+ { type: 'object', name: 'meta', header: '메타', record: { editable: false }, width: 120 },
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 KpiValueListPage 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: 'valueDate' }]
205
201
  }
206
202
  }
207
203
 
@@ -218,9 +214,13 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
218
214
  responses: kpiValues(filters: $filters, pagination: $pagination, sortings: $sortings) {
219
215
  items {
220
216
  id
221
- name
222
- description
223
- active
217
+ kpi {
218
+ id
219
+ name
220
+ }
221
+ version
222
+ valueDate
223
+ value
224
224
  updater {
225
225
  id
226
226
  name
@@ -294,7 +294,14 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
294
294
  mutation: gql`
295
295
  mutation ($patches: [KpiValuePatch!]!) {
296
296
  updateMultipleKpiValue(patches: $patches) {
297
- name
297
+ id
298
+ kpi {
299
+ id
300
+ name
301
+ }
302
+ version
303
+ valueDate
304
+ value
298
305
  }
299
306
  }
300
307
  `,
@@ -355,12 +362,7 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
355
362
 
356
363
  async exportHandler() {
357
364
  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
- ])
365
+ const targetFieldSet = new Set(['id', 'name', 'description', 'active'])
364
366
 
365
367
  return exportTargets.map(kpiValue => {
366
368
  let tempObj = {}
@@ -389,10 +391,9 @@ export class KpiValueListPage extends connect(store)(localize(i18next)(ScopedEle
389
391
  title: i18next.t('title.import kpi-value')
390
392
  }
391
393
  )
392
-
394
+
393
395
  popup.onclosed = () => {
394
396
  this.grist.fetch()
395
397
  }
396
398
  }
397
399
  }
398
-
@@ -0,0 +1,168 @@
1
+ import '@material/web/icon/icon.js'
2
+
3
+ import { html, LitElement, css } from 'lit'
4
+ import { customElement, property, state } from 'lit/decorators.js'
5
+ import { client } from '@operato/graphql'
6
+ import { notify } from '@operato/layout'
7
+ import gql from 'graphql-tag'
8
+ import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'
9
+
10
+ @customElement('kpi-value-manual-entry-form')
11
+ export class KpiValueManualEntryForm extends LitElement {
12
+ static styles = [
13
+ CommonHeaderStyles,
14
+ ScrollbarStyles,
15
+ css`
16
+ :host {
17
+ display: flex;
18
+ flex-direction: column;
19
+ background-color: var(--md-sys-color-surface, #f4f6fa);
20
+ }
21
+ .form-card {
22
+ flex: 1;
23
+ display: flex;
24
+ flex-direction: column;
25
+ padding: 32px 32px 0 32px;
26
+ background: #fff;
27
+ }
28
+ label {
29
+ font-weight: 500;
30
+ margin-bottom: 4px;
31
+ display: flex;
32
+ flex-direction: column;
33
+ gap: 2px;
34
+ }
35
+ input,
36
+ textarea {
37
+ font-size: 1em;
38
+ padding: 6px 8px;
39
+ border: 1px solid #ccc;
40
+ margin-top: 2px;
41
+ resize: none;
42
+ }
43
+
44
+ .desc {
45
+ font-size: 0.95em;
46
+ color: #888;
47
+ margin-top: 8px;
48
+ }
49
+
50
+ .footer span {
51
+ font-size: 0.8em;
52
+ color: var(--md-sys-color-on-surface);
53
+ line-height: 1.5;
54
+ padding: 10px;
55
+ }
56
+ `
57
+ ]
58
+
59
+ @property({ type: Object }) kpi: any
60
+ @state() valueDate = new Date().toISOString().slice(0, 10)
61
+ @state() value = ''
62
+ @state() groupId = ''
63
+ @state() groupType = ''
64
+ @state() meta = ''
65
+ @state() loading = false
66
+
67
+ render() {
68
+ return html`
69
+ <form style="display:flex;flex-direction:column;height:100%;">
70
+ <div class="form-card">
71
+ <div style="font-size:1.1em;font-weight:bold;margin-bottom:16px;"><b>KPI:</b> ${this.kpi?.name}</div>
72
+ <label>
73
+ 실적일자
74
+ <input type="date" .value=${this.valueDate} @input=${e => (this.valueDate = e.target.value)} required />
75
+ </label>
76
+ <label>
77
+ 실적값
78
+ <input type="number" .value=${this.value} @input=${e => (this.value = e.target.value)} required />
79
+ </label>
80
+ <label>
81
+ 그룹ID (선택)
82
+ <input type="text" .value=${this.groupId} @input=${e => (this.groupId = e.target.value)} />
83
+ </label>
84
+ <label>
85
+ 그룹유형 (선택)
86
+ <input type="text" .value=${this.groupType} @input=${e => (this.groupType = e.target.value)} />
87
+ </label>
88
+ <label>
89
+ 메타정보 (선택, JSON)
90
+ <textarea .value=${this.meta} @input=${e => (this.meta = e.target.value)}></textarea>
91
+ </label>
92
+ <div class="desc">입력방식: MANUAL, Source: MANUAL (자동 지정)</div>
93
+ </div>
94
+ </form>
95
+ <div class="footer">
96
+ <div filler></div>
97
+ <button type="button" ?disabled=${this.loading} done @click=${this.save}><md-icon>save</md-icon>저장</button>
98
+ </div>
99
+ `
100
+ }
101
+
102
+ async save() {
103
+ this.loading = true
104
+ let parsedMeta = undefined
105
+ if (this.meta) {
106
+ try {
107
+ parsedMeta = JSON.parse(this.meta)
108
+ } catch (err) {
109
+ notify({ message: '메타정보는 올바른 JSON이어야 합니다.', level: 'error' })
110
+ this.loading = false
111
+ return
112
+ }
113
+ }
114
+ try {
115
+ await client.mutate({
116
+ mutation: gql`
117
+ mutation (
118
+ $kpiId: ID!
119
+ $valueDate: String!
120
+ $value: Float!
121
+ $groupId: String
122
+ $groupType: String
123
+ $meta: Object
124
+ ) {
125
+ createKpiValue(
126
+ kpiValue: {
127
+ kpiId: $kpiId
128
+ valueDate: $valueDate
129
+ value: $value
130
+ version: 1
131
+ groupId: $groupId
132
+ groupType: $groupType
133
+ inputType: MANUAL
134
+ source: "MANUAL"
135
+ meta: $meta
136
+ }
137
+ ) {
138
+ id
139
+ }
140
+ }
141
+ `,
142
+ variables: {
143
+ kpiId: this.kpi.id,
144
+ valueDate: this.valueDate,
145
+ value: parseFloat(this.value),
146
+ groupId: this.groupId || undefined,
147
+ groupType: this.groupType || undefined,
148
+ meta: parsedMeta
149
+ }
150
+ })
151
+ notify({ message: '실적값이 저장되었습니다.' })
152
+ this.dispatchEvent(new CustomEvent('saved', { bubbles: true, composed: true }))
153
+ // 팝업 닫기 로직
154
+ let el: any = this.parentElement
155
+ while (el) {
156
+ if (typeof el.close === 'function') {
157
+ el.close()
158
+ break
159
+ }
160
+ el = el.parentElement
161
+ }
162
+ } catch (err: any) {
163
+ notify({ message: '저장 실패: ' + (err?.message || err), level: 'error' })
164
+ } finally {
165
+ this.loading = false
166
+ }
167
+ }
168
+ }
@@ -0,0 +1,173 @@
1
+ import '@material/web/icon/icon.js'
2
+ import '@operato/data-grist'
3
+ import './kpi-value-manual-entry-form.js'
4
+
5
+ import { css, html } from 'lit'
6
+ import { customElement, property, query, state } from 'lit/decorators.js'
7
+ import { connect } from 'pwa-helpers/connect-mixin'
8
+ import { DataGrist } from '@operato/data-grist'
9
+ import { client } from '@operato/graphql'
10
+ import { i18next, localize } from '@operato/i18n'
11
+ import { openPopup, notify } from '@operato/layout'
12
+ import { PageView, store } from '@operato/shell'
13
+ import { CommonHeaderStyles, ScrollbarStyles } from '@operato/styles'
14
+ import gql from 'graphql-tag'
15
+
16
+ @customElement('kpi-value-manual-entry-page')
17
+ export class KpiValueManualEntryPage extends connect(store)(localize(i18next)(PageView)) {
18
+ static styles = [
19
+ ScrollbarStyles,
20
+ CommonHeaderStyles,
21
+ css`
22
+ :host {
23
+ display: flex;
24
+ width: 100%;
25
+ }
26
+ ox-grist {
27
+ overflow-y: auto;
28
+ flex: 1;
29
+ }
30
+ `
31
+ ]
32
+
33
+ get context() {
34
+ return {
35
+ title: i18next.t('title.kpi value manual entry'),
36
+ search: {
37
+ handler: (search: string) => {
38
+ this.grist.searchText = search
39
+ },
40
+ value: this.grist.searchText
41
+ },
42
+ filter: {
43
+ handler: () => {
44
+ this.grist.toggleHeadroom()
45
+ }
46
+ },
47
+ help: 'kpi/kpi-value'
48
+ }
49
+ }
50
+
51
+ @state() private gristConfig: any
52
+ @state() private kpis: any[] = []
53
+ @query('ox-grist') private grist!: DataGrist
54
+
55
+ render() {
56
+ return html`
57
+ <ox-grist mode="CARD" .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}></ox-grist>
58
+ `
59
+ }
60
+
61
+ async pageInitialized() {
62
+ this.gristConfig = {
63
+ list: {
64
+ fields: ['name', 'description'],
65
+ details: ['category', 'active']
66
+ },
67
+ columns: [
68
+ {
69
+ type: 'gutter',
70
+ gutterName: 'button',
71
+ icon: 'note_alt',
72
+ iconOnly: false,
73
+ width: 96,
74
+ fixed: true,
75
+ title: () => i18next.t('button.enter-kpi-value'),
76
+ handlers: {
77
+ click: (columns, data, column, record, rowIndex) => {
78
+ this.openManualEntryForm(record)
79
+ }
80
+ }
81
+ },
82
+ {
83
+ type: 'string',
84
+ name: 'name',
85
+ header: i18next.t('field.name'),
86
+ record: { editable: false },
87
+ filter: 'search',
88
+ sortable: true,
89
+ width: 150
90
+ },
91
+ {
92
+ type: 'string',
93
+ name: 'description',
94
+ header: i18next.t('field.description'),
95
+ record: { editable: false },
96
+ width: 200
97
+ },
98
+ {
99
+ type: 'string',
100
+ name: 'category',
101
+ header: i18next.t('field.category'),
102
+ record: { editable: false, renderer: (v, c, r) => r.category?.name },
103
+ width: 120
104
+ },
105
+ {
106
+ type: 'checkbox',
107
+ name: 'active',
108
+ label: true,
109
+ header: 'Active',
110
+ record: { editable: false },
111
+ width: 60
112
+ }
113
+ ],
114
+ rows: {
115
+ appendable: false,
116
+ editable: false,
117
+ selectable: {
118
+ multiple: false
119
+ },
120
+ classifier: function (record, rowIndex) {}
121
+ },
122
+ sorters: [
123
+ {
124
+ name: 'name'
125
+ }
126
+ ]
127
+ }
128
+ }
129
+
130
+ async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [] }) {
131
+ const response = await client.query({
132
+ query: gql`
133
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!]) {
134
+ responses: kpis(filters: $filters, pagination: $pagination, sortings: $sortings) {
135
+ items {
136
+ id
137
+ name
138
+ description
139
+ active
140
+ category {
141
+ id
142
+ name
143
+ }
144
+ }
145
+ total
146
+ }
147
+ }
148
+ `,
149
+ variables: {
150
+ filters,
151
+ pagination: { page, limit },
152
+ sortings
153
+ }
154
+ })
155
+ return {
156
+ total: response.data.responses.total || 0,
157
+ records: response.data.responses.items || []
158
+ }
159
+ }
160
+
161
+ openManualEntryForm(kpi) {
162
+ openPopup(
163
+ html`
164
+ <kpi-value-manual-entry-form .kpi=${kpi} @saved=${() => this.grist.fetch()}></kpi-value-manual-entry-form>
165
+ `,
166
+ {
167
+ backdrop: true,
168
+ size: 'medium',
169
+ title: `${kpi.name} - KPI 실적 수동 입력`
170
+ }
171
+ )
172
+ }
173
+ }
package/client/route.ts CHANGED
@@ -1,4 +1,39 @@
1
1
  export default function route(page: string) {
2
2
  switch (page) {
3
+ case 'kpi-overview':
4
+ import('./pages/kpi/kpi-overview')
5
+ return page
6
+
7
+ case 'kpi-dashboard':
8
+ import('./pages/kpi-dashboard/kpi-dashboard')
9
+ return page
10
+
11
+ case 'kpi-list':
12
+ import('./pages/kpi/kpi-list-page')
13
+ return page
14
+
15
+ case 'kpi-category-list':
16
+ import('./pages/kpi-category/kpi-category-list-page')
17
+ return page
18
+
19
+ case 'kpi-metric-list':
20
+ import('./pages/kpi-metric/kpi-metric-list-page')
21
+ return page
22
+
23
+ case 'kpi-value-list':
24
+ import('./pages/kpi-value/kpi-value-list-page')
25
+ return page
26
+
27
+ case 'kpi-value-manual-entry':
28
+ import('./pages/kpi-value/kpi-value-manual-entry-page')
29
+ return page
30
+
31
+ case 'kpi-grade-list':
32
+ import('./pages/kpi-grade/kpi-grade-list-page')
33
+ return page
34
+
35
+ case 'kpi-history-list':
36
+ import('./pages/kpi-history/kpi-history-list-page')
37
+ return page
3
38
  }
4
39
  }
@@ -37,6 +37,21 @@ export class KpiImporter extends LitElement {
37
37
  ]
38
38
  };
39
39
  }
40
+ static { this.styles = [
41
+ ButtonContainerStyles,
42
+ css `
43
+ :host {
44
+ display: flex;
45
+ flex-direction: column;
46
+
47
+ background-color: #fff;
48
+ }
49
+
50
+ ox-grist {
51
+ flex: 1;
52
+ }
53
+ `
54
+ ]; }
40
55
  render() {
41
56
  return html `
42
57
  <ox-grist
@@ -53,7 +68,6 @@ export class KpiImporter extends LitElement {
53
68
  `;
54
69
  }
55
70
  async save() {
56
- var _a;
57
71
  const response = await client.mutate({
58
72
  mutation: gql `
59
73
  mutation importKpis($kpis: [KpiPatch!]!) {
@@ -62,26 +76,11 @@ export class KpiImporter extends LitElement {
62
76
  `,
63
77
  variables: { kpis: this.kpis }
64
78
  });
65
- if ((_a = response.errors) === null || _a === void 0 ? void 0 : _a.length)
79
+ if (response.errors?.length)
66
80
  return;
67
81
  this.dispatchEvent(new CustomEvent('imported'));
68
82
  }
69
83
  }
70
- KpiImporter.styles = [
71
- ButtonContainerStyles,
72
- css `
73
- :host {
74
- display: flex;
75
- flex-direction: column;
76
-
77
- background-color: #fff;
78
- }
79
-
80
- ox-grist {
81
- flex: 1;
82
- }
83
- `
84
- ];
85
84
  __decorate([
86
85
  property({ type: Array }),
87
86
  __metadata("design:type", Array)
@@ -1 +1 @@
1
- {"version":3,"file":"kpi-importer.js","sourceRoot":"","sources":["../../../client/pages/kpi/kpi-importer.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,qBAAqB,CAAA;AAE5B,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,MAAM,OAAO,WAAY,SAAQ,UAAU;IAA3C;;QAiB6B,SAAI,GAAU,EAAE,CAAA;QACf,YAAO,GAAG;YACpC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE;YACzC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC9B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACtC,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;oBACjC,KAAK,EAAE,EAAE;iBACV;aACF;SACF,CAAA;IAmCH,CAAC;IAhCC,MAAM;QACJ,OAAO,IAAI,CAAA;;gBAEC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;kBAChC,IAAI,CAAC,OAAO;gBAEpB;YACE,OAAO,EAAE,IAAI,CAAC,IAAI;SAEtB;;;;0BAIkB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;;KAE7F,CAAA;IACH,CAAC;IAED,KAAK,CAAC,IAAI;;QACR,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;;;OAIZ;YACD,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;SAC/B,CAAC,CAAA;QAEF,IAAI,MAAA,QAAQ,CAAC,MAAM,0CAAE,MAAM;YAAE,OAAM;QAEnC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC,CAAA;IACjD,CAAC;;AA1EM,kBAAM,GAAG;IACd,qBAAqB;IACrB,GAAG,CAAA;;;;;;;;;;;KAWF;CACF,AAdY,CAcZ;AAE0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;yCAAiB;AACf;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4CAuB1B","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/data-grist'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { property } from 'lit/decorators.js'\n\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { isMobileDevice } from '@operato/utils'\nimport { ButtonContainerStyles } from '@operato/styles'\n\nexport class KpiImporter extends LitElement {\n static styles = [\n ButtonContainerStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: #fff;\n }\n\n ox-grist {\n flex: 1;\n }\n `\n ]\n\n @property({ type: Array }) kpis: any[] = []\n @property({ type: Object }) columns = {\n list: { fields: ['name', 'description'] },\n pagination: { infinite: true },\n columns: [\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n width: 150\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n width: 200\n },\n {\n type: 'checkbox',\n name: 'active',\n header: i18next.t('field.active'),\n width: 60\n }\n ]\n }\n\n\n render() {\n return html`\n <ox-grist\n .mode=${isMobileDevice() ? 'LIST' : 'GRID'}\n .config=${this.columns}\n .data=${\n { \n records: this.kpis \n }\n }\n ></ox-grist>\n\n <div class=\"button-container\">\n <button @click=\"${this.save.bind(this)}\"><md-icon>save</md-icon>${i18next.t('button.save')}</button>\n </div>\n `\n }\n\n async save() {\n const response = await client.mutate({\n mutation: gql`\n mutation importKpis($kpis: [KpiPatch!]!) {\n importKpis(kpis: $kpis)\n }\n `,\n variables: { kpis: this.kpis }\n })\n\n if (response.errors?.length) return\n\n this.dispatchEvent(new CustomEvent('imported'))\n }\n}\n\n"]}
1
+ {"version":3,"file":"kpi-importer.js","sourceRoot":"","sources":["../../../client/pages/kpi/kpi-importer.ts"],"names":[],"mappings":";AAAA,OAAO,4BAA4B,CAAA;AACnC,OAAO,qBAAqB,CAAA;AAE5B,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAEvD,MAAM,OAAO,WAAY,SAAQ,UAAU;IAA3C;;QAiB6B,SAAI,GAAU,EAAE,CAAA;QACf,YAAO,GAAG;YACpC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE;YACzC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC9B,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;oBAC/B,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,aAAa;oBACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC;oBACtC,KAAK,EAAE,GAAG;iBACX;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,QAAQ;oBACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC;oBACjC,KAAK,EAAE,EAAE;iBACV;aACF;SACF,CAAA;IAmCH,CAAC;aA3EQ,WAAM,GAAG;QACd,qBAAqB;QACrB,GAAG,CAAA;;;;;;;;;;;KAWF;KACF,AAdY,CAcZ;IA6BD,MAAM;QACJ,OAAO,IAAI,CAAA;;gBAEC,cAAc,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;kBAChC,IAAI,CAAC,OAAO;gBAEpB;YACE,OAAO,EAAE,IAAI,CAAC,IAAI;SAEtB;;;;0BAIkB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,4BAA4B,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC;;KAE7F,CAAA;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,GAAG,CAAA;;;;OAIZ;YACD,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;SAC/B,CAAC,CAAA;QAEF,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM;YAAE,OAAM;QAEnC,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,CAAC,CAAA;IACjD,CAAC;;AA1D0B;IAA1B,QAAQ,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;;yCAAiB;AACf;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;4CAuB1B","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@operato/data-grist'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { property } from 'lit/decorators.js'\n\nimport { client } from '@operato/graphql'\nimport { i18next } from '@operato/i18n'\nimport { isMobileDevice } from '@operato/utils'\nimport { ButtonContainerStyles } from '@operato/styles'\n\nexport class KpiImporter extends LitElement {\n static styles = [\n ButtonContainerStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: #fff;\n }\n\n ox-grist {\n flex: 1;\n }\n `\n ]\n\n @property({ type: Array }) kpis: any[] = []\n @property({ type: Object }) columns = {\n list: { fields: ['name', 'description'] },\n pagination: { infinite: true },\n columns: [\n {\n type: 'string',\n name: 'name',\n header: i18next.t('field.name'),\n width: 150\n },\n {\n type: 'string',\n name: 'description',\n header: i18next.t('field.description'),\n width: 200\n },\n {\n type: 'checkbox',\n name: 'active',\n header: i18next.t('field.active'),\n width: 60\n }\n ]\n }\n\n\n render() {\n return html`\n <ox-grist\n .mode=${isMobileDevice() ? 'LIST' : 'GRID'}\n .config=${this.columns}\n .data=${\n { \n records: this.kpis \n }\n }\n ></ox-grist>\n\n <div class=\"button-container\">\n <button @click=\"${this.save.bind(this)}\"><md-icon>save</md-icon>${i18next.t('button.save')}</button>\n </div>\n `\n }\n\n async save() {\n const response = await client.mutate({\n mutation: gql`\n mutation importKpis($kpis: [KpiPatch!]!) {\n importKpis(kpis: $kpis)\n }\n `,\n variables: { kpis: this.kpis }\n })\n\n if (response.errors?.length) return\n\n this.dispatchEvent(new CustomEvent('imported'))\n }\n}\n\n"]}