From b99dab7363809fce53ad25030deac4516795030e Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 18 Dec 2025 21:52:38 -0500 Subject: [PATCH 01/27] update routes --- src/ROUTES.ts | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 30f46d4cc9b8..e1a7eae44814 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -2197,6 +2197,46 @@ const ROUTES = { backTo, ), }, + WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE: { + route: 'workspaces/:policyID/company-cards/:feed/assign-card/:cardID/assignee', + + getRoute: (params: WorkspaceCompanyCardsAssignCardParams, backTo?: string) => + // eslint-disable-next-line no-restricted-syntax -- Legacy route generation + getUrlWithBackToParam( + `workspaces/${params.policyID}/company-cards/${encodeURIComponent(params.feed)}/assign-card/${encodeURIComponent(params.cardID)}/assignee`, + backTo, + ), + }, + WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_CARD_SELECTION: { + route: 'workspaces/:policyID/company-cards/:feed/assign-card/:cardID/card-selection', + getRoute: (params: WorkspaceCompanyCardsAssignCardParams) => + `workspaces/${params.policyID}/company-cards/${encodeURIComponent(params.feed)}/assign-card/${encodeURIComponent(params.cardID)}/card-selection` as const, + }, + WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_TRANSACTION_START_DATE: { + route: 'workspaces/:policyID/company-cards/:feed/assign-card/:cardID/transaction-start-date', + getRoute: (params: WorkspaceCompanyCardsAssignCardParams) => + `workspaces/${params.policyID}/company-cards/${encodeURIComponent(params.feed)}/assign-card/${encodeURIComponent(params.cardID)}/transaction-start-date` as const, + }, + WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_CARD_NAME: { + route: 'workspaces/:policyID/company-cards/:feed/assign-card/:cardID/card-name', + getRoute: (params: WorkspaceCompanyCardsAssignCardParams) => + `workspaces/${params.policyID}/company-cards/${encodeURIComponent(params.feed)}/assign-card/${encodeURIComponent(params.cardID)}/card-name` as const, + }, + WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION: { + route: 'workspaces/:policyID/company-cards/:feed/assign-card/:cardID/confirmation', + + getRoute: (params: WorkspaceCompanyCardsAssignCardParams, backTo?: string) => + // eslint-disable-next-line no-restricted-syntax -- Legacy route generation + getUrlWithBackToParam( + `workspaces/${params.policyID}/company-cards/${encodeURIComponent(params.feed)}/assign-card/${encodeURIComponent(params.cardID)}/confirmation`, + backTo, + ), + }, + WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_INVITE_NEW_MEMBER: { + route: 'workspaces/:policyID/company-cards/:feed/assign-card/:cardID/invite-new-member', + getRoute: (params: WorkspaceCompanyCardsAssignCardParams) => + `workspaces/${params.policyID}/company-cards/${encodeURIComponent(params.feed)}/assign-card/${encodeURIComponent(params.cardID)}/invite-new-member` as const, + }, WORKSPACE_COMPANY_CARD_DETAILS: { route: 'workspaces/:policyID/company-cards/:bank/:cardID', From 53be1876b970dc279fce587543cca1c228b72ecb Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 18 Dec 2025 21:52:59 -0500 Subject: [PATCH 02/27] update screens --- src/SCREENS.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/SCREENS.ts b/src/SCREENS.ts index aa54d1717ad2..f896b07d844a 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -581,6 +581,12 @@ const SCREENS = { PROFILE: 'Workspace_Overview', COMPANY_CARDS: 'Workspace_CompanyCards', COMPANY_CARDS_ASSIGN_CARD: 'Workspace_CompanyCards_AssignCard', + COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE: 'Workspace_CompanyCards_AssignCard_Assignee', + COMPANY_CARDS_ASSIGN_CARD_CARD_SELECTION: 'Workspace_CompanyCards_AssignCard_Card_Selection', + COMPANY_CARDS_ASSIGN_CARD_TRANSACTION_START_DATE: 'Workspace_CompanyCards_AssignCard_Transaction_Start_Date', + COMPANY_CARDS_ASSIGN_CARD_CARD_NAME: 'Workspace_CompanyCards_AssignCard_Card_Name', + COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION: 'Workspace_CompanyCards_AssignCard_Confirmation', + COMPANY_CARDS_ASSIGN_CARD_INVITE_NEW_MEMBER: 'Workspace_CompanyCards_AssignCard_Invite_New_Member', COMPANY_CARDS_SELECT_FEED: 'Workspace_CompanyCards_Select_Feed', COMPANY_CARDS_BANK_CONNECTION: 'Workspace_CompanyCards_BankConnection', COMPANY_CARDS_ADD_NEW: 'Workspace_CompanyCards_New', From c5ac6099f419217d8cc3efdfdf0d2ee939ef2821 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 18 Dec 2025 21:53:30 -0500 Subject: [PATCH 03/27] update tableprops --- src/components/Table/TableBody.tsx | 40 +++++++++++++++++++++++------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/src/components/Table/TableBody.tsx b/src/components/Table/TableBody.tsx index 34de7cb99efb..da7cc8eb2278 100644 --- a/src/components/Table/TableBody.tsx +++ b/src/components/Table/TableBody.tsx @@ -46,27 +46,49 @@ type TableBodyProps = ViewProps & { function TableBody({contentContainerStyle, ...props}: TableBodyProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); - const {processedData: filteredAndSortedData, originalDataLength, activeSearchString, listProps} = useTableContext(); - const {ListEmptyComponent, contentContainerStyle: listContentContainerStyle} = listProps ?? {}; + const {processedData: filteredAndSortedData, originalDataLength, activeSearchString, activeFilters, filterConfig, listProps} = useTableContext(); + const {ListEmptyComponent, contentContainerStyle: listContentContainerStyle, ...restListProps} = listProps ?? {}; - // Show "no results found" when search returns empty but original data exists - const isEmptySearchResult = filteredAndSortedData.length === 0 && activeSearchString.trim().length > 0 && originalDataLength > 0; + // Check if filters are applied (not default values) + const hasActiveFilters = filterConfig + ? Object.keys(activeFilters).some((key) => { + const filterValue = activeFilters[key]; + const defaultValue = filterConfig?.[key]?.default; + return filterValue !== defaultValue; + }) + : false; - const EmptySearchComponent = ( + const hasSearchString = activeSearchString.trim().length > 0; + const isEmptyResult = filteredAndSortedData.length === 0 && originalDataLength > 0 && (hasSearchString || hasActiveFilters); + + // Determine the message based on what caused the empty result + const getEmptyMessage = () => { + if (hasSearchString) { + return `Nothing to show for "${activeSearchString}"...`; + } + if (hasActiveFilters) { + return 'Nothing to show...'; + } + return ''; + }; + + const message = getEmptyMessage(); + + const EmptyResultComponent = ( - {translate('common.noResultsFoundMatching', activeSearchString)} + {message} ); return ( // eslint-disable-next-line react/jsx-props-no-spreading - + data={filteredAndSortedData} - ListEmptyComponent={isEmptySearchResult ? EmptySearchComponent : ListEmptyComponent} + ListEmptyComponent={isEmptyResult ? EmptyResultComponent : ListEmptyComponent} contentContainerStyle={[filteredAndSortedData.length === 0 && styles.flex1, listContentContainerStyle, contentContainerStyle]} // eslint-disable-next-line react/jsx-props-no-spreading - {...listProps} + {...restListProps} /> ); From 725ed7faa33af22d9697553fd19acbf9eb001a56 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 18 Dec 2025 21:54:01 -0500 Subject: [PATCH 04/27] proper imports to useAssignCard --- src/hooks/useAssignCard.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hooks/useAssignCard.ts b/src/hooks/useAssignCard.ts index cd70b6231b41..af7872fbca36 100644 --- a/src/hooks/useAssignCard.ts +++ b/src/hooks/useAssignCard.ts @@ -17,7 +17,7 @@ import { import Navigation from '@libs/Navigation/Navigation'; import {getPersonalDetailByEmail} from '@libs/PersonalDetailsUtils'; import {getDomainNameForPolicy, isDeletedPolicyEmployee} from '@libs/PolicyUtils'; -import {clearAddNewCardFlow, openPolicyCompanyCardsPage, setAddNewCompanyCardStepAndData, setAssignCardStepAndData} from '@userActions/CompanyCards'; +import {clearAddNewCardFlow, clearAssignCardStepAndData, openPolicyCompanyCardsPage, setAddNewCompanyCardStepAndData, setAssignCardStepAndData} from '@userActions/CompanyCards'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; From 5d4e90c5554afa4ef1647093b286dacc7882a8aa Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 18 Dec 2025 21:55:27 -0500 Subject: [PATCH 05/27] proper switch steps with nagivation --- src/hooks/useAssignCard.ts | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/hooks/useAssignCard.ts b/src/hooks/useAssignCard.ts index af7872fbca36..0526d6fd7158 100644 --- a/src/hooks/useAssignCard.ts +++ b/src/hooks/useAssignCard.ts @@ -145,9 +145,30 @@ function useAssignCard({selectedFeed, policyID, setShouldShowOfflineModal}: UseA } clearAddNewCardFlow(); - setAssignCardStepAndData({data, currentStep}); + clearAssignCardStepAndData(); + setAssignCardStepAndData({data}); + + // Navigate directly to the appropriate screen based on the determined step Navigation.setNavigationActionToMicrotaskQueue(() => { - Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD.getRoute({policyID, feed: selectedFeed, cardID})); + const routeParams = {policyID, feed: selectedFeed, cardID: cardID ?? ''}; + + switch (currentStep) { + case CONST.COMPANY_CARD.STEP.PLAID_CONNECTION: + case CONST.COMPANY_CARD.STEP.BANK_CONNECTION: + // For expired feeds, still use the old ASSIGN_CARD route which handles these cases + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD.getRoute({policyID, feed: selectedFeed, cardID})); + break; + case CONST.COMPANY_CARD.STEP.CARD: + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_CARD_SELECTION.getRoute(routeParams)); + break; + case CONST.COMPANY_CARD.STEP.TRANSACTION_START_DATE: + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_TRANSACTION_START_DATE.getRoute(routeParams)); + break; + case CONST.COMPANY_CARD.STEP.ASSIGNEE: + default: + Navigation.navigate(ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE.getRoute(routeParams)); + break; + } }); }; From 58928c568871dd179401a4644a5f5783af93ac86 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 18 Dec 2025 21:56:02 -0500 Subject: [PATCH 06/27] new screens to modal stack navigator --- src/hooks/useAssignCard.ts | 1 - .../Navigation/AppNavigator/ModalStackNavigators/index.tsx | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/hooks/useAssignCard.ts b/src/hooks/useAssignCard.ts index 0526d6fd7158..55e4c4287654 100644 --- a/src/hooks/useAssignCard.ts +++ b/src/hooks/useAssignCard.ts @@ -148,7 +148,6 @@ function useAssignCard({selectedFeed, policyID, setShouldShowOfflineModal}: UseA clearAssignCardStepAndData(); setAssignCardStepAndData({data}); - // Navigate directly to the appropriate screen based on the determined step Navigation.setNavigationActionToMicrotaskQueue(() => { const routeParams = {policyID, feed: selectedFeed, cardID: cardID ?? ''}; diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index b21675163e59..177f0691fba3 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -757,6 +757,12 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/invoices/WorkspaceInvoicingDetailsWebsite').default, [SCREENS.WORKSPACE.INVOICES_VERIFY_ACCOUNT]: () => require('../../../../pages/workspace/invoices/WorkspaceInvoicesVerifyAccountPage').default, [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD]: () => require('../../../../pages/workspace/companyCards/assignCard/AssignCardFeedPage').default, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE]: () => require('../../../../pages/workspace/companyCards/assignCard/AssigneeStep').default, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CARD_SELECTION]: () => require('../../../../pages/workspace/companyCards/assignCard/CardSelectionStep').default, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_TRANSACTION_START_DATE]: () => require('../../../../pages/workspace/companyCards/assignCard/TransactionStartDateStep').default, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CARD_NAME]: () => require('../../../../pages/workspace/companyCards/assignCard/CardNameStep').default, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION]: () => require('../../../../pages/workspace/companyCards/assignCard/ConfirmationStep').default, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_INVITE_NEW_MEMBER]: () => require('../../../../pages/workspace/companyCards/assignCard/InviteNewMemberStep').default, [SCREENS.WORKSPACE.COMPANY_CARDS_SELECT_FEED]: () => require('../../../../pages/workspace/companyCards/WorkspaceCompanyCardFeedSelectorPage').default, [SCREENS.WORKSPACE.COMPANY_CARDS_BANK_CONNECTION]: () => require('../../../../pages/workspace/companyCards/BankConnection').default, [SCREENS.WORKSPACE.COMPANY_CARDS_ADD_NEW]: () => require('../../../../pages/workspace/companyCards/addNew/AddNewCardPage').default, From 8db8e23cc358ede0ae3943ab388b026186b85ed1 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 18 Dec 2025 21:56:45 -0500 Subject: [PATCH 07/27] screens for workspace to rhp --- .../Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts index 21a93c3a6920..8da85b46b390 100755 --- a/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/WORKSPACE_TO_RHP.ts @@ -245,6 +245,12 @@ const WORKSPACE_TO_RHP: Partial Date: Thu, 18 Dec 2025 21:57:09 -0500 Subject: [PATCH 08/27] screesn in RootNavigatorParamList --- src/libs/Navigation/linkingConfig/config.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 048c51fa020f..ebcecd73f56a 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -764,6 +764,24 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD]: { path: ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD.route, }, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE]: { + path: ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE.route, + }, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CARD_SELECTION]: { + path: ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_CARD_SELECTION.route, + }, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_TRANSACTION_START_DATE]: { + path: ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_TRANSACTION_START_DATE.route, + }, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CARD_NAME]: { + path: ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_CARD_NAME.route, + }, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION]: { + path: ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION.route, + }, + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_INVITE_NEW_MEMBER]: { + path: ROUTES.WORKSPACE_COMPANY_CARDS_ASSIGN_CARD_INVITE_NEW_MEMBER.route, + }, [SCREENS.WORKSPACE.INVITE]: { path: ROUTES.WORKSPACE_INVITE.route, }, From 07363c657bb9caa7cef3e35dfb23de8c759b71f7 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 18 Dec 2025 21:58:18 -0500 Subject: [PATCH 09/27] updating SettingsNavigatorParamList --- src/libs/Navigation/types.ts | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index aaef371260fb..15de8b64eb2d 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -1207,6 +1207,42 @@ type SettingsNavigatorParamList = { // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md backTo?: Routes; }; + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_ASSIGNEE]: { + policyID: string; + feed: CompanyCardFeed; + cardID: string; + + // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md + backTo?: Routes; + }; + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CARD_SELECTION]: { + policyID: string; + feed: CompanyCardFeed; + cardID: string; + }; + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_TRANSACTION_START_DATE]: { + policyID: string; + feed: CompanyCardFeed; + cardID: string; + }; + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CARD_NAME]: { + policyID: string; + feed: CompanyCardFeed; + cardID: string; + }; + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_CONFIRMATION]: { + policyID: string; + feed: CompanyCardFeed; + cardID: string; + + // eslint-disable-next-line no-restricted-syntax -- `backTo` usages in this file are legacy. Do not add new `backTo` params to screens. See contributingGuides/NAVIGATION.md + backTo?: Routes; + }; + [SCREENS.WORKSPACE.COMPANY_CARDS_ASSIGN_CARD_INVITE_NEW_MEMBER]: { + policyID: string; + feed: CompanyCardFeed; + cardID: string; + }; [SCREENS.WORKSPACE.COMPANY_CARDS_SETTINGS_FEED_NAME]: { policyID: string; }; From a34a88b2af9018a1bd43beb290b34992bf778fa5 Mon Sep 17 00:00:00 2001 From: Carlos Miceli Date: Thu, 18 Dec 2025 21:58:36 -0500 Subject: [PATCH 10/27] fix button color --- .../workspace/companyCards/WorkspaceCompanyCardsTableItem.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pages/workspace/companyCards/WorkspaceCompanyCardsTableItem.tsx b/src/pages/workspace/companyCards/WorkspaceCompanyCardsTableItem.tsx index 384182b87d1f..3daf4bef0a3c 100644 --- a/src/pages/workspace/companyCards/WorkspaceCompanyCardsTableItem.tsx +++ b/src/pages/workspace/companyCards/WorkspaceCompanyCardsTableItem.tsx @@ -212,6 +212,7 @@ function WorkspaceCompanyCardTableItem({ )} {!isAssigned && (