diff --git a/packages/web/src/components/basic/ReactiveBase.js b/packages/web/src/components/basic/ReactiveBase.js index bcf50f7a3..32d6711fb 100644 --- a/packages/web/src/components/basic/ReactiveBase.js +++ b/packages/web/src/components/basic/ReactiveBase.js @@ -137,16 +137,55 @@ class ReactiveBase extends Component { let selectedValues = {}; let urlValues = {}; + const isValidURLValue = (value) => { + if (value === null || value === undefined) return false; + const type = typeof value; + if (type === 'string' || type === 'number' || type === 'boolean') return true; + if (Array.isArray(value)) { + return value.every((item) => { + const itemType = typeof item; + return itemType === 'string' || itemType === 'number' || itemType === 'boolean'; + }); + } + if (type === 'object' && value.constructor === Object) { + return Object.values(value).every((item) => { + const itemType = typeof item; + return itemType === 'string' || itemType === 'number' || itemType === 'boolean' || item === null; + }); + } + return false; + }; + + const isValidParsedParam = (parsedParams) => { + if (parsedParams === null || parsedParams === undefined) return false; + const type = typeof parsedParams; + if (type === 'string' || type === 'number' || type === 'boolean' || Array.isArray(parsedParams)) { + return true; + } + if (type === 'object' && parsedParams.constructor === Object) { + if (Object.prototype.hasOwnProperty.call(parsedParams, 'value')) { + return isValidURLValue(parsedParams.value); + } + return isValidURLValue(parsedParams); + } + return false; + }; + Array.from(params.keys()).forEach((key) => { try { const parsedParams = JSON.parse(params.get(key)); + if (!isValidParsedParam(parsedParams)) { + return; + } const selectedValue = {}; - if (parsedParams.value) { + if (parsedParams && typeof parsedParams === 'object' && Object.prototype.hasOwnProperty.call(parsedParams, 'value')) { selectedValue.value = parsedParams.value; } else { selectedValue.value = parsedParams; } - if (parsedParams.category) selectedValue.category = parsedParams.category; + if (parsedParams && parsedParams.category && typeof parsedParams.category === 'string') { + selectedValue.category = parsedParams.category; + } selectedValue.reference = 'URL'; selectedValues = { ...selectedValues, diff --git a/packages/web/src/components/list/MultiList.d.ts b/packages/web/src/components/list/MultiList.d.ts index 8f2008678..f440616a0 100644 --- a/packages/web/src/components/list/MultiList.d.ts +++ b/packages/web/src/components/list/MultiList.d.ts @@ -33,6 +33,8 @@ export interface MultiList extends CommonProps { sortBy?: types.sortByWithCount; themePreset?: types.themePreset; title?: types.title; + renderTitle?: (...args: any[]) => any; + showItemCount?: boolean; showMissing?: boolean; missingLabel?: string; showLoadMore?: boolean; diff --git a/packages/web/src/components/list/MultiList.js b/packages/web/src/components/list/MultiList.js index 9a933ddbb..79ebf408a 100644 --- a/packages/web/src/components/list/MultiList.js +++ b/packages/web/src/components/list/MultiList.js @@ -459,6 +459,34 @@ class MultiList extends Component { return getComponent(data, this.props); } + renderTitle() { + const { title, renderTitle, showItemCount, innerClass } = this.props; + const itemsCount = this.listItems ? this.listItems.length : 0; + + if (renderTitle) { + return isFunction(renderTitle) + ? renderTitle(itemsCount, this.listItems) + : renderTitle; + } + + if (title) { + return ( +