From 05b5bdc1e5cc6abd8403517586e9e3ce6cd600aa Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Wed, 3 Jul 2024 03:54:12 +0530 Subject: [PATCH 01/34] feat: list page route setup --- src/ROUTES.ts | 5 ++ src/SCREENS.ts | 1 + .../ModalStackNavigators/index.tsx | 1 + .../FULL_SCREEN_TO_RHP_MAPPING.ts | 1 + src/libs/Navigation/linkingConfig/config.ts | 1 + src/libs/Navigation/types.ts | 4 ++ .../import/NetSuiteImportCustomFieldPage.tsx | 66 +++++++++++++++++++ .../netsuite/import/NetSuiteImportPage.tsx | 2 +- 8 files changed, 80 insertions(+), 1 deletion(-) create mode 100644 src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage.tsx diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 37eda77cd18c0..ec6b4438c3e3f 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -949,6 +949,11 @@ const ROUTES = { getRoute: (policyID: string, importField: TupleToUnion) => `settings/workspaces/${policyID}/accounting/netsuite/import/mapping/${importField}` as const, }, + POLICY_ACCOUNTING_NETSUITE_IMPORT_CUSTOM_FIELD_MAPPING: { + route: 'settings/workspaces/:policyID/accounting/netsuite/import/custom/:importField', + getRoute: (policyID: string, importCustomField: TupleToUnion) => + `settings/workspaces/${policyID}/accounting/netsuite/import/custom/${importCustomField}` as const, + }, POLICY_ACCOUNTING_NETSUITE_EXPORT: { route: 'settings/workspaces/:policyID/connections/netsuite/export/', getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/netsuite/export/` as const, diff --git a/src/SCREENS.ts b/src/SCREENS.ts index e27d6b4160753..a121a05e1cff3 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -273,6 +273,7 @@ const SCREENS = { XERO_BILL_PAYMENT_ACCOUNT_SELECTOR: 'Policy_Accounting_Xero_Bill_Payment_Account_Selector', XERO_EXPORT_BANK_ACCOUNT_SELECT: 'Policy_Accounting_Xero_Export_Bank_Account_Select', NETSUITE_IMPORT_MAPPING: 'Policy_Accounting_NetSuite_Import_Mapping', + NETSUITE_IMPORT_CUSTOM_FIELD: 'Policy_Accounting_NetSuite_Import_Custom_Field', NETSUITE_SUBSIDIARY_SELECTOR: 'Policy_Accounting_NetSuite_Subsidiary_Selector', NETSUITE_IMPORT: 'Policy_Accounting_NetSuite_Import', NETSUITE_EXPORT: 'Policy_Accounting_NetSuite_Export', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index df848e3046947..ea7da33cc75c1 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -322,6 +322,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/accounting/netsuite/NetSuiteSubsidiarySelector').default, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT]: () => require('../../../../pages/workspace/accounting/netsuite/import/NetSuiteImportPage').default, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_MAPPING]: () => require('../../../../pages/workspace/accounting/netsuite/import/NetSuiteImportMappingPage').default, + [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_CUSTOM_FIELD]: () => require('../../../../pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage').default, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_EXPORT]: () => require('../../../../pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage').default, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_PREFERRED_EXPORTER_SELECT]: () => require('../../../../pages/workspace/accounting/netsuite/export/NetSuitePreferredExporterSelectPage').default, diff --git a/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts b/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts index cf718bd3794f9..d8745ad8c7028 100755 --- a/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts +++ b/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts @@ -58,6 +58,7 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial> = { SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_SUBSIDIARY_SELECTOR, SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT, SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_MAPPING, + SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_CUSTOM_FIELD, SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_EXPORT, SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_PREFERRED_EXPORTER_SELECT, SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_DATE_SELECT, diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index a756f78648385..96351fea0300e 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -356,6 +356,7 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_SUBSIDIARY_SELECTOR]: {path: ROUTES.POLICY_ACCOUNTING_NETSUITE_SUBSIDIARY_SELECTOR.route}, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT]: {path: ROUTES.POLICY_ACCOUNTING_NETSUITE_IMPORT.route}, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_MAPPING]: {path: ROUTES.POLICY_ACCOUNTING_NETSUITE_IMPORT_MAPPING.route}, + [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_CUSTOM_FIELD]: {path: ROUTES.POLICY_ACCOUNTING_NETSUITE_IMPORT_CUSTOM_FIELD_MAPPING.route}, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_EXPORT]: { path: ROUTES.POLICY_ACCOUNTING_NETSUITE_EXPORT.route, }, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 782230ff093ed..9ed56ff863ee5 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -406,6 +406,10 @@ type SettingsNavigatorParamList = { policyID: string; importField: TupleToUnion; }; + [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_CUSTOM_FIELD]: { + policyID: string; + importCustomField: TupleToUnion; + }; [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_EXPORT]: { policyID: string; }; diff --git a/src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage.tsx b/src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage.tsx new file mode 100644 index 0000000000000..8fcecfbce0fac --- /dev/null +++ b/src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage.tsx @@ -0,0 +1,66 @@ +import {ExpensiMark} from 'expensify-common'; +import React, {useMemo} from 'react'; +import {View} from 'react-native'; +import type {TupleToUnion} from 'type-fest'; +import RenderHTML from '@components/RenderHTML'; +import withPolicyConnections from '@pages/workspace/withPolicyConnections'; +import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; +import SelectionScreen from '@components/SelectionScreen'; +import CONST from '@src/CONST'; +import MenuItem from '@components/MenuItem'; +import useThemeStyles from '@hooks/useThemeStyles'; +import useLocalize from '@hooks/useLocalize'; +import Navigation from '@libs/Navigation/Navigation'; + +const parser = new ExpensiMark(); + +type ImportCustomFieldsKeys = TupleToUnion; + +type NetSuiteImportCustomFieldPageProps = WithPolicyConnectionsProps & { + route: { + params: { + importCustomField: ImportCustomFieldsKeys; + }; + }; +}; + + +function NetSuiteImportCustomFieldPage({policy, + route: { + params: {importCustomField}, + }, +}: NetSuiteImportCustomFieldPageProps) { + const policyID = policy?.id ?? '-1'; + const styles = useThemeStyles(); + const {translate} = useLocalize(); + + const customListData = []; + + const listHeaderComponent = useMemo( + () => ( + + ${parser.replace(`Test Description ${importCustomField}`)}`} + /> + + ), + [styles.ph5, styles.mt2, styles.mb4, importCustomField], +); + + return 0 ? [{data: customListData}] : []} + listItem={MenuItem} + onSelectRow={() => {}} + connectionName={CONST.POLICY.CONNECTIONS.NAME.NETSUITE} + headerContent={listHeaderComponent} + onBackButtonPress={() => Navigation.goBack()} + title='common.tax' +/> +} + +NetSuiteImportCustomFieldPage.displayName = 'NetSuiteImportCustomFieldPage'; +export default withPolicyConnections(NetSuiteImportCustomFieldPage); diff --git a/src/pages/workspace/accounting/netsuite/import/NetSuiteImportPage.tsx b/src/pages/workspace/accounting/netsuite/import/NetSuiteImportPage.tsx index fe7afe7779c12..e9c1a5224f58e 100644 --- a/src/pages/workspace/accounting/netsuite/import/NetSuiteImportPage.tsx +++ b/src/pages/workspace/accounting/netsuite/import/NetSuiteImportPage.tsx @@ -103,7 +103,7 @@ function NetSuiteImportPage({policy}: WithPolicyConnectionsProps) { description={translate(`workspace.netsuite.import.importCustomFields.${importField}`)} shouldShowRightIcon onPress={() => { - // TODO: Navigation will be handled in future PRs + Navigation.navigate(ROUTES.POLICY_ACCOUNTING_NETSUITE_IMPORT_CUSTOM_FIELD_MAPPING.getRoute(policyID, importField)); }} brickRoadIndicator={config?.errorFields?.[importField] ? CONST.BRICK_ROAD_INDICATOR_STATUS.ERROR : undefined} /> From b65100befb91d6346609438a0eab933dba523214 Mon Sep 17 00:00:00 2001 From: Manan Jadhav Date: Wed, 3 Jul 2024 05:32:44 +0530 Subject: [PATCH 02/34] feat: list data setup --- src/ROUTES.ts | 2 +- src/languages/en.ts | 18 ++- src/languages/es.ts | 18 ++- .../ModalStackNavigators/index.tsx | 3 +- .../import/NetSuiteImportCustomFieldPage.tsx | 104 +++++++++++------- .../netsuite/import/NetSuiteImportPage.tsx | 2 +- 6 files changed, 98 insertions(+), 49 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index ec6b4438c3e3f..f182d9c358236 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -950,7 +950,7 @@ const ROUTES = { `settings/workspaces/${policyID}/accounting/netsuite/import/mapping/${importField}` as const, }, POLICY_ACCOUNTING_NETSUITE_IMPORT_CUSTOM_FIELD_MAPPING: { - route: 'settings/workspaces/:policyID/accounting/netsuite/import/custom/:importField', + route: 'settings/workspaces/:policyID/accounting/netsuite/import/custom/:importCustomField', getRoute: (policyID: string, importCustomField: TupleToUnion) => `settings/workspaces/${policyID}/accounting/netsuite/import/custom/${importCustomField}` as const, }, diff --git a/src/languages/en.ts b/src/languages/en.ts index 338dc7e9f49ab..13cbe5c44356c 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -2321,8 +2321,22 @@ export default { }, importTaxDescription: 'Import tax groups from NetSuite', importCustomFields: { - customSegments: 'Custom segments/records', - customLists: 'Custom lists', + customSegments: { + title: 'Custom segments/records', + addButtonText: 'Add custom segment/record', + recordTitle: 'Custom segment', + helpLink: + '[View detailed instructions](https://help.expensify.com/articles/expensify-classic/integrations/accounting-integrations/NetSuite#custom-segments) on configuring custom segements/records.', + emptyTitle: 'Add a custom segment or custom record', + }, + customLists: { + title: 'Custom lists', + addButtonText: 'Add custom list', + recordTitle: 'Custom list', + helpLink: + '[View detailed instructions](https://help.expensify.com/articles/expensify-classic/integrations/accounting-integrations/NetSuite#custom-lists) on configuring custom lists.', + emptyTitle: 'Add a custom list', + }, }, importTypes: { [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: { diff --git a/src/languages/es.ts b/src/languages/es.ts index b58a880e8366f..9409cf602371b 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -2353,8 +2353,22 @@ export default { }, importTaxDescription: 'Importar grupos de impuestos desde NetSuite', importCustomFields: { - customSegments: 'Segmentos/registros personalizado', - customLists: 'Listas personalizado', + customSegments: { + title: 'Segmentos/registros personalizado', + addButtonText: 'Añadir segmento/registro personalizado', + recordTitle: 'Segmento personalizado', + helpLink: + '[Ver instrucciones detalladas](https://help.expensify.com/articles/expensify-classic/integrations/accounting-integrations/NetSuite#custom-segments) sobre la configuración de segmentos/registros personalizado.', + emptyTitle: 'Añadir un segmento personalizado o un registro personalizado', + }, + customLists: { + title: 'Listas personalizado', + addButtonText: 'Añadir lista personalizado', + recordTitle: 'Lista personalizado', + helpLink: + '[Ver instrucciones detalladas](https://help.expensify.com/articles/expensify-classic/integrations/accounting-integrations/NetSuite#custom-lists) sobre cómo configurar listas personalizado.', + emptyTitle: 'Add a custom list', + }, }, importTypes: { [CONST.INTEGRATION_ENTITY_MAP_TYPES.NETSUITE_DEFAULT]: { diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index ea7da33cc75c1..955bd29ac6eb3 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -322,7 +322,8 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../../pages/workspace/accounting/netsuite/NetSuiteSubsidiarySelector').default, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT]: () => require('../../../../pages/workspace/accounting/netsuite/import/NetSuiteImportPage').default, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_MAPPING]: () => require('../../../../pages/workspace/accounting/netsuite/import/NetSuiteImportMappingPage').default, - [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_CUSTOM_FIELD]: () => require('../../../../pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage').default, + [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_CUSTOM_FIELD]: () => + require('../../../../pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage').default, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_EXPORT]: () => require('../../../../pages/workspace/accounting/netsuite/export/NetSuiteExportConfigurationPage').default, [SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_PREFERRED_EXPORTER_SELECT]: () => require('../../../../pages/workspace/accounting/netsuite/export/NetSuitePreferredExporterSelectPage').default, diff --git a/src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage.tsx b/src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage.tsx index 8fcecfbce0fac..c1abbd9070ddd 100644 --- a/src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage.tsx +++ b/src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldPage.tsx @@ -2,64 +2,84 @@ import {ExpensiMark} from 'expensify-common'; import React, {useMemo} from 'react'; import {View} from 'react-native'; import type {TupleToUnion} from 'type-fest'; +import Button from '@components/Button'; +import ConnectionLayout from '@components/ConnectionLayout'; +import FixedFooter from '@components/FixedFooter'; +import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; import RenderHTML from '@components/RenderHTML'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; import withPolicyConnections from '@pages/workspace/withPolicyConnections'; import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections'; -import SelectionScreen from '@components/SelectionScreen'; import CONST from '@src/CONST'; -import MenuItem from '@components/MenuItem'; -import useThemeStyles from '@hooks/useThemeStyles'; -import useLocalize from '@hooks/useLocalize'; -import Navigation from '@libs/Navigation/Navigation'; const parser = new ExpensiMark(); type ImportCustomFieldsKeys = TupleToUnion; type NetSuiteImportCustomFieldPageProps = WithPolicyConnectionsProps & { - route: { - params: { - importCustomField: ImportCustomFieldsKeys; - }; - }; + route: { + params: { + importCustomField: ImportCustomFieldsKeys; + }; + }; }; - -function NetSuiteImportCustomFieldPage({policy, - route: { - params: {importCustomField}, - }, +function NetSuiteImportCustomFieldPage({ + policy, + route: { + params: {importCustomField}, + }, }: NetSuiteImportCustomFieldPageProps) { - const policyID = policy?.id ?? '-1'; - const styles = useThemeStyles(); - const {translate} = useLocalize(); + const policyID = policy?.id ?? '-1'; + const styles = useThemeStyles(); + const {translate} = useLocalize(); + + const config = policy?.connections?.netsuite?.options?.config; + const data = config?.syncOptions?.[importCustomField] ?? []; + + const listHeaderComponent = useMemo( + () => ( + + ${parser.replace(translate(`workspace.netsuite.import.importCustomFields.${importCustomField}.helpLink`))}`} /> + + ), + [styles.ph5, styles.mt2, styles.mb4, translate, importCustomField], + ); - const customListData = []; + return ( + + {data.length > 0 && listHeaderComponent} - const listHeaderComponent = useMemo( - () => ( - - ${parser.replace(`Test Description ${importCustomField}`)}`} - /> - - ), - [styles.ph5, styles.mt2, styles.mb4, importCustomField], -); + + {data.map((record) => ( + {}} + /> + ))} + - return 0 ? [{data: customListData}] : []} - listItem={MenuItem} - onSelectRow={() => {}} - connectionName={CONST.POLICY.CONNECTIONS.NAME.NETSUITE} - headerContent={listHeaderComponent} - onBackButtonPress={() => Navigation.goBack()} - title='common.tax' -/> + +