@things-factory/operato-pms 4.0.27 → 4.0.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (323) hide show
  1. package/client/bootstrap.js +11 -0
  2. package/client/component/block-selector-popup.js +125 -24
  3. package/client/component/driver-selector-popup.js +223 -0
  4. package/client/component/mill-selector-popup.js +200 -0
  5. package/client/component/tracked-plantation-setting.js +113 -0
  6. package/client/component/truck-selector-popup.js +202 -0
  7. package/client/menu.js +34 -2
  8. package/client/pages/constants/index.js +1 -0
  9. package/client/pages/constants/organization.js +5 -0
  10. package/client/pages/dispatchment/daily-dispatch-detail.js +57 -18
  11. package/client/pages/dispatchment/dispatchment-create-record.js +157 -54
  12. package/client/pages/dispatchment/dispatchment-list.js +26 -34
  13. package/client/pages/harvesting/daily-harvesting-detail.js +55 -18
  14. package/client/pages/harvesting/edit-harvesting-record.js +89 -23
  15. package/client/pages/harvesting/harvesting-create-record.js +102 -16
  16. package/client/pages/harvesting/harvesting-list.js +58 -12
  17. package/client/pages/inventory/inventory-field-bunches.js +6 -4
  18. package/client/pages/inventory/inventory-ramp-tonnage.js +23 -31
  19. package/client/pages/loading/daily-loading-detail.js +47 -93
  20. package/client/pages/loading/edit-loading-record.js +75 -294
  21. package/client/pages/loading/loading-create-record.js +52 -329
  22. package/client/pages/loading/loading-list.js +20 -83
  23. package/client/pages/master/block.js +1 -0
  24. package/client/pages/master/company.js +26 -13
  25. package/client/pages/master/home.js +67 -65
  26. package/client/pages/master/ramp.js +1 -0
  27. package/client/pages/master/staff.js +54 -3
  28. package/client/pages/master/truck.js +416 -0
  29. package/client/pages/report/home.js +72 -65
  30. package/client/pages/report/report-daily-ffb-dispatch-and-production.js +436 -0
  31. package/client/pages/report/report-daily-production.js +38 -6
  32. package/client/pages/report/report-daily-staff-harvest.js +50 -5
  33. package/client/pages/report/report-ffb-tonnage-between-individual-block.js +398 -0
  34. package/client/pages/report/report-monthly-ffb-sale.js +413 -0
  35. package/client/pages/report/report-monthly-production.js +33 -4
  36. package/client/pages/report/report-yearly-production.js +24 -8
  37. package/client/pages/setting/home.js +107 -0
  38. package/client/pages/setting/plantation-setting.js +109 -0
  39. package/client/route.js +25 -0
  40. package/dist-server/constants/index.js +1 -0
  41. package/dist-server/constants/index.js.map +1 -1
  42. package/dist-server/constants/organization.js +9 -0
  43. package/dist-server/constants/organization.js.map +1 -0
  44. package/dist-server/constants/transaction.js +2 -1
  45. package/dist-server/constants/transaction.js.map +1 -1
  46. package/dist-server/controllers/render-dispatchment.js +1 -1
  47. package/dist-server/controllers/render-dispatchment.js.map +1 -1
  48. package/dist-server/entities/daily-dispatch.js +18 -4
  49. package/dist-server/entities/daily-dispatch.js.map +1 -1
  50. package/dist-server/entities/daily-harvest-detail.js +9 -11
  51. package/dist-server/entities/daily-harvest-detail.js.map +1 -1
  52. package/dist-server/entities/daily-harvest.js +16 -6
  53. package/dist-server/entities/daily-harvest.js.map +1 -1
  54. package/dist-server/entities/daily-loading-detail.js +14 -6
  55. package/dist-server/entities/daily-loading-detail.js.map +1 -1
  56. package/dist-server/entities/daily-loading.js +3 -11
  57. package/dist-server/entities/daily-loading.js.map +1 -1
  58. package/dist-server/entities/index.js +7 -1
  59. package/dist-server/entities/index.js.map +1 -1
  60. package/dist-server/entities/organization-staff.js +5 -1
  61. package/dist-server/entities/organization-staff.js.map +1 -1
  62. package/dist-server/entities/plantation-inventory.js +4 -10
  63. package/dist-server/entities/plantation-inventory.js.map +1 -1
  64. package/dist-server/entities/plantation-setting.js +76 -0
  65. package/dist-server/entities/plantation-setting.js.map +1 -0
  66. package/dist-server/entities/truck.js +77 -0
  67. package/dist-server/entities/truck.js.map +1 -0
  68. package/dist-server/graphql/resolvers/daily-dispatch/daily-dispatch-query.js +13 -2
  69. package/dist-server/graphql/resolvers/daily-dispatch/daily-dispatch-query.js.map +1 -1
  70. package/dist-server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.js +25 -11
  71. package/dist-server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.js.map +1 -1
  72. package/dist-server/graphql/resolvers/daily-dispatch/update-daily-dispatch.js +4 -3
  73. package/dist-server/graphql/resolvers/daily-dispatch/update-daily-dispatch.js.map +1 -1
  74. package/dist-server/graphql/resolvers/daily-harvest/daily-harvest-query.js +3 -1
  75. package/dist-server/graphql/resolvers/daily-harvest/daily-harvest-query.js.map +1 -1
  76. package/dist-server/graphql/resolvers/daily-harvest/generate-daily-harvest.js +21 -2
  77. package/dist-server/graphql/resolvers/daily-harvest/generate-daily-harvest.js.map +1 -1
  78. package/dist-server/graphql/resolvers/daily-harvest/update-daily-harvest.js +8 -2
  79. package/dist-server/graphql/resolvers/daily-harvest/update-daily-harvest.js.map +1 -1
  80. package/dist-server/graphql/resolvers/daily-loading/daily-loading-query.js +4 -6
  81. package/dist-server/graphql/resolvers/daily-loading/daily-loading-query.js.map +1 -1
  82. package/dist-server/graphql/resolvers/daily-loading/generate-daily-loading.js +20 -54
  83. package/dist-server/graphql/resolvers/daily-loading/generate-daily-loading.js.map +1 -1
  84. package/dist-server/graphql/resolvers/daily-loading/update-daily-loading.js +31 -106
  85. package/dist-server/graphql/resolvers/daily-loading/update-daily-loading.js.map +1 -1
  86. package/dist-server/graphql/resolvers/dashboard/dashboard-query.js +204 -0
  87. package/dist-server/graphql/resolvers/dashboard/dashboard-query.js.map +1 -0
  88. package/dist-server/graphql/resolvers/dashboard/index.js +8 -0
  89. package/dist-server/graphql/resolvers/dashboard/index.js.map +1 -0
  90. package/dist-server/graphql/resolvers/index.js +9 -6
  91. package/dist-server/graphql/resolvers/index.js.map +1 -1
  92. package/dist-server/graphql/resolvers/organization-staff/organization-staff-query.js +7 -3
  93. package/dist-server/graphql/resolvers/organization-staff/organization-staff-query.js.map +1 -1
  94. package/dist-server/graphql/resolvers/plantation-setting/create-plantation-setting.js +12 -0
  95. package/dist-server/graphql/resolvers/plantation-setting/create-plantation-setting.js.map +1 -0
  96. package/dist-server/graphql/resolvers/plantation-setting/delete-plantation-setting.js +13 -0
  97. package/dist-server/graphql/resolvers/plantation-setting/delete-plantation-setting.js.map +1 -0
  98. package/dist-server/graphql/resolvers/plantation-setting/delete-plantation-settings.js +16 -0
  99. package/dist-server/graphql/resolvers/plantation-setting/delete-plantation-settings.js.map +1 -0
  100. package/dist-server/graphql/resolvers/plantation-setting/index.js +15 -0
  101. package/dist-server/graphql/resolvers/plantation-setting/index.js.map +1 -0
  102. package/dist-server/graphql/resolvers/plantation-setting/plantation-setting-query.js +33 -0
  103. package/dist-server/graphql/resolvers/plantation-setting/plantation-setting-query.js.map +1 -0
  104. package/dist-server/graphql/resolvers/plantation-setting/update-multiple-plantation-setting.js +31 -0
  105. package/dist-server/graphql/resolvers/plantation-setting/update-multiple-plantation-setting.js.map +1 -0
  106. package/dist-server/graphql/resolvers/plantation-setting/update-plantation-setting.js +16 -0
  107. package/dist-server/graphql/resolvers/plantation-setting/update-plantation-setting.js.map +1 -0
  108. package/dist-server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.js +111 -0
  109. package/dist-server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.js.map +1 -0
  110. package/dist-server/graphql/resolvers/report/daily-production-reports.js +50 -37
  111. package/dist-server/graphql/resolvers/report/daily-production-reports.js.map +1 -1
  112. package/dist-server/graphql/resolvers/report/daily-staff-harvest-reports.js +21 -10
  113. package/dist-server/graphql/resolvers/report/daily-staff-harvest-reports.js.map +1 -1
  114. package/dist-server/graphql/resolvers/report/index.js +5 -1
  115. package/dist-server/graphql/resolvers/report/index.js.map +1 -1
  116. package/dist-server/graphql/resolvers/report/monthly-block-dispatch-reports.js +91 -0
  117. package/dist-server/graphql/resolvers/report/monthly-block-dispatch-reports.js.map +1 -0
  118. package/dist-server/graphql/resolvers/report/monthly-dispatch-summary-reports.js +89 -0
  119. package/dist-server/graphql/resolvers/report/monthly-dispatch-summary-reports.js.map +1 -0
  120. package/dist-server/graphql/resolvers/report/monthly-ffb-sale-reports.js +87 -0
  121. package/dist-server/graphql/resolvers/report/monthly-ffb-sale-reports.js.map +1 -0
  122. package/dist-server/graphql/resolvers/report/monthly-production-reports.js +46 -31
  123. package/dist-server/graphql/resolvers/report/monthly-production-reports.js.map +1 -1
  124. package/dist-server/graphql/resolvers/report/yearly-production-reports.js +38 -28
  125. package/dist-server/graphql/resolvers/report/yearly-production-reports.js.map +1 -1
  126. package/dist-server/graphql/resolvers/truck/delete-trucks.js +18 -0
  127. package/dist-server/graphql/resolvers/truck/delete-trucks.js.map +1 -0
  128. package/dist-server/graphql/resolvers/truck/index.js +12 -0
  129. package/dist-server/graphql/resolvers/truck/index.js.map +1 -0
  130. package/dist-server/graphql/resolvers/truck/truck-query.js +46 -0
  131. package/dist-server/graphql/resolvers/truck/truck-query.js.map +1 -0
  132. package/dist-server/graphql/resolvers/truck/update-multiple-truck.js +40 -0
  133. package/dist-server/graphql/resolvers/truck/update-multiple-truck.js.map +1 -0
  134. package/dist-server/graphql/types/daily-dispatch/daily-dispatch-patch.js +4 -1
  135. package/dist-server/graphql/types/daily-dispatch/daily-dispatch-patch.js.map +1 -1
  136. package/dist-server/graphql/types/daily-dispatch/daily-dispatch.js +4 -1
  137. package/dist-server/graphql/types/daily-dispatch/daily-dispatch.js.map +1 -1
  138. package/dist-server/graphql/types/daily-dispatch/index.js +6 -1
  139. package/dist-server/graphql/types/daily-dispatch/index.js.map +1 -1
  140. package/dist-server/graphql/types/daily-dispatch/new-daily-dispatch.js +4 -1
  141. package/dist-server/graphql/types/daily-dispatch/new-daily-dispatch.js.map +1 -1
  142. package/dist-server/graphql/types/daily-harvest/daily-harvest-patch.js +5 -2
  143. package/dist-server/graphql/types/daily-harvest/daily-harvest-patch.js.map +1 -1
  144. package/dist-server/graphql/types/daily-harvest/daily-harvest.js +3 -0
  145. package/dist-server/graphql/types/daily-harvest/daily-harvest.js.map +1 -1
  146. package/dist-server/graphql/types/daily-harvest/new-daily-harvest.js +4 -1
  147. package/dist-server/graphql/types/daily-harvest/new-daily-harvest.js.map +1 -1
  148. package/dist-server/graphql/types/daily-harvest-detail/daily-harvest-detail-patch.js +1 -0
  149. package/dist-server/graphql/types/daily-harvest-detail/daily-harvest-detail-patch.js.map +1 -1
  150. package/dist-server/graphql/types/daily-harvest-detail/daily-harvest-detail.js +1 -0
  151. package/dist-server/graphql/types/daily-harvest-detail/daily-harvest-detail.js.map +1 -1
  152. package/dist-server/graphql/types/daily-harvest-detail/new-daily-harvest-detail.js +1 -0
  153. package/dist-server/graphql/types/daily-harvest-detail/new-daily-harvest-detail.js.map +1 -1
  154. package/dist-server/graphql/types/daily-loading/daily-loading-patch.js +0 -2
  155. package/dist-server/graphql/types/daily-loading/daily-loading-patch.js.map +1 -1
  156. package/dist-server/graphql/types/daily-loading/daily-loading.js +0 -2
  157. package/dist-server/graphql/types/daily-loading/daily-loading.js.map +1 -1
  158. package/dist-server/graphql/types/daily-loading/new-daily-loading.js +0 -2
  159. package/dist-server/graphql/types/daily-loading/new-daily-loading.js.map +1 -1
  160. package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail-patch.js +6 -3
  161. package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail-patch.js.map +1 -1
  162. package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail.js +3 -0
  163. package/dist-server/graphql/types/daily-loading-detail/daily-loading-detail.js.map +1 -1
  164. package/dist-server/graphql/types/daily-loading-detail/new-daily-loading-detail.js +6 -3
  165. package/dist-server/graphql/types/daily-loading-detail/new-daily-loading-detail.js.map +1 -1
  166. package/dist-server/graphql/types/dashboard/bunches-count.js +15 -0
  167. package/dist-server/graphql/types/dashboard/bunches-count.js.map +1 -0
  168. package/dist-server/graphql/types/dashboard/index.js +32 -0
  169. package/dist-server/graphql/types/dashboard/index.js.map +1 -0
  170. package/dist-server/graphql/types/dashboard/productions-overview.js +15 -0
  171. package/dist-server/graphql/types/dashboard/productions-overview.js.map +1 -0
  172. package/dist-server/graphql/types/dashboard/tonnage-bunches-inventories.js +14 -0
  173. package/dist-server/graphql/types/dashboard/tonnage-bunches-inventories.js.map +1 -0
  174. package/dist-server/graphql/types/dashboard/tonnage-production.js +17 -0
  175. package/dist-server/graphql/types/dashboard/tonnage-production.js.map +1 -0
  176. package/dist-server/graphql/types/dashboard/yield-production.js +17 -0
  177. package/dist-server/graphql/types/dashboard/yield-production.js.map +1 -0
  178. package/dist-server/graphql/types/index.js +9 -6
  179. package/dist-server/graphql/types/index.js.map +1 -1
  180. package/dist-server/graphql/types/organization-staff/organization-staff-patch.js +2 -0
  181. package/dist-server/graphql/types/organization-staff/organization-staff-patch.js.map +1 -1
  182. package/dist-server/graphql/types/organization-staff/organization-staff.js +3 -0
  183. package/dist-server/graphql/types/organization-staff/organization-staff.js.map +1 -1
  184. package/dist-server/graphql/types/plantation-setting/index.js +36 -0
  185. package/dist-server/graphql/types/plantation-setting/index.js.map +1 -0
  186. package/dist-server/graphql/types/plantation-setting/new-plantation-setting.js +16 -0
  187. package/dist-server/graphql/types/plantation-setting/new-plantation-setting.js.map +1 -0
  188. package/dist-server/graphql/types/plantation-setting/plantation-setting-list.js +14 -0
  189. package/dist-server/graphql/types/plantation-setting/plantation-setting-list.js.map +1 -0
  190. package/dist-server/graphql/types/plantation-setting/plantation-setting-patch.js +18 -0
  191. package/dist-server/graphql/types/plantation-setting/plantation-setting-patch.js.map +1 -0
  192. package/dist-server/graphql/types/plantation-setting/plantation-setting.js +22 -0
  193. package/dist-server/graphql/types/plantation-setting/plantation-setting.js.map +1 -0
  194. package/dist-server/graphql/types/report/daily-ffb-dispatch-production-report-list.js +14 -0
  195. package/dist-server/graphql/types/report/daily-ffb-dispatch-production-report-list.js.map +1 -0
  196. package/dist-server/graphql/types/report/daily-ffb-dispatch-production-report.js +15 -0
  197. package/dist-server/graphql/types/report/daily-ffb-dispatch-production-report.js.map +1 -0
  198. package/dist-server/graphql/types/report/index.js +33 -0
  199. package/dist-server/graphql/types/report/index.js.map +1 -1
  200. package/dist-server/graphql/types/report/monthly-block-dispatch-report-list.js +14 -0
  201. package/dist-server/graphql/types/report/monthly-block-dispatch-report-list.js.map +1 -0
  202. package/dist-server/graphql/types/report/monthly-block-dispatch-report.js +19 -0
  203. package/dist-server/graphql/types/report/monthly-block-dispatch-report.js.map +1 -0
  204. package/dist-server/graphql/types/report/monthly-dispatch-summary-report-list.js +14 -0
  205. package/dist-server/graphql/types/report/monthly-dispatch-summary-report-list.js.map +1 -0
  206. package/dist-server/graphql/types/report/monthly-dispatch-summary-report.js +25 -0
  207. package/dist-server/graphql/types/report/monthly-dispatch-summary-report.js.map +1 -0
  208. package/dist-server/graphql/types/report/monthly-ffb-sale-report-list.js +14 -0
  209. package/dist-server/graphql/types/report/monthly-ffb-sale-report-list.js.map +1 -0
  210. package/dist-server/graphql/types/report/monthly-ffb-sale-report.js +24 -0
  211. package/dist-server/graphql/types/report/monthly-ffb-sale-report.js.map +1 -0
  212. package/dist-server/graphql/types/truck/index.js +33 -0
  213. package/dist-server/graphql/types/truck/index.js.map +1 -0
  214. package/dist-server/graphql/types/truck/new-truck.js +14 -0
  215. package/dist-server/graphql/types/truck/new-truck.js.map +1 -0
  216. package/dist-server/graphql/types/truck/truck-list.js +14 -0
  217. package/dist-server/graphql/types/truck/truck-list.js.map +1 -0
  218. package/dist-server/graphql/types/truck/truck-patch.js +17 -0
  219. package/dist-server/graphql/types/truck/truck-patch.js.map +1 -0
  220. package/dist-server/graphql/types/truck/truck.js +22 -0
  221. package/dist-server/graphql/types/truck/truck.js.map +1 -0
  222. package/dist-server/utils/core-values.js +2 -2
  223. package/dist-server/utils/transaction-util.js +2 -1
  224. package/dist-server/utils/transaction-util.js.map +1 -1
  225. package/package.json +56 -56
  226. package/server/constants/index.ts +1 -0
  227. package/server/constants/organization.ts +5 -0
  228. package/server/constants/transaction.ts +2 -1
  229. package/server/controllers/render-dispatchment.ts +1 -1
  230. package/server/entities/daily-dispatch.ts +18 -5
  231. package/server/entities/daily-harvest-detail.ts +10 -11
  232. package/server/entities/daily-harvest.ts +16 -7
  233. package/server/entities/daily-loading-detail.ts +14 -6
  234. package/server/entities/daily-loading.ts +7 -11
  235. package/server/entities/index.ts +6 -0
  236. package/server/entities/organization-staff.ts +6 -1
  237. package/server/entities/plantation-inventory.ts +6 -10
  238. package/server/entities/plantation-setting.ts +60 -0
  239. package/server/entities/truck.ts +58 -0
  240. package/server/graphql/resolvers/daily-dispatch/daily-dispatch-query.ts +15 -2
  241. package/server/graphql/resolvers/daily-dispatch/generate-daily-dispatch.ts +40 -14
  242. package/server/graphql/resolvers/daily-dispatch/update-daily-dispatch.ts +8 -4
  243. package/server/graphql/resolvers/daily-harvest/daily-harvest-query.ts +7 -2
  244. package/server/graphql/resolvers/daily-harvest/generate-daily-harvest.ts +50 -4
  245. package/server/graphql/resolvers/daily-harvest/update-daily-harvest.ts +12 -2
  246. package/server/graphql/resolvers/daily-loading/daily-loading-query.ts +6 -6
  247. package/server/graphql/resolvers/daily-loading/generate-daily-loading.ts +27 -109
  248. package/server/graphql/resolvers/daily-loading/update-daily-loading.ts +56 -214
  249. package/server/graphql/resolvers/dashboard/dashboard-query.ts +252 -0
  250. package/server/graphql/resolvers/dashboard/index.ts +5 -0
  251. package/server/graphql/resolvers/index.ts +10 -6
  252. package/server/graphql/resolvers/organization-staff/organization-staff-query.ts +13 -4
  253. package/server/graphql/resolvers/plantation-setting/create-plantation-setting.ts +16 -0
  254. package/server/graphql/resolvers/plantation-setting/delete-plantation-setting.ts +13 -0
  255. package/server/graphql/resolvers/plantation-setting/delete-plantation-settings.ts +16 -0
  256. package/server/graphql/resolvers/plantation-setting/index.ts +19 -0
  257. package/server/graphql/resolvers/plantation-setting/plantation-setting-query.ts +38 -0
  258. package/server/graphql/resolvers/plantation-setting/update-multiple-plantation-setting.ts +46 -0
  259. package/server/graphql/resolvers/plantation-setting/update-plantation-setting.ts +19 -0
  260. package/server/graphql/resolvers/report/daily-ffb-dispatch-production-reports.ts +138 -0
  261. package/server/graphql/resolvers/report/daily-production-reports.ts +59 -48
  262. package/server/graphql/resolvers/report/daily-staff-harvest-reports.ts +28 -20
  263. package/server/graphql/resolvers/report/index.ts +9 -1
  264. package/server/graphql/resolvers/report/monthly-block-dispatch-reports.ts +114 -0
  265. package/server/graphql/resolvers/report/monthly-dispatch-summary-reports.ts +110 -0
  266. package/server/graphql/resolvers/report/monthly-ffb-sale-reports.ts +107 -0
  267. package/server/graphql/resolvers/report/monthly-production-reports.ts +54 -40
  268. package/server/graphql/resolvers/report/yearly-production-reports.ts +43 -38
  269. package/server/graphql/resolvers/truck/delete-trucks.ts +21 -0
  270. package/server/graphql/resolvers/truck/index.ts +12 -0
  271. package/server/graphql/resolvers/truck/truck-query.ts +52 -0
  272. package/server/graphql/resolvers/truck/update-multiple-truck.ts +55 -0
  273. package/server/graphql/types/daily-dispatch/daily-dispatch-patch.ts +4 -1
  274. package/server/graphql/types/daily-dispatch/daily-dispatch.ts +4 -1
  275. package/server/graphql/types/daily-dispatch/index.ts +6 -1
  276. package/server/graphql/types/daily-dispatch/new-daily-dispatch.ts +4 -1
  277. package/server/graphql/types/daily-harvest/daily-harvest-patch.ts +5 -2
  278. package/server/graphql/types/daily-harvest/daily-harvest.ts +3 -0
  279. package/server/graphql/types/daily-harvest/new-daily-harvest.ts +4 -1
  280. package/server/graphql/types/daily-harvest-detail/daily-harvest-detail-patch.ts +1 -0
  281. package/server/graphql/types/daily-harvest-detail/daily-harvest-detail.ts +1 -0
  282. package/server/graphql/types/daily-harvest-detail/new-daily-harvest-detail.ts +1 -0
  283. package/server/graphql/types/daily-loading/daily-loading-patch.ts +0 -2
  284. package/server/graphql/types/daily-loading/daily-loading.ts +0 -2
  285. package/server/graphql/types/daily-loading/new-daily-loading.ts +0 -2
  286. package/server/graphql/types/daily-loading-detail/daily-loading-detail-patch.ts +6 -3
  287. package/server/graphql/types/daily-loading-detail/daily-loading-detail.ts +3 -0
  288. package/server/graphql/types/daily-loading-detail/new-daily-loading-detail.ts +6 -3
  289. package/server/graphql/types/dashboard/bunches-count.ts +9 -0
  290. package/server/graphql/types/dashboard/index.ts +17 -0
  291. package/server/graphql/types/dashboard/productions-overview.ts +9 -0
  292. package/server/graphql/types/dashboard/tonnage-bunches-inventories.ts +8 -0
  293. package/server/graphql/types/dashboard/tonnage-production.ts +11 -0
  294. package/server/graphql/types/dashboard/yield-production.ts +11 -0
  295. package/server/graphql/types/index.ts +10 -6
  296. package/server/graphql/types/organization-staff/organization-staff-patch.ts +2 -0
  297. package/server/graphql/types/organization-staff/organization-staff.ts +3 -0
  298. package/server/graphql/types/plantation-setting/index.ts +21 -0
  299. package/server/graphql/types/plantation-setting/new-plantation-setting.ts +10 -0
  300. package/server/graphql/types/plantation-setting/plantation-setting-list.ts +8 -0
  301. package/server/graphql/types/plantation-setting/plantation-setting-patch.ts +12 -0
  302. package/server/graphql/types/plantation-setting/plantation-setting.ts +16 -0
  303. package/server/graphql/types/report/daily-ffb-dispatch-production-report-list.ts +8 -0
  304. package/server/graphql/types/report/daily-ffb-dispatch-production-report.ts +9 -0
  305. package/server/graphql/types/report/index.ts +33 -0
  306. package/server/graphql/types/report/monthly-block-dispatch-report-list.ts +7 -0
  307. package/server/graphql/types/report/monthly-block-dispatch-report.ts +13 -0
  308. package/server/graphql/types/report/monthly-dispatch-summary-report-list.ts +7 -0
  309. package/server/graphql/types/report/monthly-dispatch-summary-report.ts +19 -0
  310. package/server/graphql/types/report/monthly-ffb-sale-report-list.ts +7 -0
  311. package/server/graphql/types/report/monthly-ffb-sale-report.ts +18 -0
  312. package/server/graphql/types/truck/index.ts +18 -0
  313. package/server/graphql/types/truck/new-truck.ts +8 -0
  314. package/server/graphql/types/truck/truck-list.ts +8 -0
  315. package/server/graphql/types/truck/truck-patch.ts +11 -0
  316. package/server/graphql/types/truck/truck.ts +16 -0
  317. package/server/utils/core-values.ts +2 -2
  318. package/server/utils/transaction-util.ts +2 -1
  319. package/things-factory.config.js +27 -1
  320. package/translations/en.json +79 -16
  321. package/translations/ko.json +78 -48
  322. package/translations/ms.json +78 -48
  323. package/translations/zh.json +78 -48
@@ -53,6 +53,17 @@ export default function bootstrap() {
53
53
  }
54
54
  })
55
55
 
56
+ store.dispatch({
57
+ type: ADD_MORENDA,
58
+ morenda: {
59
+ icon: html` <mwc-icon>code</mwc-icon> `,
60
+ name: html` <i18n-msg msgid="text.code-management"></i18n-msg> `,
61
+ action: () => {
62
+ navigate('codes')
63
+ }
64
+ }
65
+ })
66
+
56
67
  if (!isMobileDevice()) {
57
68
  store.dispatch({
58
69
  type: APPEND_APP_TOOL,
@@ -1,19 +1,24 @@
1
1
  import '@things-factory/grist-ui'
2
2
  import '@things-factory/import-ui'
3
3
  import '@things-factory/form-ui'
4
+
5
+ import gql from 'graphql-tag'
6
+ import { css, html, LitElement } from 'lit-element'
7
+
4
8
  import { i18next, localize } from '@things-factory/i18n-base'
5
9
  import { client } from '@things-factory/shell'
6
10
  import { ScrollbarStyles } from '@things-factory/styles'
7
- import { gqlBuilder, isMobileDevice } from '@things-factory/utils'
8
- import gql from 'graphql-tag'
9
- import { css, html, LitElement } from 'lit-element'
11
+ import { isMobileDevice } from '@things-factory/utils'
10
12
 
11
13
  class BlockSelectorPopup extends localize(i18next)(LitElement) {
12
14
  static get properties() {
13
15
  return {
14
16
  _searchFields: Array,
15
17
  blockConfig: Object,
16
- data: Object
18
+ subBlockConfig: Object,
19
+ _blockName: String,
20
+ _blockId: String,
21
+ subBlocks: Object
17
22
  }
18
23
  }
19
24
 
@@ -62,6 +67,22 @@ class BlockSelectorPopup extends localize(i18next)(LitElement) {
62
67
  background-color: var(--button-container-background);
63
68
  height: var(--button-container-height);
64
69
  }
70
+ .button-container button {
71
+ background-color: var(--button-container-button-background-color);
72
+ border-radius: var(--button-container-button-border-radius);
73
+ height: var(--button-container-button-height);
74
+ border: var(--button-container-button-border);
75
+ margin: var(--button-container-button-margin);
76
+
77
+ padding: var(--button-padding);
78
+ color: var(--theme-white-color);
79
+ font: var(--button-font);
80
+ text-transform: var(--button-text-transform);
81
+ }
82
+ .button-container button:hover,
83
+ .button-container button:active {
84
+ background-color: var(--button-background-focus-color);
85
+ }
65
86
  [danger] {
66
87
  --mdc-theme-primary: var(--mdc-danger-button-primary-color);
67
88
  }
@@ -79,11 +100,22 @@ class BlockSelectorPopup extends localize(i18next)(LitElement) {
79
100
 
80
101
  <div class="grist-container">
81
102
  <div class="grist">
103
+ <h2>${i18next.t('title.main_block')}</h2>
82
104
  <data-grist
83
105
  id="block"
84
106
  .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
85
107
  .config=${this.blockConfig}
86
- .fetchHandler="${this.fetchHandler.bind(this)}"
108
+ .fetchHandler=${this.fetchMainBlock.bind(this)}
109
+ ></data-grist>
110
+ </div>
111
+
112
+ <div class="grist">
113
+ <h2>${i18next.t('title.sub_block')}: ${this._blockName}</h2>
114
+ <data-grist
115
+ id="sub-block"
116
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
117
+ .config=${this.subBlockConfig}
118
+ .fetchHandler="${this.fetchSubBlock.bind(this)}"
87
119
  ></data-grist>
88
120
  </div>
89
121
  </div>
@@ -105,7 +137,7 @@ class BlockSelectorPopup extends localize(i18next)(LitElement) {
105
137
 
106
138
  updated(changes) {
107
139
  if (this.active) {
108
- this.dataGrist.fetch()
140
+ this.blockGrist.fetch()
109
141
  }
110
142
  }
111
143
 
@@ -116,18 +148,20 @@ class BlockSelectorPopup extends localize(i18next)(LitElement) {
116
148
  name: 'name',
117
149
  type: 'text',
118
150
  props: { searchOper: 'i_like' }
119
- },
120
- {
121
- label: i18next.t('field.type'),
122
- name: 'type',
123
- type: 'text',
124
- props: { searchOper: 'i_like' }
125
151
  }
126
152
  ]
127
153
 
128
154
  this.blockConfig = {
155
+ pagination: { infinite: true },
129
156
  rows: {
130
157
  selectable: { multiple: false },
158
+ handlers: {
159
+ click: (columns, data, column, record, rowIndex) => {
160
+ this._blockName = record.name
161
+ this._blockId = record.id
162
+ this.subBlockGrist.fetch()
163
+ }
164
+ },
131
165
  appendable: false
132
166
  },
133
167
  columns: [
@@ -149,12 +183,35 @@ class BlockSelectorPopup extends localize(i18next)(LitElement) {
149
183
  name: 'description',
150
184
  header: i18next.t('field.description'),
151
185
  width: 180
186
+ }
187
+ ]
188
+ }
189
+
190
+ this.subBlockConfig = {
191
+ pagination: { infinite: true },
192
+ rows: {
193
+ selectable: { multiple: false },
194
+ appendable: false
195
+ },
196
+ columns: [
197
+ { type: 'gutter', gutterName: 'sequence' },
198
+ { type: 'gutter', gutterName: 'row-selector', multiple: false },
199
+ {
200
+ type: 'string',
201
+ name: 'id',
202
+ hidden: true
152
203
  },
153
204
  {
154
205
  type: 'string',
155
- name: 'type',
156
- header: i18next.t('field.type'),
157
- width: 100
206
+ name: 'name',
207
+ header: i18next.t('field.name'),
208
+ width: 180
209
+ },
210
+ {
211
+ type: 'string',
212
+ name: 'description',
213
+ header: i18next.t('field.description'),
214
+ width: 180
158
215
  }
159
216
  ]
160
217
  }
@@ -168,15 +225,18 @@ class BlockSelectorPopup extends localize(i18next)(LitElement) {
168
225
  return this.shadowRoot.querySelector('data-grist#block')
169
226
  }
170
227
 
171
- async fetchHandler({ page, limit, sorters = [] }) {
172
- const filters = this.searchForm.queryFilters
173
- const pagination = { page, limit }
228
+ get subBlockGrist() {
229
+ return this.shadowRoot.querySelector('data-grist#sub-block')
230
+ }
231
+
232
+ async fetchMainBlock({ sorters = [] }) {
233
+ const filters = [...this.searchForm.queryFilters, { name: 'hasChildren', operator: 'eq', value: true }]
174
234
  const sortings = sorters
175
235
 
176
236
  const response = await client.query({
177
237
  query: gql`
178
- query blocks($filters: [Filter], $pagination: Pagination, $sortings: [Sorting]) {
179
- blocks(filters: $filters, pagination: $pagination, sortings: $sortings) {
238
+ query blocks($filters: [Filter], $sortings: [Sorting]) {
239
+ blocks(filters: $filters, sortings: $sortings) {
180
240
  items {
181
241
  id
182
242
  name
@@ -187,7 +247,43 @@ class BlockSelectorPopup extends localize(i18next)(LitElement) {
187
247
  }
188
248
  }
189
249
  `,
190
- variables: { filters, pagination, sortings }
250
+ variables: { filters, sortings }
251
+ })
252
+
253
+ return {
254
+ total: response.data.blocks.total || 0,
255
+ records: response.data.blocks.items || []
256
+ }
257
+ }
258
+
259
+ async fetchSubBlock({ sorters = [] }) {
260
+ if (!this._blockId) return
261
+
262
+ const filters = [
263
+ ...this.searchForm.queryFilters,
264
+ {
265
+ name: 'parent_block_id',
266
+ operator: 'eq',
267
+ value: this._blockId
268
+ }
269
+ ]
270
+ const sortings = sorters
271
+
272
+ const response = await client.query({
273
+ query: gql`
274
+ query blocks($filters: [Filter], $sortings: [Sorting]) {
275
+ blocks(filters: $filters, sortings: $sortings) {
276
+ items {
277
+ id
278
+ name
279
+ description
280
+ type
281
+ }
282
+ total
283
+ }
284
+ }
285
+ `,
286
+ variables: { filters, sortings }
191
287
  })
192
288
 
193
289
  return {
@@ -197,9 +293,14 @@ class BlockSelectorPopup extends localize(i18next)(LitElement) {
197
293
  }
198
294
 
199
295
  _selectBlock() {
200
- const selectedBlock = this.blockGrist.selected[0]
201
- if (selectedBlock) {
202
- this.dispatchEvent(new CustomEvent('selected', { detail: this.blockGrist.selected[0] }))
296
+ const selectedBlock = this.subBlockGrist.selected.map(block => {
297
+ return {
298
+ ...block,
299
+ blockName: block.name
300
+ }
301
+ })
302
+ if (selectedBlock?.length) {
303
+ this.dispatchEvent(new CustomEvent('selected', { detail: selectedBlock[0] }))
203
304
  history.back()
204
305
  } else {
205
306
  document.dispatchEvent(
@@ -0,0 +1,223 @@
1
+ import '@things-factory/grist-ui'
2
+ import '@things-factory/import-ui'
3
+ import '@things-factory/form-ui'
4
+
5
+ import gql from 'graphql-tag'
6
+ import { css, html, LitElement } from 'lit-element'
7
+
8
+ import { i18next, localize } from '@things-factory/i18n-base'
9
+ import { client } from '@things-factory/shell'
10
+ import { ScrollbarStyles } from '@things-factory/styles'
11
+ import { isMobileDevice } from '@things-factory/utils'
12
+
13
+ class DriverSelectorPopup extends localize(i18next)(LitElement) {
14
+ static get properties() {
15
+ return {
16
+ _searchFields: Array,
17
+ gristConfig: Object
18
+ }
19
+ }
20
+
21
+ static get styles() {
22
+ return [
23
+ ScrollbarStyles,
24
+ css`
25
+ :host {
26
+ display: flex;
27
+ flex-direction: column;
28
+ overflow: hidden;
29
+ background-color: white;
30
+ }
31
+
32
+ search-form {
33
+ overflow: visible;
34
+ }
35
+ .grist {
36
+ display: flex;
37
+ flex-direction: column;
38
+ flex: 1;
39
+ overflow-y: auto;
40
+ }
41
+ .grist-container {
42
+ overflow-y: hidden;
43
+ display: flex;
44
+ flex: 1;
45
+ }
46
+ data-grist {
47
+ overflow-y: hidden;
48
+ flex: 1;
49
+ }
50
+ h2 {
51
+ padding: var(--subtitle-padding);
52
+ font: var(--subtitle-font);
53
+ color: var(--subtitle-text-color);
54
+ border-bottom: var(--subtitle-border-bottom);
55
+ }
56
+ .grist h2 {
57
+ font: var(--grist-title-font);
58
+ }
59
+ .button-container {
60
+ padding: var(--button-container-padding);
61
+ margin: var(--button-container-margin);
62
+ text-align: var(--button-container-align);
63
+ background-color: var(--button-container-background);
64
+ height: var(--button-container-height);
65
+ }
66
+ .button-container button {
67
+ background-color: var(--button-container-button-background-color);
68
+ border-radius: var(--button-container-button-border-radius);
69
+ height: var(--button-container-button-height);
70
+ border: var(--button-container-button-border);
71
+ margin: var(--button-container-button-margin);
72
+
73
+ padding: var(--button-padding);
74
+ color: var(--theme-white-color);
75
+ font: var(--button-font);
76
+ text-transform: var(--button-text-transform);
77
+ }
78
+ .button-container button:hover,
79
+ .button-container button:active {
80
+ background-color: var(--button-background-focus-color);
81
+ }
82
+ [danger] {
83
+ --mdc-theme-primary: var(--mdc-danger-button-primary-color);
84
+ }
85
+ `
86
+ ]
87
+ }
88
+
89
+ render() {
90
+ return html`
91
+ <search-form id="search-form" .fields=${this._searchFields} @submit=${() => this.dataGrist.fetch()}></search-form>
92
+
93
+ <div class="grist">
94
+ <data-grist
95
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
96
+ .config="${this.gristConfig}"
97
+ .fetchHandler="${this.fetchHandler.bind(this)}"
98
+ ></data-grist>
99
+ </div>
100
+
101
+ <div class="button-container">
102
+ <mwc-button
103
+ raised
104
+ danger
105
+ @click=${() => {
106
+ history.back()
107
+ }}
108
+ >
109
+ ${i18next.t('button.cancel')}
110
+ </mwc-button>
111
+ <mwc-button raised @click=${this._selectDriver.bind(this)}>${i18next.t('button.confirm')}</mwc-button>
112
+ </div>
113
+ `
114
+ }
115
+
116
+ updated(changes) {
117
+ if (this.active) {
118
+ this.dataGrist.fetch()
119
+ }
120
+ }
121
+
122
+ firstUpdated() {
123
+ this._searchFields = [
124
+ {
125
+ label: i18next.t('label.name'),
126
+ name: 'name',
127
+ type: 'text',
128
+ props: { searchOper: 'i_like' }
129
+ }
130
+ ]
131
+
132
+ this.gristConfig = {
133
+ pagination: { infinite: true },
134
+ rows: {
135
+ selectable: { multiple: false },
136
+ appendable: false
137
+ },
138
+ columns: [
139
+ { type: 'gutter', gutterName: 'sequence' },
140
+ { type: 'gutter', gutterName: 'row-selector', multiple: false },
141
+ {
142
+ type: 'string',
143
+ name: 'id',
144
+ hidden: true
145
+ },
146
+ {
147
+ type: 'string',
148
+ name: 'name',
149
+ header: i18next.t('field.name'),
150
+ width: 180
151
+ },
152
+ {
153
+ type: 'string',
154
+ name: 'description',
155
+ header: i18next.t('field.description'),
156
+ width: 180
157
+ },
158
+ {
159
+ type: 'string',
160
+ name: 'idNumber',
161
+ header: i18next.t('field.id_number'),
162
+ width: 180
163
+ },
164
+ {
165
+ type: 'string',
166
+ name: 'type',
167
+ header: i18next.t('field.type'),
168
+ width: 120
169
+ }
170
+ ]
171
+ }
172
+ }
173
+
174
+ get searchForm() {
175
+ return this.shadowRoot.querySelector('search-form')
176
+ }
177
+
178
+ get dataGrist() {
179
+ return this.shadowRoot.querySelector('data-grist')
180
+ }
181
+
182
+ async fetchHandler({ sorters = [] }) {
183
+ const filters = [...this.searchForm.queryFilters, { name: 'type', operator: 'eq', value: 'DRIVER' }]
184
+ const sortings = sorters
185
+
186
+ const response = await client.query({
187
+ query: gql`
188
+ query organizationStaffs($filters: [Filter], $sortings: [Sorting]) {
189
+ organizationStaffs(filters: $filters, sortings: $sortings) {
190
+ items {
191
+ id
192
+ name
193
+ staffId
194
+ type
195
+ idNumber
196
+ }
197
+ total
198
+ }
199
+ }
200
+ `,
201
+ variables: { filters, sortings }
202
+ })
203
+
204
+ return {
205
+ total: response.data.organizationStaffs.total || 0,
206
+ records: response.data.organizationStaffs.items || []
207
+ }
208
+ }
209
+
210
+ _selectDriver() {
211
+ const selectedDriver = this.dataGrist.selected[0]
212
+ if (selectedDriver) {
213
+ this.dispatchEvent(new CustomEvent('selected', { detail: this.dataGrist.selected[0] }))
214
+ history.back()
215
+ } else {
216
+ document.dispatchEvent(
217
+ new CustomEvent('notify', { detail: { message: i18next.t('text.driver_is_not_selected') } })
218
+ )
219
+ }
220
+ }
221
+ }
222
+
223
+ window.customElements.define('driver-selector-popup', DriverSelectorPopup)
@@ -0,0 +1,200 @@
1
+ import '@things-factory/grist-ui'
2
+ import '@things-factory/import-ui'
3
+ import '@things-factory/form-ui'
4
+
5
+ import gql from 'graphql-tag'
6
+ import { css, html, LitElement } from 'lit-element'
7
+
8
+ import { i18next, localize } from '@things-factory/i18n-base'
9
+ import { client } from '@things-factory/shell'
10
+ import { ScrollbarStyles } from '@things-factory/styles'
11
+ import { isMobileDevice } from '@things-factory/utils'
12
+
13
+ class MillSelectorPopup extends localize(i18next)(LitElement) {
14
+ static get properties() {
15
+ return {
16
+ _searchFields: Array,
17
+ gristConfig: Object
18
+ }
19
+ }
20
+
21
+ static get styles() {
22
+ return [
23
+ ScrollbarStyles,
24
+ css`
25
+ :host {
26
+ display: flex;
27
+ flex-direction: column;
28
+ overflow: hidden;
29
+ background-color: white;
30
+ }
31
+
32
+ search-form {
33
+ overflow: visible;
34
+ }
35
+ .grist {
36
+ display: flex;
37
+ flex-direction: column;
38
+ flex: 1;
39
+ overflow-y: auto;
40
+ }
41
+ .grist-container {
42
+ overflow-y: hidden;
43
+ display: flex;
44
+ flex: 1;
45
+ }
46
+ data-grist {
47
+ overflow-y: hidden;
48
+ flex: 1;
49
+ }
50
+ h2 {
51
+ padding: var(--subtitle-padding);
52
+ font: var(--subtitle-font);
53
+ color: var(--subtitle-text-color);
54
+ border-bottom: var(--subtitle-border-bottom);
55
+ }
56
+ .grist h2 {
57
+ font: var(--grist-title-font);
58
+ }
59
+ .button-container {
60
+ padding: var(--button-container-padding);
61
+ margin: var(--button-container-margin);
62
+ text-align: var(--button-container-align);
63
+ background-color: var(--button-container-background);
64
+ height: var(--button-container-height);
65
+ }
66
+ .button-container button {
67
+ background-color: var(--button-container-button-background-color);
68
+ border-radius: var(--button-container-button-border-radius);
69
+ height: var(--button-container-button-height);
70
+ border: var(--button-container-button-border);
71
+ margin: var(--button-container-button-margin);
72
+
73
+ padding: var(--button-padding);
74
+ color: var(--theme-white-color);
75
+ font: var(--button-font);
76
+ text-transform: var(--button-text-transform);
77
+ }
78
+ .button-container button:hover,
79
+ .button-container button:active {
80
+ background-color: var(--button-background-focus-color);
81
+ }
82
+ [danger] {
83
+ --mdc-theme-primary: var(--mdc-danger-button-primary-color);
84
+ }
85
+ `
86
+ ]
87
+ }
88
+
89
+ render() {
90
+ return html`
91
+ <search-form id="search-form" .fields=${this._searchFields} @submit=${() => this.dataGrist.fetch()}></search-form>
92
+
93
+ <div class="grist">
94
+ <data-grist
95
+ .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
96
+ .config="${this.gristConfig}"
97
+ .fetchHandler="${this.fetchHandler.bind(this)}"
98
+ ></data-grist>
99
+ </div>
100
+
101
+ <div class="button-container">
102
+ <mwc-button
103
+ raised
104
+ danger
105
+ @click=${() => {
106
+ history.back()
107
+ }}
108
+ >
109
+ ${i18next.t('button.cancel')}
110
+ </mwc-button>
111
+ <mwc-button raised @click=${this._select.bind(this)}>${i18next.t('button.confirm')}</mwc-button>
112
+ </div>
113
+ `
114
+ }
115
+
116
+ updated(changes) {
117
+ if (this.active) {
118
+ this.dataGrist.fetch()
119
+ }
120
+ }
121
+
122
+ firstUpdated() {
123
+ this._searchFields = [
124
+ {
125
+ label: i18next.t('label.name'),
126
+ name: 'name',
127
+ type: 'text',
128
+ props: { searchOper: 'i_like' }
129
+ }
130
+ ]
131
+
132
+ this.gristConfig = {
133
+ pagination: { infinite: true },
134
+ rows: {
135
+ selectable: { multiple: false },
136
+ appendable: false
137
+ },
138
+ columns: [
139
+ { type: 'gutter', gutterName: 'sequence' },
140
+ { type: 'gutter', gutterName: 'row-selector', multiple: false },
141
+ {
142
+ type: 'string',
143
+ name: 'id',
144
+ hidden: true
145
+ },
146
+ {
147
+ type: 'string',
148
+ name: 'name',
149
+ header: i18next.t('field.name'),
150
+ width: 180
151
+ }
152
+ ]
153
+ }
154
+ }
155
+
156
+ get searchForm() {
157
+ return this.shadowRoot.querySelector('search-form')
158
+ }
159
+
160
+ get dataGrist() {
161
+ return this.shadowRoot.querySelector('data-grist')
162
+ }
163
+
164
+ async fetchHandler({ sorters = [] }) {
165
+ const filters = [...this.searchForm.queryFilters, { name: 'type', operator: 'eq', value: 'MILL' }]
166
+ const sortings = sorters
167
+
168
+ const response = await client.query({
169
+ query: gql`
170
+ query organizations($filters: [Filter], $sortings: [Sorting]) {
171
+ organizations(filters: $filters, sortings: $sortings) {
172
+ items {
173
+ id
174
+ name
175
+ }
176
+ total
177
+ }
178
+ }
179
+ `,
180
+ variables: { filters, sortings }
181
+ })
182
+
183
+ return {
184
+ total: response.data.organizations.total || 0,
185
+ records: response.data.organizations.items || []
186
+ }
187
+ }
188
+
189
+ _select() {
190
+ const selectedMill = this.dataGrist.selected[0]
191
+ if (selectedMill) {
192
+ this.dispatchEvent(new CustomEvent('selected', { detail: this.dataGrist.selected[0] }))
193
+ history.back()
194
+ } else {
195
+ document.dispatchEvent(new CustomEvent('notify', { detail: { message: i18next.t('text.mill_is_not_selected') } }))
196
+ }
197
+ }
198
+ }
199
+
200
+ window.customElements.define('mill-selector-popup', MillSelectorPopup)