From 87a2039ded4d82ab9bfc75a20c3f0733a7aadc73 Mon Sep 17 00:00:00 2001 From: John Mitchell Date: Thu, 14 Jan 2021 09:50:01 -0500 Subject: [PATCH] don't strip out non-namespaced params when encoding url search params --- .../src/components/ListHeader/ListHeader.jsx | 7 ++++++- .../PaginatedDataList/PaginatedDataList.jsx | 11 +++++++++-- .../src/components/PaginatedTable/HeaderRow.jsx | 7 ++++++- .../components/PaginatedTable/PaginatedTable.jsx | 9 +++++++-- awx/ui_next/src/util/qs.js | 15 ++++++++++----- 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/awx/ui_next/src/components/ListHeader/ListHeader.jsx b/awx/ui_next/src/components/ListHeader/ListHeader.jsx index 6e1f9cb4e9..d5e359c3bc 100644 --- a/awx/ui_next/src/components/ListHeader/ListHeader.jsx +++ b/awx/ui_next/src/components/ListHeader/ListHeader.jsx @@ -85,7 +85,12 @@ class ListHeader extends React.Component { pushHistoryState(params) { const { history, qsConfig } = this.props; const { pathname } = history.location; - const encodedParams = encodeNonDefaultQueryString(qsConfig, params); + const nonNamespacedParams = parseQueryString({}, history.location.search); + const encodedParams = encodeNonDefaultQueryString( + qsConfig, + params, + nonNamespacedParams + ); history.push(encodedParams ? `${pathname}?${encodedParams}` : pathname); } diff --git a/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx b/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx index 7f5fe9afdd..a31553658d 100644 --- a/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx +++ b/awx/ui_next/src/components/PaginatedDataList/PaginatedDataList.jsx @@ -60,8 +60,15 @@ function PaginatedDataList({ pushHistoryState(replaceParams(oldParams, { page_size: pageSize, page })); }; - const pushHistoryState = params => { - const encodedParams = encodeNonDefaultQueryString(qsConfig, params); + const pushHistoryState = (params) => { + const { history, qsConfig } = this.props; + const { pathname } = history.location; + const nonNamespacedParams = parseQueryString({}, history.location.search); + const encodedParams = encodeNonDefaultQueryString( + qsConfig, + params, + nonNamespacedParams + ); history.push(encodedParams ? `${pathname}?${encodedParams}` : pathname); }; diff --git a/awx/ui_next/src/components/PaginatedTable/HeaderRow.jsx b/awx/ui_next/src/components/PaginatedTable/HeaderRow.jsx index 259cc39bac..14c5c0b8ee 100644 --- a/awx/ui_next/src/components/PaginatedTable/HeaderRow.jsx +++ b/awx/ui_next/src/components/PaginatedTable/HeaderRow.jsx @@ -23,7 +23,12 @@ export default function HeaderRow({ qsConfig, children }) { order_by: order === 'asc' ? key : `-${key}`, page: null, }); - const encodedParams = encodeNonDefaultQueryString(qsConfig, newParams); + const nonNamespacedParams = parseQueryString({}, history.location.search); + const encodedParams = encodeNonDefaultQueryString( + qsConfig, + newParams, + nonNamespacedParams + ); history.push( encodedParams ? `${location.pathname}?${encodedParams}` diff --git a/awx/ui_next/src/components/PaginatedTable/PaginatedTable.jsx b/awx/ui_next/src/components/PaginatedTable/PaginatedTable.jsx index 9892df34fe..42bf01a638 100644 --- a/awx/ui_next/src/components/PaginatedTable/PaginatedTable.jsx +++ b/awx/ui_next/src/components/PaginatedTable/PaginatedTable.jsx @@ -40,8 +40,13 @@ function PaginatedTable({ const history = useHistory(); const pushHistoryState = params => { - const { pathname } = history.location; - const encodedParams = encodeNonDefaultQueryString(qsConfig, params); + const { pathname, search } = history.location; + const nonNamespacedParams = parseQueryString({}, search); + const encodedParams = encodeNonDefaultQueryString( + qsConfig, + params, + nonNamespacedParams + ); history.push(encodedParams ? `${pathname}?${encodedParams}` : pathname); }; diff --git a/awx/ui_next/src/util/qs.js b/awx/ui_next/src/util/qs.js index c02e3be075..729a28790d 100644 --- a/awx/ui_next/src/util/qs.js +++ b/awx/ui_next/src/util/qs.js @@ -118,15 +118,20 @@ function encodeValue(key, value) { * removing defaults. Used to put into url bar after ui route * @param {object} qs config object for namespacing params, filtering defaults * @param {object} query param object + * @param {object} any non-namespaced params to append * @return {string} url query string */ -export const encodeNonDefaultQueryString = (config, params) => { +export const encodeNonDefaultQueryString = ( + config, + params, + nonNamespacedParams = {} +) => { if (!params) return ''; - const paramsWithoutDefaults = removeParams({}, params, config.defaultParams); - return encodeQueryString( - namespaceParams(config.namespace, paramsWithoutDefaults) - ); + return encodeQueryString({ + ...namespaceParams(config.namespace, paramsWithoutDefaults), + ...nonNamespacedParams, + }); }; /**