Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
9f0074b
Revert "Merge pull request #77441 from Expensify/revert-pr-75729"
QichenZhu Dec 17, 2025
473ee16
Revert "Merge pull request #77470 from Expensify/revert-77321-fix/77319"
QichenZhu Dec 17, 2025
f472d44
Make SearchChangeApproverPage use new SelectionList
QichenZhu Dec 17, 2025
232dfb0
Hide Bypass approvers when self-approval is disabled in one of the re…
QichenZhu Dec 17, 2025
56e7ae0
Fix react compiler
QichenZhu Dec 17, 2025
db64d51
Merge branch 'Expensify:main' into feat/bulk-change-approver-v2
QichenZhu Dec 18, 2025
57618cb
Remove manual memorization
QichenZhu Dec 18, 2025
9854771
Supress rulesdir/no-inline-useOnyx-selector
QichenZhu Dec 18, 2025
19da25b
Merge remote-tracking branch 'upstream/main' into feat/bulk-change-ap…
QichenZhu Dec 30, 2025
61c2025
Merge branch 'main' into feat/bulk-change-approver-v2
QichenZhu Jan 5, 2026
a56c23f
Merge remote-tracking branch 'upstream/main' into feat/bulk-change-ap…
QichenZhu Feb 10, 2026
51a4d67
Fix linting and type errors
QichenZhu Feb 11, 2026
08b3488
Merge remote-tracking branch 'upstream/main' into feat/bulk-change-ap…
QichenZhu Feb 11, 2026
c20eaec
Merge remote-tracking branch 'upstream/main' into feat/bulk-change-ap…
QichenZhu Feb 24, 2026
f9f1eb4
Add OpenBulkChangeApproverPage command
QichenZhu Feb 24, 2026
a6147d2
Update SearchChangeApproverPage and SearchAddApproverPage
QichenZhu Feb 24, 2026
d72472d
Merge branch 'main' into feat/bulk-change-approver-v2
QichenZhu Feb 25, 2026
4cdbbd1
Merge remote-tracking branch 'upstream/main' into feat/bulk-change-ap…
QichenZhu Mar 2, 2026
aa4932e
Sync with main branch changes to SearchContext
QichenZhu Mar 2, 2026
b9dfa6d
Show spinner during OpenBulkChangeApprover request
QichenZhu Mar 2, 2026
0ede746
Merge remote-tracking branch 'upstream/main' into feat/bulk-change-ap…
QichenZhu Mar 2, 2026
dacce6c
Address review comments
QichenZhu Mar 2, 2026
f6567e4
Fix unit tests
QichenZhu Mar 2, 2026
a2efedb
Select Add approver by default
QichenZhu Mar 2, 2026
b911e45
Merge branch 'main' into feat/bulk-change-approver-v2
QichenZhu Mar 10, 2026
850e2c5
Merge branch 'Expensify:main' into feat/bulk-change-approver-v2
QichenZhu Mar 10, 2026
e7c6a86
Merge branch 'main' into feat/bulk-change-approver-v2
QichenZhu Mar 11, 2026
8ead574
Delete tests/unit/Search/SearchContextTest.tsx
QichenZhu Mar 11, 2026
599fe8e
Merge remote-tracking branch 'upstream/main' into feat/bulk-change-ap…
QichenZhu Mar 19, 2026
3c4a172
Fix type errors
QichenZhu Mar 19, 2026
32b9566
Merge remote-tracking branch 'upstream/main' into feat/bulk-change-ap…
QichenZhu Mar 30, 2026
cbe51f3
Merge branch 'main' into feat/bulk-change-approver-v2
QichenZhu Mar 30, 2026
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
2 changes: 2 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7364,6 +7364,7 @@ const CONST = {
VIEW: 'view',
SUBMIT: 'submit',
APPROVE: 'approve',
CHANGE_APPROVER: 'changeApprover',
PAY: 'pay',
DONE: 'done',
EXPORT_TO_ACCOUNTING: 'exportToAccounting',
Expand All @@ -7381,6 +7382,7 @@ const CONST = {
EDIT: 'edit',
EXPORT: 'export',
APPROVE: 'approve',
CHANGE_APPROVER: 'changeApprover',
PAY: 'pay',
SUBMIT: 'submit',
HOLD: 'hold',
Expand Down
4 changes: 4 additions & 0 deletions src/ONYXKEYS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,9 @@ const ONYXKEYS = {
/** Set when we are loading bank accounts for share page */
IS_LOADING_SHARE_BANK_ACCOUNTS: 'isLoadingShareBankAccounts',

/** Set when we are loading the bulk change approver page */
IS_LOADING_BULK_CHANGE_APPROVER_PAGE: 'isLoadingBulkChangeApproverPage',

/** Is report data loading? */
IS_LOADING_APP: 'isLoadingApp',

Expand Down Expand Up @@ -1391,6 +1394,7 @@ type OnyxValuesMapping = {
[ONYXKEYS.REIMBURSEMENT_ACCOUNT_WORKSPACE_ID]: string;
[ONYXKEYS.IS_LOADING_PAYMENT_METHODS]: boolean;
[ONYXKEYS.IS_LOADING_SHARE_BANK_ACCOUNTS]: boolean;
[ONYXKEYS.IS_LOADING_BULK_CHANGE_APPROVER_PAGE]: boolean;
[ONYXKEYS.IS_LOADING_POLICY_CODING_RULES_PREVIEW]: boolean;
[ONYXKEYS.IS_SEARCH_FILTERS_CARD_DATA_LOADED]: boolean;
[ONYXKEYS.IS_LOADING_SUBSCRIPTION_DATA]: boolean;
Expand Down
2 changes: 2 additions & 0 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -269,6 +269,8 @@ const ROUTES = {
return `search/move-transactions/search/${encodeURIComponent(backTo)}` as const;
},
},
CHANGE_APPROVER_SEARCH_RHP: 'search/change-approver',
CHANGE_APPROVER_ADD_APPROVER_SEARCH_RHP: 'search/change-approver/add',

// 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
4 changes: 4 additions & 0 deletions src/SCREENS.ts
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ const SCREENS = {
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',
CHANGE_APPROVER: {
ROOT: 'Search_Change_Approver_Root',
ADD_APPROVER: 'Search_Change_Approver_Add_Approver',
},
},
SETTINGS: {
ROOT: 'Settings_Root',
Expand Down
41 changes: 32 additions & 9 deletions src/components/Search/SearchContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -172,15 +172,33 @@ function SearchContextProvider({children}: SearchContextProps) {
}
return item.transactions.every(({keyForList}) => transactionIDs[keyForList]?.isSelected);
})
.map(({reportID, action = CONST.SEARCH.ACTION_TYPES.VIEW, total = CONST.DEFAULT_NUMBER_ID, policyID, allActions = [action], currency, chatReportID}) => ({
reportID,
action,
total,
policyID,
allActions,
currency,
chatReportID,
}));
.map(
({
reportID,
action = CONST.SEARCH.ACTION_TYPES.VIEW,
total = CONST.DEFAULT_NUMBER_ID,
policyID,
allActions = [action],
currency,
chatReportID,
managerID,
ownerAccountID,
parentReportActionID,
parentReportID,
}) => ({
reportID,
action,
total,
policyID,
allActions,
currency,
chatReportID,
managerID,
ownerAccountID,
parentReportActionID,
parentReportID,
}),
);
} else if (data.length && data.every(isTransactionListItemType)) {
matchingReports = data
.filter(({keyForList}) => !!keyForList && transactionIDs[keyForList]?.isSelected)
Expand All @@ -196,6 +214,11 @@ function SearchContextProvider({children}: SearchContextProps) {
allActions: item.allActions ?? [action],
currency: item.currency,
chatReportID: item.report?.chatReportID,
managerID: item.report?.managerID,
ownerAccountID: item.report?.ownerAccountID,
parentReportActionID: item.report?.parentReportActionID,
parentReportID: item.report?.parentReportID,
type: item.report?.type,
};
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ const actionTranslationsMap: Record<SearchTransactionAction, TranslationPaths> =
[CONST.SEARCH.ACTION_TYPES.VIEW]: 'common.view',
[CONST.SEARCH.ACTION_TYPES.SUBMIT]: 'common.submit',
[CONST.SEARCH.ACTION_TYPES.APPROVE]: 'iou.approve',
[CONST.SEARCH.ACTION_TYPES.CHANGE_APPROVER]: 'iou.changeApprover.title',
[CONST.SEARCH.ACTION_TYPES.PAY]: 'iou.pay',
[CONST.SEARCH.ACTION_TYPES.EXPORT_TO_ACCOUNTING]: 'common.export',
[CONST.SEARCH.ACTION_TYPES.DONE]: 'common.done',
Expand Down
5 changes: 5 additions & 0 deletions src/components/Search/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,11 @@ type SelectedReports = {
total: number;
currency?: string;
chatReportID: string | undefined;
managerID?: number;
ownerAccountID?: number;
parentReportActionID?: string;
parentReportID?: string;
type?: string;
};

/** Model of payment data used by Search bulk actions */
Expand Down
19 changes: 19 additions & 0 deletions src/hooks/useSearchBulkActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
'QBDSquare',
'CertiniaSquare',
'Pencil',
'Workflows',
]);

const selectedTransactionReportIDs = useMemo(
Expand Down Expand Up @@ -977,6 +978,23 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
});
}

const shouldShowChangeApproverOption =
queryJSON?.type === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT &&
!isAnyTransactionOnHold &&
areSelectedTransactionsIncludedInReports &&
selectedReports.length &&
selectedReports.every((report) => report.allActions.includes(CONST.SEARCH.ACTION_TYPES.CHANGE_APPROVER));

if (shouldShowChangeApproverOption) {
options.push({
icon: expensifyIcons.Workflows,
text: translate('iou.changeApprover.title'),
value: CONST.SEARCH.BULK_ACTION_TYPES.CHANGE_APPROVER,
shouldCloseModalOnSelect: true,
onSelected: () => Navigation.navigate(ROUTES.CHANGE_APPROVER_SEARCH_RHP),
});
}

const shouldShowSubmitOption =
!isOffline &&
areSelectedTransactionsIncludedInReports &&
Expand Down Expand Up @@ -1226,6 +1244,7 @@ function useSearchBulkActions({queryJSON}: UseSearchBulkActionsParams) {
expensifyIcons.Trashcan,
expensifyIcons.RotateLeft,
expensifyIcons.Exclamation,
expensifyIcons.Workflows,
translate,
areAllMatchingItemsSelected,
isOffline,
Expand Down
3 changes: 3 additions & 0 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1585,7 +1585,9 @@ const translations: TranslationDeepObject<typeof en> = {
},
addApprover: {
subtitle: 'Wählen Sie eine zusätzliche genehmigende Person für diesen Bericht, bevor wir ihn durch den restlichen Genehmigungsworkflow leiten.',
bulkSubtitle: 'Wähle eine zusätzliche genehmigende Person für diese Berichte aus, bevor wir sie durch den restlichen Genehmigungs-Workflow leiten.',
},
bulkSubtitle: 'Wählen Sie eine Option, um den Genehmiger für diese Berichte zu ändern.',
},
chooseWorkspace: 'Wähle einen Arbeitsbereich',
routedDueToDEW: (to: string, reason?: string) => `Bericht weitergeleitet an ${to}${reason ? ` weil ${reason}` : ''}`,
Expand Down Expand Up @@ -2464,6 +2466,7 @@ ${amount} für ${merchant} – ${date}`,
title: 'Keine Mitglieder zum Anzeigen',
expensesFromSubtitle: 'Alle Workspace-Mitglieder gehören bereits zu einem bestehenden Genehmigungsworkflow.',
approverSubtitle: 'Alle Genehmigenden gehören zu einem bestehenden Workflow.',
bulkApproverSubtitle: 'Keine Genehmigenden entsprechen den Kriterien für die ausgewählten Berichte.',
},
},
workflowsDelayedSubmissionPage: {
Expand Down
3 changes: 3 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1635,7 +1635,9 @@ const translations = {
},
addApprover: {
subtitle: 'Choose an additional approver for this report before we route through the rest of the approval workflow.',
bulkSubtitle: 'Choose an additional approver for these reports before we route through the rest of the approval workflow.',
},
bulkSubtitle: 'Choose an option to change the approver for these reports.',
},
chooseWorkspace: 'Choose a workspace',
routedDueToDEW: (to: string, reason?: string) => `report routed to ${to}${reason ? ` because ${reason}` : ''}`,
Expand Down Expand Up @@ -2522,6 +2524,7 @@ const translations = {
title: 'No members to display',
expensesFromSubtitle: 'All workspace members already belong to an existing approval workflow.',
approverSubtitle: 'All approvers belong to an existing workflow.',
bulkApproverSubtitle: 'No approvers match the criteria for selected reports.',
},
},
workflowsDelayedSubmissionPage: {
Expand Down
3 changes: 3 additions & 0 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1508,7 +1508,9 @@ const translations: TranslationDeepObject<typeof en> = {
},
addApprover: {
subtitle: 'Elige un aprobador adicional para este informe antes de que lo enviemos por el resto del flujo de aprobación.',
bulkSubtitle: 'Elige un aprobador adicional para estos informes antes de que los enviemos por el resto del flujo de aprobación.',
},
bulkSubtitle: 'Elige una opción para cambiar el aprobador de estos informes.',
},
chooseWorkspace: 'Elige un espacio de trabajo',
routedDueToDEW: (to: string, reason?: string) => `informe enviado a ${to}${reason ? ` porque ${reason}` : ''}`,
Expand Down Expand Up @@ -2380,6 +2382,7 @@ ${amount} para ${merchant} - ${date}`,
title: 'No hay miembros para mostrar',
expensesFromSubtitle: 'Todos los miembros del espacio de trabajo ya pertenecen a un flujo de aprobación existente.',
approverSubtitle: 'Todos los aprobadores pertenecen a un flujo de trabajo existente.',
bulkApproverSubtitle: 'Ningún aprobador coincide con los criterios de los informes seleccionados.',
},
},
workflowsDelayedSubmissionPage: {
Expand Down
3 changes: 3 additions & 0 deletions src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1590,7 +1590,9 @@ const translations: TranslationDeepObject<typeof en> = {
},
addApprover: {
subtitle: 'Choisissez un approbateur supplémentaire pour cette note de frais avant que nous la fassions passer par le reste du flux d’approbation.',
bulkSubtitle: 'Choisissez un approbateur supplémentaire pour ces rapports avant que nous ne les transmettions pour le reste du flux de validation.',
},
bulkSubtitle: 'Choisissez une option pour changer l’approbateur de ces rapports.',
},
chooseWorkspace: 'Choisir un espace de travail',
routedDueToDEW: (to: string, reason?: string) => `note de frais acheminée vers ${to}${reason ? ` parce que ${reason}` : ''}`,
Expand Down Expand Up @@ -2470,6 +2472,7 @@ ${amount} pour ${merchant} - ${date}`,
title: 'Aucun membre à afficher',
expensesFromSubtitle: 'Tous les membres de l’espace de travail appartiennent déjà à un circuit d’approbation existant.',
approverSubtitle: 'Tous les approbateurs appartiennent à un workflow existant.',
bulkApproverSubtitle: 'Aucun approbateur ne correspond aux critères pour les rapports sélectionnés.',
},
},
workflowsDelayedSubmissionPage: {
Expand Down
3 changes: 3 additions & 0 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1584,7 +1584,9 @@ const translations: TranslationDeepObject<typeof en> = {
},
addApprover: {
subtitle: 'Scegli un approvatore aggiuntivo per questo report prima che venga instradato attraverso il resto del flusso di approvazione.',
bulkSubtitle: 'Scegli un approvatore aggiuntivo per questi report prima che li instradiamo attraverso il resto del flusso di approvazione.',
},
bulkSubtitle: "Scegli un'opzione per cambiare l'approvatore di questi report.",
},
chooseWorkspace: 'Scegli uno spazio di lavoro',
routedDueToDEW: (to: string, reason?: string) => `report indirizzato a ${to}${reason ? ` perché ${reason}` : ''}`,
Expand Down Expand Up @@ -2459,6 +2461,7 @@ ${amount} per ${merchant} - ${date}`,
title: 'Nessun membro da visualizzare',
expensesFromSubtitle: 'Tutti i membri dello spazio di lavoro appartengono già a un flusso di approvazione esistente.',
approverSubtitle: 'Tutti gli approvatori appartengono a un workflow esistente.',
bulkApproverSubtitle: 'Nessun approvatore corrisponde ai criteri per i report selezionati.',
},
},
workflowsDelayedSubmissionPage: {
Expand Down
3 changes: 3 additions & 0 deletions src/languages/ja.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1565,7 +1565,9 @@ const translations: TranslationDeepObject<typeof en> = {
},
addApprover: {
subtitle: '残りの承認ワークフローへ回付する前に、このレポートの追加承認者を選択してください。',
bulkSubtitle: '残りの承認ワークフローに回す前に、これらのレポートの追加承認者を選択してください。',
},
bulkSubtitle: 'これらのレポートの承認者を変更する方法を選択してください。',
},
chooseWorkspace: 'ワークスペースを選択',
routedDueToDEW: (to: string, reason?: string) => `レポートは ${to}${reason ? ` ${reason} のため` : ''} に回覧されました`,
Expand Down Expand Up @@ -2434,6 +2436,7 @@ ${date} の ${merchant} への ${amount}`,
title: '表示できるメンバーがいません',
expensesFromSubtitle: 'すべてのワークスペースメンバーは、すでに既存の承認ワークフローに所属しています。',
approverSubtitle: 'すべての承認者は、既存のワークフローに属しています。',
bulkApproverSubtitle: '選択されたレポートの条件に一致する承認者がいません。',
},
},
workflowsDelayedSubmissionPage: {
Expand Down
3 changes: 3 additions & 0 deletions src/languages/nl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1581,7 +1581,9 @@ const translations: TranslationDeepObject<typeof en> = {
},
addApprover: {
subtitle: 'Kies een extra fiatteur voor dit rapport voordat we het door de rest van de fiatteringsworkflow sturen.',
bulkSubtitle: 'Kies een extra fiatteur voor deze rapporten voordat we ze door de rest van de goedkeuringsworkflow sturen.',
},
bulkSubtitle: 'Kies een optie om de fiatteur voor deze rapporten te wijzigen.',
},
chooseWorkspace: 'Kies een werkruimte',
routedDueToDEW: (to: string, reason?: string) => `rapport doorgestuurd naar ${to}${reason ? ` omdat ${reason}` : ''}`,
Expand Down Expand Up @@ -2457,6 +2459,7 @@ ${amount} voor ${merchant} - ${date}`,
title: 'Geen leden om weer te geven',
expensesFromSubtitle: 'Alle werkruimteleden behoren al tot een bestaande goedkeuringsworkflow.',
approverSubtitle: 'Alle fiatteurs behoren tot een bestaand workflow.',
bulkApproverSubtitle: 'Geen goedkeurders komen overeen met de criteria voor de geselecteerde rapporten.',
},
},
workflowsDelayedSubmissionPage: {
Expand Down
3 changes: 3 additions & 0 deletions src/languages/pl.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1580,7 +1580,9 @@ const translations: TranslationDeepObject<typeof en> = {
},
addApprover: {
subtitle: 'Wybierz dodatkowego akceptującego ten raport, zanim przekażemy go dalej w procesie akceptacji.',
bulkSubtitle: 'Wybierz dodatkowego akceptującego dla tych raportów, zanim przekażemy je dalej w pozostałej części procesu zatwierdzania.',
},
bulkSubtitle: 'Wybierz opcję, aby zmienić akceptującego dla tych raportów.',
},
chooseWorkspace: 'Wybierz przestrzeń roboczą',
routedDueToDEW: (to: string, reason?: string) => `raport przekazany do ${to}${reason ? ` bo ${reason}` : ''}`,
Expand Down Expand Up @@ -2453,6 +2455,7 @@ ${amount} dla ${merchant} - ${date}`,
title: 'Brak członków do wyświetlenia',
expensesFromSubtitle: 'Wszyscy członkowie tego obszaru roboczego już należą do istniejącego obiegu zatwierdzania.',
approverSubtitle: 'Wszyscy zatwierdzający należą do istniejącego przepływu pracy.',
bulkApproverSubtitle: 'Żaden akceptujący nie spełnia kryteriów dla wybranych raportów.',
},
},
workflowsDelayedSubmissionPage: {
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 @@ -1578,7 +1578,9 @@ const translations: TranslationDeepObject<typeof en> = {
},
addApprover: {
subtitle: 'Escolha um aprovador adicional para este relatório antes de seguirmos pelo restante do fluxo de aprovação.',
bulkSubtitle: 'Escolha um aprovador adicional para estes relatórios antes de seguirmos pelo restante do fluxo de aprovação.',
},
bulkSubtitle: 'Escolha uma opção para alterar o aprovador destes relatórios.',
},
chooseWorkspace: 'Escolha um workspace',
routedDueToDEW: (to: string, reason?: string) => `relatório encaminhado para ${to}${reason ? ` porque ${reason}` : ''}`,
Expand Down Expand Up @@ -2450,6 +2452,7 @@ ${amount} para ${merchant} - ${date}`,
title: 'Nenhum membro para exibir',
expensesFromSubtitle: 'Todos os membros do espaço de trabalho já pertencem a um fluxo de aprovação existente.',
approverSubtitle: 'Todas as pessoas aprovadoras pertencem a um fluxo de trabalho existente.',
bulkApproverSubtitle: 'Nenhum aprovador corresponde aos critérios para os relatórios selecionados.',
},
},
workflowsDelayedSubmissionPage: {
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 @@ -1536,7 +1536,9 @@ const translations: TranslationDeepObject<typeof en> = {
},
addApprover: {
subtitle: '在将此报表提交到其余审批流程之前,请选择一位额外的审批人。',
bulkSubtitle: '在我们将这些报表提交给其余审批流程之前,请为其选择一位额外审批人。',
},
bulkSubtitle: '选择一个选项来更改这些报表的审批人。',
},
chooseWorkspace: '选择工作区',
routedDueToDEW: (to: string, reason?: string) => `报销单已转交给 ${to}${reason ? ` 因为 ${reason}` : ''}`,
Expand Down Expand Up @@ -2393,6 +2395,7 @@ ${amount},商户:${merchant} - 日期:${date}`,
title: '没有可显示的成员',
expensesFromSubtitle: '所有工作区成员已经属于现有的审批流程。',
approverSubtitle: '所有审批人都属于一个现有的工作流。',
bulkApproverSubtitle: '所选报表中没有符合条件的审批人。',
},
},
workflowsDelayedSubmissionPage: {
Expand Down
5 changes: 5 additions & 0 deletions src/libs/API/parameters/OpenBulkChangeApproverPageParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
type OpenBulkChangeApproverPageParams = {
reportIDList: string[];
};

export default OpenBulkChangeApproverPageParams;
Loading
Loading