@zeniai/web-components 4.1.40 → 4.1.41-betaAK1

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 (52) hide show
  1. package/dist/{SessionTimeoutPopup-CkH-hPbZ.cjs → SessionTimeoutPopup-D6HvNkd5.cjs} +15303 -14329
  2. package/dist/{SessionTimeoutPopup-CnaGjerj.js → SessionTimeoutPopup-DYgosay6.js} +79438 -76095
  3. package/dist/appLocale.d.ts +198 -0
  4. package/dist/assets/illustrative/no-search-result.svg +24 -0
  5. package/dist/cockpit.cjs.js +2 -2
  6. package/dist/cockpit.esm.js +255 -251
  7. package/dist/components/cockpit/common/cockpitFilters/commonTypes.d.ts +1 -1
  8. package/dist/components/common/StyledCapsule.d.ts +1 -1
  9. package/dist/components/{cockpit/common/cockpitFilters/components → common/filters}/FiltersPopover.d.ts +1 -1
  10. package/dist/components/common/filters/GenericFilters.d.ts +75 -0
  11. package/dist/components/common/filters/components/GenericFiltersSelection.d.ts +58 -0
  12. package/dist/components/common/filters/genericFilterTypes.d.ts +62 -0
  13. package/dist/components/common/listPageSearchInputBox/ListPageSearchInputBox.d.ts +3 -1
  14. package/dist/components/common/listPageSearchSection/ListPageSearchSection.d.ts +13 -0
  15. package/dist/components/expenseAutomation/ExpenseAutomationPage.d.ts +19 -1
  16. package/dist/components/expenseAutomation/components/EmptyTableSection.d.ts +6 -0
  17. package/dist/components/expenseAutomation/components/ExpenseAutomationSubTabSwitcher.d.ts +17 -0
  18. package/dist/components/expenseAutomation/components/NavBarWithHeader.d.ts +21 -1
  19. package/dist/components/expenseAutomation/components/TableSection.d.ts +2 -1
  20. package/dist/components/expenseAutomation/components/filters/AmountFilterValueField.d.ts +8 -0
  21. package/dist/components/expenseAutomation/components/filters/AmountMatchingOperatorDropdown.d.ts +8 -0
  22. package/dist/components/expenseAutomation/components/filters/TransactionFiltersComponent.d.ts +17 -0
  23. package/dist/components/expenseAutomation/components/filters/amountFilterConstants.d.ts +19 -0
  24. package/dist/components/expenseAutomation/components/filters/transactionFiltersHelpers.d.ts +24 -0
  25. package/dist/components/expenseAutomation/components/navbarHeaderData.d.ts +2 -2
  26. package/dist/components/expenseAutomation/sections/missingReceipts/MissingReceiptsPage.d.ts +6 -0
  27. package/dist/components/expenseAutomation/sections/transactionCategorization/transactionCategorizationCompletedSubTabs.d.ts +7 -0
  28. package/dist/components/formElements/filterValuesDropdownField/FilterValuesDropdownField.d.ts +5 -14
  29. package/dist/components/spendManagement/autoTransferRules/AutoTransferRulePage.d.ts +7 -1
  30. package/dist/components/spendManagement/cashManagement/AutoSweepFlow.d.ts +50 -0
  31. package/dist/components/spendManagement/cashManagement/AutoSweepReviewPage.d.ts +43 -0
  32. package/dist/components/spendManagement/cashManagement/AutoSweepSetupPage.d.ts +117 -0
  33. package/dist/components/spendManagement/cashManagement/CashManagementBanner.d.ts +20 -0
  34. package/dist/components/spendManagement/cashManagement/CashManagementNavCTA.d.ts +14 -0
  35. package/dist/components/spendManagement/cashManagement/CashOverview.d.ts +53 -0
  36. package/dist/components/spendManagement/cashManagement/OutflowSection.d.ts +8 -0
  37. package/dist/components/spendManagement/cashManagement/SweepAmountCard.d.ts +11 -0
  38. package/dist/components/spendManagement/cashManagement/SweepFlowRow.d.ts +29 -0
  39. package/dist/components/spendManagement/common/filters/spendManagementFiltersHelpers.d.ts +1 -1
  40. package/dist/components/spendManagement/treasury/TreasuryNavBarPieces.d.ts +2 -1
  41. package/dist/components/spendManagement/treasury/TreasuryOverviewPage.d.ts +8 -0
  42. package/dist/components/spendManagement/zeniAccounts/ZeniAccountHelper.d.ts +10 -1
  43. package/dist/components/spendManagement/zeniAccounts/ZeniAccountListViewPage.d.ts +9 -1
  44. package/dist/components/spendManagement/zeniAccounts/ZeniAccountNavBarPieces.d.ts +2 -1
  45. package/dist/components/transactionDetail/items/TransactionLineWithAccountAndClass.d.ts +3 -2
  46. package/dist/context/featureProvider/FeatureGateNameConstants.d.ts +4 -0
  47. package/dist/index.cjs.js +1 -1
  48. package/dist/index.d.ts +10 -0
  49. package/dist/index.esm.js +283 -279
  50. package/dist/strings/strings.d.ts +198 -0
  51. package/package.json +11 -8
  52. package/dist/components/common/skeletons/StatementListSkeleton.d.ts +0 -5
@@ -0,0 +1,75 @@
1
+ import { MatchingOperatorDropdownOption, SpendManagementFilterEntityType, TransactionFilterEntityType, UserRoleType } from '@zeniai/client-epic-state';
2
+ import { AutoCompleteActions, AutoCompleteData } from '../../common/autoComplete/autoCompleteProps';
3
+ import { GenericFilterCategory, GenericFilterCategoryDropdownOption, GenericFiltersType, ValuesDropdownOption } from './genericFilterTypes';
4
+ export type SupportedFilterEntityType = TransactionFilterEntityType | SpendManagementFilterEntityType;
5
+ export interface GroupByFiltersComponentProps {
6
+ component: React.ReactElement;
7
+ height: number;
8
+ }
9
+ export interface GenericFiltersProps<TEntity extends SupportedFilterEntityType, TField extends string, TCategoryDropdownOption extends GenericFilterCategoryDropdownOption<TField>, TFiltersType extends GenericFiltersType<TField>> {
10
+ entity: TEntity;
11
+ filters: TFiltersType;
12
+ filterStrings: {
13
+ addFilterBtnText: string;
14
+ categoryPlaceholder: string;
15
+ clearAllBtnText: string;
16
+ empty: string;
17
+ filterByLabel: string;
18
+ searchPlaceholder: string;
19
+ select: string;
20
+ /** Optional: return custom placeholder for the value dropdown by category field */
21
+ getValuePlaceholder?: (categoryField: string, categoryLabel: string) => string | undefined;
22
+ };
23
+ helpers: {
24
+ getAppliedFiltersCount: (filters: TFiltersType) => number;
25
+ getDefaultEmptyFilters: () => TFiltersType;
26
+ getFilterCategories: (entity: TEntity, userRole?: UserRoleType[]) => TCategoryDropdownOption[];
27
+ getFilterCategoryLabel: (entity: TEntity, key: string) => string;
28
+ getUpdatedFiltersOnCategoryChange: (props: {
29
+ currentFilters: TFiltersType;
30
+ selectedOption: TCategoryDropdownOption;
31
+ categoryIndex?: number;
32
+ }) => TFiltersType;
33
+ getUpdatedFiltersOnMatchingOperatorChange: (props: {
34
+ currentFilters: TFiltersType;
35
+ selectedOption: MatchingOperatorDropdownOption;
36
+ categoryIndex?: number;
37
+ }) => TFiltersType;
38
+ getUpdatedFiltersOnValueChange: (props: {
39
+ categoryIndex: number;
40
+ currentFilters: TFiltersType;
41
+ selectedOptions: ValuesDropdownOption[];
42
+ }) => TFiltersType;
43
+ };
44
+ /**
45
+ * Memoized dropdown options keyed by category field. The cache inside
46
+ * GenericFilters mirrors this value, so when source data lands after
47
+ * first render the dropdowns refresh automatically. Callers MUST
48
+ * memoize this (e.g. with `useMemo`) — passing a new object reference
49
+ * on every parent render will churn the internal cache state.
50
+ */
51
+ categoryWiseOptions?: Record<string, ValuesDropdownOption[]>;
52
+ createdByUserListLoaded?: boolean;
53
+ disableFilters?: boolean;
54
+ groupByFiltersComponent?: GroupByFiltersComponentProps;
55
+ transactionsLoaded?: boolean;
56
+ vendorSearchAutoCompleteActions?: AutoCompleteActions;
57
+ vendorSearchAutoCompleteData?: AutoCompleteData;
58
+ onFiltersChange: (filters: TFiltersType) => void;
59
+ onFilterClick?: (entity: TEntity) => void;
60
+ /** When provided and returns non-null for a field, renders custom operator + value UI (e.g. transaction amount filter with From/To inputs). */
61
+ renderCustomCategoryValueSection?: (field: string, props: {
62
+ categoryIndex: number;
63
+ filter: GenericFilterCategory<TField>;
64
+ onMatchingOperatorChange: (option: {
65
+ label: string;
66
+ value: string;
67
+ }, categoryIndex?: number) => void;
68
+ onValueChange: (value: ValuesDropdownOption[], categoryIndex: number) => void;
69
+ }) => {
70
+ operatorDropdown: React.ReactNode;
71
+ valueField: React.ReactNode;
72
+ } | null;
73
+ }
74
+ declare function GenericFilters<TEntity extends SupportedFilterEntityType, TField extends string, TCategoryDropdownOption extends GenericFilterCategoryDropdownOption<TField>, TFiltersType extends GenericFiltersType<TField>>({ entity: selectedEntity, filters, filterStrings, helpers, onFiltersChange, createdByUserListLoaded, disableFilters, groupByFiltersComponent, transactionsLoaded, vendorSearchAutoCompleteActions, vendorSearchAutoCompleteData, categoryWiseOptions, onFilterClick, renderCustomCategoryValueSection, }: GenericFiltersProps<TEntity, TField, TCategoryDropdownOption, TFiltersType>): import("react/jsx-runtime").JSX.Element;
75
+ export default GenericFilters;
@@ -0,0 +1,58 @@
1
+ import { MatchingOperatorDropdownOption, UserRoleType } from '@zeniai/client-epic-state';
2
+ import { AutoCompleteActions, AutoCompleteData } from '../../../common/autoComplete/autoCompleteProps';
3
+ import { SupportedFilterEntityType } from '../GenericFilters';
4
+ import { GenericFilterCategory, GenericFilterCategoryDropdownOption, GenericFiltersType, ValuesDropdownOption } from '../genericFilterTypes';
5
+ export interface GenericFiltersSelectionProps<TEntity extends SupportedFilterEntityType, TField extends string, TCategoryDropdownOption extends GenericFilterCategoryDropdownOption<TField>, TFiltersType extends GenericFiltersType<TField>> {
6
+ filters: TFiltersType;
7
+ filterStrings: {
8
+ addFilterBtnText: string;
9
+ categoryPlaceholder: string;
10
+ clearAllBtnText: string;
11
+ filterByLabel: string;
12
+ searchPlaceholder: string;
13
+ select: string;
14
+ getValuePlaceholder?: (categoryField: string, categoryLabel: string) => string | undefined;
15
+ };
16
+ filterValues: Record<string, ValuesDropdownOption[]>;
17
+ helpers: {
18
+ getAppliedFiltersCount: (filters: TFiltersType) => number;
19
+ getDefaultEmptyFilters: () => TFiltersType;
20
+ getFilterCategories: (entity: TEntity, userRole?: UserRoleType[]) => TCategoryDropdownOption[];
21
+ getFilterCategoryLabel: (entity: TEntity, key: string) => string;
22
+ getUpdatedFiltersOnCategoryChange: (props: {
23
+ currentFilters: TFiltersType;
24
+ selectedOption: TCategoryDropdownOption;
25
+ categoryIndex?: number;
26
+ }) => TFiltersType;
27
+ getUpdatedFiltersOnMatchingOperatorChange: (props: {
28
+ currentFilters: TFiltersType;
29
+ selectedOption: MatchingOperatorDropdownOption;
30
+ categoryIndex?: number;
31
+ }) => TFiltersType;
32
+ getUpdatedFiltersOnValueChange: (props: {
33
+ categoryIndex: number;
34
+ currentFilters: TFiltersType;
35
+ selectedOptions: ValuesDropdownOption[];
36
+ }) => TFiltersType;
37
+ };
38
+ selectedEntity: TEntity;
39
+ vendorSearchAutoCompleteActions?: AutoCompleteActions;
40
+ vendorSearchAutoCompleteData?: AutoCompleteData;
41
+ onFiltersChange: (filters: TFiltersType) => void;
42
+ renderCustomCategoryValueSection?: (field: string, props: {
43
+ categoryIndex: number;
44
+ filter: GenericFilterCategory<TField>;
45
+ onMatchingOperatorChange: (option: {
46
+ label: string;
47
+ value: string;
48
+ }, categoryIndex?: number) => void;
49
+ onValueChange: (value: ValuesDropdownOption[], categoryIndex: number) => void;
50
+ }) => {
51
+ operatorDropdown: React.ReactNode;
52
+ valueField: React.ReactNode;
53
+ } | null;
54
+ }
55
+ declare const _default: <TEntity extends SupportedFilterEntityType, TField extends string, TCategoryDropdownOption extends GenericFilterCategoryDropdownOption<TField>, TFiltersType extends GenericFiltersType<TField>>(props: GenericFiltersSelectionProps<TEntity, TField, TCategoryDropdownOption, TFiltersType> & {
56
+ ref?: React.ForwardedRef<HTMLDivElement>;
57
+ }) => React.ReactElement;
58
+ export default _default;
@@ -0,0 +1,62 @@
1
+ import { CategoryCombinationOperator, ZeniDate, ZeniUrl } from '@zeniai/client-epic-state';
2
+ type DropdownOptionTypeBase = {
3
+ [key: string]: any;
4
+ };
5
+ export type ValuesDropdownOption = DropdownOptionTypeBase & {
6
+ label: string;
7
+ value: string | number | ZeniDate;
8
+ email?: string;
9
+ iconColor?: string;
10
+ iconType?: string;
11
+ photo?: ZeniUrl;
12
+ };
13
+ /**
14
+ * How a category's selected values combine when matching:
15
+ * - `"ANY"` — match a row if any value in `values[]` matches (OR semantics).
16
+ * - `"ALL"` — match a row only if every value in `values[]` matches (AND).
17
+ *
18
+ * Exposed as a named type so callsites that store or narrow this field
19
+ * (e.g. TC's `TransactionFilterCategory`, which pins it to literal `"ANY"`)
20
+ * reference one source of truth rather than redeclaring the union.
21
+ */
22
+ export type ValuesCombinationOperator = "ANY" | "ALL";
23
+ export type GenericFilterCategory<TField extends string = string> = {
24
+ values: Array<string | number | ZeniDate>;
25
+ field?: TField;
26
+ matchingOperator?: string;
27
+ valuesCombinationOperator?: ValuesCombinationOperator;
28
+ };
29
+ export type GenericFiltersType<TField extends string = string> = {
30
+ categories: GenericFilterCategory<TField>[];
31
+ categoryCombinationOperator: CategoryCombinationOperator;
32
+ };
33
+ /**
34
+ * Type shape for `NEW_CATEGORY_BODY` below. Carries three deliberate
35
+ * narrowing choices:
36
+ *
37
+ * - `valuesCombinationOperator: "ANY"` — the literal type, not the wider
38
+ * `ValuesCombinationOperator` union, because TC's
39
+ * `TransactionFilterCategory` narrows the field further to exactly
40
+ * `"ANY"`. Without the literal here, the `...NEW_CATEGORY_BODY` spread
41
+ * would produce `string` and fail the downstream assignment.
42
+ * - `values: never[]` — narrowest possible array type, so the spread is
43
+ * assignable to any concrete `values` (e.g. TC's `(string | number)[]`,
44
+ * SM's `Array<string | number | ZeniDate>`).
45
+ * - `matchingOperator: string` — widely usable placeholder; every caller
46
+ * overrides this field after the spread.
47
+ *
48
+ * Using an explicit type annotation rather than `as const` keeps the
49
+ * narrowing without scattering `as const` through callsites.
50
+ */
51
+ type NewCategoryBody = {
52
+ matchingOperator: string;
53
+ values: never[];
54
+ valuesCombinationOperator: "ANY";
55
+ };
56
+ export declare const NEW_CATEGORY_BODY: NewCategoryBody;
57
+ export type GenericFilterCategoryDropdownOption<TField extends string = string> = {
58
+ value: TField;
59
+ multiple?: boolean;
60
+ type?: string;
61
+ };
62
+ export {};
@@ -1,5 +1,6 @@
1
1
  export interface Props {
2
2
  disabled?: boolean;
3
+ enableSearchHotkey?: boolean;
3
4
  inputWrapperStyle?: React.CSSProperties;
4
5
  keepSearchBoxOpen?: boolean;
5
6
  placeholder?: string;
@@ -8,9 +9,10 @@ export interface Props {
8
9
  searchIconMarginRight?: string;
9
10
  searchText?: string;
10
11
  style?: React.CSSProperties;
12
+ styledSearchCancelIconWrapperStyle?: React.CSSProperties;
11
13
  styledSearchIconContainerStyle?: React.CSSProperties;
12
14
  styledSearchIconWrapperStyle?: React.CSSProperties;
13
15
  onSearchOpen?: (isOpen: boolean) => void;
14
16
  onSearchTextChanged?: (text: string) => void;
15
17
  }
16
- export declare function ListPageSearchInputBox({ disabled, inputWrapperStyle, keepSearchBoxOpen, placeholder, searchBarDataTestId, searchIconMarginRight, searchText, style, styledSearchIconContainerStyle, styledSearchIconWrapperStyle, onSearchOpen, onSearchTextChanged, }: Readonly<Props>): import("react/jsx-runtime").JSX.Element;
18
+ export declare function ListPageSearchInputBox({ enableSearchHotkey, disabled, inputWrapperStyle, keepSearchBoxOpen, placeholder, searchBarDataTestId, searchIconMarginRight, searchText, style, styledSearchCancelIconWrapperStyle, styledSearchIconContainerStyle, styledSearchIconWrapperStyle, onSearchOpen, onSearchTextChanged, }: Readonly<Props>): import("react/jsx-runtime").JSX.Element;
@@ -2,13 +2,26 @@ export interface ListPageSearchSectionProps {
2
2
  isSearchOpen: boolean;
3
3
  searchPlaceHolder: string;
4
4
  searchText: string;
5
+ /** Tab-within-feature scope — see `selectedEntity` above. */
6
+ currentTab?: string;
5
7
  downloadPresent?: boolean;
8
+ enableSearchHotkey?: boolean;
6
9
  hideSearchBtn?: boolean;
7
10
  inputWrapperStyle?: React.CSSProperties;
8
11
  /** When set, applied to each search bar container (icon + input). */
9
12
  searchBarDataTestId?: string;
10
13
  searchIconMarginRight?: string;
11
14
  searchTextBoxStyle?: React.CSSProperties;
15
+ /**
16
+ * Optional page/feature scope — paired with `currentTab` to derive a
17
+ * specific `data-testid` on the outer container (e.g.
18
+ * `search-transaction_categorization-review`). Both must be supplied for
19
+ * the attribute to render; either missing falls back to no `data-testid`
20
+ * so consumers without this context (vendor pages, aging reports, etc.)
21
+ * stay un-tagged and continue to rely on their own scoping mechanisms.
22
+ */
23
+ selectedEntity?: string;
24
+ styledSearchCancelIconWrapperStyle?: React.CSSProperties;
12
25
  styledSearchIconContainerStyle?: React.CSSProperties;
13
26
  styledSearchIconWrapperStyle?: React.CSSProperties;
14
27
  onSearchTextChanged?: (searchText: string) => void;
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { AccountBase, AuthParams, BulkUploadResultsTab, BulkUploadSelectorData, BulkUploadSortKey, COTTransactionTrackingByTransactionId, ClassBase, CompletedSubTab, CustomerBase, Entity, ExpenseAutomationJESchedulesViewUIState, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationReconciliationViewTab, ExpenseAutomationStepDetails, ExpenseAutomationTransactionsTab, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationViewSelector, ExpenseAutomationViewType, FetchState, FluxAnalysisActionType, FluxAnalysisSectionType, FluxAnalysisViewUIState, ID, JEScheduleTransactionKey, LoggedInUser, MissingReceiptsTab, MonthYearPeriod, PageToken, PlaidLinkTokenType, RecommendationWithCOT, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReviewTabLocalData, SaveExpenseAutomationReconciliationActionType, ScheduleTypes, SortOrder, SupportedTransactionPayload, SupportedTransactionWithCOT, TransactionEntityType, TransactionID, TransactionType, Vendor, VendorBase, ZeniAPIStatus } from '@zeniai/client-epic-state';
2
+ import { AccountBase, AccountFilterOption, AuthParams, BulkUploadResultsTab, BulkUploadSelectorData, BulkUploadSortKey, COTTransactionTrackingByTransactionId, ClassBase, ClassFilterOption, CompletedSubTab, CustomerBase, Entity, ExpenseAutomationJESchedulesViewUIState, ExpenseAutomationMissingReceiptsViewUIState, ExpenseAutomationReconciliationViewTab, ExpenseAutomationStepDetails, ExpenseAutomationTransactionsTab, ExpenseAutomationTransactionsViewUIState, ExpenseAutomationViewSelector, ExpenseAutomationViewType, FetchState, FluxAnalysisActionType, FluxAnalysisSectionType, FluxAnalysisViewUIState, ID, JEScheduleTransactionKey, LoggedInUser, MissingReceiptsTab, MonthYearPeriod, PageToken, PlaidLinkTokenType, RecommendationWithCOT, ReconReconcileSortKey, ReconReviewSortKey, ReconciliationReviewTabLocalData, SaveExpenseAutomationReconciliationActionType, ScheduleTypes, SortOrder, SupportedTransactionPayload, SupportedTransactionWithCOT, TransactionEntityType, TransactionFilters, TransactionID, TransactionType, Vendor, VendorBase, ZeniAPIStatus } from '@zeniai/client-epic-state';
3
3
  import { AutoCompleteActions, AutoCompleteData } from '../common/autoComplete/autoCompleteProps';
4
4
  import { ReportTreeScrollPosition } from '../reportTree/ReportTree';
5
5
  import { ExpenseAutomationThreadClickTarget } from './components/ExpenseAutomationCommentingShell';
@@ -22,6 +22,8 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
22
22
  receiptUploadEndpoint: string;
23
23
  vendorSearchAutoCompleteActions: AutoCompleteActions;
24
24
  vendorSearchAutoCompleteData: AutoCompleteData;
25
+ /** Accounts from getAllAccounts(accountState) for Payment Account Name/Type filter dropdowns */
26
+ accountsForFilters?: AccountFilterOption[];
25
27
  /**
26
28
  * Transaction categorization only: inline activity next to the TC list
27
29
  * (e.g. `TransactionActivityLogPanel`).
@@ -34,6 +36,19 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
34
36
  activityLogTransactionId?: ID;
35
37
  bulkUploadEndpoint?: string;
36
38
  bulkUploadSelector?: BulkUploadSelectorData;
39
+ /** Options for the Category filter dropdown (converted to { label: accountName, value: accountId }) */
40
+ categoryOptions?: Array<{
41
+ accountId?: string;
42
+ accountName?: string;
43
+ }>;
44
+ /**
45
+ * Class options for the Class filter dropdown. Uses the narrow
46
+ * `ClassFilterOption` ({classId, className}) — only the identity and the
47
+ * display label are needed here. Passing the full `ClassBase` would be a
48
+ * loose contract that lets consumers accidentally rely on fields that the
49
+ * upstream selector strips out.
50
+ */
51
+ classesForFilters?: ClassFilterOption[];
37
52
  /** Initial receipts sub-tab (e.g. Storybook: show Unmatched without clicking tabs). */
38
53
  initialMissingReceiptsTab?: MissingReceiptsTab;
39
54
  isAiCfoAccessEnabled?: boolean;
@@ -72,6 +87,7 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
72
87
  }, isBulkFetch: boolean, selectedTab: ExpenseAutomationTransactionsTab, entity?: Entity, updatedCustomer?: CustomerBase) => void;
73
88
  onFetchReimbursementView: (selectedPeriod: MonthYearPeriod, pageToken: PageToken, keepExistingListItems: boolean) => void;
74
89
  onFetchTransactionCategorizationList: (selectedTab: ExpenseAutomationTransactionsTab, searchString?: string, keepExistingListItems?: boolean, pageToken?: PageToken, refreshInBackground?: boolean, resetListItems?: boolean) => void;
90
+ onFiltersChange: (filters: TransactionFilters) => void;
75
91
  onIncludeAccountIntoReconciliation: (accountId: ID) => void;
76
92
  onJeAccountSettingsChange: (formData: JEScheduleAccountSettingsFormData) => void;
77
93
  onJESchedulesFormDataChange: (scheduleJournalEntryID: ID, localData: JEScheduleResolveComponentFormData) => void;
@@ -101,6 +117,7 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
101
117
  onUpdateSelectedCheckboxTransactionIds: (selectedTab: ExpenseAutomationTransactionsTab, transactionIds: ID[]) => void;
102
118
  onUpdateStep: (step: ExpenseAutomationViewType) => void;
103
119
  onUpdateTab: (tab: ExpenseAutomationTransactionsTab) => void;
120
+ onUpdateTransactionCategorizationCompletedSubTab: (subTab: CompletedSubTab) => void;
104
121
  onUpdateTransactionCategorizationUIState: (selectedTab: ExpenseAutomationTransactionsTab, uiState: Partial<ExpenseAutomationTransactionsViewUIState>) => void;
105
122
  onUploadReceiptAttachment: (transaction: SupportedTransactionPayload) => void;
106
123
  onUploadReceiptComplete: (transactionPayload: SupportedTransactionPayload, selectedPeriod: MonthYearPeriod) => void;
@@ -138,6 +155,7 @@ export interface ExpenseAutomationPageProps extends MonthEndReportPageProps {
138
155
  /** Sync Redux `uploadedFileCount` when using direct HTTP bulk upload (no `onBulkUploadFiles`). */
139
156
  onBulkUploadUploadedFileCount?: (count: number) => void;
140
157
  onClearBulkUpload?: () => void;
158
+ onClearBulkUploadBatchDetailsForScopeChange?: () => void;
141
159
  /** Clears one-shot Redux flag after switching Missing Receipts sub-tab (e.g. Unmatched on batch complete). */
142
160
  onClearMissingReceiptsTabNavigation?: () => void;
143
161
  onConfirmBulkUploadMatch?: (batchId: ID, attachmentId: ID, transactionId: ID, transactionType: string, fileName: string) => void;
@@ -6,6 +6,12 @@ interface EmptyTableSectionProps {
6
6
  subTitle: string;
7
7
  tab: ExpenseAutomationViewType;
8
8
  title: string;
9
+ /**
10
+ * When true, render the "no search results" illustration instead of the
11
+ * tab-specific all-done illustration. Used by the Transaction Categorization
12
+ * list when an active search/filter yields no matches.
13
+ */
14
+ useNoSearchResultIcon?: boolean;
9
15
  }
10
16
  export default function EmptyTableSection(props: EmptyTableSectionProps): import("react/jsx-runtime").JSX.Element;
11
17
  export {};
@@ -0,0 +1,17 @@
1
+ import { CSSProperties } from 'react';
2
+ import { TabSwitcherOption } from '../../common/allNavBars/statusSwitcher/switcherTypes';
3
+ export interface ExpenseAutomationSubTabSwitcherProps<TId extends string = string> {
4
+ activeSubTab: TId;
5
+ allTabs: TabSwitcherOption[];
6
+ containerStyle?: CSSProperties;
7
+ onSubTabChange: (id: TId) => void;
8
+ }
9
+ /**
10
+ * Generic sub-tab strip for any tab inside the Expense Automation surface.
11
+ *
12
+ * Wraps the shared {@link SubTabSwitcher} with the standard column chrome and
13
+ * padding used across Expense Automation so visual parity is automatic. The
14
+ * `id` type is generic so callers can plug in any union (e.g. `CompletedSubTab`)
15
+ * without casting at the call site.
16
+ */
17
+ export declare function ExpenseAutomationSubTabSwitcher<TId extends string = string>({ activeSubTab, allTabs, onSubTabChange, containerStyle, }: ExpenseAutomationSubTabSwitcherProps<TId>): import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,8 @@
1
1
  import { ReactNode } from 'react';
2
- import { CompletionStatusType, ExpenseAutomationReconciliationViewTab, ExpenseAutomationTransactionsTab, ExpenseAutomationViewType, FetchState, ID, MissingReceiptsTab } from '@zeniai/client-epic-state';
2
+ import { CompletionStatusType, ExpenseAutomationReconciliationViewTab, ExpenseAutomationTransactionsTab, ExpenseAutomationViewType, FetchState, ID, MissingReceiptsTab, TransactionFilterEntityType, TransactionFilters } from '@zeniai/client-epic-state';
3
3
  import { TabSwitcherOption } from '../../common/allNavBars/statusSwitcher/switcherTypes';
4
+ import { AutoCompleteActions, AutoCompleteData } from '../../common/autoComplete/autoCompleteProps';
5
+ import { ValuesDropdownOption } from '../../common/filters/genericFilterTypes';
4
6
  import { JEScheduleMainTab } from '../sections/jeSchedules/jeScheduleConfig';
5
7
  import { ExpenseAutomationNavbarHeaderData } from './navbarHeaderData';
6
8
  interface NavBarWithHeaderProps {
@@ -12,15 +14,30 @@ interface NavBarWithHeaderProps {
12
14
  isZeniUser: boolean;
13
15
  refreshStatus: FetchState;
14
16
  searchText: string;
17
+ selectedEntity: TransactionFilterEntityType;
15
18
  /** Renders below the tab strip (e.g. Missing Receipts bulk upload email + policy). */
16
19
  belowTabsSlot?: ReactNode;
17
20
  completionPercentage?: number;
18
21
  /** Raw progress (0–100) for color bands; falls back to `completionPercentage` when omitted. */
19
22
  completionProgressRaw?: number;
23
+ createdByUserListLoaded?: boolean;
20
24
  currentJeTab?: JEScheduleMainTab;
21
25
  currentMissingReceiptsTab?: MissingReceiptsTab;
22
26
  currentRecontab?: ExpenseAutomationReconciliationViewTab;
23
27
  currentTab?: ExpenseAutomationTransactionsTab;
28
+ filterComponent?: React.ComponentType<{
29
+ entity: TransactionFilterEntityType;
30
+ filters: TransactionFilters;
31
+ /** Memoized dropdown options keyed by category field. Update this when source data populates so dropdowns refresh. */
32
+ categoryWiseOptions?: Record<string, ValuesDropdownOption[]>;
33
+ createdByUserListLoaded?: boolean;
34
+ vendorSearchAutoCompleteActions?: AutoCompleteActions;
35
+ vendorSearchAutoCompleteData?: AutoCompleteData;
36
+ onFiltersChange: (filters: TransactionFilters) => void;
37
+ }>;
38
+ /** Memoized dropdown options keyed by category field. Update this when source data populates so dropdowns refresh. */
39
+ filterOptions?: Record<string, ValuesDropdownOption[]>;
40
+ filters?: TransactionFilters;
24
41
  hideTabSwitcher?: boolean;
25
42
  isAiCfoAccessEnabled?: boolean;
26
43
  isCompletionLoading?: boolean;
@@ -29,6 +46,8 @@ interface NavBarWithHeaderProps {
29
46
  selectedGenericTab?: ID;
30
47
  selectedReconAccountId?: ID;
31
48
  titleStyle?: React.CSSProperties;
49
+ vendorSearchAutoCompleteActions?: AutoCompleteActions;
50
+ vendorSearchAutoCompleteData?: AutoCompleteData;
32
51
  getTabCountAndFetchState: (currentTab: ExpenseAutomationTransactionsTab | ExpenseAutomationReconciliationViewTab | MissingReceiptsTab | JEScheduleMainTab) => {
33
52
  count: number;
34
53
  isFetching: boolean;
@@ -43,6 +62,7 @@ interface NavBarWithHeaderProps {
43
62
  onUpdateTab: (tab: ExpenseAutomationTransactionsTab) => void;
44
63
  onAskAiCfoClick?: () => void;
45
64
  onCommentDrawerClick?: () => void;
65
+ onFiltersChange?: (filters: TransactionFilters) => void;
46
66
  onGenericTabChange?: (tab: TabSwitcherOption) => void;
47
67
  onJeTabUpdate?: (tab: JEScheduleMainTab) => void;
48
68
  onMissingReceiptsTabUpdate?: (tab: MissingReceiptsTab) => void;
@@ -1,5 +1,5 @@
1
1
  import { ReactNode } from 'react';
2
- import { AttachmentFilePayload, AuthParams, ExpenseAutomationViewSelector, ID, LoggedInUser, SaveExpenseAutomationReconciliationActionType } from '@zeniai/client-epic-state';
2
+ import { AttachmentFilePayload, AuthParams, ExpenseAutomationViewSelector, ID, LoggedInUser, SaveExpenseAutomationReconciliationActionType, TransactionFilters } from '@zeniai/client-epic-state';
3
3
  import { AutoCompleteActions, AutoCompleteData } from '../../common/autoComplete/autoCompleteProps';
4
4
  import { FooterFormIdType } from '../common';
5
5
  import { AccountReconciliationParentPageActionProps } from '../sections/accountRecon/AccountReconciliationPage';
@@ -32,6 +32,7 @@ export interface MonthEndReportPageProps {
32
32
  interface TableSectionProps extends MissingReceiptsListTableActionProps, TransactionCategorizationActionProps, JESchedulePageProps, FluxAnalysisTableProps, AccountReconciliationParentPageActionProps, MonthEndReportPageProps {
33
33
  authParams: AuthParams;
34
34
  expenseAutomationViewSelector: ExpenseAutomationViewSelector;
35
+ filters: TransactionFilters;
35
36
  isAccountingClassesEnabled: boolean;
36
37
  isCOTEnabled: boolean;
37
38
  isProjectsTransactionsEnabled: boolean;
@@ -0,0 +1,8 @@
1
+ import { ValuesDropdownOption } from '../../../common/filters/genericFilterTypes';
2
+ export interface AmountFilterValueFieldProps {
3
+ matchingOperator: string;
4
+ value: (string | number)[];
5
+ onChange: (options: ValuesDropdownOption[]) => void;
6
+ }
7
+ declare const AmountFilterValueField: ({ matchingOperator, value, onChange, }: AmountFilterValueFieldProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default AmountFilterValueField;
@@ -0,0 +1,8 @@
1
+ import { AmountMatchingOperatorOption } from './amountFilterConstants';
2
+ interface AmountMatchingOperatorDropdownProps {
3
+ categoryIndex?: number;
4
+ value?: string;
5
+ onChange: (option: AmountMatchingOperatorOption, categoryIndex?: number) => void;
6
+ }
7
+ declare const AmountMatchingOperatorDropdown: ({ onChange, value, categoryIndex, }: AmountMatchingOperatorDropdownProps) => import("react/jsx-runtime").JSX.Element;
8
+ export default AmountMatchingOperatorDropdown;
@@ -0,0 +1,17 @@
1
+ import { TransactionFilterEntityType, TransactionFilters } from '@zeniai/client-epic-state';
2
+ import { AutoCompleteActions, AutoCompleteData } from '../../../common/autoComplete/autoCompleteProps';
3
+ import { ValuesDropdownOption } from '../../../common/filters/genericFilterTypes';
4
+ export interface TransactionFiltersProps {
5
+ entity: TransactionFilterEntityType;
6
+ filters: TransactionFilters;
7
+ /** Memoized dropdown options keyed by category field. Update this when the source data populates so the dropdowns refresh. */
8
+ categoryWiseOptions?: Record<string, ValuesDropdownOption[]>;
9
+ createdByUserListLoaded?: boolean;
10
+ disableFilters?: boolean;
11
+ transactionsLoaded?: boolean;
12
+ vendorSearchAutoCompleteActions?: AutoCompleteActions;
13
+ vendorSearchAutoCompleteData?: AutoCompleteData;
14
+ onFiltersChange: (filters: TransactionFilters) => void;
15
+ }
16
+ declare const TransactionFiltersComponent: ({ entity, filters, vendorSearchAutoCompleteData, vendorSearchAutoCompleteActions, disableFilters, transactionsLoaded, createdByUserListLoaded, onFiltersChange, categoryWiseOptions, }: TransactionFiltersProps) => import("react/jsx-runtime").JSX.Element;
17
+ export default TransactionFiltersComponent;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Amount filter: operator types and dropdown options for the
3
+ * transaction-categorization Amount filter. Used only by the TC filter UI;
4
+ * not consumed outside this folder.
5
+ */
6
+ type AmountMatchingOperatorValue = "less_than" | "greater_than" | "equal" | "in_between";
7
+ export interface AmountMatchingOperatorOption {
8
+ label: string;
9
+ value: AmountMatchingOperatorValue;
10
+ }
11
+ export declare const getAmountMatchingOperatorOptions: (labels: {
12
+ greaterThan: string;
13
+ inBetween: string;
14
+ isEqual: string;
15
+ lessThan: string;
16
+ }) => AmountMatchingOperatorOption[];
17
+ export declare const isAmountMatchingOperator: (value: string) => value is AmountMatchingOperatorValue;
18
+ export declare const DEFAULT_AMOUNT_MATCHING_OPERATOR: AmountMatchingOperatorValue;
19
+ export {};
@@ -0,0 +1,24 @@
1
+ import { MatchingOperatorDropdownOption, TransactionFilterCategoryDropdownOption, TransactionFilters } from '@zeniai/client-epic-state';
2
+ import { ValuesDropdownOption } from '../../../common/filters/genericFilterTypes';
3
+ export declare const getTransactionFilterCategories: () => TransactionFilterCategoryDropdownOption[];
4
+ export declare const getTransactionFilterCategoryLabel: (key: string) => string;
5
+ export declare const getUpdatedTransactionFiltersOnCategoryChange: ({ currentFilters, selectedOption, categoryIndex, }: {
6
+ currentFilters: TransactionFilters;
7
+ selectedOption: TransactionFilterCategoryDropdownOption;
8
+ categoryIndex?: number;
9
+ }) => TransactionFilters;
10
+ export declare const getUpdatedTransactionFiltersOnMatchingOperatorChange: ({ currentFilters, selectedOption, categoryIndex, }: {
11
+ currentFilters: TransactionFilters;
12
+ selectedOption: MatchingOperatorDropdownOption | {
13
+ label: string;
14
+ value: string;
15
+ };
16
+ categoryIndex?: number;
17
+ }) => TransactionFilters;
18
+ export declare const getUpdatedTransactionFiltersOnValueChange: ({ categoryIndex, currentFilters, selectedOptions, }: {
19
+ categoryIndex: number;
20
+ currentFilters: TransactionFilters;
21
+ selectedOptions: ValuesDropdownOption[];
22
+ }) => TransactionFilters;
23
+ export declare const getTransactionAppliedFiltersCount: (filters: TransactionFilters) => number;
24
+ export declare const hasActiveSearchOrFilters: (searchString: string, filters: TransactionFilters) => boolean;
@@ -1,6 +1,6 @@
1
1
  import { ExpenseAutomationReconciliationViewTab, ExpenseAutomationTransactionsTab, ExpenseAutomationViewType, ID, MissingReceiptsTab } from '@zeniai/client-epic-state';
2
2
  import { JEScheduleMainTab } from '../sections/jeSchedules/jeScheduleConfig';
3
- declare const toRightOptionType: (v: string) => "search" | "close" | "comment" | "refresh" | "commentDrawer" | "askAiCfo";
3
+ declare const toRightOptionType: (v: string) => "search" | "close" | "filter" | "comment" | "refresh" | "commentDrawer" | "askAiCfo";
4
4
  type RightSection = ReturnType<typeof toRightOptionType>;
5
5
  declare const toLeftOptionType: (v: string) => "back";
6
6
  type LeftSection = ReturnType<typeof toLeftOptionType>;
@@ -35,7 +35,7 @@ export interface ExpenseAutomationNavbarHeaderData {
35
35
  title: string;
36
36
  subText?: string;
37
37
  }
38
- export declare const getNavBarHeaderData: (expenseAutomationViewType: ExpenseAutomationViewType, autoCategorizedTransactionNumber?: number, accountId?: ID, customTitle?: string, navBarSubText?: string,
38
+ export declare const getNavBarHeaderData: (expenseAutomationViewType: ExpenseAutomationViewType, autoCategorizedTransactionNumber?: number, accountId?: ID, customTitle?: string, navBarSubText?: string, currentTab?: ExpenseAutomationTransactionsTab, isSearchAndFilterEnabled?: boolean,
39
39
  /** When `{ includeBulkUploadTabs: false }` (bulk upload / feature off), no sub-tabs — original subtitle only. */
40
40
  missingReceiptsOptions?: {
41
41
  includeBulkUploadTabs?: boolean;
@@ -42,6 +42,12 @@ export interface MissingReceiptsPageProps {
42
42
  setMissingReceiptsTab: (tab: MissingReceiptsTab) => void;
43
43
  onBulkUploadFiles?: (files: File[]) => void;
44
44
  onBulkUploadSuccess?: (batchId: string) => void;
45
+ /**
46
+ * Wipes the bulk-upload details cache and `initialBatchDetailsLoaded` flag on tenant/period
47
+ * change. Distinct from a stale-while-revalidate refresh — the new scope's data is genuinely
48
+ * unknown, so the Unmatched skeleton is the correct UX.
49
+ */
50
+ onClearBulkUploadBatchDetailsForScopeChange?: () => void;
45
51
  onDeleteUnmatchedReceipt?: (attachmentId: ID) => void;
46
52
  onFetchBulkUploadBatches?: (input?: {
47
53
  cacheOverride?: boolean;
@@ -0,0 +1,7 @@
1
+ import { TabSwitcherOption } from '../../../common/allNavBars/statusSwitcher/switcherTypes';
2
+ /**
3
+ * Sub-tabs rendered under the Transaction Categorization "Completed" tab.
4
+ * The `id` values match the `CompletedSubTab` union exposed by client-epic-state
5
+ * and are forwarded verbatim to the listing API as `sub_tab`.
6
+ */
7
+ export declare const TRANSACTION_CATEGORIZATION_COMPLETED_SUB_TABS: TabSwitcherOption[];
@@ -1,23 +1,14 @@
1
1
  import { default as React } from 'react';
2
- import { EntityAutoCompleteView, FilterCategoryType, ZeniDate, ZeniUrl } from '@zeniai/client-epic-state';
2
+ import { EntityAutoCompleteView, FilterCategoryType, ZeniDate } from '@zeniai/client-epic-state';
3
3
  import { AutoCompleteActions, AutoCompleteData } from '../../common/autoComplete/autoCompleteProps';
4
- interface DropdownOptionTypeBase {
5
- [key: string]: any;
6
- }
7
- export interface ValuesDropdownOption extends DropdownOptionTypeBase {
8
- label: string;
9
- value: string | ZeniDate;
10
- email?: string;
11
- iconColor?: string;
12
- iconType?: string;
13
- photo?: ZeniUrl;
14
- }
4
+ import { ValuesCombinationOperator, ValuesDropdownOption } from '../../common/filters/genericFilterTypes';
5
+ export type { ValuesDropdownOption };
15
6
  export interface FilterValuesDropdownFieldProps {
16
7
  filterCategoryType: FilterCategoryType;
17
8
  options: ValuesDropdownOption[];
18
9
  placeHolder: string;
19
- value: (string | ZeniDate)[];
20
- valuesCombinationOperator: string;
10
+ value: (string | number | ZeniDate)[];
11
+ valuesCombinationOperator: ValuesCombinationOperator;
21
12
  searchAutoCompleteActions?: AutoCompleteActions;
22
13
  searchAutoCompleteData?: AutoCompleteData;
23
14
  onChange: (value: ValuesDropdownOption[]) => void;
@@ -17,6 +17,12 @@ export interface AutoTransferRulePageProps {
17
17
  depositAccountListView?: DepositAccountListSelectorView;
18
18
  downloadAccountDetailEndPoint?: string;
19
19
  editingRuleId?: string | null;
20
+ /**
21
+ * When `true`, suppresses the page-level NavBar. Use when embedding this
22
+ * page inside another page (e.g. as a sub-tab of cash management) that
23
+ * already owns the chrome.
24
+ */
25
+ hideNavBar?: boolean;
20
26
  isEditDrawerOpen?: boolean;
21
27
  scrollToAddRule?: boolean;
22
28
  zeniAccountsConfigDetail?: ZeniAccountsConfigSelectorView;
@@ -33,7 +39,7 @@ export interface AutoTransferRulePageProps {
33
39
  onUpdateRuleLocalData: (localData: AutoTransferRuleLocalData, ruleId?: string) => void;
34
40
  onEditClick?: (ruleId: string) => void;
35
41
  }
36
- declare const AutoTransferRulePage: ({ autoTransferRuleView, hasAdminLevelAccess, companyName, analytics, authParams, currentTenant, depositAccountListView, downloadAccountDetailEndPoint, transferLimit, zeniAccountsConfigDetail, onBackClick, onDeleteClick, onPauseClick, onResumeClick, onActivityClick, onUpdateRule, onCreateRule, onReviewClick, includeTreasuryOption, isEditDrawerOpen, editingRuleId, onUpdateRuleLocalData, onEditClick, clearRuleLocalData, onEditDrawerClose, scrollToAddRule, }: AutoTransferRulePageProps) => import("react/jsx-runtime").JSX.Element;
42
+ declare const AutoTransferRulePage: ({ autoTransferRuleView, hasAdminLevelAccess, companyName, analytics, authParams, currentTenant, depositAccountListView, downloadAccountDetailEndPoint, transferLimit, zeniAccountsConfigDetail, onBackClick, onDeleteClick, onPauseClick, onResumeClick, onActivityClick, onUpdateRule, onCreateRule, onReviewClick, hideNavBar, includeTreasuryOption, isEditDrawerOpen, editingRuleId, onUpdateRuleLocalData, onEditClick, clearRuleLocalData, onEditDrawerClose, scrollToAddRule, }: AutoTransferRulePageProps) => import("react/jsx-runtime").JSX.Element;
37
43
  export default AutoTransferRulePage;
38
44
  export declare const getAccountLabel: (account?: FundingAccount | {
39
45
  accType: string;