Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
c044bf6
Basic setup
parasharrajat Jun 13, 2025
04c182b
Change approver main page
parasharrajat Jun 13, 2025
4f00e01
Add change approver secondary action
parasharrajat Jun 13, 2025
d1f20d6
App approver page and basic action
parasharrajat Jun 13, 2025
53f4c72
Add add Approver page.
parasharrajat Jun 16, 2025
4b900d4
Update not found page logic
parasharrajat Jun 16, 2025
899f341
Revert Add approver changes for next PR
parasharrajat Jul 22, 2025
1780b3d
Merge branch 'main' of github.com:Expensify/App into parasharrajat/ch…
parasharrajat Jul 22, 2025
5cd6f09
Revert Add approver changes
parasharrajat Jul 22, 2025
f0068aa
Fix issues
parasharrajat Jul 22, 2025
07b222e
Remove Extra screen
parasharrajat Jul 22, 2025
0e5720b
Merge branch 'main' of github.com:Expensify/App into parasharrajat/ch…
parasharrajat Aug 11, 2025
520b0e9
Navigation fixes
parasharrajat Aug 11, 2025
9418aca
Enable bypass approver option only when manager is not admin
parasharrajat Aug 11, 2025
bfd9699
Add Assign Report to me action
parasharrajat Aug 11, 2025
42d3383
Add assignCurrentUserAsApprover action
parasharrajat Aug 11, 2025
ff8538f
Update the Action preview
parasharrajat Aug 12, 2025
cdb2188
Fix spellings
parasharrajat Aug 12, 2025
1b6448d
translations
parasharrajat Aug 12, 2025
047d2fb
Remove comment
parasharrajat Aug 12, 2025
4467066
Fix rendering on native
parasharrajat Aug 12, 2025
ee5aaa8
Updates
parasharrajat Aug 13, 2025
8474ef5
Merge branch 'main' of github.com:Expensify/App into parasharrajat/ch…
parasharrajat Aug 13, 2025
f3f202c
Fix spell
parasharrajat Aug 13, 2025
ce4de4f
Merge branch 'main' of github.com:Expensify/App into parasharrajat/ch…
parasharrajat Aug 18, 2025
37eab51
Refactor and cleanup
parasharrajat Aug 18, 2025
5e530b3
Remove ACTION_REROUTE
parasharrajat Aug 18, 2025
720a622
Add optimistic next step
parasharrajat Aug 18, 2025
a5f4375
Remove extra route
parasharrajat Aug 18, 2025
8346798
Remove external data dependency on build optimistic action function
parasharrajat Aug 18, 2025
81e289f
Merge branch 'main' of github.com:Expensify/App into parasharrajat/ch…
parasharrajat Aug 19, 2025
8b343d7
Check correct manager of the report
parasharrajat Aug 19, 2025
d22cce1
Fix types
parasharrajat Aug 19, 2025
523f52e
Merge branch 'main' of github.com:Expensify/App into parasharrajat/ch…
parasharrajat Aug 19, 2025
a5567b2
Rename action
parasharrajat Aug 19, 2025
ec8c27d
Merge branch 'main' of github.com:Expensify/App into parasharrajat/ch…
parasharrajat Aug 19, 2025
e5757a2
Merge branch 'main' of github.com:Expensify/App into parasharrajat/ch…
parasharrajat Aug 22, 2025
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
9 changes: 9 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1083,6 +1083,7 @@ const CONST = {
HOLD: 'hold',
DOWNLOAD_PDF: 'downloadPDF',
CHANGE_WORKSPACE: 'changeWorkspace',
CHANGE_APPROVER: 'changeApprover',
VIEW_DETAILS: 'viewDetails',
DELETE: 'delete',
RETRACT: 'retract',
Expand Down Expand Up @@ -6712,6 +6713,14 @@ const CONST = {
description: `workspace.upgrade.approvals.description` as const,
icon: 'AdvancedApprovalsSquare',
},
multiApprovalLevels: {
id: 'multiApprovalLevels' as const,
alias: 'multi-approval-levels' as const,
name: 'Multiple approval levels' as const,
title: `workspace.upgrade.multiApprovalLevels.title` as const,
description: `workspace.upgrade.multiApprovalLevels.description` as const,
icon: 'AdvancedApprovalsSquare',
},
glCodes: {
id: 'glCodes' as const,
alias: 'gl-codes',
Expand Down
4 changes: 4 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,10 @@ const ROUTES = {
route: 'r/:reportID/settings/visibility',
getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/settings/visibility` as const, backTo),
},
REPORT_CHANGE_APPROVER: {
route: 'r/:reportID/change-approver',
getRoute: (reportID: string, backTo?: string) => getUrlWithBackToParam(`r/${reportID}/change-approver` as const, backTo),
},
SPLIT_BILL_DETAILS: {
route: 'r/:reportID/split/:reportActionID',
getRoute: (reportID: string | undefined, reportActionID: string, backTo?: string) => {
Expand Down
5 changes: 4 additions & 1 deletion src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -228,6 +228,7 @@ const SCREENS = {
DEBUG: 'Debug',
ADD_UNREPORTED_EXPENSE: 'AddUnreportedExpense',
SCHEDULE_CALL: 'ScheduleCall',
REPORT_CHANGE_APPROVER: 'Report_Change_Approver',
MERGE_TRANSACTION: 'MergeTransaction',
},
PUBLIC_CONSOLE_DEBUG: 'Console_Debug',
Expand Down Expand Up @@ -767,7 +768,9 @@ const SCREENS = {
BOOK: 'ScheduleCall_Book',
CONFIRMATION: 'ScheduleCall_Confirmation',
},

REPORT_CHANGE_APPROVER: {
ROOT: 'Report_Change_Approver_Root',
},
TEST_TOOLS_MODAL: {
ROOT: 'TestToolsModal_Root',
},
Expand Down
13 changes: 13 additions & 0 deletions src/components/MoneyReportHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import {deleteAppReport, downloadReportPDF, exportReportToCSV, exportReportToPDF
import {queueExportSearchWithTemplate} from '@libs/actions/Search';
import getNonEmptyStringOnyxID from '@libs/getNonEmptyStringOnyxID';
import getPlatform from '@libs/getPlatform';
import Log from '@libs/Log';
import {getThreadReportIDsForTransactions, getTotalAmountForIOUReportPreviewButton} from '@libs/MoneyRequestReportUtils';
import Navigation, {navigationRef} from '@libs/Navigation/Navigation';
import type {PlatformStackRouteProp} from '@libs/Navigation/PlatformStackNavigation/types';
Expand Down Expand Up @@ -969,6 +970,18 @@ function MoneyReportHeader({
Navigation.navigate(ROUTES.REPORT_WITH_ID_CHANGE_WORKSPACE.getRoute(moneyRequestReport.reportID, Navigation.getActiveRoute()));
},
},
[CONST.REPORT.SECONDARY_ACTIONS.CHANGE_APPROVER]: {
text: translate('iou.changeApprover.title'),
icon: Expensicons.Workflows,
value: CONST.REPORT.SECONDARY_ACTIONS.CHANGE_APPROVER,
onSelected: () => {
if (!moneyRequestReport) {
Log.warn('Change approver secondary action triggered without moneyRequestReport data.');
return;
}
Navigation.navigate(ROUTES.REPORT_CHANGE_APPROVER.getRoute(moneyRequestReport.reportID, Navigation.getActiveRoute()));
},
},
[CONST.REPORT.SECONDARY_ACTIONS.DELETE]: {
text: translate('common.delete'),
icon: Expensicons.Trashcan,
Expand Down
24 changes: 24 additions & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import type {
CardInfoParams,
CardNextPaymentParams,
CategoryNameParams,
ChangedApproverMessageParams,
ChangeFieldParams,
ChangeOwnerDuplicateSubscriptionParams,
ChangeOwnerHasFailedSettlementsParams,
Expand Down Expand Up @@ -292,6 +293,7 @@ import type {
WeSentYouMagicSignInLinkParams,
WorkEmailMergingBlockedParams,
WorkEmailResendCodeParams,
WorkflowSettingsParam,
WorkspaceLockedPlanTypeParams,
WorkspaceMemberList,
WorkspaceMembersCountParams,
Expand Down Expand Up @@ -1385,6 +1387,22 @@ const translations = {
rates: 'Preise',
submitsTo: ({name}: SubmitsToParams) => `Übermittelt an ${name}`,
moveExpenses: () => ({one: 'Ausgabe verschieben', other: 'Ausgaben verschieben'}),
changeApprover: {
title: 'Genehmiger ändern',
subtitle: 'Wählen Sie eine Option, um den Genehmiger für diesen Bericht zu ändern.',
description: ({workflowSettingLink}: WorkflowSettingsParam) =>
`Sie können den Genehmiger auch dauerhaft für alle Berichte in Ihren <a href="${workflowSettingLink}">Workflow-Einstellungen</a> ändern.`,
changedApproverMessage: ({managerID}: ChangedApproverMessageParams) => `änderte den Genehmiger zu <mention-user accountID="${managerID}"/>`,
actions: {
addApprover: 'Genehmiger hinzufügen',
addApproverSubtitle: 'Fügen Sie dem bestehenden Workflow einen zusätzlichen Genehmiger hinzu.',
bypassApprovers: 'Genehmiger umgehen',
bypassApproversSubtitle: 'Weisen Sie sich selbst als endgültigen Genehmiger zu und überspringen Sie alle verbleibenden Genehmiger.',
},
addApprover: {
subtitle: 'Wählen Sie einen zusätzlichen Genehmiger für diesen Bericht, bevor wir ihn durch den Rest des Genehmigungs-Workflows leiten.',
},
},
},
transactionMerge: {
listPage: {
Expand Down Expand Up @@ -5485,6 +5503,12 @@ const translations = {
'Mehrstufige Tags helfen Ihnen, Ausgaben präziser zu verfolgen. Weisen Sie jedem Posten mehrere Tags zu – wie Abteilung, Kunde oder Kostenstelle – um den vollständigen Kontext jeder Ausgabe zu erfassen. Dies ermöglicht detailliertere Berichte, Genehmigungs-Workflows und Buchhaltungsexporte.',
onlyAvailableOnPlan: 'Mehrstufige Tags sind nur im Control-Plan verfügbar, beginnend bei',
},
[CONST.UPGRADE_FEATURE_INTRO_MAPPING.multiApprovalLevels.id]: {
title: 'Mehrere Genehmigungsstufen',
description:
'Mehrere Genehmigungsstufen ist ein Workflow-Tool für Unternehmen, die mehr als eine Person benötigen, um einen Bericht zu genehmigen, bevor er erstattet werden kann.',
onlyAvailableOnPlan: 'Mehrere Genehmigungsstufen sind nur im Control-Plan verfügbar, beginnend bei ',
},
pricing: {
perActiveMember: 'pro aktivem Mitglied pro Monat.',
perMember: 'pro Mitglied pro Monat.',
Expand Down
23 changes: 23 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import type {
CardInfoParams,
CardNextPaymentParams,
CategoryNameParams,
ChangedApproverMessageParams,
ChangeFieldParams,
ChangeOwnerDuplicateSubscriptionParams,
ChangeOwnerHasFailedSettlementsParams,
Expand Down Expand Up @@ -281,6 +282,7 @@ import type {
WeSentYouMagicSignInLinkParams,
WorkEmailMergingBlockedParams,
WorkEmailResendCodeParams,
WorkflowSettingsParam,
WorkspaceLockedPlanTypeParams,
WorkspaceMemberList,
WorkspaceMembersCountParams,
Expand Down Expand Up @@ -1369,6 +1371,22 @@ const translations = {
rates: 'Rates',
submitsTo: ({name}: SubmitsToParams) => `Submits to ${name}`,
moveExpenses: () => ({one: 'Move expense', other: 'Move expenses'}),
changeApprover: {
title: 'Change approver',
subtitle: 'Choose an option to change the approver for this report.',
description: ({workflowSettingLink}: WorkflowSettingsParam) =>
`You can also change the approver permanently for all reports in your <a href="${workflowSettingLink}">workflow settings</a>.`,
changedApproverMessage: ({managerID}: ChangedApproverMessageParams) => `changed the approver to <mention-user accountID="${managerID}"/>`,
actions: {
addApprover: 'Add approver',
addApproverSubtitle: 'Add an additional approver to the existing workflow.',
bypassApprovers: 'Bypass approvers',
bypassApproversSubtitle: 'Assign yourself as final approver and skip any remaining approvers.',
},
addApprover: {
subtitle: 'Choose an additional approver for this report before we route through the rest of the approval workflow.',
},
},
},
transactionMerge: {
listPage: {
Expand Down Expand Up @@ -5463,6 +5481,11 @@ const translations = {
'Multi-Level Tags help you track expenses with greater precision. Assign multiple tags to each line item—such as department, client, or cost center—to capture the full context of every expense. This enables more detailed reporting, approval workflows, and accounting exports.',
onlyAvailableOnPlan: 'Multi-level tags are only available on the Control plan, starting at ',
},
[CONST.UPGRADE_FEATURE_INTRO_MAPPING.multiApprovalLevels.id]: {
title: 'Multiple approval levels',
description: 'Multiple approval levels is a workflow tool for companies that require more than one person to approve a report before it can be reimbursed.',
onlyAvailableOnPlan: 'Multiple approval levels are only available on the Control plan, starting at ',
},
pricing: {
perActiveMember: 'per active member per month.',
perMember: 'per member per month.',
Expand Down
24 changes: 24 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ import type {
CardInfoParams,
CardNextPaymentParams,
CategoryNameParams,
ChangedApproverMessageParams,
ChangeFieldParams,
ChangeOwnerDuplicateSubscriptionParams,
ChangeOwnerHasFailedSettlementsParams,
Expand Down Expand Up @@ -280,6 +281,7 @@ import type {
WeSentYouMagicSignInLinkParams,
WorkEmailMergingBlockedParams,
WorkEmailResendCodeParams,
WorkflowSettingsParam,
WorkspaceLockedPlanTypeParams,
WorkspaceMemberList,
WorkspaceMembersCountParams,
Expand Down Expand Up @@ -1366,6 +1368,22 @@ const translations = {
rates: 'Tasas',
submitsTo: ({name}: SubmitsToParams) => `Se envía a ${name}`,
moveExpenses: () => ({one: 'Mover gasto', other: 'Mover gastos'}),
changeApprover: {
title: 'Cambiar aprobador',
subtitle: 'Elige una opción para cambiar el aprobador de este informe.',
description: ({workflowSettingLink}: WorkflowSettingsParam) =>
`También puedes cambiar el aprobador de forma permanente para todos los informes en tu <a href="${workflowSettingLink}">configuración de flujo de trabajo</a>.`,
changedApproverMessage: ({managerID}: ChangedApproverMessageParams) => `cambió el aprobador a <mention-user accountID="${managerID}"/>`,
actions: {
addApprover: 'Añadir aprobador',
addApproverSubtitle: 'Añade un aprobador adicional al flujo de trabajo existente.',
bypassApprovers: 'Omitir aprobadores',
bypassApproversSubtitle: 'Asígnate como aprobador final y omite a los aprobadores restantes.',
},
addApprover: {
subtitle: 'Elige un aprobador adicional para este informe antes de que lo enviemos por el resto del flujo de aprobación.',
},
},
},
transactionMerge: {
listPage: {
Expand Down Expand Up @@ -5496,6 +5514,12 @@ const translations = {
'Las etiquetas multinivel te ayudan a llevar un control más preciso de los gastos. Asigna múltiples etiquetas a cada partida, como departamento, cliente o centro de costos, para capturar el contexto completo de cada gasto. Esto permite informes más detallados, flujos de aprobación y exportaciones contables.',
onlyAvailableOnPlan: 'Las etiquetas multinivel solo están disponibles en el plan Control, a partir de ',
},
[CONST.UPGRADE_FEATURE_INTRO_MAPPING.multiApprovalLevels.id]: {
title: 'Múltiples niveles de aprobación',
description:
'Los múltiples niveles de aprobación son una herramienta de flujo de trabajo para empresas que requieren que más de una persona apruebe un informe antes de que pueda ser reembolsado.',
onlyAvailableOnPlan: 'Los múltiples niveles de aprobación solo están disponibles en el plan Controlar, a partir de ',
},
note: {
upgradeWorkspace: 'Mejore su espacio de trabajo para acceder a esta función, o',
learnMore: 'más información',
Expand Down
24 changes: 24 additions & 0 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import type {
CardInfoParams,
CardNextPaymentParams,
CategoryNameParams,
ChangedApproverMessageParams,
ChangeFieldParams,
ChangeOwnerDuplicateSubscriptionParams,
ChangeOwnerHasFailedSettlementsParams,
Expand Down Expand Up @@ -292,6 +293,7 @@ import type {
WeSentYouMagicSignInLinkParams,
WorkEmailMergingBlockedParams,
WorkEmailResendCodeParams,
WorkflowSettingsParam,
WorkspaceLockedPlanTypeParams,
WorkspaceMemberList,
WorkspaceMembersCountParams,
Expand Down Expand Up @@ -1388,6 +1390,22 @@ const translations = {
rates: 'Tarifs',
submitsTo: ({name}: SubmitsToParams) => `Soumet à ${name}`,
moveExpenses: () => ({one: 'Déplacer la dépense', other: 'Déplacer les dépenses'}),
changeApprover: {
title: "Modifier l'approbateur",
subtitle: "Choisissez une option pour modifier l'approbateur de ce rapport.",
description: ({workflowSettingLink}: WorkflowSettingsParam) =>
`Vous pouvez également modifier l'approbateur de manière permanente pour tous les rapports dans vos <a href="${workflowSettingLink}">paramètres de flux de travail</a>.`,
changedApproverMessage: ({managerID}: ChangedApproverMessageParams) => `a changé l'approbateur en <mention-user accountID="${managerID}"/>`,
actions: {
addApprover: 'Ajouter un approbateur',
addApproverSubtitle: 'Ajouter un approbateur supplémentaire au flux de travail existant.',
bypassApprovers: 'Contourner les approbateurs',
bypassApproversSubtitle: 'Vous désigner comme approbateur final et ignorer les autres approbateurs.',
},
addApprover: {
subtitle: "Choisissez un approbateur supplémentaire pour ce rapport avant de le faire passer par le reste du flux de travail d'approbation.",
},
},
},
transactionMerge: {
listPage: {
Expand Down Expand Up @@ -5499,6 +5517,12 @@ const translations = {
"Les balises multi-niveaux vous aident à suivre les dépenses avec plus de précision. Assignez plusieurs balises à chaque poste—comme le département, le client ou le centre de coût—pour capturer le contexte complet de chaque dépense. Cela permet des rapports plus détaillés, des flux de travail d'approbation et des exportations comptables.",
onlyAvailableOnPlan: 'Les balises multi-niveaux sont uniquement disponibles sur le plan Control, à partir de',
},
[CONST.UPGRADE_FEATURE_INTRO_MAPPING.multiApprovalLevels.id]: {
title: "Niveaux d'approbation multiples",
description:
"Les niveaux d'approbation multiples sont un outil de flux de travail pour les entreprises qui exigent que plus d'une personne approuve un rapport avant qu'il ne puisse être remboursé.",
onlyAvailableOnPlan: "Les niveaux d'approbation multiples sont uniquement disponibles sur le plan Control, à partir de ",
},
pricing: {
perActiveMember: 'par membre actif par mois.',
perMember: 'par membre par mois.',
Expand Down
24 changes: 24 additions & 0 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ import type {
CardInfoParams,
CardNextPaymentParams,
CategoryNameParams,
ChangedApproverMessageParams,
ChangeFieldParams,
ChangeOwnerDuplicateSubscriptionParams,
ChangeOwnerHasFailedSettlementsParams,
Expand Down Expand Up @@ -292,6 +293,7 @@ import type {
WeSentYouMagicSignInLinkParams,
WorkEmailMergingBlockedParams,
WorkEmailResendCodeParams,
WorkflowSettingsParam,
WorkspaceLockedPlanTypeParams,
WorkspaceMemberList,
WorkspaceMembersCountParams,
Expand Down Expand Up @@ -1381,6 +1383,22 @@ const translations = {
rates: 'Tariffe',
submitsTo: ({name}: SubmitsToParams) => `Invia a ${name}`,
moveExpenses: () => ({one: 'Sposta spesa', other: 'Sposta spese'}),
changeApprover: {
title: 'Cambia approvatore',
subtitle: "Scegli un'opzione per cambiare l'approvatore di questo report.",
description: ({workflowSettingLink}: WorkflowSettingsParam) =>
`Puoi anche cambiare l'approvatore in modo permanente per tutti i report nelle tue <a href="${workflowSettingLink}">impostazioni del flusso di lavoro</a>.`,
changedApproverMessage: ({managerID}: ChangedApproverMessageParams) => `ha cambiato l'approvatore in <mention-user accountID="${managerID}"/>`,
actions: {
addApprover: 'Aggiungi approvatore',
addApproverSubtitle: 'Aggiungi un approvatore aggiuntivo al flusso di lavoro esistente.',
bypassApprovers: 'Ignora approvatori',
bypassApproversSubtitle: 'Assegna te stesso come approvatore finale e salta gli approvatori rimanenti.',
},
addApprover: {
subtitle: 'Scegli un approvatore aggiuntivo per questo report prima di instradarlo attraverso il resto del flusso di lavoro di approvazione.',
},
},
},
transactionMerge: {
listPage: {
Expand Down Expand Up @@ -5498,6 +5516,12 @@ const translations = {
'I tag multilivello ti aiutano a monitorare le spese con maggiore precisione. Assegna più tag a ciascuna voce, come reparto, cliente o centro di costo, per catturare il contesto completo di ogni spesa. Questo consente report più dettagliati, flussi di lavoro di approvazione ed esportazioni contabili.',
onlyAvailableOnPlan: 'I tag multilivello sono disponibili solo nel piano Control, a partire da',
},
[CONST.UPGRADE_FEATURE_INTRO_MAPPING.multiApprovalLevels.id]: {
title: 'Livelli di approvazione multipli',
description:
'I livelli di approvazione multipli sono uno strumento di flusso di lavoro per le aziende che richiedono a più di una persona di approvare un report prima che possa essere rimborsato.',
onlyAvailableOnPlan: 'I livelli di approvazione multipli sono disponibili solo nel piano Control, a partire da ',
},
pricing: {
perActiveMember: 'per membro attivo al mese.',
perMember: 'per membro al mese.',
Expand Down
Loading
Loading