@zeniai/client-epic-state 5.2.81 → 5.2.83-beta0UT

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 (33) hide show
  1. package/lib/esm/index.js +2 -0
  2. package/lib/esm/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +5 -1
  3. package/lib/esm/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewPayload.js +50 -0
  4. package/lib/esm/view/settingsView/epic/saveNotificationSettingsEpic.js +7 -0
  5. package/lib/esm/view/settingsView/settingsViewHelpers.js +1 -0
  6. package/lib/esm/view/settingsView/settingsViewReducer.js +5 -1
  7. package/lib/esm/view/settingsView/settingsViewState.js +1 -0
  8. package/lib/esm/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +2 -1
  9. package/lib/esm/view/taskManager/taskDetailView/taskDetailSelector.js +6 -4
  10. package/lib/esm/view/userGroupListView/userGroupListViewSelector.js +5 -0
  11. package/lib/esm/view/userListView/fetchUserListByTypeEpic.js +14 -5
  12. package/lib/esm/view/userListView/userListViewReducer.js +7 -1
  13. package/lib/index.d.ts +3 -1
  14. package/lib/index.js +42 -39
  15. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.js +5 -1
  16. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewPayload.d.ts +10 -0
  17. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewPayload.js +50 -0
  18. package/lib/view/invoicing/editInvoicingSubscriptionDetailView/editInvoicingSubscriptionDetailViewState.d.ts +13 -0
  19. package/lib/view/settingsView/epic/saveNotificationSettingsEpic.js +7 -0
  20. package/lib/view/settingsView/settingsViewHelpers.js +1 -0
  21. package/lib/view/settingsView/settingsViewPayload.d.ts +2 -0
  22. package/lib/view/settingsView/settingsViewReducer.js +5 -1
  23. package/lib/view/settingsView/settingsViewState.d.ts +2 -2
  24. package/lib/view/settingsView/settingsViewState.js +1 -0
  25. package/lib/view/taskManager/taskDetailView/epics/saveTaskDetailEpic.js +2 -1
  26. package/lib/view/taskManager/taskDetailView/taskDetailSelector.js +6 -4
  27. package/lib/view/userGroupListView/userGroupListViewSelector.d.ts +2 -0
  28. package/lib/view/userGroupListView/userGroupListViewSelector.js +6 -1
  29. package/lib/view/userListView/fetchUserListByTypeEpic.d.ts +2 -2
  30. package/lib/view/userListView/fetchUserListByTypeEpic.js +13 -4
  31. package/lib/view/userListView/userListViewReducer.d.ts +3 -1
  32. package/lib/view/userListView/userListViewReducer.js +8 -2
  33. package/package.json +1 -1
@@ -153,6 +153,7 @@ const isRemindersSectionVisibleOnSettingsPage = (reminderNotificationSettings) =
153
153
  reminderNotificationSettings.pendingBillApprovalNotification != null ||
154
154
  reminderNotificationSettings.pendingReimbursementApprovalNotification !=
155
155
  null ||
156
+ reminderNotificationSettings.pendingTaskNotification != null ||
156
157
  reminderNotificationSettings.uncategorizedTransactionNotification != null);
157
158
  };
158
159
  exports.isRemindersSectionVisibleOnSettingsPage = isRemindersSectionVisibleOnSettingsPage;
@@ -32,10 +32,12 @@ export interface NotificationSettingsPayload {
32
32
  is_month_end_insights_active: boolean | null;
33
33
  is_pending_bill_approval_notification_active: boolean | null;
34
34
  is_pending_reimbursement_approval_notification_active: boolean | null;
35
+ is_pending_task_notification_active: boolean | null;
35
36
  is_uncategorized_transaction_notification_active: boolean | null;
36
37
  missing_receipt_notification: RemindersPayload | null;
37
38
  pending_bill_approval_notification: RemindersPayload | null;
38
39
  pending_reimbursement_approval_notification: RemindersPayload | null;
40
+ pending_task_notification: RemindersPayload | null;
39
41
  uncategorized_transaction_notification: RemindersPayload | null;
40
42
  month_end_email_recipient_email_ids?: string[];
41
43
  task_checklist_preferences?: NotificationPreferencesPayload;
@@ -8,6 +8,7 @@ const settingsViewState_1 = require("./settingsViewState");
8
8
  const initialNotificationSettingsData = {
9
9
  reminderNotificationSettings: {
10
10
  missingReceiptNotification: null,
11
+ pendingTaskNotification: null,
11
12
  uncategorizedTransactionNotification: null,
12
13
  pendingBillApprovalNotification: null,
13
14
  pendingReimbursementApprovalNotification: null,
@@ -48,6 +49,7 @@ const initialNotificationSettingsLocalData = {
48
49
  missingReceiptNotification: initialRemindersLocalData,
49
50
  pendingBillApprovalNotification: initialRemindersLocalData,
50
51
  pendingReimbursementApprovalNotification: initialRemindersLocalData,
52
+ pendingTaskNotification: initialRemindersLocalData,
51
53
  uncategorizedTransactionNotification: initialRemindersLocalData,
52
54
  },
53
55
  };
@@ -377,7 +379,7 @@ function toRemindersLocalData(reminderNotificationSettingDetails) {
377
379
  }
378
380
  const toNotificationSettingsLocalData = (data, loggedInUserEmail) => {
379
381
  const { monthEndInsightsNotificationSettings, reminderNotificationSettings } = data;
380
- const { missingReceiptNotification, pendingBillApprovalNotification, pendingReimbursementApprovalNotification, uncategorizedTransactionNotification, } = reminderNotificationSettings;
382
+ const { missingReceiptNotification, pendingBillApprovalNotification, pendingReimbursementApprovalNotification, pendingTaskNotification, uncategorizedTransactionNotification, } = reminderNotificationSettings;
381
383
  return {
382
384
  monthEndInsights: {
383
385
  notify: monthEndInsightsNotificationSettings.enabled ??
@@ -388,6 +390,7 @@ const toNotificationSettingsLocalData = (data, loggedInUserEmail) => {
388
390
  missingReceiptNotification: toRemindersLocalData(missingReceiptNotification),
389
391
  pendingBillApprovalNotification: toRemindersLocalData(pendingBillApprovalNotification),
390
392
  pendingReimbursementApprovalNotification: toRemindersLocalData(pendingReimbursementApprovalNotification),
393
+ pendingTaskNotification: toRemindersLocalData(pendingTaskNotification),
391
394
  uncategorizedTransactionNotification: toRemindersLocalData(uncategorizedTransactionNotification),
392
395
  },
393
396
  };
@@ -412,6 +415,7 @@ const toNotificationSettings = (data) => {
412
415
  missingReceiptNotification: toReminderNotificationSettingsDetails(data.is_missing_receipt_notification_active, data.missing_receipt_notification),
413
416
  pendingBillApprovalNotification: toReminderNotificationSettingsDetails(data.is_pending_bill_approval_notification_active, data.pending_bill_approval_notification),
414
417
  pendingReimbursementApprovalNotification: toReminderNotificationSettingsDetails(data.is_pending_reimbursement_approval_notification_active, data.pending_reimbursement_approval_notification),
418
+ pendingTaskNotification: toReminderNotificationSettingsDetails(data.is_pending_task_notification_active, data.pending_task_notification),
415
419
  uncategorizedTransactionNotification: toReminderNotificationSettingsDetails(data.is_uncategorized_transaction_notification_active, data.uncategorized_transaction_notification),
416
420
  },
417
421
  monthEndInsightsNotificationSettings: {
@@ -9,8 +9,8 @@ interface BillingAddress extends FetchStateAndError {
9
9
  export interface IntegrationsSettings {
10
10
  refreshQBO: FetchStateAndError;
11
11
  }
12
- export declare const REMINDER_NOTIFICATION_TYPES: readonly ["missingReceiptNotification", "uncategorizedTransactionNotification", "pendingBillApprovalNotification", "pendingReimbursementApprovalNotification"];
13
- declare const toReminderTypeKey: (v: string) => "missingReceiptNotification" | "uncategorizedTransactionNotification" | "pendingBillApprovalNotification" | "pendingReimbursementApprovalNotification";
12
+ export declare const REMINDER_NOTIFICATION_TYPES: readonly ["missingReceiptNotification", "pendingTaskNotification", "uncategorizedTransactionNotification", "pendingBillApprovalNotification", "pendingReimbursementApprovalNotification"];
13
+ declare const toReminderTypeKey: (v: string) => "missingReceiptNotification" | "pendingTaskNotification" | "uncategorizedTransactionNotification" | "pendingBillApprovalNotification" | "pendingReimbursementApprovalNotification";
14
14
  export type ReminderTypeKey = ReturnType<typeof toReminderTypeKey>;
15
15
  export declare const toRemindersFrequencyType: (v: string) => "weekly" | "monthly" | "daily" | "bi-weekly";
16
16
  export type FrequencyTypeKey = ReturnType<typeof toRemindersFrequencyType>;
@@ -4,6 +4,7 @@ exports.toNotificationMode = exports.NOTIFICATION_MODES = exports.toRemindersFre
4
4
  const stringToUnion_1 = require("../../commonStateTypes/stringToUnion");
5
5
  exports.REMINDER_NOTIFICATION_TYPES = [
6
6
  'missingReceiptNotification',
7
+ 'pendingTaskNotification',
7
8
  'uncategorizedTransactionNotification',
8
9
  'pendingBillApprovalNotification',
9
10
  'pendingReimbursementApprovalNotification',
@@ -9,6 +9,7 @@ const snackbarReducer_1 = require("../../../../entity/snackbar/snackbarReducer")
9
9
  const taskReducer_1 = require("../../../../entity/task/taskReducer");
10
10
  const taskSelector_1 = require("../../../../entity/task/taskSelector");
11
11
  const responsePayload_1 = require("../../../../responsePayload");
12
+ const zeniDayJS_1 = require("../../../../zeniDayJS");
12
13
  const taskListReducer_1 = require("../../taskListView/taskListReducer");
13
14
  const taskDetailReducer_1 = require("../taskDetailReducer");
14
15
  const saveTaskDetailEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(taskDetailReducer_1.saveTaskDetail.match), (0, operators_1.mergeMap)((action) => {
@@ -154,7 +155,7 @@ const prepareTaskPayload = (state, taskId, taskGroupIds) => {
154
155
  : null,
155
156
  recurring_frequency: localData.type.code === 'recurring' ? localData.recurringFrequency : null,
156
157
  recurring_start_date: localData.type.code === 'recurring'
157
- ? (localData.recurringStartDate?.format(timePeriod_1.DEFAULT_DATE_FORMAT) ?? null)
158
+ ? (localData.recurringStartDate ?? (0, zeniDayJS_1.dateNow)()).format(timePeriod_1.DEFAULT_DATE_FORMAT)
158
159
  : null,
159
160
  recurring_days_of_week: localData.type.code === 'recurring' &&
160
161
  localData.recurringFrequency === 'semi_weekly'
@@ -177,10 +177,12 @@ const showFormFooter = (taskDetailLocalData, taskDetailInStore) => {
177
177
  !(0, isEqual_1.default)(taskDetailLocalData.fileIds, taskDetailInStore.fileIds ?? []) ||
178
178
  !(0, isEqual_1.default)(taskDetailLocalData.dueDate, taskDetailInStore.dueDate) ||
179
179
  !(0, isEqual_1.default)(taskDetailLocalData.type, taskDetailInStore.type) ||
180
- !(0, isEqual_1.default)(taskDetailLocalData.savedRecurringEndDate, taskDetailInStore.recurringEndDate) ||
181
- !(0, isEqual_1.default)(taskDetailLocalData.recurringFrequency, taskDetailInStore.recurringFrequency) ||
182
- !(0, isEqual_1.default)(taskDetailLocalData.recurringDaysOfWeek, taskDetailInStore.recurringDaysOfWeek) ||
183
- !(0, isEqual_1.default)(taskDetailLocalData.recurringStartDate, taskDetailInStore.recurringStartDate) ||
180
+ // Only a recurring task saves these, so on any other type they are not an edit.
181
+ (taskDetailLocalData.type.code === 'recurring' &&
182
+ (!(0, isEqual_1.default)(taskDetailLocalData.savedRecurringEndDate, taskDetailInStore.recurringEndDate) ||
183
+ !(0, isEqual_1.default)(taskDetailLocalData.recurringFrequency, taskDetailInStore.recurringFrequency) ||
184
+ !(0, isEqual_1.default)(taskDetailLocalData.recurringDaysOfWeek, taskDetailInStore.recurringDaysOfWeek) ||
185
+ !(0, isEqual_1.default)(taskDetailLocalData.recurringStartDate, taskDetailInStore.recurringStartDate))) ||
184
186
  !(0, isEqual_1.default)(taskDetailLocalData.timeSpent, taskDetailInStore.timeSpent) ||
185
187
  !(0, isEqual_1.default)(taskDetailLocalData.taskGroupId, taskDetailInStore.taskGroupIds.length > 0
186
188
  ? taskDetailInStore.taskGroupIds[0]
@@ -1,7 +1,9 @@
1
1
  import { SelectorView } from '../../commonStateTypes/viewAndReport/viewAndReport';
2
2
  import { UserGroup, UserGroupsState } from '../../entity/userGroups/userGroupsState';
3
+ import { RootState } from '../../rootStateTypes';
3
4
  import { UserGroupListType, UserGroupListViewState } from './userGroupListViewState';
4
5
  export interface UserGroupListSelectorView extends SelectorView {
5
6
  userGroups: UserGroup[];
6
7
  }
7
8
  export declare const getUserGroupList: (userGroupsState: UserGroupsState, userGroupListViewState: UserGroupListViewState, userGroupType: UserGroupListType) => UserGroupListSelectorView;
9
+ export declare const getTaskManagerCandidateUserGroups: (state: RootState) => UserGroup[];
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getUserGroupList = void 0;
3
+ exports.getTaskManagerCandidateUserGroups = exports.getUserGroupList = void 0;
4
+ const toolkit_1 = require("@reduxjs/toolkit");
4
5
  const userGroupsSelector_1 = require("../../entity/userGroups/userGroupsSelector");
5
6
  const getUserGroupList = (userGroupsState, userGroupListViewState, userGroupType) => {
6
7
  const listState = userGroupListViewState.userGroupListByType[userGroupType];
@@ -18,3 +19,7 @@ function getUserGroupListByIds(userGroupsState, userGroupListViewState, type) {
18
19
  .map((id) => (0, userGroupsSelector_1.getUserGroupByUserGroupId)(userGroupsState, id))
19
20
  .filter((value) => value != null);
20
21
  }
22
+ exports.getTaskManagerCandidateUserGroups = (0, toolkit_1.createSelector)([
23
+ (state) => state.userGroupsState,
24
+ (state) => state.userGroupListViewState,
25
+ ], (userGroupsState, userGroupListViewState) => getUserGroupListByIds(userGroupsState, userGroupListViewState, 'taskManagerCandidate'));
@@ -7,6 +7,6 @@ import { RootState } from '../../rootStateTypes';
7
7
  import { ZeniAPI } from '../../zeniAPI';
8
8
  import { updateChargeCardCount, updateDebitCardCount } from '../spendManagement/chargeCards/issueChargeCard/issueChargeCardReducer';
9
9
  import { updateUserGroupIds } from '../userGroupListView/userGroupListViewReducer';
10
- import { fetchUserListByType, updateUserIds, updateUserListFetchFailure } from './userListViewReducer';
11
- export type ActionType = ReturnType<typeof fetchUserListByType> | ReturnType<typeof updateAllUsers> | ReturnType<typeof updateUserRoles> | ReturnType<typeof updateUserIds> | ReturnType<typeof updateChargeCardCount> | ReturnType<typeof updateDebitCardCount> | ReturnType<typeof updateAddresses> | ReturnType<typeof updateUserListFetchFailure> | ReturnType<typeof updateAllUserGroups> | ReturnType<typeof updateUserGroupIds>;
10
+ import { fetchUserListByType, resetUserListFetchState, updateUserIds, updateUserListFetchFailure } from './userListViewReducer';
11
+ export type ActionType = ReturnType<typeof fetchUserListByType> | ReturnType<typeof updateAllUsers> | ReturnType<typeof updateUserRoles> | ReturnType<typeof updateUserIds> | ReturnType<typeof updateChargeCardCount> | ReturnType<typeof updateDebitCardCount> | ReturnType<typeof updateAddresses> | ReturnType<typeof updateUserListFetchFailure> | ReturnType<typeof resetUserListFetchState> | ReturnType<typeof updateAllUserGroups> | ReturnType<typeof updateUserGroupIds>;
12
12
  export declare const fetchUserListByTypeEpic: (actions$: ActionsObservable<ActionType>, state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => import("rxjs").Observable<ActionType>;
@@ -24,7 +24,14 @@ const fetchUserListByTypeEpic = (actions$, state$, zeniAPI) => actions$.pipe((0,
24
24
  const queryParam = getQueryParam(userType, isZeniTenant);
25
25
  apiUrl =
26
26
  apiUrl + `?query=${encodeURIComponent(JSON.stringify(queryParam))}`;
27
+ // The tenant the request is sent for. A reply after a tenant switch must
28
+ // not land in the new tenant's state, so the fetch is reset instead.
29
+ const requestTenantId = zeniAPI.tenantId;
30
+ const isForPreviousTenant = () => requestTenantId != null && zeniAPI.tenantId !== requestTenantId;
27
31
  return zeniAPI.getJSON(apiUrl).pipe((0, operators_1.mergeMap)((response) => {
32
+ if (isForPreviousTenant()) {
33
+ return (0, rxjs_1.of)((0, userListViewReducer_1.resetUserListFetchState)({ userType }));
34
+ }
28
35
  if ((0, responsePayload_1.isSuccessResponse)(response)) {
29
36
  const userListAction = [
30
37
  (0, userReducer_1.updateAllUsers)({ users: response.data?.users ?? [] }),
@@ -53,10 +60,12 @@ const fetchUserListByTypeEpic = (actions$, state$, zeniAPI) => actions$.pipe((0,
53
60
  else {
54
61
  return (0, rxjs_1.of)((0, userListViewReducer_1.updateUserListFetchFailure)({ userType, status: response.status }));
55
62
  }
56
- }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)((0, userListViewReducer_1.updateUserListFetchFailure)({
57
- userType,
58
- status: (0, responsePayload_1.createZeniAPIStatus)('Unexpected error', 'User REST API call errored out' + JSON.stringify(error)),
59
- }))));
63
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.of)(isForPreviousTenant()
64
+ ? (0, userListViewReducer_1.resetUserListFetchState)({ userType })
65
+ : (0, userListViewReducer_1.updateUserListFetchFailure)({
66
+ userType,
67
+ status: (0, responsePayload_1.createZeniAPIStatus)('Unexpected error', 'User REST API call errored out' + JSON.stringify(error)),
68
+ }))));
60
69
  }
61
70
  else {
62
71
  return (0, rxjs_1.from)([]);
@@ -18,6 +18,8 @@ export declare const fetchUserListByType: import("@reduxjs/toolkit").ActionCreat
18
18
  }, "userListView/removeUserId">, updateUserListFetchFailure: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
19
19
  status: ZeniAPIStatus;
20
20
  userType: UserListType;
21
- }, "userListView/updateUserListFetchFailure">;
21
+ }, "userListView/updateUserListFetchFailure">, resetUserListFetchState: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
22
+ userType: UserListType;
23
+ }, "userListView/resetUserListFetchState">;
22
24
  declare const _default: import("redux").Reducer<UserListViewState>;
23
25
  export default _default;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.updateUserListFetchFailure = exports.removeUserId = exports.addUserId = exports.updateUserIds = exports.fetchUserListByType = exports.initialState = void 0;
4
+ exports.resetUserListFetchState = exports.updateUserListFetchFailure = exports.removeUserId = exports.addUserId = exports.updateUserIds = exports.fetchUserListByType = exports.initialState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  const rootActions_1 = require("../../rootActions");
7
7
  const initialUserList = {
@@ -63,6 +63,12 @@ const userListView = (0, toolkit_1.createSlice)({
63
63
  draft.userListByType[userType].ids.splice(userIndex, 1);
64
64
  }
65
65
  },
66
+ resetUserListFetchState(draft, action) {
67
+ const list = draft.userListByType[action.payload.userType];
68
+ if (list.fetchState === 'In-Progress') {
69
+ list.fetchState = 'Not-Started';
70
+ }
71
+ },
66
72
  updateUserListFetchFailure(draft, action) {
67
73
  const { userType, status } = action.payload;
68
74
  draft.userListByType[userType].fetchState = 'Error';
@@ -75,5 +81,5 @@ const userListView = (0, toolkit_1.createSlice)({
75
81
  });
76
82
  },
77
83
  });
78
- _a = userListView.actions, exports.fetchUserListByType = _a.fetchUserListByType, exports.updateUserIds = _a.updateUserIds, exports.addUserId = _a.addUserId, exports.removeUserId = _a.removeUserId, exports.updateUserListFetchFailure = _a.updateUserListFetchFailure;
84
+ _a = userListView.actions, exports.fetchUserListByType = _a.fetchUserListByType, exports.updateUserIds = _a.updateUserIds, exports.addUserId = _a.addUserId, exports.removeUserId = _a.removeUserId, exports.updateUserListFetchFailure = _a.updateUserListFetchFailure, exports.resetUserListFetchState = _a.resetUserListFetchState;
79
85
  exports.default = userListView.reducer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "5.2.81",
3
+ "version": "5.2.83-beta0UT",
4
4
  "description": "Shared module between Web & Mobile containing required abstractions for state management, async network communication. ",
5
5
  "main": "lib/index.js",
6
6
  "module": "lib/esm/index.js",