From bac70d538200447da1812dad9600bdd45e156f47 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Tue, 23 Jul 2024 10:13:12 +0200 Subject: [PATCH 1/4] Remove delayed submission beta, add advanced approval beta --- src/CONST.ts | 2 +- src/languages/en.ts | 1 + src/languages/es.ts | 1 + src/libs/Permissions.ts | 6 +- .../workflows/WorkspaceWorkflowsPage.tsx | 134 +++++++++++------- 5 files changed, 85 insertions(+), 59 deletions(-) diff --git a/src/CONST.ts b/src/CONST.ts index a1193fd8bf32b..df531f5cef0a0 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -366,7 +366,7 @@ const CONST = { VIOLATIONS: 'violations', DUPE_DETECTION: 'dupeDetection', P2P_DISTANCE_REQUESTS: 'p2pDistanceRequests', - WORKFLOWS_DELAYED_SUBMISSION: 'workflowsDelayedSubmission', + WORKFLOWS_ADVANCED_APPROVAL: 'workflowsAdvancedApproval', SPOTNANA_TRAVEL: 'spotnanaTravel', NETSUITE_ON_NEW_EXPENSIFY: 'netsuiteOnNewExpensify', REPORT_FIELDS_FEATURE: 'reportFieldsFeature', diff --git a/src/languages/en.ts b/src/languages/en.ts index 0275c90d551b4..0d93e69fd1e0b 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1242,6 +1242,7 @@ export default { submissionFrequency: 'Submission frequency', submissionFrequencyDateOfMonth: 'Date of month', addApprovalsTitle: 'Add approvals', + addApprovalButton: 'Add approval workflow', approver: 'Approver', connectBankAccount: 'Connect bank account', addApprovalsDescription: 'Require additional approval before authorizing a payment.', diff --git a/src/languages/es.ts b/src/languages/es.ts index 8a9c5f1e81d9c..5bb952d1107fb 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1251,6 +1251,7 @@ export default { submissionFrequency: 'Frecuencia de envíos', submissionFrequencyDateOfMonth: 'Fecha del mes', addApprovalsTitle: 'Requerir aprobaciones', + addApprovalButton: 'Añadir flujo de trabajo de aprobación', approver: 'Aprobador', connectBankAccount: 'Conectar cuenta bancaria', addApprovalsDescription: 'Requiere una aprobación adicional antes de autorizar un pago.', diff --git a/src/libs/Permissions.ts b/src/libs/Permissions.ts index 23aabcf3c6d01..294b42a8e5380 100644 --- a/src/libs/Permissions.ts +++ b/src/libs/Permissions.ts @@ -28,8 +28,8 @@ function canUseP2PDistanceRequests(betas: OnyxEntry, iouType: IOUType | return !!betas?.includes(CONST.BETAS.P2P_DISTANCE_REQUESTS) || canUseAllBetas(betas) || iouType === CONST.IOU.TYPE.TRACK; } -function canUseWorkflowsDelayedSubmission(betas: OnyxEntry): boolean { - return !!betas?.includes(CONST.BETAS.WORKFLOWS_DELAYED_SUBMISSION) || canUseAllBetas(betas); +function canUseWorkflowsAdvancedApproval(betas: OnyxEntry): boolean { + return !!betas?.includes(CONST.BETAS.WORKFLOWS_ADVANCED_APPROVAL) || canUseAllBetas(betas); } function canUseSpotnanaTravel(betas: OnyxEntry): boolean { @@ -70,7 +70,7 @@ export default { canUseViolations, canUseDupeDetection, canUseP2PDistanceRequests, - canUseWorkflowsDelayedSubmission, + canUseWorkflowsAdvancedApproval, canUseSpotnanaTravel, canUseNetSuiteIntegration, canUseSageIntacctIntegration, diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx index 11c2d370fc3d4..254b02925f146 100644 --- a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx +++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx @@ -5,6 +5,7 @@ import {ActivityIndicator, View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; import ConfirmModal from '@components/ConfirmModal'; +import * as Expensicons from '@components/Icon/Expensicons'; import * as Illustrations from '@components/Icon/Illustrations'; import MenuItem from '@components/MenuItem'; import OfflineWithFeedback from '@components/OfflineWithFeedback'; @@ -52,7 +53,7 @@ function WorkspaceWorkflowsPage({policy, betas, route}: WorkspaceWorkflowsPagePr const policyApproverEmail = policy?.approver; const policyApproverName = useMemo(() => PersonalDetailsUtils.getPersonalDetailByEmail(policyApproverEmail ?? '')?.displayName ?? policyApproverEmail, [policyApproverEmail]); const containerStyle = useMemo(() => [styles.ph8, styles.mhn8, styles.ml11, styles.pv3, styles.pr0, styles.pl4, styles.mr0, styles.widthAuto, styles.mt4], [styles]); - const canUseDelayedSubmission = Permissions.canUseWorkflowsDelayedSubmission(betas); + const canUseAdvancedApproval = Permissions.canUseWorkflowsAdvancedApproval(betas); const [isCurrencyModalOpen, setIsCurrencyModalOpen] = useState(false); const displayNameForAuthorizedPayer = useMemo( @@ -97,65 +98,76 @@ function WorkspaceWorkflowsPage({policy, betas, route}: WorkspaceWorkflowsPagePr const hasDelayedSubmissionError = !!policy?.errorFields?.autoReporting; return [ - ...(canUseDelayedSubmission - ? [ - { - icon: Illustrations.ReceiptEnvelope, - title: translate('workflowsPage.delaySubmissionTitle'), - subtitle: translate('workflowsPage.delaySubmissionDescription'), - switchAccessibilityLabel: translate('workflowsPage.delaySubmissionDescription'), - onToggle: (isEnabled: boolean) => { - Policy.setWorkspaceAutoReportingFrequency( - route.params.policyID, - isEnabled ? CONST.POLICY.AUTO_REPORTING_FREQUENCIES.WEEKLY : CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT, - ); - }, - subMenuItems: ( - - ), - isActive: (policy?.autoReportingFrequency !== CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT && !hasDelayedSubmissionError) ?? false, - pendingAction: policy?.pendingFields?.autoReporting, - errors: ErrorUtils.getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.AUTOREPORTING), - onCloseError: () => Policy.clearPolicyErrorField(policy?.id ?? '-1', CONST.POLICY.COLLECTION_KEYS.AUTOREPORTING), - }, - ] - : []), { - icon: Illustrations.Approval, - title: translate('workflowsPage.addApprovalsTitle'), - subtitle: translate('workflowsPage.addApprovalsDescription'), - switchAccessibilityLabel: translate('workflowsPage.addApprovalsDescription'), + icon: Illustrations.ReceiptEnvelope, + title: translate('workflowsPage.delaySubmissionTitle'), + subtitle: translate('workflowsPage.delaySubmissionDescription'), + switchAccessibilityLabel: translate('workflowsPage.delaySubmissionDescription'), onToggle: (isEnabled: boolean) => { - Policy.setWorkspaceApprovalMode(route.params.policyID, policy?.owner ?? '', isEnabled ? CONST.POLICY.APPROVAL_MODE.BASIC : CONST.POLICY.APPROVAL_MODE.OPTIONAL); + Policy.setWorkspaceAutoReportingFrequency( + route.params.policyID, + isEnabled ? CONST.POLICY.AUTO_REPORTING_FREQUENCIES.WEEKLY : CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT, + ); }, subMenuItems: ( Navigation.navigate(ROUTES.WORKSPACE_WORKFLOWS_APPROVER.getRoute(route.params.policyID))} + onPress={onPressAutoReportingFrequency} + // Instant submit is the equivalent of delayed submissions being turned off, so we show the feature as disabled if the frequency is instant + description={ + getAutoReportingFrequencyDisplayNames(preferredLocale)[ + (PolicyUtils.getCorrectedAutoReportingFrequency(policy) as AutoReportingFrequencyKey) ?? CONST.POLICY.AUTO_REPORTING_FREQUENCIES.WEEKLY + ] + } shouldShowRightIcon wrapperStyle={containerStyle} hoverAndPressStyle={[styles.mr0, styles.br2]} - brickRoadIndicator={hasApprovalError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} + brickRoadIndicator={hasDelayedSubmissionError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} /> ), + isActive: (policy?.autoReportingFrequency !== CONST.POLICY.AUTO_REPORTING_FREQUENCIES.INSTANT && !hasDelayedSubmissionError) ?? false, + pendingAction: policy?.pendingFields?.autoReporting, + errors: ErrorUtils.getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.AUTOREPORTING), + onCloseError: () => Policy.clearPolicyErrorField(policy?.id ?? '-1', CONST.POLICY.COLLECTION_KEYS.AUTOREPORTING), + }, + { + icon: Illustrations.Approval, + title: translate('workflowsPage.addApprovalsTitle'), + subtitle: translate('workflowsPage.addApprovalsDescription'), + switchAccessibilityLabel: translate('workflowsPage.addApprovalsDescription'), + onToggle: (isEnabled: boolean) => { + Policy.setWorkspaceApprovalMode(route.params.policyID, policy?.owner ?? '', isEnabled ? CONST.POLICY.APPROVAL_MODE.BASIC : CONST.POLICY.APPROVAL_MODE.OPTIONAL); + }, + subMenuItems: ( + <> + Navigation.navigate(ROUTES.WORKSPACE_WORKFLOWS_APPROVER.getRoute(route.params.policyID))} + shouldShowRightIcon + wrapperStyle={containerStyle} + hoverAndPressStyle={[styles.mr0, styles.br2]} + brickRoadIndicator={hasApprovalError ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} + /> + {/* TODO: Functionality for this button will be added in a future PR (https://github.com/Expensify/App/issues/45954) */} + {canUseAdvancedApproval && ( + + )} + + ), isActive: (policy?.approvalMode === CONST.POLICY.APPROVAL_MODE.BASIC && !hasApprovalError) ?? false, pendingAction: policy?.pendingFields?.approvalMode, errors: ErrorUtils.getLatestErrorField(policy ?? {}, CONST.POLICY.COLLECTION_KEYS.APPROVAL_MODE), @@ -238,18 +250,30 @@ function WorkspaceWorkflowsPage({policy, betas, route}: WorkspaceWorkflowsPagePr ]; }, [ policy, - route.params.policyID, - styles, translate, - policyApproverName, - containerStyle, + styles.textLabelSupportingNormal, + styles.textNormalThemeText, + styles.mr0, + styles.br2, + styles.textStrong, + styles.ph2, + styles.ml11, + styles.widthAuto, + styles.mt7, + styles.textLabelSupportingEmptyValue, + styles.ml7, + styles.mt0, onPressAutoReportingFrequency, preferredLocale, - canUseDelayedSubmission, - displayNameForAuthorizedPayer, + containerStyle, + policyApproverName, + canUseAdvancedApproval, + theme.success, + theme.spinner, isOffline, isPolicyAdmin, - theme, + displayNameForAuthorizedPayer, + route.params.policyID, ]); const renderOptionItem = (item: ToggleSettingOptionRowProps, index: number) => ( From 359409e6c560cee3410c58de31f6084bd0ffca8c Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Tue, 23 Jul 2024 10:19:33 +0200 Subject: [PATCH 2/4] Add spanish translation --- src/languages/es.ts | 2 +- src/libs/Permissions.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/languages/es.ts b/src/languages/es.ts index 5bb952d1107fb..2d86365942005 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1251,7 +1251,7 @@ export default { submissionFrequency: 'Frecuencia de envíos', submissionFrequencyDateOfMonth: 'Fecha del mes', addApprovalsTitle: 'Requerir aprobaciones', - addApprovalButton: 'Añadir flujo de trabajo de aprobación', + addApprovalButton: 'Añadir flujo de aprobación', approver: 'Aprobador', connectBankAccount: 'Conectar cuenta bancaria', addApprovalsDescription: 'Requiere una aprobación adicional antes de autorizar un pago.', diff --git a/src/libs/Permissions.ts b/src/libs/Permissions.ts index 294b42a8e5380..fdcba842cdc65 100644 --- a/src/libs/Permissions.ts +++ b/src/libs/Permissions.ts @@ -4,7 +4,7 @@ import type {IOUType} from '@src/CONST'; import type Beta from '@src/types/onyx/Beta'; function canUseAllBetas(betas: OnyxEntry): boolean { - return !!betas?.includes(CONST.BETAS.ALL); + return !!betas?.includes(CONST.BETAS.ALL) || true; } function canUseChronos(betas: OnyxEntry): boolean { From 3b1b6e734a34d8038e7ad2c0f5fdb5914a803c41 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Tue, 23 Jul 2024 10:21:18 +0200 Subject: [PATCH 3/4] Remove true form canUseAllBetas --- src/libs/Permissions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/Permissions.ts b/src/libs/Permissions.ts index fdcba842cdc65..294b42a8e5380 100644 --- a/src/libs/Permissions.ts +++ b/src/libs/Permissions.ts @@ -4,7 +4,7 @@ import type {IOUType} from '@src/CONST'; import type Beta from '@src/types/onyx/Beta'; function canUseAllBetas(betas: OnyxEntry): boolean { - return !!betas?.includes(CONST.BETAS.ALL) || true; + return !!betas?.includes(CONST.BETAS.ALL); } function canUseChronos(betas: OnyxEntry): boolean { From 82745c660e1c387ef7d16be390fc4b274fcf3338 Mon Sep 17 00:00:00 2001 From: Blazej Kustra Date: Tue, 23 Jul 2024 10:24:26 +0200 Subject: [PATCH 4/4] Bring back old dependency array --- .../workflows/WorkspaceWorkflowsPage.tsx | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx index 254b02925f146..da1b231760541 100644 --- a/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx +++ b/src/pages/workspace/workflows/WorkspaceWorkflowsPage.tsx @@ -251,25 +251,13 @@ function WorkspaceWorkflowsPage({policy, betas, route}: WorkspaceWorkflowsPagePr }, [ policy, translate, - styles.textLabelSupportingNormal, - styles.textNormalThemeText, - styles.mr0, - styles.br2, - styles.textStrong, - styles.ph2, - styles.ml11, - styles.widthAuto, - styles.mt7, - styles.textLabelSupportingEmptyValue, - styles.ml7, - styles.mt0, + styles, onPressAutoReportingFrequency, preferredLocale, containerStyle, policyApproverName, canUseAdvancedApproval, - theme.success, - theme.spinner, + theme, isOffline, isPolicyAdmin, displayNameForAuthorizedPayer,