diff --git a/src/CONST.ts b/src/CONST.ts index 3d67a951111e..b56d086ecd57 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -363,6 +363,7 @@ const CONST = { SPOTNANA_TRAVEL: 'spotnanaTravel', ACCOUNTING_ON_NEW_EXPENSIFY: 'accountingOnNewExpensify', XERO_ON_NEW_EXPENSIFY: 'xeroOnNewExpensify', + REPORT_FIELDS_FEATURE: 'reportFieldsFeature', }, BUTTON_STATES: { DEFAULT: 'default', diff --git a/src/languages/en.ts b/src/languages/en.ts index 8d64d0a2cda6..a7d578137972 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -340,6 +340,7 @@ export default { shared: 'Shared', drafts: 'Drafts', finished: 'Finished', + disable: 'Disable', }, location: { useCurrent: 'Use current location', @@ -1023,7 +1024,6 @@ export default { enabled: 'Two-factor authentication is now enabled!', congrats: 'Congrats, now you’ve got that extra security.', copy: 'Copy', - disable: 'Disable', }, recoveryCodeForm: { error: { @@ -2260,6 +2260,8 @@ export default { reportFields: { delete: 'Delete field', deleteConfirmation: 'Are you sure that you want to delete this field?', + disableReportFields: 'Disable report fields', + disableReportFieldsConfirmation: 'Are you sure? Text and date fields will be deleted, and lists will be disabled.', }, tags: { tagName: 'Tag name', diff --git a/src/languages/es.ts b/src/languages/es.ts index 0745c5df7582..ab7fe2731ba1 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -331,6 +331,7 @@ export default { shared: 'Compartidos', drafts: 'Borradores', finished: 'Finalizados', + disable: 'Deshabilitar', }, connectionComplete: { title: 'Conexión Completa', @@ -1020,7 +1021,6 @@ export default { enabled: '¡La autenticación de dos factores está ahora habilitada!', congrats: 'Felicidades, ahora tienes esa seguridad adicional.', copy: 'Copiar', - disable: 'Deshabilitar', }, recoveryCodeForm: { error: { @@ -2296,6 +2296,8 @@ export default { reportFields: { delete: 'Eliminar campos', deleteConfirmation: '¿Estás seguro de que quieres eliminar esta campos?', + disableReportFields: 'Desactivar campos de informe', + disableReportFieldsConfirmation: 'Estás seguro? Se eliminarán los campos de texto y fecha y se desactivarán las listas.', }, tags: { tagName: 'Nombre de etiqueta', diff --git a/src/libs/Permissions.ts b/src/libs/Permissions.ts index 7ef4c9325a14..56d366ef330d 100644 --- a/src/libs/Permissions.ts +++ b/src/libs/Permissions.ts @@ -48,6 +48,10 @@ function canUseXeroIntegration(betas: OnyxEntry): boolean { return !!betas?.includes(CONST.BETAS.XERO_ON_NEW_EXPENSIFY) || canUseAllBetas(betas); } +function canUseReportFieldsFeature(betas: OnyxEntry): boolean { + return !!betas?.includes(CONST.BETAS.REPORT_FIELDS_FEATURE) || canUseAllBetas(betas); +} + /** * Link previews are temporarily disabled. */ @@ -67,4 +71,5 @@ export default { canUseSpotnanaTravel, canUseAccountingIntegrations, canUseXeroIntegration, + canUseReportFieldsFeature, }; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index b04536915b6c..4b0253bf4c69 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -2553,6 +2553,10 @@ function enablePolicyReportFields(policyID: string, enabled: boolean) { const parameters: EnablePolicyReportFieldsParams = {policyID, enabled}; API.write(WRITE_COMMANDS.ENABLE_POLICY_REPORT_FIELDS, parameters, onyxData); + + if (enabled && getIsNarrowLayout()) { + navigateWhenEnableFeature(policyID); + } } function enablePolicyTaxes(policyID: string, enabled: boolean) { diff --git a/src/pages/settings/Security/TwoFactorAuth/Steps/EnabledStep.tsx b/src/pages/settings/Security/TwoFactorAuth/Steps/EnabledStep.tsx index ad9a4060af45..ddd99f8fb54e 100644 --- a/src/pages/settings/Security/TwoFactorAuth/Steps/EnabledStep.tsx +++ b/src/pages/settings/Security/TwoFactorAuth/Steps/EnabledStep.tsx @@ -57,7 +57,7 @@ function EnabledStep() { onModalHide={() => setIsConfirmModalVisible(false)} isVisible={isConfirmModalVisible} prompt={translate('twoFactorAuth.disableTwoFactorAuthConfirmation')} - confirmText={translate('twoFactorAuth.disable')} + confirmText={translate('common.disable')} cancelText={translate('common.cancel')} shouldShowCancelButton danger diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index 54ee78a146ec..1ea2872c9513 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -56,13 +56,14 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro const styles = useThemeStyles(); const {isSmallScreenWidth} = useWindowDimensions(); const {translate} = useLocalize(); - const {canUseAccountingIntegrations} = usePermissions(); + const {canUseAccountingIntegrations, canUseReportFieldsFeature} = usePermissions(); const hasAccountingConnection = !!policy?.areConnectionsEnabled && !isEmptyObject(policy?.connections); const isSyncTaxEnabled = !!policy?.connections?.quickbooksOnline?.config?.syncTax || !!policy?.connections?.xero?.config?.importTaxRates; const policyID = policy?.id ?? ''; - const [isOrganizeWarningModalOpen, setIsOrganizeWarningModalOpen] = useState(false); - const [isIntegrateWarningModalOpen, setIsIntegrateWarningModalOpen] = useState(false); + const [isOrganizeWarningModalOpen, setIsOrganizeWarningModalOpen] = useState(false); + const [isIntegrateWarningModalOpen, setIsIntegrateWarningModalOpen] = useState(false); + const [isReportFieldsWarningModalOpen, setIsReportFieldsWarningModalOpen] = useState(false); const spendItems: Item[] = [ { @@ -135,6 +136,28 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro }, ]; + if (canUseReportFieldsFeature) { + organizeItems.push({ + icon: Illustrations.Pencil, + titleTranslationKey: 'workspace.moreFeatures.reportFields.title', + subtitleTranslationKey: 'workspace.moreFeatures.reportFields.subtitle', + isActive: policy?.areReportFieldsEnabled ?? false, + disabled: hasAccountingConnection, + pendingAction: policy?.pendingFields?.areReportFieldsEnabled, + action: (isEnabled: boolean) => { + if (hasAccountingConnection) { + setIsOrganizeWarningModalOpen(true); + return; + } + if (isEnabled) { + Policy.enablePolicyReportFields(policyID, true); + return; + } + setIsReportFieldsWarningModalOpen(true); + }, + }); + } + const integrateItems: Item[] = [ { icon: Illustrations.Accounting, @@ -275,6 +298,19 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro confirmText={translate('workspace.moreFeatures.connectionsWarningModal.manageSettings')} cancelText={translate('common.cancel')} /> + { + setIsReportFieldsWarningModalOpen(false); + Policy.enablePolicyReportFields(policyID, false); + }} + onCancel={() => setIsReportFieldsWarningModalOpen(false)} + prompt={translate('workspace.reportFields.disableReportFieldsConfirmation')} + confirmText={translate('common.disable')} + cancelText={translate('common.cancel')} + danger + /> );