fix(config): handle query config options (#9824)

Refs #9807

---------

Co-authored-by: Vladimír Gorej <vladimir.gorej@gmail.com>
This commit is contained in:
Oliwia Rogala
2024-04-16 09:22:28 +02:00
committed by GitHub
parent cd7fb2778d
commit 692311105b
3 changed files with 38 additions and 11 deletions

View File

@@ -8,6 +8,7 @@
* NOTE1: lodash.merge & lodash.mergeWith prefers to ignore undefined values
* NOTE2: special handling of `domNode` option is now required as `deep-extend` will corrupt it (lodash.merge handles it correctly)
* NOTE3: oauth2RedirectUrl and withCredentials options can be set to undefined. By expecting null instead of undefined, we can't use lodash.merge.
* NOTE4: urls.primaryName needs to handled in special way, because it's an arbitrary property on Array instance
*
* TODO(vladimir.gorej@gmail.com): remove deep-extend in favor of lodash.merge
*/
@@ -15,25 +16,41 @@ import deepExtend from "deep-extend"
const merge = (target, ...sources) => {
let domNode = Symbol.for("domNode")
const sourcesWithoutDomNode = []
let primaryName = Symbol.for("primaryName")
const sourcesWithoutExceptions = []
for (const source of sources) {
if (Object.hasOwn(source, "domNode")) {
domNode = source.domNode
const sourceWithoutDomNode = { ...source }
delete sourceWithoutDomNode.domNode
sourcesWithoutDomNode.push(sourceWithoutDomNode)
} else {
sourcesWithoutDomNode.push(source)
}
const sourceWithoutExceptions = { ...source }
if (Object.hasOwn(sourceWithoutExceptions, "domNode")) {
domNode = sourceWithoutExceptions.domNode
delete sourceWithoutExceptions.domNode
}
const merged = deepExtend(target, ...sourcesWithoutDomNode)
if (Object.hasOwn(sourceWithoutExceptions, "urls.primaryName")) {
primaryName = sourceWithoutExceptions["urls.primaryName"]
delete sourceWithoutExceptions["urls.primaryName"]
} else if (
Array.isArray(sourceWithoutExceptions.urls) &&
Object.hasOwn(sourceWithoutExceptions.urls, "primaryName")
) {
primaryName = sourceWithoutExceptions.urls.primaryName
delete sourceWithoutExceptions.urls.primaryName
}
sourcesWithoutExceptions.push(sourceWithoutExceptions)
}
const merged = deepExtend(target, ...sourcesWithoutExceptions)
if (domNode !== Symbol.for("domNode")) {
merged.domNode = domNode
}
if (primaryName !== Symbol.for("primaryName") && Array.isArray(merged.urls)) {
merged.urls.primaryName = primaryName
}
return merged
}

View File

@@ -1,6 +1,7 @@
/**
* @prettier
*/
import set from "lodash/set"
import { parseSearch } from "core/utils"
/**
@@ -9,7 +10,16 @@ import { parseSearch } from "core/utils"
*/
const optionsFromQuery = () => (options) => {
return options.queryConfigEnabled ? parseSearch() : {}
const urlSearchParams = options.queryConfigEnabled ? parseSearch() : {}
return Object.entries(urlSearchParams).reduce((acc, [key, value]) => {
if (key === "urls.primaryName") {
acc[key] = value
} else {
acc = set(acc, key, value)
}
return acc
}, {})
}
export default optionsFromQuery

View File

@@ -87,7 +87,7 @@ class TopBar extends React.Component {
if(urls && urls.length) {
var targetIndex = this.state.selectedIndex
let search = parseSearch()
let primaryName = search["urls.primaryName"] || configs["urls.primaryName"]
let primaryName = search["urls.primaryName"] || configs.urls.primaryName
if(primaryName)
{
urls.forEach((spec, i) => {