diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 0126d8736f1f..05872df290b3 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -437,6 +437,54 @@ const ROUTES = { getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '', reportActionID?: string) => getUrlWithBackToParam(`${action as string}/${iouType as string}/category/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo), }, + SETTINGS_TAGS_ROOT: { + route: 'settings/:policyID/tags', + getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags`, backTo), + }, + SETTINGS_TAGS_SETTINGS: { + route: 'settings/:policyID/tags/settings', + getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags/settings` as const, backTo), + }, + SETTINGS_TAGS_EDIT: { + route: 'settings/:policyID/tags/:orderWeight/edit', + getRoute: (policyID: string, orderWeight: number, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags/${orderWeight}/edit` as const, backTo), + }, + SETTINGS_TAG_CREATE: { + route: 'settings/:policyID/tags/new', + getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags/new` as const, backTo), + }, + SETTINGS_TAG_EDIT: { + route: 'settings/:policyID/tag/:orderWeight/:tagName/edit', + getRoute: (policyID: string, orderWeight: number, tagName: string, backTo = '') => + getUrlWithBackToParam(`settings/${policyID}/tag/${orderWeight}/${encodeURIComponent(tagName)}/edit` as const, backTo), + }, + SETTINGS_TAG_SETTINGS: { + route: 'settings/:policyID/tag/:orderWeight/:tagName', + getRoute: (policyID: string, orderWeight: number, tagName: string, backTo = '') => + getUrlWithBackToParam(`settings/${policyID}/tag/${orderWeight}/${encodeURIComponent(tagName)}` as const, backTo), + }, + SETTINGS_TAG_APPROVER: { + route: 'settings/:policyID/tag/:orderWeight/:tagName/approver', + getRoute: (policyID: string, orderWeight: number, tagName: string, backTo = '') => + getUrlWithBackToParam(`settings/${policyID}/tag/${orderWeight}/${tagName}/approver` as const, backTo), + }, + SETTINGS_TAG_LIST_VIEW: { + route: 'settings/:policyID/tag-list/:orderWeight', + getRoute: (policyID: string, orderWeight: number, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tag-list/${orderWeight}` as const, backTo), + }, + SETTINGS_TAG_GL_CODE: { + route: 'settings/:policyID/tag/:orderWeight/:tagName/gl-code', + getRoute: (policyID: string, orderWeight: number, tagName: string, backTo = '') => + getUrlWithBackToParam(`settings/${policyID}/tag/${orderWeight}/${encodeURIComponent(tagName)}/gl-code` as const, backTo), + }, + SETTINGS_TAGS_IMPORT: { + route: 'settings/:policyID/tags/import', + getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags/import` as const, backTo), + }, + SETTINGS_TAGS_IMPORTED: { + route: 'settings/:policyID/tags/imported', + getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags/imported` as const, backTo), + }, SETTINGS_CATEGORIES_ROOT: { route: 'settings/:policyID/categories', getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/categories`, backTo), @@ -507,10 +555,6 @@ const ROUTES = { getRoute: (action: IOUAction, iouType: IOUType, orderWeight: number, transactionID: string, reportID: string, backTo = '', reportActionID?: string) => getUrlWithBackToParam(`${action as string}/${iouType as string}/tag/${orderWeight}/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo), }, - SETTINGS_TAGS_ROOT: { - route: 'settings/:policyID/tags', - getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/tags`, backTo), - }, MONEY_REQUEST_STEP_WAYPOINT: { route: ':action/:iouType/waypoint/:transactionID/:reportID/:pageIndex', getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID?: string, pageIndex = '', backTo = '') => diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 0e87ec8c36c7..e22f0877b58a 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -176,6 +176,7 @@ const SCREENS = { SEARCH_ADVANCED_FILTERS: 'SearchAdvancedFilters', SEARCH_SAVED_SEARCH: 'SearchSavedSearch', SETTINGS_CATEGORIES: 'SettingsCategories', + SETTINGS_TAGS: 'SettingsTags', EXPENSIFY_CARD: 'ExpensifyCard', DOMAIN_CARD: 'DomainCard', RESTRICTED_ACTION: 'RestrictedAction', @@ -257,7 +258,19 @@ const SCREENS = { DOMAIN_CARD_REPORT_FRAUD: 'Domain_Card_Report_Fraud', }, - SETTINGS_TAGS_ROOT: 'Settings_Tags', + SETTINGS_TAGS: { + SETTINGS_TAGS_ROOT: 'Settings_Tags', + SETTINGS_TAGS_SETTINGS: 'Settings_Tags_Settings', + SETTINGS_TAGS_EDIT: 'Settings_Tags_Edit', + SETTINGS_TAG_CREATE: 'Settings_Tag_Create', + SETTINGS_TAG_EDIT: 'Settings_Tag_Edit', + SETTINGS_TAG_SETTINGS: 'Settings_Tag_Settings', + SETTINGS_TAG_APPROVER: 'Settings_Tag_Approver', + SETTINGS_TAG_LIST_VIEW: 'Settings_Tag_List_View', + SETTINGS_TAG_GL_CODE: 'Settings_Tag_GL_Code', + SETTINGS_TAGS_IMPORT: 'Settings_Tags_Import', + SETTINGS_TAGS_IMPORTED: 'Settings_Tags_Imported', + }, REPORT_SETTINGS: { ROOT: 'Report_Settings_Root', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 8416b9d1fdef..695166a20197 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -87,7 +87,7 @@ const MoneyRequestModalStackNavigator = createModalStackNavigator require('../../../../pages/iou/request/step/IOURequestStepMerchant').default, [SCREENS.MONEY_REQUEST.STEP_PARTICIPANTS]: () => require('../../../../pages/iou/request/step/IOURequestStepParticipants').default, [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORIES_ROOT]: () => require('../../../../pages/workspace/categories/WorkspaceCategoriesPage').default, - [SCREENS.SETTINGS_TAGS_ROOT]: () => require('../../../../pages/workspace/tags/WorkspaceTagsPage').default, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_ROOT]: () => require('../../../../pages/workspace/tags/WorkspaceTagsPage').default, [SCREENS.MONEY_REQUEST.STEP_SCAN]: () => require('../../../../pages/iou/request/step/IOURequestStepScan').default, [SCREENS.MONEY_REQUEST.STEP_TAG]: () => require('../../../../pages/iou/request/step/IOURequestStepTag').default, [SCREENS.MONEY_REQUEST.STEP_WAYPOINT]: () => require('../../../../pages/iou/request/step/IOURequestStepWaypoint').default, @@ -144,6 +144,19 @@ const CategoriesModalStackNavigator = createModalStackNavigator({ [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORY_SETTINGS]: () => require('../../../../pages/workspace/categories/CategorySettingsPage').default, }); +const TagsModalStackNavigator = createModalStackNavigator({ + [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_SETTINGS]: () => require('../../../../pages/workspace/tags/WorkspaceTagsSettingsPage').default, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_EDIT]: () => require('../../../../pages/workspace/tags/WorkspaceEditTagsPage').default, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_IMPORT]: () => require('../../../../pages/workspace/tags/ImportTagsPage').default, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_IMPORTED]: () => require('../../../../pages/workspace/tags/ImportedTagsPage').default, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_SETTINGS]: () => require('../../../../pages/workspace/tags/TagSettingsPage').default, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_LIST_VIEW]: () => require('../../../../pages/workspace/tags/WorkspaceViewTagsPage').default, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_CREATE]: () => require('../../../../pages/workspace/tags/WorkspaceCreateTagPage').default, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_EDIT]: () => require('../../../../pages/workspace/tags/EditTagPage').default, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_APPROVER]: () => require('../../../../pages/workspace/tags/TagApproverPage').default, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_GL_CODE]: () => require('../../../../pages/workspace/tags/TagGLCodePage').default, +}); + const ExpensifyCardModalStackNavigator = createModalStackNavigator({ [SCREENS.EXPENSIFY_CARD.EXPENSIFY_CARD_DETAILS]: () => require('../../../../pages/workspace/expensifyCard/WorkspaceExpensifyCardDetailsPage').default, [SCREENS.EXPENSIFY_CARD.EXPENSIFY_CARD_NAME]: () => require('../../../../pages/workspace/expensifyCard/WorkspaceEditCardNamePage').default, @@ -624,6 +637,7 @@ export { SettingsModalStackNavigator, SignInModalStackNavigator, CategoriesModalStackNavigator, + TagsModalStackNavigator, ExpensifyCardModalStackNavigator, DomainCardModalStackNavigator, SplitDetailsModalStackNavigator, diff --git a/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx b/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx index 0df3ae3f4b92..da1ce32bf747 100644 --- a/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx +++ b/src/libs/Navigation/AppNavigator/Navigators/RightModalNavigator.tsx @@ -103,6 +103,10 @@ function RightModalNavigator({navigation, route}: RightModalNavigatorProps) { name={SCREENS.RIGHT_MODAL.SETTINGS_CATEGORIES} component={ModalStackNavigators.CategoriesModalStackNavigator} /> + ['config'] = { }, }, }, + [SCREENS.RIGHT_MODAL.SETTINGS_TAGS]: { + screens: { + [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_SETTINGS]: { + path: ROUTES.SETTINGS_TAGS_SETTINGS.route, + }, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_EDIT]: { + path: ROUTES.SETTINGS_TAGS_EDIT.route, + parse: { + orderWeight: Number, + tagName: (tagName: string) => decodeURIComponent(tagName), + }, + }, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_CREATE]: { + path: ROUTES.SETTINGS_TAG_CREATE.route, + }, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_EDIT]: { + path: ROUTES.SETTINGS_TAG_EDIT.route, + parse: { + orderWeight: Number, + tagName: (tagName: string) => decodeURIComponent(tagName), + }, + }, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_SETTINGS]: { + path: ROUTES.SETTINGS_TAG_SETTINGS.route, + parse: { + orderWeight: Number, + tagName: (tagName: string) => decodeURIComponent(tagName), + }, + }, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_APPROVER]: { + path: ROUTES.SETTINGS_TAG_APPROVER.route, + parse: { + orderWeight: Number, + tagName: (tagName: string) => decodeURIComponent(tagName), + }, + }, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_LIST_VIEW]: { + path: ROUTES.SETTINGS_TAG_LIST_VIEW.route, + parse: { + orderWeight: Number, + }, + }, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAG_GL_CODE]: { + path: ROUTES.SETTINGS_TAG_GL_CODE.route, + parse: { + orderWeight: Number, + tagName: (tagName: string) => decodeURIComponent(tagName), + }, + }, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_IMPORT]: { + path: ROUTES.SETTINGS_TAGS_IMPORT.route, + }, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_IMPORTED]: { + path: ROUTES.SETTINGS_TAGS_IMPORTED.route, + }, + }, + }, + [SCREENS.RIGHT_MODAL.EXPENSIFY_CARD]: { screens: { [SCREENS.EXPENSIFY_CARD.EXPENSIFY_CARD_DETAILS]: { @@ -1043,7 +1101,7 @@ const config: LinkingOptions['config'] = { }, }, [SCREENS.SETTINGS_CATEGORIES.SETTINGS_CATEGORIES_ROOT]: ROUTES.SETTINGS_CATEGORIES_ROOT.route, - [SCREENS.SETTINGS_TAGS_ROOT]: ROUTES.SETTINGS_TAGS_ROOT.route, + [SCREENS.SETTINGS_TAGS.SETTINGS_TAGS_ROOT]: ROUTES.SETTINGS_TAGS_ROOT.route, [SCREENS.MONEY_REQUEST.STEP_SEND_FROM]: ROUTES.MONEY_REQUEST_STEP_SEND_FROM.route, [SCREENS.MONEY_REQUEST.STEP_COMPANY_INFO]: ROUTES.MONEY_REQUEST_STEP_COMPANY_INFO.route, [SCREENS.MONEY_REQUEST.STEP_AMOUNT]: ROUTES.MONEY_REQUEST_STEP_AMOUNT.route, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index 0d2a31e2494a..544e20c65991 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -257,6 +257,7 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.TAG_CREATE]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.DISTANCE_RATE_DETAILS]: { policyID: string; @@ -276,30 +277,37 @@ type SettingsNavigatorParamList = { }; [SCREENS.WORKSPACE.TAGS_SETTINGS]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.TAGS_IMPORT]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.TAGS_IMPORTED]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.TAG_SETTINGS]: { policyID: string; orderWeight: number; tagName: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.TAG_LIST_VIEW]: { policyID: string; orderWeight: number; + backTo?: Routes; }; [SCREENS.WORKSPACE.TAGS_EDIT]: { policyID: string; orderWeight: number; + backTo?: Routes; }; [SCREENS.WORKSPACE.TAG_EDIT]: { policyID: string; orderWeight: number; tagName: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.TAG_APPROVER]: { policyID: string; @@ -310,6 +318,7 @@ type SettingsNavigatorParamList = { policyID: string; orderWeight: number; tagName: string; + backTo?: Routes; }; [SCREENS.SETTINGS.SUBSCRIPTION.ROOT]: undefined; [SCREENS.SETTINGS.SUBSCRIPTION.SIZE]: { @@ -1252,6 +1261,7 @@ type RightModalNavigatorParamList = { [SCREENS.RIGHT_MODAL.REPORT_DETAILS]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.REPORT_SETTINGS]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.SETTINGS_CATEGORIES]: NavigatorScreenParams; + [SCREENS.RIGHT_MODAL.SETTINGS_TAGS]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.EXPENSIFY_CARD]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.DOMAIN_CARD]: NavigatorScreenParams; [SCREENS.RIGHT_MODAL.REPORT_DESCRIPTION]: NavigatorScreenParams; @@ -1347,6 +1357,7 @@ type FullScreenNavigatorParamList = { }; [SCREENS.WORKSPACE.TAGS]: { policyID: string; + backTo?: Routes; }; [SCREENS.WORKSPACE.TAXES]: { policyID: string; diff --git a/src/pages/workspace/tags/EditTagPage.tsx b/src/pages/workspace/tags/EditTagPage.tsx index c8cef174dbdb..2edea923755b 100644 --- a/src/pages/workspace/tags/EditTagPage.tsx +++ b/src/pages/workspace/tags/EditTagPage.tsx @@ -36,6 +36,7 @@ function EditTagPage({route, policyTags}: EditTagPageProps) { const {translate} = useLocalize(); const {inputCallbackRef} = useAutoFocusInput(); const currentTagName = PolicyUtils.getCleanedTagName(route.params.tagName); + const backTo = route.params.backTo; const validate = useCallback( (values: FormOnyxValues) => { diff --git a/src/pages/workspace/tags/ImportTagsPage.tsx b/src/pages/workspace/tags/ImportTagsPage.tsx index 0dd7c01f0af3..72ddeb8ca958 100644 --- a/src/pages/workspace/tags/ImportTagsPage.tsx +++ b/src/pages/workspace/tags/ImportTagsPage.tsx @@ -9,10 +9,11 @@ type ImportTagsPageProps = StackScreenProps ); diff --git a/src/pages/workspace/tags/ImportedTagsPage.tsx b/src/pages/workspace/tags/ImportedTagsPage.tsx index b2e95edc43a4..4d7ab1cfd76d 100644 --- a/src/pages/workspace/tags/ImportedTagsPage.tsx +++ b/src/pages/workspace/tags/ImportedTagsPage.tsx @@ -1,6 +1,7 @@ import type {StackScreenProps} from '@react-navigation/stack'; import React, {useCallback, useMemo, useState} from 'react'; import {useOnyx} from 'react-native-onyx'; +import type {Route} from 'src/ROUTES'; import ConfirmModal from '@components/ConfirmModal'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import type {ColumnRole} from '@components/ImportColumn'; @@ -30,6 +31,7 @@ function ImportedTagsPage({route}: ImportedTagsPageProps) { const {containsHeader = true} = spreadsheet ?? {}; const [isValidationEnabled, setIsValidationEnabled] = useState(false); const policyID = route.params.policyID; + const backTo = route.params.backTo; const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`); const policyTagLists = useMemo(() => PolicyUtils.getTagLists(policyTags), [policyTags]); const policy = usePolicy(policyID); @@ -126,7 +128,7 @@ function ImportedTagsPage({route}: ImportedTagsPageProps) { > Navigation.goBack(ROUTES.WORKSPACE_TAGS_IMPORT.getRoute(policyID))} + onBackButtonPress={() => Navigation.goBack(backTo ? ROUTES.SETTINGS_TAGS_IMPORT.getRoute(policyID, backTo) : ROUTES.WORKSPACE_TAGS_IMPORT.getRoute(policyID))} /> { - Navigation.goBack(ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(route.params.policyID, orderWeight, tagName)); + Navigation.goBack( + backTo + ? ROUTES.SETTINGS_TAG_SETTINGS.getRoute(route.params.policyID, orderWeight, tagName, backTo) + : ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(route.params.policyID, orderWeight, tagName), + ); }, [orderWeight, route.params.policyID, tagName]); const editGLCode = useCallback( diff --git a/src/pages/workspace/tags/TagSettingsPage.tsx b/src/pages/workspace/tags/TagSettingsPage.tsx index f5599ed4c269..a9ea25a0ffe2 100644 --- a/src/pages/workspace/tags/TagSettingsPage.tsx +++ b/src/pages/workspace/tags/TagSettingsPage.tsx @@ -32,7 +32,7 @@ type TagSettingsPageProps = StackScreenProps PolicyUtils.getTagList(policyTags, orderWeight), [policyTags, orderWeight]); @@ -57,7 +57,7 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) { const deleteTagAndHideModal = () => { Tag.deletePolicyTags(policyID, [currentPolicyTag.name]); setIsDeleteTagModalOpen(false); - Navigation.goBack(); + Navigation.goBack(backTo); }; const updateWorkspaceTagEnabled = (value: boolean) => { @@ -65,6 +65,10 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) { }; const navigateToEditTag = () => { + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAG_EDIT.getRoute(policyID, orderWeight, currentPolicyTag.name, backTo)); + return; + } Navigation.navigate(ROUTES.WORKSPACE_TAG_EDIT.getRoute(policyID, orderWeight, currentPolicyTag.name)); }; @@ -75,10 +79,18 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) { ); return; } + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAG_GL_CODE.getRoute(policyID, orderWeight, currentPolicyTag.name, backTo)); + return; + } Navigation.navigate(ROUTES.WORKSPACE_TAG_GL_CODE.getRoute(policyID, orderWeight, currentPolicyTag.name)); }; const navigateToEditTagApprover = () => { + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAG_APPROVER.getRoute(policyID, orderWeight, currentPolicyTag.name, backTo)); + return; + } Navigation.navigate(ROUTES.WORKSPACE_TAG_APPROVER.getRoute(policyID, orderWeight, currentPolicyTag.name)); }; @@ -104,6 +116,7 @@ function TagSettingsPage({route, navigation}: TagSettingsPageProps) { Navigation.goBack(backTo ? ROUTES.SETTINGS_TAGS_ROOT.getRoute(policyID, backTo) : ROUTES.WORKSPACE_TAGS.getRoute(policyID))} /> ) => { @@ -63,7 +64,7 @@ function CreateTagPage({route, policyTags}: CreateTagPageProps) { (values: FormOnyxValues) => { Tag.createPolicyTag(route.params.policyID, values.tagName.trim()); Keyboard.dismiss(); - Navigation.goBack(); + Navigation.goBack(backTo); }, [route.params.policyID], ); @@ -82,7 +83,7 @@ function CreateTagPage({route, policyTags}: CreateTagPageProps) { > Navigation.goBack(backTo)} /> PolicyUtils.getTagListName(policyTags, route.params.orderWeight), [policyTags, route.params.orderWeight]); const {inputCallbackRef} = useAutoFocusInput(); + const backTo = route.params.backTo; const validateTagName = useCallback( (values: FormOnyxValues) => { @@ -58,7 +59,7 @@ function WorkspaceEditTagsPage({route, policyTags}: WorkspaceEditTagsPageProps) if (values[INPUT_IDS.POLICY_TAGS_NAME] !== taglistName) { Tag.renamePolicyTaglist(route.params.policyID, {oldName: taglistName, newName: values[INPUT_IDS.POLICY_TAGS_NAME]}, policyTags, route.params.orderWeight); } - Navigation.goBack(); + Navigation.goBack(backTo); }, [policyTags, route.params.orderWeight, route.params.policyID, taglistName], ); diff --git a/src/pages/workspace/tags/WorkspaceTagsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsPage.tsx index 115944ae45c0..649a3c22b7ec 100644 --- a/src/pages/workspace/tags/WorkspaceTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsPage.tsx @@ -62,6 +62,7 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { const [isOfflineModalVisible, setIsOfflineModalVisible] = useState(false); const isFocused = useIsFocused(); const policyID = route.params.policyID ?? '-1'; + const backTo = route.params.backTo; const policy = usePolicy(policyID); const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`); const {selectionMode} = useMobileSelectionMode(); @@ -70,7 +71,6 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { const currentConnectionName = PolicyUtils.getCurrentConnectionName(policy); const [policyTagLists, isMultiLevelTags] = useMemo(() => [PolicyUtils.getTagLists(policyTags), PolicyUtils.isMultiLevelTags(policyTags)], [policyTags]); const canSelectMultiple = !isMultiLevelTags && (shouldUseNarrowLayout ? selectionMode?.isEnabled : true); - const fetchTags = useCallback(() => { Tag.openPolicyTagsPage(policyID); }, [policyID]); @@ -172,18 +172,34 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { }; const navigateToTagsSettings = () => { + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAGS_SETTINGS.getRoute(policyID, backTo)); + return; + } Navigation.navigate(ROUTES.WORKSPACE_TAGS_SETTINGS.getRoute(policyID)); }; const navigateToCreateTagPage = () => { + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAG_CREATE.getRoute(policyID, backTo)); + return; + } Navigation.navigate(ROUTES.WORKSPACE_TAG_CREATE.getRoute(policyID)); }; const navigateToTagSettings = (tag: TagListItem) => { if (tag.orderWeight !== undefined) { + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAG_LIST_VIEW.getRoute(policyID, tag.orderWeight, backTo)); + return; + } Navigation.navigate(ROUTES.WORKSPACE_TAG_LIST_VIEW.getRoute(policyID, tag.orderWeight)); return; } + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAG_SETTINGS.getRoute(policyID, 0, tag.value, backTo)); + return; + } Navigation.navigate(ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(policyID, 0, tag.value)); }; @@ -304,6 +320,10 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { Modal.close(() => setIsOfflineModalVisible(true)); return; } + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAGS_IMPORT.getRoute(policyID, backTo)); + return; + } Navigation.navigate(ROUTES.WORKSPACE_TAGS_IMPORT.getRoute(policyID)); }, }, @@ -374,7 +394,7 @@ function WorkspaceTagsPage({route}: WorkspaceTagsPageProps) { turnOffMobileSelectionMode(); return; } - Navigation.goBack(); + Navigation.goBack(backTo); }} shouldShowThreeDotsButton={!policy?.hasMultipleTagLists} threeDotsMenuItems={threeDotsMenuItems} diff --git a/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx index b5b527dc4dfa..9973e4d071ae 100644 --- a/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsSettingsPage.tsx @@ -2,7 +2,7 @@ import type {StackScreenProps} from '@react-navigation/stack'; import React, {useCallback, useMemo} from 'react'; import {View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; -import {withOnyx} from 'react-native-onyx'; +import {useOnyx} from 'react-native-onyx'; import FullPageOfflineBlockingView from '@components/BlockingViews/FullPageOfflineBlockingView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; @@ -27,11 +27,7 @@ import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; import type * as OnyxTypes from '@src/types/onyx'; -type WorkspaceTagsSettingsPageOnyxProps = { - /** Collection of tags attached to a policy */ - policyTags: OnyxEntry; -}; -type WorkspaceTagsSettingsPageProps = WorkspaceTagsSettingsPageOnyxProps & StackScreenProps; +type WorkspaceTagsSettingsPageProps = StackScreenProps; /** * The pending state might be set by either setPolicyBillableMode or disableWorkspaceBillableExpenses. @@ -53,8 +49,10 @@ function toggleBillableExpenses(policy: OnyxEntry) { } } -function WorkspaceTagsSettingsPage({route, policyTags}: WorkspaceTagsSettingsPageProps) { - const policyID = route.params.policyID; +function WorkspaceTagsSettingsPage({route}: WorkspaceTagsSettingsPageProps) { + const policyID = route.params.policyID ?? '-1'; + const backTo = route.params.backTo; + const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`); const styles = useThemeStyles(); const {translate} = useLocalize(); const [policyTagLists, isMultiLevelTags] = useMemo(() => [PolicyUtils.getTagLists(policyTags), PolicyUtils.isMultiLevelTags(policyTags)], [policyTags]); @@ -62,7 +60,6 @@ function WorkspaceTagsSettingsPage({route, policyTags}: WorkspaceTagsSettingsPag const {isOffline} = useNetwork(); const hasEnabledOptions = OptionsListUtils.hasEnabledOptions(Object.values(policyTags ?? {}).flatMap(({tags}) => Object.values(tags))); const {canUseWorkspaceRules} = usePermissions(); - const updateWorkspaceRequiresTag = useCallback( (value: boolean) => { Tag.setPolicyRequiresTag(policyID, value); @@ -82,7 +79,13 @@ function WorkspaceTagsSettingsPage({route, policyTags}: WorkspaceTagsSettingsPag Navigation.navigate(ROUTES.WORKSPACE_EDIT_TAGS.getRoute(policyID, policyTagLists.at(0)?.orderWeight ?? 0))} + onPress={() => { + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAGS_EDIT.getRoute(policyID, policyTagLists.at(0)?.orderWeight ?? 0, backTo)); + return; + } + Navigation.navigate(ROUTES.WORKSPACE_EDIT_TAGS.getRoute(policyID, policyTagLists.at(0)?.orderWeight ?? 0)); + }} shouldShowRightIcon /> @@ -128,7 +131,10 @@ function WorkspaceTagsSettingsPage({route, policyTags}: WorkspaceTagsSettingsPag style={[styles.defaultModalContainer]} testID={WorkspaceTagsSettingsPage.displayName} > - + Navigation.goBack(backTo)} + /> {isOffline && isLoading ? {getTagsSettings(policy)} : getTagsSettings(policy)} )} @@ -138,8 +144,4 @@ function WorkspaceTagsSettingsPage({route, policyTags}: WorkspaceTagsSettingsPag WorkspaceTagsSettingsPage.displayName = 'WorkspaceTagsSettingsPage'; -export default withOnyx({ - policyTags: { - key: ({route}) => `${ONYXKEYS.COLLECTION.POLICY_TAGS}${route.params.policyID}`, - }, -})(WorkspaceTagsSettingsPage); +export default WorkspaceTagsSettingsPage; diff --git a/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx b/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx index a01707a04740..6db4d0c318bc 100644 --- a/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceViewTagsPage.tsx @@ -15,6 +15,7 @@ import ListItemRightCaretWithLabel from '@components/SelectionList/ListItemRight import TableListItem from '@components/SelectionList/TableListItem'; import SelectionListWithModal from '@components/SelectionListWithModal'; import Text from '@components/Text'; + import useLocalize from '@hooks/useLocalize'; import useMobileSelectionMode from '@hooks/useMobileSelectionMode'; import useNetwork from '@hooks/useNetwork'; @@ -53,6 +54,7 @@ function WorkspaceViewTagsPage({route}: WorkspaceViewTagsProps) { const [isDeleteTagsConfirmModalVisible, setIsDeleteTagsConfirmModalVisible] = useState(false); const isFocused = useIsFocused(); const policyID = route.params.policyID ?? '-1'; + const backTo = route.params.backTo; const policy = usePolicy(policyID); const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`); const {selectionMode} = useMobileSelectionMode(); @@ -141,6 +143,10 @@ function WorkspaceViewTagsPage({route}: WorkspaceViewTagsProps) { }; const navigateToTagSettings = (tag: TagListItem) => { + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAG_SETTINGS.getRoute(policyID, route.params.orderWeight, tag.value, backTo)); + return; + } Navigation.navigate(ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(policyID, route.params.orderWeight, tag.value)); }; @@ -237,6 +243,10 @@ function WorkspaceViewTagsPage({route}: WorkspaceViewTagsProps) { } const navigateToEditTag = () => { + if (backTo) { + Navigation.navigate(ROUTES.SETTINGS_TAGS_EDIT.getRoute(route.params.policyID, currentPolicyTag?.orderWeight ?? 0, backTo)); + return; + } Navigation.navigate(ROUTES.WORKSPACE_EDIT_TAGS.getRoute(route.params.policyID, currentPolicyTag?.orderWeight ?? 0)); };