Skip to content
Merged
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
4 changes: 0 additions & 4 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3104,8 +3104,6 @@ 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',
// This is the transactionID used when going through the distance split expense flow so that it mimics a draft transaction
OPTIMISTIC_DISTANCE_SPLIT_TRANSACTION_ID: '2',
// Note: These payment types are used when building IOU reportAction message values in the server and should
Expand Down Expand Up @@ -4381,7 +4379,6 @@ const CONST = {
TAX_RATE: 'taxRate',
TAX_AMOUNT: 'taxAmount',
REIMBURSABLE: 'reimbursable',
BILLABLE: 'billable',
REPORT: 'report',
},
FOOTER: {
Expand Down Expand Up @@ -7172,7 +7169,6 @@ const CONST = {
TAG: 'tag',
},
BULK_ACTION_TYPES: {
EDIT: 'edit',
EXPORT: 'export',
APPROVE: 'approve',
PAY: 'pay',
Expand Down
9 changes: 0 additions & 9 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1016,12 +1016,6 @@ 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 @@ -1159,9 +1153,6 @@ 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;
[ONYXKEYS.FORMS.EXPENSE_RULE_FORM]: FormTypes.ExpenseRuleForm;
Expand Down
13 changes: 0 additions & 13 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -192,19 +192,6 @@ const ROUTES = {
},
},
SEARCH_REJECT_REASON_RHP: 'search/reject',
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: {
route: 'search/edit-multiple/tag/:tagListIndex',
getRoute: (tagListIndex = 0) => `search/edit-multiple/tag/${tagListIndex}` as const,
},
SEARCH_EDIT_MULTIPLE_BILLABLE_RHP: 'search/edit-multiple/billable',
SEARCH_EDIT_MULTIPLE_REIMBURSABLE_RHP: 'search/edit-multiple/reimbursable',
SEARCH_EDIT_MULTIPLE_TAX_RHP: 'search/edit-multiple/tax',
MOVE_TRANSACTIONS_SEARCH_RHP: {
route: 'search/move-transactions/search/:backTo?',
getRoute: (backTo?: string) => {
Expand Down
10 changes: 0 additions & 10 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,16 +98,6 @@ const SCREENS = {
TRANSACTION_HOLD_REASON_RHP: 'Search_Transaction_Hold_Reason_RHP',
TRANSACTION_HOLD_REASON_SEARCH: 'Search_Transaction_Hold_Reason_Search',
SEARCH_REJECT_REASON_RHP: 'Search_Reject_Reason_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_BILLABLE_RHP: 'Search_Edit_Multiple_Billable_RHP',
EDIT_MULTIPLE_REIMBURSABLE_RHP: 'Search_Edit_Multiple_Reimbursable_RHP',
EDIT_MULTIPLE_TAX_RHP: 'Search_Edit_Multiple_Tax_RHP',
TRANSACTIONS_CHANGE_REPORT_SEARCH_RHP: 'Search_Transactions_Change_Report_Search',
},
SETTINGS: {
Expand Down
28 changes: 26 additions & 2 deletions src/components/ReportActionItem/MoneyRequestView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ import {
isTrackExpenseReportNew,
shouldEnableNegative,
} from '@libs/ReportUtils';
import {hasEnabledTags, shouldShowDependentTagList} from '@libs/TagsOptionsListUtils';
import {hasEnabledTags} from '@libs/TagsOptionsListUtils';
import {
getBillable,
getCurrency,
Expand All @@ -87,6 +87,7 @@ import {
getOriginalAmountForDisplay,
getOriginalTransactionWithSplitInfo,
getReimbursable,
getTagArrayFromName,
getTagForDisplay,
getTaxName,
hasMissingSmartscanFields,
Expand Down Expand Up @@ -701,7 +702,30 @@ function MoneyRequestView({
const tagForDisplay = getTagForDisplay(updatedTransaction ?? transaction, index);
let shouldShow = false;
if (hasDependentTags) {
shouldShow = shouldShowDependentTagList(index, transactionTag, tags);
if (index === 0) {
shouldShow = true;
} else {
const prevTagValue = getTagForDisplay(transaction, index - 1);
if (!prevTagValue) {
shouldShow = false;
} else {
const parentTag = getTagArrayFromName(transactionTag ?? '')
.slice(0, index)
.join(':');

const availableTags = Object.values(tags).filter((policyTag) => {
const filterRegex = policyTag.rules?.parentTagsFilter;
if (!filterRegex) {
return true;
}

const regex = new RegExp(filterRegex);
return regex.test(parentTag ?? '');
});

shouldShow = availableTags.some((tag) => tag.enabled);
}
}
} else {
shouldShow = !!tagForDisplay || (canEdit && hasEnabledOptions(tags));
}
Expand Down
21 changes: 2 additions & 19 deletions src/components/TaxPicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -40,25 +40,9 @@ type TaxPickerProps = {
* If enabled, the content will have a bottom padding equal to account for the safe bottom area inset.
*/
addBottomSafeAreaPadding?: boolean;

/**
* If enabled, allows deselecting the currently selected tax rate by tapping it again.
* When disabled (default), tapping the selected tax rate will dismiss the picker without calling onSubmit.
*/
allowDeselect?: boolean;
};

function TaxPicker({
selectedTaxRate = '',
policyID,
transactionID,
onSubmit,
action,
iouType,
onDismiss = Navigation.goBack,
addBottomSafeAreaPadding,
allowDeselect = false,
}: TaxPickerProps) {
function TaxPicker({selectedTaxRate = '', policyID, transactionID, onSubmit, action, iouType, onDismiss = Navigation.goBack, addBottomSafeAreaPadding}: TaxPickerProps) {
const {translate, localeCompare} = useLocalize();
const [searchValue, setSearchValue] = useState('');
const [splitDraftTransaction] = useOnyx(`${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`);
Expand Down Expand Up @@ -105,8 +89,7 @@ function TaxPicker({
const selectedOptionKey = sections?.at(0)?.data?.find((taxRate) => taxRate.searchText === selectedTaxRate)?.keyForList;

const handleSelectRow = (newSelectedOption: TaxRatesOption) => {
// If deselection is not allowed and the same option is selected, just dismiss
if (!allowDeselect && selectedOptionKey === newSelectedOption.keyForList) {
if (selectedOptionKey === newSelectedOption.keyForList) {
onDismiss();
return;
}
Expand Down
30 changes: 1 addition & 29 deletions src/hooks/useSearchBulkActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ import Navigation from '@libs/Navigation/Navigation';
import {hasDynamicExternalWorkflow} from '@libs/PolicyUtils';
import {isMergeActionForSelectedTransactions} from '@libs/ReportSecondaryActionUtils';
import {
canEditMultipleTransactions,
getReportOrDraftReport,
isBusinessInvoiceRoom,
isCurrentUserSubmitter,
Expand All @@ -49,7 +48,7 @@ import {navigateToSearchRHP, shouldShowDeleteOption} from '@libs/SearchUIUtils';
import {shouldRestrictUserBillableActions} from '@libs/SubscriptionUtils';
import {hasTransactionBeenRejected} from '@libs/TransactionUtils';
import variables from '@styles/variables';
import {canIOUBePaid, dismissRejectUseExplanation, initBulkEditDraftTransaction} from '@userActions/IOU';
import {canIOUBePaid, dismissRejectUseExplanation} from '@userActions/IOU';
import {openOldDotLink} from '@userActions/Link';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
Expand Down Expand Up @@ -89,7 +88,6 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
const {accountID} = currentUserPersonalDetails;
const allTransactions = useAllTransactions();
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT);
const [allReportActions] = useOnyx(ONYXKEYS.COLLECTION.REPORT_ACTIONS);
const selfDMReport = useSelfDMReport();
const [lastPaymentMethods] = useOnyx(ONYXKEYS.NVP_LAST_PAYMENT_METHOD);
const [personalPolicyID] = useOnyx(ONYXKEYS.PERSONAL_POLICY_ID);
Expand Down Expand Up @@ -142,7 +140,6 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
'Exclamation',
'MoneyBag',
'ArrowSplit',
'Pencil',
] as const);

const selectedTransactionReportIDs = useMemo(
Expand Down Expand Up @@ -751,29 +748,6 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
return [exportButtonOption];
}

const isExpenseReportSearch = typeExpenseReport || searchResults?.search.type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT;
const selectedTransactionsList = Object.values(selectedTransactions)
.map((transaction) => transaction.transaction)
.filter((transaction): transaction is Transaction => !!transaction);
const canEditMultiple = canEditMultipleTransactions(selectedTransactionsList, allReportActions, allReports, policies, isExpenseReportSearch);

if (canEditMultiple) {
options.push({
icon: expensifyIcons.Pencil,
text: translate('search.bulkActions.editMultiple'),
value: CONST.SEARCH.BULK_ACTION_TYPES.EDIT,
shouldCloseModalOnSelect: true,
onSelected: () => {
const selectedTransactionIDs = Object.keys(selectedTransactions).filter((transactionID) => {
const selectedTransaction = selectedTransactions[transactionID];
return !!selectedTransaction?.transaction?.transactionID || !!allTransactions?.[`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`];
});
initBulkEditDraftTransaction(selectedTransactionIDs);
Navigation.navigate(ROUTES.SEARCH_EDIT_MULTIPLE_TRANSACTIONS_RHP);
},
});
}

const areSelectedTransactionsIncludedInReports = selectedTransactionsKeys.every((id) =>
selectedTransactions[id].reportID ? selectedReportIDs.includes(selectedTransactions[id].reportID) : true,
);
Expand Down Expand Up @@ -1064,7 +1038,6 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
expensifyIcons.ArrowCollapse,
expensifyIcons.DocumentMerge,
expensifyIcons.ArrowSplit,
expensifyIcons.Pencil,
expensifyIcons.Trashcan,
expensifyIcons.Exclamation,
translate,
Expand All @@ -1079,7 +1052,6 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
selectedTransactionReportIDs,
selectedPolicyIDs,
policies,
allReportActions,
integrationsExportTemplates,
csvExportLayouts,
handleBasicExport,
Expand Down
34 changes: 1 addition & 33 deletions src/hooks/useSelectedTransactionsActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import type {DropdownOption} from '@components/ButtonWithDropdownMenu/types';
import {useDelegateNoAccessActions, useDelegateNoAccessState} from '@components/DelegateNoAccessModalProvider';
import type {PopoverMenuItem} from '@components/PopoverMenu';
import {useSearchActionsContext, useSearchStateContext} from '@components/Search/SearchContext';
import {initBulkEditDraftTransaction} from '@libs/actions/IOU';
import {unholdRequest} from '@libs/actions/IOU/Hold';
import {setupMergeTransactionDataAndNavigate} from '@libs/actions/MergeTransaction';
import {exportReportToCSV} from '@libs/actions/Report';
Expand All @@ -17,7 +16,6 @@ import {
canDeleteCardTransactionByLiabilityType,
canDeleteTransaction,
canEditFieldOfMoneyRequest,
canEditMultipleTransactions,
canHoldUnholdReportAction,
canRejectReportAction,
canUserPerformWriteAction as canUserPerformWriteActionReportUtils,
Expand Down Expand Up @@ -80,28 +78,13 @@ function useSelectedTransactionsActions({
const {selectedTransactionIDs, currentSearchHash, selectedTransactions: selectedTransactionsMeta} = useSearchStateContext();
const {clearSelectedTransactions} = useSearchActionsContext();
const allTransactions = useAllTransactions();
const [allReports] = useOnyx(ONYXKEYS.COLLECTION.REPORT);
const [allReportActions] = useOnyx(ONYXKEYS.COLLECTION.REPORT_ACTIONS);
const [allPolicies] = useOnyx(ONYXKEYS.COLLECTION.POLICY);
const [outstandingReportsByPolicyID] = useOnyx(ONYXKEYS.DERIVED.OUTSTANDING_REPORTS_BY_POLICY_ID);
const [lastVisitedPath] = useOnyx(ONYXKEYS.LAST_VISITED_PATH);
const [integrationsExportTemplates] = useOnyx(ONYXKEYS.NVP_INTEGRATION_SERVER_EXPORT_TEMPLATES);
const [csvExportLayouts] = useOnyx(ONYXKEYS.NVP_CSV_EXPORT_LAYOUTS);
const [allTransactionViolations] = useOnyx(ONYXKEYS.COLLECTION.TRANSACTION_VIOLATIONS);

const expensifyIcons = useMemoizedLazyExpensifyIcons([
'Stopwatch',
'Trashcan',
'ArrowRight',
'Table',
'DocumentMerge',
'Export',
'ArrowCollapse',
'ArrowSplit',
'ThumbsDown',
'Pencil',
] as const);

const expensifyIcons = useMemoizedLazyExpensifyIcons(['Stopwatch', 'Trashcan', 'ArrowRight', 'Table', 'DocumentMerge', 'Export', 'ArrowCollapse', 'ArrowSplit', 'ThumbsDown']);
const {duplicateTransactions, duplicateTransactionViolations} = useDuplicateTransactionsAndViolations(selectedTransactionIDs);
const isReportArchived = useReportIsArchived(report?.reportID);
const {deleteTransactions} = useDeleteTransactions({report, reportActions, policy});
Expand Down Expand Up @@ -203,20 +186,6 @@ function useSelectedTransactionsActions({
let computedOptions: Array<DropdownOption<string>> = [];
if (selectedTransactionIDs.length) {
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,
onSelected: () => {
initBulkEditDraftTransaction(selectedTransactionIDs);
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 @@ -434,7 +403,6 @@ function useSelectedTransactionsActions({
},
});
}

computedOptions = options;
}

Expand Down
3 changes: 0 additions & 3 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7266,9 +7266,6 @@ Fordern Sie Spesendetails wie Belege und Beschreibungen an, legen Sie Limits und
topMerchants: 'Top-Händler',
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: 0 additions & 4 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7230,10 +7230,6 @@ const translations = {
spendOverTime: 'Spend over time',
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: 0 additions & 3 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7091,9 +7091,6 @@ ${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: 0 additions & 3 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7288,9 +7288,6 @@ Rendez obligatoires des informations de dépense comme les reçus et les descrip
topMerchants: 'Commerçants principaux',
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: 0 additions & 3 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7252,9 +7252,6 @@ Richiedi dettagli sulle spese come ricevute e descrizioni, imposta limiti e valo
topMerchants: 'Commercianti principali',
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: 0 additions & 3 deletions src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7174,9 +7174,6 @@ ${reportName}
topMerchants: '上位加盟店',
groupedExpenses: 'グループ化された経費',
bulkActions: {
editMultiple: '複数を編集',
editMultipleTitle: '複数の経費を編集',
editMultipleDescription: '変更は選択したすべての経費に適用され、以前に設定された値は上書きされます。',
approve: '承認',
pay: '支払う',
delete: '削除',
Expand Down
Loading
Loading