diff --git a/src/components/MoneyRequestConfirmationList.tsx b/src/components/MoneyRequestConfirmationList.tsx index 40cad1f662bb..859337326957 100755 --- a/src/components/MoneyRequestConfirmationList.tsx +++ b/src/components/MoneyRequestConfirmationList.tsx @@ -866,7 +866,7 @@ function MoneyRequestConfirmationList({ if (enabledTags.length !== 1 || getTag(transaction, index)) { return; } - updatedTagsString = insertTagIntoTransactionTagsString(updatedTagsString, enabledTags.at(0)?.name ?? '', index); + updatedTagsString = insertTagIntoTransactionTagsString(updatedTagsString, enabledTags.at(0)?.name ?? '', index, policy?.hasMultipleTagLists ?? false); }); if (updatedTagsString !== getTag(transaction) && updatedTagsString) { setMoneyRequestTag(transactionID, updatedTagsString); diff --git a/src/libs/IOUUtils.ts b/src/libs/IOUUtils.ts index 3fdffbe33c24..d16b091f5832 100644 --- a/src/libs/IOUUtils.ts +++ b/src/libs/IOUUtils.ts @@ -162,9 +162,14 @@ function isValidMoneyRequestType(iouType: string): boolean { * @param transactionTags - currently selected tags for a report * @param tag - a newly selected tag, that should be added to the transactionTags * @param tagIndex - the index of a tag list + * @param hasMultipleTagLists - whether the policy has multiple levels tag * @returns */ -function insertTagIntoTransactionTagsString(transactionTags: string, tag: string, tagIndex: number): string { +function insertTagIntoTransactionTagsString(transactionTags: string, tag: string, tagIndex: number, hasMultipleTagLists: boolean): string { + if (!hasMultipleTagLists) { + return tag; + } + const tagArray = getTagArrayFromName(transactionTags); tagArray[tagIndex] = tag; diff --git a/src/pages/Debug/DebugTagPicker.tsx b/src/pages/Debug/DebugTagPicker.tsx index cd16b37941fa..209f86777744 100644 --- a/src/pages/Debug/DebugTagPicker.tsx +++ b/src/pages/Debug/DebugTagPicker.tsx @@ -31,17 +31,18 @@ function DebugTagPicker({policyID, tagName = '', onSubmit}: DebugTagPickerProps) const [policyTags] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY_TAGS}${policyID}`, {canBeMissing: true}); const policyTagLists = useMemo(() => getTagLists(policyTags), [policyTags]); + const [hasMultipleTagLists] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${policyID}`, {canBeMissing: true, selector: (policy) => policy?.hasMultipleTagLists}); const updateTagName = useCallback( (index: number) => ({text}: ListItem) => { const newTag = text === selectedTags.at(index) ? undefined : text; - const updatedTagName = insertTagIntoTransactionTagsString(newTagName, newTag ?? '', index); + const updatedTagName = insertTagIntoTransactionTagsString(newTagName, newTag ?? '', index, hasMultipleTagLists ?? false); if (policyTagLists.length === 1) { return onSubmit({text: updatedTagName}); } setNewTagName(updatedTagName); }, - [newTagName, onSubmit, policyTagLists.length, selectedTags], + [newTagName, onSubmit, policyTagLists.length, selectedTags, hasMultipleTagLists], ); const submitTag = useCallback(() => { diff --git a/src/pages/iou/request/step/IOURequestStepTag.tsx b/src/pages/iou/request/step/IOURequestStepTag.tsx index 85a31f546810..7eb29c7f1fdb 100644 --- a/src/pages/iou/request/step/IOURequestStepTag.tsx +++ b/src/pages/iou/request/step/IOURequestStepTag.tsx @@ -106,7 +106,7 @@ function IOURequestStepTag({ updatedTag = tagParts.join(':'); } else { // Independent tags (fallback): use comma-separated list - updatedTag = insertTagIntoTransactionTagsString(transactionTag, isSelectedTag ? '' : searchText, tagListIndex); + updatedTag = insertTagIntoTransactionTagsString(transactionTag, isSelectedTag ? '' : searchText, tagListIndex, policy?.hasMultipleTagLists ?? false); } if (isEditingSplit) { diff --git a/tests/unit/IOUUtilsTest.ts b/tests/unit/IOUUtilsTest.ts index acbf0e0c4408..86da9b2d6ec9 100644 --- a/tests/unit/IOUUtilsTest.ts +++ b/tests/unit/IOUUtilsTest.ts @@ -155,19 +155,27 @@ describe('IOUUtils', () => { describe('insertTagIntoTransactionTagsString', () => { test('Inserting a tag into tag string should update the tag', () => { - expect(IOUUtils.insertTagIntoTransactionTagsString(':NY:Texas', 'California', 2)).toBe(':NY:California'); + expect(IOUUtils.insertTagIntoTransactionTagsString(':NY:Texas', 'California', 2, true)).toBe(':NY:California'); }); test('Inserting a tag into an index with no tags should update the tag', () => { - expect(IOUUtils.insertTagIntoTransactionTagsString('::California', 'NY', 1)).toBe(':NY:California'); + expect(IOUUtils.insertTagIntoTransactionTagsString('::California', 'NY', 1, true)).toBe(':NY:California'); }); test('Inserting a tag with colon in name into tag string should keep the colon in tag', () => { - expect(IOUUtils.insertTagIntoTransactionTagsString('East:NY:California', 'City \\: \\:', 1)).toBe('East:City \\: \\::California'); + expect(IOUUtils.insertTagIntoTransactionTagsString('East:NY:California', 'City \\: \\:', 1, true)).toBe('East:City \\: \\::California'); }); test('Remove a tag from tagString', () => { - expect(IOUUtils.insertTagIntoTransactionTagsString('East:City \\: \\::California', '', 1)).toBe('East::California'); + expect(IOUUtils.insertTagIntoTransactionTagsString('East:City \\: \\::California', '', 1, true)).toBe('East::California'); + }); + + test('Return single tag directly when hasMultipleTagLists is false', () => { + expect(IOUUtils.insertTagIntoTransactionTagsString('East:NY:California', 'NewTag', 1, false)).toBe('NewTag'); + }); + + test('Return multiple tags when hasMultipleTagLists is true', () => { + expect(IOUUtils.insertTagIntoTransactionTagsString('East:NY:California', 'NewTag', 1, true)).toBe('East:NewTag:California'); }); }); });