From 88a193da532822dbd93ef74bd29b35b39cc88b8d Mon Sep 17 00:00:00 2001 From: Artem Makushov Date: Thu, 14 Mar 2024 19:00:58 +0100 Subject: [PATCH 1/5] tag settings page --- src/ROUTES.ts | 4 + src/SCREENS.ts | 1 + src/languages/en.ts | 1 + src/languages/es.ts | 1 + .../API/parameters/SetPolicyTagsEnabled.ts | 10 ++ src/libs/API/parameters/index.ts | 2 +- src/libs/API/types.ts | 2 + .../AppNavigator/ModalStackNavigators.tsx | 1 + .../FULL_SCREEN_TO_RHP_MAPPING.ts | 2 +- src/libs/Navigation/linkingConfig/config.ts | 6 ++ src/libs/Navigation/types.ts | 6 +- src/libs/actions/Policy.ts | 89 ++++++++++++++++++ src/pages/workspace/tags/TagSettingsPage.tsx | 92 +++++++++++++++++++ .../workspace/tags/WorkspaceTagsPage.tsx | 12 ++- 14 files changed, 225 insertions(+), 4 deletions(-) create mode 100644 src/libs/API/parameters/SetPolicyTagsEnabled.ts create mode 100644 src/pages/workspace/tags/TagSettingsPage.tsx diff --git a/src/ROUTES.ts b/src/ROUTES.ts index ad2d9c10700b..d38d24af1cc1 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -585,6 +585,10 @@ const ROUTES = { route: 'settings/workspaces/:policyID/tags/edit', getRoute: (policyID: string) => `settings/workspaces/${policyID}/tags/edit` as const, }, + WORKSPACE_TAG_SETTINGS: { + route: 'settings/workspaces/:policyID/tag/:tagName', + getRoute: (policyID: string, tagName: string) => `settings/workspaces/${policyID}/tag/${encodeURIComponent(tagName)}` as const, + }, WORKSPACE_TAXES: { route: 'settings/workspaces/:policyID/taxes', getRoute: (policyID: string) => `settings/workspaces/${policyID}/taxes` as const, diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 6c742f08bfb7..cca9d765f3f1 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -221,6 +221,7 @@ const SCREENS = { TAGS_EDIT: 'Tags_Edit', TAXES: 'Workspace_Taxes', TAG_CREATE: 'Tag_Create', + TAG_SETTINGS: 'Tag_Settings', CURRENCY: 'Workspace_Profile_Currency', WORKFLOWS: 'Workspace_Workflows', WORKFLOWS_PAYER: 'Workspace_Workflows_Payer', diff --git a/src/languages/en.ts b/src/languages/en.ts index 6ec5983583fc..e92d69d354b9 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -1836,6 +1836,7 @@ export default { }, }, tags: { + tagName: 'Tag name', requiresTag: 'Members must tag all spend', customTagName: 'Custom tag name', enableTag: 'Enable tag', diff --git a/src/languages/es.ts b/src/languages/es.ts index c2eb6374affa..d56c373bb328 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1860,6 +1860,7 @@ export default { }, }, tags: { + tagName: 'Nombre de etiqueta', requiresTag: 'Los miembros deben etiquetar todos los gastos', customTagName: 'Nombre de etiqueta personalizada', enableTag: 'Habilitar etiqueta', diff --git a/src/libs/API/parameters/SetPolicyTagsEnabled.ts b/src/libs/API/parameters/SetPolicyTagsEnabled.ts new file mode 100644 index 000000000000..86720b84bf8b --- /dev/null +++ b/src/libs/API/parameters/SetPolicyTagsEnabled.ts @@ -0,0 +1,10 @@ +type SetPolicyTagsEnabled = { + policyID: string; + /** + * Stringified JSON object with type of following structure: + * Array<{name: string; enabled: boolean}> + */ + tags: string; +}; + +export default SetPolicyTagsEnabled; diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index 25c336753203..1c7b6aae8378 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -166,7 +166,7 @@ export type {default as EnablePolicyCategoriesParams} from './EnablePolicyCatego export type {default as EnablePolicyConnectionsParams} from './EnablePolicyConnectionsParams'; export type {default as EnablePolicyDistanceRatesParams} from './EnablePolicyDistanceRatesParams'; export type {default as EnablePolicyTagsParams} from './EnablePolicyTagsParams'; -export type {default as EnablePolicyTaxesParams} from './EnablePolicyTaxesParams'; +export type {default as SetPolicyTagsEnabled} from './SetPolicyTagsEnabled'; export type {default as EnablePolicyWorkflowsParams} from './EnablePolicyWorkflowsParams'; export type {default as EnablePolicyReportFieldsParams} from './EnablePolicyReportFieldsParams'; export type {default as AcceptJoinRequestParams} from './AcceptJoinRequest'; diff --git a/src/libs/API/types.ts b/src/libs/API/types.ts index 07f1ca09d7c5..3b1d99c64cc6 100644 --- a/src/libs/API/types.ts +++ b/src/libs/API/types.ts @@ -117,6 +117,7 @@ const WRITE_COMMANDS = { CREATE_WORKSPACE: 'CreateWorkspace', CREATE_WORKSPACE_FROM_IOU_PAYMENT: 'CreateWorkspaceFromIOUPayment', SET_WORKSPACE_CATEGORIES_ENABLED: 'SetWorkspaceCategoriesEnabled', + SET_POLICY_TAGS_ENABLED: 'SetPolicyTagsEnabled', CREATE_WORKSPACE_CATEGORIES: 'CreateWorkspaceCategories', CREATE_POLICY_TAG: 'CreatePolicyTag', SET_WORKSPACE_REQUIRES_CATEGORY: 'SetWorkspaceRequiresCategory', @@ -287,6 +288,7 @@ type WriteCommandParameters = { [WRITE_COMMANDS.SET_POLICY_REQUIRES_TAG]: Parameters.SetPolicyRequiresTag; [WRITE_COMMANDS.RENAME_POLICY_TAG_LIST]: Parameters.RenamePolicyTaglist; [WRITE_COMMANDS.CREATE_POLICY_TAG]: Parameters.CreatePolicyTagsParams; + [WRITE_COMMANDS.SET_POLICY_TAGS_ENABLED]: Parameters.SetPolicyTagsEnabled; [WRITE_COMMANDS.CREATE_TASK]: Parameters.CreateTaskParams; [WRITE_COMMANDS.CANCEL_TASK]: Parameters.CancelTaskParams; [WRITE_COMMANDS.EDIT_TASK_ASSIGNEE]: Parameters.EditTaskAssigneeParams; diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx index a4d7593cf750..47400a2aaaa5 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators.tsx @@ -264,6 +264,7 @@ const SettingsModalStackNavigator = createModalStackNavigator require('../../../pages/workspace/members/WorkspaceMemberDetailsRoleSelectionPage').default as React.ComponentType, [SCREENS.WORKSPACE.CATEGORY_CREATE]: () => require('../../../pages/workspace/categories/CreateCategoryPage').default as React.ComponentType, [SCREENS.WORKSPACE.TAGS_SETTINGS]: () => require('../../../pages/workspace/tags/WorkspaceTagsSettingsPage').default as React.ComponentType, + [SCREENS.WORKSPACE.TAG_SETTINGS]: () => require('../../../pages/workspace/tags/TagSettingsPage').default as React.ComponentType, [SCREENS.WORKSPACE.TAGS_EDIT]: () => require('../../../pages/workspace/tags/WorkspaceEditTagsPage').default as React.ComponentType, [SCREENS.WORKSPACE.TAG_CREATE]: () => require('../../../pages/workspace/tags/WorkspaceCreateTagPage').default as React.ComponentType, [SCREENS.REIMBURSEMENT_ACCOUNT]: () => require('../../../pages/ReimbursementAccount/ReimbursementAccountPage').default as React.ComponentType, 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 fd108f2c95f3..33df19df8612 100755 --- a/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts +++ b/src/libs/Navigation/linkingConfig/FULL_SCREEN_TO_RHP_MAPPING.ts @@ -11,7 +11,7 @@ const FULL_SCREEN_TO_RHP_MAPPING: Partial> = { SCREENS.WORKSPACE.WORKFLOWS_AUTO_REPORTING_MONTHLY_OFFSET, SCREENS.WORKSPACE.WORKFLOWS_PAYER, ], - [SCREENS.WORKSPACE.TAGS]: [SCREENS.WORKSPACE.TAGS_SETTINGS, SCREENS.WORKSPACE.TAGS_EDIT, SCREENS.WORKSPACE.TAG_CREATE], + [SCREENS.WORKSPACE.TAGS]: [SCREENS.WORKSPACE.TAGS_SETTINGS, SCREENS.WORKSPACE.TAGS_EDIT, SCREENS.WORKSPACE.TAG_CREATE, SCREENS.WORKSPACE.TAG_SETTINGS], [SCREENS.WORKSPACE.CATEGORIES]: [SCREENS.WORKSPACE.CATEGORY_CREATE, SCREENS.WORKSPACE.CATEGORY_SETTINGS, SCREENS.WORKSPACE.CATEGORIES_SETTINGS], }; diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 04bc53e7b542..1e68df68a1a0 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -292,6 +292,12 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.TAG_CREATE]: { path: ROUTES.WORKSPACE_TAG_CREATE.route, }, + [SCREENS.WORKSPACE.TAG_SETTINGS]: { + path: ROUTES.WORKSPACE_TAG_SETTINGS.route, + parse: { + tagName: (tagName: string) => encodeURIComponent(tagName), + }, + }, [SCREENS.REIMBURSEMENT_ACCOUNT]: { path: ROUTES.BANK_ACCOUNT_WITH_STEP_TO_OPEN.route, exact: true, diff --git a/src/libs/Navigation/types.ts b/src/libs/Navigation/types.ts index da418625ff55..6a7179684d3b 100644 --- a/src/libs/Navigation/types.ts +++ b/src/libs/Navigation/types.ts @@ -181,6 +181,10 @@ type SettingsNavigatorParamList = { [SCREENS.WORKSPACE.TAGS_SETTINGS]: { policyID: string; }; + [SCREENS.WORKSPACE.TAG_SETTINGS]: { + policyID: string; + tagName: string; + }; [SCREENS.WORKSPACE.TAGS_EDIT]: { policyID: string; tagName: string; @@ -538,7 +542,7 @@ type WorkspacesCentralPaneNavigatorParamList = { }; [SCREENS.WORKSPACE.TAGS]: { policyID: string; - categoryName: string; + tagName: string; }; [SCREENS.WORKSPACE.TAXES]: { policyID: string; diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 2adcfd29e00d..df1a9005442a 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -54,6 +54,7 @@ import Navigation from '@libs/Navigation/Navigation'; import * as NumberUtils from '@libs/NumberUtils'; import * as PersonalDetailsUtils from '@libs/PersonalDetailsUtils'; import * as PhoneNumber from '@libs/PhoneNumber'; +import * as PolicyUtils from '@libs/PolicyUtils'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; @@ -69,6 +70,7 @@ import type { PolicyCategory, PolicyMember, PolicyTagList, + PolicyTags, RecentlyUsedCategories, RecentlyUsedTags, ReimbursementAccount, @@ -2826,6 +2828,92 @@ function createPolicyTag(policyID: string, tagName: string) { API.write(WRITE_COMMANDS.CREATE_POLICY_TAG, parameters, onyxData); } +function setWorkspaceTagEnabled(policyID: string, tagsToUpdate: Record) { + const policyTag = PolicyUtils.getTagLists(allPolicyTags?.[`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`] ?? {})?.[0] ?? {}; + + const onyxData: OnyxData = { + optimisticData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, + value: { + [policyTag.name]: { + tags: { + ...Object.keys(tagsToUpdate).reduce((acc, key) => { + acc[key] = { + ...policyTag.tags[key], + ...tagsToUpdate[key], + errors: null, + pendingFields: { + enabled: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE, + }, + }; + + return acc; + }, {}), + }, + }, + }, + }, + ], + successData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, + value: { + [policyTag.name]: { + tags: { + ...Object.keys(tagsToUpdate).reduce((acc, key) => { + acc[key] = { + ...policyTag.tags[key], + ...tagsToUpdate[key], + errors: null, + pendingFields: { + enabled: null, + }, + }; + + return acc; + }, {}), + }, + }, + }, + }, + ], + failureData: [ + { + onyxMethod: Onyx.METHOD.MERGE, + key: `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, + value: { + [policyTag.name]: { + tags: { + ...Object.keys(tagsToUpdate).reduce((acc, key) => { + acc[key] = { + ...policyTag.tags[key], + ...tagsToUpdate[key], + errors: ErrorUtils.getMicroSecondOnyxError('workspace.tags.genericFailureMessage'), + pendingFields: { + enabled: null, + }, + }; + + return acc; + }, {}), + }, + }, + }, + }, + ], + }; + + const parameters = { + policyID, + tags: JSON.stringify(Object.keys(tagsToUpdate).map((key) => tagsToUpdate[key])), + }; + + API.write(WRITE_COMMANDS.SET_POLICY_TAGS_ENABLED, parameters, onyxData); +} + function setWorkspaceRequiresCategory(policyID: string, requiresCategory: boolean) { const onyxData: OnyxData = { optimisticData: [ @@ -3591,4 +3679,5 @@ export { createPolicyTag, clearWorkspaceReimbursementErrors, deleteWorkspaceCategories, + setWorkspaceTagEnabled, }; diff --git a/src/pages/workspace/tags/TagSettingsPage.tsx b/src/pages/workspace/tags/TagSettingsPage.tsx new file mode 100644 index 000000000000..9dbe587192b6 --- /dev/null +++ b/src/pages/workspace/tags/TagSettingsPage.tsx @@ -0,0 +1,92 @@ +import type {StackScreenProps} from '@react-navigation/stack'; +import React, {useMemo} from 'react'; +import {View} from 'react-native'; +import {withOnyx} from 'react-native-onyx'; +import type {OnyxEntry} from 'react-native-onyx'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; +import ScreenWrapper from '@components/ScreenWrapper'; +import Switch from '@components/Switch'; +import Text from '@components/Text'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {setWorkspaceTagEnabled} from '@libs/actions/Policy'; +import * as ErrorUtils from '@libs/ErrorUtils'; +import * as PolicyUtils from '@libs/PolicyUtils'; +import type {SettingsNavigatorParamList} from '@navigation/types'; +import NotFoundPage from '@pages/ErrorPage/NotFoundPage'; +import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; +import PaidPolicyAccessOrNotFoundWrapper from '@pages/workspace/PaidPolicyAccessOrNotFoundWrapper'; +import * as Policy from '@userActions/Policy'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type SCREENS from '@src/SCREENS'; +import type {PolicyTagList} from '@src/types/onyx'; + +type TagSettingsPageOnyxProps = { + /** All policy tags */ + policyTags: OnyxEntry; +}; + +type TagSettingsPageProps = TagSettingsPageOnyxProps & StackScreenProps; + +function TagSettingsPage({route, policyTags}: TagSettingsPageProps) { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + const policyTag = useMemo(() => PolicyUtils.getTagLists(policyTags)?.[0] ?? {}, [policyTags]); + + const currentPolicyTag = policyTag.tags[route.params.tagName]; + // console.log('currentPolicyTag :>> ', currentPolicyTag); + if (!currentPolicyTag) { + return ; + } + + const updateWorkspaceTagEnabled = (value: boolean) => { + setWorkspaceTagEnabled(route.params.policyID, {[currentPolicyTag.name]: {name: currentPolicyTag.name, enabled: value}}); + }; + + return ( + + + + + + {}} + > + + + {translate('workspace.tags.enableTag')} + + + + + + + + + + ); +} + +TagSettingsPage.displayName = 'TagSettingsPage'; + +export default withOnyx({ + policyTags: { + key: ({route}) => `${ONYXKEYS.COLLECTION.POLICY_TAGS}${route.params.policyID}`, + }, +})(TagSettingsPage); diff --git a/src/pages/workspace/tags/WorkspaceTagsPage.tsx b/src/pages/workspace/tags/WorkspaceTagsPage.tsx index 4ea8ba669b9b..86e19874eeb6 100644 --- a/src/pages/workspace/tags/WorkspaceTagsPage.tsx +++ b/src/pages/workspace/tags/WorkspaceTagsPage.tsx @@ -11,6 +11,7 @@ import * as Illustrations from '@components/Icon/Illustrations'; import ScreenWrapper from '@components/ScreenWrapper'; import SelectionList from '@components/SelectionList'; import TableListItem from '@components/SelectionList/TableListItem'; +import type {ListItem} from '@components/SelectionList/types'; import Text from '@components/Text'; import WorkspaceEmptyStateSection from '@components/WorkspaceEmptyStateSection'; import useLocalize from '@hooks/useLocalize'; @@ -38,6 +39,11 @@ type PolicyForList = { rightElement: React.ReactNode; }; +type PolicyOption = ListItem & { + /** Tag name is used as a key for the selectedTags state */ + keyForList: string; +}; + type WorkspaceTagsOnyxProps = { /** Collection of tags attached to a policy */ policyTags: OnyxEntry; @@ -119,6 +125,10 @@ function WorkspaceTagsPage({policyTags, route}: WorkspaceTagsPageProps) { Navigation.navigate(ROUTES.WORKSPACE_TAG_CREATE.getRoute(route.params.policyID)); }; + const navigateToTagSettings = (tag: PolicyOption) => { + Navigation.navigate(ROUTES.WORKSPACE_TAG_SETTINGS.getRoute(route.params.policyID, tag.keyForList)); + }; + const isLoading = !isOffline && policyTags === undefined; const headerButtons = ( @@ -183,7 +193,7 @@ function WorkspaceTagsPage({policyTags, route}: WorkspaceTagsPageProps) { canSelectMultiple sections={[{data: tagList, indexOffset: 0, isDisabled: false}]} onCheckboxPress={toggleTag} - onSelectRow={() => {}} + onSelectRow={navigateToTagSettings} onSelectAll={toggleAllTags} showScrollIndicator ListItem={TableListItem} From f1122daa5671454a4780d121e84c59c6708231a7 Mon Sep 17 00:00:00 2001 From: Artem Makushov Date: Thu, 14 Mar 2024 19:20:15 +0100 Subject: [PATCH 2/5] fix lint and ts --- src/libs/API/parameters/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/API/parameters/index.ts b/src/libs/API/parameters/index.ts index e3bdbd3f3806..a23c9f955318 100644 --- a/src/libs/API/parameters/index.ts +++ b/src/libs/API/parameters/index.ts @@ -176,5 +176,6 @@ export type {default as JoinPolicyInviteLinkParams} from './JoinPolicyInviteLink export type {default as OpenPolicyWorkflowsPageParams} from './OpenPolicyWorkflowsPageParams'; export type {default as OpenPolicyDistanceRatesPageParams} from './OpenPolicyDistanceRatesPageParams'; export type {default as OpenPolicyTaxesPageParams} from './OpenPolicyTaxesPageParams'; +export type {default as EnablePolicyTaxesParams} from './EnablePolicyTaxesParams'; export type {default as OpenPolicyMoreFeaturesPageParams} from './OpenPolicyMoreFeaturesPageParams'; export type {default as CreatePolicyTagsParams} from './CreatePolicyTagsParams'; From 2038d5587033810c3029ef11a1e4593f46e79c0c Mon Sep 17 00:00:00 2001 From: Artem Makushov Date: Thu, 14 Mar 2024 19:31:55 +0100 Subject: [PATCH 3/5] clenup --- src/pages/workspace/tags/TagSettingsPage.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/pages/workspace/tags/TagSettingsPage.tsx b/src/pages/workspace/tags/TagSettingsPage.tsx index 9dbe587192b6..af1f387ec3b9 100644 --- a/src/pages/workspace/tags/TagSettingsPage.tsx +++ b/src/pages/workspace/tags/TagSettingsPage.tsx @@ -18,7 +18,6 @@ import type {SettingsNavigatorParamList} from '@navigation/types'; import NotFoundPage from '@pages/ErrorPage/NotFoundPage'; import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; import PaidPolicyAccessOrNotFoundWrapper from '@pages/workspace/PaidPolicyAccessOrNotFoundWrapper'; -import * as Policy from '@userActions/Policy'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; import type {PolicyTagList} from '@src/types/onyx'; @@ -36,7 +35,7 @@ function TagSettingsPage({route, policyTags}: TagSettingsPageProps) { const policyTag = useMemo(() => PolicyUtils.getTagLists(policyTags)?.[0] ?? {}, [policyTags]); const currentPolicyTag = policyTag.tags[route.params.tagName]; - // console.log('currentPolicyTag :>> ', currentPolicyTag); + if (!currentPolicyTag) { return ; } From 8654a07974a25f328f21de67cdcde80b11b065a9 Mon Sep 17 00:00:00 2001 From: Artem Makushov Date: Fri, 15 Mar 2024 17:38:20 +0100 Subject: [PATCH 4/5] resolved changes --- src/libs/Navigation/linkingConfig/config.ts | 2 +- src/libs/actions/Policy.ts | 1 - src/pages/workspace/tags/TagSettingsPage.tsx | 7 ++++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/libs/Navigation/linkingConfig/config.ts b/src/libs/Navigation/linkingConfig/config.ts index 76cab58fa807..0da48aa88411 100644 --- a/src/libs/Navigation/linkingConfig/config.ts +++ b/src/libs/Navigation/linkingConfig/config.ts @@ -301,7 +301,7 @@ const config: LinkingOptions['config'] = { [SCREENS.WORKSPACE.TAG_SETTINGS]: { path: ROUTES.WORKSPACE_TAG_SETTINGS.route, parse: { - tagName: (tagName: string) => encodeURIComponent(tagName), + tagName: (tagName: string) => decodeURIComponent(tagName), }, }, [SCREENS.REIMBURSEMENT_ACCOUNT]: { diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index 5bb45d6aa9b5..b8911b6bd33c 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -2940,7 +2940,6 @@ function setWorkspaceTagEnabled(policyID: string, tagsToUpdate: Record((acc, key) => { acc[key] = { ...policyTag.tags[key], - ...tagsToUpdate[key], errors: null, pendingFields: { enabled: null, diff --git a/src/pages/workspace/tags/TagSettingsPage.tsx b/src/pages/workspace/tags/TagSettingsPage.tsx index af1f387ec3b9..14ba54e09f7e 100644 --- a/src/pages/workspace/tags/TagSettingsPage.tsx +++ b/src/pages/workspace/tags/TagSettingsPage.tsx @@ -18,6 +18,7 @@ import type {SettingsNavigatorParamList} from '@navigation/types'; import NotFoundPage from '@pages/ErrorPage/NotFoundPage'; import AdminPolicyAccessOrNotFoundWrapper from '@pages/workspace/AdminPolicyAccessOrNotFoundWrapper'; import PaidPolicyAccessOrNotFoundWrapper from '@pages/workspace/PaidPolicyAccessOrNotFoundWrapper'; +import * as Policy from '@userActions/Policy'; import ONYXKEYS from '@src/ONYXKEYS'; import type SCREENS from '@src/SCREENS'; import type {PolicyTagList} from '@src/types/onyx'; @@ -32,9 +33,9 @@ type TagSettingsPageProps = TagSettingsPageOnyxProps & StackScreenProps PolicyUtils.getTagLists(policyTags)?.[0] ?? {}, [policyTags]); + const policyTag = useMemo(() => PolicyUtils.getTagList(policyTags, 0), [policyTags]); - const currentPolicyTag = policyTag.tags[route.params.tagName]; + const currentPolicyTag = policyTag.tags[decodeURIComponent(route.params.tagName)]; if (!currentPolicyTag) { return ; @@ -58,7 +59,7 @@ function TagSettingsPage({route, policyTags}: TagSettingsPageProps) { errors={ErrorUtils.getLatestErrorMessageField(currentPolicyTag)} pendingAction={currentPolicyTag.pendingFields?.enabled} errorRowStyles={styles.mh5} - onClose={() => {}} + onClose={() => Policy.clearPolicyTagErrors(route.params.policyID, route.params.tagName)} > From 397e1029339663b2a9c4d588a42eeb30a3ae646c Mon Sep 17 00:00:00 2001 From: Artem Makushov Date: Fri, 15 Mar 2024 18:14:46 +0100 Subject: [PATCH 5/5] fix --- src/libs/actions/Policy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libs/actions/Policy.ts b/src/libs/actions/Policy.ts index b8911b6bd33c..5bb45d6aa9b5 100644 --- a/src/libs/actions/Policy.ts +++ b/src/libs/actions/Policy.ts @@ -2940,6 +2940,7 @@ function setWorkspaceTagEnabled(policyID: string, tagsToUpdate: Record((acc, key) => { acc[key] = { ...policyTag.tags[key], + ...tagsToUpdate[key], errors: null, pendingFields: { enabled: null,