From 6b2401f112560e09d747f027d0b851ec2d1cfb26 Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Thu, 9 Oct 2025 03:37:39 +0700 Subject: [PATCH 1/2] Implement confirmation message when toggling off approvals --- src/languages/de.ts | 1 + src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/languages/fr.ts | 1 + src/languages/it.ts | 1 + src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 1 + src/languages/pt-BR.ts | 1 + src/languages/zh-hans.ts | 1 + .../workflows/WorkspaceWorkflowsPage.tsx | 21 +++++++++++++++++++ 11 files changed, 31 insertions(+) diff --git a/src/languages/de.ts b/src/languages/de.ts index e5a41f457502..de64beb60f70 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -2028,6 +2028,7 @@ const translations = { addApprovalsTitle: 'Genehmigungen hinzufügen', addApprovalButton: 'Genehmigungsworkflow hinzufügen', addApprovalTip: 'Dieser Standard-Workflow gilt für alle Mitglieder, es sei denn, es existiert ein spezifischerer Workflow.', + disableApprovalPromptDescription: 'Durch das Deaktivieren von Genehmigungen werden alle vorhandenen Genehmigungsworkflows gelöscht.', approver: 'Genehmiger', addApprovalsDescription: 'Zusätzliche Genehmigung erforderlich, bevor eine Zahlung autorisiert wird.', makeOrTrackPaymentsTitle: 'Zahlungen vornehmen oder verfolgen', diff --git a/src/languages/en.ts b/src/languages/en.ts index 8311778e1698..b55c83081c90 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1999,6 +1999,7 @@ const translations = { submissionFrequency: 'Submission frequency', submissionFrequencyDescription: 'Choose a custom schedule for submitting expenses, or leave this off for realtime updates on spending.', submissionFrequencyDateOfMonth: 'Date of month', + disableApprovalPromptDescription: 'Disabling approvals will erase all existing approval workflows.', addApprovalsTitle: 'Add approvals', addApprovalButton: 'Add approval workflow', addApprovalTip: 'This default workflow applies to all members, unless a more specific workflow exists.', diff --git a/src/languages/es.ts b/src/languages/es.ts index ac4a3da24b43..cf812fa5208f 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1990,6 +1990,7 @@ const translations = { workflowDescription: 'Configure un flujo de trabajo desde el momento en que se produce el gasto, incluida la aprobación y el pago', submissionFrequency: 'Frecuencia de envíos', submissionFrequencyDescription: 'Elige una frecuencia para enviar los gastos, o dejalo desactivado para recibir actualizaciones en tiempo real sobre los gastos.', + disableApprovalPromptDescription: 'Deshabilitar las aprobaciones borrará todos los flujos de trabajo de aprobación existentes.', submissionFrequencyDateOfMonth: 'Fecha del mes', addApprovalsTitle: 'Aprobaciones', addApprovalButton: 'Añadir flujo de aprobación', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index eaadbe8dba6a..c6fcc2c42e79 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -2025,6 +2025,7 @@ const translations = { submissionFrequency: 'Fréquence de soumission', submissionFrequencyDescription: 'Choisissez un calendrier personnalisé pour soumettre les dépenses, ou laissez cette option désactivée pour des mises à jour en temps réel sur les dépenses.', + disableApprovalPromptDescription: "Désactiver les approbations effacera tous les flux de travail d'approbation existants.", submissionFrequencyDateOfMonth: 'Date du mois', addApprovalsTitle: 'Ajouter des approbations', addApprovalButton: "Ajouter un flux de travail d'approbation", diff --git a/src/languages/it.ts b/src/languages/it.ts index 9b2b7e4c5ce5..410968bacadc 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -2015,6 +2015,7 @@ const translations = { workflowDescription: 'Configura un flusso di lavoro dal momento in cui si verifica una spesa, inclusi approvazione e pagamento.', submissionFrequency: 'Frequenza di invio', submissionFrequencyDescription: "Scegli un programma personalizzato per l'invio delle spese, oppure lascia disattivato per aggiornamenti in tempo reale sulle spese.", + disableApprovalPromptDescription: 'Disabilitare le approvazioni eliminerà tutti i flussi di lavoro di approvazione esistenti.', submissionFrequencyDateOfMonth: 'Data del mese', addApprovalsTitle: 'Aggiungi approvazioni', addApprovalButton: 'Aggiungi flusso di lavoro di approvazione', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 42a14e8798e6..4a966221697c 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -2008,6 +2008,7 @@ const translations = { workflowDescription: '支出が発生した瞬間から、承認および支払いを含むワークフローを設定します。', submissionFrequency: '提出頻度', submissionFrequencyDescription: '経費提出のカスタムスケジュールを選択するか、支出のリアルタイム更新のためにこれをオフにしておいてください。', + disableApprovalPromptDescription: '承認を無効にすると、既存の承認ワークフローがすべて削除されます。', submissionFrequencyDateOfMonth: '月の日付', addApprovalsTitle: '承認を追加', addApprovalButton: '承認ワークフローを追加', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index c8743061b0c7..84693d72ff40 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -2015,6 +2015,7 @@ const translations = { submissionFrequency: 'Indieningsfrequentie', submissionFrequencyDescription: 'Kies een aangepast schema voor het indienen van onkosten, of laat dit uitgeschakeld voor realtime updates over uitgaven.', submissionFrequencyDateOfMonth: 'Datum van de maand', + disableApprovalPromptDescription: 'Goedkeuringen uitschakelen verwijdert alle bestaande goedkeuringsworkflows.', addApprovalsTitle: 'Goedkeuringen toevoegen', addApprovalButton: 'Goedkeuringsworkflow toevoegen', addApprovalTip: 'Deze standaard workflow is van toepassing op alle leden, tenzij er een specifiekere workflow bestaat.', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 59b7b76c640f..be4bd35aa796 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -2013,6 +2013,7 @@ const translations = { submissionFrequencyDescription: 'Wybierz niestandardowy harmonogram przesyłania wydatków lub pozostaw to wyłączone, aby otrzymywać aktualizacje w czasie rzeczywistym dotyczące wydatków.', submissionFrequencyDateOfMonth: 'Data miesiąca', + disableApprovalPromptDescription: 'Wyłączenie zatwierdzeń usunie wszystkie istniejące przepływy pracy zatwierdzania.', addApprovalsTitle: 'Dodaj zatwierdzenia', addApprovalButton: 'Dodaj przepływ pracy zatwierdzania', addApprovalTip: 'Ten domyślny przepływ pracy dotyczy wszystkich członków, chyba że istnieje bardziej szczegółowy przepływ pracy.', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index e4f939efcb03..994660033b15 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -2015,6 +2015,7 @@ const translations = { submissionFrequency: 'Frequência de envio', submissionFrequencyDescription: 'Escolha um cronograma personalizado para enviar despesas ou deixe isso desativado para atualizações em tempo real sobre gastos.', submissionFrequencyDateOfMonth: 'Data do mês', + disableApprovalPromptDescription: 'Desativar aprovações removerá todos os fluxos de trabalho de aprovação existentes.', addApprovalsTitle: 'Adicionar aprovações', addApprovalButton: 'Adicionar fluxo de trabalho de aprovação', addApprovalTip: 'Este fluxo de trabalho padrão se aplica a todos os membros, a menos que exista um fluxo de trabalho mais específico.', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 4632cbee4837..934bd529d034 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -1989,6 +1989,7 @@ const translations = { submissionFrequencyDescription: '选择自定义的费用提交时间表,或者关闭此选项以实时更新支出。', submissionFrequencyDateOfMonth: '月份日期', addApprovalsTitle: '添加审批', + disableApprovalPromptDescription: '禁用审批将删除所有现有的审批工作流程。', addApprovalButton: '添加审批工作流程', addApprovalTip: '此默认工作流程适用于所有成员,除非存在更具体的工作流程。', approver: '审批人', diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx index 260384c5f7d5..7913b6baf3c2 100644 --- a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx +++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx @@ -78,6 +78,7 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { const [personalDetails] = useOnyx(ONYXKEYS.PERSONAL_DETAILS_LIST, {canBeMissing: false}); const [reimbursementAccount] = useOnyx(ONYXKEYS.REIMBURSEMENT_ACCOUNT, {canBeMissing: true}); const [reimbursementAccountDraft] = useOnyx(ONYXKEYS.FORMS.REIMBURSEMENT_ACCOUNT_FORM_DRAFT, {canBeMissing: true}); + const [isDisableApprovalsConfirmModalOpen, setIsDisableApprovalsConfirmModalOpen] = useState(false); const {approvalWorkflows, availableMembers, usedApproverEmails} = useMemo( () => convertPolicyEmployeesToApprovalWorkflows({ @@ -148,6 +149,11 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const confirmDisableApprovals = useCallback(() => { + setIsDisableApprovalsConfirmModalOpen(false); + setWorkspaceApprovalMode(route.params.policyID, policy?.owner ?? '', CONST.POLICY.APPROVAL_MODE.OPTIONAL); + }, [route.params.policyID, policy?.owner]); + // User should be allowed to add new Approval Workflow only if he's upgraded to Control Plan, otherwise redirected to the Upgrade Page const addApprovalAction = useCallback(() => { setApprovalWorkflow({ @@ -219,6 +225,11 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { subtitle: isSmartLimitEnabled ? translate('workspace.moreFeatures.workflows.disableApprovalPrompt') : translate('workflowsPage.addApprovalsDescription'), switchAccessibilityLabel: isSmartLimitEnabled ? translate('workspace.moreFeatures.workflows.disableApprovalPrompt') : translate('workflowsPage.addApprovalsDescription'), onToggle: (isEnabled: boolean) => { + const hasCustomApprovalWorkflows = policy?.approvalMode === CONST.POLICY.APPROVAL_MODE.ADVANCED; + if (!isEnabled && hasCustomApprovalWorkflows) { + setIsDisableApprovalsConfirmModalOpen(true); + return; + } setWorkspaceApprovalMode(route.params.policyID, policy?.owner ?? '', isEnabled ? updateApprovalMode : CONST.POLICY.APPROVAL_MODE.OPTIONAL); }, subMenuItems: ( @@ -441,6 +452,16 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { /> )} + setIsDisableApprovalsConfirmModalOpen(false)} + prompt={translate('workflowsPage.disableApprovalPromptDescription')} + confirmText={translate('common.disable')} + cancelText={translate('common.cancel')} + danger + /> ); From cad0499da831ad06c520b69eff27730701d30e1d Mon Sep 17 00:00:00 2001 From: nkdengineer Date: Sun, 12 Oct 2025 08:54:22 +0700 Subject: [PATCH 2/2] always show the confirm modal --- src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx index 00894ebbb930..314f6d7e55bf 100644 --- a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx +++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx @@ -225,8 +225,7 @@ function WorkspaceWorkflowsPage({policy, route}: WorkspaceWorkflowsPageProps) { subtitle: isSmartLimitEnabled ? translate('workspace.moreFeatures.workflows.disableApprovalPrompt') : translate('workflowsPage.addApprovalsDescription'), switchAccessibilityLabel: isSmartLimitEnabled ? translate('workspace.moreFeatures.workflows.disableApprovalPrompt') : translate('workflowsPage.addApprovalsDescription'), onToggle: (isEnabled: boolean) => { - const hasCustomApprovalWorkflows = policy?.approvalMode === CONST.POLICY.APPROVAL_MODE.ADVANCED; - if (!isEnabled && hasCustomApprovalWorkflows) { + if (!isEnabled) { setIsDisableApprovalsConfirmModalOpen(true); return; }