@zeniai/client-epic-state 5.1.18-betaAA0 → 5.1.18-betaDI10

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 (386) hide show
  1. package/lib/commonStateTypes/viewAndReport/agingReportStateTypes.d.ts +1 -1
  2. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  3. package/lib/entity/snackbar/snackbarTypes.js +1 -0
  4. package/lib/entity/task/taskPayload.d.ts +1 -0
  5. package/lib/entity/task/taskPayload.js +1 -0
  6. package/lib/entity/task/taskReducer.d.ts +5 -1
  7. package/lib/entity/task/taskReducer.js +8 -2
  8. package/lib/entity/task/taskState.d.ts +2 -1
  9. package/lib/entity/tenant/clearAllEpic.d.ts +2 -39
  10. package/lib/entity/tenant/clearAllEpic.js +8 -82
  11. package/lib/entity/tenant/tenantReducer.js +3 -3
  12. package/lib/entity/transaction/payloadTypes/customerTransactionPayload.js +3 -1
  13. package/lib/epic.d.ts +4 -31
  14. package/lib/epic.js +4 -32
  15. package/lib/esm/entity/snackbar/snackbarTypes.js +1 -0
  16. package/lib/esm/entity/task/taskPayload.js +1 -0
  17. package/lib/esm/entity/task/taskReducer.js +7 -1
  18. package/lib/esm/entity/tenant/clearAllEpic.js +0 -74
  19. package/lib/esm/entity/tenant/tenantReducer.js +3 -3
  20. package/lib/esm/entity/transaction/payloadTypes/customerTransactionPayload.js +3 -1
  21. package/lib/esm/epic.js +4 -32
  22. package/lib/esm/index.js +3 -80
  23. package/lib/esm/reducer.js +0 -114
  24. package/lib/esm/view/companyTaskManagerView/epics/fetchCompanyTaskManagerViewEpic.js +2 -0
  25. package/lib/esm/view/companyTaskManagerView/epics/fetchTaskManagerMetricsEpic.js +8 -1
  26. package/lib/esm/view/taskManager/taskDetailView/epics/createSubTaskEpic.js +80 -0
  27. package/lib/esm/view/taskManager/taskDetailView/epics/fetchSubTasksEpic.js +36 -0
  28. package/lib/esm/view/taskManager/taskDetailView/epics/fetchTaskDetailEpic.js +13 -0
  29. package/lib/esm/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  30. package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +24 -4
  31. package/lib/esm/view/taskManager/taskDetailView/epics/sendCommentMentionNotificationEpic.js +37 -0
  32. package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +56 -2
  33. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +21 -9
  34. package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +3 -1
  35. package/lib/esm/view/taskManager/taskListView/taskList.js +1 -0
  36. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +189 -10
  37. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +1 -0
  38. package/lib/index.d.ts +4 -100
  39. package/lib/index.js +13 -372
  40. package/lib/reducer.d.ts +0 -114
  41. package/lib/reducer.js +12 -126
  42. package/lib/view/companyTaskManagerView/epics/fetchCompanyTaskManagerViewEpic.js +2 -0
  43. package/lib/view/companyTaskManagerView/epics/fetchTaskManagerMetricsEpic.js +8 -1
  44. package/lib/view/companyView/types/cockpitTypes.d.ts +2 -0
  45. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  46. package/lib/view/reviewCompanyView/reviewCompanyViewState.d.ts +1 -1
  47. package/lib/view/spendManagement/billPay/billList/billListReducer.d.ts +1 -1
  48. package/lib/view/spendManagement/billPay/billList/billListState.d.ts +1 -1
  49. package/lib/view/spendManagement/reimbursement/remiListView/remiListReducer.d.ts +1 -1
  50. package/lib/view/spendManagement/reimbursement/remiListView/remiListState.d.ts +3 -3
  51. package/lib/view/taskManager/taskDetailView/epics/createSubTaskEpic.d.ts +9 -0
  52. package/lib/view/taskManager/taskDetailView/epics/createSubTaskEpic.js +84 -0
  53. package/lib/view/taskManager/taskDetailView/epics/fetchSubTasksEpic.d.ts +8 -0
  54. package/lib/view/taskManager/taskDetailView/epics/fetchSubTasksEpic.js +40 -0
  55. package/lib/view/taskManager/taskDetailView/epics/fetchTaskDetailEpic.d.ts +2 -1
  56. package/lib/view/taskManager/taskDetailView/epics/fetchTaskDetailEpic.js +13 -0
  57. package/lib/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
  58. package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +24 -4
  59. package/lib/view/taskManager/taskDetailView/epics/sendCommentMentionNotificationEpic.d.ts +20 -0
  60. package/lib/view/taskManager/taskDetailView/epics/sendCommentMentionNotificationEpic.js +41 -0
  61. package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +14 -0
  62. package/lib/view/taskManager/taskDetailView/taskDetailReducer.d.ts +14 -2
  63. package/lib/view/taskManager/taskDetailView/taskDetailReducer.js +57 -3
  64. package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +2 -1
  65. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +19 -7
  66. package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +3 -1
  67. package/lib/view/taskManager/taskListView/taskList.d.ts +1 -1
  68. package/lib/view/taskManager/taskListView/taskList.js +1 -0
  69. package/lib/view/taskManager/taskListView/taskListPayload.d.ts +4 -0
  70. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +2 -1
  71. package/lib/view/taskManager/taskListView/taskListReducer.js +189 -10
  72. package/lib/view/taskManager/taskListView/taskListSelector.js +1 -0
  73. package/lib/zeniAPI.d.ts +0 -1
  74. package/package.json +1 -1
  75. package/lib/entity/invoicing/coupon/couponReducer.d.ts +0 -12
  76. package/lib/entity/invoicing/coupon/couponReducer.js +0 -33
  77. package/lib/entity/invoicing/creditNote/creditNoteReducer.d.ts +0 -12
  78. package/lib/entity/invoicing/creditNote/creditNoteReducer.js +0 -35
  79. package/lib/entity/invoicing/customer/customerReducer.d.ts +0 -12
  80. package/lib/entity/invoicing/customer/customerReducer.js +0 -33
  81. package/lib/entity/invoicing/dunningCase/dunningCaseReducer.d.ts +0 -12
  82. package/lib/entity/invoicing/dunningCase/dunningCaseReducer.js +0 -35
  83. package/lib/entity/invoicing/invoice/invoiceReducer.d.ts +0 -10
  84. package/lib/entity/invoicing/invoice/invoiceReducer.js +0 -36
  85. package/lib/entity/invoicing/invoice/invoiceSelector.d.ts +0 -5
  86. package/lib/entity/invoicing/invoice/invoiceSelector.js +0 -9
  87. package/lib/entity/invoicing/invoice/invoiceState.d.ts +0 -5
  88. package/lib/entity/invoicing/invoice/invoiceState.js +0 -2
  89. package/lib/entity/invoicing/invoicingTypes.d.ts +0 -766
  90. package/lib/entity/invoicing/invoicingTypes.js +0 -15
  91. package/lib/entity/invoicing/plan/planReducer.d.ts +0 -12
  92. package/lib/entity/invoicing/plan/planReducer.js +0 -33
  93. package/lib/entity/invoicing/product/productReducer.d.ts +0 -12
  94. package/lib/entity/invoicing/product/productReducer.js +0 -33
  95. package/lib/entity/invoicing/subscription/subscriptionReducer.d.ts +0 -12
  96. package/lib/entity/invoicing/subscription/subscriptionReducer.js +0 -35
  97. package/lib/entity/invoicing/transaction/transactionReducer.d.ts +0 -12
  98. package/lib/entity/invoicing/transaction/transactionReducer.js +0 -35
  99. package/lib/esm/entity/invoicing/coupon/couponReducer.js +0 -29
  100. package/lib/esm/entity/invoicing/creditNote/creditNoteReducer.js +0 -31
  101. package/lib/esm/entity/invoicing/customer/customerReducer.js +0 -29
  102. package/lib/esm/entity/invoicing/dunningCase/dunningCaseReducer.js +0 -31
  103. package/lib/esm/entity/invoicing/invoice/invoiceReducer.js +0 -32
  104. package/lib/esm/entity/invoicing/invoice/invoiceSelector.js +0 -4
  105. package/lib/esm/entity/invoicing/invoice/invoiceState.js +0 -1
  106. package/lib/esm/entity/invoicing/invoicingTypes.js +0 -14
  107. package/lib/esm/entity/invoicing/plan/planReducer.js +0 -29
  108. package/lib/esm/entity/invoicing/product/productReducer.js +0 -29
  109. package/lib/esm/entity/invoicing/subscription/subscriptionReducer.js +0 -31
  110. package/lib/esm/entity/invoicing/transaction/transactionReducer.js +0 -31
  111. package/lib/esm/view/invoicing/analyticsView/analyticsViewEpics.js +0 -42
  112. package/lib/esm/view/invoicing/analyticsView/analyticsViewReducer.js +0 -45
  113. package/lib/esm/view/invoicing/analyticsView/analyticsViewSelector.js +0 -10
  114. package/lib/esm/view/invoicing/approvalAction/approvalActionEpic.js +0 -28
  115. package/lib/esm/view/invoicing/approvalAction/approvalActionReducer.js +0 -36
  116. package/lib/esm/view/invoicing/approvalAction/approvalActionSelector.js +0 -5
  117. package/lib/esm/view/invoicing/approvalsView/approvalsViewEpics.js +0 -37
  118. package/lib/esm/view/invoicing/approvalsView/approvalsViewReducer.js +0 -62
  119. package/lib/esm/view/invoicing/approvalsView/approvalsViewSelector.js +0 -8
  120. package/lib/esm/view/invoicing/auditView/auditViewEpics.js +0 -46
  121. package/lib/esm/view/invoicing/auditView/auditViewReducer.js +0 -56
  122. package/lib/esm/view/invoicing/auditView/auditViewSelector.js +0 -8
  123. package/lib/esm/view/invoicing/catalogView/catalogViewEpics.js +0 -143
  124. package/lib/esm/view/invoicing/catalogView/catalogViewReducer.js +0 -162
  125. package/lib/esm/view/invoicing/catalogView/catalogViewSelector.js +0 -31
  126. package/lib/esm/view/invoicing/catalogWrite/catalogWriteEpic.js +0 -34
  127. package/lib/esm/view/invoicing/catalogWrite/catalogWriteReducer.js +0 -39
  128. package/lib/esm/view/invoicing/catalogWrite/catalogWriteSelector.js +0 -6
  129. package/lib/esm/view/invoicing/couponView/couponViewEpics.js +0 -83
  130. package/lib/esm/view/invoicing/couponView/couponViewReducer.js +0 -105
  131. package/lib/esm/view/invoicing/couponView/couponViewSelector.js +0 -18
  132. package/lib/esm/view/invoicing/couponWrite/couponWriteEpic.js +0 -29
  133. package/lib/esm/view/invoicing/couponWrite/couponWriteReducer.js +0 -36
  134. package/lib/esm/view/invoicing/couponWrite/couponWriteSelector.js +0 -5
  135. package/lib/esm/view/invoicing/createInvoice/createInvoiceEpic.js +0 -23
  136. package/lib/esm/view/invoicing/createInvoice/createInvoiceReducer.js +0 -36
  137. package/lib/esm/view/invoicing/createInvoice/createInvoiceSelector.js +0 -5
  138. package/lib/esm/view/invoicing/creditNoteView/creditNoteViewEpics.js +0 -87
  139. package/lib/esm/view/invoicing/creditNoteView/creditNoteViewReducer.js +0 -105
  140. package/lib/esm/view/invoicing/creditNoteView/creditNoteViewSelector.js +0 -20
  141. package/lib/esm/view/invoicing/customerPaymentMethod/customerPaymentMethodEpic.js +0 -63
  142. package/lib/esm/view/invoicing/customerPaymentMethod/customerPaymentMethodReducer.js +0 -84
  143. package/lib/esm/view/invoicing/customerPaymentMethod/customerPaymentMethodSelector.js +0 -7
  144. package/lib/esm/view/invoicing/customerView/customerViewEpics.js +0 -71
  145. package/lib/esm/view/invoicing/customerView/customerViewReducer.js +0 -90
  146. package/lib/esm/view/invoicing/customerView/customerViewSelector.js +0 -17
  147. package/lib/esm/view/invoicing/customerWrite/customerWriteEpic.js +0 -23
  148. package/lib/esm/view/invoicing/customerWrite/customerWriteReducer.js +0 -36
  149. package/lib/esm/view/invoicing/customerWrite/customerWriteSelector.js +0 -5
  150. package/lib/esm/view/invoicing/dataImportAction/dataImportActionEpic.js +0 -41
  151. package/lib/esm/view/invoicing/dataImportAction/dataImportActionReducer.js +0 -73
  152. package/lib/esm/view/invoicing/dataImportAction/dataImportActionSelector.js +0 -5
  153. package/lib/esm/view/invoicing/dataImportView/dataImportViewEpics.js +0 -41
  154. package/lib/esm/view/invoicing/dataImportView/dataImportViewReducer.js +0 -66
  155. package/lib/esm/view/invoicing/dataImportView/dataImportViewSelector.js +0 -6
  156. package/lib/esm/view/invoicing/dunningAction/dunningActionEpic.js +0 -28
  157. package/lib/esm/view/invoicing/dunningAction/dunningActionReducer.js +0 -36
  158. package/lib/esm/view/invoicing/dunningAction/dunningActionSelector.js +0 -5
  159. package/lib/esm/view/invoicing/dunningCaseView/dunningCaseViewEpics.js +0 -85
  160. package/lib/esm/view/invoicing/dunningCaseView/dunningCaseViewReducer.js +0 -105
  161. package/lib/esm/view/invoicing/dunningCaseView/dunningCaseViewSelector.js +0 -20
  162. package/lib/esm/view/invoicing/invoiceAction/invoiceActionEpic.js +0 -50
  163. package/lib/esm/view/invoicing/invoiceAction/invoiceActionReducer.js +0 -42
  164. package/lib/esm/view/invoicing/invoiceAction/invoiceActionSelector.js +0 -5
  165. package/lib/esm/view/invoicing/invoiceDetail/fetchInvoiceDetailEpic.js +0 -20
  166. package/lib/esm/view/invoicing/invoiceDetail/invoiceDetailReducer.js +0 -34
  167. package/lib/esm/view/invoicing/invoiceDetail/invoiceDetailSelector.js +0 -9
  168. package/lib/esm/view/invoicing/invoiceDetail/invoiceDetailState.js +0 -1
  169. package/lib/esm/view/invoicing/invoiceList/fetchInvoiceCountsEpic.js +0 -32
  170. package/lib/esm/view/invoicing/invoiceList/fetchInvoiceKPIsEpic.js +0 -17
  171. package/lib/esm/view/invoicing/invoiceList/fetchInvoiceListEpic.js +0 -55
  172. package/lib/esm/view/invoicing/invoiceList/invoiceListReducer.js +0 -90
  173. package/lib/esm/view/invoicing/invoiceList/invoiceListSelector.js +0 -11
  174. package/lib/esm/view/invoicing/invoiceList/invoiceListState.js +0 -1
  175. package/lib/esm/view/invoicing/invoicePdf/invoicePdfEpic.js +0 -37
  176. package/lib/esm/view/invoicing/invoicePdf/invoicePdfReducer.js +0 -33
  177. package/lib/esm/view/invoicing/invoicePdf/invoicePdfSelector.js +0 -5
  178. package/lib/esm/view/invoicing/invoicingApiHelper.js +0 -38
  179. package/lib/esm/view/invoicing/paymentAction/paymentActionEpic.js +0 -28
  180. package/lib/esm/view/invoicing/paymentAction/paymentActionReducer.js +0 -36
  181. package/lib/esm/view/invoicing/paymentAction/paymentActionSelector.js +0 -5
  182. package/lib/esm/view/invoicing/recordPayment/recordPaymentEpic.js +0 -23
  183. package/lib/esm/view/invoicing/recordPayment/recordPaymentReducer.js +0 -36
  184. package/lib/esm/view/invoicing/recordPayment/recordPaymentSelector.js +0 -5
  185. package/lib/esm/view/invoicing/reportsView/reportsViewEpics.js +0 -28
  186. package/lib/esm/view/invoicing/reportsView/reportsViewReducer.js +0 -54
  187. package/lib/esm/view/invoicing/reportsView/reportsViewSelector.js +0 -13
  188. package/lib/esm/view/invoicing/settingsView/settingsViewEpics.js +0 -53
  189. package/lib/esm/view/invoicing/settingsView/settingsViewReducer.js +0 -69
  190. package/lib/esm/view/invoicing/settingsView/settingsViewSelector.js +0 -7
  191. package/lib/esm/view/invoicing/subscriptionAction/subscriptionActionEpic.js +0 -28
  192. package/lib/esm/view/invoicing/subscriptionAction/subscriptionActionReducer.js +0 -36
  193. package/lib/esm/view/invoicing/subscriptionAction/subscriptionActionSelector.js +0 -5
  194. package/lib/esm/view/invoicing/subscriptionView/subscriptionViewEpics.js +0 -85
  195. package/lib/esm/view/invoicing/subscriptionView/subscriptionViewReducer.js +0 -90
  196. package/lib/esm/view/invoicing/subscriptionView/subscriptionViewSelector.js +0 -19
  197. package/lib/esm/view/invoicing/subscriptionWrite/subscriptionWriteEpic.js +0 -25
  198. package/lib/esm/view/invoicing/subscriptionWrite/subscriptionWriteReducer.js +0 -36
  199. package/lib/esm/view/invoicing/subscriptionWrite/subscriptionWriteSelector.js +0 -5
  200. package/lib/esm/view/invoicing/transactionView/transactionViewEpics.js +0 -76
  201. package/lib/esm/view/invoicing/transactionView/transactionViewReducer.js +0 -90
  202. package/lib/esm/view/invoicing/transactionView/transactionViewSelector.js +0 -19
  203. package/lib/view/invoicing/analyticsView/analyticsViewEpics.d.ts +0 -7
  204. package/lib/view/invoicing/analyticsView/analyticsViewEpics.js +0 -46
  205. package/lib/view/invoicing/analyticsView/analyticsViewReducer.d.ts +0 -22
  206. package/lib/view/invoicing/analyticsView/analyticsViewReducer.js +0 -49
  207. package/lib/view/invoicing/analyticsView/analyticsViewSelector.d.ts +0 -10
  208. package/lib/view/invoicing/analyticsView/analyticsViewSelector.js +0 -20
  209. package/lib/view/invoicing/approvalAction/approvalActionEpic.d.ts +0 -8
  210. package/lib/view/invoicing/approvalAction/approvalActionEpic.js +0 -32
  211. package/lib/view/invoicing/approvalAction/approvalActionReducer.d.ts +0 -20
  212. package/lib/view/invoicing/approvalAction/approvalActionReducer.js +0 -40
  213. package/lib/view/invoicing/approvalAction/approvalActionSelector.d.ts +0 -3
  214. package/lib/view/invoicing/approvalAction/approvalActionSelector.js +0 -9
  215. package/lib/view/invoicing/approvalsView/approvalsViewEpics.d.ts +0 -7
  216. package/lib/view/invoicing/approvalsView/approvalsViewEpics.js +0 -41
  217. package/lib/view/invoicing/approvalsView/approvalsViewReducer.d.ts +0 -33
  218. package/lib/view/invoicing/approvalsView/approvalsViewReducer.js +0 -66
  219. package/lib/view/invoicing/approvalsView/approvalsViewSelector.d.ts +0 -9
  220. package/lib/view/invoicing/approvalsView/approvalsViewSelector.js +0 -16
  221. package/lib/view/invoicing/auditView/auditViewEpics.d.ts +0 -7
  222. package/lib/view/invoicing/auditView/auditViewEpics.js +0 -50
  223. package/lib/view/invoicing/auditView/auditViewReducer.d.ts +0 -36
  224. package/lib/view/invoicing/auditView/auditViewReducer.js +0 -60
  225. package/lib/view/invoicing/auditView/auditViewSelector.d.ts +0 -9
  226. package/lib/view/invoicing/auditView/auditViewSelector.js +0 -16
  227. package/lib/view/invoicing/catalogView/catalogViewEpics.d.ts +0 -14
  228. package/lib/view/invoicing/catalogView/catalogViewEpics.js +0 -152
  229. package/lib/view/invoicing/catalogView/catalogViewReducer.d.ts +0 -76
  230. package/lib/view/invoicing/catalogView/catalogViewReducer.js +0 -166
  231. package/lib/view/invoicing/catalogView/catalogViewSelector.d.ts +0 -22
  232. package/lib/view/invoicing/catalogView/catalogViewSelector.js +0 -52
  233. package/lib/view/invoicing/catalogWrite/catalogWriteEpic.d.ts +0 -9
  234. package/lib/view/invoicing/catalogWrite/catalogWriteEpic.js +0 -38
  235. package/lib/view/invoicing/catalogWrite/catalogWriteReducer.d.ts +0 -21
  236. package/lib/view/invoicing/catalogWrite/catalogWriteReducer.js +0 -43
  237. package/lib/view/invoicing/catalogWrite/catalogWriteSelector.d.ts +0 -6
  238. package/lib/view/invoicing/catalogWrite/catalogWriteSelector.js +0 -12
  239. package/lib/view/invoicing/couponView/couponViewEpics.d.ts +0 -11
  240. package/lib/view/invoicing/couponView/couponViewEpics.js +0 -90
  241. package/lib/view/invoicing/couponView/couponViewReducer.d.ts +0 -42
  242. package/lib/view/invoicing/couponView/couponViewReducer.js +0 -109
  243. package/lib/view/invoicing/couponView/couponViewSelector.d.ts +0 -14
  244. package/lib/view/invoicing/couponView/couponViewSelector.js +0 -31
  245. package/lib/view/invoicing/couponWrite/couponWriteEpic.d.ts +0 -8
  246. package/lib/view/invoicing/couponWrite/couponWriteEpic.js +0 -33
  247. package/lib/view/invoicing/couponWrite/couponWriteReducer.d.ts +0 -17
  248. package/lib/view/invoicing/couponWrite/couponWriteReducer.js +0 -40
  249. package/lib/view/invoicing/couponWrite/couponWriteSelector.d.ts +0 -4
  250. package/lib/view/invoicing/couponWrite/couponWriteSelector.js +0 -10
  251. package/lib/view/invoicing/createInvoice/createInvoiceEpic.d.ts +0 -8
  252. package/lib/view/invoicing/createInvoice/createInvoiceEpic.js +0 -27
  253. package/lib/view/invoicing/createInvoice/createInvoiceReducer.d.ts +0 -34
  254. package/lib/view/invoicing/createInvoice/createInvoiceReducer.js +0 -40
  255. package/lib/view/invoicing/createInvoice/createInvoiceSelector.d.ts +0 -4
  256. package/lib/view/invoicing/createInvoice/createInvoiceSelector.js +0 -10
  257. package/lib/view/invoicing/creditNoteView/creditNoteViewEpics.d.ts +0 -11
  258. package/lib/view/invoicing/creditNoteView/creditNoteViewEpics.js +0 -94
  259. package/lib/view/invoicing/creditNoteView/creditNoteViewReducer.d.ts +0 -43
  260. package/lib/view/invoicing/creditNoteView/creditNoteViewReducer.js +0 -109
  261. package/lib/view/invoicing/creditNoteView/creditNoteViewSelector.d.ts +0 -14
  262. package/lib/view/invoicing/creditNoteView/creditNoteViewSelector.js +0 -33
  263. package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodEpic.d.ts +0 -11
  264. package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodEpic.js +0 -70
  265. package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodReducer.d.ts +0 -42
  266. package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodReducer.js +0 -88
  267. package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodSelector.d.ts +0 -10
  268. package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodSelector.js +0 -17
  269. package/lib/view/invoicing/customerView/customerViewEpics.d.ts +0 -10
  270. package/lib/view/invoicing/customerView/customerViewEpics.js +0 -77
  271. package/lib/view/invoicing/customerView/customerViewReducer.d.ts +0 -41
  272. package/lib/view/invoicing/customerView/customerViewReducer.js +0 -94
  273. package/lib/view/invoicing/customerView/customerViewSelector.d.ts +0 -13
  274. package/lib/view/invoicing/customerView/customerViewSelector.js +0 -29
  275. package/lib/view/invoicing/customerWrite/customerWriteEpic.d.ts +0 -8
  276. package/lib/view/invoicing/customerWrite/customerWriteEpic.js +0 -27
  277. package/lib/view/invoicing/customerWrite/customerWriteReducer.d.ts +0 -17
  278. package/lib/view/invoicing/customerWrite/customerWriteReducer.js +0 -40
  279. package/lib/view/invoicing/customerWrite/customerWriteSelector.d.ts +0 -4
  280. package/lib/view/invoicing/customerWrite/customerWriteSelector.js +0 -10
  281. package/lib/view/invoicing/dataImportAction/dataImportActionEpic.d.ts +0 -7
  282. package/lib/view/invoicing/dataImportAction/dataImportActionEpic.js +0 -45
  283. package/lib/view/invoicing/dataImportAction/dataImportActionReducer.d.ts +0 -23
  284. package/lib/view/invoicing/dataImportAction/dataImportActionReducer.js +0 -77
  285. package/lib/view/invoicing/dataImportAction/dataImportActionSelector.d.ts +0 -4
  286. package/lib/view/invoicing/dataImportAction/dataImportActionSelector.js +0 -9
  287. package/lib/view/invoicing/dataImportView/dataImportViewEpics.d.ts +0 -9
  288. package/lib/view/invoicing/dataImportView/dataImportViewEpics.js +0 -47
  289. package/lib/view/invoicing/dataImportView/dataImportViewReducer.d.ts +0 -15
  290. package/lib/view/invoicing/dataImportView/dataImportViewReducer.js +0 -70
  291. package/lib/view/invoicing/dataImportView/dataImportViewSelector.d.ts +0 -9
  292. package/lib/view/invoicing/dataImportView/dataImportViewSelector.js +0 -15
  293. package/lib/view/invoicing/dunningAction/dunningActionEpic.d.ts +0 -8
  294. package/lib/view/invoicing/dunningAction/dunningActionEpic.js +0 -32
  295. package/lib/view/invoicing/dunningAction/dunningActionReducer.d.ts +0 -21
  296. package/lib/view/invoicing/dunningAction/dunningActionReducer.js +0 -40
  297. package/lib/view/invoicing/dunningAction/dunningActionSelector.d.ts +0 -3
  298. package/lib/view/invoicing/dunningAction/dunningActionSelector.js +0 -9
  299. package/lib/view/invoicing/dunningCaseView/dunningCaseViewEpics.d.ts +0 -11
  300. package/lib/view/invoicing/dunningCaseView/dunningCaseViewEpics.js +0 -92
  301. package/lib/view/invoicing/dunningCaseView/dunningCaseViewReducer.d.ts +0 -42
  302. package/lib/view/invoicing/dunningCaseView/dunningCaseViewReducer.js +0 -109
  303. package/lib/view/invoicing/dunningCaseView/dunningCaseViewSelector.d.ts +0 -14
  304. package/lib/view/invoicing/dunningCaseView/dunningCaseViewSelector.js +0 -33
  305. package/lib/view/invoicing/invoiceAction/invoiceActionEpic.d.ts +0 -9
  306. package/lib/view/invoicing/invoiceAction/invoiceActionEpic.js +0 -55
  307. package/lib/view/invoicing/invoiceAction/invoiceActionReducer.d.ts +0 -26
  308. package/lib/view/invoicing/invoiceAction/invoiceActionReducer.js +0 -46
  309. package/lib/view/invoicing/invoiceAction/invoiceActionSelector.d.ts +0 -3
  310. package/lib/view/invoicing/invoiceAction/invoiceActionSelector.js +0 -9
  311. package/lib/view/invoicing/invoiceDetail/fetchInvoiceDetailEpic.d.ts +0 -8
  312. package/lib/view/invoicing/invoiceDetail/fetchInvoiceDetailEpic.js +0 -24
  313. package/lib/view/invoicing/invoiceDetail/invoiceDetailReducer.d.ts +0 -11
  314. package/lib/view/invoicing/invoiceDetail/invoiceDetailReducer.js +0 -38
  315. package/lib/view/invoicing/invoiceDetail/invoiceDetailSelector.d.ts +0 -5
  316. package/lib/view/invoicing/invoiceDetail/invoiceDetailSelector.js +0 -14
  317. package/lib/view/invoicing/invoiceDetail/invoiceDetailState.d.ts +0 -4
  318. package/lib/view/invoicing/invoiceDetail/invoiceDetailState.js +0 -2
  319. package/lib/view/invoicing/invoiceList/fetchInvoiceCountsEpic.d.ts +0 -7
  320. package/lib/view/invoicing/invoiceList/fetchInvoiceCountsEpic.js +0 -36
  321. package/lib/view/invoicing/invoiceList/fetchInvoiceKPIsEpic.d.ts +0 -7
  322. package/lib/view/invoicing/invoiceList/fetchInvoiceKPIsEpic.js +0 -21
  323. package/lib/view/invoicing/invoiceList/fetchInvoiceListEpic.d.ts +0 -8
  324. package/lib/view/invoicing/invoiceList/fetchInvoiceListEpic.js +0 -59
  325. package/lib/view/invoicing/invoiceList/invoiceListReducer.d.ts +0 -22
  326. package/lib/view/invoicing/invoiceList/invoiceListReducer.js +0 -94
  327. package/lib/view/invoicing/invoiceList/invoiceListSelector.d.ts +0 -11
  328. package/lib/view/invoicing/invoiceList/invoiceListSelector.js +0 -21
  329. package/lib/view/invoicing/invoiceList/invoiceListState.d.ts +0 -25
  330. package/lib/view/invoicing/invoiceList/invoiceListState.js +0 -2
  331. package/lib/view/invoicing/invoicePdf/invoicePdfEpic.d.ts +0 -7
  332. package/lib/view/invoicing/invoicePdf/invoicePdfEpic.js +0 -41
  333. package/lib/view/invoicing/invoicePdf/invoicePdfReducer.d.ts +0 -20
  334. package/lib/view/invoicing/invoicePdf/invoicePdfReducer.js +0 -37
  335. package/lib/view/invoicing/invoicePdf/invoicePdfSelector.d.ts +0 -3
  336. package/lib/view/invoicing/invoicePdf/invoicePdfSelector.js +0 -9
  337. package/lib/view/invoicing/invoicingApiHelper.d.ts +0 -22
  338. package/lib/view/invoicing/invoicingApiHelper.js +0 -44
  339. package/lib/view/invoicing/paymentAction/paymentActionEpic.d.ts +0 -8
  340. package/lib/view/invoicing/paymentAction/paymentActionEpic.js +0 -32
  341. package/lib/view/invoicing/paymentAction/paymentActionReducer.d.ts +0 -21
  342. package/lib/view/invoicing/paymentAction/paymentActionReducer.js +0 -40
  343. package/lib/view/invoicing/paymentAction/paymentActionSelector.d.ts +0 -3
  344. package/lib/view/invoicing/paymentAction/paymentActionSelector.js +0 -9
  345. package/lib/view/invoicing/recordPayment/recordPaymentEpic.d.ts +0 -8
  346. package/lib/view/invoicing/recordPayment/recordPaymentEpic.js +0 -27
  347. package/lib/view/invoicing/recordPayment/recordPaymentReducer.d.ts +0 -32
  348. package/lib/view/invoicing/recordPayment/recordPaymentReducer.js +0 -40
  349. package/lib/view/invoicing/recordPayment/recordPaymentSelector.d.ts +0 -4
  350. package/lib/view/invoicing/recordPayment/recordPaymentSelector.js +0 -10
  351. package/lib/view/invoicing/reportsView/reportsViewEpics.d.ts +0 -7
  352. package/lib/view/invoicing/reportsView/reportsViewEpics.js +0 -32
  353. package/lib/view/invoicing/reportsView/reportsViewReducer.d.ts +0 -20
  354. package/lib/view/invoicing/reportsView/reportsViewReducer.js +0 -58
  355. package/lib/view/invoicing/reportsView/reportsViewSelector.d.ts +0 -12
  356. package/lib/view/invoicing/reportsView/reportsViewSelector.js +0 -24
  357. package/lib/view/invoicing/settingsView/settingsViewEpics.d.ts +0 -10
  358. package/lib/view/invoicing/settingsView/settingsViewEpics.js +0 -60
  359. package/lib/view/invoicing/settingsView/settingsViewReducer.d.ts +0 -12
  360. package/lib/view/invoicing/settingsView/settingsViewReducer.js +0 -73
  361. package/lib/view/invoicing/settingsView/settingsViewSelector.d.ts +0 -7
  362. package/lib/view/invoicing/settingsView/settingsViewSelector.js +0 -14
  363. package/lib/view/invoicing/subscriptionAction/subscriptionActionEpic.d.ts +0 -8
  364. package/lib/view/invoicing/subscriptionAction/subscriptionActionEpic.js +0 -32
  365. package/lib/view/invoicing/subscriptionAction/subscriptionActionReducer.d.ts +0 -21
  366. package/lib/view/invoicing/subscriptionAction/subscriptionActionReducer.js +0 -40
  367. package/lib/view/invoicing/subscriptionAction/subscriptionActionSelector.d.ts +0 -3
  368. package/lib/view/invoicing/subscriptionAction/subscriptionActionSelector.js +0 -9
  369. package/lib/view/invoicing/subscriptionView/subscriptionViewEpics.d.ts +0 -10
  370. package/lib/view/invoicing/subscriptionView/subscriptionViewEpics.js +0 -91
  371. package/lib/view/invoicing/subscriptionView/subscriptionViewReducer.d.ts +0 -44
  372. package/lib/view/invoicing/subscriptionView/subscriptionViewReducer.js +0 -94
  373. package/lib/view/invoicing/subscriptionView/subscriptionViewSelector.d.ts +0 -13
  374. package/lib/view/invoicing/subscriptionView/subscriptionViewSelector.js +0 -31
  375. package/lib/view/invoicing/subscriptionWrite/subscriptionWriteEpic.d.ts +0 -8
  376. package/lib/view/invoicing/subscriptionWrite/subscriptionWriteEpic.js +0 -29
  377. package/lib/view/invoicing/subscriptionWrite/subscriptionWriteReducer.d.ts +0 -17
  378. package/lib/view/invoicing/subscriptionWrite/subscriptionWriteReducer.js +0 -40
  379. package/lib/view/invoicing/subscriptionWrite/subscriptionWriteSelector.d.ts +0 -4
  380. package/lib/view/invoicing/subscriptionWrite/subscriptionWriteSelector.js +0 -10
  381. package/lib/view/invoicing/transactionView/transactionViewEpics.d.ts +0 -10
  382. package/lib/view/invoicing/transactionView/transactionViewEpics.js +0 -82
  383. package/lib/view/invoicing/transactionView/transactionViewReducer.d.ts +0 -43
  384. package/lib/view/invoicing/transactionView/transactionViewReducer.js +0 -94
  385. package/lib/view/invoicing/transactionView/transactionViewSelector.d.ts +0 -13
  386. package/lib/view/invoicing/transactionView/transactionViewSelector.js +0 -31
@@ -4,13 +4,16 @@ import { catchError, filter, mergeMap } from 'rxjs/operators';
4
4
  import { openSnackbar } from '../../../../entity/snackbar/snackbarReducer';
5
5
  import { updateTags } from '../../../../entity/tag/tagReducer';
6
6
  import { updateTasks } from '../../../../entity/task/taskReducer';
7
+ import { getTaskById } from '../../../../entity/task/taskSelector';
7
8
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
8
9
  import { fetchFileList } from '../../../fileView/fileViewReducer';
10
+ import { updateTaskListOnNewTaskCreationSuccess } from '../../taskListView/taskListReducer';
9
11
  import { fetchTaskDetail, initializeTaskToLocalStore, removeTaskDetail, updateEditTaskFetchStatus, } from '../taskDetailReducer';
10
12
  export const fetchTaskDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(fetchTaskDetail.match), mergeMap((action) => {
11
13
  const { taskId, cacheOverride } = action.payload;
12
14
  const taskActions = [];
13
15
  const state = state$.value;
16
+ const isTaskListFetched = state.taskListState.fetchState === 'Completed';
14
17
  const taskDetail = recordGet(state.taskDetailState.editTaskStateById, taskId, undefined);
15
18
  if (cacheOverride === true) {
16
19
  taskActions.push(removeTaskDetail(taskId));
@@ -32,6 +35,16 @@ export const fetchTaskDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(
32
35
  updateTags(response.data.tasks.map((task) => task.tags).flat()),
33
36
  initializeTaskToLocalStore(taskId),
34
37
  ];
38
+ if (isTaskListFetched === true) {
39
+ const taskGroupId = response.data.tasks[0].task_group_ids?.[0];
40
+ if (taskGroupId != null) {
41
+ fetchActions.push(updateTaskListOnNewTaskCreationSuccess({
42
+ taskGroupId,
43
+ task: response.data.tasks[0],
44
+ currentTaskState: getTaskById(state.taskState, taskId),
45
+ }));
46
+ }
47
+ }
35
48
  const fileIds = response.data.tasks[0].file_ids;
36
49
  if (fileIds.length > 0) {
37
50
  fetchActions.push(fetchFileList(fileIds));
@@ -28,6 +28,7 @@ export const initializeTaskToLocalStoreEpic = (actions$, state$) => actions$.pip
28
28
  recurringStartDate: task.recurringStartDate,
29
29
  timeSpent: task.timeSpent,
30
30
  isPrivate: task.isPrivate,
31
+ taskGroupId: task.taskGroupIds[0],
31
32
  };
32
33
  const actions = [
33
34
  saveTaskUpdatesToLocalStore({ taskDetailLocalData, taskId }),
@@ -12,10 +12,26 @@ export const saveTaskDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(f
12
12
  const { taskId, taskGroupId } = action.payload;
13
13
  const state = state$.value;
14
14
  const isTaskListFetched = state.taskListState.fetchState === 'Completed';
15
+ // For an edit, prefer the locally-edited group (Bug 12). If absent,
16
+ // fall back to the entity's current group. For a create, use the
17
+ // taskGroupId from the action payload.
18
+ const localTaskGroupId = taskId != null
19
+ ? state.taskDetailState.editTaskStateById[taskId]?.taskDetailLocalData
20
+ .taskGroupId
21
+ : undefined;
22
+ // Distinguish three cases (PR #3101 review):
23
+ // - create (taskId == null): use the action payload group.
24
+ // - edit, group cleared (localTaskGroupId === null): send [] so
25
+ // the backend persists the cleared selection. The `??` fallback
26
+ // would resurrect the stale entity value otherwise.
27
+ // - edit, group untouched (localTaskGroupId === undefined): use
28
+ // the entity's current group.
29
+ const groupWasCleared = taskId != null && localTaskGroupId === null;
15
30
  const updatedTaskGroupId = taskId == null
16
31
  ? taskGroupId
17
- : getTaskById(state.taskState, taskId)?.taskGroupIds[0];
18
- const payload = prepareTaskPayload(state, taskId, updatedTaskGroupId);
32
+ : (localTaskGroupId ??
33
+ getTaskById(state.taskState, taskId)?.taskGroupIds[0]);
34
+ const payload = prepareTaskPayload(state, taskId, updatedTaskGroupId, groupWasCleared);
19
35
  const saveTaskApi = taskId != null
20
36
  ? zeniAPI.putAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks/${taskId}`, payload)
21
37
  : zeniAPI.postAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks`, payload);
@@ -67,7 +83,7 @@ export const saveTaskDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe(f
67
83
  error: createZeniAPIStatus('Unexpected Error', 'Save Task REST API call errored out' + JSON.stringify(error)),
68
84
  }))));
69
85
  }));
70
- const prepareTaskPayload = (state, taskId, taskGroupId) => {
86
+ const prepareTaskPayload = (state, taskId, taskGroupId, groupWasCleared = false) => {
71
87
  const { taskDetailState, taskState } = state;
72
88
  const syncToken = taskId != null ? (getTaskById(taskState, taskId)?.syncToken ?? '') : '';
73
89
  const sourceState = taskId != null
@@ -96,7 +112,11 @@ const prepareTaskPayload = (state, taskId, taskGroupId) => {
96
112
  ? (localData.recurringDaysOfWeek ?? [])
97
113
  : [],
98
114
  sync_token: syncToken,
99
- task_group_ids: taskGroupId != null ? [taskGroupId] : [],
115
+ task_group_ids: groupWasCleared
116
+ ? []
117
+ : taskGroupId != null
118
+ ? [taskGroupId]
119
+ : [],
100
120
  time_spent: convertHHMMStrToMinutes(localData.timeSpent),
101
121
  group_assignees: localData.groupAssignees,
102
122
  ...(taskId == null ? { is_private: localData.isPrivate ?? false } : {}),
@@ -0,0 +1,37 @@
1
+ import { createAction } from '@reduxjs/toolkit';
2
+ import { EMPTY, of } from 'rxjs';
3
+ import { catchError, filter, mergeMap } from 'rxjs/operators';
4
+ /**
5
+ * Fire-and-forget action — dispatched by the task-comments UI when a comment
6
+ * is created with @-mentions. The epic POSTs to task-manager's
7
+ * `/comment-mention-notification` endpoint which fans out Slack DMs to each
8
+ * mentioned internal user.
9
+ *
10
+ * Result is intentionally not captured in redux state: comment creation
11
+ * itself is owned by Liveblocks, and a network failure on the notification
12
+ * should not surface in the UI (the comment is still persisted in Liveblocks).
13
+ */
14
+ export const sendCommentMentionNotification = createAction('taskDetailView/sendCommentMentionNotification', (taskId, mentionedUserIds, performedById) => ({
15
+ payload: { taskId, mentionedUserIds, performedById },
16
+ }));
17
+ export const sendCommentMentionNotificationEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(sendCommentMentionNotification.match), mergeMap((action) => handleSendCommentMentionNotification(action.payload, zeniAPI)));
18
+ const handleSendCommentMentionNotification = ({ taskId, mentionedUserIds, performedById, }, zeniAPI) => {
19
+ // Short-circuit when there's nothing to send. Avoids a useless round-trip
20
+ // (server would also short-circuit with a 200/no-op, but we may as well
21
+ // not enqueue the request at all).
22
+ if (mentionedUserIds.length === 0) {
23
+ return EMPTY;
24
+ }
25
+ const url = `${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks/${taskId}/comment-mention-notification`;
26
+ const request$ = zeniAPI.postAndGetJSON(url, {
27
+ mentioned_user_ids: mentionedUserIds,
28
+ performed_by_id: performedById,
29
+ });
30
+ return request$.pipe(mergeMap(() => {
31
+ // Liveblocks owns the comment itself; the Slack fan-out is
32
+ // best-effort and intentionally silent. We swallow both
33
+ // non-success responses and network errors so a Slack outage
34
+ // does not pollute the dev console for every @-mention.
35
+ return EMPTY;
36
+ }), catchError(() => of()));
37
+ };
@@ -6,6 +6,11 @@ import { initialTaskDetail, } from './taskDetail';
6
6
  export const initialState = {
7
7
  newTaskState: initialTaskDetail,
8
8
  editTaskStateById: {},
9
+ subTaskCreateStatus: {
10
+ fetchState: 'Not-Started',
11
+ error: undefined,
12
+ },
13
+ subTaskListFetchStatusByParentId: {},
9
14
  taskHistoryById: {},
10
15
  };
11
16
  const taskDetailView = createSlice({
@@ -50,7 +55,7 @@ const taskDetailView = createSlice({
50
55
  updateEditTaskFetchStatus(draft, action) {
51
56
  const { taskId, fetchState, error } = action.payload;
52
57
  draft.editTaskStateById[taskId] = {
53
- ...draft.editTaskStateById[taskId],
58
+ ...(draft.editTaskStateById[taskId] ?? initialTaskDetail),
54
59
  fetchTaskStatus: {
55
60
  fetchState,
56
61
  error: fetchState === 'Error' ? error : undefined,
@@ -318,10 +323,59 @@ const taskDetailView = createSlice({
318
323
  error,
319
324
  };
320
325
  },
326
+ createSubTask: {
327
+ reducer(draft) {
328
+ draft.subTaskCreateStatus = {
329
+ fetchState: 'In-Progress',
330
+ error: undefined,
331
+ };
332
+ },
333
+ prepare(payload) {
334
+ return { payload };
335
+ },
336
+ },
337
+ createSubTaskSuccessOrFailure(draft, action) {
338
+ const { fetchState, error } = action.payload;
339
+ draft.subTaskCreateStatus = {
340
+ fetchState,
341
+ error,
342
+ };
343
+ },
344
+ resetSubTaskCreateStatus(draft) {
345
+ draft.subTaskCreateStatus = {
346
+ ...initialState.subTaskCreateStatus,
347
+ };
348
+ },
349
+ fetchSubTasks: {
350
+ reducer(draft, action) {
351
+ const { parentTaskId } = action.payload;
352
+ draft.subTaskListFetchStatusByParentId[parentTaskId] = {
353
+ fetchState: 'In-Progress',
354
+ error: undefined,
355
+ };
356
+ },
357
+ prepare(parentTaskId) {
358
+ return { payload: { parentTaskId } };
359
+ },
360
+ },
361
+ updateSubTasks(draft, action) {
362
+ const { parentTaskId } = action.payload;
363
+ draft.subTaskListFetchStatusByParentId[parentTaskId] = {
364
+ fetchState: 'Completed',
365
+ error: undefined,
366
+ };
367
+ },
368
+ updateSubTasksFetchStatus(draft, action) {
369
+ const { parentTaskId, fetchState, error } = action.payload;
370
+ draft.subTaskListFetchStatusByParentId[parentTaskId] = {
371
+ fetchState,
372
+ error,
373
+ };
374
+ },
321
375
  clearTaskDetail(draft) {
322
376
  Object.assign(draft, initialState);
323
377
  },
324
378
  },
325
379
  });
326
- export const { fetchTaskDetailPage, fetchTaskDetail, initializeTaskToLocalStore, updateEditTaskFetchStatus, saveTaskUpdatesToLocalStore, discardTaskUpdatesInLocalStore, saveTaskDetail, archiveTask, archiveTaskSuccessOrFailure, saveTaskSuccessOrFailure, deleteTask, removeTaskDetail, deleteTaskSuccessOrFailure, snoozeTask, snoozeTaskSuccessOrFailure, unsnoozeTask, fetchTaskHistory, updateTaskHistory, updateTaskHistoryFetchStatus, clearTaskDetail, updateCreatedTagToLocalStore, updateDeletedTagToLocalStore, } = taskDetailView.actions;
380
+ export const { fetchTaskDetailPage, fetchTaskDetail, initializeTaskToLocalStore, updateEditTaskFetchStatus, saveTaskUpdatesToLocalStore, discardTaskUpdatesInLocalStore, saveTaskDetail, archiveTask, archiveTaskSuccessOrFailure, saveTaskSuccessOrFailure, createSubTask, createSubTaskSuccessOrFailure, resetSubTaskCreateStatus, fetchSubTasks, updateSubTasks, updateSubTasksFetchStatus, deleteTask, removeTaskDetail, deleteTaskSuccessOrFailure, snoozeTask, snoozeTaskSuccessOrFailure, unsnoozeTask, fetchTaskHistory, updateTaskHistory, updateTaskHistoryFetchStatus, clearTaskDetail, updateCreatedTagToLocalStore, updateDeletedTagToLocalStore, } = taskDetailView.actions;
327
381
  export default taskDetailView.reducer;
@@ -1,8 +1,8 @@
1
1
  import isEqual from 'lodash/isEqual';
2
- import { reduceFetchState } from '../../../commonStateTypes/reduceFetchState';
2
+ import { reduceAnyFetchState } from '../../../commonStateTypes/reduceFetchState';
3
3
  import { getClassesByIds } from '../../../entity/class/classSelector';
4
4
  import { getFilesByFileIds } from '../../../entity/file/fileSelector';
5
- import { getTaskById } from '../../../entity/task/taskSelector';
5
+ import { getTaskById, getTasksByIds } from '../../../entity/task/taskSelector';
6
6
  import { getUserAndUserRole, } from '../../companyView/types/userAndRole';
7
7
  import { getFileDeleteStatusById, getFileUpdateNameStatusById, } from '../../fileView/fileViewSelector';
8
8
  import { getUserList, } from '../../userListView/userListViewSelector';
@@ -27,8 +27,13 @@ export const getTaskDetail = (state, taskId) => {
27
27
  let recurringSourceTaskId = undefined;
28
28
  let snoozedUntil = undefined;
29
29
  let taskGroupId = undefined;
30
+ let subtasks = [];
30
31
  if (taskId != null && sourceTaskDetail != null) {
31
32
  const taskEntity = getTaskById(taskState, taskId);
33
+ subtasks =
34
+ taskEntity != null
35
+ ? getTasksByIds(taskState, taskEntity.subTasksIds)
36
+ : [];
32
37
  const fileIdsInEntity = taskEntity?.fileIds ?? [];
33
38
  if (taskEntity != null) {
34
39
  createdByUser = getUserAndUserRole(userState, userRoleState, addressState, taskEntity.createdBy);
@@ -39,25 +44,27 @@ export const getTaskDetail = (state, taskId) => {
39
44
  taskGroupId = taskEntity.taskGroupIds[0];
40
45
  }
41
46
  if (fileIdsInEntity.length > 0) {
42
- fetchStatus = reduceFetchState([
47
+ fetchStatus = reduceAnyFetchState([
43
48
  fileViewState.fetchFilesStatus,
44
49
  sourceTaskDetail.fetchTaskStatus,
45
50
  userList,
46
51
  classListState,
52
+ taskDetailState.subTaskListFetchStatusByParentId[taskId] ?? fetchStatus,
47
53
  ]);
48
54
  }
49
55
  else {
50
- fetchStatus = reduceFetchState([
56
+ fetchStatus = reduceAnyFetchState([
51
57
  sourceTaskDetail.fetchTaskStatus,
52
58
  userList,
53
59
  classListState,
60
+ taskDetailState.subTaskListFetchStatusByParentId[taskId] ?? fetchStatus,
54
61
  ]);
55
62
  }
56
63
  showTaskDetailFormFooter = showFormFooter(sourceTaskDetail.taskDetailLocalData, taskEntity);
57
64
  taskHistory = taskDetailState.taskHistoryById[taskId]?.historicEvents ?? [];
58
65
  }
59
66
  else if (taskId == null) {
60
- fetchStatus = reduceFetchState([userList, classListState]);
67
+ fetchStatus = reduceAnyFetchState([userList, classListState]);
61
68
  }
62
69
  const { classIds } = classListState;
63
70
  const allAccountingClasses = getClassesByIds(classState, {
@@ -90,6 +97,7 @@ export const getTaskDetail = (state, taskId) => {
90
97
  showTaskDetailFormFooter,
91
98
  snoozedUntil,
92
99
  taskGroupId,
100
+ subtasks,
93
101
  };
94
102
  };
95
103
  export const allTaskStatus = [
@@ -137,13 +145,16 @@ export const allTaskPriority = [
137
145
  },
138
146
  ];
139
147
  const showFormFooter = (taskDetailLocalData, taskDetailInStore) => {
140
- if (taskDetailLocalData.name !== taskDetailInStore?.name ||
148
+ if (taskDetailInStore == null) {
149
+ return false;
150
+ }
151
+ if (taskDetailLocalData.name !== taskDetailInStore.name ||
141
152
  taskDetailLocalData.description !== taskDetailInStore.description ||
142
153
  taskDetailLocalData.priority !== taskDetailInStore.priority.code ||
143
154
  taskDetailLocalData.status !== taskDetailInStore.status.code ||
144
155
  !isEqual(taskDetailInStore.tagIds, taskDetailLocalData.tagIds) ||
145
- !isEqual(taskDetailLocalData.assignee, taskDetailInStore?.assignees ?? []) ||
146
- !isEqual(taskDetailLocalData.groupAssignees, taskDetailInStore?.groupAssignees ?? []) ||
156
+ !isEqual(taskDetailLocalData.assignee, taskDetailInStore.assignees ?? []) ||
157
+ !isEqual(taskDetailLocalData.groupAssignees, taskDetailInStore.groupAssignees ?? []) ||
147
158
  !isEqual(taskDetailLocalData.fileIds, taskDetailInStore.fileIds ?? []) ||
148
159
  !isEqual(taskDetailLocalData.dueDate, taskDetailInStore.dueDate) ||
149
160
  !isEqual(taskDetailLocalData.type, taskDetailInStore.type) ||
@@ -151,7 +162,8 @@ const showFormFooter = (taskDetailLocalData, taskDetailInStore) => {
151
162
  !isEqual(taskDetailLocalData.recurringFrequency, taskDetailInStore.recurringFrequency) ||
152
163
  !isEqual(taskDetailLocalData.recurringDaysOfWeek, taskDetailInStore.recurringDaysOfWeek) ||
153
164
  !isEqual(taskDetailLocalData.recurringStartDate, taskDetailInStore.recurringStartDate) ||
154
- !isEqual(taskDetailLocalData.timeSpent, taskDetailInStore.timeSpent)) {
165
+ !isEqual(taskDetailLocalData.timeSpent, taskDetailInStore.timeSpent) ||
166
+ !isEqual(taskDetailLocalData.taskGroupId, taskDetailInStore.taskGroupIds[0])) {
155
167
  return true;
156
168
  }
157
169
  return false;
@@ -9,15 +9,17 @@ export const fetchTaskListEpic = (actions$, _state$, zeniAPI) => actions$.pipe(f
9
9
  .getJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks?query=${encodeURIComponent(`{"task_type": "all"}`)}`)
10
10
  .pipe(mergeMap((response) => {
11
11
  if (isSuccessResponse(response) && response.data != null) {
12
- const { tasks, deleted, archived, snoozed } = response.data;
12
+ const { tasks, deleted, archived, snoozed, completed } = response.data;
13
13
  const allTasks = [
14
14
  ...tasks,
15
+ ...(completed ?? []),
15
16
  ...(deleted ?? []),
16
17
  ...(archived ?? []),
17
18
  ...(snoozed ?? []),
18
19
  ];
19
20
  return of(updateTasks(allTasks), updateTaskList({
20
21
  data: tasks,
22
+ completed: completed ?? [],
21
23
  deleted: deleted ?? [],
22
24
  archived: archived ?? [],
23
25
  snoozed: snoozed ?? [],
@@ -1,6 +1,7 @@
1
1
  import { stringToUnion, stringToUnionStrict, } from '../../../commonStateTypes/stringToUnion';
2
2
  export const ALL_TASK_LIST_TABS = [
3
3
  'live',
4
+ 'completed',
4
5
  'archived',
5
6
  'deleted',
6
7
  'snoozed',
@@ -1,4 +1,5 @@
1
1
  import { createSlice } from '@reduxjs/toolkit';
2
+ import { updateTasks } from '../../../entity/task/taskReducer';
2
3
  import { toPriorityCodeType, toTaskStatusCodeType, } from '../../../entity/task/taskState';
3
4
  import { date, dateNow } from '../../../zeniDayJS';
4
5
  import { toDueDateGroupKeyType, } from './taskList';
@@ -42,6 +43,7 @@ export const initialState = {
42
43
  currentTab: 'live',
43
44
  byTab: {
44
45
  live: { ...initialTabData },
46
+ completed: { ...initialTabData },
45
47
  archived: { ...initialTabData },
46
48
  deleted: { ...initialTabData },
47
49
  snoozed: { ...initialTabData },
@@ -63,14 +65,12 @@ export const initialState = {
63
65
  },
64
66
  filters: {
65
67
  categoryCombinationOperator: 'AND',
66
- categories: [
67
- {
68
- field: 'status',
69
- matchingOperator: 'not_equal',
70
- values: ['resolved'],
71
- valuesCombinationOperator: 'ANY',
72
- },
73
- ],
68
+ // Default to no filters. The Completed tab now owns the "hide resolved
69
+ // tasks from the live list" responsibility via the byTab split in
70
+ // updateTaskList / updateTaskFromListView / the updateTasks
71
+ // extraReducer. Keeping the historical `status != resolved` filter
72
+ // here would empty out the Completed tab.
73
+ categories: [],
74
74
  },
75
75
  hasValidState() {
76
76
  return this.fetchState == 'Completed';
@@ -102,13 +102,16 @@ const taskList = createSlice({
102
102
  draft.error = undefined;
103
103
  },
104
104
  updateTaskList(draft, action) {
105
- const { data, archived, deleted, snoozed } = action.payload;
105
+ const { data, archived, completed, deleted, snoozed } = action.payload;
106
106
  draft.fetchState = 'Completed';
107
107
  draft.error = undefined;
108
108
  // Group live tasks
109
109
  const liveGrouped = getGroupedTaskIds(data);
110
110
  draft.byTab.live = toTabData(liveGrouped);
111
111
  // Group other tabs if provided
112
+ if (completed != null) {
113
+ draft.byTab.completed = toTabData(getGroupedTaskIds(completed));
114
+ }
112
115
  if (archived != null) {
113
116
  draft.byTab.archived = toTabData(getGroupedTaskIds(archived));
114
117
  }
@@ -380,6 +383,7 @@ const taskList = createSlice({
380
383
  const taskId = task.id;
381
384
  draft.updateTasksFetchState.fetchState = 'In-Progress';
382
385
  draft.updateTasksFetchState.error = undefined;
386
+ let didMigrateTab = false;
383
387
  if (updates.priority != null) {
384
388
  const prevPriorityCode = toPriorityCodeType(task.priority.code);
385
389
  draft.taskIdsByPriority[prevPriorityCode] = draft.taskIdsByPriority[prevPriorityCode].filter((id) => id != taskId);
@@ -391,6 +395,25 @@ const taskList = createSlice({
391
395
  draft.taskIdsByStatus[prevStatusCode] = draft.taskIdsByStatus[prevStatusCode].filter((id) => id != taskId);
392
396
  const newStatusCode = toTaskStatusCodeType(updates.status.code);
393
397
  draft.taskIdsByStatus[newStatusCode].push(taskId);
398
+ // Optimistically re-bucket between the live and completed tabs
399
+ // when status transitions in/out of "resolved", so the task
400
+ // moves to the Completed tab without waiting for the next
401
+ // fetch. Mirrors backend split in task_handler.py: only
402
+ // `resolved` counts as completed; `done` stays Active.
403
+ //
404
+ // Subtasks travel with their parent — they appear nested under
405
+ // the parent row, not as standalone entries in byTab.taskIds.
406
+ // So we only rebucket parent tasks (tasks with no parentTaskId).
407
+ const isParent = task.parentTaskId == null;
408
+ const wasCompleted = prevStatusCode === 'resolved';
409
+ const isCompleted = newStatusCode === 'resolved';
410
+ if (isParent && wasCompleted !== isCompleted) {
411
+ const from = isCompleted ? 'live' : 'completed';
412
+ const to = isCompleted ? 'completed' : 'live';
413
+ const updatedTask = { ...task, ...updates };
414
+ migrateTaskBetweenTabs(draft, taskId, updatedTask, from, to);
415
+ didMigrateTab = true;
416
+ }
394
417
  }
395
418
  if (updates.assignees != null) {
396
419
  const prevGroupId = getAssigneesGroupKey(task.assignees);
@@ -430,7 +453,18 @@ const taskList = createSlice({
430
453
  };
431
454
  }
432
455
  }
433
- syncTopLevelToActiveTab(draft);
456
+ if (didMigrateTab) {
457
+ // The migration moved the task out of the source byTab and into
458
+ // the destination byTab. The active tab's grouping arrays are
459
+ // now authoritative — mirror them back to the top-level so the
460
+ // UI sees the task gone from Live (or freshly arrived in
461
+ // Completed). Inverse of syncTopLevelToActiveTab, used only on
462
+ // this path.
463
+ copyTabDataToTopLevel(draft, draft.byTab[draft.currentTab]);
464
+ }
465
+ else {
466
+ syncTopLevelToActiveTab(draft);
467
+ }
434
468
  },
435
469
  updateTasksListOnUpdateTaskSuccess(draft) {
436
470
  draft.updateTasksFetchState.fetchState = 'Completed';
@@ -447,6 +481,42 @@ const taskList = createSlice({
447
481
  Object.assign(draft, initialState);
448
482
  },
449
483
  },
484
+ extraReducers: (builder) => {
485
+ // When the entity store receives updated tasks (e.g. from task detail
486
+ // save, snooze/archive/unarchive, etc.), re-bucket parent tasks between
487
+ // the live and completed tabs based on the new status. Mirrors the
488
+ // backend split in task_handler.py: only `resolved` parents count as
489
+ // completed. Subtasks are nested under their parent row, so they
490
+ // never move between tabs on their own.
491
+ builder.addCase(updateTasks, (draft, action) => {
492
+ action.payload.forEach((taskPayload) => {
493
+ if (taskPayload.parent_task_id) {
494
+ return;
495
+ }
496
+ const taskId = taskPayload.task_id;
497
+ const statusCode = taskPayload.status?.code;
498
+ const isCompleted = statusCode === 'resolved';
499
+ const targetTab = isCompleted ? 'completed' : 'live';
500
+ const otherTab = isCompleted ? 'live' : 'completed';
501
+ // Skip if the task isn't currently in either of these buckets
502
+ // (archived/snoozed/deleted are managed by their own actions).
503
+ const inLive = draft.byTab.live.taskIds.includes(taskId);
504
+ const inCompleted = draft.byTab.completed.taskIds.includes(taskId);
505
+ if (!inLive && !inCompleted) {
506
+ return;
507
+ }
508
+ if (draft.byTab[otherTab].taskIds.includes(taskId)) {
509
+ migrateTaskPayloadBetweenTabs(draft, taskId, taskPayload, otherTab, targetTab);
510
+ }
511
+ else if (!draft.byTab[targetTab].taskIds.includes(taskId)) {
512
+ draft.byTab[targetTab].taskIds.push(taskId);
513
+ }
514
+ });
515
+ // Re-sync the top-level taskIds / grouping arrays for whichever
516
+ // tab the user is currently looking at.
517
+ copyTabDataToTopLevel(draft, draft.byTab[draft.currentTab]);
518
+ });
519
+ },
450
520
  });
451
521
  export const { fetchTaskListPage, fetchTaskList, updateTaskList, updateTaskListTab, updateTaskListFetchStatus, updateTaskListSearchText, updateTaskListUIState, updateTaskFilters, updateTaskListOnNewGroupCreationSuccess, bulkUpdateTaskList, updateTasksListOnBulkUpdateTasksSuccess, updateTasksListOnBulkUpdateTasksFailure, initiateTaskListLocalData, updateTaskListLocalData, updateTaskListOnTaskGroupDeletion, dragNDropTasks, updateTaskListOnNewTaskCreationSuccess, updateTaskListOnTaskGroupNameUpdate, updateTaskFromListView, updateTasksListOnUpdateTaskSuccess, updateTasksListOnUpdateTaskFailure, updateTaskListOnCreateTaskFromTemplateSuccess, removeTaskFromList, clearTaskList, } = taskList.actions;
452
522
  export default taskList.reducer;
@@ -555,6 +625,115 @@ const copyTabDataToTopLevel = (draft, tabData) => {
555
625
  draft.taskIdsByDueDate = tabData.taskIdsByDueDate;
556
626
  draft.taskIdsByTags = tabData.taskIdsByTags;
557
627
  };
628
+ /**
629
+ * Migrate a parent task between two `byTab` buckets (live ↔ completed)
630
+ * when its status flips into / out of `resolved`. The destination tab
631
+ * picks up the task in EVERY grouping dimension (status, priority,
632
+ * group id, assignees, dueDate, tags) using the UPDATED task as the
633
+ * source-of-truth for the new bucket keys. Otherwise the Completed tab
634
+ * shows the task in the right tab-level list but the grouped views
635
+ * (Group by Status, Group by Priority, etc.) miss it until the next
636
+ * full fetch. See PR #3101 review.
637
+ */
638
+ const migrateTaskBetweenTabs = (draft, taskId, updatedTask, from, to) => {
639
+ const fromTab = draft.byTab[from];
640
+ const toTab = draft.byTab[to];
641
+ // Source tab: drop the task from every grouping dimension.
642
+ removeIdsFromTabData(fromTab, [taskId]);
643
+ // Destination tab: add the task to taskIds (deduped) plus the
644
+ // appropriate bucket inside each grouping dimension based on the
645
+ // updated task.
646
+ if (!toTab.taskIds.includes(taskId)) {
647
+ toTab.taskIds.push(taskId);
648
+ }
649
+ const priorityKey = toPriorityCodeType(updatedTask.priority.code);
650
+ if (!toTab.taskIdsByPriority[priorityKey].includes(taskId)) {
651
+ toTab.taskIdsByPriority[priorityKey].push(taskId);
652
+ }
653
+ const statusKey = toTaskStatusCodeType(updatedTask.status.code);
654
+ if (!toTab.taskIdsByStatus[statusKey].includes(taskId)) {
655
+ toTab.taskIdsByStatus[statusKey].push(taskId);
656
+ }
657
+ const dueDateKey = updatedTask.dueDate != null
658
+ ? getDueDateGroupKey(updatedTask.dueDate.toString())
659
+ : 'upcoming';
660
+ if (!toTab.taskIdsByDueDate[dueDateKey].includes(taskId)) {
661
+ toTab.taskIdsByDueDate[dueDateKey].push(taskId);
662
+ }
663
+ const assigneeKey = getAssigneesGroupKey(updatedTask.assignees);
664
+ if (toTab.taskIdsByAssignees[assigneeKey] == null) {
665
+ toTab.taskIdsByAssignees[assigneeKey] = [taskId];
666
+ }
667
+ else if (!toTab.taskIdsByAssignees[assigneeKey].includes(taskId)) {
668
+ toTab.taskIdsByAssignees[assigneeKey].push(taskId);
669
+ }
670
+ const tagIds = [...updatedTask.tagIds].sort();
671
+ const tagsKey = tagIds.join(',');
672
+ if (toTab.taskIdsByTags[tagsKey] == null) {
673
+ toTab.taskIdsByTags[tagsKey] = [taskId];
674
+ }
675
+ else if (!toTab.taskIdsByTags[tagsKey].includes(taskId)) {
676
+ toTab.taskIdsByTags[tagsKey].push(taskId);
677
+ }
678
+ (updatedTask.taskGroupIds ?? []).forEach((groupId) => {
679
+ if (toTab.taskIdsByGroupsIds[groupId] == null) {
680
+ toTab.taskIdsByGroupsIds[groupId] = [taskId];
681
+ }
682
+ else if (!toTab.taskIdsByGroupsIds[groupId].includes(taskId)) {
683
+ toTab.taskIdsByGroupsIds[groupId].push(taskId);
684
+ }
685
+ });
686
+ };
687
+ /**
688
+ * `updateTasks` extraReducer variant — same migration semantics but
689
+ * keyed off the raw `TaskPayload` instead of the rich `Task` entity.
690
+ */
691
+ const migrateTaskPayloadBetweenTabs = (draft, taskId, payload, from, to) => {
692
+ const fromTab = draft.byTab[from];
693
+ const toTab = draft.byTab[to];
694
+ removeIdsFromTabData(fromTab, [taskId]);
695
+ if (!toTab.taskIds.includes(taskId)) {
696
+ toTab.taskIds.push(taskId);
697
+ }
698
+ if (payload.priority?.code != null) {
699
+ const priorityKey = toPriorityCodeType(payload.priority.code);
700
+ if (!toTab.taskIdsByPriority[priorityKey].includes(taskId)) {
701
+ toTab.taskIdsByPriority[priorityKey].push(taskId);
702
+ }
703
+ }
704
+ if (payload.status?.code != null) {
705
+ const statusKey = toTaskStatusCodeType(payload.status.code);
706
+ if (!toTab.taskIdsByStatus[statusKey].includes(taskId)) {
707
+ toTab.taskIdsByStatus[statusKey].push(taskId);
708
+ }
709
+ }
710
+ const dueDateKey = getDueDateGroupKey(payload.due_date);
711
+ if (!toTab.taskIdsByDueDate[dueDateKey].includes(taskId)) {
712
+ toTab.taskIdsByDueDate[dueDateKey].push(taskId);
713
+ }
714
+ const assigneeKey = getAssigneesGroupKey(payload.assignees ?? []);
715
+ if (toTab.taskIdsByAssignees[assigneeKey] == null) {
716
+ toTab.taskIdsByAssignees[assigneeKey] = [taskId];
717
+ }
718
+ else if (!toTab.taskIdsByAssignees[assigneeKey].includes(taskId)) {
719
+ toTab.taskIdsByAssignees[assigneeKey].push(taskId);
720
+ }
721
+ const tagsKey = getTagsGroupKey(payload.tags ?? []);
722
+ if (toTab.taskIdsByTags[tagsKey] == null) {
723
+ toTab.taskIdsByTags[tagsKey] = [taskId];
724
+ }
725
+ else if (!toTab.taskIdsByTags[tagsKey].includes(taskId)) {
726
+ toTab.taskIdsByTags[tagsKey].push(taskId);
727
+ }
728
+ (payload.task_group_ids ?? []).forEach((groupId) => {
729
+ if (toTab.taskIdsByGroupsIds[groupId] == null) {
730
+ toTab.taskIdsByGroupsIds[groupId] = [taskId];
731
+ }
732
+ else if (!toTab.taskIdsByGroupsIds[groupId].includes(taskId)) {
733
+ toTab.taskIdsByGroupsIds[groupId].push(taskId);
734
+ }
735
+ });
736
+ };
558
737
  const removeIdsFromTabData = (tabData, taskIds) => {
559
738
  const removedSet = new Set(taskIds);
560
739
  const isRemoved = (id) => removedSet.has(id);
@@ -334,6 +334,7 @@ export const getAllTasks = createSelector((state) => state.taskListState, (state
334
334
  const taskGroupTemplates = getTaskGroupTemplateByIds(taskGroupTemplateState, taskGroupTemplateViewState.taskGroupTemplateIds);
335
335
  const tabCounts = {
336
336
  live: taskListState.byTab.live.taskIds.length,
337
+ completed: taskListState.byTab.completed.taskIds.length,
337
338
  archived: taskListState.byTab.archived.taskIds.length,
338
339
  deleted: taskListState.byTab.deleted.taskIds.length,
339
340
  snoozed: taskListState.byTab.snoozed.taskIds.length,