diff --git a/CHANGELOG.md b/CHANGELOG.md index 9526fd506..ccba65e52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * Also support `feesfines` interface version `19.0`. Refs UIU-2960. * Correctly handle optional `X-Okapi-token` request header. Refs UIU-2977. * Fix bug with Edit form Expand/collapse all shortcuts not working. Refs UIU-2959. +* Update resourceData to escape special characters in filter tags before passing to makeQuery function. Refs. UIU-2731. ## [10.0.3](https://github.com/folio-org/ui-users/tree/v10.0.3) (2023-10-23) [Full Changelog](https://github.com/folio-org/ui-users/compare/v10.0.1...v10.0.3) diff --git a/src/routes/UserSearchContainer.js b/src/routes/UserSearchContainer.js index dd7f5648f..177472250 100644 --- a/src/routes/UserSearchContainer.js +++ b/src/routes/UserSearchContainer.js @@ -1,6 +1,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import { + cloneDeep, get, template, } from 'lodash'; @@ -34,8 +35,30 @@ const searchFields = [ ]; const compileQuery = template(`(${searchFields.join(' or ')})`, { interpolate: /%{([\s\S]+?)}/g }); +const escapeSpecialCharactersInTagFilters = (queryParams, resourceData) => { + const newResourceData = cloneDeep(resourceData); + let escapedFilters; + + if (resourceData.query.filters) { + const filterArr = resourceData.query.filters.split(','); + escapedFilters = filterArr.map(f => { + let newF = f; + if (f.startsWith('tags.')) { + newF = f.replace(/["^*?\\]/g, c => '\\' + c); + } + return newF; + }); + escapedFilters = escapedFilters.join(','); + + newResourceData.query.filters = escapedFilters; + queryParams.filters = escapedFilters; + } + return newResourceData; +}; + export function buildQuery(queryParams, pathComponents, resourceData, logger, props) { const customFilterConfig = buildFilterConfig(queryParams.filters); + const newResourceData = escapeSpecialCharactersInTagFilters(queryParams, resourceData); return makeQueryFunction( 'cql.allRecords=1', @@ -53,7 +76,7 @@ export function buildQuery(queryParams, pathComponents, resourceData, logger, pr }, [...filterConfig, ...customFilterConfig], 2, - )(queryParams, pathComponents, resourceData, logger, props); + )(queryParams, pathComponents, newResourceData, logger, props); } class UserSearchContainer extends React.Component {