Skip to content

Commit

Permalink
Merge pull request #43005 from Expensify/hayata-make-renaming-tags-work
Browse files Browse the repository at this point in the history
Make renaming of tags works
  • Loading branch information
Julesssss authored Jun 7, 2024
2 parents 0460aec + 5d728f3 commit 4a5124b
Show file tree
Hide file tree
Showing 9 changed files with 53 additions and 34 deletions.
7 changes: 0 additions & 7 deletions src/libs/API/parameters/RenamePolicyTaglist.ts

This file was deleted.

8 changes: 8 additions & 0 deletions src/libs/API/parameters/RenamePolicyTaglistParams.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
type RenamePolicyTaglistParams = {
policyID: string;
oldName: string;
newName: string;
tagListIndex: number;
};

export default RenamePolicyTaglistParams;
1 change: 1 addition & 0 deletions src/libs/API/parameters/RenamePolicyTagsParams.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ type RenamePolicyTagsParams = {
policyID: string;
oldName: string;
newName: string;
tagListIndex: number;
};

export default RenamePolicyTagsParams;
2 changes: 1 addition & 1 deletion src/libs/API/parameters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ export type {default as SetWorkspaceApprovalModeParams} from './SetWorkspaceAppr
export type {default as SetWorkspacePayerParams} from './SetWorkspacePayerParams';
export type {default as SetWorkspaceReimbursementParams} from './SetWorkspaceReimbursementParams';
export type {default as SetPolicyRequiresTag} from './SetPolicyRequiresTag';
export type {default as RenamePolicyTaglist} from './RenamePolicyTaglist';
export type {default as RenamePolicyTaglistParams} from './RenamePolicyTaglistParams';
export type {default as SwitchToOldDotParams} from './SwitchToOldDotParams';
export type {default as TrackExpenseParams} from './TrackExpenseParams';
export type {default as EnablePolicyCategoriesParams} from './EnablePolicyCategoriesParams';
Expand Down
2 changes: 1 addition & 1 deletion src/libs/API/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ type WriteCommandParameters = {
[WRITE_COMMANDS.SET_WORKSPACE_REQUIRES_CATEGORY]: Parameters.SetWorkspaceRequiresCategoryParams;
[WRITE_COMMANDS.DELETE_WORKSPACE_CATEGORIES]: Parameters.DeleteWorkspaceCategoriesParams;
[WRITE_COMMANDS.SET_POLICY_REQUIRES_TAG]: Parameters.SetPolicyRequiresTag;
[WRITE_COMMANDS.RENAME_POLICY_TAG_LIST]: Parameters.RenamePolicyTaglist;
[WRITE_COMMANDS.RENAME_POLICY_TAG_LIST]: Parameters.RenamePolicyTaglistParams;
[WRITE_COMMANDS.CREATE_POLICY_TAG]: Parameters.CreatePolicyTagsParams;
[WRITE_COMMANDS.RENAME_POLICY_TAG]: Parameters.RenamePolicyTagsParams;
[WRITE_COMMANDS.SET_POLICY_TAGS_ENABLED]: Parameters.SetPolicyTagsEnabled;
Expand Down
33 changes: 20 additions & 13 deletions src/libs/actions/Policy/Tag.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type {NullishDeep, OnyxCollection, OnyxEntry} from 'react-native-onyx';
import Onyx from 'react-native-onyx';
import * as API from '@libs/API';
import type {EnablePolicyTagsParams, OpenPolicyTagsPageParams, SetPolicyTagsEnabled} from '@libs/API/parameters';
import type {EnablePolicyTagsParams, OpenPolicyTagsPageParams, RenamePolicyTaglistParams, RenamePolicyTagsParams, SetPolicyTagsEnabled} from '@libs/API/parameters';
import {READ_COMMANDS, WRITE_COMMANDS} from '@libs/API/types';
import * as ErrorUtils from '@libs/ErrorUtils';
import getIsNarrowLayout from '@libs/getIsNarrowLayout';
Expand Down Expand Up @@ -359,28 +359,30 @@ function clearPolicyTagErrors(policyID: string, tagName: string) {
});
}

function renamePolicyTag(policyID: string, policyTag: {oldName: string; newName: string}) {
const tagListName = Object.keys(allPolicyTags?.[`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`] ?? {})[0];
function renamePolicyTag(policyID: string, policyTag: {oldName: string; newName: string}, tagListIndex: number) {
const tagList = PolicyUtils.getTagLists(allPolicyTags?.[`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`] ?? {})?.[tagListIndex] ?? {};
const tag = tagList.tags?.[policyTag.oldName];

const oldTagName = policyTag.oldName;
const newTagName = PolicyUtils.escapeTagName(policyTag.newName);
const oldTag = allPolicyTags?.[`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`]?.[tagListName]?.tags?.[oldTagName] ?? {};
const onyxData: OnyxData = {
optimisticData: [
{
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`,
value: {
[tagListName]: {
[tagList.name]: {
tags: {
[oldTagName]: null,
[newTagName]: {
...oldTag,
...tag,
name: newTagName,
pendingAction: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
pendingFields: {
name: CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE,
},
previousTagName: oldTagName,
errors: null,
},
},
},
Expand All @@ -392,10 +394,9 @@ function renamePolicyTag(policyID: string, policyTag: {oldName: string; newName:
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`,
value: {
[tagListName]: {
[tagList.name]: {
tags: {
[newTagName]: {
errors: null,
pendingAction: null,
pendingFields: {
name: null,
Expand All @@ -411,11 +412,15 @@ function renamePolicyTag(policyID: string, policyTag: {oldName: string; newName:
onyxMethod: Onyx.METHOD.MERGE,
key: `${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`,
value: {
[tagListName]: {
[tagList.name]: {
tags: {
[newTagName]: null,
[oldTagName]: {
...oldTag,
...tag,
pendingAction: null,
pendingFields: {
name: null,
},
errors: ErrorUtils.getMicroSecondOnyxError('workspace.tags.genericFailureMessage'),
},
},
Expand All @@ -425,10 +430,11 @@ function renamePolicyTag(policyID: string, policyTag: {oldName: string; newName:
],
};

const parameters = {
const parameters: RenamePolicyTagsParams = {
policyID,
oldName: oldTagName,
newName: newTagName,
tagListIndex,
};

API.write(WRITE_COMMANDS.RENAME_POLICY_TAG, parameters, onyxData);
Expand Down Expand Up @@ -503,7 +509,7 @@ function enablePolicyTags(policyID: string, enabled: boolean) {
}
}

function renamePolicyTaglist(policyID: string, policyTagListName: {oldName: string; newName: string}, policyTags: OnyxEntry<PolicyTagList>) {
function renamePolicyTaglist(policyID: string, policyTagListName: {oldName: string; newName: string}, policyTags: OnyxEntry<PolicyTagList>, tagListIndex: number) {
const newName = policyTagListName.newName;
const oldName = policyTagListName.oldName;
const oldPolicyTags = policyTags?.[oldName] ?? {};
Expand Down Expand Up @@ -543,10 +549,11 @@ function renamePolicyTaglist(policyID: string, policyTagListName: {oldName: stri
},
],
};
const parameters = {
const parameters: RenamePolicyTaglistParams = {
policyID,
oldName,
newName,
tagListIndex,
};

API.write(WRITE_COMMANDS.RENAME_POLICY_TAG_LIST, parameters, onyxData);
Expand Down
4 changes: 2 additions & 2 deletions src/pages/workspace/tags/EditTagPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,12 @@ function EditTagPage({route, policyTags}: EditTagPageProps) {
const tagName = values.tagName.trim();
// Do not call the API if the edited tag name is the same as the current tag name
if (currentTagName !== tagName) {
Tag.renamePolicyTag(route.params.policyID, {oldName: route.params.tagName, newName: values.tagName.trim()});
Tag.renamePolicyTag(route.params.policyID, {oldName: route.params.tagName, newName: values.tagName.trim()}, route.params.orderWeight);
}
Keyboard.dismiss();
Navigation.goBack();
},
[route.params.policyID, route.params.tagName, currentTagName],
[currentTagName, route.params.policyID, route.params.tagName, route.params.orderWeight],
);

return (
Expand Down
4 changes: 2 additions & 2 deletions src/pages/workspace/tags/WorkspaceEditTagsPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ function WorkspaceEditTagsPage({route, policyTags}: WorkspaceEditTagsPageProps)
const updateTaglistName = useCallback(
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.POLICY_TAG_NAME_FORM>) => {
if (values[INPUT_IDS.POLICY_TAGS_NAME] !== taglistName) {
Tag.renamePolicyTaglist(route.params.policyID, {oldName: taglistName, newName: values[INPUT_IDS.POLICY_TAGS_NAME]}, policyTags);
Tag.renamePolicyTaglist(route.params.policyID, {oldName: taglistName, newName: values[INPUT_IDS.POLICY_TAGS_NAME]}, policyTags, route.params.orderWeight);
}
Navigation.goBack();
},
[policyTags, route.params.policyID, taglistName],
[policyTags, route.params.orderWeight, route.params.policyID, taglistName],
);

return (
Expand Down
26 changes: 18 additions & 8 deletions tests/actions/PolicyTagTest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,7 @@ describe('actions/Policy', () => {
newName: newTagListName,
},
fakePolicyTags,
Object.values(fakePolicyTags)[0].orderWeight,
);
return waitForBatchedUpdates();
})
Expand Down Expand Up @@ -244,6 +245,7 @@ describe('actions/Policy', () => {
newName: newTagListName,
},
fakePolicyTags,
Object.values(fakePolicyTags)[0].orderWeight,
);
return waitForBatchedUpdates();
})
Expand Down Expand Up @@ -514,10 +516,14 @@ describe('actions/Policy', () => {
Onyx.set(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${fakePolicy.id}`, fakePolicyTags);
})
.then(() => {
Tag.renamePolicyTag(fakePolicy.id, {
oldName: oldTagName,
newName: newTagName,
});
Tag.renamePolicyTag(
fakePolicy.id,
{
oldName: oldTagName,
newName: newTagName,
},
0,
);
return waitForBatchedUpdates();
})
.then(
Expand Down Expand Up @@ -580,10 +586,14 @@ describe('actions/Policy', () => {
.then(() => {
mockFetch?.fail?.();

Tag.renamePolicyTag(fakePolicy.id, {
oldName: oldTagName,
newName: newTagName,
});
Tag.renamePolicyTag(
fakePolicy.id,
{
oldName: oldTagName,
newName: newTagName,
},
0,
);
return waitForBatchedUpdates();
})
.then(mockFetch?.resume)
Expand Down

0 comments on commit 4a5124b

Please sign in to comment.