Compare commits
8 Commits
dependabot
...
open-relea
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c1c0d3a91 | ||
|
|
37c28b6f7b | ||
|
|
fbb3ed5101 | ||
|
|
887335f1bb | ||
|
|
c8ab1634e1 | ||
|
|
7ff00fa830 | ||
|
|
3b409b0c7a | ||
|
|
b24568f0bd |
10
package-lock.json
generated
10
package-lock.json
generated
@@ -21,7 +21,7 @@
|
|||||||
"@edx/frontend-component-header": "4.6.0",
|
"@edx/frontend-component-header": "4.6.0",
|
||||||
"@edx/frontend-lib-learning-assistant": "^1.14.0",
|
"@edx/frontend-lib-learning-assistant": "^1.14.0",
|
||||||
"@edx/frontend-lib-special-exams": "2.23.2",
|
"@edx/frontend-lib-special-exams": "2.23.2",
|
||||||
"@edx/frontend-platform": "5.0.0",
|
"@edx/frontend-platform": "5.5.2",
|
||||||
"@edx/paragon": "20.46.0",
|
"@edx/paragon": "20.46.0",
|
||||||
"@edx/react-unit-test-utils": "npm:@edx/react-unit-test-utils@1.7.0",
|
"@edx/react-unit-test-utils": "npm:@edx/react-unit-test-utils@1.7.0",
|
||||||
"@fortawesome/fontawesome-svg-core": "1.3.0",
|
"@fortawesome/fontawesome-svg-core": "1.3.0",
|
||||||
@@ -3623,9 +3623,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@edx/frontend-platform": {
|
"node_modules/@edx/frontend-platform": {
|
||||||
"version": "5.0.0",
|
"version": "5.5.2",
|
||||||
"resolved": "https://registry.npmjs.org/@edx/frontend-platform/-/frontend-platform-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/@edx/frontend-platform/-/frontend-platform-5.5.2.tgz",
|
||||||
"integrity": "sha512-DD9/B4rnC3BKPiWlbEFF1JIYFbWC6vUBKTyN8sf4khi4DNhhWhsobk+iNeCWNzF9UgCPRbniIqesdV1F9NXNZw==",
|
"integrity": "sha512-cbUvWcFL/mTc7eypBS/BnCojgWDcJCe3h3ffb3GD7F+Y4ysrFBJYf031qPcgmWNUrN30452dR7r1+sqE7uVvYA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cospired/i18n-iso-languages": "4.1.0",
|
"@cospired/i18n-iso-languages": "4.1.0",
|
||||||
"@formatjs/intl-pluralrules": "4.3.3",
|
"@formatjs/intl-pluralrules": "4.3.3",
|
||||||
@@ -3653,7 +3653,7 @@
|
|||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"@edx/frontend-build": ">= 8.1.0 || ^12.9.0-alpha.1",
|
"@edx/frontend-build": ">= 8.1.0 || ^12.9.0-alpha.1",
|
||||||
"@edx/paragon": ">= 10.0.0 < 21.0.0",
|
"@edx/paragon": ">= 10.0.0 < 22.0.0",
|
||||||
"prop-types": "^15.7.2",
|
"prop-types": "^15.7.2",
|
||||||
"react": "^16.9.0 || ^17.0.0",
|
"react": "^16.9.0 || ^17.0.0",
|
||||||
"react-dom": "^16.9.0 || ^17.0.0",
|
"react-dom": "^16.9.0 || ^17.0.0",
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
"@edx/frontend-component-header": "4.6.0",
|
"@edx/frontend-component-header": "4.6.0",
|
||||||
"@edx/frontend-lib-learning-assistant": "^1.14.0",
|
"@edx/frontend-lib-learning-assistant": "^1.14.0",
|
||||||
"@edx/frontend-lib-special-exams": "2.23.2",
|
"@edx/frontend-lib-special-exams": "2.23.2",
|
||||||
"@edx/frontend-platform": "5.0.0",
|
"@edx/frontend-platform": "5.5.2",
|
||||||
"@edx/paragon": "20.46.0",
|
"@edx/paragon": "20.46.0",
|
||||||
"@edx/react-unit-test-utils": "npm:@edx/react-unit-test-utils@1.7.0",
|
"@edx/react-unit-test-utils": "npm:@edx/react-unit-test-utils@1.7.0",
|
||||||
"@fortawesome/fontawesome-svg-core": "1.3.0",
|
"@fortawesome/fontawesome-svg-core": "1.3.0",
|
||||||
|
|||||||
@@ -38,21 +38,21 @@ function getBadgeListAndColor(date, intl, item, items) {
|
|||||||
message: messages.today,
|
message: messages.today,
|
||||||
shownForDay: isToday,
|
shownForDay: isToday,
|
||||||
bg: 'bg-warning-300',
|
bg: 'bg-warning-300',
|
||||||
className: 'text-black',
|
className: 'text-dark',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
message: messages.completed,
|
message: messages.completed,
|
||||||
shownForDay: assignments.length && assignments.every(isComplete),
|
shownForDay: assignments.length && assignments.every(isComplete),
|
||||||
shownForItem: x => isLearnerAssignment(x) && isComplete(x),
|
shownForItem: x => isLearnerAssignment(x) && isComplete(x),
|
||||||
bg: 'bg-light-500',
|
bg: 'bg-light-500',
|
||||||
className: 'text-black',
|
className: 'text-dark',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
message: messages.pastDue,
|
message: messages.pastDue,
|
||||||
shownForDay: assignments.length && assignments.every(isPastDue),
|
shownForDay: assignments.length && assignments.every(isPastDue),
|
||||||
shownForItem: x => isLearnerAssignment(x) && isPastDue(x),
|
shownForItem: x => isLearnerAssignment(x) && isPastDue(x),
|
||||||
bg: 'bg-dark-200',
|
bg: 'bg-dark-200',
|
||||||
className: 'text-white',
|
className: 'text-dark',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
message: messages.dueNext,
|
message: messages.dueNext,
|
||||||
|
|||||||
@@ -9,8 +9,9 @@ const LmsHtmlFragment = ({
|
|||||||
title,
|
title,
|
||||||
...rest
|
...rest
|
||||||
}) => {
|
}) => {
|
||||||
|
const direction = document.documentElement?.getAttribute('dir') || 'ltr';
|
||||||
const wholePage = `
|
const wholePage = `
|
||||||
<html>
|
<html dir="${direction}">
|
||||||
<head>
|
<head>
|
||||||
<base href="${getConfig().LMS_BASE_URL}" target="_parent">
|
<base href="${getConfig().LMS_BASE_URL}" target="_parent">
|
||||||
<link rel="stylesheet" href="/static/${getConfig().LEGACY_THEME_NAME ? `${getConfig().LEGACY_THEME_NAME}/` : ''}css/bootstrap/lms-main.css">
|
<link rel="stylesheet" href="/static/${getConfig().LEGACY_THEME_NAME ? `${getConfig().LEGACY_THEME_NAME}/` : ''}css/bootstrap/lms-main.css">
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ const ProgressTab = () => {
|
|||||||
} = useSelector(state => state.courseHome);
|
} = useSelector(state => state.courseHome);
|
||||||
|
|
||||||
const {
|
const {
|
||||||
gradesFeatureIsFullyLocked,
|
gradesFeatureIsFullyLocked, disableProgressGraph,
|
||||||
} = useModel('progress', courseId);
|
} = useModel('progress', courseId);
|
||||||
|
|
||||||
const applyLockedOverlay = gradesFeatureIsFullyLocked ? 'locked-overlay' : '';
|
const applyLockedOverlay = gradesFeatureIsFullyLocked ? 'locked-overlay' : '';
|
||||||
@@ -38,7 +38,7 @@ const ProgressTab = () => {
|
|||||||
<div className="row w-100 m-0">
|
<div className="row w-100 m-0">
|
||||||
{/* Main body */}
|
{/* Main body */}
|
||||||
<div className="col-12 col-md-8 p-0">
|
<div className="col-12 col-md-8 p-0">
|
||||||
<CourseCompletion />
|
{!disableProgressGraph && <CourseCompletion />}
|
||||||
{!wideScreen && <CertificateStatus />}
|
{!wideScreen && <CertificateStatus />}
|
||||||
<CourseGrade />
|
<CourseGrade />
|
||||||
<div className={`grades my-4 p-4 rounded raised-card ${applyLockedOverlay}`} aria-hidden={gradesFeatureIsFullyLocked}>
|
<div className={`grades my-4 p-4 rounded raised-card ${applyLockedOverlay}`} aria-hidden={gradesFeatureIsFullyLocked}>
|
||||||
|
|||||||
@@ -140,26 +140,28 @@ const Sequence = ({
|
|||||||
const gated = sequence && sequence.gatedContent !== undefined && sequence.gatedContent.gated;
|
const gated = sequence && sequence.gatedContent !== undefined && sequence.gatedContent.gated;
|
||||||
|
|
||||||
const defaultContent = (
|
const defaultContent = (
|
||||||
<div className="sequence-container d-inline-flex flex-row">
|
<div className="sequence-container d-inline-flex flex-row w-100">
|
||||||
<div className={classNames('sequence w-100', { 'position-relative': shouldDisplayNotificationTriggerInSequence })}>
|
<div className={classNames('sequence w-100', { 'position-relative': shouldDisplayNotificationTriggerInSequence })}>
|
||||||
<SequenceNavigation
|
<div className="sequence-navigation-container">
|
||||||
sequenceId={sequenceId}
|
<SequenceNavigation
|
||||||
unitId={unitId}
|
sequenceId={sequenceId}
|
||||||
className="mb-4"
|
unitId={unitId}
|
||||||
nextHandler={() => {
|
className="mb-4"
|
||||||
logEvent('edx.ui.lms.sequence.next_selected', 'top');
|
nextHandler={() => {
|
||||||
handleNext();
|
logEvent('edx.ui.lms.sequence.next_selected', 'top');
|
||||||
}}
|
handleNext();
|
||||||
onNavigate={(destinationUnitId) => {
|
}}
|
||||||
logEvent('edx.ui.lms.sequence.tab_selected', 'top', destinationUnitId);
|
onNavigate={(destinationUnitId) => {
|
||||||
handleNavigate(destinationUnitId);
|
logEvent('edx.ui.lms.sequence.tab_selected', 'top', destinationUnitId);
|
||||||
}}
|
handleNavigate(destinationUnitId);
|
||||||
previousHandler={() => {
|
}}
|
||||||
logEvent('edx.ui.lms.sequence.previous_selected', 'top');
|
previousHandler={() => {
|
||||||
handlePrevious();
|
logEvent('edx.ui.lms.sequence.previous_selected', 'top');
|
||||||
}}
|
handlePrevious();
|
||||||
/>
|
}}
|
||||||
{shouldDisplayNotificationTriggerInSequence && <SidebarTriggers />}
|
/>
|
||||||
|
{shouldDisplayNotificationTriggerInSequence && <SidebarTriggers />}
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="unit-container flex-grow-1">
|
<div className="unit-container flex-grow-1">
|
||||||
<SequenceContent
|
<SequenceContent
|
||||||
|
|||||||
@@ -50,12 +50,6 @@ const useIFrameBehavior = ({
|
|||||||
if (type === messageTypes.resize) {
|
if (type === messageTypes.resize) {
|
||||||
setIframeHeight(payload.height);
|
setIframeHeight(payload.height);
|
||||||
|
|
||||||
// We observe exit from the video xblock fullscreen mode
|
|
||||||
// and scroll to the previously saved scroll position
|
|
||||||
if (windowTopOffset !== null) {
|
|
||||||
window.scrollTo(0, Number(windowTopOffset));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hasLoaded && iframeHeight === 0 && payload.height > 0) {
|
if (!hasLoaded && iframeHeight === 0 && payload.height > 0) {
|
||||||
setHasLoaded(true);
|
setHasLoaded(true);
|
||||||
if (onLoaded) {
|
if (onLoaded) {
|
||||||
@@ -63,6 +57,12 @@ const useIFrameBehavior = ({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (type === messageTypes.videoFullScreen) {
|
} else if (type === messageTypes.videoFullScreen) {
|
||||||
|
// We observe exit from the video xblock fullscreen mode
|
||||||
|
// and scroll to the previously saved scroll position
|
||||||
|
if (!payload.open && windowTopOffset !== null) {
|
||||||
|
window.scrollTo(0, Number(windowTopOffset));
|
||||||
|
}
|
||||||
|
|
||||||
// We listen for this message from LMS to know when we need to
|
// We listen for this message from LMS to know when we need to
|
||||||
// save or reset scroll position on toggle video xblock fullscreen mode
|
// save or reset scroll position on toggle video xblock fullscreen mode
|
||||||
setWindowTopOffset(payload.open ? window.scrollY : null);
|
setWindowTopOffset(payload.open ? window.scrollY : null);
|
||||||
|
|||||||
@@ -154,6 +154,9 @@ describe('useIFrameBehavior hook', () => {
|
|||||||
const resizeMessage = (height = 23) => ({
|
const resizeMessage = (height = 23) => ({
|
||||||
data: { type: messageTypes.resize, payload: { height } },
|
data: { type: messageTypes.resize, payload: { height } },
|
||||||
});
|
});
|
||||||
|
const videoFullScreenMessage = (open = false) => ({
|
||||||
|
data: { type: messageTypes.videoFullScreen, payload: { open } },
|
||||||
|
});
|
||||||
const testSetIFrameHeight = (height = 23) => {
|
const testSetIFrameHeight = (height = 23) => {
|
||||||
const { cb } = useEventListener.mock.calls[0][1];
|
const { cb } = useEventListener.mock.calls[0][1];
|
||||||
cb(resizeMessage(height));
|
cb(resizeMessage(height));
|
||||||
@@ -209,7 +212,7 @@ describe('useIFrameBehavior hook', () => {
|
|||||||
state.mockVals({ ...defaultStateVals, windowTopOffset });
|
state.mockVals({ ...defaultStateVals, windowTopOffset });
|
||||||
hook = useIFrameBehavior(props);
|
hook = useIFrameBehavior(props);
|
||||||
const { cb } = useEventListener.mock.calls[0][1];
|
const { cb } = useEventListener.mock.calls[0][1];
|
||||||
cb(resizeMessage());
|
cb(videoFullScreenMessage());
|
||||||
expect(window.scrollTo).toHaveBeenCalledWith(0, windowTopOffset);
|
expect(window.scrollTo).toHaveBeenCalledWith(0, windowTopOffset);
|
||||||
});
|
});
|
||||||
it('does not scroll if towverticalp offset is not set', () => {
|
it('does not scroll if towverticalp offset is not set', () => {
|
||||||
|
|||||||
@@ -106,11 +106,10 @@ const SequenceNavigation = ({
|
|||||||
};
|
};
|
||||||
|
|
||||||
return sequenceStatus === LOADED && (
|
return sequenceStatus === LOADED && (
|
||||||
<nav id="courseware-sequenceNavigation" className={classNames('sequence-navigation', className)} style={{ width: shouldDisplayNotificationTriggerInSequence ? '90%' : null }}>
|
<nav id="courseware-sequenceNavigation" className={classNames('sequence-navigation', className, { 'mr-2': shouldDisplayNotificationTriggerInSequence })}>
|
||||||
{renderPreviousButton()}
|
{renderPreviousButton()}
|
||||||
{renderUnitButtons()}
|
{renderUnitButtons()}
|
||||||
{renderNextButton()}
|
{renderNextButton()}
|
||||||
|
|
||||||
</nav>
|
</nav>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import classNames from 'classnames';
|
import classNames from 'classnames';
|
||||||
import React, { useContext } from 'react';
|
import React, { useContext } from 'react';
|
||||||
|
import { breakpoints, useWindowSize } from '@edx/paragon';
|
||||||
import SidebarContext from './SidebarContext';
|
import SidebarContext from './SidebarContext';
|
||||||
import { SIDEBAR_ORDER, SIDEBARS } from './sidebars';
|
import { SIDEBAR_ORDER, SIDEBARS } from './sidebars';
|
||||||
|
|
||||||
@@ -8,6 +9,9 @@ const SidebarTriggers = () => {
|
|||||||
toggleSidebar,
|
toggleSidebar,
|
||||||
currentSidebar,
|
currentSidebar,
|
||||||
} = useContext(SidebarContext);
|
} = useContext(SidebarContext);
|
||||||
|
|
||||||
|
const isMobileView = useWindowSize().width < breakpoints.small.minWidth;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="d-flex ml-auto">
|
<div className="d-flex ml-auto">
|
||||||
{SIDEBAR_ORDER.map((sidebarId) => {
|
{SIDEBAR_ORDER.map((sidebarId) => {
|
||||||
@@ -15,7 +19,7 @@ const SidebarTriggers = () => {
|
|||||||
const isActive = sidebarId === currentSidebar;
|
const isActive = sidebarId === currentSidebar;
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className={classNames('mt-3', { 'border-primary-700': isActive })}
|
className={classNames({ 'mt-3': !isMobileView, 'border-primary-700': isActive })}
|
||||||
style={{ borderBottom: isActive ? '2px solid' : null }}
|
style={{ borderBottom: isActive ? '2px solid' : null }}
|
||||||
key={sidebarId}
|
key={sidebarId}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ const SidebarTriggerBase = ({
|
|||||||
children,
|
children,
|
||||||
}) => (
|
}) => (
|
||||||
<button
|
<button
|
||||||
className="border border-light-400 bg-transparent align-items-center align-content-center d-flex"
|
className="border border-light-400 bg-transparent align-items-center align-content-center d-flex notification-btn"
|
||||||
type="button"
|
type="button"
|
||||||
onClick={onClick}
|
onClick={onClick}
|
||||||
aria-label={ariaLabel}
|
aria-label={ariaLabel}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
.discussions-sidebar-frame {
|
||||||
|
@media (max-width: -1 + map-get($grid-breakpoints, "xl")) {
|
||||||
|
max-height: calc(100vh - 65px);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,7 +32,7 @@ const DiscussionsSidebar = ({ intl }) => {
|
|||||||
>
|
>
|
||||||
<iframe
|
<iframe
|
||||||
src={`${discussionsUrl}?inContextSidebar`}
|
src={`${discussionsUrl}?inContextSidebar`}
|
||||||
className="d-flex w-100 h-100 border-0"
|
className="d-flex w-100 h-100 border-0 discussions-sidebar-frame"
|
||||||
title={intl.formatMessage(messages.discussionsTitle)}
|
title={intl.formatMessage(messages.discussionsTitle)}
|
||||||
allow="clipboard-write"
|
allow="clipboard-write"
|
||||||
loading="lazy"
|
loading="lazy"
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ const invisibleStyle = {
|
|||||||
left: 0,
|
left: 0,
|
||||||
pointerEvents: 'none',
|
pointerEvents: 'none',
|
||||||
visibility: 'hidden',
|
visibility: 'hidden',
|
||||||
|
maxWidth: '100%',
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -22,9 +22,8 @@
|
|||||||
// An additional Font Awesome stylesheet is imported by Braze in
|
// An additional Font Awesome stylesheet is imported by Braze in
|
||||||
// stage/production but not devstack.
|
// stage/production but not devstack.
|
||||||
.upgrade-notification-ul.fa-ul {
|
.upgrade-notification-ul.fa-ul {
|
||||||
padding-left: 1.25rem;
|
padding: 0.875rem 1.25rem 0;
|
||||||
padding-top: 0.875rem;
|
margin: 0 0 1rem 2.5rem;
|
||||||
padding-right: 1.25rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.upgrade-notification-text {
|
.upgrade-notification-text {
|
||||||
|
|||||||
@@ -84,7 +84,6 @@
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
margin-bottom: 4rem;
|
margin-bottom: 4rem;
|
||||||
width: 100%;
|
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
}
|
}
|
||||||
@@ -96,8 +95,24 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.sequence-navigation-container {
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-btn {
|
||||||
|
@media (max-width: -1 + map-get($grid-breakpoints, "sm")) {
|
||||||
|
height: 3rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.sequence-navigation {
|
.sequence-navigation {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
flex-grow: 1;
|
||||||
|
|
||||||
|
@media (max-width: -1 + map-get($grid-breakpoints, "sm")) {
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
@media (min-width: map-get($grid-breakpoints, "sm")) {
|
@media (min-width: map-get($grid-breakpoints, "sm")) {
|
||||||
margin: -1px -1px 0;
|
margin: -1px -1px 0;
|
||||||
@@ -165,9 +180,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.sequence-navigation-tabs {
|
.sequence-navigation-tabs {
|
||||||
|
overflow: auto;
|
||||||
.btn {
|
.btn {
|
||||||
flex-basis: 100%;
|
flex-basis: 100%;
|
||||||
min-width: 2rem;
|
min-width: 3rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -377,6 +393,7 @@
|
|||||||
|
|
||||||
// Import component-specific sass files
|
// Import component-specific sass files
|
||||||
@import "courseware/course/celebration/CelebrationModal.scss";
|
@import "courseware/course/celebration/CelebrationModal.scss";
|
||||||
|
@import "courseware/course/sidebar/sidebars/discussions/Discussions.scss";
|
||||||
@import "courseware/course/sidebar/sidebars/notifications/NotificationIcon.scss";
|
@import "courseware/course/sidebar/sidebars/notifications/NotificationIcon.scss";
|
||||||
@import "courseware/course/sequence/lock-paywall/LockPaywall.scss";
|
@import "courseware/course/sequence/lock-paywall/LockPaywall.scss";
|
||||||
@import "shared/streak-celebration/StreakCelebrationModal.scss";
|
@import "shared/streak-celebration/StreakCelebrationModal.scss";
|
||||||
@@ -386,7 +403,7 @@
|
|||||||
@import "generic/upgrade-notification/UpgradeNotification.scss";
|
@import "generic/upgrade-notification/UpgradeNotification.scss";
|
||||||
@import "generic/upsell-bullets/UpsellBullets.scss";
|
@import "generic/upsell-bullets/UpsellBullets.scss";
|
||||||
@import "course-home/outline-tab/widgets/ProctoringInfoPanel.scss";
|
@import "course-home/outline-tab/widgets/ProctoringInfoPanel.scss";
|
||||||
@import "src/course-home/outline-tab/widgets/FlagButton.scss";
|
@import "course-home/outline-tab/widgets/FlagButton.scss";
|
||||||
@import "course-home/progress-tab/course-completion/CompletionDonutChart.scss";
|
@import "course-home/progress-tab/course-completion/CompletionDonutChart.scss";
|
||||||
@import "course-home/progress-tab/grades/course-grade/GradeBar.scss";
|
@import "course-home/progress-tab/grades/course-grade/GradeBar.scss";
|
||||||
@import "courseware/course/course-exit/CourseRecommendations";
|
@import "courseware/course/course-exit/CourseRecommendations";
|
||||||
|
|||||||
Reference in New Issue
Block a user