diff --git a/awx/ui_next/src/components/ListHeader/ListHeader.jsx b/awx/ui_next/src/components/ListHeader/ListHeader.jsx index 19b2367cf8..4974c001c9 100644 --- a/awx/ui_next/src/components/ListHeader/ListHeader.jsx +++ b/awx/ui_next/src/components/ListHeader/ListHeader.jsx @@ -47,13 +47,15 @@ class ListHeader extends React.Component { handleSearch(key, value) { const { history, qsConfig } = this.props; const { search } = history.location; - this.pushHistoryState(addParams(qsConfig, search, { [key]: value })); + const oldParams = parseQueryString(qsConfig, search); + this.pushHistoryState(addParams(qsConfig, oldParams, { [key]: value })); } handleRemove(key, value) { const { history, qsConfig } = this.props; const { search } = history.location; - this.pushHistoryState(removeParams(qsConfig, search, { [key]: value })); + const oldParams = parseQueryString(qsConfig, search); + this.pushHistoryState(removeParams(qsConfig, oldParams, { [key]: value })); } handleRemoveAll() { @@ -63,8 +65,9 @@ class ListHeader extends React.Component { handleSort(key, order) { const { history, qsConfig } = this.props; const { search } = history.location; + const oldParams = parseQueryString(qsConfig, search); this.pushHistoryState( - addParams(qsConfig, search, { + addParams(qsConfig, oldParams, { order_by: order === 'ascending' ? key : `-${key}`, page: null, }) diff --git a/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx b/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx index 5051e545d8..593acb635a 100644 --- a/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx +++ b/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx @@ -33,13 +33,15 @@ class PaginatedDataList extends React.Component { handleSetPage(event, pageNumber) { const { history, qsConfig } = this.props; const { search } = history.location; - this.pushHistoryState(addParams(qsConfig, search, { page: pageNumber })); + const oldParams = parseQueryString(qsConfig, search); + this.pushHistoryState(addParams(qsConfig, oldParams, { page: pageNumber })); } handleSetPageSize(event, pageSize) { const { history, qsConfig } = this.props; const { search } = history.location; - this.pushHistoryState(addParams(qsConfig, search, { page_size: pageSize })); + const oldParams = parseQueryString(qsConfig, search); + this.pushHistoryState(addParams(qsConfig, oldParams, { page_size: pageSize })); } pushHistoryState(params) { diff --git a/awx/ui_next/src/util/qs.js b/awx/ui_next/src/util/qs.js index 848afa7021..05e8e4b695 100644 --- a/awx/ui_next/src/util/qs.js +++ b/awx/ui_next/src/util/qs.js @@ -315,16 +315,16 @@ const getRemainingNewParams = (mergedParams, newParams) => /** * Merges existing params of search string with new ones and returns the updated list of params * @param {object} qs config object (used for getting defaults, current query params etc.) - * @param {string} url query string + * @param {object} object with params from existing search * @param {object} object with new params to add * @return {object} query param object */ -export function addParams(config, searchString, newParams) { +export function addParams(config, oldParams, paramsToAdd) { const namespacedOldParams = namespaceParams( config.namespace, - parseQueryString(config, searchString) + oldParams ); - const namespacedNewParams = namespaceParams(config.namespace, newParams); + const namespacedParamsToAdd = namespaceParams(config.namespace, paramsToAdd); const namespacedDefaultParams = namespaceParams( config.namespace, config.defaultParams @@ -336,7 +336,7 @@ export function addParams(config, searchString, newParams) { ); const namespacedMergedParams = getMergedParams( namespacedOldParamsNotDefaults, - namespacedNewParams + namespacedParamsToAdd ); // return updated params. @@ -345,19 +345,18 @@ export function addParams(config, searchString, newParams) { return denamespaceParams(config.namespace, { ...getDefaultParams(namespacedOldParams, namespacedDefaultParams), ...namespacedMergedParams, - ...getRemainingNewParams(namespacedMergedParams, namespacedNewParams), + ...getRemainingNewParams(namespacedMergedParams, namespacedParamsToAdd), }); } /** * Removes params from the search string and returns the updated list of params * @param {object} qs config object (used for getting defaults, current query params etc.) - * @param {string} url query string + * @param {object} object with params from existing search * @param {object} object with new params to remove * @return {object} query param object */ -export function removeParams(config, searchString, paramsToRemove) { - const oldParams = parseQueryString(config, searchString); +export function removeParams(config, oldParams, paramsToRemove) { const paramsEntries = []; Object.entries(oldParams).forEach(([key, value]) => { if (Array.isArray(value)) { diff --git a/awx/ui_next/src/util/qs.test.js b/awx/ui_next/src/util/qs.test.js index bdea7840a2..636b97ce84 100644 --- a/awx/ui_next/src/util/qs.test.js +++ b/awx/ui_next/src/util/qs.test.js @@ -231,9 +231,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?baz=bar&page=3'; + const oldParams = { baz: 'bar', page: 3, page_size: 15 }; const newParams = { bag: 'boom' }; - expect(addParams(config, query, newParams)).toEqual({ + expect(addParams(config, oldParams, newParams)).toEqual({ baz: 'bar', bag: 'boom', page: 3, @@ -247,9 +247,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?baz=bar&baz=bang&page=3'; + const oldParams = { baz: ['bar', 'bang'], page: 3, page_size: 15 }; const newParams = { baz: 'boom' }; - expect(addParams(config, query, newParams)).toEqual({ + expect(addParams(config, oldParams, newParams)).toEqual({ baz: ['bar', 'bang', 'boom'], page: 3, page_size: 15, @@ -262,9 +262,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?baz=bar&baz=bang&page=3'; + const oldParams = { baz: ['bar', 'bang'], page: 3, page_size: 15 }; const newParams = { page: 5 }; - expect(addParams(config, query, newParams)).toEqual({ + expect(addParams(config, oldParams, newParams)).toEqual({ baz: ['bar', 'bang'], page: 5, page_size: 15, @@ -277,9 +277,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?baz=bar&baz=bang&page=3'; + const oldParams = { baz: ['bar', 'bang'], page: 3, page_size: 15 }; const newParams = { baz: 'bust', pat: 'pal' }; - expect(addParams(config, query, newParams)).toEqual({ + expect(addParams(config, oldParams, newParams)).toEqual({ baz: ['bar', 'bang', 'bust'], pat: 'pal', page: 3, @@ -293,9 +293,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?item.baz=bar&item.page=3'; + const oldParams = { baz: 'bar', page: 3, page_size: 15 }; const newParams = { bag: 'boom' }; - expect(addParams(config, query, newParams)).toEqual({ + expect(addParams(config, oldParams, newParams)).toEqual({ baz: 'bar', bag: 'boom', page: 3, @@ -309,9 +309,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?item.baz=bar&foo.page=3'; + const oldParams = { baz: 'bar', page: 1, page_size: 15 }; const newParams = { bag: 'boom' }; - expect(addParams(config, query, newParams)).toEqual({ + expect(addParams(config, oldParams, newParams)).toEqual({ baz: 'bar', bag: 'boom', page: 1, @@ -325,9 +325,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?item.baz=bar&item.baz=bang&item.page=3'; + const oldParams = { baz: ['bar', 'bang'], page: 3, page_size: 15 }; const newParams = { baz: 'boom' }; - expect(addParams(config, query, newParams)).toEqual({ + expect(addParams(config, oldParams, newParams)).toEqual({ baz: ['bar', 'bang', 'boom'], page: 3, page_size: 15, @@ -340,9 +340,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?item.baz=bar&item.baz=bang&item.page=3'; + const oldParams = { baz: ['bar', 'bang'], page: 3, page_size: 15 }; const newParams = { page: 5 }; - expect(addParams(config, query, newParams)).toEqual({ + expect(addParams(config, oldParams, newParams)).toEqual({ baz: ['bar', 'bang'], page: 5, page_size: 15, @@ -355,9 +355,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?item.baz=bar&item.baz=bang&item.page=3'; + const oldParams = { baz: ['bar', 'bang'], page: 3, page_size: 15 }; const newParams = { baz: 'bust', pat: 'pal' }; - expect(addParams(config, query, newParams)).toEqual({ + expect(addParams(config, oldParams, newParams)).toEqual({ baz: ['bar', 'bang', 'bust'], pat: 'pal', page: 3, @@ -373,9 +373,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?baz=bar&page=3&bag=boom'; + const oldParams = { baz: 'bar', page: 3, bag: 'boom', page_size: 15 }; const newParams = { bag: 'boom' }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ baz: 'bar', page: 3, page_size: 15, @@ -388,9 +388,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?baz=bar&baz=bang&page=3'; + const oldParams = { baz: ['bar', 'bang'], page: 3, page_size: 15 }; const newParams = { baz: 'bar' }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ baz: 'bang', page: 3, page_size: 15, @@ -403,9 +403,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?baz=bar&baz=bang&baz=bust&page=3'; + const oldParams = { baz: ['bar', 'bang', 'bust'], page: 3, page_size: 15 }; const newParams = { baz: 'bar' }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ baz: ['bang', 'bust'], page: 3, page_size: 15, @@ -418,9 +418,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?baz=bar&baz=bang&page=3'; + const oldParams = { baz: ['bar', 'bang'], page: 3, page_size: 15 }; const newParams = { page: 3 }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ baz: ['bar', 'bang'], page: 1, page_size: 15, @@ -433,9 +433,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?baz=bar&baz=bang&baz=bust&pat=pal&page=3'; + const oldParams = { baz: ['bar', 'bang', 'bust'], pat: 'pal', page: 3, page_size: 15 }; const newParams = { baz: 'bust', pat: 'pal' }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ baz: ['bar', 'bang'], page: 3, page_size: 15, @@ -448,9 +448,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?item.baz=bar&item.page=3'; + const oldParams = { baz: 'bar', page: 3, page_size: 15 }; const newParams = { baz: 'bar' }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ page: 3, page_size: 15, }); @@ -462,9 +462,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?item.baz=bar&foo.page=3'; + const oldParams = { baz: 'bar', page: 1, page_size: 15 }; const newParams = { baz: 'bar' }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ page: 1, page_size: 15, }); @@ -476,9 +476,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?item.baz=bar&item.baz=bang&item.page=3'; + const oldParams = { baz: ['bar', 'bang'], page: 3, page_size: 15 }; const newParams = { baz: 'bar' }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ baz: 'bang', page: 3, page_size: 15, @@ -491,9 +491,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?item.baz=bar&item.baz=bang&item.baz=bust&item.page=3'; + const oldParams = { baz: ['bar', 'bang', 'bust'], page: 3, page_size: 15 }; const newParams = { baz: 'bar' }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ baz: ['bang', 'bust'], page: 3, page_size: 15, @@ -506,9 +506,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = '?item.baz=bar&item.baz=bang&item.page=3'; + const oldParams = { baz: ['bar', 'bang'], page: 3, page_size: 15 }; const newParams = { page: 3 }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ baz: ['bar', 'bang'], page: 1, page_size: 15, @@ -521,10 +521,9 @@ describe('qs (qs.js)', () => { defaultParams: { page: 1, page_size: 15 }, integerFields: ['page', 'page_size'], }; - const query = - '?item.baz=bar&item.baz=bang&item.baz=bust&item.pat=pal&item.page=3'; + const oldParams = { baz: ['bar', 'bang', 'bust'], pat: 'pal', page: 3, page_size: 15 }; const newParams = { baz: 'bust', pat: 'pal' }; - expect(removeParams(config, query, newParams)).toEqual({ + expect(removeParams(config, oldParams, newParams)).toEqual({ baz: ['bar', 'bang'], page: 3, page_size: 15,