diff --git a/__mocks__/reportData/policies.ts b/__mocks__/reportData/policies.ts index 4a1206364d18..576b1bbc4ef8 100644 --- a/__mocks__/reportData/policies.ts +++ b/__mocks__/reportData/policies.ts @@ -93,7 +93,6 @@ const policy420A: Policy = { }, areRulesEnabled: false, eReceipts: true, - shouldShowCustomReportTitleOption: false, shouldShowAutoApprovalOptions: false, shouldShowAutoReimbursementLimitOption: false, maxExpenseAmountNoReceipt: 100000, diff --git a/assets/images/simple-illustration__report-receipt.svg b/assets/images/simple-illustrations/simple-illustration__report-receipt.svg similarity index 100% rename from assets/images/simple-illustration__report-receipt.svg rename to assets/images/simple-illustrations/simple-illustration__report-receipt.svg diff --git a/src/CONST.ts b/src/CONST.ts index 9013873bf383..fc99e337a7dd 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -1095,7 +1095,7 @@ const CONST = { 'https://help.expensify.com/articles/new-expensify/connect-credit-cards/company-cards/Commercial-feeds#how-to-set-up-an-american-express-corporate-feed', COMPANY_CARDS_STRIPE_HELP: 'https://dashboard.stripe.com/login?redirect=%2Fexpenses%2Fsettings', COMPANY_CARDS_CONNECT_CREDIT_CARDS_HELP_URL: 'https://help.expensify.com/new-expensify/hubs/connect-credit-cards/', - CUSTOM_REPORT_NAME_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/spending-insights/Custom-Templates', + CUSTOM_REPORT_NAME_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/spending-insights/Export-Expenses-And-Reports#formulas', CONFIGURE_REIMBURSEMENT_SETTINGS_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/workspaces/Configure-Reimbursement-Settings', COPILOT_HELP_URL: 'https://help.expensify.com/articles/new-expensify/settings/Add-or-Act-As-a-Copilot', DELAYED_SUBMISSION_HELP_URL: 'https://help.expensify.com/articles/expensify-classic/reports/Automatically-submit-employee-reports', @@ -6720,6 +6720,11 @@ const CONST = { description: 'workspace.upgrade.reportFields.description' as const, icon: 'Pencil', }, + policyPreventMemberChangingTitle: { + id: 'policyPreventMemberChangingTitle' as const, + alias: 'policy-prevent-member-changing-title', + name: undefined, + }, categories: { id: 'categories' as const, alias: 'categories', diff --git a/src/components/Icon/Illustrations.ts b/src/components/Icon/Illustrations.ts index c334bae896d0..d36d4b892de6 100644 --- a/src/components/Icon/Illustrations.ts +++ b/src/components/Icon/Illustrations.ts @@ -66,7 +66,6 @@ import ThreeLeggedLaptopWoman from '@assets/images/product-illustrations/three_l import ToddBehindCloud from '@assets/images/product-illustrations/todd-behind-cloud.svg'; import ToddWithPhones from '@assets/images/product-illustrations/todd-with-phones.svg'; import RunningTurtle from '@assets/images/running-turtle.svg'; -import ReportReceipt from '@assets/images/simple-illustration__report-receipt.svg'; import BigVault from '@assets/images/simple-illustrations/emptystate__big-vault.svg'; import Puzzle from '@assets/images/simple-illustrations/emptystate__puzzlepieces.svg'; import Abacus from '@assets/images/simple-illustrations/simple-illustration__abacus.svg'; @@ -131,6 +130,7 @@ import ReceiptEnvelope from '@assets/images/simple-illustrations/simple-illustra import ReceiptLocationMarker from '@assets/images/simple-illustrations/simple-illustration__receipt-location-marker.svg'; import ReceiptWrangler from '@assets/images/simple-illustrations/simple-illustration__receipt-wrangler.svg'; import ReceiptUpload from '@assets/images/simple-illustrations/simple-illustration__receiptupload.svg'; +import ReportReceipt from '@assets/images/simple-illustrations/simple-illustration__report-receipt.svg'; import Rules from '@assets/images/simple-illustrations/simple-illustration__rules.svg'; import SanFrancisco from '@assets/images/simple-illustrations/simple-illustration__sanfrancisco.svg'; import SendMoney from '@assets/images/simple-illustrations/simple-illustration__sendmoney.svg'; diff --git a/src/languages/en.ts b/src/languages/en.ts index f304ea8d928c..c03153c0b541 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2905,6 +2905,7 @@ const translations = { categories: 'Categories', tags: 'Tags', reportFields: 'Report fields', + reportTitle: 'Report title', reportField: 'Report field', taxes: 'Taxes', bills: 'Bills', @@ -4922,9 +4923,8 @@ const translations = { examples: 'Examples:', title: 'Expense reports', subtitle: 'Automate expense report compliance, approvals, and payment.', - customReportNamesTitle: 'Custom report names', - customReportNamesSubtitle: 'Create custom names using our extensive formulas.', - customNameTitle: 'Custom name', + customReportNamesSubtitle: 'Customize report titles using our ', + customNameTitle: 'Default report title', customNameDescription: 'Choose a custom name for expense reports using our ', customNameDescriptionLink: 'extensive formulas', customNameInputLabel: 'Name', diff --git a/src/languages/es.ts b/src/languages/es.ts index 94f5dd56677a..d8ade19914b3 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2931,6 +2931,7 @@ const translations = { categories: 'Categorías', tags: 'Etiquetas', reportFields: 'Campos de informe', + reportTitle: 'El título del informe.', taxes: 'Impuestos', bills: 'Pagar facturas', invoices: 'Facturas', @@ -4994,9 +4995,8 @@ const translations = { examples: 'Ejemplos:', title: 'Informes de gastos', subtitle: 'Automatiza el cumplimiento, la aprobación y el pago de los informes de gastos.', - customReportNamesTitle: 'Nombres personalizados de informes', - customReportNamesSubtitle: 'Crea nombres personalizados usando nuestras fórmulas variadas.', - customNameTitle: 'Nombre personalizado', + customReportNamesSubtitle: 'Personaliza los títulos de los informes usando nuestras amplias fórmulas.', + customNameTitle: 'Título de informe predeterminado', customNameDescription: 'Elige un nombre personalizado para los informes de gastos usando nuestras ', customNameDescriptionLink: 'fórmulas variadas', customNameInputLabel: 'Nombre', diff --git a/src/libs/API/parameters/EnablePolicyDefaultReportTitle.ts b/src/libs/API/parameters/EnablePolicyDefaultReportTitle.ts deleted file mode 100644 index 2852640ac70a..000000000000 --- a/src/libs/API/parameters/EnablePolicyDefaultReportTitle.ts +++ /dev/null @@ -1,6 +0,0 @@ -type EnablePolicyDefaultReportTitleParams = { - policyID: string; - enable: boolean; -}; - -export default EnablePolicyDefaultReportTitleParams; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 0c0e57557350..5db0f0d46287 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -299,7 +299,6 @@ export type {default as SetPolicyPreventMemberCreatedTitleParams} from './SetPol export type {default as SetPolicyAutoReimbursementLimitParams} from './SetPolicyAutoReimbursementLimit'; export type {default as EnablePolicyAutoReimbursementLimitParams} from './EnablePolicyAutoReimbursementLimit'; export type {default as EnablePolicyAutoApprovalOptionsParams} from './EnablePolicyAutoApprovalOptions'; -export type {default as EnablePolicyDefaultReportTitleParams} from './EnablePolicyDefaultReportTitle'; export type {default as SetPolicyExpenseMaxAmountNoReceipt} from './SetPolicyExpenseMaxAmountNoReceipt'; export type {default as SetPolicyExpenseMaxAmount} from './SetPolicyExpenseMaxAmount'; export type {default as SetPolicyExpenseMaxAge} from './SetPolicyExpenseMaxAge'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 4616e906bfe0..b4034bde5a13 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -24,7 +24,6 @@ const WRITE_COMMANDS = { SET_POLICY_AUTO_REIMBURSEMENT_LIMIT: 'SetPolicyAutoReimbursementLimit', ENABLE_POLICY_AUTO_REIMBURSEMENT_LIMIT: 'EnablePolicyAutoReimbursementLimit', ENABLE_POLICY_AUTO_APPROVAL_OPTIONS: 'EnablePolicyAutoApprovalOptions', - ENABLE_POLICY_DEFAULT_REPORT_TITLE: 'EnablePolicyDefaultReportTitle', SET_WORKSPACE_DEFAULT_SPEND_CATEGORY: 'SetPolicyDefaultSpendCategory', DISMISS_REFERRAL_BANNER: 'DismissReferralBanner', UPDATE_PREFERRED_LOCALE: 'UpdatePreferredLocale', @@ -693,7 +692,6 @@ type WriteCommandParameters = { [WRITE_COMMANDS.SET_POLICY_AUTO_REIMBURSEMENT_LIMIT]: Parameters.SetPolicyAutoReimbursementLimitParams; [WRITE_COMMANDS.ENABLE_POLICY_AUTO_REIMBURSEMENT_LIMIT]: Parameters.EnablePolicyAutoReimbursementLimitParams; [WRITE_COMMANDS.ENABLE_POLICY_AUTO_APPROVAL_OPTIONS]: Parameters.EnablePolicyAutoApprovalOptionsParams; - [WRITE_COMMANDS.ENABLE_POLICY_DEFAULT_REPORT_TITLE]: Parameters.EnablePolicyDefaultReportTitleParams; [WRITE_COMMANDS.SET_WORKSPACE_DEFAULT_SPEND_CATEGORY]: Parameters.SetWorkspaceDefaultSpendCategoryParams; [WRITE_COMMANDS.SWITCH_TO_OLD_DOT]: Parameters.SwitchToOldDotParams; [WRITE_COMMANDS.TRACK_EXPENSE]: Parameters.TrackExpenseParams; diff --git a/src/libs/actions/Policy/Policy.ts b/src/libs/actions/Policy/Policy.ts index 1aa05b0d4c2e..0995893891b7 100644 --- a/src/libs/actions/Policy/Policy.ts +++ b/src/libs/actions/Policy/Policy.ts @@ -19,7 +19,6 @@ import type { EnablePolicyAutoReimbursementLimitParams, EnablePolicyCompanyCardsParams, EnablePolicyConnectionsParams, - EnablePolicyDefaultReportTitleParams, EnablePolicyExpensifyCardsParams, EnablePolicyInvoicingParams, EnablePolicyReportFieldsParams, @@ -3044,7 +3043,7 @@ function enableCompanyCards(policyID: string, enabled: boolean, shouldGoBack = t } } -function enablePolicyReportFields(policyID: string, enabled: boolean, shouldGoBack = true) { +function enablePolicyReportFields(policyID: string, enabled: boolean) { const onyxData: OnyxData = { optimisticData: [ { @@ -3088,10 +3087,6 @@ function enablePolicyReportFields(policyID: string, enabled: boolean, shouldGoBa API.write(WRITE_COMMANDS.ENABLE_POLICY_REPORT_FIELDS, parameters, onyxData, { checkAndFixConflictingRequest: (persistedRequests) => resolveEnableFeatureConflicts(WRITE_COMMANDS.ENABLE_POLICY_REPORT_FIELDS, persistedRequests, parameters), }); - - if (enabled && getIsNarrowLayout() && shouldGoBack) { - goBackWhenEnableFeature(policyID); - } } function enablePolicyTaxes(policyID: string, enabled: boolean) { @@ -4273,79 +4268,6 @@ function getAdminPoliciesConnectedToNetSuite(): Policy[] { return Object.values(allPolicies ?? {}).filter((policy): policy is Policy => !!policy && policy.role === CONST.POLICY.ROLE.ADMIN && !!policy?.connections?.netsuite); } -/** - * Call the API to enable custom report title for the reports in the given policy - * @param policyID - id of the policy to apply the limit to - * @param enabled - whether custom report title for the reports is enabled in the given policy - */ -function enablePolicyDefaultReportTitle(policyID: string, enabled: boolean) { - const policy = getPolicy(policyID); - - if (enabled === policy?.shouldShowCustomReportTitleOption) { - return; - } - - const previousReportTitleField = policy?.fieldList?.[CONST.POLICY.FIELDS.FIELD_LIST_TITLE] ?? {}; - const titleFieldValues = enabled ? {} : {fieldList: {[CONST.POLICY.FIELDS.FIELD_LIST_TITLE]: {...previousReportTitleField, defaultValue: CONST.POLICY.DEFAULT_REPORT_NAME_PATTERN}}}; - - const optimisticData: OnyxUpdate[] = [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, - value: { - shouldShowCustomReportTitleOption: enabled, - ...titleFieldValues, - pendingFields: { - shouldShowCustomReportTitleOption: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, - }, - }, - }, - ]; - - const successData: OnyxUpdate[] = [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, - value: { - pendingFields: { - shouldShowCustomReportTitleOption: null, - }, - errorFields: null, - }, - }, - ]; - - const failureData: OnyxUpdate[] = [ - { - onyxMethod: Onyx.METHOD.MERGE, - key: `${ONYXKEYS.COLLECTION.POLICY}${policyID}`, - value: { - shouldShowCustomReportTitleOption: !!policy?.shouldShowCustomReportTitleOption, - fieldList: { - [CONST.POLICY.FIELDS.FIELD_LIST_TITLE]: previousReportTitleField, - }, - pendingFields: { - shouldShowCustomReportTitleOption: null, - }, - errorFields: { - shouldShowCustomReportTitleOption: ErrorUtils.getMicroSecondOnyxErrorWithTranslationKey('common.genericErrorMessage'), - }, - }, - }, - ]; - - const parameters: EnablePolicyDefaultReportTitleParams = { - enable: enabled, - policyID, - }; - - API.write(WRITE_COMMANDS.ENABLE_POLICY_DEFAULT_REPORT_TITLE, parameters, { - optimisticData, - successData, - failureData, - }); -} - /** * Call the API to set default report title pattern for the given policy * @param policyID - id of the policy to apply the naming pattern to @@ -5260,7 +5182,6 @@ export { setPolicyAutomaticApprovalLimit, setPolicyAutomaticApprovalRate, setPolicyAutoReimbursementLimit, - enablePolicyDefaultReportTitle, enablePolicyAutoReimbursementLimit, enableAutoApprovalOptions, setPolicyMaxExpenseAmountNoReceipt, diff --git a/src/pages/workspace/WorkspaceInitialPage.tsx b/src/pages/workspace/WorkspaceInitialPage.tsx index f47746750ac4..3133e3b681ba 100644 --- a/src/pages/workspace/WorkspaceInitialPage.tsx +++ b/src/pages/workspace/WorkspaceInitialPage.tsx @@ -12,13 +12,13 @@ import { Car, Coins, CreditCard, + Document, ExpensifyAppIcon, ExpensifyCard, Feed, Folder, Gear, InvoiceGeneric, - Pencil, Sync, Tag, Users, @@ -177,6 +177,13 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, route}: Workspac const workspaceMenuItems: WorkspaceMenuItem[] = useMemo(() => { const protectedMenuItems: WorkspaceMenuItem[] = []; + protectedMenuItems.push({ + translationKey: 'common.reports', + icon: Document, + action: singleExecution(waitForNavigate(() => Navigation.navigate(ROUTES.WORKSPACE_REPORT_FIELDS.getRoute(policyID)))), + screenName: SCREENS.WORKSPACE.REPORT_FIELDS, + }); + if (featureStates?.[CONST.POLICY.MORE_FEATURES.ARE_DISTANCE_RATES_ENABLED]) { protectedMenuItems.push({ translationKey: 'workspace.common.distanceRates', @@ -263,16 +270,6 @@ function WorkspaceInitialPage({policyDraft, policy: policyProp, route}: Workspac }); } - if (featureStates?.[CONST.POLICY.MORE_FEATURES.ARE_REPORT_FIELDS_ENABLED]) { - protectedMenuItems.push({ - translationKey: 'workspace.common.reportFields', - icon: Pencil, - action: singleExecution(waitForNavigate(() => Navigation.navigate(ROUTES.WORKSPACE_REPORT_FIELDS.getRoute(policyID)))), - screenName: SCREENS.WORKSPACE.REPORT_FIELDS, - highlighted: highlightedFeature === CONST.POLICY.MORE_FEATURES.ARE_REPORT_FIELDS_ENABLED, - }); - } - if (featureStates?.[CONST.POLICY.MORE_FEATURES.ARE_WORKFLOWS_ENABLED]) { protectedMenuItems.push({ translationKey: 'workspace.common.workflows', diff --git a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx index 39f4ea535bab..503857f4658c 100644 --- a/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx +++ b/src/pages/workspace/WorkspaceMoreFeaturesPage.tsx @@ -30,7 +30,6 @@ import { enableExpensifyCard, enablePolicyConnections, enablePolicyInvoicing, - enablePolicyReportFields, enablePolicyRules, enablePolicyTaxes, enablePolicyWorkflows, @@ -92,7 +91,6 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro const [cardFeeds] = useCardFeeds(policyID); const [isOrganizeWarningModalOpen, setIsOrganizeWarningModalOpen] = useState(false); const [isIntegrateWarningModalOpen, setIsIntegrateWarningModalOpen] = useState(false); - const [isReportFieldsWarningModalOpen, setIsReportFieldsWarningModalOpen] = useState(false); const [isDisableExpensifyCardWarningModalOpen, setIsDisableExpensifyCardWarningModalOpen] = useState(false); const [isDisableCompanyCardsWarningModalOpen, setIsDisableCompanyCardsWarningModalOpen] = useState(false); const [isDisableWorkflowWarningModalOpen, setIsDisableWorkflowWarningModalOpen] = useState(false); @@ -284,32 +282,6 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro enablePolicyTaxes(policyID, isEnabled); }, }, - { - icon: Illustrations.Pencil, - titleTranslationKey: 'workspace.moreFeatures.reportFields.title', - subtitleTranslationKey: 'workspace.moreFeatures.reportFields.subtitle', - isActive: policy?.areReportFieldsEnabled ?? false, - disabled: hasAccountingConnection, - pendingAction: policy?.pendingFields?.areReportFieldsEnabled, - disabledAction: onDisabledOrganizeSwitchPress, - action: (isEnabled: boolean) => { - if (!policyID) { - return; - } - if (isEnabled) { - if (!isControlPolicy(policy)) { - Navigation.navigate( - ROUTES.WORKSPACE_UPGRADE.getRoute(policyID, CONST.UPGRADE_FEATURE_INTRO_MAPPING.reportFields.alias, ROUTES.WORKSPACE_MORE_FEATURES.getRoute(policyID)), - ); - return; - } - - enablePolicyReportFields(policyID, true, true); - return; - } - setIsReportFieldsWarningModalOpen(true); - }, - }, ]; const integrateItems: Item[] = [ @@ -508,22 +480,6 @@ function WorkspaceMoreFeaturesPage({policy, route}: WorkspaceMoreFeaturesPagePro confirmText={translate('workspace.moreFeatures.connectionsWarningModal.manageSettings')} cancelText={translate('common.cancel')} /> - { - if (!policyID) { - return; - } - setIsReportFieldsWarningModalOpen(false); - enablePolicyReportFields(policyID, false, true); - }} - onCancel={() => setIsReportFieldsWarningModalOpen(false)} - prompt={translate('workspace.reportFields.disableReportFieldsConfirmation')} - confirmText={translate('common.disable')} - cancelText={translate('common.cancel')} - danger - /> ; @@ -70,43 +57,36 @@ function WorkspaceReportFieldsPage({ }: WorkspaceReportFieldsPageProps) { // We need to use isSmallScreenWidth instead of shouldUseNarrowLayout for the small screen selection mode // eslint-disable-next-line rulesdir/prefer-shouldUseNarrowLayout-instead-of-isSmallScreenWidth - const {shouldUseNarrowLayout, isSmallScreenWidth} = useResponsiveLayout(); + const {shouldUseNarrowLayout} = useResponsiveLayout(); const styles = useThemeStyles(); const theme = useTheme(); const {translate} = useLocalize(); - const {environmentURL} = useEnvironment(); + const [isReportFieldsWarningModalOpen, setIsReportFieldsWarningModalOpen] = useState(false); const policy = usePolicy(policyID); - const {selectionMode} = useMobileSelectionMode(); - const [deleteReportFieldsConfirmModalVisible, setDeleteReportFieldsConfirmModalVisible] = useState(false); - const hasReportAccountingConnections = hasAccountingConnections(policy); const [connectionSyncProgress] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS}${policy?.id}`, {canBeMissing: true}); + const {environmentURL} = useEnvironment(); const isSyncInProgress = isConnectionInProgress(connectionSyncProgress, policy); const hasSyncError = shouldShowSyncError(policy, isSyncInProgress); const connectedIntegration = getConnectedIntegration(policy) ?? connectionSyncProgress?.connectionName; const isConnectionVerified = connectedIntegration && !isConnectionUnverified(policy, connectedIntegration); const currentConnectionName = getCurrentConnectionName(policy); - - const canSelectMultiple = !hasReportAccountingConnections && (isSmallScreenWidth ? selectionMode?.isEnabled : true); - - const selectionFieldList = useMemo(() => { + const hasReportAccountingConnections = hasAccountingConnections(policy); + const filteredPolicyFieldList = useMemo(() => { if (!policy?.fieldList) { return {}; } - return Object.values(policy.fieldList).reduce>>((acc, reportField) => { - if (reportField.fieldID === CONST.POLICY.FIELDS.FIELD_LIST_TITLE) { - return acc; - } - const reportFieldKey = getReportFieldKey(reportField.fieldID); - acc[reportFieldKey] = reportField; - return acc; - }, {}); + // eslint-disable-next-line @typescript-eslint/no-unused-vars + return Object.fromEntries(Object.entries(policy.fieldList).filter(([_, value]) => value.fieldID !== 'text_title')); }, [policy]); + const hasAccountingConnection = !isEmptyObject(policy?.connections); + const [isOrganizeWarningModalOpen, setIsOrganizeWarningModalOpen] = useState(false); - const filterReportFields = useCallback((reportField: OnyxValueWithOfflineFeedback | undefined) => { - return !!reportField && reportField.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE; - }, []); - - const [selectedReportFields, setSelectedReportFields] = useFilteredSelection(selectionFieldList, filterReportFields); + const onDisabledOrganizeSwitchPress = useCallback(() => { + if (!hasAccountingConnection) { + return; + } + setIsOrganizeWarningModalOpen(true); + }, [hasAccountingConnection]); const fetchReportFields = useCallback(() => { openPolicyReportFieldsPage(policyID); @@ -114,137 +94,74 @@ function WorkspaceReportFieldsPage({ const {isOffline} = useNetwork({onReconnect: fetchReportFields}); - const hasVisibleReportField = Object.values(selectionFieldList).some((reportField) => reportField.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || isOffline); - useFocusEffect(fetchReportFields); const reportFieldsSections = useMemo(() => { if (!policy) { return []; } - return Object.values(selectionFieldList).map((reportField) => ({ - value: reportField.name, - fieldID: reportField.fieldID, - keyForList: String(reportField.fieldID), - orderWeight: reportField.orderWeight, - pendingAction: reportField.pendingAction, - isSelected: selectedReportFields.includes(getReportFieldKey(reportField.fieldID)) && canSelectMultiple, - isDisabled: reportField.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, - text: reportField.name, - rightElement: , - })); - }, [canSelectMultiple, selectionFieldList, policy, selectedReportFields, translate]); + return Object.values(filteredPolicyFieldList) + .sort((a, b) => localeCompare(a.name, b.name)) + .map((reportField) => ({ + text: reportField.name, + keyForList: String(reportField.fieldID), + fieldID: reportField.fieldID, + pendingAction: reportField.pendingAction, + isDisabled: reportField.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE, + rightLabel: Str.recapitalize(translate(getReportFieldTypeTranslationKey(reportField.type))), + })); + }, [filteredPolicyFieldList, policy, translate]); - const filterReportField = useCallback((reportField: ReportFieldForList, searchInput: string) => !!reportField.text?.toLowerCase().includes(searchInput), []); - const sortReportFields = useCallback((reportFields: ReportFieldForList[]) => reportFields.sort((a, b) => localeCompare(a.value, b.value)), []); - const [inputValue, setInputValue, filteredReportFields] = useSearchResults(reportFieldsSections, filterReportField, sortReportFields); - - useAutoTurnSelectionModeOffWhenHasNoActiveOption(filteredReportFields); - - const updateSelectedReportFields = (item: ReportFieldForList) => { - const fieldKey = getReportFieldKey(item.fieldID); - setSelectedReportFields((prevSelectedReportFields) => { - if (prevSelectedReportFields.includes(fieldKey)) { - return prevSelectedReportFields.filter((selectedField) => selectedField !== fieldKey); - } - return [...prevSelectedReportFields, fieldKey]; - }); - }; + const navigateToReportFieldsSettings = useCallback( + (reportField: ReportFieldForList) => { + Navigation.navigate(ROUTES.WORKSPACE_REPORT_FIELDS_SETTINGS.getRoute(policyID, reportField.fieldID)); + }, + [policyID], + ); - const toggleAllReportFields = () => { - const availableReportFields = Object.values(reportFieldsSections).filter( - (reportField) => reportField.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE && filteredReportFields.find((item) => item.fieldID === reportField.fieldID), + const getHeaderText = () => + !hasSyncError && isConnectionVerified ? ( + + {`${translate('workspace.reportFields.importedFromAccountingSoftware')} `} + + {`${currentConnectionName} ${translate('workspace.accounting.settings')}`} + + . + + ) : ( + {translate('workspace.reportFields.subtitle')} ); - setSelectedReportFields(selectedReportFields.length > 0 ? [] : Object.values(availableReportFields).map((reportField) => getReportFieldKey(reportField.fieldID))); - }; - - const navigateToReportFieldsSettings = (reportField: ReportFieldForList) => { - Navigation.navigate(ROUTES.WORKSPACE_REPORT_FIELDS_SETTINGS.getRoute(policyID, reportField.fieldID)); - }; - - const handleDeleteReportFields = () => { - setSelectedReportFields([]); - deleteReportFields(policyID, selectedReportFields); - setDeleteReportFieldsConfirmModalVisible(false); - }; const isLoading = !isOffline && policy === undefined; - const shouldShowEmptyState = - !Object.values(selectionFieldList).some((reportField) => reportField.pendingAction !== CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE || isOffline) && !isLoading; - const getHeaderButtons = () => { - const options: Array>> = []; - - if (shouldUseNarrowLayout ? canSelectMultiple : selectedReportFields.length > 0) { - options.push({ - icon: Trashcan, - text: translate(selectedReportFields.length === 1 ? 'workspace.reportFields.delete' : 'workspace.reportFields.deleteFields'), - value: CONST.POLICY.BULK_ACTION_TYPES.DELETE, - onSelected: () => setDeleteReportFieldsConfirmModalVisible(true), - }); - - return ( - null} - shouldAlwaysShowDropdownMenu - pressOnEnter - buttonSize={CONST.DROPDOWN_BUTTON_SIZE.MEDIUM} - customText={translate('workspace.common.selected', {count: selectedReportFields.length})} - options={options} - isSplitButton={false} - style={[shouldUseNarrowLayout && styles.flexGrow1, shouldUseNarrowLayout && styles.mb3]} - isDisabled={!selectedReportFields.length} - /> - ); - } - return ( - -