fix(config): handle query config options (#9824)
Refs #9807 --------- Co-authored-by: Vladimír Gorej <vladimir.gorej@gmail.com>
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
* NOTE1: lodash.merge & lodash.mergeWith prefers to ignore undefined values
|
* 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)
|
* 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.
|
* 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
|
* 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) => {
|
const merge = (target, ...sources) => {
|
||||||
let domNode = Symbol.for("domNode")
|
let domNode = Symbol.for("domNode")
|
||||||
const sourcesWithoutDomNode = []
|
let primaryName = Symbol.for("primaryName")
|
||||||
|
const sourcesWithoutExceptions = []
|
||||||
|
|
||||||
for (const source of sources) {
|
for (const source of sources) {
|
||||||
if (Object.hasOwn(source, "domNode")) {
|
const sourceWithoutExceptions = { ...source }
|
||||||
domNode = source.domNode
|
|
||||||
const sourceWithoutDomNode = { ...source }
|
if (Object.hasOwn(sourceWithoutExceptions, "domNode")) {
|
||||||
delete sourceWithoutDomNode.domNode
|
domNode = sourceWithoutExceptions.domNode
|
||||||
sourcesWithoutDomNode.push(sourceWithoutDomNode)
|
delete sourceWithoutExceptions.domNode
|
||||||
} else {
|
|
||||||
sourcesWithoutDomNode.push(source)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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, ...sourcesWithoutDomNode)
|
const merged = deepExtend(target, ...sourcesWithoutExceptions)
|
||||||
|
|
||||||
if (domNode !== Symbol.for("domNode")) {
|
if (domNode !== Symbol.for("domNode")) {
|
||||||
merged.domNode = domNode
|
merged.domNode = domNode
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (primaryName !== Symbol.for("primaryName") && Array.isArray(merged.urls)) {
|
||||||
|
merged.urls.primaryName = primaryName
|
||||||
|
}
|
||||||
|
|
||||||
return merged
|
return merged
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* @prettier
|
* @prettier
|
||||||
*/
|
*/
|
||||||
|
import set from "lodash/set"
|
||||||
import { parseSearch } from "core/utils"
|
import { parseSearch } from "core/utils"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -9,7 +10,16 @@ import { parseSearch } from "core/utils"
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
const optionsFromQuery = () => (options) => {
|
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
|
export default optionsFromQuery
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ class TopBar extends React.Component {
|
|||||||
if(urls && urls.length) {
|
if(urls && urls.length) {
|
||||||
var targetIndex = this.state.selectedIndex
|
var targetIndex = this.state.selectedIndex
|
||||||
let search = parseSearch()
|
let search = parseSearch()
|
||||||
let primaryName = search["urls.primaryName"] || configs["urls.primaryName"]
|
let primaryName = search["urls.primaryName"] || configs.urls.primaryName
|
||||||
if(primaryName)
|
if(primaryName)
|
||||||
{
|
{
|
||||||
urls.forEach((spec, i) => {
|
urls.forEach((spec, i) => {
|
||||||
|
|||||||
Reference in New Issue
Block a user