diff --git a/packages/components/src/query-controls/terms.js b/packages/components/src/query-controls/terms.js index cbeb9d0bb4b7ae..ba76e68980184e 100644 --- a/packages/components/src/query-controls/terms.js +++ b/packages/components/src/query-controls/terms.js @@ -11,7 +11,18 @@ import { groupBy } from 'lodash'; * @return {Array} Array of terms in tree format. */ export function buildTermsTree( flatTerms ) { - const termsByParent = groupBy( flatTerms, 'parent' ); + const flatTermsWithParentAndChildren = flatTerms.map( ( term ) => { + return { + children: [], + parent: null, + ...term, + }; + } ); + + const termsByParent = groupBy( flatTermsWithParentAndChildren, 'parent' ); + if ( termsByParent.null && termsByParent.null.length ) { + return flatTermsWithParentAndChildren; + } const fillWithChildren = ( terms ) => { return terms.map( ( term ) => { const children = termsByParent[ term.id ]; diff --git a/packages/components/src/query-controls/test/terms.js b/packages/components/src/query-controls/test/terms.js new file mode 100644 index 00000000000000..11cf1505d4f27e --- /dev/null +++ b/packages/components/src/query-controls/test/terms.js @@ -0,0 +1,61 @@ +/** + * Internal dependencies + */ +import { buildTermsTree } from '../terms'; + +describe( 'buildTermsTree()', () => { + it( 'Should return same array as input with null parent and empty children added if parent is never specified.', () => { + const input = Object.freeze( [ + { id: 2232, dummy: true }, + { id: 2245, dummy: true }, + ] ); + const output = Object.freeze( [ + { id: 2232, parent: null, children: [], dummy: true }, + { id: 2245, parent: null, children: [], dummy: true }, + ] ); + const termsTreem = buildTermsTree( input ); + expect( termsTreem ).toEqual( output ); + } ); + it( 'Should return same array as input with empty children added if all the elements are top level', () => { + const input = Object.freeze( [ + { id: 2232, parent: 0, dummy: true }, + { id: 2245, parent: 0, dummy: false }, + ] ); + const output = [ + { id: 2232, parent: 0, children: [], dummy: true }, + { id: 2245, parent: 0, children: [], dummy: false }, + ]; + const termsTreem = buildTermsTree( input ); + expect( termsTreem ).toEqual( output ); + } ); + it( 'Should return element with its child if a child exists', () => { + const input = Object.freeze( [ + { id: 2232, parent: 0 }, + { id: 2245, parent: 2232 }, + ] ); + const output = [ + { id: 2232, parent: 0, children: [ + { id: 2245, parent: 2232, children: [] }, + ] }, + ]; + const termsTreem = buildTermsTree( input ); + expect( termsTreem ).toEqual( output ); + } ); + it( 'Should return elements with multiple children and elements with no children', () => { + const input = Object.freeze( [ + { id: 2232, parent: 0 }, + { id: 2245, parent: 2232 }, + { id: 2249, parent: 0 }, + { id: 2246, parent: 2232 }, + ] ); + const output = [ + { id: 2232, parent: 0, children: [ + { id: 2245, parent: 2232, children: [] }, + { id: 2246, parent: 2232, children: [] }, + ] }, + { id: 2249, parent: 0, children: [] }, + ]; + const termsTreem = buildTermsTree( input ); + expect( termsTreem ).toEqual( output ); + } ); +} ); diff --git a/packages/editor/src/utils/terms.js b/packages/editor/src/utils/terms.js index cbeb9d0bb4b7ae..ba76e68980184e 100644 --- a/packages/editor/src/utils/terms.js +++ b/packages/editor/src/utils/terms.js @@ -11,7 +11,18 @@ import { groupBy } from 'lodash'; * @return {Array} Array of terms in tree format. */ export function buildTermsTree( flatTerms ) { - const termsByParent = groupBy( flatTerms, 'parent' ); + const flatTermsWithParentAndChildren = flatTerms.map( ( term ) => { + return { + children: [], + parent: null, + ...term, + }; + } ); + + const termsByParent = groupBy( flatTermsWithParentAndChildren, 'parent' ); + if ( termsByParent.null && termsByParent.null.length ) { + return flatTermsWithParentAndChildren; + } const fillWithChildren = ( terms ) => { return terms.map( ( term ) => { const children = termsByParent[ term.id ]; diff --git a/packages/editor/src/utils/test/terms.js b/packages/editor/src/utils/test/terms.js index 361cc4b414b7a0..11cf1505d4f27e 100644 --- a/packages/editor/src/utils/test/terms.js +++ b/packages/editor/src/utils/test/terms.js @@ -4,10 +4,17 @@ import { buildTermsTree } from '../terms'; describe( 'buildTermsTree()', () => { - it( 'Should return empty array if parent is never specified.', () => { - const input = Object.freeze( [ { term: 2232 }, { term: 2245 } ] ); + it( 'Should return same array as input with null parent and empty children added if parent is never specified.', () => { + const input = Object.freeze( [ + { id: 2232, dummy: true }, + { id: 2245, dummy: true }, + ] ); + const output = Object.freeze( [ + { id: 2232, parent: null, children: [], dummy: true }, + { id: 2245, parent: null, children: [], dummy: true }, + ] ); const termsTreem = buildTermsTree( input ); - expect( termsTreem ).toEqual( [] ); + expect( termsTreem ).toEqual( output ); } ); it( 'Should return same array as input with empty children added if all the elements are top level', () => { const input = Object.freeze( [