Skip to content

Commit dccb6ea

Browse files
authored
Merge pull request Expensify#67591 from dominictb/fix/67586
[CP Staging] only show remove hold in transaction thread secondary actions for admin if he is not the holder
2 parents 88db91a + 14116f3 commit dccb6ea

3 files changed

Lines changed: 16 additions & 12 deletions

File tree

src/components/MoneyRequestHeader.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,8 @@ function MoneyRequestHeader({report, parentReportAction, policy, onBackButtonPre
202202
if (!transaction || !reportActions) {
203203
return [];
204204
}
205-
return getSecondaryTransactionThreadActions(parentReport, transaction, Object.values(reportActions), policy);
206-
}, [parentReport, policy, transaction]);
205+
return getSecondaryTransactionThreadActions(parentReport, transaction, Object.values(reportActions), policy, report);
206+
}, [report, parentReport, policy, transaction]);
207207

208208
const secondaryActionsImplementation: Record<ValueOf<typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS>, DropdownOption<ValueOf<typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS>>> = {
209209
[CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.HOLD]: {

src/libs/ReportSecondaryActionUtils.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -547,11 +547,7 @@ function isRemoveHoldAction(report: Report, chatReport: OnyxEntry<Report>, repor
547547
}
548548

549549
function isRemoveHoldActionForTransaction(report: Report, reportTransaction: Transaction, policy?: Policy): boolean {
550-
if (!isOnHoldTransactionUtils(reportTransaction)) {
551-
return false;
552-
}
553-
554-
return policy?.role === CONST.POLICY.ROLE.ADMIN;
550+
return isOnHoldTransactionUtils(reportTransaction) && policy?.role === CONST.POLICY.ROLE.ADMIN && !isHoldCreator(reportTransaction, report.reportID);
555551
}
556552

557553
function getSecondaryReportActions({
@@ -671,14 +667,15 @@ function getSecondaryTransactionThreadActions(
671667
reportTransaction: Transaction,
672668
reportActions: ReportAction[],
673669
policy: OnyxEntry<Policy>,
670+
transactionThreadReport?: OnyxEntry<Report>,
674671
): Array<ValueOf<typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS>> {
675672
const options: Array<ValueOf<typeof CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS>> = [];
676673

677674
if (isHoldActionForTransaction(parentReport, reportTransaction, reportActions)) {
678675
options.push(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.HOLD);
679676
}
680677

681-
if (isRemoveHoldActionForTransaction(parentReport, reportTransaction, policy)) {
678+
if (transactionThreadReport && isRemoveHoldActionForTransaction(transactionThreadReport, reportTransaction, policy)) {
682679
options.push(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REMOVE_HOLD);
683680
}
684681

tests/unit/ReportSecondaryActionUtilsTest.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1247,7 +1247,7 @@ describe('getSecondaryExportReportActions', () => {
12471247
expect(result.includes(CONST.REPORT.EXPORT_OPTIONS.MARK_AS_EXPORTED)).toBe(true);
12481248
});
12491249

1250-
it('includes REMOVE HOLD option for admin', () => {
1250+
it('includes REMOVE HOLD option for admin if he is not the holder', () => {
12511251
const report = {} as unknown as Report;
12521252
const policy = {
12531253
role: CONST.POLICY.ROLE.ADMIN,
@@ -1310,8 +1310,9 @@ describe('getSecondaryTransactionThreadActions', () => {
13101310
expect(result.includes(CONST.REPORT.SECONDARY_ACTIONS.HOLD)).toBe(true);
13111311
});
13121312

1313-
it('includes REMOVE HOLD option for admin', () => {
1313+
it('includes REMOVE HOLD option for transaction thread report admin if he is not the holder', () => {
13141314
const report = {} as unknown as Report;
1315+
const transactionThreadReport = {} as unknown as Report;
13151316
const policy = {
13161317
role: CONST.POLICY.ROLE.ADMIN,
13171318
} as unknown as Policy;
@@ -1321,8 +1322,14 @@ describe('getSecondaryTransactionThreadActions', () => {
13211322
},
13221323
} as unknown as Transaction;
13231324

1324-
const result = getSecondaryTransactionThreadActions(report, transaction, [], policy);
1325-
expect(result).toContain(CONST.REPORT.TRANSACTION_SECONDARY_ACTIONS.REMOVE_HOLD);
1325+
jest.spyOn(ReportUtils, 'isHoldCreator').mockReturnValue(false);
1326+
const result = getSecondaryTransactionThreadActions(report, transaction, [], policy, transactionThreadReport);
1327+
expect(result).toContain(CONST.REPORT.SECONDARY_ACTIONS.REMOVE_HOLD);
1328+
1329+
// Do not show if admin is the holder
1330+
jest.spyOn(ReportUtils, 'isHoldCreator').mockReturnValue(true);
1331+
const result2 = getSecondaryTransactionThreadActions(report, transaction, [], policy, transactionThreadReport);
1332+
expect(result2).not.toContain(CONST.REPORT.SECONDARY_ACTIONS.REMOVE_HOLD);
13261333
});
13271334

13281335
it('includes DELETE option for expense report submitter', async () => {

0 commit comments

Comments
 (0)