@zeniai/client-epic-state 5.0.3-beta0ND → 5.0.3-betaND3

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 (41) hide show
  1. package/lib/coreEpics.js +1 -2
  2. package/lib/entity/task/taskPayload.d.ts +1 -0
  3. package/lib/entity/task/taskPayload.js +46 -39
  4. package/lib/entity/task/taskState.d.ts +2 -0
  5. package/lib/entity/tenant/tenantReducer.d.ts +1 -5
  6. package/lib/entity/tenant/tenantReducer.js +2 -23
  7. package/lib/entity/tenant/tenantState.d.ts +0 -1
  8. package/lib/esm/coreEpics.js +1 -2
  9. package/lib/esm/entity/task/taskPayload.js +46 -39
  10. package/lib/esm/entity/tenant/tenantReducer.js +1 -21
  11. package/lib/esm/index.js +2 -5
  12. package/lib/esm/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +4 -0
  13. package/lib/esm/view/taskManager/taskListView/epics/fetchTaskListEpic.js +6 -3
  14. package/lib/esm/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +6 -2
  15. package/lib/esm/view/taskManager/taskListView/taskListPayload.js +5 -1
  16. package/lib/esm/view/taskManager/taskListView/taskListReducer.js +11 -0
  17. package/lib/esm/view/taskManager/taskListView/taskListSelector.js +27 -4
  18. package/lib/index.d.ts +2 -5
  19. package/lib/index.js +30 -36
  20. package/lib/tsconfig.typecheck.tsbuildinfo +1 -1
  21. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.d.ts +2 -0
  22. package/lib/view/taskManager/taskListView/epics/bulkUpdateTaskListEpic.js +4 -0
  23. package/lib/view/taskManager/taskListView/epics/fetchTaskListEpic.js +6 -3
  24. package/lib/view/taskManager/taskListView/epics/updateTaskFromListViewEpic.js +6 -2
  25. package/lib/view/taskManager/taskListView/taskList.d.ts +2 -0
  26. package/lib/view/taskManager/taskListView/taskListPayload.d.ts +10 -1
  27. package/lib/view/taskManager/taskListView/taskListPayload.js +7 -0
  28. package/lib/view/taskManager/taskListView/taskListReducer.d.ts +4 -1
  29. package/lib/view/taskManager/taskListView/taskListReducer.js +11 -0
  30. package/lib/view/taskManager/taskListView/taskListSelector.d.ts +4 -1
  31. package/lib/view/taskManager/taskListView/taskListSelector.js +27 -4
  32. package/package.json +1 -1
  33. package/lib/entity/tenant/SessionManager.d.ts +0 -38
  34. package/lib/entity/tenant/SessionManager.js +0 -171
  35. package/lib/entity/tenant/epic/sessionHeartbeatEpic.d.ts +0 -16
  36. package/lib/entity/tenant/epic/sessionHeartbeatEpic.js +0 -16
  37. package/lib/entity/tenant/sessionTypes.d.ts +0 -26
  38. package/lib/entity/tenant/sessionTypes.js +0 -12
  39. package/lib/esm/entity/tenant/SessionManager.js +0 -167
  40. package/lib/esm/entity/tenant/epic/sessionHeartbeatEpic.js +0 -12
  41. package/lib/esm/entity/tenant/sessionTypes.js +0 -9
package/lib/coreEpics.js CHANGED
@@ -24,7 +24,6 @@ const resendVerifyDeviceOTPEpic_1 = require("./entity/tenant/epic/resendVerifyDe
24
24
  const saveExternalConnectionEpic_1 = require("./entity/tenant/epic/saveExternalConnectionEpic");
25
25
  const sendEmailMagicLinkToUserEpic_1 = require("./entity/tenant/epic/sendEmailMagicLinkToUserEpic");
26
26
  const signInUserEpic_1 = require("./entity/tenant/epic/signInUserEpic");
27
- const sessionHeartbeatEpic_1 = require("./entity/tenant/epic/sessionHeartbeatEpic");
28
27
  const signOutUserEpic_1 = require("./entity/tenant/epic/signOutUserEpic");
29
28
  const verifyDeviceWithTwoFAEpic_1 = require("./entity/tenant/epic/verifyDeviceWithTwoFAEpic");
30
29
  // ── Toast Notification Epic ──────────────────────────────────────────
@@ -49,7 +48,7 @@ const verifyOtpEpic_1 = require("./view/twoFactorAuthentication/verifyOtpEpic");
49
48
  // RootActionType is only available in the dynamically imported epic.ts.
50
49
  const coreRootEpic = (0, redux_observable_1.combineEpics)(
51
50
  // Auth & tenant
52
- clearAllEpic_1.clearAllEpic, doMagicLinkSignInEpic_1.doMagicLinkSignInEpic, signInUserEpic_1.doSignInEpic, signOutUserEpic_1.doSignOutEpic, sessionHeartbeatEpic_1.sessionHeartbeatEpic, fetchActiveTenantEpic_1.fetchActiveTenantEpic, fetchAllTenantsEpic_1.fetchAllTenantsEpic, fetchExcludedResourcesEpic_1.fetchExcludedResourcesEpic, fetchExternalConnectionsEpic_1.fetchExternalConnectionsEpic, fetchSubscriptionSummaryForTenantEpic_1.fetchSubscriptionSummaryForTenantEpic, resendVerifyDeviceOTPEpic_1.resendVerifyDeviceOTPEpic, saveExternalConnectionEpic_1.saveExternalConnectionEpic, sendEmailMagicLinkToUserEpic_1.sendEmailMagicLinkToUserEpic, verifyDeviceWithTwoFAEpic_1.verifyDeviceWithTwoFAEpic,
51
+ clearAllEpic_1.clearAllEpic, doMagicLinkSignInEpic_1.doMagicLinkSignInEpic, signInUserEpic_1.doSignInEpic, signOutUserEpic_1.doSignOutEpic, fetchActiveTenantEpic_1.fetchActiveTenantEpic, fetchAllTenantsEpic_1.fetchAllTenantsEpic, fetchExcludedResourcesEpic_1.fetchExcludedResourcesEpic, fetchExternalConnectionsEpic_1.fetchExternalConnectionsEpic, fetchSubscriptionSummaryForTenantEpic_1.fetchSubscriptionSummaryForTenantEpic, resendVerifyDeviceOTPEpic_1.resendVerifyDeviceOTPEpic, saveExternalConnectionEpic_1.saveExternalConnectionEpic, sendEmailMagicLinkToUserEpic_1.sendEmailMagicLinkToUserEpic, verifyDeviceWithTwoFAEpic_1.verifyDeviceWithTwoFAEpic,
53
52
  // Toast
54
53
  pushToastNotificationEpic_1.pushToastNotificationEpic,
55
54
  // Collaboration
@@ -22,6 +22,7 @@ export interface TaskPayload {
22
22
  update_time: string | null;
23
23
  company_id?: string;
24
24
  group_assignees?: string[];
25
+ parent_task_id?: string | null;
25
26
  sync_token?: string | null;
26
27
  task_group_ids?: string[] | null;
27
28
  }
@@ -5,43 +5,50 @@ const formatMinutesToFromHHMM_1 = require("../../commonStateTypes/fiscalYearHelp
5
5
  const recurringViewHelper_1 = require("../../view/common/recurringViewHelper");
6
6
  const zeniDayJS_1 = require("../../zeniDayJS");
7
7
  const taskState_1 = require("./taskState");
8
- const mapTaskPayloadToTask = (payload) => ({
9
- id: payload.task_id,
10
- assignees: payload.assignees,
11
- createdBy: payload.created_by,
12
- description: payload.description,
13
- fileIds: payload.file_ids,
14
- isArchived: payload.is_archived,
15
- isDeleted: payload.is_deleted,
16
- name: payload.name,
17
- syncToken: payload.sync_token ?? '',
18
- priority: {
19
- code: (0, taskState_1.toPriorityCodeType)(payload.priority.code),
20
- name: payload.priority.name,
21
- },
22
- status: {
23
- code: (0, taskState_1.toTaskStatusCodeType)(payload.status.code),
24
- name: payload.status.name,
25
- },
26
- tagIds: payload.tags.map((tag) => tag.tag_id),
27
- type: { code: (0, taskState_1.toTaskCodeType)(payload.type.code), name: payload.type.name },
28
- recurringEndDate: payload.recurring_end_date != null
29
- ? (0, zeniDayJS_1.date)(payload.recurring_end_date)
30
- : undefined,
31
- recurringFrequency: payload.recurring_frequency != null
32
- ? (0, recurringViewHelper_1.toRecurringFrequencyStrict)(payload.recurring_frequency.code)
33
- : undefined,
34
- recurringStartDate: payload.recurring_start_date != null
35
- ? (0, zeniDayJS_1.date)(payload.recurring_start_date)
36
- : undefined,
37
- createTime: (0, zeniDayJS_1.date)(payload.create_time),
38
- dueDate: payload.due_date != null ? (0, zeniDayJS_1.date)(payload.due_date) : undefined,
39
- updateTime: payload.update_time != null ? (0, zeniDayJS_1.date)(payload.update_time) : undefined,
40
- companyId: payload.company_id,
41
- taskGroupIds: payload.task_group_ids != null ? payload.task_group_ids : [],
42
- timeSpent: payload.time_spent != null
43
- ? (0, formatMinutesToFromHHMM_1.convertMinutesToHHMM)(payload.time_spent)
44
- : (0, formatMinutesToFromHHMM_1.convertMinutesToHHMM)(0),
45
- groupAssignees: payload.group_assignees ?? [],
46
- });
8
+ const mapTaskPayloadToTask = (payload) => {
9
+ const task = {
10
+ id: payload.task_id,
11
+ assignees: payload.assignees,
12
+ createdBy: payload.created_by,
13
+ description: payload.description,
14
+ fileIds: payload.file_ids,
15
+ isArchived: payload.is_archived,
16
+ isDeleted: payload.is_deleted,
17
+ name: payload.name,
18
+ syncToken: payload.sync_token ?? '',
19
+ priority: {
20
+ code: (0, taskState_1.toPriorityCodeType)(payload.priority.code),
21
+ name: payload.priority.name,
22
+ },
23
+ status: {
24
+ code: (0, taskState_1.toTaskStatusCodeType)(payload.status.code),
25
+ name: payload.status.name,
26
+ },
27
+ tagIds: payload.tags.map((tag) => tag.tag_id),
28
+ type: { code: (0, taskState_1.toTaskCodeType)(payload.type.code), name: payload.type.name },
29
+ recurringEndDate: payload.recurring_end_date != null
30
+ ? (0, zeniDayJS_1.date)(payload.recurring_end_date)
31
+ : undefined,
32
+ recurringFrequency: payload.recurring_frequency != null
33
+ ? (0, recurringViewHelper_1.toRecurringFrequencyStrict)(payload.recurring_frequency.code)
34
+ : undefined,
35
+ recurringStartDate: payload.recurring_start_date != null
36
+ ? (0, zeniDayJS_1.date)(payload.recurring_start_date)
37
+ : undefined,
38
+ createTime: (0, zeniDayJS_1.date)(payload.create_time),
39
+ dueDate: payload.due_date != null ? (0, zeniDayJS_1.date)(payload.due_date) : undefined,
40
+ updateTime: payload.update_time != null ? (0, zeniDayJS_1.date)(payload.update_time) : undefined,
41
+ companyId: payload.company_id,
42
+ taskGroupIds: payload.task_group_ids != null ? payload.task_group_ids : [],
43
+ timeSpent: payload.time_spent != null
44
+ ? (0, formatMinutesToFromHHMM_1.convertMinutesToHHMM)(payload.time_spent)
45
+ : (0, formatMinutesToFromHHMM_1.convertMinutesToHHMM)(0),
46
+ groupAssignees: payload.group_assignees ?? [],
47
+ };
48
+ const parentTaskId = payload.parent_task_id;
49
+ if (typeof parentTaskId === 'string' && parentTaskId.length > 0) {
50
+ task.parentTaskId = parentTaskId;
51
+ }
52
+ return task;
53
+ };
47
54
  exports.mapTaskPayloadToTask = mapTaskPayloadToTask;
@@ -21,6 +21,8 @@ export interface Task {
21
21
  type: TaskType;
22
22
  companyId?: ID;
23
23
  dueDate?: ZeniDate;
24
+ /** Present when this task is a subtask of another task. */
25
+ parentTaskId?: ID;
24
26
  recurringEndDate?: ZeniDate;
25
27
  recurringFrequency?: RecurringFrequencyType;
26
28
  recurringStartDate?: ZeniDate;
@@ -51,11 +51,7 @@ export declare const updateTenants: import("@reduxjs/toolkit").ActionCreatorWith
51
51
  accountLockTime?: string;
52
52
  accountUnlockTime?: string;
53
53
  isAccountLocked?: boolean;
54
- }, "tenant/sendEmailMagicLinkToUserFailure">, updateSignInState: import("@reduxjs/toolkit").ActionCreatorWithPayload<FetchState, "tenant/updateSignInState">, doSignOut: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/doSignOut">, signOutSuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/signOutSuccess">, sendSessionHeartbeat: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/sendSessionHeartbeat">, sessionHeartbeatSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[expiresAt: string], {
55
- expiresAt: string;
56
- }, "tenant/sessionHeartbeatSuccess", never, never>, sessionHeartbeatFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[error: ZeniAPIStatus<Record<string, unknown>>], {
57
- error: ZeniAPIStatus<Record<string, unknown>>;
58
- }, "tenant/sessionHeartbeatFailure", never, never>, updateLoggedInUser: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[userPayload: LoggedInUserPayload, zeniSessionId: string, authProvider: AuthProvider], {
54
+ }, "tenant/sendEmailMagicLinkToUserFailure">, updateSignInState: import("@reduxjs/toolkit").ActionCreatorWithPayload<FetchState, "tenant/updateSignInState">, doSignOut: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/doSignOut">, signOutSuccess: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"tenant/signOutSuccess">, updateLoggedInUser: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[userPayload: LoggedInUserPayload, zeniSessionId: string, authProvider: AuthProvider], {
59
55
  userPayload: LoggedInUserPayload;
60
56
  zeniSessionId: string;
61
57
  authProvider: AuthProvider;
@@ -4,8 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  var _a;
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.resendVerifyDeviceOTPSuccess = exports.resendVerifyDeviceOTP = exports.verifyDeviceWithTwoFAFailure = exports.verifyDeviceWithTwoFASuccess = exports.verifyDeviceWithTwoFA = exports.updateTenantMasterTOSInfo = exports.updateTenantAccountingClassesEnabled = exports.trigger2FA = exports.resetSignInState = exports.updateTreasuryVideoViewedForLoggedInUser = exports.updateReferViewedForLoggedInUser = exports.updateTenantReimbursementInfo = exports.removeOnboardingTenant = exports.updateOnboardingTenants = exports.updateSubscriptionSummaryForTenantFailure = exports.updateSubscriptionSummaryForTenantSuccess = exports.fetchSubscriptionSummaryForTenant = exports.clearAll = exports.fetchExternalConnectionsSuccess = exports.fetchExternalConnectionsFailure = exports.saveExternalConnectionFailure = exports.saveExternalConnectionSuccess = exports.saveExternalConnection = exports.fetchExternalConnections = exports.updateLoggedInUser = exports.sessionHeartbeatFailure = exports.sessionHeartbeatSuccess = exports.sendSessionHeartbeat = exports.signOutSuccess = exports.doSignOut = exports.updateSignInState = exports.sendEmailMagicLinkToUserFailure = exports.sendEmailMagicLinkToUserSuccess = exports.sendEmailMagicLinkToUser = exports.magicLinkSignInFailure = exports.magicLinkSignInSuccess = exports.doMagicLinkSignIn = exports.doSignIn = exports.updateExcludedResourcesFailure = exports.updateExcludedResourcesSuccess = exports.fetchExcludedResources = exports.updateCurrentTenant = exports.updateTenantFailure = exports.updateTenantSuccess = exports.fetchActiveTenant = exports.updateTenantsFailure = exports.updateTenantsSuccess = exports.fetchAllTenants = exports.updateTenants = exports.initialState = void 0;
8
- exports.toConnection = exports.toRoleResource = exports.resendVerifyDeviceOTPFailure = void 0;
7
+ exports.toConnection = exports.toRoleResource = exports.resendVerifyDeviceOTPFailure = exports.resendVerifyDeviceOTPSuccess = exports.resendVerifyDeviceOTP = exports.verifyDeviceWithTwoFAFailure = exports.verifyDeviceWithTwoFASuccess = exports.verifyDeviceWithTwoFA = exports.updateTenantMasterTOSInfo = exports.updateTenantAccountingClassesEnabled = exports.trigger2FA = exports.resetSignInState = exports.updateTreasuryVideoViewedForLoggedInUser = exports.updateReferViewedForLoggedInUser = exports.updateTenantReimbursementInfo = exports.removeOnboardingTenant = exports.updateOnboardingTenants = exports.updateSubscriptionSummaryForTenantFailure = exports.updateSubscriptionSummaryForTenantSuccess = exports.fetchSubscriptionSummaryForTenant = exports.clearAll = exports.fetchExternalConnectionsSuccess = exports.fetchExternalConnectionsFailure = exports.saveExternalConnectionFailure = exports.saveExternalConnectionSuccess = exports.saveExternalConnection = exports.fetchExternalConnections = exports.updateLoggedInUser = exports.signOutSuccess = exports.doSignOut = exports.updateSignInState = exports.sendEmailMagicLinkToUserFailure = exports.sendEmailMagicLinkToUserSuccess = exports.sendEmailMagicLinkToUser = exports.magicLinkSignInFailure = exports.magicLinkSignInSuccess = exports.doMagicLinkSignIn = exports.doSignIn = exports.updateExcludedResourcesFailure = exports.updateExcludedResourcesSuccess = exports.fetchExcludedResources = exports.updateCurrentTenant = exports.updateTenantFailure = exports.updateTenantSuccess = exports.fetchActiveTenant = exports.updateTenantsFailure = exports.updateTenantsSuccess = exports.fetchAllTenants = exports.updateTenants = exports.initialState = void 0;
9
8
  exports.mapConnectionsPayloadToState = mapConnectionsPayloadToState;
10
9
  const toolkit_1 = require("@reduxjs/toolkit");
11
10
  const js_base64_1 = require("js-base64");
@@ -437,26 +436,6 @@ const tenant = (0, toolkit_1.createSlice)({
437
436
  signOutSuccess(draft) {
438
437
  draft.loggedInUser = undefined;
439
438
  draft.currentTenantId = undefined;
440
- draft.sessionExpiresAt = undefined;
441
- },
442
- sendSessionHeartbeat() {
443
- // No state change needed — epic handles the API call
444
- },
445
- sessionHeartbeatSuccess: {
446
- prepare(expiresAt) {
447
- return { payload: { expiresAt } };
448
- },
449
- reducer(draft, action) {
450
- draft.sessionExpiresAt = action.payload.expiresAt;
451
- },
452
- },
453
- sessionHeartbeatFailure: {
454
- prepare(error) {
455
- return { payload: { error } };
456
- },
457
- reducer(draft, action) {
458
- draft.error = action.payload.error;
459
- },
460
439
  },
461
440
  fetchSubscriptionSummaryForTenant: {
462
441
  prepare(tenantId) {
@@ -564,7 +543,7 @@ const tenant = (0, toolkit_1.createSlice)({
564
543
  },
565
544
  },
566
545
  });
567
- _a = tenant.actions, exports.updateTenants = _a.updateTenants, exports.fetchAllTenants = _a.fetchAllTenants, exports.updateTenantsSuccess = _a.updateTenantsSuccess, exports.updateTenantsFailure = _a.updateTenantsFailure, exports.fetchActiveTenant = _a.fetchActiveTenant, exports.updateTenantSuccess = _a.updateTenantSuccess, exports.updateTenantFailure = _a.updateTenantFailure, exports.updateCurrentTenant = _a.updateCurrentTenant, exports.fetchExcludedResources = _a.fetchExcludedResources, exports.updateExcludedResourcesSuccess = _a.updateExcludedResourcesSuccess, exports.updateExcludedResourcesFailure = _a.updateExcludedResourcesFailure, exports.doSignIn = _a.doSignIn, exports.doMagicLinkSignIn = _a.doMagicLinkSignIn, exports.magicLinkSignInSuccess = _a.magicLinkSignInSuccess, exports.magicLinkSignInFailure = _a.magicLinkSignInFailure, exports.sendEmailMagicLinkToUser = _a.sendEmailMagicLinkToUser, exports.sendEmailMagicLinkToUserSuccess = _a.sendEmailMagicLinkToUserSuccess, exports.sendEmailMagicLinkToUserFailure = _a.sendEmailMagicLinkToUserFailure, exports.updateSignInState = _a.updateSignInState, exports.doSignOut = _a.doSignOut, exports.signOutSuccess = _a.signOutSuccess, exports.sendSessionHeartbeat = _a.sendSessionHeartbeat, exports.sessionHeartbeatSuccess = _a.sessionHeartbeatSuccess, exports.sessionHeartbeatFailure = _a.sessionHeartbeatFailure, exports.updateLoggedInUser = _a.updateLoggedInUser, exports.fetchExternalConnections = _a.fetchExternalConnections, exports.saveExternalConnection = _a.saveExternalConnection, exports.saveExternalConnectionSuccess = _a.saveExternalConnectionSuccess, exports.saveExternalConnectionFailure = _a.saveExternalConnectionFailure, exports.fetchExternalConnectionsFailure = _a.fetchExternalConnectionsFailure, exports.fetchExternalConnectionsSuccess = _a.fetchExternalConnectionsSuccess, exports.clearAll = _a.clearAll, exports.fetchSubscriptionSummaryForTenant = _a.fetchSubscriptionSummaryForTenant, exports.updateSubscriptionSummaryForTenantSuccess = _a.updateSubscriptionSummaryForTenantSuccess, exports.updateSubscriptionSummaryForTenantFailure = _a.updateSubscriptionSummaryForTenantFailure, exports.updateOnboardingTenants = _a.updateOnboardingTenants, exports.removeOnboardingTenant = _a.removeOnboardingTenant, exports.updateTenantReimbursementInfo = _a.updateTenantReimbursementInfo, exports.updateReferViewedForLoggedInUser = _a.updateReferViewedForLoggedInUser, exports.updateTreasuryVideoViewedForLoggedInUser = _a.updateTreasuryVideoViewedForLoggedInUser, exports.resetSignInState = _a.resetSignInState, exports.trigger2FA = _a.trigger2FA, exports.updateTenantAccountingClassesEnabled = _a.updateTenantAccountingClassesEnabled, exports.updateTenantMasterTOSInfo = _a.updateTenantMasterTOSInfo, exports.verifyDeviceWithTwoFA = _a.verifyDeviceWithTwoFA, exports.verifyDeviceWithTwoFASuccess = _a.verifyDeviceWithTwoFASuccess, exports.verifyDeviceWithTwoFAFailure = _a.verifyDeviceWithTwoFAFailure, exports.resendVerifyDeviceOTP = _a.resendVerifyDeviceOTP, exports.resendVerifyDeviceOTPSuccess = _a.resendVerifyDeviceOTPSuccess, exports.resendVerifyDeviceOTPFailure = _a.resendVerifyDeviceOTPFailure;
546
+ _a = tenant.actions, exports.updateTenants = _a.updateTenants, exports.fetchAllTenants = _a.fetchAllTenants, exports.updateTenantsSuccess = _a.updateTenantsSuccess, exports.updateTenantsFailure = _a.updateTenantsFailure, exports.fetchActiveTenant = _a.fetchActiveTenant, exports.updateTenantSuccess = _a.updateTenantSuccess, exports.updateTenantFailure = _a.updateTenantFailure, exports.updateCurrentTenant = _a.updateCurrentTenant, exports.fetchExcludedResources = _a.fetchExcludedResources, exports.updateExcludedResourcesSuccess = _a.updateExcludedResourcesSuccess, exports.updateExcludedResourcesFailure = _a.updateExcludedResourcesFailure, exports.doSignIn = _a.doSignIn, exports.doMagicLinkSignIn = _a.doMagicLinkSignIn, exports.magicLinkSignInSuccess = _a.magicLinkSignInSuccess, exports.magicLinkSignInFailure = _a.magicLinkSignInFailure, exports.sendEmailMagicLinkToUser = _a.sendEmailMagicLinkToUser, exports.sendEmailMagicLinkToUserSuccess = _a.sendEmailMagicLinkToUserSuccess, exports.sendEmailMagicLinkToUserFailure = _a.sendEmailMagicLinkToUserFailure, exports.updateSignInState = _a.updateSignInState, exports.doSignOut = _a.doSignOut, exports.signOutSuccess = _a.signOutSuccess, exports.updateLoggedInUser = _a.updateLoggedInUser, exports.fetchExternalConnections = _a.fetchExternalConnections, exports.saveExternalConnection = _a.saveExternalConnection, exports.saveExternalConnectionSuccess = _a.saveExternalConnectionSuccess, exports.saveExternalConnectionFailure = _a.saveExternalConnectionFailure, exports.fetchExternalConnectionsFailure = _a.fetchExternalConnectionsFailure, exports.fetchExternalConnectionsSuccess = _a.fetchExternalConnectionsSuccess, exports.clearAll = _a.clearAll, exports.fetchSubscriptionSummaryForTenant = _a.fetchSubscriptionSummaryForTenant, exports.updateSubscriptionSummaryForTenantSuccess = _a.updateSubscriptionSummaryForTenantSuccess, exports.updateSubscriptionSummaryForTenantFailure = _a.updateSubscriptionSummaryForTenantFailure, exports.updateOnboardingTenants = _a.updateOnboardingTenants, exports.removeOnboardingTenant = _a.removeOnboardingTenant, exports.updateTenantReimbursementInfo = _a.updateTenantReimbursementInfo, exports.updateReferViewedForLoggedInUser = _a.updateReferViewedForLoggedInUser, exports.updateTreasuryVideoViewedForLoggedInUser = _a.updateTreasuryVideoViewedForLoggedInUser, exports.resetSignInState = _a.resetSignInState, exports.trigger2FA = _a.trigger2FA, exports.updateTenantAccountingClassesEnabled = _a.updateTenantAccountingClassesEnabled, exports.updateTenantMasterTOSInfo = _a.updateTenantMasterTOSInfo, exports.verifyDeviceWithTwoFA = _a.verifyDeviceWithTwoFA, exports.verifyDeviceWithTwoFASuccess = _a.verifyDeviceWithTwoFASuccess, exports.verifyDeviceWithTwoFAFailure = _a.verifyDeviceWithTwoFAFailure, exports.resendVerifyDeviceOTP = _a.resendVerifyDeviceOTP, exports.resendVerifyDeviceOTPSuccess = _a.resendVerifyDeviceOTPSuccess, exports.resendVerifyDeviceOTPFailure = _a.resendVerifyDeviceOTPFailure;
568
547
  exports.default = tenant.reducer;
569
548
  /**
570
549
  * Converts tenants payload to Tenant and User State
@@ -45,7 +45,6 @@ export interface TenantState extends FetchedState {
45
45
  magicLinkCodeVerifier?: string;
46
46
  magicLinkEmail?: string;
47
47
  otpChallenge?: string;
48
- sessionExpiresAt?: string;
49
48
  twoFAPhoneNumber?: string;
50
49
  }
51
50
  export interface TenantProductSettings {
@@ -22,7 +22,6 @@ import { resendVerifyDeviceOTPEpic } from './entity/tenant/epic/resendVerifyDevi
22
22
  import { saveExternalConnectionEpic } from './entity/tenant/epic/saveExternalConnectionEpic';
23
23
  import { sendEmailMagicLinkToUserEpic } from './entity/tenant/epic/sendEmailMagicLinkToUserEpic';
24
24
  import { doSignInEpic } from './entity/tenant/epic/signInUserEpic';
25
- import { sessionHeartbeatEpic } from './entity/tenant/epic/sessionHeartbeatEpic';
26
25
  import { doSignOutEpic } from './entity/tenant/epic/signOutUserEpic';
27
26
  import { verifyDeviceWithTwoFAEpic } from './entity/tenant/epic/verifyDeviceWithTwoFAEpic';
28
27
  // ── Toast Notification Epic ──────────────────────────────────────────
@@ -47,7 +46,7 @@ import { verifyOtpEpic } from './view/twoFactorAuthentication/verifyOtpEpic';
47
46
  // RootActionType is only available in the dynamically imported epic.ts.
48
47
  const coreRootEpic = combineEpics(
49
48
  // Auth & tenant
50
- clearAllEpic, doMagicLinkSignInEpic, doSignInEpic, doSignOutEpic, sessionHeartbeatEpic, fetchActiveTenantEpic, fetchAllTenantsEpic, fetchExcludedResourcesEpic, fetchExternalConnectionsEpic, fetchSubscriptionSummaryForTenantEpic, resendVerifyDeviceOTPEpic, saveExternalConnectionEpic, sendEmailMagicLinkToUserEpic, verifyDeviceWithTwoFAEpic,
49
+ clearAllEpic, doMagicLinkSignInEpic, doSignInEpic, doSignOutEpic, fetchActiveTenantEpic, fetchAllTenantsEpic, fetchExcludedResourcesEpic, fetchExternalConnectionsEpic, fetchSubscriptionSummaryForTenantEpic, resendVerifyDeviceOTPEpic, saveExternalConnectionEpic, sendEmailMagicLinkToUserEpic, verifyDeviceWithTwoFAEpic,
51
50
  // Toast
52
51
  pushToastNotificationEpic,
53
52
  // Collaboration
@@ -2,42 +2,49 @@ import { convertMinutesToHHMM } from '../../commonStateTypes/fiscalYearHelpers/f
2
2
  import { toRecurringFrequencyStrict } from '../../view/common/recurringViewHelper';
3
3
  import { date } from '../../zeniDayJS';
4
4
  import { toPriorityCodeType, toTaskCodeType, toTaskStatusCodeType, } from './taskState';
5
- export const mapTaskPayloadToTask = (payload) => ({
6
- id: payload.task_id,
7
- assignees: payload.assignees,
8
- createdBy: payload.created_by,
9
- description: payload.description,
10
- fileIds: payload.file_ids,
11
- isArchived: payload.is_archived,
12
- isDeleted: payload.is_deleted,
13
- name: payload.name,
14
- syncToken: payload.sync_token ?? '',
15
- priority: {
16
- code: toPriorityCodeType(payload.priority.code),
17
- name: payload.priority.name,
18
- },
19
- status: {
20
- code: toTaskStatusCodeType(payload.status.code),
21
- name: payload.status.name,
22
- },
23
- tagIds: payload.tags.map((tag) => tag.tag_id),
24
- type: { code: toTaskCodeType(payload.type.code), name: payload.type.name },
25
- recurringEndDate: payload.recurring_end_date != null
26
- ? date(payload.recurring_end_date)
27
- : undefined,
28
- recurringFrequency: payload.recurring_frequency != null
29
- ? toRecurringFrequencyStrict(payload.recurring_frequency.code)
30
- : undefined,
31
- recurringStartDate: payload.recurring_start_date != null
32
- ? date(payload.recurring_start_date)
33
- : undefined,
34
- createTime: date(payload.create_time),
35
- dueDate: payload.due_date != null ? date(payload.due_date) : undefined,
36
- updateTime: payload.update_time != null ? date(payload.update_time) : undefined,
37
- companyId: payload.company_id,
38
- taskGroupIds: payload.task_group_ids != null ? payload.task_group_ids : [],
39
- timeSpent: payload.time_spent != null
40
- ? convertMinutesToHHMM(payload.time_spent)
41
- : convertMinutesToHHMM(0),
42
- groupAssignees: payload.group_assignees ?? [],
43
- });
5
+ export const mapTaskPayloadToTask = (payload) => {
6
+ const task = {
7
+ id: payload.task_id,
8
+ assignees: payload.assignees,
9
+ createdBy: payload.created_by,
10
+ description: payload.description,
11
+ fileIds: payload.file_ids,
12
+ isArchived: payload.is_archived,
13
+ isDeleted: payload.is_deleted,
14
+ name: payload.name,
15
+ syncToken: payload.sync_token ?? '',
16
+ priority: {
17
+ code: toPriorityCodeType(payload.priority.code),
18
+ name: payload.priority.name,
19
+ },
20
+ status: {
21
+ code: toTaskStatusCodeType(payload.status.code),
22
+ name: payload.status.name,
23
+ },
24
+ tagIds: payload.tags.map((tag) => tag.tag_id),
25
+ type: { code: toTaskCodeType(payload.type.code), name: payload.type.name },
26
+ recurringEndDate: payload.recurring_end_date != null
27
+ ? date(payload.recurring_end_date)
28
+ : undefined,
29
+ recurringFrequency: payload.recurring_frequency != null
30
+ ? toRecurringFrequencyStrict(payload.recurring_frequency.code)
31
+ : undefined,
32
+ recurringStartDate: payload.recurring_start_date != null
33
+ ? date(payload.recurring_start_date)
34
+ : undefined,
35
+ createTime: date(payload.create_time),
36
+ dueDate: payload.due_date != null ? date(payload.due_date) : undefined,
37
+ updateTime: payload.update_time != null ? date(payload.update_time) : undefined,
38
+ companyId: payload.company_id,
39
+ taskGroupIds: payload.task_group_ids != null ? payload.task_group_ids : [],
40
+ timeSpent: payload.time_spent != null
41
+ ? convertMinutesToHHMM(payload.time_spent)
42
+ : convertMinutesToHHMM(0),
43
+ groupAssignees: payload.group_assignees ?? [],
44
+ };
45
+ const parentTaskId = payload.parent_task_id;
46
+ if (typeof parentTaskId === 'string' && parentTaskId.length > 0) {
47
+ task.parentTaskId = parentTaskId;
48
+ }
49
+ return task;
50
+ };
@@ -428,26 +428,6 @@ const tenant = createSlice({
428
428
  signOutSuccess(draft) {
429
429
  draft.loggedInUser = undefined;
430
430
  draft.currentTenantId = undefined;
431
- draft.sessionExpiresAt = undefined;
432
- },
433
- sendSessionHeartbeat() {
434
- // No state change needed — epic handles the API call
435
- },
436
- sessionHeartbeatSuccess: {
437
- prepare(expiresAt) {
438
- return { payload: { expiresAt } };
439
- },
440
- reducer(draft, action) {
441
- draft.sessionExpiresAt = action.payload.expiresAt;
442
- },
443
- },
444
- sessionHeartbeatFailure: {
445
- prepare(error) {
446
- return { payload: { error } };
447
- },
448
- reducer(draft, action) {
449
- draft.error = action.payload.error;
450
- },
451
431
  },
452
432
  fetchSubscriptionSummaryForTenant: {
453
433
  prepare(tenantId) {
@@ -555,7 +535,7 @@ const tenant = createSlice({
555
535
  },
556
536
  },
557
537
  });
558
- export const { updateTenants, fetchAllTenants, updateTenantsSuccess, updateTenantsFailure, fetchActiveTenant, updateTenantSuccess, updateTenantFailure, updateCurrentTenant, fetchExcludedResources, updateExcludedResourcesSuccess, updateExcludedResourcesFailure, doSignIn, doMagicLinkSignIn, magicLinkSignInSuccess, magicLinkSignInFailure, sendEmailMagicLinkToUser, sendEmailMagicLinkToUserSuccess, sendEmailMagicLinkToUserFailure, updateSignInState, doSignOut, signOutSuccess, sendSessionHeartbeat, sessionHeartbeatSuccess, sessionHeartbeatFailure, updateLoggedInUser, fetchExternalConnections, saveExternalConnection, saveExternalConnectionSuccess, saveExternalConnectionFailure, fetchExternalConnectionsFailure, fetchExternalConnectionsSuccess, clearAll, fetchSubscriptionSummaryForTenant, updateSubscriptionSummaryForTenantSuccess, updateSubscriptionSummaryForTenantFailure, updateOnboardingTenants, removeOnboardingTenant, updateTenantReimbursementInfo, updateReferViewedForLoggedInUser, updateTreasuryVideoViewedForLoggedInUser, resetSignInState, trigger2FA, updateTenantAccountingClassesEnabled, updateTenantMasterTOSInfo, verifyDeviceWithTwoFA, verifyDeviceWithTwoFASuccess, verifyDeviceWithTwoFAFailure, resendVerifyDeviceOTP, resendVerifyDeviceOTPSuccess, resendVerifyDeviceOTPFailure, } = tenant.actions;
538
+ export const { updateTenants, fetchAllTenants, updateTenantsSuccess, updateTenantsFailure, fetchActiveTenant, updateTenantSuccess, updateTenantFailure, updateCurrentTenant, fetchExcludedResources, updateExcludedResourcesSuccess, updateExcludedResourcesFailure, doSignIn, doMagicLinkSignIn, magicLinkSignInSuccess, magicLinkSignInFailure, sendEmailMagicLinkToUser, sendEmailMagicLinkToUserSuccess, sendEmailMagicLinkToUserFailure, updateSignInState, doSignOut, signOutSuccess, updateLoggedInUser, fetchExternalConnections, saveExternalConnection, saveExternalConnectionSuccess, saveExternalConnectionFailure, fetchExternalConnectionsFailure, fetchExternalConnectionsSuccess, clearAll, fetchSubscriptionSummaryForTenant, updateSubscriptionSummaryForTenantSuccess, updateSubscriptionSummaryForTenantFailure, updateOnboardingTenants, removeOnboardingTenant, updateTenantReimbursementInfo, updateReferViewedForLoggedInUser, updateTreasuryVideoViewedForLoggedInUser, resetSignInState, trigger2FA, updateTenantAccountingClassesEnabled, updateTenantMasterTOSInfo, verifyDeviceWithTwoFA, verifyDeviceWithTwoFASuccess, verifyDeviceWithTwoFAFailure, resendVerifyDeviceOTP, resendVerifyDeviceOTPSuccess, resendVerifyDeviceOTPFailure, } = tenant.actions;
559
539
  export default tenant.reducer;
560
540
  /**
561
541
  * Converts tenants payload to Tenant and User State
package/lib/esm/index.js CHANGED
@@ -59,7 +59,7 @@ import { closeSnackbar, openSnackbar } from './entity/snackbar/snackbarReducer';
59
59
  import { getSnackbar } from './entity/snackbar/snackbarSelector';
60
60
  import { toPriorityCodeType, toTaskStatusCodeType, } from './entity/task/taskState';
61
61
  import { getTaskGroupById } from './entity/taskGroup/taskGroupSelector';
62
- import { clearAll, doMagicLinkSignIn, doSignIn, doSignOut, sendSessionHeartbeat, fetchActiveTenant, fetchAllTenants, fetchExcludedResources as fetchExcludedResourcesForTenant, fetchExternalConnections as fetchExternalConnectionsForTenant, fetchSubscriptionSummaryForTenant, resendVerifyDeviceOTP, resetSignInState, saveExternalConnection as saveExternalConnectionForTenant, sendEmailMagicLinkToUser, updateCurrentTenant, updateSignInState, verifyDeviceWithTwoFA, } from './entity/tenant/tenantReducer';
62
+ import { clearAll, doMagicLinkSignIn, doSignIn, doSignOut, fetchActiveTenant, fetchAllTenants, fetchExcludedResources as fetchExcludedResourcesForTenant, fetchExternalConnections as fetchExternalConnectionsForTenant, fetchSubscriptionSummaryForTenant, resendVerifyDeviceOTP, resetSignInState, saveExternalConnection as saveExternalConnectionForTenant, sendEmailMagicLinkToUser, updateCurrentTenant, updateSignInState, verifyDeviceWithTwoFA, } from './entity/tenant/tenantReducer';
63
63
  import { getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getTenantBaseById, getTenantBaseViewForTenantId, getTenantBaseViewForTenantView, getTenantsBaseByCheckInDateSelector, getTenantsByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, isOtherProductsEnabledForTenant, isTenantBankingOnly, isTenantBookkeepingEnabled, isTenantCardsOnly, isTenantUsingZeniCOA, isZeniDomainTenant, toTenantCoreDetailsView, } from './entity/tenant/tenantSelector';
64
64
  import { pushToastNotification } from './entity/toastNotification/toastNotificationReducer';
65
65
  import { getLastNotificationTime, getNotifications, } from './entity/toastNotification/toastNotificationSelector';
@@ -433,7 +433,7 @@ export { toTimeframeTick, mapTimePeriodtoTimeframeTick, toTimePeriod, toAbsolute
433
433
  export { toVendorSpendTrendFilterTabsTypeStrict, } from './entity/vendorExpense/vendorExpenseSelector';
434
434
  export { getNumberOfPeriods };
435
435
  export { SCHEDULE_DAYS_OF_MONTH, toScheduleDaysOfMonth, toMonth, toMonthStrict, toQuarter, toQuarterStrict, };
436
- export { getTenantBaseById, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getTenantsByCheckInDateSelector, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, fetchActiveTenant, fetchAllTenants, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, doSignOut, sendSessionHeartbeat, resetSignInState, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, };
436
+ export { getTenantBaseById, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getTenantsByCheckInDateSelector, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, fetchActiveTenant, fetchAllTenants, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, doSignOut, resetSignInState, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, };
437
437
  export { toAccountType, toAccountGroupType, getAccountGroupKey, };
438
438
  export { getClassById } from './entity/class/classSelector';
439
439
  export { getForecast };
@@ -631,6 +631,3 @@ export { getAutoTransferRules, getAutoTransferRuleById, getAutoTransferRuleHisto
631
631
  export { BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS, BULK_UPLOAD_BAR_COMPLETE_HOLD_MS, } from './view/expenseAutomationView/helpers/bulkUploadTiming';
632
632
  export { fetchTransactionActivityLog } from './view/transactionActivityLogView/transactionActivityLogViewReducer';
633
633
  export { getTransactionActivityLogView, } from './view/transactionActivityLogView/transactionActivityLogViewSelector';
634
- // ── Session Management ──────────────────────────────────────────────
635
- export { SessionManager } from './entity/tenant/SessionManager';
636
- export { DEFAULT_SESSION_CONFIG } from './entity/tenant/sessionTypes';
@@ -87,5 +87,9 @@ const toTaskPayload = (state, task) => {
87
87
  task_group_ids: task.taskGroupIds,
88
88
  time_spent: convertHHMMStrToMinutes(task.timeSpent),
89
89
  };
90
+ const parentTaskId = task.parentTaskId;
91
+ if (typeof parentTaskId === 'string' && parentTaskId.length > 0) {
92
+ taskPayload.parent_task_id = parentTaskId;
93
+ }
90
94
  return taskPayload;
91
95
  };
@@ -3,16 +3,19 @@ import { catchError, filter, mergeMap, switchMap } from 'rxjs/operators';
3
3
  import { updateTags } from '../../../../entity/tag/tagReducer';
4
4
  import { updateTasks } from '../../../../entity/task/taskReducer';
5
5
  import { createZeniAPIStatus, isSuccessResponse, } from '../../../../responsePayload';
6
+ import { flattenTasksAndSubtasksForEntity, } from '../taskListPayload';
6
7
  import { fetchTaskList, updateTaskList, updateTaskListFetchStatus, } from '../taskListReducer';
7
8
  export const fetchTaskListEpic = (actions$, _state$, zeniAPI) => actions$.pipe(filter(fetchTaskList.match), switchMap(() => {
8
9
  return zeniAPI
9
10
  .getJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks?query=${encodeURIComponent(`{"task_type": "all"}`)}`)
10
11
  .pipe(mergeMap((response) => {
11
12
  if (isSuccessResponse(response) && response.data != null) {
12
- return of(updateTasks(response.data.tasks), updateTaskList({
13
- data: response.data.tasks,
13
+ const { tasks } = response.data;
14
+ const tasksForEntity = flattenTasksAndSubtasksForEntity(tasks);
15
+ return of(updateTasks(tasksForEntity), updateTaskList({
16
+ data: tasks,
14
17
  updateType: 'replace',
15
- }), updateTags(response.data.tasks.map((task) => task.tags).flat()));
18
+ }), updateTags(tasksForEntity.map((task) => task.tags).flat()));
16
19
  }
17
20
  else {
18
21
  return of(updateTaskListFetchStatus({
@@ -6,9 +6,13 @@ import { updateTaskFromListView, updateTasksListOnUpdateTaskFailure, updateTasks
6
6
  import { getTaskPayload } from './bulkUpdateTaskListEpic';
7
7
  export const updateTaskFromListViewEpic = (actions$, state$, zeniAPI) => actions$.pipe(filter(updateTaskFromListView.match), switchMap((action) => {
8
8
  const state = state$.value;
9
- const { task, updates } = action.payload;
9
+ const { task, updates, parentTaskId } = action.payload;
10
10
  const taskId = task.id;
11
- const taskData = getTaskPayload(state, taskId, updates);
11
+ const mergedUpdates = { ...updates };
12
+ if (typeof parentTaskId === 'string' && parentTaskId.length > 0) {
13
+ mergedUpdates.parentTaskId = parentTaskId;
14
+ }
15
+ const taskData = getTaskPayload(state, taskId, mergedUpdates);
12
16
  return zeniAPI
13
17
  .putAndGetJSON(`${zeniAPI.apiEndPoints.taskMicroServiceBaseUrl}/1.0/task-manager/tasks/${taskId}`, { ...taskData })
14
18
  .pipe(mergeMap((response) => {
@@ -1 +1,5 @@
1
- export {};
1
+ /** Parent tasks and nested subtasks as flat `TaskPayload`s for `updateTasks`. */
2
+ export const flattenTasksAndSubtasksForEntity = (tasks) => tasks.flatMap((task) => {
3
+ const { subtasks, ...parent } = task;
4
+ return [parent, ...(subtasks ?? [])];
5
+ });
@@ -30,6 +30,7 @@ const initialTaskIdsByDueDate = {
30
30
  upcoming: [],
31
31
  };
32
32
  export const initialState = {
33
+ subtaskIdsByParentTaskId: {},
33
34
  taskIds: [],
34
35
  taskIdsByGroupsIds: {},
35
36
  taskIdsByPriority: initialTaskIdsByPriority,
@@ -89,6 +90,7 @@ const taskList = createSlice({
89
90
  const { data } = action.payload;
90
91
  draft.fetchState = 'Completed';
91
92
  draft.error = undefined;
93
+ draft.subtaskIdsByParentTaskId = buildSubtaskIdsByParentTaskId(data);
92
94
  const { taskIds, taskIdsGroupedByPriority, taskIdsByGroupIds, taskIdsGroupedByStatus, taskIdsByAssignees, taskIdsByDueDate, taskIdsByTags, } = getGroupedTaskIds(data);
93
95
  draft.taskIds = taskIds;
94
96
  draft.taskIdsByGroupsIds = taskIdsByGroupIds;
@@ -488,6 +490,15 @@ const getTagsGroupKey = (tags) => {
488
490
  tagIds.sort();
489
491
  return tagIds.join(',');
490
492
  };
493
+ const buildSubtaskIdsByParentTaskId = (tasks) => {
494
+ const subtaskIdsByParentTaskId = {};
495
+ tasks.forEach((task) => {
496
+ if (task.subtasks != null && task.subtasks.length > 0) {
497
+ subtaskIdsByParentTaskId[task.task_id] = task.subtasks.map((s) => s.task_id);
498
+ }
499
+ });
500
+ return subtaskIdsByParentTaskId;
501
+ };
491
502
  const getGroupedTaskIds = (tasks) => {
492
503
  const taskIds = [];
493
504
  const taskIdsByGroupIds = {};
@@ -43,6 +43,30 @@ const sortTasksList = (tagState, tasksList, sortKey, sortOrder) => {
43
43
  }, sortOrder);
44
44
  return tasksInOrder;
45
45
  };
46
+ const taskToTaskWithUserDetails = (task, userState, userRoleState, addressState) => ({
47
+ ...task,
48
+ assigneeUsers: task.assignees
49
+ .map((userId) => getUserAndUserRole(userState, userRoleState, addressState, userId))
50
+ .filter((value) => value != null),
51
+ subtasks: [],
52
+ });
53
+ const attachSubtasksForTask = (taskWithAssignees, taskListState, taskState, userState, userRoleState, addressState) => {
54
+ const subtaskIds = taskListState.subtaskIdsByParentTaskId[taskWithAssignees.id] ?? [];
55
+ if (subtaskIds.length === 0) {
56
+ return { ...taskWithAssignees, subtasks: [] };
57
+ }
58
+ const subtasks = subtaskIds
59
+ .map((subtaskId) => {
60
+ const subtask = getTaskById(taskState, subtaskId);
61
+ if (subtask == null) {
62
+ return undefined;
63
+ }
64
+ const withAssignees = taskToTaskWithUserDetails(subtask, userState, userRoleState, addressState);
65
+ return attachSubtasksForTask(withAssignees, taskListState, taskState, userState, userRoleState, addressState);
66
+ })
67
+ .filter((value) => value != null);
68
+ return { ...taskWithAssignees, subtasks };
69
+ };
46
70
  const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRoleState, addressState, taskIds, tagState, }) => {
47
71
  const { sortKey, searchText } = taskListState.uiState;
48
72
  const sortOrder = getSortOrder(taskListState.uiState.sortOrder);
@@ -50,10 +74,8 @@ const getTasksWithUserDetails = ({ taskListState, taskState, userState, userRole
50
74
  .map((taskId) => {
51
75
  const task = getTaskById(taskState, taskId);
52
76
  if (task != null) {
53
- const assigneeUsers = task.assignees
54
- .map((userId) => getUserAndUserRole(userState, userRoleState, addressState, userId))
55
- .filter((value) => value != null);
56
- return { ...task, assigneeUsers };
77
+ const taskWithAssignees = taskToTaskWithUserDetails(task, userState, userRoleState, addressState);
78
+ return attachSubtasksForTask(taskWithAssignees, taskListState, taskState, userState, userRoleState, addressState);
57
79
  }
58
80
  return undefined;
59
81
  })
@@ -334,6 +356,7 @@ export const getAllTasks = createSelector((state) => state.taskListState, (state
334
356
  return {
335
357
  uiState: taskListState.uiState,
336
358
  filters: taskListState.filters,
359
+ subtaskIdsByParentTaskId: taskListState.subtaskIdsByParentTaskId,
337
360
  taskGroupTemplates,
338
361
  fetchState: fetchState,
339
362
  userList: getUserList(userState, userRoleState, userListViewState, 'taskManagerCandidate'),
package/lib/index.d.ts CHANGED
@@ -123,7 +123,7 @@ import { PriorityCodeType, Task, TaskCodeType, TaskPriority, TaskStatus, TaskSta
123
123
  import { getTaskGroupById } from './entity/taskGroup/taskGroupSelector';
124
124
  import { TaskGroupState } from './entity/taskGroup/taskGroupState';
125
125
  import { TaskGroupTemplate } from './entity/taskGroupTemplate/taskGroupTemplateState';
126
- import { DoSignInPayload, clearAll, doMagicLinkSignIn, doSignIn, doSignOut, sendSessionHeartbeat, fetchActiveTenant, fetchAllTenants, fetchExcludedResources as fetchExcludedResourcesForTenant, fetchExternalConnections as fetchExternalConnectionsForTenant, fetchSubscriptionSummaryForTenant, resendVerifyDeviceOTP, resetSignInState, saveExternalConnection as saveExternalConnectionForTenant, sendEmailMagicLinkToUser, updateCurrentTenant, updateSignInState, verifyDeviceWithTwoFA } from './entity/tenant/tenantReducer';
126
+ import { DoSignInPayload, clearAll, doMagicLinkSignIn, doSignIn, doSignOut, fetchActiveTenant, fetchAllTenants, fetchExcludedResources as fetchExcludedResourcesForTenant, fetchExternalConnections as fetchExternalConnectionsForTenant, fetchSubscriptionSummaryForTenant, resendVerifyDeviceOTP, resetSignInState, saveExternalConnection as saveExternalConnectionForTenant, sendEmailMagicLinkToUser, updateCurrentTenant, updateSignInState, verifyDeviceWithTwoFA } from './entity/tenant/tenantReducer';
127
127
  import { CurrentTenant, TenantBaseView, TenantCoreDetailsView, TenantView, TenantsBaseOrdered, TenantsOrdered, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getTenantBaseById, getTenantBaseViewForTenantId, getTenantBaseViewForTenantView, getTenantsBaseByCheckInDateSelector, getTenantsByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, isOtherProductsEnabledForTenant, isTenantBankingOnly, isTenantBookkeepingEnabled, isTenantCardsOnly, isTenantUsingZeniCOA, isZeniDomainTenant, toTenantCoreDetailsView } from './entity/tenant/tenantSelector';
128
128
  import { Connection, LoggedInUser, RoleResource, Tenant, TenantProductSettings } from './entity/tenant/tenantState';
129
129
  import { ToastNotificationPayload } from './entity/toastNotification/toastNotificationPayload';
@@ -643,7 +643,7 @@ export { TimeframeTick, TimeframeTickWithMetaData, toTimeframeTick, mapTimePerio
643
643
  export { VendorSpendTrendFilterTabType, toVendorSpendTrendFilterTabsTypeStrict, } from './entity/vendorExpense/vendorExpenseSelector';
644
644
  export { getNumberOfPeriods };
645
645
  export { SCHEDULE_DAYS_OF_MONTH, ScheduleDaysOfMonth, toScheduleDaysOfMonth, Day, Month, toMonth, toMonthStrict, Quarter, toQuarter, toQuarterStrict, AbsoluteDay, TimePeriod, };
646
- export { Tenant, TenantView, LoggedInUser, TenantBaseView, CurrentTenant, TenantProductSettings, getTenantBaseById, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getTenantsByCheckInDateSelector, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, TenantsBaseOrdered, TenantsOrdered, TenantCoreDetailsView, fetchActiveTenant, fetchAllTenants, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, DoSignInPayload, doSignOut, sendSessionHeartbeat, resetSignInState, RoleResource, Connection, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, };
646
+ export { Tenant, TenantView, LoggedInUser, TenantBaseView, CurrentTenant, TenantProductSettings, getTenantBaseById, getCurrentTenant, getIsAccountingClassesEnabled, getIsAccountingProjectsEnabled, getTenantsByCheckInDateSelector, getTenantsBaseByCheckInDateSelector, getTenantsCoreDetailsByCheckInDateSelector, toTenantCoreDetailsView, getTenantBaseViewForTenantView, getTenantBaseViewForTenantId, isZeniDomainTenant, isTenantUsingZeniCOA, TenantsBaseOrdered, TenantsOrdered, TenantCoreDetailsView, fetchActiveTenant, fetchAllTenants, updateCurrentTenant, clearAll, doMagicLinkSignIn, verifyDeviceWithTwoFA, resendVerifyDeviceOTP, sendEmailMagicLinkToUser, doSignIn, updateSignInState, DoSignInPayload, doSignOut, resetSignInState, RoleResource, Connection, fetchExcludedResourcesForTenant, fetchExternalConnectionsForTenant, saveExternalConnectionForTenant, fetchSubscriptionSummaryForTenant, isTenantBankingOnly, isTenantCardsOnly, isTenantBookkeepingEnabled, isOtherProductsEnabledForTenant, };
647
647
  export { Account, AccountType, AccountBase, StatementCloseDay, toAccountType, AccountReport, NestedAccountReport, AccountWithBalanceReport, AccountGroup, AccountGroupReportV2, AccountGroupType, toAccountGroupType, AccountGroupReport, getAccountGroupKey, AccountGroupKey, RecommendedAccountBase, };
648
648
  export { Class, ClassBase, RecommendedClassBase, } from './entity/class/classState';
649
649
  export { getClassById } from './entity/class/classSelector';
@@ -901,6 +901,3 @@ export { BULK_UPLOAD_AUTOMATCHING_TIMEOUT_MS, BULK_UPLOAD_BAR_COMPLETE_HOLD_MS,
901
901
  export { fetchTransactionActivityLog } from './view/transactionActivityLogView/transactionActivityLogViewReducer';
902
902
  export { TransactionActivityLogViewSelectorView, getTransactionActivityLogView, } from './view/transactionActivityLogView/transactionActivityLogViewSelector';
903
903
  export { UserGroup } from './entity/userGroups/userGroupsState';
904
- export { SessionManager } from './entity/tenant/SessionManager';
905
- export type { SessionCallbacks, SessionConfig } from './entity/tenant/sessionTypes';
906
- export { DEFAULT_SESSION_CONFIG } from './entity/tenant/sessionTypes';