From 6c9dbbffb66b98f196c43a0e7b5ae50a8ce67fc6 Mon Sep 17 00:00:00 2001 From: Weslley Alves Date: Thu, 30 Nov 2023 23:33:32 -0300 Subject: [PATCH 1/4] Change method getTagsOptions to retrieve the Tags structure as an option tree when there is tags in the parent:cuild format --- src/libs/OptionsListUtils.js | 9 +- tests/unit/OptionsListUtilsTest.js | 142 +++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+), 7 deletions(-) diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 820339ebc6c4..40efe609a24a 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -912,13 +912,7 @@ function getCategoryListSections(categories, recentlyUsedCategories, selectedOpt * @returns {Array} */ function getTagsOptions(tags) { - return _.map(tags, (tag) => ({ - text: tag.name, - keyForList: tag.name, - searchText: tag.name, - tooltipText: tag.name, - isDisabled: !tag.enabled, - })); + return getCategoryOptionTree(tags); } /** @@ -1498,6 +1492,7 @@ function getFilteredOptions( canInviteUser = true, includeSelectedOptions = false, ) { + // OptionsListUtils.getFilteredOptions({}, {}, [], searchValue, selectedOptions, [], false, false, false, {}, [], true, enabledTags, policyRecentlyUsedTagsList, false) return getOptions(reports, personalDetails, { betas, searchInputValue: searchValue.trim(), diff --git a/tests/unit/OptionsListUtilsTest.js b/tests/unit/OptionsListUtilsTest.js index dff19baabd3d..bff229ce2996 100644 --- a/tests/unit/OptionsListUtilsTest.js +++ b/tests/unit/OptionsListUtilsTest.js @@ -1292,6 +1292,65 @@ describe('OptionsListUtils', () => { }, ]; + const smallTagsListWithParentChild = { + Movies: { + enabled: true, + name: 'Movies', + }, + 'Movies: Avengers: Endgame': { + enabled: true, + name: 'Movies: Avengers: Endgame', + unencodedName: 'Movies: Avengers: Endgame', + }, + Places: { + enabled: false, + name: 'Places', + }, + Task: { + enabled: true, + name: 'Task', + }, + }; + + const smallResultListWithParentChild = [ + { + title: '', + shouldShow: false, + indexOffset: 0, + // data sorted alphabetically by name + data: [ + { + text: 'Movies', + keyForList: 'Movies', + searchText: 'Movies', + tooltipText: 'Movies', + isDisabled: false, + }, + { + text: ' Avengers', + keyForList: 'Movies: Avengers', + searchText: 'Movies: Avengers', + tooltipText: 'Avengers', + isDisabled: true, + }, + { + text: ' Endgame', + keyForList: 'Movies: Avengers: Endgame', + searchText: 'Movies: Avengers: Endgame', + tooltipText: 'Endgame', + isDisabled: false, + }, + { + text: 'Task', + keyForList: 'Task', + searchText: 'Task', + tooltipText: 'Task', + isDisabled: false, + }, + ], + }, + ]; + const smallResult = OptionsListUtils.getFilteredOptions(REPORTS, PERSONAL_DETAILS, [], emptySearch, [], [], false, false, false, {}, [], true, smallTagsList); expect(smallResult.tagOptions).toStrictEqual(smallResultList); @@ -1354,6 +1413,23 @@ describe('OptionsListUtils', () => { recentlyUsedTags, ); expect(largeWrongSearchResult.tagOptions).toStrictEqual(largeWrongSearchResultList); + + const smallResultWithParentChild = OptionsListUtils.getFilteredOptions( + REPORTS, + PERSONAL_DETAILS, + [], + emptySearch, + [], + [], + false, + false, + false, + {}, + [], + true, + smallTagsListWithParentChild, + ); + expect(smallResultWithParentChild.tagOptions).toStrictEqual(smallResultListWithParentChild); }); it('getCategoryOptionTree()', () => { @@ -2012,4 +2088,70 @@ describe('OptionsListUtils', () => { const formattedMembersWithRightElement = _.map(PERSONAL_DETAILS, (personalDetail) => OptionsListUtils.formatMemberForList(personalDetail, {rightElement: })); expect(_.every(formattedMembersWithRightElement, (personalDetail) => Boolean(personalDetail.rightElement))).toBe(true); }); + + it.skip('getTagListSections()', () => { + const tags = { + Movies: { + enabled: true, + name: 'Meals', + }, + 'Movies: Avengers': { + enabled: true, + name: 'Movies: Avengers', + }, + 'Movies: Avengers: Endgame': { + enabled: true, + name: 'Movies: Avengers: Endgame', + unencodedName: 'Movies: Avengers: Endgame', + }, + Restaurant: { + enabled: false, + name: 'Restaurant', + }, + Food: { + enabled: true, + name: 'Food', + }, + }; + + const result = [ + { + text: 'Movies', + keyForList: 'Movies', + searchText: 'Movies', + tooltipText: 'Movies', + isDisabled: false, + }, + { + text: ' Avengers', + keyForList: 'Movies: Avengers', + searchText: 'Movies: Avengers', + tooltipText: 'Avengers', + isDisabled: false, + }, + { + text: ' Endgame', + keyForList: 'Movies: Avengers: Endgame', + searchText: 'Movies: Avengers: Endgame', + tooltipText: 'Endgame', + isDisabled: false, + }, + { + text: 'Restaurant', + keyForList: 'Restaurant', + searchText: 'Restaurant', + tooltipText: 'Restaurant', + isDisabled: true, + }, + { + text: 'Food', + keyForList: 'Food', + searchText: 'Food', + tooltipText: 'Food', + isDisabled: true, + }, + ]; + + expect(OptionsListUtils.getTagsOptions(tags)).toStrictEqual(result); + }); }); From b3f1393c7728246a4ec1de2154287bae1135e0cd Mon Sep 17 00:00:00 2001 From: Weslley Alves Date: Fri, 1 Dec 2023 08:01:54 -0300 Subject: [PATCH 2/4] Rename method from getCategoryOptionTree to getIndentedOptionTree in the OptionsListUtils --- src/libs/OptionsListUtils.js | 19 +++++++++---------- tests/unit/OptionsListUtilsTest.js | 6 +++--- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 40efe609a24a..8bd6196ea835 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -755,7 +755,7 @@ function sortTags(tags) { * @param {Boolean} [isOneLine] - a flag to determine if text should be one line * @returns {Array} */ -function getCategoryOptionTree(options, isOneLine = false) { +function getIndentedOptionTree(options, isOneLine = false) { const optionCollection = new Map(); _.each(options, (option) => { @@ -823,7 +823,7 @@ function getCategoryListSections(categories, recentlyUsedCategories, selectedOpt title: '', shouldShow: false, indexOffset, - data: getCategoryOptionTree(selectedOptions, true), + data: getIndentedOptionTree(selectedOptions, true), }); return categorySections; @@ -837,7 +837,7 @@ function getCategoryListSections(categories, recentlyUsedCategories, selectedOpt title: '', shouldShow: true, indexOffset, - data: getCategoryOptionTree(searchCategories, true), + data: getIndentedOptionTree(searchCategories, true), }); return categorySections; @@ -849,7 +849,7 @@ function getCategoryListSections(categories, recentlyUsedCategories, selectedOpt title: '', shouldShow: false, indexOffset, - data: getCategoryOptionTree(enabledCategories), + data: getIndentedOptionTree(enabledCategories), }); return categorySections; @@ -861,7 +861,7 @@ function getCategoryListSections(categories, recentlyUsedCategories, selectedOpt title: '', shouldShow: true, indexOffset, - data: getCategoryOptionTree(selectedOptions, true), + data: getIndentedOptionTree(selectedOptions, true), }); indexOffset += selectedOptions.length; @@ -884,7 +884,7 @@ function getCategoryListSections(categories, recentlyUsedCategories, selectedOpt title: Localize.translateLocal('common.recent'), shouldShow: true, indexOffset, - data: getCategoryOptionTree(cutRecentlyUsedCategories, true), + data: getIndentedOptionTree(cutRecentlyUsedCategories, true), }); indexOffset += filteredRecentlyUsedCategories.length; @@ -897,7 +897,7 @@ function getCategoryListSections(categories, recentlyUsedCategories, selectedOpt title: Localize.translateLocal('common.all'), shouldShow: true, indexOffset, - data: getCategoryOptionTree(filteredCategories), + data: getIndentedOptionTree(filteredCategories), }); return categorySections; @@ -912,7 +912,7 @@ function getCategoryListSections(categories, recentlyUsedCategories, selectedOpt * @returns {Array} */ function getTagsOptions(tags) { - return getCategoryOptionTree(tags); + return getIndentedOptionTree(tags); } /** @@ -1492,7 +1492,6 @@ function getFilteredOptions( canInviteUser = true, includeSelectedOptions = false, ) { - // OptionsListUtils.getFilteredOptions({}, {}, [], searchValue, selectedOptions, [], false, false, false, {}, [], true, enabledTags, policyRecentlyUsedTagsList, false) return getOptions(reports, personalDetails, { betas, searchInputValue: searchValue.trim(), @@ -1751,7 +1750,7 @@ export { getEnabledCategoriesCount, hasEnabledOptions, sortCategories, - getCategoryOptionTree, + getIndentedOptionTree, formatMemberForList, formatSectionsFromSearchTerm, }; diff --git a/tests/unit/OptionsListUtilsTest.js b/tests/unit/OptionsListUtilsTest.js index bff229ce2996..63432af6efc9 100644 --- a/tests/unit/OptionsListUtilsTest.js +++ b/tests/unit/OptionsListUtilsTest.js @@ -1432,7 +1432,7 @@ describe('OptionsListUtils', () => { expect(smallResultWithParentChild.tagOptions).toStrictEqual(smallResultListWithParentChild); }); - it('getCategoryOptionTree()', () => { + it('getIndentedOptionTree()', () => { const categories = { Meals: { enabled: true, @@ -1745,8 +1745,8 @@ describe('OptionsListUtils', () => { }, ]; - expect(OptionsListUtils.getCategoryOptionTree(categories)).toStrictEqual(result); - expect(OptionsListUtils.getCategoryOptionTree(categories, true)).toStrictEqual(resultOneLine); + expect(OptionsListUtils.getIndentedOptionTree(categories)).toStrictEqual(result); + expect(OptionsListUtils.getIndentedOptionTree(categories, true)).toStrictEqual(resultOneLine); }); it('sortCategories', () => { From 22dfe654ba62caeef5f1f1c65ee4557adc2a1aba Mon Sep 17 00:00:00 2001 From: Weslley Alves Date: Fri, 1 Dec 2023 08:05:38 -0300 Subject: [PATCH 3/4] Remove test created to validate an internal method --- tests/unit/OptionsListUtilsTest.js | 66 ------------------------------ 1 file changed, 66 deletions(-) diff --git a/tests/unit/OptionsListUtilsTest.js b/tests/unit/OptionsListUtilsTest.js index 63432af6efc9..2f4294e53c73 100644 --- a/tests/unit/OptionsListUtilsTest.js +++ b/tests/unit/OptionsListUtilsTest.js @@ -2088,70 +2088,4 @@ describe('OptionsListUtils', () => { const formattedMembersWithRightElement = _.map(PERSONAL_DETAILS, (personalDetail) => OptionsListUtils.formatMemberForList(personalDetail, {rightElement: })); expect(_.every(formattedMembersWithRightElement, (personalDetail) => Boolean(personalDetail.rightElement))).toBe(true); }); - - it.skip('getTagListSections()', () => { - const tags = { - Movies: { - enabled: true, - name: 'Meals', - }, - 'Movies: Avengers': { - enabled: true, - name: 'Movies: Avengers', - }, - 'Movies: Avengers: Endgame': { - enabled: true, - name: 'Movies: Avengers: Endgame', - unencodedName: 'Movies: Avengers: Endgame', - }, - Restaurant: { - enabled: false, - name: 'Restaurant', - }, - Food: { - enabled: true, - name: 'Food', - }, - }; - - const result = [ - { - text: 'Movies', - keyForList: 'Movies', - searchText: 'Movies', - tooltipText: 'Movies', - isDisabled: false, - }, - { - text: ' Avengers', - keyForList: 'Movies: Avengers', - searchText: 'Movies: Avengers', - tooltipText: 'Avengers', - isDisabled: false, - }, - { - text: ' Endgame', - keyForList: 'Movies: Avengers: Endgame', - searchText: 'Movies: Avengers: Endgame', - tooltipText: 'Endgame', - isDisabled: false, - }, - { - text: 'Restaurant', - keyForList: 'Restaurant', - searchText: 'Restaurant', - tooltipText: 'Restaurant', - isDisabled: true, - }, - { - text: 'Food', - keyForList: 'Food', - searchText: 'Food', - tooltipText: 'Food', - isDisabled: true, - }, - ]; - - expect(OptionsListUtils.getTagsOptions(tags)).toStrictEqual(result); - }); }); From 3f5b024878ed3491694ba056151e085794d0b704 Mon Sep 17 00:00:00 2001 From: Weslley Alves Date: Sun, 3 Dec 2023 07:18:50 -0300 Subject: [PATCH 4/4] Change method comment with a generic description abouth the tree hierarchy indentations --- src/libs/OptionsListUtils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/OptionsListUtils.js b/src/libs/OptionsListUtils.js index 8bd6196ea835..5fed34cc8180 100644 --- a/src/libs/OptionsListUtils.js +++ b/src/libs/OptionsListUtils.js @@ -747,7 +747,7 @@ function sortTags(tags) { } /** - * Builds the options for the category tree hierarchy via indents + * Builds the options for the tree hierarchy via indents * * @param {Object[]} options - an initial object array * @param {Boolean} options[].enabled - a flag to enable/disable option in a list