@@ -37,6 +37,7 @@ import Navigation from '@libs/Navigation/Navigation';
3737import { getConnectedIntegration } from '@libs/PolicyUtils' ;
3838import { getSecondaryExportReportActions , isMergeActionForSelectedTransactions } from '@libs/ReportSecondaryActionUtils' ;
3939import {
40+ canEditMultipleTransactions ,
4041 getIntegrationIcon ,
4142 getReportOrDraftReport ,
4243 isBusinessInvoiceRoom ,
@@ -50,7 +51,7 @@ import {navigateToSearchRHP, shouldShowDeleteOption} from '@libs/SearchUIUtils';
5051import { shouldRestrictUserBillableActions } from '@libs/SubscriptionUtils' ;
5152import { hasTransactionBeenRejected , isDeletedTransaction } from '@libs/TransactionUtils' ;
5253import variables from '@styles/variables' ;
53- import { canIOUBePaid , dismissRejectUseExplanation } from '@userActions/IOU' ;
54+ import { canIOUBePaid , dismissRejectUseExplanation , initBulkEditDraftTransaction } from '@userActions/IOU' ;
5455import CONST from '@src/CONST' ;
5556import ONYXKEYS from '@src/ONYXKEYS' ;
5657import ROUTES from '@src/ROUTES' ;
@@ -64,6 +65,7 @@ import {useMemoizedLazyExpensifyIcons} from './useLazyAsset';
6465import useLocalize from './useLocalize' ;
6566import useNetwork from './useNetwork' ;
6667import useOnyx from './useOnyx' ;
68+ import usePermissions from './usePermissions' ;
6769import usePersonalPolicy from './usePersonalPolicy' ;
6870import useSelfDMReport from './useSelfDMReport' ;
6971import useTheme from './useTheme' ;
@@ -99,6 +101,7 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
99101 const { accountID} = currentUserPersonalDetails ;
100102 const allTransactions = useAllTransactions ( ) ;
101103 const [ allReports ] = useOnyx ( ONYXKEYS . COLLECTION . REPORT ) ;
104+ const [ allReportActions ] = useOnyx ( ONYXKEYS . COLLECTION . REPORT_ACTIONS ) ;
102105 const [ allReportNameValuePairs ] = useOnyx ( ONYXKEYS . COLLECTION . REPORT_NAME_VALUE_PAIRS ) ;
103106 const selfDMReport = useSelfDMReport ( ) ;
104107 const [ lastPaymentMethods ] = useOnyx ( ONYXKEYS . NVP_LAST_PAYMENT_METHOD ) ;
@@ -111,6 +114,7 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
111114 const [ allTransactionViolations ] = useOnyx ( ONYXKEYS . COLLECTION . TRANSACTION_VIOLATIONS ) ;
112115 const personalPolicy = usePersonalPolicy ( ) ;
113116 const [ userBillingGraceEndPeriods ] = useOnyx ( ONYXKEYS . COLLECTION . SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END ) ;
117+ const { isBetaEnabled} = usePermissions ( ) ;
114118 const [ ownerBillingGraceEndPeriod ] = useOnyx ( ONYXKEYS . NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END ) ;
115119 const undeleteTransactions = useUndeleteTransactions ( ) ;
116120
@@ -672,7 +676,9 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
672676 ) ;
673677
674678 const onBulkPaySelectedRef = useRef ( onBulkPaySelected ) ;
675- onBulkPaySelectedRef . current = onBulkPaySelected ;
679+ useEffect ( ( ) => {
680+ onBulkPaySelectedRef . current = onBulkPaySelected ;
681+ } ) ;
676682 const stableOnBulkPaySelected = useCallback ( ( paymentMethod ?: PaymentMethodType , additionalData ?: BulkPaySelectionData ) => {
677683 onBulkPaySelectedRef . current ?.( paymentMethod , additionalData ) ;
678684 } , [ ] ) ;
@@ -887,6 +893,30 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
887893 return [ exportButtonOption ] ;
888894 }
889895
896+ const isExpenseReportSearch = typeExpenseReport || searchResults ?. search . type === CONST . SEARCH . DATA_TYPES . EXPENSE_REPORT ;
897+ const selectedTransactionsList = Object . values ( selectedTransactions )
898+ . map ( ( transaction ) => transaction . transaction )
899+ . filter ( ( transaction ) : transaction is Transaction => ! ! transaction ) ;
900+ const canEditMultiple =
901+ canEditMultipleTransactions ( selectedTransactionsList , allReportActions , allReports , policies , isExpenseReportSearch , searchResults ?. data ) && isBetaEnabled ( CONST . BETAS . BULK_EDIT ) ;
902+
903+ if ( canEditMultiple ) {
904+ options . push ( {
905+ icon : expensifyIcons . Pencil ,
906+ text : translate ( 'search.bulkActions.editMultiple' ) ,
907+ value : CONST . SEARCH . BULK_ACTION_TYPES . EDIT ,
908+ shouldCloseModalOnSelect : true ,
909+ onSelected : ( ) => {
910+ const selectedTransactionIDs = Object . keys ( selectedTransactions ) . filter ( ( transactionID ) => {
911+ const selectedTransaction = selectedTransactions [ transactionID ] ;
912+ return ! ! selectedTransaction ?. transaction ?. transactionID || ! ! allTransactions ?. [ `${ ONYXKEYS . COLLECTION . TRANSACTION } ${ transactionID } ` ] ;
913+ } ) ;
914+ initBulkEditDraftTransaction ( selectedTransactionIDs ) ;
915+ Navigation . navigate ( ROUTES . SEARCH_EDIT_MULTIPLE_TRANSACTIONS_RHP ) ;
916+ } ,
917+ } ) ;
918+ }
919+
890920 const areSelectedTransactionsIncludedInReports = selectedTransactionsKeys . every ( ( id ) =>
891921 selectedTransactions [ id ] . reportID ? selectedReportIDs . includes ( selectedTransactions [ id ] . reportID ) : true ,
892922 ) ;
@@ -1191,6 +1221,7 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
11911221 expensifyIcons . ArrowCollapse ,
11921222 expensifyIcons . DocumentMerge ,
11931223 expensifyIcons . ArrowSplit ,
1224+ expensifyIcons . Pencil ,
11941225 expensifyIcons . Trashcan ,
11951226 expensifyIcons . RotateLeft ,
11961227 expensifyIcons . Exclamation ,
@@ -1206,6 +1237,7 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
12061237 selectedTransactionReportIDs ,
12071238 selectedPolicyIDs ,
12081239 policies ,
1240+ allReportActions ,
12091241 integrationsExportTemplates ,
12101242 csvExportLayouts ,
12111243 allReports ,
@@ -1243,6 +1275,9 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
12431275 userBillingGraceEndPeriods ,
12441276 ownerBillingGraceEndPeriod ,
12451277 currentSearchKey ,
1278+ allTransactions ,
1279+ isBetaEnabled ,
1280+ shouldShowBusinessBankAccountOptions ,
12461281 ] ) ;
12471282
12481283 const handleOfflineModalClose = useCallback ( ( ) => {
0 commit comments