@zeniai/client-epic-state 5.0.89 → 5.0.90-betaAR1

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 (66) hide show
  1. package/lib/entity/approvalRule/approvalRuleConflict.d.ts +56 -0
  2. package/lib/entity/approvalRule/approvalRuleConflict.js +77 -0
  3. package/lib/entity/approvalRule/approvalRulePayload.d.ts +34 -5
  4. package/lib/entity/approvalRule/approvalRulePayload.js +145 -10
  5. package/lib/entity/approvalRule/approvalRuleSelector.d.ts +25 -1
  6. package/lib/entity/approvalRule/approvalRuleSelector.js +40 -0
  7. package/lib/entity/approvalRule/approvalRuleState.d.ts +59 -7
  8. package/lib/entity/snackbar/snackbarTypes.d.ts +1 -1
  9. package/lib/entity/snackbar/snackbarTypes.js +2 -0
  10. package/lib/epic.d.ts +3 -1
  11. package/lib/epic.js +3 -1
  12. package/lib/esm/entity/approvalRule/approvalRuleConflict.js +74 -0
  13. package/lib/esm/entity/approvalRule/approvalRulePayload.js +145 -10
  14. package/lib/esm/entity/approvalRule/approvalRuleSelector.js +35 -0
  15. package/lib/esm/entity/snackbar/snackbarTypes.js +2 -0
  16. package/lib/esm/epic.js +3 -1
  17. package/lib/esm/index.js +7 -5
  18. package/lib/esm/view/expenseAutomationView/transactionFilterHelpers.js +106 -18
  19. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +92 -12
  20. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/deleteBillPayApprovalRuleEpic.js +10 -2
  21. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.js +8 -4
  22. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/initializeBillPaySetupApproverViewUpdateDataEpic.js +11 -7
  23. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.js +54 -0
  24. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/epic/saveBillPaySetupApproverViewUpdatesEpic.js +13 -4
  25. package/lib/esm/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +119 -16
  26. package/lib/esm/view/spendManagement/billPay/editBillView/editBillViewSelector.js +43 -4
  27. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/deleteRemiApprovalRuleEpic.js +10 -2
  28. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.js +8 -2
  29. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/initializeRemiSetupApproverViewUpdateDataEpic.js +11 -7
  30. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.js +49 -0
  31. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/epic/saveRemiSetupApproverViewUpdatesEpic.js +13 -4
  32. package/lib/esm/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +71 -11
  33. package/lib/index.d.ts +8 -6
  34. package/lib/index.js +27 -16
  35. package/lib/view/companyTaskManagerView/companyTaskManagerViewReducer.d.ts +2 -2
  36. package/lib/view/companyView/types/cockpitTypes.d.ts +1 -1
  37. package/lib/view/expenseAutomationView/helpers/transactionCategorizationLocalDataHelper.d.ts +1 -1
  38. package/lib/view/expenseAutomationView/transactionFilterHelpers.js +106 -18
  39. package/lib/view/people/peopleTypes.d.ts +1 -1
  40. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.d.ts +14 -3
  41. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewReducer.js +93 -13
  42. package/lib/view/spendManagement/billPay/billPaySetupApproverView/billPaySetupApproverViewState.d.ts +16 -0
  43. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/deleteBillPayApprovalRuleEpic.js +10 -2
  44. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/fetchBillPaySetupApproverViewEpic.js +8 -4
  45. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/initializeBillPaySetupApproverViewUpdateDataEpic.js +10 -6
  46. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.d.ts +23 -0
  47. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/reorderBillPayApprovalRulesEpic.js +58 -0
  48. package/lib/view/spendManagement/billPay/billPaySetupApproverView/epic/saveBillPaySetupApproverViewUpdatesEpic.js +12 -3
  49. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.d.ts +56 -1
  50. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonPayload.js +121 -17
  51. package/lib/view/spendManagement/billPay/billPaySetupApproverView/types/commonState.d.ts +31 -5
  52. package/lib/view/spendManagement/billPay/editBillView/editBillViewSelector.d.ts +1 -1
  53. package/lib/view/spendManagement/billPay/editBillView/editBillViewSelector.js +43 -4
  54. package/lib/view/spendManagement/chargeCards/chargeCardList/chargeCardList.d.ts +1 -1
  55. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/deleteRemiApprovalRuleEpic.js +10 -2
  56. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/fetchRemiSetupApproverViewEpic.js +8 -2
  57. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/initializeRemiSetupApproverViewUpdateDataEpic.js +10 -6
  58. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.d.ts +14 -0
  59. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/reorderRemiApprovalRulesEpic.js +53 -0
  60. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/epic/saveRemiSetupApproverViewUpdatesEpic.js +12 -3
  61. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.d.ts +14 -3
  62. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewReducer.js +72 -12
  63. package/lib/view/spendManagement/reimbursement/remiSetupApproverView/remiSetupApproverViewState.d.ts +12 -0
  64. package/lib/view/taskManager/taskListView/taskList.d.ts +3 -3
  65. package/lib/view/transactionDetail/journalEntryLinesViewModel.d.ts +1 -1
  66. package/package.json +1 -1
@@ -1,19 +1,45 @@
1
1
  import { FetchStateAndError, ID } from '../../../../../commonStateTypes/common';
2
- import { Criteria, Step } from '../../../../../entity/approvalRule/approvalRuleState';
2
+ import { AmountCriteria, DepartmentCriteria, Step, VendorCriteria } from '../../../../../entity/approvalRule/approvalRuleState';
3
3
  export type ApprovalUpdateActionType = 'approval_create' | 'approval_update';
4
4
  export interface ApproverViewUpdateData {
5
5
  type: ApprovalUpdateActionType;
6
6
  updateStatus: FetchStateAndError;
7
7
  data?: ApprovalRuleUpdateData | ApprovalRuleCreateData;
8
8
  }
9
- export interface ApprovalRuleUpdateData {
9
+ /**
10
+ * Form-side criteria shape used by the rule create/edit form.
11
+ *
12
+ * Each condition kind gets its own optional slot, mirroring how the UI
13
+ * edits them as distinct rows. At most one of each kind is present; this
14
+ * matches the design constraint that each condition type can be added once.
15
+ */
16
+ export interface ApprovalRuleFormCriteria {
17
+ amount?: AmountCriteria;
18
+ department?: DepartmentCriteria;
19
+ vendor?: VendorCriteria;
20
+ }
21
+ /**
22
+ * Rule-level fields shared by both create and update flows.
23
+ *
24
+ * These come from the 3.0 design: the form now owns a name, an optional
25
+ * description, an optional Separation-of-Duties toggle, and a flag that
26
+ * marks the rule as the org-wide fallback rule. They live alongside
27
+ * criteria/steps but are not part of either.
28
+ */
29
+ export interface ApprovalRuleFormBase {
30
+ description?: string;
31
+ isFallback?: boolean;
32
+ name?: string;
33
+ separationOfDuties?: boolean;
34
+ }
35
+ export interface ApprovalRuleUpdateData extends ApprovalRuleFormBase {
10
36
  approvalRuleId: ID;
11
- criteria: Criteria;
37
+ criteria: ApprovalRuleFormCriteria;
12
38
  steps: Step[];
13
39
  isApplicableOnPendingApprovalEntity?: boolean;
14
40
  }
15
- export interface ApprovalRuleCreateData {
16
- criteria: Criteria;
41
+ export interface ApprovalRuleCreateData extends ApprovalRuleFormBase {
42
+ criteria: ApprovalRuleFormCriteria;
17
43
  steps: Step[];
18
44
  isApplicableOnPendingApprovalEntity?: boolean;
19
45
  }
@@ -157,4 +157,4 @@ export declare const getDefaultWithdrawFromAccount: (state: RootState, depositAc
157
157
  accountId: ID;
158
158
  accountType: AccountTypeSubConfigCodeKeyType;
159
159
  }) => FundingAccount | undefined;
160
- export declare const checkIfCreatorIsApprover: (billAmount: number, approvalRules: ApprovalRuleWithUser[], signedInUser?: LoggedInUser) => boolean;
160
+ export declare const checkIfCreatorIsApprover: (billAmount: number, approvalRules: ApprovalRuleWithUser[], signedInUser?: LoggedInUser, billVendorId?: ID, billDepartmentId?: ID) => boolean;
@@ -9,6 +9,7 @@ exports.getPaymentSection = getPaymentSection;
9
9
  exports.toPaymentToOption = toPaymentToOption;
10
10
  const get_1 = __importDefault(require("lodash/get"));
11
11
  const has_1 = __importDefault(require("lodash/has"));
12
+ const approvalRuleSelector_1 = require("../../../../entity/approvalRule/approvalRuleSelector");
12
13
  const reduceFetchState_1 = require("../../../../commonStateTypes/reduceFetchState");
13
14
  const bankAccountSelector_1 = require("../../../../entity/bankAccount/bankAccountSelector");
14
15
  const contactSelector_1 = require("../../../../entity/billPay/contact/contactSelector");
@@ -695,12 +696,50 @@ const getDefaultWithdrawFromAccount = (state, depositAccounts, companyId, lastSe
695
696
  return undefined;
696
697
  };
697
698
  exports.getDefaultWithdrawFromAccount = getDefaultWithdrawFromAccount;
698
- const checkIfCreatorIsApprover = (billAmount, approvalRules, signedInUser) => {
699
+ const checkIfCreatorIsApprover = (billAmount, approvalRules, signedInUser, billVendorId, billDepartmentId) => {
699
700
  let isCreatorAlsoApprover = false;
701
+ // Approval Rules 3.0 — a rule is applicable when every criterion it
702
+ // carries matches the bill. Amount uses inclusive bounds ('gte'/'lte'
703
+ // on the wire), and either bound may be absent for a one-sided
704
+ // 'greater_than' or 'less_than' rule. Vendor / department criteria
705
+ // narrow the rule by entity; an absent criterion means 'no narrowing
706
+ // on this axis'. Rules without an amount criterion at all are not
707
+ // considered here, preserving the pre-3.0 behaviour where this
708
+ // selector only ever matched amount-bearing rules.
700
709
  const approvalRule = approvalRules.find((rule) => {
701
- const { max, min } = rule.criteria[0].range;
702
- return (billAmount > min.amount &&
703
- (max?.amount != null ? billAmount <= max?.amount : true));
710
+ const amountCriteria = (0, approvalRuleSelector_1.getAmountCriteria)(rule.criteria);
711
+ if (amountCriteria == null) {
712
+ return false;
713
+ }
714
+ const { min, max } = amountCriteria;
715
+ const matchesMin = min == null || billAmount >= min.amount;
716
+ const matchesMax = max == null || billAmount <= max.amount;
717
+ if (!matchesMin || !matchesMax) {
718
+ return false;
719
+ }
720
+ const vendorCriteria = (0, approvalRuleSelector_1.getVendorCriteria)(rule.criteria);
721
+ if (vendorCriteria != null) {
722
+ const includesVendor = billVendorId != null &&
723
+ vendorCriteria.vendorIds.includes(billVendorId);
724
+ if (vendorCriteria.operator === 'is' && !includesVendor) {
725
+ return false;
726
+ }
727
+ if (vendorCriteria.operator === 'is_not' && includesVendor) {
728
+ return false;
729
+ }
730
+ }
731
+ const departmentCriteria = (0, approvalRuleSelector_1.getDepartmentCriteria)(rule.criteria);
732
+ if (departmentCriteria != null) {
733
+ const includesDepartment = billDepartmentId != null &&
734
+ departmentCriteria.departmentIds.includes(billDepartmentId);
735
+ if (departmentCriteria.operator === 'is' && !includesDepartment) {
736
+ return false;
737
+ }
738
+ if (departmentCriteria.operator === 'is_not' && includesDepartment) {
739
+ return false;
740
+ }
741
+ }
742
+ return true;
704
743
  });
705
744
  if (approvalRule != null) {
706
745
  const requireApprovalSteps = approvalRule.steps.filter((step) => step.action === 'require_approval');
@@ -61,7 +61,7 @@ export declare const initialCreditAcc: CreditAccount;
61
61
  export declare const initialDebitCardSummaries: DebitCardSummaries;
62
62
  export declare const initialResendRevokeCardInvite: ResendRevokeCardInvite;
63
63
  export declare const initialCreditAccountRepayment: CreditAccountRepayment;
64
- export declare const toChargeCardSortKeyType: (v: string) => "status" | "accountType" | "owner" | "cardName" | "limit" | "department" | "cardType" | "utilisation";
64
+ export declare const toChargeCardSortKeyType: (v: string) => "status" | "department" | "accountType" | "owner" | "cardName" | "limit" | "cardType" | "utilisation";
65
65
  export declare type ChargeCardViewSortKey = ReturnType<typeof toChargeCardSortKeyType>;
66
66
  export declare const ALL_CASHBACK_SORT_KEYS: readonly ["month", "cashback"];
67
67
  export declare const toCashbackSortKeyType: (v: string) => "month" | "cashback";
@@ -9,9 +9,17 @@ const userReducer_1 = require("../../../../../entity/user/userReducer");
9
9
  const responsePayload_1 = require("../../../../../responsePayload");
10
10
  const remiSetupApproverViewReducer_1 = require("../remiSetupApproverViewReducer");
11
11
  const deleteRemiApprovalRuleEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(remiSetupApproverViewReducer_1.deleteRemiApprovalRule.match), (0, operators_1.switchMap)((action) => {
12
- const { approvalRuleId } = action.payload;
12
+ const { approvalRuleId, useV3 } = action.payload;
13
+ // Approval Rules 3.0 — flag-gated endpoint selection.
14
+ // Explicit `=== true` keeps `strict-boolean-expressions` happy
15
+ // when RTK's payload type widens to `any` in some configs.
16
+ const endpoint = useV3 === true
17
+ ? `${zeniAPI.apiEndPoints.approvalMicroServiceBaseUrl}/1.0/reimbursements/approval-rules-v2`
18
+ : `${zeniAPI.apiEndPoints.approvalMicroServiceBaseUrl}/1.0/reimbursements/approval-rules`;
13
19
  return zeniAPI
14
- .deleteAndGetJSON(`${zeniAPI.apiEndPoints.approvalMicroServiceBaseUrl}/1.0/reimbursements/approval-rules`, { approval_rule_id: approvalRuleId })
20
+ .deleteAndGetJSON(endpoint, {
21
+ approval_rule_id: approvalRuleId,
22
+ })
15
23
  .pipe((0, operators_1.mergeMap)((response) => {
16
24
  if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
17
25
  const approvalRuleIds = response.data.approval_rules.map((approvalRule) => approvalRule.approval_rule_id);
@@ -9,7 +9,7 @@ const userReducer_1 = require("../../../../../entity/user/userReducer");
9
9
  const responsePayload_1 = require("../../../../../responsePayload");
10
10
  const remiSetupApproverViewReducer_1 = require("../remiSetupApproverViewReducer");
11
11
  const fetchRemiSetupApproverViewEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(remiSetupApproverViewReducer_1.fetchRemiSetupApproverView.match), (0, operators_1.switchMap)((action) => {
12
- const { cacheOverride, resolveAttributeToUser, includeImplicitActors } = action.payload;
12
+ const { cacheOverride, resolveAttributeToUser, includeImplicitActors, useV3, } = action.payload;
13
13
  const { remiSetupApproverViewState, approvalRuleState } = state$.value;
14
14
  const approvalRules = (0, approvalRuleSelector_1.getApprovalRulesByIds)(approvalRuleState, remiSetupApproverViewState.approvalRuleIds);
15
15
  if (cacheOverride === true ||
@@ -17,8 +17,14 @@ const fetchRemiSetupApproverViewEpic = (actions$, state$, zeniAPI) => actions$.p
17
17
  remiSetupApproverViewState.approvalRuleIds.length ||
18
18
  (remiSetupApproverViewState.hasValidState() === false &&
19
19
  remiSetupApproverViewState.fetchState !== 'In-Progress')) {
20
+ // Approval Rules 3.0 — flag-gated endpoint selection.
21
+ // Explicit `=== true` keeps `strict-boolean-expressions` happy
22
+ // when RTK's payload type widens to `any` in some configs.
23
+ const basePath = useV3 === true
24
+ ? `${zeniAPI.apiEndPoints.approvalMicroServiceBaseUrl}/1.0/reimbursements/approval-rules-v2`
25
+ : `${zeniAPI.apiEndPoints.approvalMicroServiceBaseUrl}/1.0/reimbursements/approval-rules`;
20
26
  return zeniAPI
21
- .getJSON(`${zeniAPI.apiEndPoints.approvalMicroServiceBaseUrl}/1.0/reimbursements/approval-rules?query={"is_include_implicit_actors": ${includeImplicitActors}, "is_resolve_attribute_to_user":${resolveAttributeToUser}}`)
27
+ .getJSON(`${basePath}?query={"is_include_implicit_actors": ${includeImplicitActors}, "is_resolve_attribute_to_user":${resolveAttributeToUser}}`)
22
28
  .pipe((0, operators_1.mergeMap)((response) => {
23
29
  if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
24
30
  const approvalRuleIds = response.data.approval_rules.map((approvalRule) => approvalRule.approval_rule_id);
@@ -11,16 +11,20 @@ const initializeRemiSetupApproverViewUpdateDataEpic = (actions$, state$) => acti
11
11
  if (approvalRuleId != null) {
12
12
  const approvalRule = (0, approvalRuleSelector_1.getApprovalRuleById)(state$.value.approvalRuleState, approvalRuleId);
13
13
  if (approvalRule != null) {
14
- const criteria = approvalRule.criteria[0];
15
- const range = criteria?.range;
16
14
  const remiSetupApproverViewUpdateData = {
17
15
  approvalRuleId,
18
16
  steps: approvalRule.steps,
19
17
  criteria: {
20
- rangeType: criteria?.rangeType,
21
- rangeEntity: criteria?.rangeEntity,
22
- range,
18
+ amount: (0, approvalRuleSelector_1.getAmountCriteria)(approvalRule.criteria),
19
+ vendor: (0, approvalRuleSelector_1.getVendorCriteria)(approvalRule.criteria),
20
+ department: (0, approvalRuleSelector_1.getDepartmentCriteria)(approvalRule.criteria),
23
21
  },
22
+ // Approval Rules 3.0 — seed rule-level fields so the form can
23
+ // round-trip them on edit. Each may be undefined on legacy rules.
24
+ name: approvalRule.name,
25
+ description: approvalRule.description,
26
+ separationOfDuties: approvalRule.separationOfDuties,
27
+ isFallback: approvalRule.isFallback,
24
28
  };
25
29
  fetchActions.push((0, remiSetupApproverViewReducer_1.clearRemiSetupApproverViewUpdateData)(), (0, remiSetupApproverViewReducer_1.saveRemiSetupApproverViewUpdateData)(remiSetupApproverViewUpdateData));
26
30
  }
@@ -28,7 +32,7 @@ const initializeRemiSetupApproverViewUpdateDataEpic = (actions$, state$) => acti
28
32
  else {
29
33
  const remiSetupApproverViewCreateData = {
30
34
  steps: [],
31
- criteria: undefined,
35
+ criteria: {},
32
36
  };
33
37
  fetchActions.push((0, remiSetupApproverViewReducer_1.clearRemiSetupApproverViewUpdateData)(), (0, remiSetupApproverViewReducer_1.saveRemiSetupApproverViewUpdateData)(remiSetupApproverViewCreateData));
34
38
  }
@@ -0,0 +1,14 @@
1
+ import { ActionsObservable, StateObservable } from 'redux-observable';
2
+ import { Observable } from 'rxjs';
3
+ import { updateApprovalRules } from '../../../../../entity/approvalRule/approvalRuleReducer';
4
+ import { openSnackbar } from '../../../../../entity/snackbar/snackbarReducer';
5
+ import { RootState } from '../../../../../reducer';
6
+ import { ZeniAPI } from '../../../../../zeniAPI';
7
+ import { fetchRemiSetupApproverView, reorderRemiApprovalRules, reorderRemiApprovalRulesFailure, reorderRemiApprovalRulesSuccess } from '../remiSetupApproverViewReducer';
8
+ /**
9
+ * Approval Rules 3.0 — list-page drag-and-drop reorder for
10
+ * reimbursements. Mirrors the BillPay reorder epic — see that file
11
+ * for the longer rationale.
12
+ */
13
+ export type ActionType = ReturnType<typeof reorderRemiApprovalRules> | ReturnType<typeof reorderRemiApprovalRulesSuccess> | ReturnType<typeof reorderRemiApprovalRulesFailure> | ReturnType<typeof updateApprovalRules> | ReturnType<typeof fetchRemiSetupApproverView> | ReturnType<typeof openSnackbar>;
14
+ export declare const reorderRemiApprovalRulesEpic: (actions$: ActionsObservable<ActionType>, _state$: StateObservable<RootState>, zeniAPI: ZeniAPI) => Observable<ActionType>;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.reorderRemiApprovalRulesEpic = void 0;
4
+ const rxjs_1 = require("rxjs");
5
+ const operators_1 = require("rxjs/operators");
6
+ const approvalRuleReducer_1 = require("../../../../../entity/approvalRule/approvalRuleReducer");
7
+ const snackbarReducer_1 = require("../../../../../entity/snackbar/snackbarReducer");
8
+ const responsePayload_1 = require("../../../../../responsePayload");
9
+ const remiSetupApproverViewReducer_1 = require("../remiSetupApproverViewReducer");
10
+ const reorderRemiApprovalRulesEpic = (actions$, _state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(remiSetupApproverViewReducer_1.reorderRemiApprovalRules.match), (0, operators_1.switchMap)((action) => {
11
+ const { approvalRuleIds, useV3 } = action.payload;
12
+ const endpoint = `${zeniAPI.apiEndPoints.approvalMicroServiceBaseUrl}/1.0/reimbursements/approval-rules-v2/reorder`;
13
+ return zeniAPI
14
+ .putAndGetJSON(endpoint, {
15
+ rule_ids: approvalRuleIds,
16
+ })
17
+ .pipe((0, operators_1.mergeMap)((response) => {
18
+ if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
19
+ const serverOrderedIds = response.data.approval_rules.map((approvalRule) => approvalRule.approval_rule_id);
20
+ const actions = [
21
+ (0, approvalRuleReducer_1.updateApprovalRules)(response.data.approval_rules),
22
+ (0, remiSetupApproverViewReducer_1.reorderRemiApprovalRulesSuccess)(serverOrderedIds),
23
+ (0, snackbarReducer_1.openSnackbar)({
24
+ messageSection: `reimbursement_approval_reorder`,
25
+ messageText: 'success',
26
+ type: 'success',
27
+ }),
28
+ ];
29
+ return (0, rxjs_1.from)(actions);
30
+ }
31
+ else {
32
+ return (0, rxjs_1.from)([
33
+ (0, remiSetupApproverViewReducer_1.reorderRemiApprovalRulesFailure)(response.status),
34
+ (0, snackbarReducer_1.openSnackbar)({
35
+ messageSection: `reimbursement_approval_reorder`,
36
+ messageText: 'failed',
37
+ type: 'error',
38
+ }),
39
+ (0, remiSetupApproverViewReducer_1.fetchRemiSetupApproverView)(true, true, useV3),
40
+ ]);
41
+ }
42
+ }), (0, operators_1.catchError)((error) => (0, rxjs_1.from)([
43
+ (0, remiSetupApproverViewReducer_1.reorderRemiApprovalRulesFailure)((0, responsePayload_1.createZeniAPIStatus)('Unexpected Error', 'Reorder Reimbursement Approval Rules errored out' +
44
+ JSON.stringify(error))),
45
+ (0, snackbarReducer_1.openSnackbar)({
46
+ messageSection: `reimbursement_approval_reorder`,
47
+ messageText: 'failed',
48
+ type: 'error',
49
+ }),
50
+ (0, remiSetupApproverViewReducer_1.fetchRemiSetupApproverView)(true, true, useV3),
51
+ ])));
52
+ }));
53
+ exports.reorderRemiApprovalRulesEpic = reorderRemiApprovalRulesEpic;
@@ -9,14 +9,23 @@ const userReducer_1 = require("../../../../../entity/user/userReducer");
9
9
  const responsePayload_1 = require("../../../../../responsePayload");
10
10
  const commonPayload_1 = require("../../../billPay/billPaySetupApproverView/types/commonPayload");
11
11
  const remiSetupApproverViewReducer_1 = require("../remiSetupApproverViewReducer");
12
- const saveRemiSetupApproverViewUpdatesEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(remiSetupApproverViewReducer_1.saveRemiSetupApproverViewUpdates.match), (0, operators_1.switchMap)(() => {
12
+ const saveRemiSetupApproverViewUpdatesEpic = (actions$, state$, zeniAPI) => actions$.pipe((0, operators_1.filter)(remiSetupApproverViewReducer_1.saveRemiSetupApproverViewUpdates.match), (0, operators_1.switchMap)((action) => {
13
13
  const { remiSetupApproverViewState } = state$.value;
14
14
  const remiSetupApproverViewUpdateData = remiSetupApproverViewState.remiSetupApproverViewUpdateData;
15
15
  if (remiSetupApproverViewUpdateData != null &&
16
16
  remiSetupApproverViewUpdateData.data != null) {
17
- const payload = (0, commonPayload_1.toApprovalChangableInfoPayload)(remiSetupApproverViewUpdateData.data);
17
+ // Approval Rules 3.0 — gate URL + write-side payload mapper on
18
+ // the `approval_rule_v3_config` dynamic config. `useV3` arrives
19
+ // on the action payload from the screen connector.
20
+ const { useV3 } = action.payload;
21
+ const payload = useV3
22
+ ? (0, commonPayload_1.toApprovalChangableInfoPayload)(remiSetupApproverViewUpdateData.data)
23
+ : (0, commonPayload_1.toApprovalChangableInfoPayloadV1)(remiSetupApproverViewUpdateData.data);
24
+ const endpoint = useV3
25
+ ? `${zeniAPI.apiEndPoints.approvalMicroServiceBaseUrl}/1.0/reimbursements/approval-rules-v2`
26
+ : `${zeniAPI.apiEndPoints.approvalMicroServiceBaseUrl}/1.0/reimbursements/approval-rules`;
18
27
  return zeniAPI
19
- .postAndGetJSON(`${zeniAPI.apiEndPoints.approvalMicroServiceBaseUrl}/1.0/reimbursements/approval-rules`, payload)
28
+ .postAndGetJSON(endpoint, payload)
20
29
  .pipe((0, operators_1.mergeMap)((response) => {
21
30
  if ((0, responsePayload_1.isSuccessResponse)(response) && response.data != null) {
22
31
  const approvalRuleIds = response.data.approval_rules.map((approvalRule) => approvalRule.approval_rule_id);
@@ -2,10 +2,11 @@ import { ZeniAPIStatus } from '../../../../responsePayload';
2
2
  import { ApprovalRuleCreateData, ApprovalRuleUpdateData } from '../../billPay/billPaySetupApproverView/types/commonState';
3
3
  import { RemiSetupApproverViewState } from './remiSetupApproverViewState';
4
4
  export declare const initialState: RemiSetupApproverViewState;
5
- export declare const fetchRemiSetupApproverView: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[cacheOverride?: any, resolveAttributeToUser?: any, includeImplicitActors?: any], {
5
+ export declare const fetchRemiSetupApproverView: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[cacheOverride?: any, resolveAttributeToUser?: any, includeImplicitActors?: any, useV3?: any], {
6
6
  cacheOverride: any;
7
7
  resolveAttributeToUser: any;
8
8
  includeImplicitActors: any;
9
+ useV3: any;
9
10
  }, "remiSetupApproverView/fetchRemiSetupApproverView", never, never>, fetchRemiSetupApproverViewSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[approvalRuleIds: string[]], {
10
11
  approvalRuleIds: string[];
11
12
  }, "remiSetupApproverView/fetchRemiSetupApproverViewSuccess", never, never>, fetchRemiSetupApproverViewFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[status: ZeniAPIStatus<Record<string, unknown>>], ZeniAPIStatus<Record<string, unknown>>, "remiSetupApproverView/fetchRemiSetupApproverViewFailure", never, never>, fetchRemiApproversDetails: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[cacheOverride?: any, includeUserRoles?: any, includeAttributesUserIds?: any, lastUpdatedByUserId?: any], {
@@ -24,15 +25,25 @@ export declare const fetchRemiSetupApproverView: import("@reduxjs/toolkit").Acti
24
25
  attributeSubTypeToUserIdMapping: Record<"manager" | "vendor_owner" | "manager_of_manager", string> | undefined;
25
26
  }, "remiSetupApproverView/fetchRemiApproversListSuccess", never, never>, fetchRemiApproversListFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[status: ZeniAPIStatus<Record<string, unknown>>], {
26
27
  status: ZeniAPIStatus<Record<string, unknown>>;
27
- }, "remiSetupApproverView/fetchRemiApproversListFailure", never, never>, deleteRemiApprovalRule: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[approvalRuleId: string], {
28
+ }, "remiSetupApproverView/fetchRemiApproversListFailure", never, never>, deleteRemiApprovalRule: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[approvalRuleId: string, useV3?: any], {
28
29
  approvalRuleId: string;
30
+ useV3: any;
29
31
  }, "remiSetupApproverView/deleteRemiApprovalRule", never, never>, deleteRemiApprovalRuleSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[deletedApprovalRuleId: string, approvalRuleIds: string[]], {
30
32
  deletedApprovalRuleId: string;
31
33
  approvalRuleIds: string[];
32
34
  }, "remiSetupApproverView/deleteRemiApprovalRuleSuccess", never, never>, deleteRemiApprovalRuleFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[approvalRuleId: string, status: ZeniAPIStatus<Record<string, unknown>>], {
33
35
  approvalRuleId: string;
34
36
  status: ZeniAPIStatus<Record<string, unknown>>;
35
- }, "remiSetupApproverView/deleteRemiApprovalRuleFailure", never, never>, saveRemiSetupApproverViewUpdates: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"remiSetupApproverView/saveRemiSetupApproverViewUpdates">, saveRemiSetupApproverViewUpdatesSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[approvalRuleIds: string[], affectedEntityIds?: string[] | undefined, newApprovalRuleId?: string | undefined], {
37
+ }, "remiSetupApproverView/deleteRemiApprovalRuleFailure", never, never>, reorderRemiApprovalRules: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[approvalRuleIds: string[], useV3?: any], {
38
+ approvalRuleIds: string[];
39
+ useV3: any;
40
+ }, "remiSetupApproverView/reorderRemiApprovalRules", never, never>, reorderRemiApprovalRulesSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[approvalRuleIds: string[]], {
41
+ approvalRuleIds: string[];
42
+ }, "remiSetupApproverView/reorderRemiApprovalRulesSuccess", never, never>, reorderRemiApprovalRulesFailure: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[status: ZeniAPIStatus<Record<string, unknown>>], {
43
+ status: ZeniAPIStatus<Record<string, unknown>>;
44
+ }, "remiSetupApproverView/reorderRemiApprovalRulesFailure", never, never>, saveRemiSetupApproverViewUpdates: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[useV3: boolean], {
45
+ useV3: boolean;
46
+ }, "remiSetupApproverView/saveRemiSetupApproverViewUpdates", never, never>, saveRemiSetupApproverViewUpdatesSuccess: import("@reduxjs/toolkit").ActionCreatorWithPreparedPayload<[approvalRuleIds: string[], affectedEntityIds?: string[] | undefined, newApprovalRuleId?: string | undefined], {
36
47
  approvalRuleIds: string[];
37
48
  affectedEntityIds: string[] | undefined;
38
49
  newApprovalRuleId: string | undefined;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.clearRemiSetupApproverView = exports.clearRemiSetupApproverViewUpdateData = exports.setListeningToPusherEvent = exports.saveRemiSetupApproverViewUpdateData = exports.initializeRemiSetupApproverViewUpdateData = exports.saveRemiSetupApproverViewUpdatesFailure = exports.saveRemiSetupApproverViewUpdatesSuccess = exports.saveRemiSetupApproverViewUpdates = exports.deleteRemiApprovalRuleFailure = exports.deleteRemiApprovalRuleSuccess = exports.deleteRemiApprovalRule = exports.fetchRemiApproversListFailure = exports.fetchRemiApproversListSuccess = exports.fetchRemiApproversList = exports.fetchRemiApproversDetails = exports.fetchRemiSetupApproverViewFailure = exports.fetchRemiSetupApproverViewSuccess = exports.fetchRemiSetupApproverView = exports.initialState = void 0;
4
+ exports.clearRemiSetupApproverView = exports.clearRemiSetupApproverViewUpdateData = exports.setListeningToPusherEvent = exports.saveRemiSetupApproverViewUpdateData = exports.initializeRemiSetupApproverViewUpdateData = exports.saveRemiSetupApproverViewUpdatesFailure = exports.saveRemiSetupApproverViewUpdatesSuccess = exports.saveRemiSetupApproverViewUpdates = exports.reorderRemiApprovalRulesFailure = exports.reorderRemiApprovalRulesSuccess = exports.reorderRemiApprovalRules = exports.deleteRemiApprovalRuleFailure = exports.deleteRemiApprovalRuleSuccess = exports.deleteRemiApprovalRule = exports.fetchRemiApproversListFailure = exports.fetchRemiApproversListSuccess = exports.fetchRemiApproversList = exports.fetchRemiApproversDetails = exports.fetchRemiSetupApproverViewFailure = exports.fetchRemiSetupApproverViewSuccess = exports.fetchRemiSetupApproverView = exports.initialState = void 0;
5
5
  const toolkit_1 = require("@reduxjs/toolkit");
6
6
  exports.initialState = {
7
7
  fetchState: 'Not-Started',
@@ -17,6 +17,7 @@ exports.initialState = {
17
17
  newApprovalRuleId: undefined,
18
18
  approvalRulesDeleteStatusById: {},
19
19
  remiSetupApproverViewUpdateData: undefined,
20
+ reorderStatus: { fetchState: 'Not-Started', error: undefined },
20
21
  hasValidState() {
21
22
  return this.fetchState === 'Completed';
22
23
  },
@@ -30,12 +31,16 @@ const remiSetupApproverView = (0, toolkit_1.createSlice)({
30
31
  draft.fetchState = 'In-Progress';
31
32
  draft.error = undefined;
32
33
  },
33
- prepare(cacheOverride = false, resolveAttributeToUser = false, includeImplicitActors = false) {
34
+ // Approval Rules 3.0 `useV3` arrives from the screen connector
35
+ // (`approval_rule_v3_config` dynamic config) and picks v1 vs v2
36
+ // endpoint in the fetch epic.
37
+ prepare(cacheOverride = false, resolveAttributeToUser = false, includeImplicitActors = false, useV3 = false) {
34
38
  return {
35
39
  payload: {
36
40
  cacheOverride,
37
41
  resolveAttributeToUser,
38
42
  includeImplicitActors,
43
+ useV3,
39
44
  },
40
45
  };
41
46
  },
@@ -138,8 +143,11 @@ const remiSetupApproverView = (0, toolkit_1.createSlice)({
138
143
  error: undefined,
139
144
  };
140
145
  },
141
- prepare(approvalRuleId) {
142
- return { payload: { approvalRuleId } };
146
+ // Approval Rules 3.0 — `useV3` flows from the screen connector
147
+ // (`approval_rule_v3_config` dynamic config) so the delete epic
148
+ // can pick the v1 vs v2 endpoint.
149
+ prepare(approvalRuleId, useV3 = false) {
150
+ return { payload: { approvalRuleId, useV3 } };
143
151
  },
144
152
  },
145
153
  deleteRemiApprovalRuleSuccess: {
@@ -171,13 +179,65 @@ const remiSetupApproverView = (0, toolkit_1.createSlice)({
171
179
  };
172
180
  },
173
181
  },
174
- saveRemiSetupApproverViewUpdates(draft) {
175
- if (draft.remiSetupApproverViewUpdateData != null) {
176
- draft.remiSetupApproverViewUpdateData.updateStatus = {
177
- fetchState: 'In-Progress',
178
- error: undefined,
179
- };
180
- }
182
+ /**
183
+ * Approval Rules 3.0 list-page drag-and-drop reorder.
184
+ * See BillPay equivalent for the longer rationale.
185
+ */
186
+ reorderRemiApprovalRules: {
187
+ reducer(draft, action) {
188
+ const { approvalRuleIds } = action.payload;
189
+ draft.reorderStatus = { fetchState: 'In-Progress', error: undefined };
190
+ // Stash the pre-reorder order for synchronous rollback on
191
+ // 'Failure'. See the BillPay reducer for the rationale.
192
+ draft.reorderRollbackIds = draft.approvalRuleIds;
193
+ draft.approvalRuleIds = approvalRuleIds;
194
+ },
195
+ prepare(approvalRuleIds, useV3 = false) {
196
+ return { payload: { approvalRuleIds, useV3 } };
197
+ },
198
+ },
199
+ reorderRemiApprovalRulesSuccess: {
200
+ reducer(draft, action) {
201
+ const { approvalRuleIds } = action.payload;
202
+ draft.reorderStatus = { fetchState: 'Completed', error: undefined };
203
+ draft.approvalRuleIds = approvalRuleIds;
204
+ draft.reorderRollbackIds = undefined;
205
+ },
206
+ prepare(approvalRuleIds) {
207
+ return { payload: { approvalRuleIds } };
208
+ },
209
+ },
210
+ reorderRemiApprovalRulesFailure: {
211
+ reducer(draft, action) {
212
+ const { status } = action.payload;
213
+ draft.reorderStatus = { fetchState: 'Error', error: status };
214
+ if (draft.reorderRollbackIds != null) {
215
+ draft.approvalRuleIds = draft.reorderRollbackIds;
216
+ draft.reorderRollbackIds = undefined;
217
+ }
218
+ },
219
+ prepare(status) {
220
+ return { payload: { status } };
221
+ },
222
+ },
223
+ saveRemiSetupApproverViewUpdates: {
224
+ // Approval Rules 3.0 — `useV3` sourced from
225
+ // `approval_rule_v3_config` dynamic config in the screen
226
+ // connector; epic uses it to pick v1 vs v2 URL + mapper. The
227
+ // reducer doesn't read the action but the parameter must be
228
+ // declared so the action payload type carries downstream.
229
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
230
+ reducer(draft, _action) {
231
+ if (draft.remiSetupApproverViewUpdateData != null) {
232
+ draft.remiSetupApproverViewUpdateData.updateStatus = {
233
+ fetchState: 'In-Progress',
234
+ error: undefined,
235
+ };
236
+ }
237
+ },
238
+ prepare(useV3) {
239
+ return { payload: { useV3 } };
240
+ },
181
241
  },
182
242
  saveRemiSetupApproverViewUpdatesSuccess: {
183
243
  reducer(draft, action) {
@@ -266,5 +326,5 @@ const remiSetupApproverView = (0, toolkit_1.createSlice)({
266
326
  },
267
327
  },
268
328
  });
269
- _a = remiSetupApproverView.actions, exports.fetchRemiSetupApproverView = _a.fetchRemiSetupApproverView, exports.fetchRemiSetupApproverViewSuccess = _a.fetchRemiSetupApproverViewSuccess, exports.fetchRemiSetupApproverViewFailure = _a.fetchRemiSetupApproverViewFailure, exports.fetchRemiApproversDetails = _a.fetchRemiApproversDetails, exports.fetchRemiApproversList = _a.fetchRemiApproversList, exports.fetchRemiApproversListSuccess = _a.fetchRemiApproversListSuccess, exports.fetchRemiApproversListFailure = _a.fetchRemiApproversListFailure, exports.deleteRemiApprovalRule = _a.deleteRemiApprovalRule, exports.deleteRemiApprovalRuleSuccess = _a.deleteRemiApprovalRuleSuccess, exports.deleteRemiApprovalRuleFailure = _a.deleteRemiApprovalRuleFailure, exports.saveRemiSetupApproverViewUpdates = _a.saveRemiSetupApproverViewUpdates, exports.saveRemiSetupApproverViewUpdatesSuccess = _a.saveRemiSetupApproverViewUpdatesSuccess, exports.saveRemiSetupApproverViewUpdatesFailure = _a.saveRemiSetupApproverViewUpdatesFailure, exports.initializeRemiSetupApproverViewUpdateData = _a.initializeRemiSetupApproverViewUpdateData, exports.saveRemiSetupApproverViewUpdateData = _a.saveRemiSetupApproverViewUpdateData, exports.setListeningToPusherEvent = _a.setListeningToPusherEvent, exports.clearRemiSetupApproverViewUpdateData = _a.clearRemiSetupApproverViewUpdateData, exports.clearRemiSetupApproverView = _a.clearRemiSetupApproverView;
329
+ _a = remiSetupApproverView.actions, exports.fetchRemiSetupApproverView = _a.fetchRemiSetupApproverView, exports.fetchRemiSetupApproverViewSuccess = _a.fetchRemiSetupApproverViewSuccess, exports.fetchRemiSetupApproverViewFailure = _a.fetchRemiSetupApproverViewFailure, exports.fetchRemiApproversDetails = _a.fetchRemiApproversDetails, exports.fetchRemiApproversList = _a.fetchRemiApproversList, exports.fetchRemiApproversListSuccess = _a.fetchRemiApproversListSuccess, exports.fetchRemiApproversListFailure = _a.fetchRemiApproversListFailure, exports.deleteRemiApprovalRule = _a.deleteRemiApprovalRule, exports.deleteRemiApprovalRuleSuccess = _a.deleteRemiApprovalRuleSuccess, exports.deleteRemiApprovalRuleFailure = _a.deleteRemiApprovalRuleFailure, exports.reorderRemiApprovalRules = _a.reorderRemiApprovalRules, exports.reorderRemiApprovalRulesSuccess = _a.reorderRemiApprovalRulesSuccess, exports.reorderRemiApprovalRulesFailure = _a.reorderRemiApprovalRulesFailure, exports.saveRemiSetupApproverViewUpdates = _a.saveRemiSetupApproverViewUpdates, exports.saveRemiSetupApproverViewUpdatesSuccess = _a.saveRemiSetupApproverViewUpdatesSuccess, exports.saveRemiSetupApproverViewUpdatesFailure = _a.saveRemiSetupApproverViewUpdatesFailure, exports.initializeRemiSetupApproverViewUpdateData = _a.initializeRemiSetupApproverViewUpdateData, exports.saveRemiSetupApproverViewUpdateData = _a.saveRemiSetupApproverViewUpdateData, exports.setListeningToPusherEvent = _a.setListeningToPusherEvent, exports.clearRemiSetupApproverViewUpdateData = _a.clearRemiSetupApproverViewUpdateData, exports.clearRemiSetupApproverView = _a.clearRemiSetupApproverView;
270
330
  exports.default = remiSetupApproverView.reducer;
@@ -10,8 +10,20 @@ export interface RemiSetupApproverViewState extends FetchedState {
10
10
  fetchStatus: FetchStateAndError;
11
11
  attributeSubTypeToUserIdMapping?: Record<AttributeType, ID>;
12
12
  };
13
+ /**
14
+ * List-page reorder PUT status. See BillPay equivalent for the
15
+ * longer rationale.
16
+ */
17
+ reorderStatus: FetchStateAndError;
13
18
  affectedEntityIds?: ID[];
14
19
  listeningToPusherEvent?: boolean;
15
20
  newApprovalRuleId?: ID;
16
21
  remiSetupApproverViewUpdateData?: ApproverViewUpdateData;
22
+ /**
23
+ * Pre-reorder snapshot of 'approvalRuleIds'. Stashed on the trigger
24
+ * reducer right before the optimistic mutation and consumed on
25
+ * Failure to restore the previous order without waiting for the
26
+ * epic's safety-net refetch. Cleared on Success.
27
+ */
28
+ reorderRollbackIds?: ID[];
17
29
  }
@@ -50,15 +50,15 @@ export interface TaskFilterCategory {
50
50
  }
51
51
  export type TaskListFilterCategoryField = 'status' | 'dueDate' | 'assignee' | 'creationDate' | 'priority' | 'tag';
52
52
  export declare const TASK_LIST_GROUP_BY_KEYS: readonly ["groupName", "status", "dueDate", "assignee", "priority", "tag"];
53
- export declare const toTaskListGroupByKeyType: (v: string) => "status" | "dueDate" | "groupName" | "tag" | "priority" | "assignee";
54
- export declare const toTaskListGroupByKeyTypeStrict: (v: string) => "status" | "dueDate" | "groupName" | "tag" | "priority" | "assignee" | undefined;
53
+ export declare const toTaskListGroupByKeyType: (v: string) => "status" | "priority" | "dueDate" | "groupName" | "tag" | "assignee";
54
+ export declare const toTaskListGroupByKeyTypeStrict: (v: string) => "status" | "priority" | "dueDate" | "groupName" | "tag" | "assignee" | undefined;
55
55
  export declare type TaskGroupKey = ReturnType<typeof toTaskListGroupByKeyType>;
56
56
  export interface TaskListUIState extends SpendManagementUIState {
57
57
  groupByKey: TaskGroupKey;
58
58
  searchText: string;
59
59
  sortKey: TaskListViewSortKey;
60
60
  }
61
- declare const toTaskListSortKeyType: (v: string) => "status" | "name" | "dueDate" | "tag" | "priority" | "timeSpent" | "assignee" | "creationDate" | "visibility";
61
+ declare const toTaskListSortKeyType: (v: string) => "status" | "name" | "priority" | "dueDate" | "tag" | "timeSpent" | "assignee" | "creationDate" | "visibility";
62
62
  export declare type TaskListViewSortKey = ReturnType<typeof toTaskListSortKeyType>;
63
63
  export declare const TASK_LIST_FILTER_CATEGORIES: TaskListFilterCategoryOption[];
64
64
  interface TaskListFilterCategoryOption {
@@ -8,7 +8,7 @@ import { JournalEntryTransactionLine, Line, TransactionLineBase } from '../../en
8
8
  * is testable and reusable.
9
9
  */
10
10
  export declare const JOURNAL_ENTRY_SORT_KEYS: readonly ["description", "name", "category", "class", "debit", "credit"];
11
- export declare const toJournalEntrySortKey: (v: string) => "name" | "description" | "category" | "class" | "credit" | "debit";
11
+ export declare const toJournalEntrySortKey: (v: string) => "description" | "name" | "category" | "class" | "credit" | "debit";
12
12
  export type JournalEntrySortKey = ReturnType<typeof toJournalEntrySortKey>;
13
13
  export interface JournalEntryRowSortConfig {
14
14
  sortKey: JournalEntrySortKey;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zeniai/client-epic-state",
3
- "version": "5.0.89",
3
+ "version": "5.0.90-betaAR1",
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",