From a0f6f73bcf1dc51fc71f916eb19fdbc1bce4df4d Mon Sep 17 00:00:00 2001 From: Eskalifer1 Date: Fri, 7 Nov 2025 20:59:54 +0200 Subject: [PATCH 1/2] disable report fields on report for simple members --- .../MoneyRequestReportView/MoneyRequestViewReportFields.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx b/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx index 240e92202315..01003c3fff24 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx @@ -12,6 +12,7 @@ import { getFieldViolation, getFieldViolationTranslation, getReportFieldKey, + isAdminOwnerApproverOrReportOwner, isInvoiceReport as isInvoiceReportUtils, isPaidGroupPolicyExpenseReport as isPaidGroupPolicyExpenseReportUtils, isReportFieldDisabled, @@ -95,10 +96,10 @@ function MoneyRequestViewReportFields({report, policy, isCombinedReport = false, .sort(({orderWeight: firstOrderWeight}, {orderWeight: secondOrderWeight}) => firstOrderWeight - secondOrderWeight) .map((field): EnrichedPolicyReportField => { const fieldValue = field.value ?? field.defaultValue; - const isFieldDisabled = isReportFieldDisabled(report, field, policy); + const isFieldDisabled = isReportFieldDisabled(report, field, policy) || !isAdminOwnerApproverOrReportOwner(report, policy); const fieldKey = getReportFieldKey(field.fieldID); - const violation = getFieldViolation(violations, field); + const violation = isFieldDisabled ? undefined : getFieldViolation(violations, field); const violationTranslation = getFieldViolationTranslation(field, violation); return { From 01a932dae4785959c073d89a982e31e95a61c757 Mon Sep 17 00:00:00 2001 From: Eskalifer1 Date: Tue, 11 Nov 2025 16:42:14 +0200 Subject: [PATCH 2/2] chore: C+ comment --- .../MoneyRequestViewReportFields.tsx | 4 ++-- src/components/ReportActionItem/MoneyReportView.tsx | 4 ++-- src/libs/ReportUtils.ts | 10 ++++++++++ src/pages/EditReportFieldPage.tsx | 4 ++-- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx b/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx index 01003c3fff24..8cee588e0fdb 100644 --- a/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx +++ b/src/components/MoneyRequestReportView/MoneyRequestViewReportFields.tsx @@ -12,10 +12,10 @@ import { getFieldViolation, getFieldViolationTranslation, getReportFieldKey, - isAdminOwnerApproverOrReportOwner, isInvoiceReport as isInvoiceReportUtils, isPaidGroupPolicyExpenseReport as isPaidGroupPolicyExpenseReportUtils, isReportFieldDisabled, + isReportFieldDisabledForUser, isReportFieldOfTypeTitle, } from '@libs/ReportUtils'; import type {ThemeStyles} from '@styles/index'; @@ -96,7 +96,7 @@ function MoneyRequestViewReportFields({report, policy, isCombinedReport = false, .sort(({orderWeight: firstOrderWeight}, {orderWeight: secondOrderWeight}) => firstOrderWeight - secondOrderWeight) .map((field): EnrichedPolicyReportField => { const fieldValue = field.value ?? field.defaultValue; - const isFieldDisabled = isReportFieldDisabled(report, field, policy) || !isAdminOwnerApproverOrReportOwner(report, policy); + const isFieldDisabled = isReportFieldDisabledForUser(report, field, policy); const fieldKey = getReportFieldKey(field.fieldID); const violation = isFieldDisabled ? undefined : getFieldViolation(violations, field); diff --git a/src/components/ReportActionItem/MoneyReportView.tsx b/src/components/ReportActionItem/MoneyReportView.tsx index e78a77aa6fad..67fb7fa10e5f 100644 --- a/src/components/ReportActionItem/MoneyReportView.tsx +++ b/src/components/ReportActionItem/MoneyReportView.tsx @@ -26,11 +26,11 @@ import { getMoneyRequestSpendBreakdown, getReportFieldKey, hasUpdatedTotal, - isAdminOwnerApproverOrReportOwner, isClosedExpenseReportWithNoExpenses as isClosedExpenseReportWithNoExpensesReportUtils, isInvoiceReport as isInvoiceReportUtils, isPaidGroupPolicyExpenseReport as isPaidGroupPolicyExpenseReportUtils, isReportFieldDisabled, + isReportFieldDisabledForUser, isReportFieldOfTypeTitle, isSettled as isSettledReportUtils, } from '@libs/ReportUtils'; @@ -145,7 +145,7 @@ function MoneyReportView({report, policy, isCombinedReport = false, shouldShowTo } const fieldValue = reportField.value ?? reportField.defaultValue; - const isFieldDisabled = isReportFieldDisabled(report, reportField, policy) || !isAdminOwnerApproverOrReportOwner(report, policy); + const isFieldDisabled = isReportFieldDisabledForUser(report, reportField, policy); const fieldKey = getReportFieldKey(reportField.fieldID); const violation = isFieldDisabled ? undefined : getFieldViolation(violations, reportField); diff --git a/src/libs/ReportUtils.ts b/src/libs/ReportUtils.ts index 8a5dc27950b1..30a43be25c7a 100644 --- a/src/libs/ReportUtils.ts +++ b/src/libs/ReportUtils.ts @@ -4155,6 +4155,15 @@ function isReportFieldDisabled(report: OnyxEntry, reportField: OnyxEntry return reportField?.type === CONST.REPORT_FIELD_TYPES.FORMULA; } +/** + * Determines if a report field should be disabled for the current user. + * A field is considered disabled if it is disabled by the report configuration itself + * or if the user is not an admin, owner, approver, or the report owner. + */ +function isReportFieldDisabledForUser(report: OnyxEntry, reportField: OnyxEntry, policy: OnyxEntry): boolean { + return isReportFieldDisabled(report, reportField, policy) || !isAdminOwnerApproverOrReportOwner(report, policy); +} + /** * Given a set of report fields, return the field that refers to title */ @@ -12702,6 +12711,7 @@ export { isReportManuallyReimbursed, isReportDataReady, isReportFieldDisabled, + isReportFieldDisabledForUser, isReportFieldOfTypeTitle, isReportManager, isReportOwner, diff --git a/src/pages/EditReportFieldPage.tsx b/src/pages/EditReportFieldPage.tsx index c9931eb2b953..12528ef9021c 100644 --- a/src/pages/EditReportFieldPage.tsx +++ b/src/pages/EditReportFieldPage.tsx @@ -18,10 +18,10 @@ import type {EditRequestNavigatorParamList} from '@libs/Navigation/types'; import { getReportFieldKey, hasViolations as hasViolationsReportUtils, - isAdminOwnerApproverOrReportOwner, isInvoiceReport, isPaidGroupPolicyExpenseReport, isReportFieldDisabled, + isReportFieldDisabledForUser, isReportFieldOfTypeTitle, } from '@libs/ReportUtils'; import CONST from '@src/CONST'; @@ -43,7 +43,7 @@ function EditReportFieldPage({route}: EditReportFieldPageProps) { const [recentlyUsedReportFields] = useOnyx(ONYXKEYS.RECENTLY_USED_REPORT_FIELDS, {canBeMissing: true}); const reportField = report?.fieldList?.[fieldKey] ?? policy?.fieldList?.[fieldKey]; const policyField = policy?.fieldList?.[fieldKey] ?? reportField; - const isDisabled = isReportFieldDisabled(report, reportField, policy) || !isAdminOwnerApproverOrReportOwner(report, policy); + const isDisabled = isReportFieldDisabledForUser(report, reportField, policy); const {isBetaEnabled} = usePermissions(); const isASAPSubmitBetaEnabled = isBetaEnabled(CONST.BETAS.ASAP_SUBMIT); const session = useSession();