From 9e9545816820a87958b0d725929034d81d439d12 Mon Sep 17 00:00:00 2001 From: vladislavkeblysh <138868841+vladislavkeblysh@users.noreply.github.com> Date: Thu, 4 Jan 2024 22:24:12 +0200 Subject: [PATCH 01/39] feat: Editor bar visibility (#582) * feat: fixed editor bar visibility * feat: fixed editor bar visibility * feat: fixed z index --- src/index.scss | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/index.scss b/src/index.scss index cd69fcfe6..f7d1181f6 100755 --- a/src/index.scss +++ b/src/index.scss @@ -326,7 +326,7 @@ header { .header-action-bar { background-color: #fff; - z-index: 3; + z-index: 2 !important; box-shadow: 0px 2px 4px rgb(0 0 0 / 15%), 0px 2px 8px rgb(0 0 0 / 15%); position: sticky; top: 0; @@ -344,6 +344,10 @@ header { } } +.tox-tinymce-aux { + z-index: 1 !important; +} + .breadcrumb-menu { z-index: 1; } From ee61d1c95d43dd996794fe819b6ea2ecb1db6692 Mon Sep 17 00:00:00 2001 From: ayesha waris <73840786+ayesha-waris@users.noreply.github.com> Date: Fri, 5 Jan 2024 17:38:34 +0500 Subject: [PATCH 02/39] chore: removed enable_learners_tab_in_discussions_mfe flag dependency (#637) --- src/discussions/common/AuthorLabel.jsx | 4 +--- src/discussions/common/AuthorLabel.test.jsx | 1 - src/discussions/data/hooks.js | 3 --- src/discussions/data/selectors.js | 2 -- src/discussions/data/slices.js | 1 - .../discussions-home/DiscussionSidebar.jsx | 13 ++++--------- .../discussions-home/DiscussionsHome.jsx | 5 ++--- .../discussions-home/DiscussionsHome.test.jsx | 4 +--- src/discussions/learners/LearnersView.jsx | 19 ++++++++----------- .../learners/LearnersView.test.jsx | 9 --------- .../navigation-bar/NavigationBar.jsx | 16 +++++----------- src/discussions/posts/post/PostLink.test.jsx | 1 - 12 files changed, 21 insertions(+), 57 deletions(-) diff --git a/src/discussions/common/AuthorLabel.jsx b/src/discussions/common/AuthorLabel.jsx index c3c50a8bf..87f1a6212 100644 --- a/src/discussions/common/AuthorLabel.jsx +++ b/src/discussions/common/AuthorLabel.jsx @@ -10,7 +10,6 @@ import { Icon, OverlayTrigger, Tooltip } from '@edx/paragon'; import { Institution, School } from '@edx/paragon/icons'; import { Routes } from '../../data/constants'; -import { useShowLearnersTab } from '../data/hooks'; import messages from '../messages'; import { DiscussionContext } from './context'; import timeLocale from './time-locale'; @@ -45,8 +44,7 @@ const AuthorLabel = ({ const showTextPrimary = !authorLabelMessage && !isRetiredUser && !alert; const className = classNames('d-flex align-items-center', { 'mb-0.5': !postOrComment }, labelColor); - const showUserNameAsLink = useShowLearnersTab() - && linkToProfile && author && author !== intl.formatMessage(messages.anonymous); + const showUserNameAsLink = linkToProfile && author && author !== intl.formatMessage(messages.anonymous); const authorName = useMemo(() => ( { store = initializeStore(); axiosMock = new MockAdapter(getAuthenticatedHttpClient()); axiosMock.onGet(`${courseConfigApiUrl}${courseId}/`).reply(200, { - learners_tab_enabled: true, has_moderation_privileges: true, }); axiosMock.onGet(`${courseConfigApiUrl}${courseId}/settings`).reply(200, {}); diff --git a/src/discussions/data/hooks.js b/src/discussions/data/hooks.js index 07d869991..8b3e46555 100644 --- a/src/discussions/data/hooks.js +++ b/src/discussions/data/hooks.js @@ -31,7 +31,6 @@ import { selectIsCourseAdmin, selectIsCourseStaff, selectIsPostingEnabled, - selectLearnersTabEnabled, selectPostThreadCount, selectUserHasModerationPrivileges, selectUserIsGroupTa, @@ -171,8 +170,6 @@ export const useAlertBannerVisible = ( ); }; -export const useShowLearnersTab = () => useSelector(selectLearnersTabEnabled); - /** * React hook that gets the current topic ID from the current topic or category. * The topicId in the DiscussionContext only return the direct topicId from the URL. diff --git a/src/discussions/data/selectors.js b/src/discussions/data/selectors.js index 0689967e8..84028a245 100644 --- a/src/discussions/data/selectors.js +++ b/src/discussions/data/selectors.js @@ -14,8 +14,6 @@ export const selectUserIsGroupTa = state => state.config.isGroupTa; export const selectConfigLoadingStatus = state => state.config.status; -export const selectLearnersTabEnabled = state => state.config.learnersTabEnabled; - export const selectUserRoles = state => state.config.userRoles; export const selectDivisionSettings = state => state.config.settings; diff --git a/src/discussions/data/slices.js b/src/discussions/data/slices.js index 1b8c488ec..21ee2613c 100644 --- a/src/discussions/data/slices.js +++ b/src/discussions/data/slices.js @@ -16,7 +16,6 @@ const configSlice = createSlice({ isCourseAdmin: false, isCourseStaff: false, isUserAdmin: false, - learnersTabEnabled: false, isPostingEnabled: false, settings: { divisionScheme: 'none', diff --git a/src/discussions/discussions-home/DiscussionSidebar.jsx b/src/discussions/discussions-home/DiscussionSidebar.jsx index f1ef4182a..36ab3fea1 100644 --- a/src/discussions/discussions-home/DiscussionSidebar.jsx +++ b/src/discussions/discussions-home/DiscussionSidebar.jsx @@ -14,9 +14,7 @@ import { useWindowSize } from '@edx/paragon'; import Spinner from '../../components/Spinner'; import { RequestStatus, Routes as ROUTES } from '../../data/constants'; import { DiscussionContext } from '../common/context'; -import { - useContainerSize, useIsOnDesktop, useIsOnXLDesktop, useShowLearnersTab, -} from '../data/hooks'; +import { useContainerSize, useIsOnDesktop, useIsOnXLDesktop } from '../data/hooks'; import { selectConfigLoadingStatus, selectEnableInContext } from '../data/selectors'; const TopicPostsView = lazy(() => import('../in-context-topics/TopicPostsView')); @@ -32,7 +30,6 @@ const DiscussionSidebar = ({ displaySidebar, postActionBarRef }) => { const { enableInContextSidebar } = useContext(DiscussionContext); const enableInContext = useSelector(selectEnableInContext); const configStatus = useSelector(selectConfigLoadingStatus); - const redirectToLearnersTab = useShowLearnersTab(); const sidebarRef = useRef(null); const postActionBarHeight = useContainerSize(postActionBarRef); const { height: windowHeight } = useWindowSize(); @@ -103,14 +100,12 @@ const DiscussionSidebar = ({ displaySidebar, postActionBarRef }) => { {ROUTES.TOPICS.PATH.map(path => ( } /> ))} - {redirectToLearnersTab && ( + { [ROUTES.LEARNERS.POSTS, ROUTES.LEARNERS.POSTS_EDIT].map((route) => ( } /> )) - )} - {redirectToLearnersTab && ( - } /> - )} + } + } /> {configStatus === RequestStatus.SUCCESSFUL && ( } /> )} diff --git a/src/discussions/discussions-home/DiscussionsHome.jsx b/src/discussions/discussions-home/DiscussionsHome.jsx index 8cdd117ad..53baa1022 100644 --- a/src/discussions/discussions-home/DiscussionsHome.jsx +++ b/src/discussions/discussions-home/DiscussionsHome.jsx @@ -14,7 +14,7 @@ import { selectCourseTabs } from '../../components/NavigationBar/data/selectors' import { ALL_ROUTES, DiscussionProvider, Routes as ROUTES } from '../../data/constants'; import { DiscussionContext } from '../common/context'; import { - useCourseDiscussionData, useIsOnDesktop, useRedirectToThread, useShowLearnersTab, useSidebarVisible, + useCourseDiscussionData, useIsOnDesktop, useRedirectToThread, useSidebarVisible, } from '../data/hooks'; import { selectDiscussionProvider, selectEnableInContext } from '../data/selectors'; import { EmptyLearners, EmptyPosts, EmptyTopics } from '../empty-posts'; @@ -44,7 +44,6 @@ const DiscussionsHome = () => { const page = pageParams?.page || null; const matchPattern = ALL_ROUTES.find((route) => matchPath({ path: route }, location.pathname)); const { params } = useMatch(matchPattern); - const isRedirectToLearners = useShowLearnersTab(); const isOnDesktop = useIsOnDesktop(); let displaySidebar = useSidebarVisible(); const enableInContextSidebar = Boolean(new URLSearchParams(location.search).get('inContextSidebar') !== null); @@ -146,7 +145,7 @@ const DiscussionsHome = () => { element={} /> ))} - {isRedirectToLearners && } />} + } /> )} diff --git a/src/discussions/discussions-home/DiscussionsHome.test.jsx b/src/discussions/discussions-home/DiscussionsHome.test.jsx index 804f6413f..b05fdb304 100644 --- a/src/discussions/discussions-home/DiscussionsHome.test.jsx +++ b/src/discussions/discussions-home/DiscussionsHome.test.jsx @@ -198,9 +198,7 @@ describe('DiscussionsHome', () => { ); it('should display empty page message for empty learners list', async () => { - axiosMock.onGet(getDiscussionsConfigUrl(courseId)).reply(200, { - learners_tab_enabled: true, - }); + axiosMock.onGet(getDiscussionsConfigUrl(courseId)).reply(200, {}); await executeThunk(fetchCourseConfig(courseId), store.dispatch, store.getState); await renderComponent(`/${courseId}/learners`); diff --git a/src/discussions/learners/LearnersView.jsx b/src/discussions/learners/LearnersView.jsx index 7483f3b06..eeb493c08 100644 --- a/src/discussions/learners/LearnersView.jsx +++ b/src/discussions/learners/LearnersView.jsx @@ -8,7 +8,7 @@ import { Button, Spinner } from '@edx/paragon'; import SearchInfo from '../../components/SearchInfo'; import { RequestStatus } from '../../data/constants'; -import { selectConfigLoadingStatus, selectLearnersTabEnabled } from '../data/selectors'; +import { selectConfigLoadingStatus } from '../data/selectors'; import NoResults from '../posts/NoResults'; import { learnersLoadingStatus, @@ -31,18 +31,15 @@ const LearnersView = () => { const loadingStatus = useSelector(learnersLoadingStatus()); const usernameSearch = useSelector(selectUsernameSearch()); const courseConfigLoadingStatus = useSelector(selectConfigLoadingStatus); - const learnersTabEnabled = useSelector(selectLearnersTabEnabled); const learners = useSelector(selectAllLearners); useEffect(() => { - if (learnersTabEnabled) { - if (usernameSearch) { - dispatch(fetchLearners(courseId, { orderBy, usernameSearch })); - } else { - dispatch(fetchLearners(courseId, { orderBy })); - } + if (usernameSearch) { + dispatch(fetchLearners(courseId, { orderBy, usernameSearch })); + } else { + dispatch(fetchLearners(courseId, { orderBy })); } - }, [courseId, orderBy, learnersTabEnabled, usernameSearch]); + }, [courseId, orderBy, usernameSearch]); const loadPage = useCallback(async () => { if (nextPage) { @@ -60,12 +57,12 @@ const LearnersView = () => { const renderLearnersList = useMemo(() => ( ( - courseConfigLoadingStatus === RequestStatus.SUCCESSFUL && learnersTabEnabled && learners.map((learner) => ( + courseConfigLoadingStatus === RequestStatus.SUCCESSFUL && learners.map((learner) => ( )) // eslint-disable-next-line react/jsx-no-useless-fragment ) || <> - ), [courseConfigLoadingStatus, learnersTabEnabled, learners]); + ), [courseConfigLoadingStatus, learners]); return (
diff --git a/src/discussions/learners/LearnersView.test.jsx b/src/discussions/learners/LearnersView.test.jsx index 183ba07e0..5d20afef6 100644 --- a/src/discussions/learners/LearnersView.test.jsx +++ b/src/discussions/learners/LearnersView.test.jsx @@ -69,7 +69,6 @@ describe('LearnersView', () => { username: 'test_user', administrator: true, roles: [], - learnersTabEnabled: false, }, }); axiosMock = new MockAdapter(getAuthenticatedHttpClient()); @@ -106,7 +105,6 @@ describe('LearnersView', () => { async function assignPrivilages(hasModerationPrivileges = false) { axiosMock.onGet(getDiscussionsConfigUrl(courseId)).reply(200, { - learners_tab_enabled: true, user_is_privileged: true, hasModerationPrivileges, }); @@ -114,13 +112,6 @@ describe('LearnersView', () => { await executeThunk(fetchCourseConfig(courseId), store.dispatch, store.getState); } - test('Learners tab is disabled by default', async () => { - await setUpLearnerMockResponse(); - await renderComponent(); - - expect(screen.queryByText('learner-1')).not.toBeInTheDocument(); - }); - test('Learners tab is enabled', async () => { await setUpLearnerMockResponse(); await assignPrivilages(); diff --git a/src/discussions/navigation/navigation-bar/NavigationBar.jsx b/src/discussions/navigation/navigation-bar/NavigationBar.jsx index dd6a715b1..7d0f47cf3 100644 --- a/src/discussions/navigation/navigation-bar/NavigationBar.jsx +++ b/src/discussions/navigation/navigation-bar/NavigationBar.jsx @@ -7,14 +7,12 @@ import { Nav } from '@edx/paragon'; import { Routes } from '../../../data/constants'; import { DiscussionContext } from '../../common/context'; -import { useShowLearnersTab } from '../../data/hooks'; import { discussionsPath } from '../../utils'; import messages from './messages'; const NavigationBar = () => { const intl = useIntl(); const { courseId } = useContext(DiscussionContext); - const showLearnersTab = useShowLearnersTab(); const location = useLocation(); const isTopicsNavActive = Boolean(matchPath({ path: `${Routes.TOPICS.CATEGORY}/*` }, location.pathname)); @@ -31,16 +29,12 @@ const NavigationBar = () => { route: Routes.TOPICS.ALL, labelMessage: messages.allTopics, }, - ]), []); + { + route: Routes.LEARNERS.PATH, + labelMessage: messages.learners, + }, - useMemo(() => { - if (showLearnersTab) { - navLinks.push({ - route: Routes.LEARNERS.PATH, - labelMessage: messages.learners, - }); - } - }, [showLearnersTab]); + ]), []); return (