@things-factory/compliance 0.0.0-stage → 10.1.255

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 (356) hide show
  1. package/dist-client/bootstrap.d.ts +2 -0
  2. package/dist-client/bootstrap.js +28 -0
  3. package/dist-client/bootstrap.js.map +1 -0
  4. package/dist-client/components/compliance-case-form.d.ts +42 -0
  5. package/dist-client/components/compliance-case-form.js +313 -0
  6. package/dist-client/components/compliance-case-form.js.map +1 -0
  7. package/dist-client/components/compliance-case-sheet.d.ts +35 -0
  8. package/dist-client/components/compliance-case-sheet.js +335 -0
  9. package/dist-client/components/compliance-case-sheet.js.map +1 -0
  10. package/dist-client/components/compliance-my-inventions.d.ts +17 -0
  11. package/dist-client/components/compliance-my-inventions.js +133 -0
  12. package/dist-client/components/compliance-my-inventions.js.map +1 -0
  13. package/dist-client/components/compliance-my-privacy-requests.d.ts +34 -0
  14. package/dist-client/components/compliance-my-privacy-requests.js +232 -0
  15. package/dist-client/components/compliance-my-privacy-requests.js.map +1 -0
  16. package/dist-client/components/compliance-my-reports.d.ts +19 -0
  17. package/dist-client/components/compliance-my-reports.js +137 -0
  18. package/dist-client/components/compliance-my-reports.js.map +1 -0
  19. package/dist-client/components/guide-link.d.ts +13 -0
  20. package/dist-client/components/guide-link.js +55 -0
  21. package/dist-client/components/guide-link.js.map +1 -0
  22. package/dist-client/components/invention-report-form.d.ts +30 -0
  23. package/dist-client/components/invention-report-form.js +188 -0
  24. package/dist-client/components/invention-report-form.js.map +1 -0
  25. package/dist-client/components/legal-todo.d.ts +10 -0
  26. package/dist-client/components/legal-todo.js +43 -0
  27. package/dist-client/components/legal-todo.js.map +1 -0
  28. package/dist-client/components/my-trainings.d.ts +18 -0
  29. package/dist-client/components/my-trainings.js +149 -0
  30. package/dist-client/components/my-trainings.js.map +1 -0
  31. package/dist-client/components/regulation-form.d.ts +26 -0
  32. package/dist-client/components/regulation-form.js +161 -0
  33. package/dist-client/components/regulation-form.js.map +1 -0
  34. package/dist-client/components/seal-use-form.d.ts +47 -0
  35. package/dist-client/components/seal-use-form.js +300 -0
  36. package/dist-client/components/seal-use-form.js.map +1 -0
  37. package/dist-client/components/training-attendance-form.d.ts +37 -0
  38. package/dist-client/components/training-attendance-form.js +186 -0
  39. package/dist-client/components/training-attendance-form.js.map +1 -0
  40. package/dist-client/components/training-certificate-form.d.ts +41 -0
  41. package/dist-client/components/training-certificate-form.js +198 -0
  42. package/dist-client/components/training-certificate-form.js.map +1 -0
  43. package/dist-client/components/training-session-form.d.ts +39 -0
  44. package/dist-client/components/training-session-form.js +270 -0
  45. package/dist-client/components/training-session-form.js.map +1 -0
  46. package/dist-client/components/training-setting-form.d.ts +45 -0
  47. package/dist-client/components/training-setting-form.js +175 -0
  48. package/dist-client/components/training-setting-form.js.map +1 -0
  49. package/dist-client/index.d.ts +4 -0
  50. package/dist-client/index.js +8 -0
  51. package/dist-client/index.js.map +1 -0
  52. package/dist-client/legal-record/dispute-calendar-source.d.ts +1 -0
  53. package/dist-client/legal-record/dispute-calendar-source.js +51 -0
  54. package/dist-client/legal-record/dispute-calendar-source.js.map +1 -0
  55. package/dist-client/legal-record/legal-child-grid.d.ts +31 -0
  56. package/dist-client/legal-record/legal-child-grid.js +76 -0
  57. package/dist-client/legal-record/legal-child-grid.js.map +1 -0
  58. package/dist-client/legal-record/legal-codes.d.ts +3 -0
  59. package/dist-client/legal-record/legal-codes.js +5 -0
  60. package/dist-client/legal-record/legal-codes.js.map +1 -0
  61. package/dist-client/legal-record/legal-grid.d.ts +59 -0
  62. package/dist-client/legal-record/legal-grid.js +68 -0
  63. package/dist-client/legal-record/legal-grid.js.map +1 -0
  64. package/dist-client/legal-record/legal-record-files.d.ts +26 -0
  65. package/dist-client/legal-record/legal-record-files.js +162 -0
  66. package/dist-client/legal-record/legal-record-files.js.map +1 -0
  67. package/dist-client/pages/compliance-case-list.d.ts +35 -0
  68. package/dist-client/pages/compliance-case-list.js +112 -0
  69. package/dist-client/pages/compliance-case-list.js.map +1 -0
  70. package/dist-client/pages/dispute-list.d.ts +57 -0
  71. package/dist-client/pages/dispute-list.js +156 -0
  72. package/dist-client/pages/dispute-list.js.map +1 -0
  73. package/dist-client/pages/invention-list.d.ts +57 -0
  74. package/dist-client/pages/invention-list.js +166 -0
  75. package/dist-client/pages/invention-list.js.map +1 -0
  76. package/dist-client/pages/legal-registration-list.d.ts +63 -0
  77. package/dist-client/pages/legal-registration-list.js +206 -0
  78. package/dist-client/pages/legal-registration-list.js.map +1 -0
  79. package/dist-client/pages/privacy-record-list.d.ts +52 -0
  80. package/dist-client/pages/privacy-record-list.js +225 -0
  81. package/dist-client/pages/privacy-record-list.js.map +1 -0
  82. package/dist-client/pages/regulation-detail.d.ts +43 -0
  83. package/dist-client/pages/regulation-detail.js +370 -0
  84. package/dist-client/pages/regulation-detail.js.map +1 -0
  85. package/dist-client/pages/regulation-list.d.ts +52 -0
  86. package/dist-client/pages/regulation-list.js +144 -0
  87. package/dist-client/pages/regulation-list.js.map +1 -0
  88. package/dist-client/pages/regulations.d.ts +49 -0
  89. package/dist-client/pages/regulations.js +412 -0
  90. package/dist-client/pages/regulations.js.map +1 -0
  91. package/dist-client/pages/seal-use-list.d.ts +57 -0
  92. package/dist-client/pages/seal-use-list.js +168 -0
  93. package/dist-client/pages/seal-use-list.js.map +1 -0
  94. package/dist-client/pages/training-list.d.ts +51 -0
  95. package/dist-client/pages/training-list.js +333 -0
  96. package/dist-client/pages/training-list.js.map +1 -0
  97. package/dist-client/regulation/regulation-fragments.d.ts +1 -0
  98. package/dist-client/regulation/regulation-fragments.js +37 -0
  99. package/dist-client/regulation/regulation-fragments.js.map +1 -0
  100. package/dist-client/regulation/regulation-guide.d.ts +19 -0
  101. package/dist-client/regulation/regulation-guide.js +48 -0
  102. package/dist-client/regulation/regulation-guide.js.map +1 -0
  103. package/dist-client/route.d.ts +1 -0
  104. package/dist-client/route.js +36 -0
  105. package/dist-client/route.js.map +1 -0
  106. package/dist-client/training-words.d.ts +11 -0
  107. package/dist-client/training-words.js +11 -0
  108. package/dist-client/training-words.js.map +1 -0
  109. package/dist-client/tsconfig.tsbuildinfo +1 -0
  110. package/dist-client/words.d.ts +15 -0
  111. package/dist-client/words.js +20 -0
  112. package/dist-client/words.js.map +1 -0
  113. package/dist-server/activities/index.d.ts +6 -0
  114. package/dist-server/activities/index.js +37 -0
  115. package/dist-server/activities/index.js.map +1 -0
  116. package/dist-server/activities/legal-todo-activity-names.d.ts +1 -0
  117. package/dist-server/activities/legal-todo-activity-names.js +5 -0
  118. package/dist-server/activities/legal-todo-activity-names.js.map +1 -0
  119. package/dist-server/activities/legal-todo-activity.d.ts +37 -0
  120. package/dist-server/activities/legal-todo-activity.js +41 -0
  121. package/dist-server/activities/legal-todo-activity.js.map +1 -0
  122. package/dist-server/activities/regulation-activity-names.d.ts +1 -0
  123. package/dist-server/activities/regulation-activity-names.js +5 -0
  124. package/dist-server/activities/regulation-activity-names.js.map +1 -0
  125. package/dist-server/activities/regulation-activity.d.ts +48 -0
  126. package/dist-server/activities/regulation-activity.js +47 -0
  127. package/dist-server/activities/regulation-activity.js.map +1 -0
  128. package/dist-server/activities/seal-use-activity-names.d.ts +2 -0
  129. package/dist-server/activities/seal-use-activity-names.js +6 -0
  130. package/dist-server/activities/seal-use-activity-names.js.map +1 -0
  131. package/dist-server/activities/seal-use-activity.d.ts +48 -0
  132. package/dist-server/activities/seal-use-activity.js +47 -0
  133. package/dist-server/activities/seal-use-activity.js.map +1 -0
  134. package/dist-server/index.d.ts +2 -0
  135. package/dist-server/index.js +21 -0
  136. package/dist-server/index.js.map +1 -0
  137. package/dist-server/role-tasks.d.ts +2 -0
  138. package/dist-server/role-tasks.js +28 -0
  139. package/dist-server/role-tasks.js.map +1 -0
  140. package/dist-server/service/common/correction.d.ts +32 -0
  141. package/dist-server/service/common/correction.js +98 -0
  142. package/dist-server/service/common/correction.js.map +1 -0
  143. package/dist-server/service/common/employee-reader.d.ts +11 -0
  144. package/dist-server/service/common/employee-reader.js +46 -0
  145. package/dist-server/service/common/employee-reader.js.map +1 -0
  146. package/dist-server/service/common/legal-todo.d.ts +19 -0
  147. package/dist-server/service/common/legal-todo.js +37 -0
  148. package/dist-server/service/common/legal-todo.js.map +1 -0
  149. package/dist-server/service/compliance-case/compliance-case-mutation.d.ts +9 -0
  150. package/dist-server/service/compliance-case/compliance-case-mutation.js +73 -0
  151. package/dist-server/service/compliance-case/compliance-case-mutation.js.map +1 -0
  152. package/dist-server/service/compliance-case/compliance-case-query.d.ts +28 -0
  153. package/dist-server/service/compliance-case/compliance-case-query.js +212 -0
  154. package/dist-server/service/compliance-case/compliance-case-query.js.map +1 -0
  155. package/dist-server/service/compliance-case/compliance-case-rules.d.ts +71 -0
  156. package/dist-server/service/compliance-case/compliance-case-rules.js +111 -0
  157. package/dist-server/service/compliance-case/compliance-case-rules.js.map +1 -0
  158. package/dist-server/service/compliance-case/compliance-case-service.d.ts +76 -0
  159. package/dist-server/service/compliance-case/compliance-case-service.js +425 -0
  160. package/dist-server/service/compliance-case/compliance-case-service.js.map +1 -0
  161. package/dist-server/service/compliance-case/compliance-case-type.d.ts +56 -0
  162. package/dist-server/service/compliance-case/compliance-case-type.js +200 -0
  163. package/dist-server/service/compliance-case/compliance-case-type.js.map +1 -0
  164. package/dist-server/service/compliance-case/compliance-case.d.ts +76 -0
  165. package/dist-server/service/compliance-case/compliance-case.js +260 -0
  166. package/dist-server/service/compliance-case/compliance-case.js.map +1 -0
  167. package/dist-server/service/compliance-case/index.d.ts +7 -0
  168. package/dist-server/service/compliance-case/index.js +17 -0
  169. package/dist-server/service/compliance-case/index.js.map +1 -0
  170. package/dist-server/service/dispute/dispute-mutation.d.ts +9 -0
  171. package/dist-server/service/dispute/dispute-mutation.js +64 -0
  172. package/dist-server/service/dispute/dispute-mutation.js.map +1 -0
  173. package/dist-server/service/dispute/dispute-query.d.ts +16 -0
  174. package/dist-server/service/dispute/dispute-query.js +124 -0
  175. package/dist-server/service/dispute/dispute-query.js.map +1 -0
  176. package/dist-server/service/dispute/dispute-rules.d.ts +20 -0
  177. package/dist-server/service/dispute/dispute-rules.js +42 -0
  178. package/dist-server/service/dispute/dispute-rules.js.map +1 -0
  179. package/dist-server/service/dispute/dispute-service.d.ts +17 -0
  180. package/dist-server/service/dispute/dispute-service.js +96 -0
  181. package/dist-server/service/dispute/dispute-service.js.map +1 -0
  182. package/dist-server/service/dispute/dispute-type.d.ts +39 -0
  183. package/dist-server/service/dispute/dispute-type.js +149 -0
  184. package/dist-server/service/dispute/dispute-type.js.map +1 -0
  185. package/dist-server/service/dispute/dispute.d.ts +48 -0
  186. package/dist-server/service/dispute/dispute.js +198 -0
  187. package/dist-server/service/dispute/dispute.js.map +1 -0
  188. package/dist-server/service/dispute/index.d.ts +5 -0
  189. package/dist-server/service/dispute/index.js +9 -0
  190. package/dist-server/service/dispute/index.js.map +1 -0
  191. package/dist-server/service/index.d.ts +46 -0
  192. package/dist-server/service/index.js +112 -0
  193. package/dist-server/service/index.js.map +1 -0
  194. package/dist-server/service/invention/index.d.ts +5 -0
  195. package/dist-server/service/invention/index.js +9 -0
  196. package/dist-server/service/invention/index.js.map +1 -0
  197. package/dist-server/service/invention/invention-mutation.d.ts +10 -0
  198. package/dist-server/service/invention/invention-mutation.js +79 -0
  199. package/dist-server/service/invention/invention-mutation.js.map +1 -0
  200. package/dist-server/service/invention/invention-query.d.ts +18 -0
  201. package/dist-server/service/invention/invention-query.js +141 -0
  202. package/dist-server/service/invention/invention-query.js.map +1 -0
  203. package/dist-server/service/invention/invention-rules.d.ts +28 -0
  204. package/dist-server/service/invention/invention-rules.js +54 -0
  205. package/dist-server/service/invention/invention-rules.js.map +1 -0
  206. package/dist-server/service/invention/invention-service.d.ts +25 -0
  207. package/dist-server/service/invention/invention-service.js +176 -0
  208. package/dist-server/service/invention/invention-service.js.map +1 -0
  209. package/dist-server/service/invention/invention-type.d.ts +34 -0
  210. package/dist-server/service/invention/invention-type.js +129 -0
  211. package/dist-server/service/invention/invention-type.js.map +1 -0
  212. package/dist-server/service/invention/invention.d.ts +55 -0
  213. package/dist-server/service/invention/invention.js +214 -0
  214. package/dist-server/service/invention/invention.js.map +1 -0
  215. package/dist-server/service/legal-record/attachment-readers.d.ts +1 -0
  216. package/dist-server/service/legal-record/attachment-readers.js +27 -0
  217. package/dist-server/service/legal-record/attachment-readers.js.map +1 -0
  218. package/dist-server/service/legal-record/days.d.ts +7 -0
  219. package/dist-server/service/legal-record/days.js +26 -0
  220. package/dist-server/service/legal-record/days.js.map +1 -0
  221. package/dist-server/service/legal-record/legal-record-support.d.ts +24 -0
  222. package/dist-server/service/legal-record/legal-record-support.js +51 -0
  223. package/dist-server/service/legal-record/legal-record-support.js.map +1 -0
  224. package/dist-server/service/legal-registration/centre-change-subscriber.d.ts +9 -0
  225. package/dist-server/service/legal-registration/centre-change-subscriber.js +50 -0
  226. package/dist-server/service/legal-registration/centre-change-subscriber.js.map +1 -0
  227. package/dist-server/service/legal-registration/index.d.ts +7 -0
  228. package/dist-server/service/legal-registration/index.js +11 -0
  229. package/dist-server/service/legal-registration/index.js.map +1 -0
  230. package/dist-server/service/legal-registration/legal-registration-mutation.d.ts +10 -0
  231. package/dist-server/service/legal-registration/legal-registration-mutation.js +77 -0
  232. package/dist-server/service/legal-registration/legal-registration-mutation.js.map +1 -0
  233. package/dist-server/service/legal-registration/legal-registration-query.d.ts +26 -0
  234. package/dist-server/service/legal-registration/legal-registration-query.js +199 -0
  235. package/dist-server/service/legal-registration/legal-registration-query.js.map +1 -0
  236. package/dist-server/service/legal-registration/legal-registration-rules.d.ts +80 -0
  237. package/dist-server/service/legal-registration/legal-registration-rules.js +106 -0
  238. package/dist-server/service/legal-registration/legal-registration-rules.js.map +1 -0
  239. package/dist-server/service/legal-registration/legal-registration-service.d.ts +37 -0
  240. package/dist-server/service/legal-registration/legal-registration-service.js +248 -0
  241. package/dist-server/service/legal-registration/legal-registration-service.js.map +1 -0
  242. package/dist-server/service/legal-registration/legal-registration-type.d.ts +55 -0
  243. package/dist-server/service/legal-registration/legal-registration-type.js +207 -0
  244. package/dist-server/service/legal-registration/legal-registration-type.js.map +1 -0
  245. package/dist-server/service/legal-registration/legal-registration.d.ts +76 -0
  246. package/dist-server/service/legal-registration/legal-registration.js +311 -0
  247. package/dist-server/service/legal-registration/legal-registration.js.map +1 -0
  248. package/dist-server/service/privacy-record/index.d.ts +5 -0
  249. package/dist-server/service/privacy-record/index.js +9 -0
  250. package/dist-server/service/privacy-record/index.js.map +1 -0
  251. package/dist-server/service/privacy-record/privacy-record-mutation.d.ts +7 -0
  252. package/dist-server/service/privacy-record/privacy-record-mutation.js +56 -0
  253. package/dist-server/service/privacy-record/privacy-record-mutation.js.map +1 -0
  254. package/dist-server/service/privacy-record/privacy-record-query.d.ts +18 -0
  255. package/dist-server/service/privacy-record/privacy-record-query.js +131 -0
  256. package/dist-server/service/privacy-record/privacy-record-query.js.map +1 -0
  257. package/dist-server/service/privacy-record/privacy-record-rules.d.ts +52 -0
  258. package/dist-server/service/privacy-record/privacy-record-rules.js +91 -0
  259. package/dist-server/service/privacy-record/privacy-record-rules.js.map +1 -0
  260. package/dist-server/service/privacy-record/privacy-record-service.d.ts +33 -0
  261. package/dist-server/service/privacy-record/privacy-record-service.js +133 -0
  262. package/dist-server/service/privacy-record/privacy-record-service.js.map +1 -0
  263. package/dist-server/service/privacy-record/privacy-record-type.d.ts +40 -0
  264. package/dist-server/service/privacy-record/privacy-record-type.js +153 -0
  265. package/dist-server/service/privacy-record/privacy-record-type.js.map +1 -0
  266. package/dist-server/service/privacy-record/privacy-record.d.ts +69 -0
  267. package/dist-server/service/privacy-record/privacy-record.js +245 -0
  268. package/dist-server/service/privacy-record/privacy-record.js.map +1 -0
  269. package/dist-server/service/regulation/index.d.ts +5 -0
  270. package/dist-server/service/regulation/index.js +9 -0
  271. package/dist-server/service/regulation/index.js.map +1 -0
  272. package/dist-server/service/regulation/regulation-mutation.d.ts +15 -0
  273. package/dist-server/service/regulation/regulation-mutation.js +152 -0
  274. package/dist-server/service/regulation/regulation-mutation.js.map +1 -0
  275. package/dist-server/service/regulation/regulation-query.d.ts +10 -0
  276. package/dist-server/service/regulation/regulation-query.js +109 -0
  277. package/dist-server/service/regulation/regulation-query.js.map +1 -0
  278. package/dist-server/service/regulation/regulation-read.d.ts +21 -0
  279. package/dist-server/service/regulation/regulation-read.js +111 -0
  280. package/dist-server/service/regulation/regulation-read.js.map +1 -0
  281. package/dist-server/service/regulation/regulation-rules.d.ts +83 -0
  282. package/dist-server/service/regulation/regulation-rules.js +170 -0
  283. package/dist-server/service/regulation/regulation-rules.js.map +1 -0
  284. package/dist-server/service/regulation/regulation-service.d.ts +63 -0
  285. package/dist-server/service/regulation/regulation-service.js +365 -0
  286. package/dist-server/service/regulation/regulation-service.js.map +1 -0
  287. package/dist-server/service/regulation/regulation-type.d.ts +61 -0
  288. package/dist-server/service/regulation/regulation-type.js +226 -0
  289. package/dist-server/service/regulation/regulation-type.js.map +1 -0
  290. package/dist-server/service/regulation/regulation.d.ts +113 -0
  291. package/dist-server/service/regulation/regulation.js +382 -0
  292. package/dist-server/service/regulation/regulation.js.map +1 -0
  293. package/dist-server/service/seal-use/index.d.ts +5 -0
  294. package/dist-server/service/seal-use/index.js +9 -0
  295. package/dist-server/service/seal-use/index.js.map +1 -0
  296. package/dist-server/service/seal-use/seal-use-mutation.d.ts +8 -0
  297. package/dist-server/service/seal-use/seal-use-mutation.js +69 -0
  298. package/dist-server/service/seal-use/seal-use-mutation.js.map +1 -0
  299. package/dist-server/service/seal-use/seal-use-query.d.ts +14 -0
  300. package/dist-server/service/seal-use/seal-use-query.js +100 -0
  301. package/dist-server/service/seal-use/seal-use-query.js.map +1 -0
  302. package/dist-server/service/seal-use/seal-use-rules.d.ts +35 -0
  303. package/dist-server/service/seal-use/seal-use-rules.js +64 -0
  304. package/dist-server/service/seal-use/seal-use-rules.js.map +1 -0
  305. package/dist-server/service/seal-use/seal-use-service.d.ts +20 -0
  306. package/dist-server/service/seal-use/seal-use-service.js +168 -0
  307. package/dist-server/service/seal-use/seal-use-service.js.map +1 -0
  308. package/dist-server/service/seal-use/seal-use-type.d.ts +24 -0
  309. package/dist-server/service/seal-use/seal-use-type.js +93 -0
  310. package/dist-server/service/seal-use/seal-use-type.js.map +1 -0
  311. package/dist-server/service/seal-use/seal-use.d.ts +57 -0
  312. package/dist-server/service/seal-use/seal-use.js +181 -0
  313. package/dist-server/service/seal-use/seal-use.js.map +1 -0
  314. package/dist-server/service/training/index.d.ts +5 -0
  315. package/dist-server/service/training/index.js +9 -0
  316. package/dist-server/service/training/index.js.map +1 -0
  317. package/dist-server/service/training/training-checks.d.ts +20 -0
  318. package/dist-server/service/training/training-checks.js +56 -0
  319. package/dist-server/service/training/training-checks.js.map +1 -0
  320. package/dist-server/service/training/training-kinds.d.ts +24 -0
  321. package/dist-server/service/training/training-kinds.js +42 -0
  322. package/dist-server/service/training/training-kinds.js.map +1 -0
  323. package/dist-server/service/training/training-mutation.d.ts +14 -0
  324. package/dist-server/service/training/training-mutation.js +140 -0
  325. package/dist-server/service/training/training-mutation.js.map +1 -0
  326. package/dist-server/service/training/training-query.d.ts +21 -0
  327. package/dist-server/service/training/training-query.js +196 -0
  328. package/dist-server/service/training/training-query.js.map +1 -0
  329. package/dist-server/service/training/training-read.d.ts +5 -0
  330. package/dist-server/service/training/training-read.js +35 -0
  331. package/dist-server/service/training/training-read.js.map +1 -0
  332. package/dist-server/service/training/training-register.d.ts +1 -0
  333. package/dist-server/service/training/training-register.js +27 -0
  334. package/dist-server/service/training/training-register.js.map +1 -0
  335. package/dist-server/service/training/training-rules.d.ts +72 -0
  336. package/dist-server/service/training/training-rules.js +143 -0
  337. package/dist-server/service/training/training-rules.js.map +1 -0
  338. package/dist-server/service/training/training-service.d.ts +98 -0
  339. package/dist-server/service/training/training-service.js +455 -0
  340. package/dist-server/service/training/training-service.js.map +1 -0
  341. package/dist-server/service/training/training-type.d.ts +94 -0
  342. package/dist-server/service/training/training-type.js +352 -0
  343. package/dist-server/service/training/training-type.js.map +1 -0
  344. package/dist-server/service/training/training.d.ts +127 -0
  345. package/dist-server/service/training/training.js +448 -0
  346. package/dist-server/service/training/training.js.map +1 -0
  347. package/dist-server/tsconfig.tsbuildinfo +1 -0
  348. package/package.json +61 -4
  349. package/things-factory.config.js +19 -0
  350. package/translations/en.json +612 -0
  351. package/translations/es.json +612 -0
  352. package/translations/ja.json +612 -0
  353. package/translations/ko.json +612 -0
  354. package/translations/ms.json +612 -0
  355. package/translations/zh.json +612 -0
  356. package/README.md +0 -3
@@ -0,0 +1,168 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@operato/data-grist/ox-grist.js';
3
+ import '@operato/data-grist/ox-filters-form.js';
4
+ import gql from 'graphql-tag';
5
+ import { html } from 'lit';
6
+ import { customElement, query, state } from 'lit/decorators.js';
7
+ import { DataGrist } from '@operato/data-grist';
8
+ import { client } from '@operato/graphql';
9
+ import { i18next, localize } from '@operato/i18n';
10
+ import { notify } from '@operato/layout';
11
+ import { OxPrompt } from '@operato/popup/ox-prompt.js';
12
+ import { PageView } from '@operato/shell';
13
+ import { CommonButtonStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles';
14
+ import { isMobileDevice } from '@operato/utils';
15
+ import { openSealUseForm } from '../components/seal-use-form.js';
16
+ import { failureOf, optionsOf, USE_KINDS, USE_STATUSES, wordOf } from '../words.js';
17
+ const blankFirst = (options) => [{ value: '', display: '' }, ...options];
18
+ /**
19
+ * 날인 기록 (ADR-0188 decision 2) - every use of the company's seals: stamped, taken out, certificates issued, newest
20
+ * first. A use is written from its form; on the list only the day a seal came back and the notes change. Narrowed to the
21
+ * seals let out and not back, or to the certificates still accepted.
22
+ */
23
+ let SealUseList = class SealUseList extends localize(i18next)(PageView) {
24
+ static { this.styles = [WorkSurfacePageStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles]; }
25
+ get context() {
26
+ return {
27
+ title: i18next.t('title.seal-use-list'),
28
+ search: { handler: (search) => (this.grist.searchText = search), value: this.grist?.searchText || '' },
29
+ filter: { handler: () => this.grist.toggleHeadroom() },
30
+ actions: [
31
+ { title: i18next.t('button.seal-use-record'), icon: 'approval', action: () => this.record() },
32
+ { title: i18next.t('button.seal-use-withdraw'), icon: 'undo', action: () => this.withdraw() },
33
+ { title: i18next.t('button.delete'), action: () => this.delete(), ...CommonButtonStyles.delete },
34
+ { title: i18next.t('button.save'), action: () => this.save(), ...CommonButtonStyles.save }
35
+ ],
36
+ exportable: { name: i18next.t('title.seal-use-list'), data: () => this.grist.exportRecords() }
37
+ };
38
+ }
39
+ render() {
40
+ return html `<ox-grist class="page-fill" search-mode="term" .mode=${isMobileDevice() ? 'CARD' : 'GRID'} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>
41
+ <div slot="headroom" class="header">
42
+ <div class="filters"><ox-filters-form without-search autofocus></ox-filters-form></div>
43
+ </div>
44
+ </ox-grist>`;
45
+ }
46
+ async pageInitialized() {
47
+ const header = (name) => i18next.t(`field.seal-use-${name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()}`);
48
+ const shown = (name, width, renderer, extra = {}) => ({
49
+ type: 'string',
50
+ name,
51
+ header: header(name),
52
+ width,
53
+ sortable: true,
54
+ ...extra,
55
+ record: { renderer, ...extra.record }
56
+ });
57
+ this.gristConfig = {
58
+ rows: { appendable: false, selectable: { multiple: true } },
59
+ pagination: { limit: 100, pages: [50, 100] },
60
+ emptyNote: { title: i18next.t('text.seal-use-empty'), description: i18next.t('text.seal-use-empty-description') },
61
+ list: { fields: ['usedOn', 'seal', 'document'], details: ['kind', 'status', 'purpose'] },
62
+ columns: [
63
+ { type: 'gutter', gutterName: 'sequence' },
64
+ { type: 'gutter', gutterName: 'row-selector', multiple: true },
65
+ shown('usedOn', 100, undefined, { record: { align: 'center' } }),
66
+ shown('kind', 90, value => wordOf('seal-use-kind', value), { type: 'select', filter: { type: 'select', operator: 'eq', options: blankFirst(optionsOf('seal-use-kind', USE_KINDS)) } }),
67
+ shown('seal', 140, value => value?.name ?? '', { sortable: false }),
68
+ shown('requester', 90, value => value?.name ?? '', { sortable: false }),
69
+ shown('document', 200),
70
+ shown('purpose', 160),
71
+ shown('submittedTo', 140),
72
+ shown('returnDueOn', 100, undefined, { record: { align: 'center' } }),
73
+ { type: 'date', name: 'returnedOn', header: header('returnedOn'), width: 110, sortable: true, record: { editable: true, align: 'center' } },
74
+ shown('copies', 60, undefined, { type: 'integer', record: { align: 'right' } }),
75
+ shown('usableUntil', 100, undefined, { record: { align: 'center' } }),
76
+ shown('status', 90, value => wordOf('seal-use-status', value), { type: 'select', filter: { type: 'select', operator: 'eq', options: blankFirst(optionsOf('seal-use-status', USE_STATUSES)) } }),
77
+ shown('decidedBy', 90, value => value?.name ?? '', { sortable: false }),
78
+ { type: 'string', name: 'notes', header: header('notes'), width: 180, record: { editable: true } },
79
+ /* The list's own narrowings - columns only to carry their filters. */
80
+ { type: 'checkbox', name: 'unreturned', header: header('unreturned'), hidden: true, filter: { operator: 'eq', type: 'checkbox' } },
81
+ { type: 'checkbox', name: 'usable', header: header('usable'), hidden: true, filter: { operator: 'eq', type: 'checkbox' } }
82
+ ],
83
+ sorters: [{ name: 'usedOn', desc: true }]
84
+ };
85
+ }
86
+ async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [], search }) {
87
+ const response = await client.query({
88
+ query: gql `
89
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {
90
+ responses: sealUses(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {
91
+ items {
92
+ id kind usedOn document purpose submittedTo returnDueOn returnedOn copies usableUntil status notes
93
+ seal { id name kind } requester { id name } decidedBy { id name }
94
+ }
95
+ total
96
+ }
97
+ }
98
+ `,
99
+ variables: { filters, pagination: { page, limit }, sortings, search: search?.trim() || undefined },
100
+ fetchPolicy: 'network-only'
101
+ });
102
+ if (response.errors?.length)
103
+ throw response;
104
+ return { total: response.data.responses.total, records: response.data.responses.items };
105
+ }
106
+ async record() {
107
+ if (await openSealUseForm())
108
+ this.grist.fetch();
109
+ }
110
+ async withdraw() {
111
+ const chosen = this.grist.selected.filter((one) => one.status === 'SUBMITTED');
112
+ if (!chosen.length)
113
+ return notify({ level: 'warn', message: i18next.t('text.seal-use-pick-submitted') });
114
+ await this.call(chosen.map((one) => () => client.mutate({ mutation: gql `mutation ($id: String!) { withdrawSealUse(id: $id) { id } }`, variables: { id: one.id } })));
115
+ }
116
+ async delete() {
117
+ const ids = this.grist.selected.map((one) => one.id).filter(Boolean);
118
+ if (!ids.length)
119
+ return;
120
+ const confirmed = await OxPrompt.open({
121
+ title: i18next.t('button.delete'),
122
+ text: i18next.t('text.seal-use-delete-confirm', { count: ids.length }),
123
+ confirmButton: { text: i18next.t('button.delete'), destructive: true },
124
+ cancelButton: { text: i18next.t('button.cancel') }
125
+ });
126
+ if (confirmed)
127
+ await this.call([() => client.mutate({ mutation: gql `mutation ($ids: [String!]!) { deleteSealUses(ids: $ids) }`, variables: { ids } })]);
128
+ }
129
+ /** The day a seal came back and the notes - all the list writes. */
130
+ async save() {
131
+ const patches = this.grist.dirtyRecords
132
+ .filter((one) => one.id)
133
+ .map((one) => {
134
+ const changed = Object.keys(one.__dirtyfields__ ?? {}).filter(field => field === 'returnedOn' || field === 'notes');
135
+ return { id: one.id, cuFlag: 'M', ...Object.fromEntries(changed.map(field => [field, one[field] === '' ? null : one[field]])) };
136
+ });
137
+ if (!patches.length)
138
+ return;
139
+ await this.call([() => client.mutate({ mutation: gql `mutation ($patches: [SealUsePatch!]!) { updateMultipleSealUse(patches: $patches) { id } }`, variables: { patches } })]);
140
+ }
141
+ async call(calls) {
142
+ try {
143
+ for (const one of calls) {
144
+ const response = await one();
145
+ if (response.errors?.length)
146
+ throw response;
147
+ }
148
+ notify({ message: i18next.t('text.seal-use-saved') });
149
+ }
150
+ catch (error) {
151
+ notify({ level: 'error', message: failureOf(error) });
152
+ }
153
+ this.grist.fetch();
154
+ }
155
+ };
156
+ __decorate([
157
+ state(),
158
+ __metadata("design:type", Object)
159
+ ], SealUseList.prototype, "gristConfig", void 0);
160
+ __decorate([
161
+ query('ox-grist'),
162
+ __metadata("design:type", DataGrist)
163
+ ], SealUseList.prototype, "grist", void 0);
164
+ SealUseList = __decorate([
165
+ customElement('seal-use-list')
166
+ ], SealUseList);
167
+ export { SealUseList };
168
+ //# sourceMappingURL=seal-use-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seal-use-list.js","sourceRoot":"","sources":["../../client/pages/seal-use-list.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/data-grist/ox-grist.js'\nimport '@operato/data-grist/ox-filters-form.js'\n\nimport gql from 'graphql-tag'\nimport { html } from 'lit'\nimport { customElement, query, state } from 'lit/decorators.js'\n\nimport { DataGrist, FetchOption } from '@operato/data-grist'\nimport { client } from '@operato/graphql'\nimport { i18next, localize } from '@operato/i18n'\nimport { notify } from '@operato/layout'\nimport { OxPrompt } from '@operato/popup/ox-prompt.js'\nimport { PageView } from '@operato/shell'\nimport { CommonButtonStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles'\nimport { isMobileDevice } from '@operato/utils'\n\nimport { openSealUseForm } from '../components/seal-use-form.js'\nimport { failureOf, optionsOf, USE_KINDS, USE_STATUSES, wordOf } from '../words.js'\n\nconst blankFirst = (options: { value: string; display: string }[]) => [{ value: '', display: '' }, ...options]\n\n/**\n * 날인 기록 (ADR-0188 decision 2) - every use of the company's seals: stamped, taken out, certificates issued, newest\n * first. A use is written from its form; on the list only the day a seal came back and the notes change. Narrowed to the\n * seals let out and not back, or to the certificates still accepted.\n */\n@customElement('seal-use-list')\nexport class SealUseList extends localize(i18next)(PageView) {\n static styles = [WorkSurfacePageStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles]\n\n @state() gristConfig: any\n @query('ox-grist') private grist!: DataGrist\n\n get context() {\n return {\n title: i18next.t('title.seal-use-list'),\n search: { handler: (search: string) => (this.grist.searchText = search), value: this.grist?.searchText || '' },\n filter: { handler: () => this.grist.toggleHeadroom() },\n actions: [\n { title: i18next.t('button.seal-use-record'), icon: 'approval', action: () => this.record() },\n { title: i18next.t('button.seal-use-withdraw'), icon: 'undo', action: () => this.withdraw() },\n { title: i18next.t('button.delete'), action: () => this.delete(), ...CommonButtonStyles.delete },\n { title: i18next.t('button.save'), action: () => this.save(), ...CommonButtonStyles.save }\n ],\n exportable: { name: i18next.t('title.seal-use-list'), data: () => this.grist.exportRecords() }\n }\n }\n\n render() {\n return html`<ox-grist class=\"page-fill\" search-mode=\"term\" .mode=${isMobileDevice() ? 'CARD' : 'GRID'} .config=${this.gristConfig} .fetchHandler=${this.fetchHandler.bind(this)}>\n <div slot=\"headroom\" class=\"header\">\n <div class=\"filters\"><ox-filters-form without-search autofocus></ox-filters-form></div>\n </div>\n </ox-grist>`\n }\n\n async pageInitialized() {\n const header = (name: string) => i18next.t(`field.seal-use-${name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()}`)\n const shown = (name: string, width: number, renderer?: (value: any, column: any, record: any) => any, extra: any = {}) => ({\n type: 'string',\n name,\n header: header(name),\n width,\n sortable: true,\n ...extra,\n record: { renderer, ...extra.record }\n })\n this.gristConfig = {\n rows: { appendable: false, selectable: { multiple: true } },\n pagination: { limit: 100, pages: [50, 100] },\n emptyNote: { title: i18next.t('text.seal-use-empty'), description: i18next.t('text.seal-use-empty-description') },\n list: { fields: ['usedOn', 'seal', 'document'], details: ['kind', 'status', 'purpose'] },\n columns: [\n { type: 'gutter', gutterName: 'sequence' },\n { type: 'gutter', gutterName: 'row-selector', multiple: true },\n shown('usedOn', 100, undefined, { record: { align: 'center' } }),\n shown('kind', 90, value => wordOf('seal-use-kind', value), { type: 'select', filter: { type: 'select', operator: 'eq', options: blankFirst(optionsOf('seal-use-kind', USE_KINDS)) } }),\n shown('seal', 140, value => value?.name ?? '', { sortable: false }),\n shown('requester', 90, value => value?.name ?? '', { sortable: false }),\n shown('document', 200),\n shown('purpose', 160),\n shown('submittedTo', 140),\n shown('returnDueOn', 100, undefined, { record: { align: 'center' } }),\n { type: 'date', name: 'returnedOn', header: header('returnedOn'), width: 110, sortable: true, record: { editable: true, align: 'center' } },\n shown('copies', 60, undefined, { type: 'integer', record: { align: 'right' } }),\n shown('usableUntil', 100, undefined, { record: { align: 'center' } }),\n shown('status', 90, value => wordOf('seal-use-status', value), { type: 'select', filter: { type: 'select', operator: 'eq', options: blankFirst(optionsOf('seal-use-status', USE_STATUSES)) } }),\n shown('decidedBy', 90, value => value?.name ?? '', { sortable: false }),\n { type: 'string', name: 'notes', header: header('notes'), width: 180, record: { editable: true } },\n /* The list's own narrowings - columns only to carry their filters. */\n { type: 'checkbox', name: 'unreturned', header: header('unreturned'), hidden: true, filter: { operator: 'eq', type: 'checkbox' } },\n { type: 'checkbox', name: 'usable', header: header('usable'), hidden: true, filter: { operator: 'eq', type: 'checkbox' } }\n ],\n sorters: [{ name: 'usedOn', desc: true }]\n }\n }\n\n async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [], search }: FetchOption) {\n const response = await client.query({\n query: gql`\n query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {\n responses: sealUses(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {\n items {\n id kind usedOn document purpose submittedTo returnDueOn returnedOn copies usableUntil status notes\n seal { id name kind } requester { id name } decidedBy { id name }\n }\n total\n }\n }\n `,\n variables: { filters, pagination: { page, limit }, sortings, search: search?.trim() || undefined },\n fetchPolicy: 'network-only'\n })\n if (response.errors?.length) throw response\n return { total: response.data.responses.total, records: response.data.responses.items }\n }\n\n private async record() {\n if (await openSealUseForm()) this.grist.fetch()\n }\n\n private async withdraw() {\n const chosen = this.grist.selected.filter((one: any) => one.status === 'SUBMITTED')\n if (!chosen.length) return notify({ level: 'warn', message: i18next.t('text.seal-use-pick-submitted') })\n await this.call(chosen.map((one: any) => () => client.mutate({ mutation: gql`mutation ($id: String!) { withdrawSealUse(id: $id) { id } }`, variables: { id: one.id } })))\n }\n\n private async delete() {\n const ids = this.grist.selected.map((one: any) => one.id).filter(Boolean)\n if (!ids.length) return\n const confirmed = await OxPrompt.open({\n title: i18next.t('button.delete'),\n text: i18next.t('text.seal-use-delete-confirm', { count: ids.length }),\n confirmButton: { text: i18next.t('button.delete'), destructive: true },\n cancelButton: { text: i18next.t('button.cancel') }\n })\n if (confirmed) await this.call([() => client.mutate({ mutation: gql`mutation ($ids: [String!]!) { deleteSealUses(ids: $ids) }`, variables: { ids } })])\n }\n\n /** The day a seal came back and the notes - all the list writes. */\n private async save() {\n const patches = this.grist.dirtyRecords\n .filter((one: any) => one.id)\n .map((one: any) => {\n const changed = Object.keys(one.__dirtyfields__ ?? {}).filter(field => field === 'returnedOn' || field === 'notes')\n return { id: one.id, cuFlag: 'M', ...Object.fromEntries(changed.map(field => [field, one[field] === '' ? null : one[field]])) }\n })\n if (!patches.length) return\n await this.call([() => client.mutate({ mutation: gql`mutation ($patches: [SealUsePatch!]!) { updateMultipleSealUse(patches: $patches) { id } }`, variables: { patches } })])\n }\n\n private async call(calls: (() => Promise<any>)[]) {\n try {\n for (const one of calls) {\n const response = await one()\n if (response.errors?.length) throw response\n }\n notify({ message: i18next.t('text.seal-use-saved') })\n } catch (error) {\n notify({ level: 'error', message: failureOf(error) })\n }\n this.grist.fetch()\n }\n}\n"]}
@@ -0,0 +1,51 @@
1
+ import '@operato/data-grist/ox-grist.js';
2
+ import '@operato/data-grist/ox-filters-form.js';
3
+ import '@operato/input/ox-input-select-buttons.js';
4
+ import { FetchOption } from '@operato/data-grist';
5
+ import { PageView } from '@operato/shell';
6
+ declare const TrainingList_base: (new (...args: any[]) => import("lit").LitElement) & typeof PageView;
7
+ /**
8
+ * 법정 의무 교육 (ADR-0187 decisions 15-19) - one screen read four ways, as the audit screen is: the kinds the domain
9
+ * trains, where everyone stands this year, the sessions given, and the completions with their certificates. The kinds
10
+ * are set in their form, a session is opened in its own, a certificate is confirmed or returned here. Nothing is deleted.
11
+ */
12
+ export declare class TrainingList extends TrainingList_base {
13
+ static styles: import("lit").CSSResult[];
14
+ private view;
15
+ private year;
16
+ private grist;
17
+ get context(): {
18
+ title: string;
19
+ search: {
20
+ handler: (search: string) => string;
21
+ value: string;
22
+ } | undefined;
23
+ filter: {
24
+ handler: () => void;
25
+ };
26
+ actions: any[];
27
+ exportable: {
28
+ name: string;
29
+ data: () => any[];
30
+ };
31
+ };
32
+ render(): import("lit-html").TemplateResult<1>;
33
+ private show;
34
+ private pickYear;
35
+ private configOf;
36
+ fetchHandler({ page, limit, sortings, filters, search }: FetchOption): Promise<{
37
+ total: any;
38
+ records: any;
39
+ }>;
40
+ private picked;
41
+ private setting;
42
+ private openYear;
43
+ private openSession;
44
+ private attendance;
45
+ private confirm;
46
+ private return;
47
+ /** What sessions say - the grid writes the name, instructor, organisation and notes. */
48
+ private save;
49
+ private call;
50
+ }
51
+ export {};
@@ -0,0 +1,333 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import '@operato/data-grist/ox-grist.js';
3
+ import '@operato/data-grist/ox-filters-form.js';
4
+ import '@operato/input/ox-input-select-buttons.js';
5
+ import gql from 'graphql-tag';
6
+ import { css, html } from 'lit';
7
+ import { customElement, query, state } from 'lit/decorators.js';
8
+ import { keyed } from 'lit/directives/keyed.js';
9
+ import { DataGrist } from '@operato/data-grist';
10
+ import { client } from '@operato/graphql';
11
+ import { i18next, localize } from '@operato/i18n';
12
+ import { notify } from '@operato/layout';
13
+ import { OxPrompt } from '@operato/popup/ox-prompt.js';
14
+ import { PageView } from '@operato/shell';
15
+ import { CommonButtonStyles, CommonGristStyles, CommonHeaderStyles, ScrollbarStyles, WorkSurfacePageStyles } from '@operato/styles';
16
+ import { isMobileDevice } from '@operato/utils';
17
+ import { openTrainingAttendanceForm } from '../components/training-attendance-form.js';
18
+ import { openTrainingSessionForm } from '../components/training-session-form.js';
19
+ import { openTrainingSettingForm } from '../components/training-setting-form.js';
20
+ import { COMPLETION_STATUSES, TRAINING_KINDS, TRAINING_METHODS, TRAINING_STATES, trainingOptions, trainingWord } from '../training-words.js';
21
+ import { failureOf } from '../words.js';
22
+ const VIEWS = ['settings', 'standings', 'sessions', 'completions'];
23
+ const blankFirst = (options) => [{ value: '', display: '' }, ...options];
24
+ /**
25
+ * 법정 의무 교육 (ADR-0187 decisions 15-19) - one screen read four ways, as the audit screen is: the kinds the domain
26
+ * trains, where everyone stands this year, the sessions given, and the completions with their certificates. The kinds
27
+ * are set in their form, a session is opened in its own, a certificate is confirmed or returned here. Nothing is deleted.
28
+ */
29
+ let TrainingList = class TrainingList extends localize(i18next)(PageView) {
30
+ constructor() {
31
+ super(...arguments);
32
+ this.view = 'settings';
33
+ this.year = new Date().getFullYear();
34
+ }
35
+ static { this.styles = [
36
+ WorkSurfacePageStyles,
37
+ CommonGristStyles,
38
+ CommonHeaderStyles,
39
+ ScrollbarStyles,
40
+ css `
41
+ .filters {
42
+ flex-wrap: wrap;
43
+ }
44
+ input[type='number'] {
45
+ width: 80px;
46
+ height: var(--context-action-height, 28px);
47
+ box-sizing: border-box;
48
+ border: 1px solid var(--md-sys-color-outline-variant);
49
+ border-radius: var(--md-sys-shape-corner-small, 4px);
50
+ background: var(--md-sys-color-surface-container-lowest);
51
+ color: var(--md-sys-color-on-surface);
52
+ font: inherit;
53
+ padding: 0 var(--spacing-small, 4px);
54
+ }
55
+ `
56
+ ]; }
57
+ get context() {
58
+ const t = i18next.t.bind(i18next);
59
+ const actions = {
60
+ settings: [
61
+ { title: t('button.training-setting'), icon: 'tune', action: () => this.setting() },
62
+ { title: t('button.training-open-year'), icon: 'assignment_add', action: () => this.openYear() }
63
+ ],
64
+ standings: [],
65
+ sessions: [
66
+ { title: t('button.training-session-open'), icon: 'event', action: () => this.openSession() },
67
+ { title: t('button.training-attendance-record'), icon: 'how_to_reg', action: () => this.attendance() },
68
+ { title: t('button.save'), action: () => this.save(), ...CommonButtonStyles.save }
69
+ ],
70
+ completions: [
71
+ { title: t('button.training-confirm'), icon: 'task_alt', action: () => this.confirm() },
72
+ { title: t('button.training-return'), icon: 'undo', action: () => this.return() }
73
+ ]
74
+ };
75
+ return {
76
+ title: t('title.training-list'),
77
+ search: this.view === 'settings' ? undefined : { handler: (search) => (this.grist.searchText = search), value: this.grist?.searchText || '' },
78
+ filter: { handler: () => this.grist.toggleHeadroom() },
79
+ actions: actions[this.view],
80
+ exportable: { name: t('title.training-list'), data: () => this.grist.exportRecords() }
81
+ };
82
+ }
83
+ render() {
84
+ return html `${keyed(this.view, html `<ox-grist class="page-fill" search-mode="term" .mode=${isMobileDevice() ? 'CARD' : 'GRID'} .config=${this.configOf(this.view)} .fetchHandler=${this.fetchHandler.bind(this)}>
85
+ <div slot="headroom" class="header">
86
+ <div class="filters">
87
+ <ox-input-select-buttons
88
+ .options=${VIEWS.map(view => ({ value: view, display: i18next.t(`text.training-view-${view}`) }))}
89
+ .value=${this.view}
90
+ @change=${(e) => (e.detail ? this.show(e.detail) : (e.target.value = this.view))}
91
+ ></ox-input-select-buttons>
92
+ ${this.view === 'settings'
93
+ ? ''
94
+ : html `<input type="number" min="2000" max="2999" aria-label=${i18next.t('field.training-year')} .value=${String(this.year)} @change=${(e) => this.pickYear(e)} />`}
95
+ <ox-filters-form without-search></ox-filters-form>
96
+ </div>
97
+ </div>
98
+ </ox-grist>`)}`;
99
+ }
100
+ show(view) {
101
+ this.view = view;
102
+ this.updateContext();
103
+ }
104
+ pickYear(e) {
105
+ const year = Number(e.target.value);
106
+ if (!Number.isInteger(year) || year < 2000 || year > 2999)
107
+ return (e.target.value = String(this.year));
108
+ this.year = year;
109
+ this.grist.fetch();
110
+ }
111
+ configOf(view) {
112
+ const t = i18next.t.bind(i18next);
113
+ const shown = (name, width, renderer, extra = {}) => ({
114
+ type: 'string',
115
+ name,
116
+ header: t(`field.training-${name.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase()}`),
117
+ width,
118
+ sortable: false,
119
+ ...extra,
120
+ record: { renderer, ...extra.record }
121
+ });
122
+ const select = (set, codes) => ({ type: 'select', filter: { type: 'select', operator: 'eq', options: blankFirst(trainingOptions(set, codes)) } });
123
+ const center = { record: { align: 'center' } };
124
+ const base = {
125
+ rows: { appendable: false, selectable: { multiple: view === 'completions' } },
126
+ pagination: view === 'settings' ? { infinite: true } : { limit: 100, pages: [50, 100] }
127
+ };
128
+ const gutters = [{ type: 'gutter', gutterName: 'sequence' }, { type: 'gutter', gutterName: 'row-selector', multiple: view === 'completions' }];
129
+ switch (view) {
130
+ case 'settings':
131
+ return {
132
+ ...base,
133
+ list: { fields: ['code', 'enabled', 'dueDay'] },
134
+ columns: [
135
+ ...gutters,
136
+ shown('code', 180, value => trainingWord('kind', value)),
137
+ shown('enabled', 70, value => t(value ? 'text.training-on' : 'text.training-off'), center),
138
+ shown('dueDay', 80, undefined, center),
139
+ shown('audiences', 200, value => (value?.length ? value.map((one) => one.targetName ?? one.targetId).join(', ') : t('text.training-whole-domain'))),
140
+ shown('basis', 240),
141
+ shown('retentionYears', 80, value => t('text.training-retention', { years: value }), center),
142
+ shown('memo', 240)
143
+ ]
144
+ };
145
+ case 'standings':
146
+ return {
147
+ ...base,
148
+ list: { fields: ['employee', 'kind', 'state'] },
149
+ columns: [
150
+ ...gutters,
151
+ shown('employee', 120, value => value?.name ?? ''),
152
+ shown('departmentName', 120),
153
+ shown('kind', 180, value => trainingWord('kind', value), select('kind', TRAINING_KINDS)),
154
+ shown('dueOn', 100, undefined, center),
155
+ shown('state', 90, value => trainingWord('state', value), select('state', TRAINING_STATES)),
156
+ shown('completedOn', 100, undefined, center)
157
+ ]
158
+ };
159
+ case 'sessions':
160
+ return {
161
+ ...base,
162
+ list: { fields: ['startsOn', 'name', 'kind'] },
163
+ columns: [
164
+ ...gutters,
165
+ shown('startsOn', 100, undefined, { sortable: true, ...center }),
166
+ shown('endsOn', 100, undefined, center),
167
+ shown('kind', 180, value => trainingWord('kind', value), select('kind', TRAINING_KINDS)),
168
+ { type: 'string', name: 'name', header: t('field.training-session-name'), width: 200, record: { editable: true } },
169
+ shown('method', 100, value => trainingWord('method', value), select('method', TRAINING_METHODS)),
170
+ { type: 'string', name: 'instructor', header: t('field.training-instructor'), width: 120, record: { editable: true } },
171
+ { type: 'string', name: 'organisation', header: t('field.training-organisation'), width: 140, record: { editable: true } },
172
+ { type: 'string', name: 'notes', header: t('field.training-notes'), width: 200, record: { editable: true } }
173
+ ]
174
+ };
175
+ case 'completions':
176
+ return {
177
+ ...base,
178
+ list: { fields: ['employee', 'kind', 'status'] },
179
+ columns: [
180
+ ...gutters,
181
+ shown('employee', 120, value => value?.name ?? ''),
182
+ shown('kind', 180, value => trainingWord('kind', value), select('kind', TRAINING_KINDS)),
183
+ shown('completedOn', 100, undefined, { sortable: true, ...center }),
184
+ shown('method', 100, value => trainingWord('method', value)),
185
+ shown('session', 160, value => value?.name ?? ''),
186
+ shown('organisation', 140),
187
+ shown('status', 90, value => trainingWord('status', value), select('status', COMPLETION_STATUSES)),
188
+ shown('certificates', 160, (_, __, record) => (record.attachments ?? []).map((one) => one.name).join(', ')),
189
+ shown('returnReason', 180),
190
+ shown('decidedBy', 90, value => value?.name ?? '')
191
+ ]
192
+ };
193
+ }
194
+ }
195
+ async fetchHandler({ page = 1, limit = 100, sortings = [], filters = [], search }) {
196
+ const view = this.view;
197
+ const list = { filters: [...filters, ...(view === 'settings' ? [] : [{ name: 'year', operator: 'eq', value: this.year }])], pagination: { page, limit }, sortings, search: search?.trim() || undefined };
198
+ const queries = {
199
+ settings: gql `
200
+ query {
201
+ responses: trainingKinds { code basis cycle audience defaultOn retentionYears toConfirm enabled dueDay memo set audiences { scope targetId targetName } }
202
+ }
203
+ `,
204
+ standings: gql `
205
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {
206
+ responses: trainingStandings(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {
207
+ items { id kind year dueOn state completedOn departmentName employee { id name } }
208
+ total
209
+ }
210
+ }
211
+ `,
212
+ sessions: gql `
213
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {
214
+ responses: trainingSessions(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {
215
+ items { id kind year name method startsOn endsOn instructor organisation notes }
216
+ total
217
+ }
218
+ }
219
+ `,
220
+ completions: gql `
221
+ query ($filters: [Filter!], $pagination: Pagination, $sortings: [Sorting!], $search: String) {
222
+ responses: trainingCompletions(filters: $filters, pagination: $pagination, sortings: $sortings, search: $search) {
223
+ items {
224
+ id kind year completedOn method organisation status returnReason
225
+ employee { id name } session { id name } decidedBy { id name } attachments { id name path }
226
+ }
227
+ total
228
+ }
229
+ }
230
+ `
231
+ };
232
+ const response = await client.query({ query: queries[view], variables: view === 'settings' ? {} : list, fetchPolicy: 'network-only' });
233
+ if (response.errors?.length)
234
+ throw response;
235
+ const answer = response.data.responses;
236
+ return view === 'settings' ? { total: answer.length, records: answer.map((one) => ({ ...one, id: one.code })) } : { total: answer.total, records: answer.items };
237
+ }
238
+ picked() {
239
+ const [one] = this.grist.selected;
240
+ if (!one)
241
+ notify({ level: 'warn', message: i18next.t('text.training-pick-one') });
242
+ return one;
243
+ }
244
+ async setting() {
245
+ const kind = this.picked();
246
+ if (kind && (await openTrainingSettingForm(kind)))
247
+ this.grist.fetch();
248
+ }
249
+ async openYear() {
250
+ const kind = this.picked();
251
+ if (!kind)
252
+ return;
253
+ if (!kind.enabled)
254
+ return notify({ level: 'warn', message: i18next.t('text.training-turn-on-first') });
255
+ const confirmed = await OxPrompt.open({
256
+ title: i18next.t('button.training-open-year'),
257
+ text: i18next.t('text.training-open-year-confirm', { kind: trainingWord('kind', kind.code), year: this.year }),
258
+ confirmButton: { text: i18next.t('button.training-open-year') },
259
+ cancelButton: { text: i18next.t('button.cancel') }
260
+ });
261
+ if (!confirmed)
262
+ return;
263
+ await this.call([() => client.mutate({ mutation: gql `mutation ($kind: String!, $year: Int!) { openTrainingYear(kind: $kind, year: $year) { people done handedOut } }`, variables: { kind: kind.code, year: this.year } })], data => String(i18next.t('text.training-year-opened', data.openTrainingYear)));
264
+ }
265
+ async openSession() {
266
+ const response = await client.query({ query: gql `query { trainingKinds { code enabled } }`, fetchPolicy: 'network-only' });
267
+ const kinds = (response.data?.trainingKinds ?? []).filter((one) => one.enabled).map((one) => one.code);
268
+ if (await openTrainingSessionForm(kinds, this.year))
269
+ this.grist.fetch();
270
+ }
271
+ async attendance() {
272
+ const session = this.picked();
273
+ if (session && (await openTrainingAttendanceForm(session)))
274
+ this.grist.fetch();
275
+ }
276
+ async confirm() {
277
+ const ids = this.grist.selected.filter((one) => one.status === 'SUBMITTED').map((one) => one.id);
278
+ if (!ids.length)
279
+ return notify({ level: 'warn', message: i18next.t('text.training-pick-submitted') });
280
+ await this.call([() => client.mutate({ mutation: gql `mutation ($ids: [String!]!) { confirmTrainingCompletions(ids: $ids) { id } }`, variables: { ids } })]);
281
+ }
282
+ async return() {
283
+ const [one] = this.grist.selected.filter((row) => row.status === 'SUBMITTED');
284
+ if (!one)
285
+ return notify({ level: 'warn', message: i18next.t('text.training-pick-submitted') });
286
+ const reason = await OxPrompt.prompt({ title: i18next.t('button.training-return'), text: i18next.t('field.training-return-reason'), multiline: true });
287
+ if (reason === null)
288
+ return;
289
+ await this.call([() => client.mutate({ mutation: gql `mutation ($id: String!, $reason: String!) { returnTrainingCompletion(id: $id, reason: $reason) { id } }`, variables: { id: one.id, reason } })]);
290
+ }
291
+ /** What sessions say - the grid writes the name, instructor, organisation and notes. */
292
+ async save() {
293
+ const patches = this.grist.dirtyRecords
294
+ .filter((one) => one.id)
295
+ .map((one) => ({ id: one.id, cuFlag: 'M', ...Object.fromEntries(Object.keys(one.__dirtyfields__ ?? {}).map(field => [field, one[field] === '' ? null : one[field]])) }));
296
+ if (!patches.length)
297
+ return;
298
+ await this.call([() => client.mutate({ mutation: gql `mutation ($patches: [TrainingSessionPatch!]!) { updateMultipleTrainingSession(patches: $patches) { id } }`, variables: { patches } })]);
299
+ }
300
+ async call(calls, said) {
301
+ try {
302
+ let data;
303
+ for (const one of calls) {
304
+ const response = await one();
305
+ if (response.errors?.length)
306
+ throw response;
307
+ data = response.data;
308
+ }
309
+ notify({ message: said ? said(data) : i18next.t('text.training-saved') });
310
+ }
311
+ catch (error) {
312
+ notify({ level: 'error', message: failureOf(error) });
313
+ }
314
+ this.grist.fetch();
315
+ }
316
+ };
317
+ __decorate([
318
+ state(),
319
+ __metadata("design:type", String)
320
+ ], TrainingList.prototype, "view", void 0);
321
+ __decorate([
322
+ state(),
323
+ __metadata("design:type", Object)
324
+ ], TrainingList.prototype, "year", void 0);
325
+ __decorate([
326
+ query('ox-grist'),
327
+ __metadata("design:type", DataGrist)
328
+ ], TrainingList.prototype, "grist", void 0);
329
+ TrainingList = __decorate([
330
+ customElement('training-list')
331
+ ], TrainingList);
332
+ export { TrainingList };
333
+ //# sourceMappingURL=training-list.js.map