@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.
- package/lib/commonStateTypes/viewAndReport/agingReportStateTypes.d.ts +1 -1
- package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
- package/lib/entity/snackbar/snackbarTypes.js +1 -0
- package/lib/entity/task/taskPayload.d.ts +1 -0
- package/lib/entity/task/taskPayload.js +1 -0
- package/lib/entity/task/taskReducer.d.ts +5 -1
- package/lib/entity/task/taskReducer.js +8 -2
- package/lib/entity/task/taskState.d.ts +2 -1
- package/lib/entity/tenant/clearAllEpic.d.ts +2 -39
- package/lib/entity/tenant/clearAllEpic.js +8 -82
- package/lib/entity/tenant/tenantReducer.js +3 -3
- package/lib/entity/transaction/payloadTypes/customerTransactionPayload.js +3 -1
- package/lib/epic.d.ts +4 -31
- package/lib/epic.js +4 -32
- package/lib/esm/entity/snackbar/snackbarTypes.js +1 -0
- package/lib/esm/entity/task/taskPayload.js +1 -0
- package/lib/esm/entity/task/taskReducer.js +7 -1
- package/lib/esm/entity/tenant/clearAllEpic.js +0 -74
- package/lib/esm/entity/tenant/tenantReducer.js +3 -3
- package/lib/esm/entity/transaction/payloadTypes/customerTransactionPayload.js +3 -1
- package/lib/esm/epic.js +4 -32
- package/lib/esm/index.js +3 -80
- package/lib/esm/reducer.js +0 -114
- package/lib/esm/view/companyTaskManagerView/epics/fetchCompanyTaskManagerViewEpic.js +2 -0
- package/lib/esm/view/companyTaskManagerView/epics/fetchTaskManagerMetricsEpic.js +8 -1
- package/lib/esm/view/taskManager/taskDetailView/epics/createSubTaskEpic.js +80 -0
- package/lib/esm/view/taskManager/taskDetailView/epics/fetchSubTasksEpic.js +36 -0
- package/lib/esm/view/taskManager/taskDetailView/epics/fetchTaskDetailEpic.js +13 -0
- package/lib/esm/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
- package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +24 -4
- package/lib/esm/view/taskManager/taskDetailView/epics/sendCommentMentionNotificationEpic.js +37 -0
- package/lib/esm/view/taskManager/taskDetailView/taskDetailReducer.js +56 -2
- package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +21 -9
- package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +3 -1
- package/lib/esm/view/taskManager/taskListView/taskList.js +1 -0
- package/lib/esm/view/taskManager/taskListView/taskListReducer.js +189 -10
- package/lib/esm/view/taskManager/taskListView/taskListSelector.js +1 -0
- package/lib/index.d.ts +4 -100
- package/lib/index.js +13 -372
- package/lib/reducer.d.ts +0 -114
- package/lib/reducer.js +12 -126
- package/lib/view/companyTaskManagerView/epics/fetchCompanyTaskManagerViewEpic.js +2 -0
- package/lib/view/companyTaskManagerView/epics/fetchTaskManagerMetricsEpic.js +8 -1
- package/lib/view/companyView/types/cockpitTypes.d.ts +2 -0
- package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
- package/lib/view/reviewCompanyView/reviewCompanyViewState.d.ts +1 -1
- package/lib/view/spendManagement/billPay/billList/billListReducer.d.ts +1 -1
- package/lib/view/spendManagement/billPay/billList/billListState.d.ts +1 -1
- package/lib/view/spendManagement/reimbursement/remiListView/remiListReducer.d.ts +1 -1
- package/lib/view/spendManagement/reimbursement/remiListView/remiListState.d.ts +3 -3
- package/lib/view/taskManager/taskDetailView/epics/createSubTaskEpic.d.ts +9 -0
- package/lib/view/taskManager/taskDetailView/epics/createSubTaskEpic.js +84 -0
- package/lib/view/taskManager/taskDetailView/epics/fetchSubTasksEpic.d.ts +8 -0
- package/lib/view/taskManager/taskDetailView/epics/fetchSubTasksEpic.js +40 -0
- package/lib/view/taskManager/taskDetailView/epics/fetchTaskDetailEpic.d.ts +2 -1
- package/lib/view/taskManager/taskDetailView/epics/fetchTaskDetailEpic.js +13 -0
- package/lib/view/taskManager/taskDetailView/epics/initializeTaskToLocalStoreEpic.js +1 -0
- package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +24 -4
- package/lib/view/taskManager/taskDetailView/epics/sendCommentMentionNotificationEpic.d.ts +20 -0
- package/lib/view/taskManager/taskDetailView/epics/sendCommentMentionNotificationEpic.js +41 -0
- package/lib/view/taskManager/taskDetailView/taskDetail.d.ts +14 -0
- package/lib/view/taskManager/taskDetailView/taskDetailReducer.d.ts +14 -2
- package/lib/view/taskManager/taskDetailView/taskDetailReducer.js +57 -3
- package/lib/view/taskManager/taskDetailView/taskDetailSelector.d.ts +2 -1
- package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +19 -7
- package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +3 -1
- package/lib/view/taskManager/taskListView/taskList.d.ts +1 -1
- package/lib/view/taskManager/taskListView/taskList.js +1 -0
- package/lib/view/taskManager/taskListView/taskListPayload.d.ts +4 -0
- package/lib/view/taskManager/taskListView/taskListReducer.d.ts +2 -1
- package/lib/view/taskManager/taskListView/taskListReducer.js +189 -10
- package/lib/view/taskManager/taskListView/taskListSelector.js +1 -0
- package/lib/zeniAPI.d.ts +0 -1
- package/package.json +1 -1
- package/lib/entity/invoicing/coupon/couponReducer.d.ts +0 -12
- package/lib/entity/invoicing/coupon/couponReducer.js +0 -33
- package/lib/entity/invoicing/creditNote/creditNoteReducer.d.ts +0 -12
- package/lib/entity/invoicing/creditNote/creditNoteReducer.js +0 -35
- package/lib/entity/invoicing/customer/customerReducer.d.ts +0 -12
- package/lib/entity/invoicing/customer/customerReducer.js +0 -33
- package/lib/entity/invoicing/dunningCase/dunningCaseReducer.d.ts +0 -12
- package/lib/entity/invoicing/dunningCase/dunningCaseReducer.js +0 -35
- package/lib/entity/invoicing/invoice/invoiceReducer.d.ts +0 -10
- package/lib/entity/invoicing/invoice/invoiceReducer.js +0 -36
- package/lib/entity/invoicing/invoice/invoiceSelector.d.ts +0 -5
- package/lib/entity/invoicing/invoice/invoiceSelector.js +0 -9
- package/lib/entity/invoicing/invoice/invoiceState.d.ts +0 -5
- package/lib/entity/invoicing/invoice/invoiceState.js +0 -2
- package/lib/entity/invoicing/invoicingTypes.d.ts +0 -766
- package/lib/entity/invoicing/invoicingTypes.js +0 -15
- package/lib/entity/invoicing/plan/planReducer.d.ts +0 -12
- package/lib/entity/invoicing/plan/planReducer.js +0 -33
- package/lib/entity/invoicing/product/productReducer.d.ts +0 -12
- package/lib/entity/invoicing/product/productReducer.js +0 -33
- package/lib/entity/invoicing/subscription/subscriptionReducer.d.ts +0 -12
- package/lib/entity/invoicing/subscription/subscriptionReducer.js +0 -35
- package/lib/entity/invoicing/transaction/transactionReducer.d.ts +0 -12
- package/lib/entity/invoicing/transaction/transactionReducer.js +0 -35
- package/lib/esm/entity/invoicing/coupon/couponReducer.js +0 -29
- package/lib/esm/entity/invoicing/creditNote/creditNoteReducer.js +0 -31
- package/lib/esm/entity/invoicing/customer/customerReducer.js +0 -29
- package/lib/esm/entity/invoicing/dunningCase/dunningCaseReducer.js +0 -31
- package/lib/esm/entity/invoicing/invoice/invoiceReducer.js +0 -32
- package/lib/esm/entity/invoicing/invoice/invoiceSelector.js +0 -4
- package/lib/esm/entity/invoicing/invoice/invoiceState.js +0 -1
- package/lib/esm/entity/invoicing/invoicingTypes.js +0 -14
- package/lib/esm/entity/invoicing/plan/planReducer.js +0 -29
- package/lib/esm/entity/invoicing/product/productReducer.js +0 -29
- package/lib/esm/entity/invoicing/subscription/subscriptionReducer.js +0 -31
- package/lib/esm/entity/invoicing/transaction/transactionReducer.js +0 -31
- package/lib/esm/view/invoicing/analyticsView/analyticsViewEpics.js +0 -42
- package/lib/esm/view/invoicing/analyticsView/analyticsViewReducer.js +0 -45
- package/lib/esm/view/invoicing/analyticsView/analyticsViewSelector.js +0 -10
- package/lib/esm/view/invoicing/approvalAction/approvalActionEpic.js +0 -28
- package/lib/esm/view/invoicing/approvalAction/approvalActionReducer.js +0 -36
- package/lib/esm/view/invoicing/approvalAction/approvalActionSelector.js +0 -5
- package/lib/esm/view/invoicing/approvalsView/approvalsViewEpics.js +0 -37
- package/lib/esm/view/invoicing/approvalsView/approvalsViewReducer.js +0 -62
- package/lib/esm/view/invoicing/approvalsView/approvalsViewSelector.js +0 -8
- package/lib/esm/view/invoicing/auditView/auditViewEpics.js +0 -46
- package/lib/esm/view/invoicing/auditView/auditViewReducer.js +0 -56
- package/lib/esm/view/invoicing/auditView/auditViewSelector.js +0 -8
- package/lib/esm/view/invoicing/catalogView/catalogViewEpics.js +0 -143
- package/lib/esm/view/invoicing/catalogView/catalogViewReducer.js +0 -162
- package/lib/esm/view/invoicing/catalogView/catalogViewSelector.js +0 -31
- package/lib/esm/view/invoicing/catalogWrite/catalogWriteEpic.js +0 -34
- package/lib/esm/view/invoicing/catalogWrite/catalogWriteReducer.js +0 -39
- package/lib/esm/view/invoicing/catalogWrite/catalogWriteSelector.js +0 -6
- package/lib/esm/view/invoicing/couponView/couponViewEpics.js +0 -83
- package/lib/esm/view/invoicing/couponView/couponViewReducer.js +0 -105
- package/lib/esm/view/invoicing/couponView/couponViewSelector.js +0 -18
- package/lib/esm/view/invoicing/couponWrite/couponWriteEpic.js +0 -29
- package/lib/esm/view/invoicing/couponWrite/couponWriteReducer.js +0 -36
- package/lib/esm/view/invoicing/couponWrite/couponWriteSelector.js +0 -5
- package/lib/esm/view/invoicing/createInvoice/createInvoiceEpic.js +0 -23
- package/lib/esm/view/invoicing/createInvoice/createInvoiceReducer.js +0 -36
- package/lib/esm/view/invoicing/createInvoice/createInvoiceSelector.js +0 -5
- package/lib/esm/view/invoicing/creditNoteView/creditNoteViewEpics.js +0 -87
- package/lib/esm/view/invoicing/creditNoteView/creditNoteViewReducer.js +0 -105
- package/lib/esm/view/invoicing/creditNoteView/creditNoteViewSelector.js +0 -20
- package/lib/esm/view/invoicing/customerPaymentMethod/customerPaymentMethodEpic.js +0 -63
- package/lib/esm/view/invoicing/customerPaymentMethod/customerPaymentMethodReducer.js +0 -84
- package/lib/esm/view/invoicing/customerPaymentMethod/customerPaymentMethodSelector.js +0 -7
- package/lib/esm/view/invoicing/customerView/customerViewEpics.js +0 -71
- package/lib/esm/view/invoicing/customerView/customerViewReducer.js +0 -90
- package/lib/esm/view/invoicing/customerView/customerViewSelector.js +0 -17
- package/lib/esm/view/invoicing/customerWrite/customerWriteEpic.js +0 -23
- package/lib/esm/view/invoicing/customerWrite/customerWriteReducer.js +0 -36
- package/lib/esm/view/invoicing/customerWrite/customerWriteSelector.js +0 -5
- package/lib/esm/view/invoicing/dataImportAction/dataImportActionEpic.js +0 -41
- package/lib/esm/view/invoicing/dataImportAction/dataImportActionReducer.js +0 -73
- package/lib/esm/view/invoicing/dataImportAction/dataImportActionSelector.js +0 -5
- package/lib/esm/view/invoicing/dataImportView/dataImportViewEpics.js +0 -41
- package/lib/esm/view/invoicing/dataImportView/dataImportViewReducer.js +0 -66
- package/lib/esm/view/invoicing/dataImportView/dataImportViewSelector.js +0 -6
- package/lib/esm/view/invoicing/dunningAction/dunningActionEpic.js +0 -28
- package/lib/esm/view/invoicing/dunningAction/dunningActionReducer.js +0 -36
- package/lib/esm/view/invoicing/dunningAction/dunningActionSelector.js +0 -5
- package/lib/esm/view/invoicing/dunningCaseView/dunningCaseViewEpics.js +0 -85
- package/lib/esm/view/invoicing/dunningCaseView/dunningCaseViewReducer.js +0 -105
- package/lib/esm/view/invoicing/dunningCaseView/dunningCaseViewSelector.js +0 -20
- package/lib/esm/view/invoicing/invoiceAction/invoiceActionEpic.js +0 -50
- package/lib/esm/view/invoicing/invoiceAction/invoiceActionReducer.js +0 -42
- package/lib/esm/view/invoicing/invoiceAction/invoiceActionSelector.js +0 -5
- package/lib/esm/view/invoicing/invoiceDetail/fetchInvoiceDetailEpic.js +0 -20
- package/lib/esm/view/invoicing/invoiceDetail/invoiceDetailReducer.js +0 -34
- package/lib/esm/view/invoicing/invoiceDetail/invoiceDetailSelector.js +0 -9
- package/lib/esm/view/invoicing/invoiceDetail/invoiceDetailState.js +0 -1
- package/lib/esm/view/invoicing/invoiceList/fetchInvoiceCountsEpic.js +0 -32
- package/lib/esm/view/invoicing/invoiceList/fetchInvoiceKPIsEpic.js +0 -17
- package/lib/esm/view/invoicing/invoiceList/fetchInvoiceListEpic.js +0 -55
- package/lib/esm/view/invoicing/invoiceList/invoiceListReducer.js +0 -90
- package/lib/esm/view/invoicing/invoiceList/invoiceListSelector.js +0 -11
- package/lib/esm/view/invoicing/invoiceList/invoiceListState.js +0 -1
- package/lib/esm/view/invoicing/invoicePdf/invoicePdfEpic.js +0 -37
- package/lib/esm/view/invoicing/invoicePdf/invoicePdfReducer.js +0 -33
- package/lib/esm/view/invoicing/invoicePdf/invoicePdfSelector.js +0 -5
- package/lib/esm/view/invoicing/invoicingApiHelper.js +0 -38
- package/lib/esm/view/invoicing/paymentAction/paymentActionEpic.js +0 -28
- package/lib/esm/view/invoicing/paymentAction/paymentActionReducer.js +0 -36
- package/lib/esm/view/invoicing/paymentAction/paymentActionSelector.js +0 -5
- package/lib/esm/view/invoicing/recordPayment/recordPaymentEpic.js +0 -23
- package/lib/esm/view/invoicing/recordPayment/recordPaymentReducer.js +0 -36
- package/lib/esm/view/invoicing/recordPayment/recordPaymentSelector.js +0 -5
- package/lib/esm/view/invoicing/reportsView/reportsViewEpics.js +0 -28
- package/lib/esm/view/invoicing/reportsView/reportsViewReducer.js +0 -54
- package/lib/esm/view/invoicing/reportsView/reportsViewSelector.js +0 -13
- package/lib/esm/view/invoicing/settingsView/settingsViewEpics.js +0 -53
- package/lib/esm/view/invoicing/settingsView/settingsViewReducer.js +0 -69
- package/lib/esm/view/invoicing/settingsView/settingsViewSelector.js +0 -7
- package/lib/esm/view/invoicing/subscriptionAction/subscriptionActionEpic.js +0 -28
- package/lib/esm/view/invoicing/subscriptionAction/subscriptionActionReducer.js +0 -36
- package/lib/esm/view/invoicing/subscriptionAction/subscriptionActionSelector.js +0 -5
- package/lib/esm/view/invoicing/subscriptionView/subscriptionViewEpics.js +0 -85
- package/lib/esm/view/invoicing/subscriptionView/subscriptionViewReducer.js +0 -90
- package/lib/esm/view/invoicing/subscriptionView/subscriptionViewSelector.js +0 -19
- package/lib/esm/view/invoicing/subscriptionWrite/subscriptionWriteEpic.js +0 -25
- package/lib/esm/view/invoicing/subscriptionWrite/subscriptionWriteReducer.js +0 -36
- package/lib/esm/view/invoicing/subscriptionWrite/subscriptionWriteSelector.js +0 -5
- package/lib/esm/view/invoicing/transactionView/transactionViewEpics.js +0 -76
- package/lib/esm/view/invoicing/transactionView/transactionViewReducer.js +0 -90
- package/lib/esm/view/invoicing/transactionView/transactionViewSelector.js +0 -19
- package/lib/view/invoicing/analyticsView/analyticsViewEpics.d.ts +0 -7
- package/lib/view/invoicing/analyticsView/analyticsViewEpics.js +0 -46
- package/lib/view/invoicing/analyticsView/analyticsViewReducer.d.ts +0 -22
- package/lib/view/invoicing/analyticsView/analyticsViewReducer.js +0 -49
- package/lib/view/invoicing/analyticsView/analyticsViewSelector.d.ts +0 -10
- package/lib/view/invoicing/analyticsView/analyticsViewSelector.js +0 -20
- package/lib/view/invoicing/approvalAction/approvalActionEpic.d.ts +0 -8
- package/lib/view/invoicing/approvalAction/approvalActionEpic.js +0 -32
- package/lib/view/invoicing/approvalAction/approvalActionReducer.d.ts +0 -20
- package/lib/view/invoicing/approvalAction/approvalActionReducer.js +0 -40
- package/lib/view/invoicing/approvalAction/approvalActionSelector.d.ts +0 -3
- package/lib/view/invoicing/approvalAction/approvalActionSelector.js +0 -9
- package/lib/view/invoicing/approvalsView/approvalsViewEpics.d.ts +0 -7
- package/lib/view/invoicing/approvalsView/approvalsViewEpics.js +0 -41
- package/lib/view/invoicing/approvalsView/approvalsViewReducer.d.ts +0 -33
- package/lib/view/invoicing/approvalsView/approvalsViewReducer.js +0 -66
- package/lib/view/invoicing/approvalsView/approvalsViewSelector.d.ts +0 -9
- package/lib/view/invoicing/approvalsView/approvalsViewSelector.js +0 -16
- package/lib/view/invoicing/auditView/auditViewEpics.d.ts +0 -7
- package/lib/view/invoicing/auditView/auditViewEpics.js +0 -50
- package/lib/view/invoicing/auditView/auditViewReducer.d.ts +0 -36
- package/lib/view/invoicing/auditView/auditViewReducer.js +0 -60
- package/lib/view/invoicing/auditView/auditViewSelector.d.ts +0 -9
- package/lib/view/invoicing/auditView/auditViewSelector.js +0 -16
- package/lib/view/invoicing/catalogView/catalogViewEpics.d.ts +0 -14
- package/lib/view/invoicing/catalogView/catalogViewEpics.js +0 -152
- package/lib/view/invoicing/catalogView/catalogViewReducer.d.ts +0 -76
- package/lib/view/invoicing/catalogView/catalogViewReducer.js +0 -166
- package/lib/view/invoicing/catalogView/catalogViewSelector.d.ts +0 -22
- package/lib/view/invoicing/catalogView/catalogViewSelector.js +0 -52
- package/lib/view/invoicing/catalogWrite/catalogWriteEpic.d.ts +0 -9
- package/lib/view/invoicing/catalogWrite/catalogWriteEpic.js +0 -38
- package/lib/view/invoicing/catalogWrite/catalogWriteReducer.d.ts +0 -21
- package/lib/view/invoicing/catalogWrite/catalogWriteReducer.js +0 -43
- package/lib/view/invoicing/catalogWrite/catalogWriteSelector.d.ts +0 -6
- package/lib/view/invoicing/catalogWrite/catalogWriteSelector.js +0 -12
- package/lib/view/invoicing/couponView/couponViewEpics.d.ts +0 -11
- package/lib/view/invoicing/couponView/couponViewEpics.js +0 -90
- package/lib/view/invoicing/couponView/couponViewReducer.d.ts +0 -42
- package/lib/view/invoicing/couponView/couponViewReducer.js +0 -109
- package/lib/view/invoicing/couponView/couponViewSelector.d.ts +0 -14
- package/lib/view/invoicing/couponView/couponViewSelector.js +0 -31
- package/lib/view/invoicing/couponWrite/couponWriteEpic.d.ts +0 -8
- package/lib/view/invoicing/couponWrite/couponWriteEpic.js +0 -33
- package/lib/view/invoicing/couponWrite/couponWriteReducer.d.ts +0 -17
- package/lib/view/invoicing/couponWrite/couponWriteReducer.js +0 -40
- package/lib/view/invoicing/couponWrite/couponWriteSelector.d.ts +0 -4
- package/lib/view/invoicing/couponWrite/couponWriteSelector.js +0 -10
- package/lib/view/invoicing/createInvoice/createInvoiceEpic.d.ts +0 -8
- package/lib/view/invoicing/createInvoice/createInvoiceEpic.js +0 -27
- package/lib/view/invoicing/createInvoice/createInvoiceReducer.d.ts +0 -34
- package/lib/view/invoicing/createInvoice/createInvoiceReducer.js +0 -40
- package/lib/view/invoicing/createInvoice/createInvoiceSelector.d.ts +0 -4
- package/lib/view/invoicing/createInvoice/createInvoiceSelector.js +0 -10
- package/lib/view/invoicing/creditNoteView/creditNoteViewEpics.d.ts +0 -11
- package/lib/view/invoicing/creditNoteView/creditNoteViewEpics.js +0 -94
- package/lib/view/invoicing/creditNoteView/creditNoteViewReducer.d.ts +0 -43
- package/lib/view/invoicing/creditNoteView/creditNoteViewReducer.js +0 -109
- package/lib/view/invoicing/creditNoteView/creditNoteViewSelector.d.ts +0 -14
- package/lib/view/invoicing/creditNoteView/creditNoteViewSelector.js +0 -33
- package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodEpic.d.ts +0 -11
- package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodEpic.js +0 -70
- package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodReducer.d.ts +0 -42
- package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodReducer.js +0 -88
- package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodSelector.d.ts +0 -10
- package/lib/view/invoicing/customerPaymentMethod/customerPaymentMethodSelector.js +0 -17
- package/lib/view/invoicing/customerView/customerViewEpics.d.ts +0 -10
- package/lib/view/invoicing/customerView/customerViewEpics.js +0 -77
- package/lib/view/invoicing/customerView/customerViewReducer.d.ts +0 -41
- package/lib/view/invoicing/customerView/customerViewReducer.js +0 -94
- package/lib/view/invoicing/customerView/customerViewSelector.d.ts +0 -13
- package/lib/view/invoicing/customerView/customerViewSelector.js +0 -29
- package/lib/view/invoicing/customerWrite/customerWriteEpic.d.ts +0 -8
- package/lib/view/invoicing/customerWrite/customerWriteEpic.js +0 -27
- package/lib/view/invoicing/customerWrite/customerWriteReducer.d.ts +0 -17
- package/lib/view/invoicing/customerWrite/customerWriteReducer.js +0 -40
- package/lib/view/invoicing/customerWrite/customerWriteSelector.d.ts +0 -4
- package/lib/view/invoicing/customerWrite/customerWriteSelector.js +0 -10
- package/lib/view/invoicing/dataImportAction/dataImportActionEpic.d.ts +0 -7
- package/lib/view/invoicing/dataImportAction/dataImportActionEpic.js +0 -45
- package/lib/view/invoicing/dataImportAction/dataImportActionReducer.d.ts +0 -23
- package/lib/view/invoicing/dataImportAction/dataImportActionReducer.js +0 -77
- package/lib/view/invoicing/dataImportAction/dataImportActionSelector.d.ts +0 -4
- package/lib/view/invoicing/dataImportAction/dataImportActionSelector.js +0 -9
- package/lib/view/invoicing/dataImportView/dataImportViewEpics.d.ts +0 -9
- package/lib/view/invoicing/dataImportView/dataImportViewEpics.js +0 -47
- package/lib/view/invoicing/dataImportView/dataImportViewReducer.d.ts +0 -15
- package/lib/view/invoicing/dataImportView/dataImportViewReducer.js +0 -70
- package/lib/view/invoicing/dataImportView/dataImportViewSelector.d.ts +0 -9
- package/lib/view/invoicing/dataImportView/dataImportViewSelector.js +0 -15
- package/lib/view/invoicing/dunningAction/dunningActionEpic.d.ts +0 -8
- package/lib/view/invoicing/dunningAction/dunningActionEpic.js +0 -32
- package/lib/view/invoicing/dunningAction/dunningActionReducer.d.ts +0 -21
- package/lib/view/invoicing/dunningAction/dunningActionReducer.js +0 -40
- package/lib/view/invoicing/dunningAction/dunningActionSelector.d.ts +0 -3
- package/lib/view/invoicing/dunningAction/dunningActionSelector.js +0 -9
- package/lib/view/invoicing/dunningCaseView/dunningCaseViewEpics.d.ts +0 -11
- package/lib/view/invoicing/dunningCaseView/dunningCaseViewEpics.js +0 -92
- package/lib/view/invoicing/dunningCaseView/dunningCaseViewReducer.d.ts +0 -42
- package/lib/view/invoicing/dunningCaseView/dunningCaseViewReducer.js +0 -109
- package/lib/view/invoicing/dunningCaseView/dunningCaseViewSelector.d.ts +0 -14
- package/lib/view/invoicing/dunningCaseView/dunningCaseViewSelector.js +0 -33
- package/lib/view/invoicing/invoiceAction/invoiceActionEpic.d.ts +0 -9
- package/lib/view/invoicing/invoiceAction/invoiceActionEpic.js +0 -55
- package/lib/view/invoicing/invoiceAction/invoiceActionReducer.d.ts +0 -26
- package/lib/view/invoicing/invoiceAction/invoiceActionReducer.js +0 -46
- package/lib/view/invoicing/invoiceAction/invoiceActionSelector.d.ts +0 -3
- package/lib/view/invoicing/invoiceAction/invoiceActionSelector.js +0 -9
- package/lib/view/invoicing/invoiceDetail/fetchInvoiceDetailEpic.d.ts +0 -8
- package/lib/view/invoicing/invoiceDetail/fetchInvoiceDetailEpic.js +0 -24
- package/lib/view/invoicing/invoiceDetail/invoiceDetailReducer.d.ts +0 -11
- package/lib/view/invoicing/invoiceDetail/invoiceDetailReducer.js +0 -38
- package/lib/view/invoicing/invoiceDetail/invoiceDetailSelector.d.ts +0 -5
- package/lib/view/invoicing/invoiceDetail/invoiceDetailSelector.js +0 -14
- package/lib/view/invoicing/invoiceDetail/invoiceDetailState.d.ts +0 -4
- package/lib/view/invoicing/invoiceDetail/invoiceDetailState.js +0 -2
- package/lib/view/invoicing/invoiceList/fetchInvoiceCountsEpic.d.ts +0 -7
- package/lib/view/invoicing/invoiceList/fetchInvoiceCountsEpic.js +0 -36
- package/lib/view/invoicing/invoiceList/fetchInvoiceKPIsEpic.d.ts +0 -7
- package/lib/view/invoicing/invoiceList/fetchInvoiceKPIsEpic.js +0 -21
- package/lib/view/invoicing/invoiceList/fetchInvoiceListEpic.d.ts +0 -8
- package/lib/view/invoicing/invoiceList/fetchInvoiceListEpic.js +0 -59
- package/lib/view/invoicing/invoiceList/invoiceListReducer.d.ts +0 -22
- package/lib/view/invoicing/invoiceList/invoiceListReducer.js +0 -94
- package/lib/view/invoicing/invoiceList/invoiceListSelector.d.ts +0 -11
- package/lib/view/invoicing/invoiceList/invoiceListSelector.js +0 -21
- package/lib/view/invoicing/invoiceList/invoiceListState.d.ts +0 -25
- package/lib/view/invoicing/invoiceList/invoiceListState.js +0 -2
- package/lib/view/invoicing/invoicePdf/invoicePdfEpic.d.ts +0 -7
- package/lib/view/invoicing/invoicePdf/invoicePdfEpic.js +0 -41
- package/lib/view/invoicing/invoicePdf/invoicePdfReducer.d.ts +0 -20
- package/lib/view/invoicing/invoicePdf/invoicePdfReducer.js +0 -37
- package/lib/view/invoicing/invoicePdf/invoicePdfSelector.d.ts +0 -3
- package/lib/view/invoicing/invoicePdf/invoicePdfSelector.js +0 -9
- package/lib/view/invoicing/invoicingApiHelper.d.ts +0 -22
- package/lib/view/invoicing/invoicingApiHelper.js +0 -44
- package/lib/view/invoicing/paymentAction/paymentActionEpic.d.ts +0 -8
- package/lib/view/invoicing/paymentAction/paymentActionEpic.js +0 -32
- package/lib/view/invoicing/paymentAction/paymentActionReducer.d.ts +0 -21
- package/lib/view/invoicing/paymentAction/paymentActionReducer.js +0 -40
- package/lib/view/invoicing/paymentAction/paymentActionSelector.d.ts +0 -3
- package/lib/view/invoicing/paymentAction/paymentActionSelector.js +0 -9
- package/lib/view/invoicing/recordPayment/recordPaymentEpic.d.ts +0 -8
- package/lib/view/invoicing/recordPayment/recordPaymentEpic.js +0 -27
- package/lib/view/invoicing/recordPayment/recordPaymentReducer.d.ts +0 -32
- package/lib/view/invoicing/recordPayment/recordPaymentReducer.js +0 -40
- package/lib/view/invoicing/recordPayment/recordPaymentSelector.d.ts +0 -4
- package/lib/view/invoicing/recordPayment/recordPaymentSelector.js +0 -10
- package/lib/view/invoicing/reportsView/reportsViewEpics.d.ts +0 -7
- package/lib/view/invoicing/reportsView/reportsViewEpics.js +0 -32
- package/lib/view/invoicing/reportsView/reportsViewReducer.d.ts +0 -20
- package/lib/view/invoicing/reportsView/reportsViewReducer.js +0 -58
- package/lib/view/invoicing/reportsView/reportsViewSelector.d.ts +0 -12
- package/lib/view/invoicing/reportsView/reportsViewSelector.js +0 -24
- package/lib/view/invoicing/settingsView/settingsViewEpics.d.ts +0 -10
- package/lib/view/invoicing/settingsView/settingsViewEpics.js +0 -60
- package/lib/view/invoicing/settingsView/settingsViewReducer.d.ts +0 -12
- package/lib/view/invoicing/settingsView/settingsViewReducer.js +0 -73
- package/lib/view/invoicing/settingsView/settingsViewSelector.d.ts +0 -7
- package/lib/view/invoicing/settingsView/settingsViewSelector.js +0 -14
- package/lib/view/invoicing/subscriptionAction/subscriptionActionEpic.d.ts +0 -8
- package/lib/view/invoicing/subscriptionAction/subscriptionActionEpic.js +0 -32
- package/lib/view/invoicing/subscriptionAction/subscriptionActionReducer.d.ts +0 -21
- package/lib/view/invoicing/subscriptionAction/subscriptionActionReducer.js +0 -40
- package/lib/view/invoicing/subscriptionAction/subscriptionActionSelector.d.ts +0 -3
- package/lib/view/invoicing/subscriptionAction/subscriptionActionSelector.js +0 -9
- package/lib/view/invoicing/subscriptionView/subscriptionViewEpics.d.ts +0 -10
- package/lib/view/invoicing/subscriptionView/subscriptionViewEpics.js +0 -91
- package/lib/view/invoicing/subscriptionView/subscriptionViewReducer.d.ts +0 -44
- package/lib/view/invoicing/subscriptionView/subscriptionViewReducer.js +0 -94
- package/lib/view/invoicing/subscriptionView/subscriptionViewSelector.d.ts +0 -13
- package/lib/view/invoicing/subscriptionView/subscriptionViewSelector.js +0 -31
- package/lib/view/invoicing/subscriptionWrite/subscriptionWriteEpic.d.ts +0 -8
- package/lib/view/invoicing/subscriptionWrite/subscriptionWriteEpic.js +0 -29
- package/lib/view/invoicing/subscriptionWrite/subscriptionWriteReducer.d.ts +0 -17
- package/lib/view/invoicing/subscriptionWrite/subscriptionWriteReducer.js +0 -40
- package/lib/view/invoicing/subscriptionWrite/subscriptionWriteSelector.d.ts +0 -4
- package/lib/view/invoicing/subscriptionWrite/subscriptionWriteSelector.js +0 -10
- package/lib/view/invoicing/transactionView/transactionViewEpics.d.ts +0 -10
- package/lib/view/invoicing/transactionView/transactionViewEpics.js +0 -82
- package/lib/view/invoicing/transactionView/transactionViewReducer.d.ts +0 -43
- package/lib/view/invoicing/transactionView/transactionViewReducer.js +0 -94
- package/lib/view/invoicing/transactionView/transactionViewSelector.d.ts +0 -13
- 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
|
-
:
|
|
18
|
-
|
|
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:
|
|
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 {
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 (
|
|
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
|
|
146
|
-
!isEqual(taskDetailLocalData.groupAssignees, taskDetailInStore
|
|
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,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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
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
|
-
|
|
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,
|