Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1474,6 +1474,8 @@ const CONST = {
SUBMITTED: 1,
APPROVED: 2,
BILLING: 3,
REIMBURSABLE: 4,
REIMBURSABLE_BILLABLE: 5,
AUTOREIMBURSED: 6,
},
STATUS_NUM: {
Expand Down Expand Up @@ -2890,6 +2892,8 @@ const CONST = {
QUANTITY_MAX_LENGTH: 12,
// This is the transactionID used when going through the create expense flow so that it mimics a real transaction (like the edit flow)
OPTIMISTIC_TRANSACTION_ID: '1',
// This is the transactionID used when bulk editing multiple expenses
OPTIMISTIC_BULK_EDIT_TRANSACTION_ID: 'optimisticBulkEditTransactionID',
// Note: These payment types are used when building IOU reportAction message values in the server and should
// not be changed.
LOCATION_PERMISSION_PROMPT_THRESHOLD_DAYS: 7,
Expand Down Expand Up @@ -3129,6 +3133,7 @@ const CONST = {
MAKE_AUDITOR: 'makeAuditor',
},
BULK_ACTION_TYPES: {
EDIT: 'edit',
DELETE: 'delete',
DISABLE: 'disable',
ENABLE: 'enable',
Expand Down
9 changes: 9 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -973,6 +973,12 @@ const ONYXKEYS = {
WORKSPACE_PER_DIEM_FORM_DRAFT: 'workspacePerDiemFormDraft',
ENABLE_GLOBAL_REIMBURSEMENTS: 'enableGlobalReimbursementsForm',
ENABLE_GLOBAL_REIMBURSEMENTS_DRAFT: 'enableGlobalReimbursementsFormDraft',
SEARCH_EDIT_MULTIPLE_DESCRIPTION_FORM: 'searchEditMultipleDescriptionForm',
SEARCH_EDIT_MULTIPLE_DESCRIPTION_FORM_DRAFT: 'searchEditMultipleDescriptionFormDraft',
SEARCH_EDIT_MULTIPLE_MERCHANT_FORM: 'searchEditMultipleMerchantForm',
SEARCH_EDIT_MULTIPLE_MERCHANT_FORM_DRAFT: 'searchEditMultipleMerchantFormDraft',
SEARCH_EDIT_MULTIPLE_DATE_FORM: 'searchEditMultipleDateForm',
SEARCH_EDIT_MULTIPLE_DATE_FORM_DRAFT: 'searchEditMultipleDateFormDraft',
CREATE_DOMAIN_FORM: 'createDomainForm',
CREATE_DOMAIN_FORM_DRAFT: 'createDomainFormDraft',
SPLIT_EXPENSE_EDIT_DATES: 'splitExpenseEditDates',
Expand Down Expand Up @@ -1091,6 +1097,9 @@ type OnyxFormValuesMapping = {
[ONYXKEYS.FORMS.INTERNATIONAL_BANK_ACCOUNT_FORM]: FormTypes.InternationalBankAccountForm;
[ONYXKEYS.FORMS.WORKSPACE_PER_DIEM_FORM]: FormTypes.WorkspacePerDiemForm;
[ONYXKEYS.FORMS.ENABLE_GLOBAL_REIMBURSEMENTS]: FormTypes.EnableGlobalReimbursementsForm;
[ONYXKEYS.FORMS.SEARCH_EDIT_MULTIPLE_DESCRIPTION_FORM]: FormTypes.SearchEditMultipleDescriptionForm;
[ONYXKEYS.FORMS.SEARCH_EDIT_MULTIPLE_MERCHANT_FORM]: FormTypes.SearchEditMultipleMerchantForm;
[ONYXKEYS.FORMS.SEARCH_EDIT_MULTIPLE_DATE_FORM]: FormTypes.SearchEditMultipleDateForm;
[ONYXKEYS.FORMS.CREATE_DOMAIN_FORM]: FormTypes.CreateDomainForm;
[ONYXKEYS.FORMS.SPLIT_EXPENSE_EDIT_DATES]: FormTypes.SplitExpenseEditDateForm;
};
Expand Down
10 changes: 10 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,16 @@ const ROUTES = {
TRANSACTION_HOLD_REASON_RHP: 'search/hold',
SEARCH_REJECT_REASON_RHP: 'search/reject',
MOVE_TRANSACTIONS_SEARCH_RHP: 'search/move-transactions',
SEARCH_EDIT_MULTIPLE_TRANSACTIONS_RHP: 'search/edit-multiple-transactions',
SEARCH_EDIT_MULTIPLE_AMOUNT_RHP: 'search/edit-multiple/amount',
SEARCH_EDIT_MULTIPLE_DESCRIPTION_RHP: 'search/edit-multiple/description',
SEARCH_EDIT_MULTIPLE_MERCHANT_RHP: 'search/edit-multiple/merchant',
SEARCH_EDIT_MULTIPLE_DATE_RHP: 'search/edit-multiple/date',
SEARCH_EDIT_MULTIPLE_CATEGORY_RHP: 'search/edit-multiple/category',
SEARCH_EDIT_MULTIPLE_TAG_RHP: 'search/edit-multiple/tag',
SEARCH_EDIT_MULTIPLE_ATTENDEES_RHP: 'search/edit-multiple/attendees',
SEARCH_EDIT_MULTIPLE_REPORT_RHP: 'search/edit-multiple/report',
SEARCH_EDIT_MULTIPLE_TAX_RHP: 'search/edit-multiple/tax',

// This is a utility route used to go to the user's concierge chat, or the sign-in page if the user's not authenticated
CONCIERGE: 'concierge',
Expand Down
8 changes: 8 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,14 @@ const SCREENS = {
TRANSACTION_HOLD_REASON_RHP: 'Search_Transaction_Hold_Reason_RHP',
SEARCH_REJECT_REASON_RHP: 'Search_Reject_Reason_RHP',
TRANSACTIONS_CHANGE_REPORT_SEARCH_RHP: 'Search_Transactions_Change_Report_RHP',
EDIT_MULTIPLE_TRANSACTIONS_RHP: 'Search_Edit_Multiple_Transactions_RHP',
EDIT_MULTIPLE_AMOUNT_RHP: 'Search_Edit_Multiple_Amount_RHP',
EDIT_MULTIPLE_DESCRIPTION_RHP: 'Search_Edit_Multiple_Description_RHP',
EDIT_MULTIPLE_MERCHANT_RHP: 'Search_Edit_Multiple_Merchant_RHP',
EDIT_MULTIPLE_DATE_RHP: 'Search_Edit_Multiple_Date_RHP',
EDIT_MULTIPLE_CATEGORY_RHP: 'Search_Edit_Multiple_Category_RHP',
EDIT_MULTIPLE_TAG_RHP: 'Search_Edit_Multiple_Tag_RHP',
EDIT_MULTIPLE_TAX_RHP: 'Search_Edit_Multiple_Tax_RHP',
},
SETTINGS: {
ROOT: 'Settings_Root',
Expand Down
35 changes: 34 additions & 1 deletion src/hooks/useSelectedTransactionsActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
canDeleteCardTransactionByLiabilityType,
canDeleteTransaction,
canEditFieldOfMoneyRequest,
canEditMultipleTransactions,
canHoldUnholdReportAction,
canRejectReportAction,
canUserPerformWriteAction as canUserPerformWriteActionReportUtils,
Expand Down Expand Up @@ -68,13 +69,28 @@
const {selectedTransactionIDs, clearSelectedTransactions, currentSearchHash, selectedTransactions: selectedTransactionsMeta} = useSearchContext();
const allTransactions = useAllTransactions();
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT, {canBeMissing: false});
const [allReportActions] = useOnyx(ONYXKEYS.COLLECTION.REPORT_ACTIONS, {canBeMissing: false});
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY, {canBeMissing: false});
const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID, {canBeMissing: true});
const [lastVisitedPath] = useOnyx(ONYXKEYS.LAST_VISITED_PATH, {canBeMissing: true});
const [integrationsExportTemplates] = useOnyx(ONYXKEYS.NVP_INTEGRATION_SERVER_EXPORT_TEMPLATES, {canBeMissing: true});
const [csvExportLayouts] = useOnyx(ONYXKEYS.NVP_CSV_EXPORT_LAYOUTS, {canBeMissing: true});
const [allTransactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS, {canBeMissing: true});

const expensifyIcons = useMemoizedLazyExpensifyIcons(['Stopwatch', 'Trashcan', 'ArrowRight', 'Table', 'DocumentMerge', 'Export', 'ArrowCollapse', 'ArrowSplit', 'ThumbsDown']);
const expensifyIcons = useMemoizedLazyExpensifyIcons([
'Stopwatch',
'Trashcan',
'ArrowRight',
'Table',
'DocumentMerge',
'Export',
'ArrowCollapse',
'ArrowSplit',
'ThumbsDown',
'ArrowSplit',
'ThumbsDown',
'Pencil',
]);
const {duplicateTransactions, duplicateTransactionViolations} = useDuplicateTransactionsAndViolations(selectedTransactionIDs);
const isReportArchived = useReportIsArchived(report?.reportID);
const {deleteTransactions} = useDeleteTransactions({report, reportActions, policy});
Expand Down Expand Up @@ -169,6 +185,20 @@
return [];
}
const options = [];

const canEditMultiple = canEditMultipleTransactions(selectedTransactionsList, allReportActions, allReports, allPolicies);

if (canEditMultiple) {
options.push({
text: translate('search.bulkActions.editMultiple'),
icon: expensifyIcons.Pencil,
value: CONST.SEARCH.BULK_ACTION_TYPES.EDIT,

Check failure on line 195 in src/hooks/useSelectedTransactionsActions.ts

View workflow job for this annotation

GitHub Actions / typecheck

Property 'EDIT' does not exist on type '{ readonly EXPORT: "export"; readonly APPROVE: "approve"; readonly PAY: "pay"; readonly SUBMIT: "submit"; readonly HOLD: "hold"; readonly MERGE: "merge"; readonly UNHOLD: "unhold"; readonly DELETE: "delete"; readonly REJECT: "reject"; readonly CHANGE_REPORT: "changeReport"; readonly SPLIT: "split"; }'.
onSelected: () => {
Navigation.navigate(ROUTES.SEARCH_EDIT_MULTIPLE_TRANSACTIONS_RHP);
},
});
}

const isMoneyRequestReport = isMoneyRequestReportUtils(report);
const isReportReimbursed = report?.stateNum === CONST.REPORT.STATE_NUM.APPROVED && report?.statusNum === CONST.REPORT.STATUS_NUM.REIMBURSED;

Expand Down Expand Up @@ -400,9 +430,12 @@
expensifyIcons.DocumentMerge,
expensifyIcons.ArrowCollapse,
expensifyIcons.Trashcan,
expensifyIcons.Pencil,
localeCompare,
isOnSearch,
login,
allReportActions,
allPolicies,
]);

return {
Expand Down
3 changes: 3 additions & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6759,6 +6759,9 @@ Fordere Spesendetails wie Belege und Beschreibungen an, lege Limits und Standard
savedSearchesMenuItemTitle: 'Gespeichert',
groupedExpenses: 'gruppierte Ausgaben',
bulkActions: {
editMultiple: 'Mehrere bearbeiten',
editMultipleTitle: 'Mehrere Ausgaben bearbeiten',
editMultipleDescription: 'Änderungen werden für alle ausgewählten Ausgaben festgelegt und überschreiben alle zuvor festgelegten Werte.',
approve: 'Genehmigen',
pay: 'Bezahlen',
delete: 'Löschen',
Expand Down
4 changes: 4 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6642,6 +6642,10 @@ const translations = {
savedSearchesMenuItemTitle: 'Saved',
groupedExpenses: 'grouped expenses',
bulkActions: {
editMultiple: 'Edit multiple',
editMultipleTitle: 'Edit multiple expenses',
// cspell:disable
editMultipleDescription: "Changes will be set for all selected expenses and will override any previously set values. Just sayin'.",
approve: 'Approve',
pay: 'Pay',
delete: 'Delete',
Expand Down
3 changes: 3 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6374,6 +6374,9 @@ ${amount} para ${merchant} - ${date}`,
deleteSavedSearchConfirm: '¿Estás seguro de que quieres eliminar esta búsqueda?',
groupedExpenses: 'gastos agrupados',
bulkActions: {
editMultiple: 'Editar múltiples',
editMultipleTitle: 'Editar múltiples gastos',
editMultipleDescription: 'Los cambios se aplicarán a todos los gastos seleccionados y anularán cualquier valor previamente establecido.',
approve: 'Aprobar',
pay: 'Pagar',
delete: 'Eliminar',
Expand Down
3 changes: 3 additions & 0 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6770,6 +6770,9 @@ Exigez des informations de dépense comme les reçus et les descriptions, défin
savedSearchesMenuItemTitle: 'Enregistré',
groupedExpenses: 'dépenses groupées',
bulkActions: {
editMultiple: 'Modifier plusieurs',
editMultipleTitle: 'Modifier plusieurs dépenses',
editMultipleDescription: 'Les modifications seront appliquées à toutes les dépenses sélectionnées et remplaceront toutes les valeurs précédemment définies.',
approve: 'Approuver',
pay: 'Payer',
delete: 'Supprimer',
Expand Down
3 changes: 3 additions & 0 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6744,6 +6744,9 @@ Richiedi dettagli di spesa come ricevute e descrizioni, imposta limiti e valori
savedSearchesMenuItemTitle: 'Salvato',
groupedExpenses: 'spese raggruppate',
bulkActions: {
editMultiple: 'Modifica multipli',
editMultipleTitle: 'Modifica più spese',
editMultipleDescription: 'Le modifiche verranno applicate a tutte le spese selezionate e sostituiranno i valori precedentemente impostati.',
approve: 'Approva',
pay: 'Paga',
delete: 'Elimina',
Expand Down
3 changes: 3 additions & 0 deletions src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6690,6 +6690,9 @@ ${reportName}
savedSearchesMenuItemTitle: '保存済み',
groupedExpenses: 'グループ化された経費',
bulkActions: {
editMultiple: '複数を編集',
editMultipleTitle: '複数の経費を編集',
editMultipleDescription: '変更は選択したすべての経費に適用され、以前に設定された値は上書きされます。',
approve: '承認',
pay: '支払う',
delete: '削除',
Expand Down
3 changes: 3 additions & 0 deletions src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6733,6 +6733,9 @@ Vraag verplichte uitgavedetails zoals bonnetjes en beschrijvingen, stel limieten
savedSearchesMenuItemTitle: 'Opgeslagen',
groupedExpenses: 'gegroepeerde uitgaven',
bulkActions: {
editMultiple: 'Meerdere bewerken',
editMultipleTitle: 'Meerdere uitgaven bewerken',
editMultipleDescription: 'Wijzigingen worden toegepast op alle geselecteerde uitgaven en overschrijven eerder ingestelde waarden.',
approve: 'Goedkeuren',
pay: 'Betalen',
delete: 'Verwijderen',
Expand Down
3 changes: 3 additions & 0 deletions src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6718,6 +6718,9 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
savedSearchesMenuItemTitle: 'Zapisano',
groupedExpenses: 'pogrupowane wydatki',
bulkActions: {
editMultiple: 'Edytuj wiele',
editMultipleTitle: 'Edytuj wiele wydatków',
editMultipleDescription: 'Zmiany zostaną zastosowane do wszystkich wybranych wydatków i zastąpią wcześniej ustawione wartości.',
approve: 'Zatwierdź',
pay: 'Zapłać',
delete: 'Usuń',
Expand Down
3 changes: 3 additions & 0 deletions src/languages/pt-BR.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6722,6 +6722,9 @@ Exija detalhes de despesas como recibos e descrições, defina limites e padrõe
savedSearchesMenuItemTitle: 'Salvo',
groupedExpenses: 'despesas agrupadas',
bulkActions: {
editMultiple: 'Editar múltiplos',
editMultipleTitle: 'Editar múltiplas despesas',
editMultipleDescription: 'As alterações serão aplicadas a todas as despesas selecionadas e substituirão quaisquer valores definidos anteriormente.',
approve: 'Aprovar',
pay: 'Pagar',
delete: 'Excluir',
Expand Down
3 changes: 3 additions & 0 deletions src/languages/zh-hans.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6579,6 +6579,9 @@ ${reportName}
savedSearchesMenuItemTitle: '已保存',
groupedExpenses: '已分组报销费用',
bulkActions: {
editMultiple: '批量编辑',
editMultipleTitle: '编辑多个费用',
editMultipleDescription: '更改将应用于所有选定的费用,并将覆盖之前设置的任何值。',
approve: '批准',
pay: '支付',
delete: '删除',
Expand Down
2 changes: 2 additions & 0 deletions src/libs/API/parameters/UpdateMoneyRequestParams.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ type UpdateMoneyRequestParams = Partial<TransactionDetails> & {
reportID?: string;
transactionID?: string;
reportActionID?: string;
/** Used for bulk updates - JSON stringified object containing only changed fields */
updates?: string;
};

export default UpdateMoneyRequestParams;
2 changes: 2 additions & 0 deletions src/libs/API/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ const WRITE_COMMANDS = {
DELETE_REPORT_FIELD: 'RemoveReportField',
SET_REPORT_NAME: 'RenameReport',
COMPLETE_SPLIT_BILL: 'CompleteSplitBill',
UPDATE_MONEY_REQUEST: 'UpdateMoneyRequest',
UPDATE_MONEY_REQUEST_ATTENDEES: 'UpdateMoneyRequestAttendees',
UPDATE_MONEY_REQUEST_DATE: 'UpdateMoneyRequestDate',
UPDATE_MONEY_REQUEST_REIMBURSABLE: 'UpdateMoneyRequestReimbursable',
Expand Down Expand Up @@ -720,6 +721,7 @@ type WriteCommandParameters = {
[WRITE_COMMANDS.SET_REPORT_NAME]: Parameters.SetReportNameParams;
[WRITE_COMMANDS.DELETE_REPORT_FIELD]: Parameters.DeleteReportFieldParams;
[WRITE_COMMANDS.COMPLETE_SPLIT_BILL]: Parameters.CompleteSplitBillParams;
[WRITE_COMMANDS.UPDATE_MONEY_REQUEST]: Parameters.UpdateMoneyRequestParams;
[WRITE_COMMANDS.UPDATE_MONEY_REQUEST_ATTENDEES]: Parameters.UpdateMoneyRequestParams;
[WRITE_COMMANDS.UPDATE_MONEY_REQUEST_DATE]: Parameters.UpdateMoneyRequestParams;
[WRITE_COMMANDS.UPDATE_MONEY_REQUEST_MERCHANT]: Parameters.UpdateMoneyRequestParams;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -881,6 +881,14 @@ const SearchReportActionsModalStackNavigator = createModalStackNavigator<SearchR
[SCREENS.SEARCH.TRANSACTION_HOLD_REASON_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchHoldReasonPage').default,
[SCREENS.SEARCH.SEARCH_REJECT_REASON_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchRejectReasonPage').default,
[SCREENS.SEARCH.TRANSACTIONS_CHANGE_REPORT_SEARCH_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchTransactionsChangeReport').default,
[SCREENS.SEARCH.EDIT_MULTIPLE_TRANSACTIONS_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchEditMultiple/SearchEditMultiplePage').default,
[SCREENS.SEARCH.EDIT_MULTIPLE_AMOUNT_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchEditMultiple/SearchEditMultipleAmountPage').default,
[SCREENS.SEARCH.EDIT_MULTIPLE_DESCRIPTION_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchEditMultiple/SearchEditMultipleDescriptionPage').default,
[SCREENS.SEARCH.EDIT_MULTIPLE_MERCHANT_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchEditMultiple/SearchEditMultipleMerchantPage').default,
[SCREENS.SEARCH.EDIT_MULTIPLE_DATE_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchEditMultiple/SearchEditMultipleDatePage').default,
[SCREENS.SEARCH.EDIT_MULTIPLE_CATEGORY_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchEditMultiple/SearchEditMultipleCategoryPage').default,
[SCREENS.SEARCH.EDIT_MULTIPLE_TAG_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchEditMultiple/SearchEditMultipleTagPage').default,
[SCREENS.SEARCH.EDIT_MULTIPLE_TAX_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchEditMultiple/SearchEditMultipleTaxPage').default,
});

const SearchAdvancedFiltersModalStackNavigator = createModalStackNavigator<SearchAdvancedFiltersParamList>({
Expand Down
8 changes: 8 additions & 0 deletions src/libs/Navigation/linkingConfig/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1699,6 +1699,14 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
[SCREENS.SEARCH.TRANSACTION_HOLD_REASON_RHP]: ROUTES.TRANSACTION_HOLD_REASON_RHP,
[SCREENS.SEARCH.SEARCH_REJECT_REASON_RHP]: ROUTES.SEARCH_REJECT_REASON_RHP,
[SCREENS.SEARCH.TRANSACTIONS_CHANGE_REPORT_SEARCH_RHP]: ROUTES.MOVE_TRANSACTIONS_SEARCH_RHP,
[SCREENS.SEARCH.EDIT_MULTIPLE_TRANSACTIONS_RHP]: ROUTES.SEARCH_EDIT_MULTIPLE_TRANSACTIONS_RHP,
[SCREENS.SEARCH.EDIT_MULTIPLE_AMOUNT_RHP]: ROUTES.SEARCH_EDIT_MULTIPLE_AMOUNT_RHP,
[SCREENS.SEARCH.EDIT_MULTIPLE_DESCRIPTION_RHP]: ROUTES.SEARCH_EDIT_MULTIPLE_DESCRIPTION_RHP,
[SCREENS.SEARCH.EDIT_MULTIPLE_MERCHANT_RHP]: ROUTES.SEARCH_EDIT_MULTIPLE_MERCHANT_RHP,
[SCREENS.SEARCH.EDIT_MULTIPLE_DATE_RHP]: ROUTES.SEARCH_EDIT_MULTIPLE_DATE_RHP,
[SCREENS.SEARCH.EDIT_MULTIPLE_CATEGORY_RHP]: ROUTES.SEARCH_EDIT_MULTIPLE_CATEGORY_RHP,
[SCREENS.SEARCH.EDIT_MULTIPLE_TAG_RHP]: ROUTES.SEARCH_EDIT_MULTIPLE_TAG_RHP,
[SCREENS.SEARCH.EDIT_MULTIPLE_TAX_RHP]: ROUTES.SEARCH_EDIT_MULTIPLE_TAX_RHP,
},
},
[SCREENS.RIGHT_MODAL.SEARCH_ADVANCED_FILTERS]: {
Expand Down
38 changes: 38 additions & 0 deletions src/libs/ReportUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4645,6 +4645,43 @@ function canEditReportPolicy(report: OnyxEntry<Report>, reportPolicy: OnyxEntry<
return false;
}

/**
* Checks if the user can edit multiple transactions
*/
function canEditMultipleTransactions(
selectedTransactions: Transaction[],
reportActions: OnyxCollection<ReportActions>,
reports: OnyxCollection<Report>,
policies: OnyxCollection<Policy>,
): boolean {
if (selectedTransactions.length < 2) {
return false;
}

for (const transaction of selectedTransactions) {
const reportAction = getIOUActionForTransactionID(Object.values(reportActions?.[`${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${transaction.reportID}`] ?? {}), transaction.transactionID);
const report = reports?.[`${ONYXKEYS.COLLECTION.REPORT}${transaction.reportID}`];
const policy = policies?.[`${ONYXKEYS.COLLECTION.POLICY}${report?.policyID}`];

const fieldsToCheck = [
CONST.EDIT_REQUEST_FIELD.AMOUNT,
CONST.EDIT_REQUEST_FIELD.MERCHANT,
CONST.EDIT_REQUEST_FIELD.CATEGORY,
CONST.EDIT_REQUEST_FIELD.TAG,
CONST.EDIT_REQUEST_FIELD.DESCRIPTION,
CONST.EDIT_REQUEST_FIELD.DATE,
];

const isTransactionEditable = fieldsToCheck.some((field) => canEditFieldOfMoneyRequest(reportAction, field, undefined, undefined, undefined, transaction, report, policy));

if (!isTransactionEditable) {
return false;
}
}

return true;
}

/**
* Checks if the current user can edit the provided property of an expense
*
Expand Down Expand Up @@ -13283,6 +13320,7 @@ export {
isOneTransactionReport,
isTrackExpenseReportNew,
shouldHideSingleReportField,
canEditMultipleTransactions,
};

export type {
Expand Down
Loading
Loading