diff --git a/src/components/Search.jsx b/src/components/Search.jsx index 308f4bd4..c00c8b5c 100644 --- a/src/components/Search.jsx +++ b/src/components/Search.jsx @@ -7,6 +7,7 @@ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n'; import { SearchField } from '@edx/paragon'; import { DiscussionContext } from '../discussions/common/context'; +import { setUsernameSearch } from '../discussions/learners/data'; import { setSearchQuery } from '../discussions/posts/data'; import postsMessages from '../discussions/posts/post-actions-bar/messages'; import { setFilter as setTopicFilter } from '../discussions/topics/data/slices'; @@ -16,11 +17,12 @@ function Search({ intl }) { const { page } = useContext(DiscussionContext); const postSearch = useSelector(({ threads }) => threads.filters.search); const topicSearch = useSelector(({ topics }) => topics.filter); - const isPostSearch = ['posts', 'my-posts', 'learners'].includes(page); + const isPostSearch = ['posts', 'my-posts'].includes(page); const onClear = () => { dispatch(setSearchQuery('')); dispatch(setTopicFilter('')); + dispatch(setUsernameSearch('')); }; const onSubmit = (query) => { @@ -28,6 +30,8 @@ function Search({ intl }) { dispatch(setSearchQuery(query)); } else if (page === 'topics') { dispatch(setTopicFilter(query)); + } else if (page === 'learners') { + dispatch(setUsernameSearch(query)); } }; diff --git a/src/discussions/learners/LearnersView.jsx b/src/discussions/learners/LearnersView.jsx index e51f40ab..743efdca 100644 --- a/src/discussions/learners/LearnersView.jsx +++ b/src/discussions/learners/LearnersView.jsx @@ -15,6 +15,7 @@ import { selectAllLearners, selectLearnerNextPage, selectLearnerSorting, + selectUsernameSearch, } from './data/selectors'; import { fetchLearners } from './data/thunks'; import { LearnerCard, LearnerFilterBar } from './learner'; @@ -27,21 +28,27 @@ function LearnersView({ intl }) { const orderBy = useSelector(selectLearnerSorting()); const nextPage = useSelector(selectLearnerNextPage()); const loadingStatus = useSelector(learnersLoadingStatus()); + const usernameSearch = useSelector(selectUsernameSearch()); const courseConfigLoadingStatus = useSelector(selectconfigLoadingStatus); const learnersTabEnabled = useSelector(selectLearnersTabEnabled); const learners = useSelector(selectAllLearners); useEffect(() => { if (learnersTabEnabled) { - dispatch(fetchLearners(courseId, { orderBy })); + if (usernameSearch) { + dispatch(fetchLearners(courseId, { orderBy, usernameSearch })); + } else { + dispatch(fetchLearners(courseId, { orderBy })); + } } - }, [courseId, orderBy, learnersTabEnabled]); + }, [courseId, orderBy, learnersTabEnabled, usernameSearch]); const loadPage = async () => { if (nextPage) { dispatch(fetchLearners(courseId, { orderBy, page: nextPage, + usernameSearch, })); } }; diff --git a/src/discussions/learners/data/selectors.js b/src/discussions/learners/data/selectors.js index fae8940c..e73e87ce 100644 --- a/src/discussions/learners/data/selectors.js +++ b/src/discussions/learners/data/selectors.js @@ -9,6 +9,8 @@ export const selectAllLearners = createSelector( export const learnersLoadingStatus = () => state => state.learners.status; +export const selectUsernameSearch = () => state => state.learners.usernameSearch; + export const selectLearnerSorting = () => state => state.learners.sortedBy; export const selectLearnerNextPage = () => state => state.learners.nextPage; diff --git a/src/discussions/learners/data/slices.js b/src/discussions/learners/data/slices.js index 69e9dae8..ae7f38fc 100644 --- a/src/discussions/learners/data/slices.js +++ b/src/discussions/learners/data/slices.js @@ -16,6 +16,7 @@ const learnersSlice = createSlice({ totalPages: null, totalLearners: null, sortedBy: LearnersOrdering.BY_LAST_ACTIVITY, + usernameSearch: null, }, reducers: { fetchLearnersSuccess: (state, { payload }) => { @@ -41,6 +42,9 @@ const learnersSlice = createSlice({ setSortedBy: (state, { payload }) => { state.sortedBy = payload; }, + setUsernameSearch: (state, { payload }) => { + state.usernameSearch = payload; + }, }, }); @@ -50,6 +54,7 @@ export const { fetchLearnersSuccess, fetchLearnersDenied, setSortedBy, + setUsernameSearch, } = learnersSlice.actions; export const learnersReducer = learnersSlice.reducer; diff --git a/src/discussions/learners/data/thunks.js b/src/discussions/learners/data/thunks.js index 094a25a2..36adbf97 100644 --- a/src/discussions/learners/data/thunks.js +++ b/src/discussions/learners/data/thunks.js @@ -23,16 +23,20 @@ import { * @param {string} courseId The course ID for the course to fetch data for. * @param {string} orderBy * @param {number} page + * @param {usernameSearch} username * @returns {(function(*): Promise)|*} */ export function fetchLearners(courseId, { orderBy, page = 1, + usernameSearch = null, } = {}) { return async (dispatch) => { try { const params = snakeCaseObject({ orderBy, page }); - + if (usernameSearch) { + params.username = usernameSearch; + } dispatch(fetchLearnersRequest({ courseId })); const learnerStats = await getLearners(courseId, params); const learnerProfilesData = await getUserProfiles(learnerStats.results.map((l) => l.username));