diff --git a/src/components/SearchInfo.jsx b/src/components/SearchInfo.jsx
index fc766cbd..3fd628b8 100644
--- a/src/components/SearchInfo.jsx
+++ b/src/components/SearchInfo.jsx
@@ -14,18 +14,23 @@ function SearchInfo({
text,
loadingStatus,
onClear,
+ textSearchRewrite,
}) {
return (
-
@@ -37,11 +42,13 @@ SearchInfo.propTypes = {
count: PropTypes.number.isRequired,
text: PropTypes.string.isRequired,
loadingStatus: PropTypes.string.isRequired,
+ textSearchRewrite: PropTypes.string,
onClear: PropTypes.func,
};
SearchInfo.defaultProps = {
onClear: () => {},
+ textSearchRewrite: null,
};
export default injectIntl(SearchInfo);
diff --git a/src/discussions/posts/PostsView.jsx b/src/discussions/posts/PostsView.jsx
index 9f4ce117..4ac0c2fc 100644
--- a/src/discussions/posts/PostsView.jsx
+++ b/src/discussions/posts/PostsView.jsx
@@ -46,6 +46,7 @@ function PostsView() {
const dispatch = useDispatch();
const searchString = useSelector(({ threads }) => threads.filters.search);
const resultsFound = useSelector(({ threads }) => threads.totalThreads);
+ const textSearchRewrite = useSelector(({ threads }) => threads.textSearchRewrite);
const loadingStatus = useSelector(({ threads }) => threads.status);
let postsListComponent;
@@ -80,6 +81,7 @@ function PostsView() {
text={searchString}
loadingStatus={loadingStatus}
onClear={() => dispatch(setSearchQuery(''))}
+ textSearchRewrite={textSearchRewrite}
/>
)}
diff --git a/src/discussions/posts/data/slices.js b/src/discussions/posts/data/slices.js
index 291213bc..ba61f128 100644
--- a/src/discussions/posts/data/slices.js
+++ b/src/discussions/posts/data/slices.js
@@ -40,6 +40,7 @@ const threadsSlice = createSlice({
nextPage: null,
totalPages: null,
totalThreads: null,
+ textSearchRewrite: null,
postStatus: RequestStatus.SUCCESSFUL,
filters: {
status: PostsStatusFilter.ALL,
@@ -80,6 +81,7 @@ const threadsSlice = createSlice({
state.nextPage = (payload.page < payload.pagination.numPages) ? payload.page + 1 : null;
state.totalPages = payload.pagination.numPages;
state.totalThreads = payload.pagination.count;
+ state.textSearchRewrite = payload.textSearchRewrite;
},
fetchThreadsFailed: (state) => {
state.status = RequestStatus.FAILED;
diff --git a/src/discussions/posts/data/thunks.js b/src/discussions/posts/data/thunks.js
index bfb45363..9599d3c6 100644
--- a/src/discussions/posts/data/thunks.js
+++ b/src/discussions/posts/data/thunks.js
@@ -138,7 +138,7 @@ export function fetchThreads(courseId, {
const data = await getThreads(courseId, options);
const normalisedData = normaliseThreads(camelCaseObject(data), topicIds);
dispatch(fetchThreadsSuccess({
- ...normalisedData, page, author,
+ ...normalisedData, page, author, textSearchRewrite: data.text_search_rewrite,
}));
} catch (error) {
if (getHttpErrorStatus(error) === 403) {
diff --git a/src/discussions/posts/post-actions-bar/messages.js b/src/discussions/posts/post-actions-bar/messages.js
index b97d321e..325c808a 100644
--- a/src/discussions/posts/post-actions-bar/messages.js
+++ b/src/discussions/posts/post-actions-bar/messages.js
@@ -26,6 +26,11 @@ const messages = defineMessages({
defaultMessage: 'Showing {count} results for "{text}"',
description: 'Message displayed when user performs a search',
},
+ searchRewriteInfo: {
+ id: 'discussions.actionBar.searchRewriteInfo',
+ defaultMessage: 'No results found for "{searchString}". Showing {count} results for "{textSearchRewrite}".',
+ description: 'Message displayed when user performs a search and search query is rewritten because matching results are not found',
+ },
searchInfoSearching: {
id: 'discussions.actionBar.searchInfoSearching',
defaultMessage: 'Searching...',