From 073e191273363c4b820dd09017f3db63ce0a09da Mon Sep 17 00:00:00 2001
From: Peter Kulko <93188219+PKulkoRaccoonGang@users.noreply.github.com>
Date: Mon, 22 Jan 2024 16:52:04 +0200
Subject: [PATCH] feat: [AXIMST-23] Course unit - Sidebar with unit info (#117)
* feat: added Sidebar with unit info
* feat: added unit location
* refactor: added legacy behavior
* feat: added live variant
* refactor: code refactoring
* feat: added tests and translations
* feat: added new font size
* refactor: after review
---
src/course-unit/CourseUnit.jsx | 14 ++-
src/course-unit/CourseUnit.scss | 1 +
src/course-unit/CourseUnit.test.jsx | 40 +++++++
src/course-unit/constants.js | 18 +++
src/course-unit/sidebar/Sidebar.scss | 71 +++++++++++
.../components/ReleaseInfoComponent.jsx | 29 +++++
.../sidebar/components/SidebarBody.jsx | 65 +++++++++++
.../sidebar/components/SidebarHeader.jsx | 41 +++++++
src/course-unit/sidebar/components/index.js | 3 +
.../sidebar-footer/ActionButtons.jsx | 49 ++++++++
.../sidebar-footer/UnitVisibilityInfo.jsx | 55 +++++++++
.../components/sidebar-footer/index.jsx | 40 +++++++
src/course-unit/sidebar/hooks.jsx | 43 +++++++
src/course-unit/sidebar/index.jsx | 52 +++++++++
src/course-unit/sidebar/messages.js | 110 ++++++++++++++++++
src/course-unit/sidebar/utils.js | 102 ++++++++++++++++
src/i18n/messages/ar.json | 1 -
src/i18n/messages/de.json | 26 -----
src/i18n/messages/es_419.json | 26 -----
src/i18n/messages/fa_IR.json | 26 -----
src/i18n/messages/fr.json | 26 -----
src/i18n/messages/fr_CA.json | 26 -----
src/i18n/messages/hi.json | 26 -----
src/i18n/messages/it.json | 26 -----
src/i18n/messages/it_IT.json | 26 -----
src/i18n/messages/pt.json | 26 -----
src/i18n/messages/pt_PT.json | 26 -----
src/i18n/messages/ru.json | 26 -----
src/i18n/messages/uk.json | 26 -----
src/i18n/messages/zh_CN.json | 26 -----
30 files changed, 729 insertions(+), 343 deletions(-)
create mode 100644 src/course-unit/sidebar/Sidebar.scss
create mode 100644 src/course-unit/sidebar/components/ReleaseInfoComponent.jsx
create mode 100644 src/course-unit/sidebar/components/SidebarBody.jsx
create mode 100644 src/course-unit/sidebar/components/SidebarHeader.jsx
create mode 100644 src/course-unit/sidebar/components/index.js
create mode 100644 src/course-unit/sidebar/components/sidebar-footer/ActionButtons.jsx
create mode 100644 src/course-unit/sidebar/components/sidebar-footer/UnitVisibilityInfo.jsx
create mode 100644 src/course-unit/sidebar/components/sidebar-footer/index.jsx
create mode 100644 src/course-unit/sidebar/hooks.jsx
create mode 100644 src/course-unit/sidebar/index.jsx
create mode 100644 src/course-unit/sidebar/messages.js
create mode 100644 src/course-unit/sidebar/utils.js
diff --git a/src/course-unit/CourseUnit.jsx b/src/course-unit/CourseUnit.jsx
index a1b5e12ba..682e991b1 100644
--- a/src/course-unit/CourseUnit.jsx
+++ b/src/course-unit/CourseUnit.jsx
@@ -18,6 +18,7 @@ import HeaderTitle from './header-title/HeaderTitle';
import Breadcrumbs from './breadcrumbs/Breadcrumbs';
import HeaderNavigations from './header-navigations/HeaderNavigations';
import Sequence from './course-sequence';
+import Sidebar from './sidebar';
import { useCourseUnit } from './hooks';
import messages from './messages';
@@ -86,9 +87,9 @@ const CourseUnit = ({ courseId }) => {
handleCreateNewCourseXBlock={handleCreateNewCourseXBlock}
/>
@@ -110,7 +111,12 @@ const CourseUnit = ({ courseId }) => {
handleCreateNewCourseXBlock={handleCreateNewCourseXBlock}
/>
-
+
+
+
+
+
+
diff --git a/src/course-unit/CourseUnit.scss b/src/course-unit/CourseUnit.scss
index d54e7ad23..16d588f44 100644
--- a/src/course-unit/CourseUnit.scss
+++ b/src/course-unit/CourseUnit.scss
@@ -2,3 +2,4 @@
@import "./course-sequence/CourseSequence";
@import "./add-component/AddComponent";
@import "./course-xblock/CourseXblock";
+@import "./sidebar/Sidebar";
diff --git a/src/course-unit/CourseUnit.test.jsx b/src/course-unit/CourseUnit.test.jsx
index cf35db7c0..555aa1028 100644
--- a/src/course-unit/CourseUnit.test.jsx
+++ b/src/course-unit/CourseUnit.test.jsx
@@ -34,6 +34,8 @@ import CourseUnit from './CourseUnit';
import headerNavigationsMessages from './header-navigations/messages';
import headerTitleMessages from './header-title/messages';
import courseSequenceMessages from './course-sequence/messages';
+import sidebarMessages from './sidebar/messages';
+import { extractCourseUnitId } from './sidebar/utils';
import deleteModalMessages from '../generic/delete-modal/messages';
import courseXBlockMessages from './course-xblock/messages';
@@ -310,6 +312,44 @@ describe('', () => {
});
});
+ it('renders course unit details for a draft with unpublished changes', async () => {
+ const { getByText } = render();
+
+ await waitFor(() => {
+ expect(getByText(sidebarMessages.sidebarTitleDraftUnpublishedChanges.defaultMessage)).toBeInTheDocument();
+ expect(getByText(sidebarMessages.visibilityStaffAndLearnersTitle.defaultMessage)).toBeInTheDocument();
+ expect(getByText(sidebarMessages.releaseStatusTitle.defaultMessage)).toBeInTheDocument();
+ expect(getByText(sidebarMessages.sidebarBodyNote.defaultMessage)).toBeInTheDocument();
+ expect(getByText(sidebarMessages.visibilityWillBeVisibleToTitle.defaultMessage)).toBeInTheDocument();
+ expect(getByText(sidebarMessages.visibilityCheckboxTitle.defaultMessage)).toBeInTheDocument();
+ expect(getByText(sidebarMessages.actionButtonPublishTitle.defaultMessage)).toBeInTheDocument();
+ expect(getByText(sidebarMessages.actionButtonDiscardChangesTitle.defaultMessage)).toBeInTheDocument();
+ expect(getByText(courseUnitIndexMock.release_date)).toBeInTheDocument();
+ expect(getByText(
+ sidebarMessages.publishInfoDraftSaved.defaultMessage
+ .replace('{editedOn}', courseUnitIndexMock.edited_on)
+ .replace('{editedBy}', courseUnitIndexMock.edited_by),
+ )).toBeInTheDocument();
+ expect(getByText(
+ sidebarMessages.releaseInfoWithSection.defaultMessage
+ .replace('{sectionName}', courseUnitIndexMock.release_date_from),
+ )).toBeInTheDocument();
+ });
+ });
+
+ it('renders course unit details in the sidebar', async () => {
+ const { getByText } = render();
+ const courseUnitLocationId = extractCourseUnitId(courseUnitIndexMock.id);
+
+ await waitFor(() => {
+ expect(getByText(sidebarMessages.sidebarHeaderUnitLocationTitle.defaultMessage)).toBeInTheDocument();
+ expect(getByText(sidebarMessages.unitLocationTitle.defaultMessage)).toBeInTheDocument();
+ expect(getByText(courseUnitLocationId)).toBeInTheDocument();
+ expect(getByText(sidebarMessages.unitLocationDescription.defaultMessage
+ .replace('{id}', courseUnitLocationId))).toBeInTheDocument();
+ });
+ });
+
it('checks whether xblock is deleted when corresponding delete button is clicked', async () => {
axiosMock
.onDelete(getXBlockBaseApiUrl(courseVerticalChildrenMock.children[0].block_id))
diff --git a/src/course-unit/constants.js b/src/course-unit/constants.js
index 3786de4a1..ecf07815f 100644
--- a/src/course-unit/constants.js
+++ b/src/course-unit/constants.js
@@ -12,6 +12,7 @@ import {
TextFields as TextFieldsIcon,
VideoCamera as VideoCameraIcon,
} from '@openedx/paragon/icons';
+import messages from './sidebar/messages';
export const UNIT_ICON_TYPES = ['video', 'other', 'vertical', 'problem', 'lock'];
@@ -44,3 +45,20 @@ export const COMPONENT_TYPE_ICON_MAP = {
[COMPONENT_ICON_TYPES.video]: VideoCameraIcon,
[COMPONENT_ICON_TYPES.dragAndDrop]: BackHandIcon,
};
+
+export const getUnitReleaseStatus = (intl) => ({
+ release: intl.formatMessage(messages.releaseStatusTitle),
+ released: intl.formatMessage(messages.releasedStatusTitle),
+ scheduled: intl.formatMessage(messages.scheduledStatusTitle),
+});
+
+export const UNIT_VISIBILITY_STATES = {
+ staffOnly: 'staff_only',
+ live: 'live',
+ ready: 'ready',
+};
+
+export const COLORS = {
+ BLACK: '#000',
+ GREEN: '#0D7D4D',
+};
diff --git a/src/course-unit/sidebar/Sidebar.scss b/src/course-unit/sidebar/Sidebar.scss
new file mode 100644
index 000000000..537e52108
--- /dev/null
+++ b/src/course-unit/sidebar/Sidebar.scss
@@ -0,0 +1,71 @@
+%base-font-params {
+ font-size: $font-size-sm;
+ line-height: $line-height-base;
+}
+
+.course-unit-sidebar {
+ .course-unit-sidebar-header {
+ padding: $spacer $spacer map-get($spacers, 3\.5);
+
+ .course-unit-sidebar-header-icon {
+ margin-right: map-get($spacers, 1);
+ }
+
+ .course-unit-sidebar-header-title {
+ font-size: $font-size-base;
+ line-height: $line-height-base;
+ }
+ }
+
+ .course-unit-sidebar-footer {
+ padding: 0 $spacer $spacer;
+
+ .course-unit-sidebar-visibility {
+ .course-unit-sidebar-visibility-title {
+ font-weight: $font-weight-normal;
+ color: $gray-700;
+
+ @extend %base-font-params;
+ }
+
+ .course-unit-sidebar-location-description {
+ font-size: $font-size-xs;
+ line-height: $line-height-base;
+ }
+
+ .course-unit-sidebar-visibility-copy {
+ font-weight: $font-weight-bold;
+ color: $gray-700;
+
+ @extend %base-font-params;
+ }
+
+ .course-unit-sidebar-visibility-checkbox .pgn__form-label {
+ font-size: $font-size-sm;
+ line-height: $headings-line-height;
+ }
+ }
+ }
+
+ .course-unit-sidebar-date {
+ padding: 0 $spacer $spacer;
+
+ @extend %base-font-params;
+
+ .course-unit-sidebar-date-stage {
+ font-weight: $font-weight-normal;
+
+ @extend %base-font-params;
+ }
+
+ .course-unit-sidebar-date-timestamp {
+ color: $gray-700;
+
+ @extend %base-font-params;
+ }
+ }
+
+ &.is-stuff-only .course-unit-sidebar-date-and-with {
+ text-decoration: line-through;
+ }
+}
diff --git a/src/course-unit/sidebar/components/ReleaseInfoComponent.jsx b/src/course-unit/sidebar/components/ReleaseInfoComponent.jsx
new file mode 100644
index 000000000..9861fa209
--- /dev/null
+++ b/src/course-unit/sidebar/components/ReleaseInfoComponent.jsx
@@ -0,0 +1,29 @@
+import { useSelector } from 'react-redux';
+import { useIntl } from '@edx/frontend-platform/i18n';
+
+import { getCourseUnitData } from '../../data/selectors';
+import { getReleaseInfo } from '../utils';
+
+const ReleaseInfoComponent = () => {
+ const intl = useIntl();
+ const {
+ releaseDate,
+ releaseDateFrom,
+ } = useSelector(getCourseUnitData);
+ const releaseInfo = getReleaseInfo(intl, releaseDate, releaseDateFrom);
+
+ if (releaseInfo.isScheduled) {
+ return (
+
+
+ {releaseInfo.releaseDate}
+
+ {releaseInfo.sectionNameMessage}
+
+ );
+ }
+
+ return releaseInfo.message;
+};
+
+export default ReleaseInfoComponent;
diff --git a/src/course-unit/sidebar/components/SidebarBody.jsx b/src/course-unit/sidebar/components/SidebarBody.jsx
new file mode 100644
index 000000000..3b24fd521
--- /dev/null
+++ b/src/course-unit/sidebar/components/SidebarBody.jsx
@@ -0,0 +1,65 @@
+import PropTypes from 'prop-types';
+import { useSelector } from 'react-redux';
+import { Card, Stack } from '@openedx/paragon';
+import { useIntl } from '@edx/frontend-platform/i18n';
+
+import { getCourseUnitData } from '../../data/selectors';
+import { getPublishInfo } from '../utils';
+import messages from '../messages';
+import ReleaseInfoComponent from './ReleaseInfoComponent';
+
+const SidebarBody = ({ releaseLabel, isDisplayUnitLocation, locationId }) => {
+ const intl = useIntl();
+ const {
+ editedOn,
+ editedBy,
+ hasChanges,
+ publishedBy,
+ publishedOn,
+ } = useSelector(getCourseUnitData);
+
+ return (
+
+
+ {isDisplayUnitLocation ? (
+
+
+ {intl.formatMessage(messages.unitLocationTitle)}
+
+
+ {locationId}
+
+
+ ) : (
+ <>
+
+ {getPublishInfo(intl, hasChanges, editedBy, editedOn, publishedBy, publishedOn)}
+
+
+
+ {releaseLabel}
+
+
+
+
+ {intl.formatMessage(messages.sidebarBodyNote)}
+
+ >
+ )}
+
+
+ );
+};
+
+SidebarBody.propTypes = {
+ releaseLabel: PropTypes.string.isRequired,
+ isDisplayUnitLocation: PropTypes.bool,
+ locationId: PropTypes.string,
+};
+
+SidebarBody.defaultProps = {
+ isDisplayUnitLocation: false,
+ locationId: null,
+};
+
+export default SidebarBody;
diff --git a/src/course-unit/sidebar/components/SidebarHeader.jsx b/src/course-unit/sidebar/components/SidebarHeader.jsx
new file mode 100644
index 000000000..188ad15a0
--- /dev/null
+++ b/src/course-unit/sidebar/components/SidebarHeader.jsx
@@ -0,0 +1,41 @@
+import PropTypes from 'prop-types';
+import { useSelector } from 'react-redux';
+import { Icon, Stack } from '@openedx/paragon';
+import { useIntl } from '@edx/frontend-platform/i18n';
+
+import { getCourseUnitData } from '../../data/selectors';
+import { getIconVariant } from '../utils';
+import messages from '../messages';
+
+const SidebarHeader = ({ title, visibilityState, isDisplayUnitLocation }) => {
+ const intl = useIntl();
+ const { hasChanges, published } = useSelector(getCourseUnitData);
+ const { iconSrc, colorVariant } = getIconVariant(visibilityState, published, hasChanges);
+
+ return (
+
+ {!isDisplayUnitLocation && (
+
+ )}
+
+ {isDisplayUnitLocation ? intl.formatMessage(messages.sidebarHeaderUnitLocationTitle) : title}
+
+
+ );
+};
+
+SidebarHeader.propTypes = {
+ title: PropTypes.string.isRequired,
+ visibilityState: PropTypes.string.isRequired,
+ isDisplayUnitLocation: PropTypes.bool,
+};
+
+SidebarHeader.defaultProps = {
+ isDisplayUnitLocation: false,
+};
+
+export default SidebarHeader;
diff --git a/src/course-unit/sidebar/components/index.js b/src/course-unit/sidebar/components/index.js
new file mode 100644
index 000000000..6637529e6
--- /dev/null
+++ b/src/course-unit/sidebar/components/index.js
@@ -0,0 +1,3 @@
+export { default as SidebarHeader } from './SidebarHeader';
+export { default as SidebarBody } from './SidebarBody';
+export { default as SidebarFooter } from './sidebar-footer';
diff --git a/src/course-unit/sidebar/components/sidebar-footer/ActionButtons.jsx b/src/course-unit/sidebar/components/sidebar-footer/ActionButtons.jsx
new file mode 100644
index 000000000..3fb98f5cc
--- /dev/null
+++ b/src/course-unit/sidebar/components/sidebar-footer/ActionButtons.jsx
@@ -0,0 +1,49 @@
+import { useSelector } from 'react-redux';
+import { Button } from '@openedx/paragon';
+import { useIntl } from '@edx/frontend-platform/i18n';
+
+import { getCourseUnitData } from '../../../data/selectors';
+import messages from '../../messages';
+
+const ActionButtons = () => {
+ const intl = useIntl();
+ const {
+ published,
+ hasChanges,
+ enableCopyPasteUnits,
+ } = useSelector(getCourseUnitData);
+
+ return (
+ <>
+ {(!published || hasChanges) && (
+
+ )}
+ {(published && hasChanges) && (
+
+ )}
+ {enableCopyPasteUnits && (
+
+ )}
+ >
+ );
+};
+
+export default ActionButtons;
diff --git a/src/course-unit/sidebar/components/sidebar-footer/UnitVisibilityInfo.jsx b/src/course-unit/sidebar/components/sidebar-footer/UnitVisibilityInfo.jsx
new file mode 100644
index 000000000..260333001
--- /dev/null
+++ b/src/course-unit/sidebar/components/sidebar-footer/UnitVisibilityInfo.jsx
@@ -0,0 +1,55 @@
+import { useSelector } from 'react-redux';
+import { Form } from '@openedx/paragon';
+import { useIntl } from '@edx/frontend-platform/i18n';
+
+import { getCourseUnitData } from '../../../data/selectors';
+import { getVisibilityTitle } from '../../utils';
+import messages from '../../messages';
+
+const UnitVisibilityInfo = () => {
+ const intl = useIntl();
+ const {
+ published,
+ hasChanges,
+ staffLockFrom,
+ releaseDateFrom,
+ releasedToStudents,
+ visibleToStaffOnly,
+ hasExplicitStaffLock,
+ } = useSelector(getCourseUnitData);
+
+ return (
+ <>
+
+ {getVisibilityTitle(intl, releasedToStudents, published, hasChanges)}
+
+ {visibleToStaffOnly ? (
+ <>
+
+ {intl.formatMessage(messages.visibilityStaffOnlyTitle)}
+
+ {!hasExplicitStaffLock && (
+
+ {intl.formatMessage(messages.visibilityHasExplicitStaffLockText, {
+ date: releaseDateFrom, sectionName: staffLockFrom,
+ })}
+
+ )}
+ >
+ ) : (
+
+ {intl.formatMessage(messages.visibilityStaffAndLearnersTitle)}
+
+ )}
+ {}}
+ >
+ {intl.formatMessage(messages.visibilityCheckboxTitle)}
+
+ >
+ );
+};
+
+export default UnitVisibilityInfo;
diff --git a/src/course-unit/sidebar/components/sidebar-footer/index.jsx b/src/course-unit/sidebar/components/sidebar-footer/index.jsx
new file mode 100644
index 000000000..35ed27dc8
--- /dev/null
+++ b/src/course-unit/sidebar/components/sidebar-footer/index.jsx
@@ -0,0 +1,40 @@
+import PropTypes from 'prop-types';
+import { Card, Stack } from '@openedx/paragon';
+import { useIntl } from '@edx/frontend-platform/i18n';
+
+import messages from '../../messages';
+import UnitVisibilityInfo from './UnitVisibilityInfo';
+import ActionButtons from './ActionButtons';
+
+const SidebarFooter = ({ isDisplayUnitLocation, locationId }) => {
+ const intl = useIntl();
+
+ return (
+
+
+ {isDisplayUnitLocation ? (
+
+ {intl.formatMessage(messages.unitLocationDescription, { id: locationId })}
+
+ ) : (
+ <>
+
+
+ >
+ )}
+
+
+ );
+};
+
+SidebarFooter.propTypes = {
+ isDisplayUnitLocation: PropTypes.bool,
+ locationId: PropTypes.string,
+};
+
+SidebarFooter.defaultProps = {
+ isDisplayUnitLocation: false,
+ locationId: null,
+};
+
+export default SidebarFooter;
diff --git a/src/course-unit/sidebar/hooks.jsx b/src/course-unit/sidebar/hooks.jsx
new file mode 100644
index 000000000..bbe6c073f
--- /dev/null
+++ b/src/course-unit/sidebar/hooks.jsx
@@ -0,0 +1,43 @@
+import { useIntl } from '@edx/frontend-platform/i18n';
+
+import { getUnitReleaseStatus, UNIT_VISIBILITY_STATES } from '../constants';
+import messages from './messages';
+import { extractCourseUnitId } from './utils';
+
+const useCourseUnitData = ({
+ hasChanges, published, visibilityState, id,
+}) => {
+ const intl = useIntl();
+ const releaseStatus = getUnitReleaseStatus(intl);
+ const locationId = extractCourseUnitId(id);
+ const visibleToStaffOnly = visibilityState === UNIT_VISIBILITY_STATES.staffOnly;
+ const titleMessages = {
+ [UNIT_VISIBILITY_STATES.staffOnly]: messages.sidebarTitleVisibleToStaffOnly,
+ [UNIT_VISIBILITY_STATES.live]: messages.sidebarTitlePublishedAndLive,
+ // eslint-disable-next-line no-nested-ternary
+ default: published
+ ? (hasChanges ? messages.sidebarTitleDraftUnpublishedChanges
+ : messages.sidebarTitlePublishedNotYetReleased)
+ : messages.sidebarTitleDraftNeverPublished,
+ };
+
+ const releaseLabels = {
+ [UNIT_VISIBILITY_STATES.staffOnly]: releaseStatus.release,
+ [UNIT_VISIBILITY_STATES.live]: releaseStatus.released,
+ [UNIT_VISIBILITY_STATES.ready]: releaseStatus.scheduled,
+ default: releaseStatus.release,
+ };
+
+ const title = intl.formatMessage(titleMessages[visibilityState] || titleMessages.default);
+ const releaseLabel = releaseLabels[visibilityState] || releaseLabels.default;
+
+ return {
+ title,
+ locationId,
+ releaseLabel,
+ visibilityState,
+ visibleToStaffOnly,
+ };
+};
+
+export default useCourseUnitData;
diff --git a/src/course-unit/sidebar/index.jsx b/src/course-unit/sidebar/index.jsx
new file mode 100644
index 000000000..eae1e1b2f
--- /dev/null
+++ b/src/course-unit/sidebar/index.jsx
@@ -0,0 +1,52 @@
+import PropTypes from 'prop-types';
+import { useSelector } from 'react-redux';
+import classNames from 'classnames';
+import { Card } from '@openedx/paragon';
+
+import { getCourseUnitData } from '../data/selectors';
+import { SidebarBody, SidebarFooter, SidebarHeader } from './components';
+import useCourseUnitData from './hooks';
+
+const Sidebar = ({ isDisplayUnitLocation }) => {
+ const {
+ title,
+ locationId,
+ releaseLabel,
+ visibilityState,
+ visibleToStaffOnly,
+ } = useCourseUnitData(useSelector(getCourseUnitData));
+
+ return (
+
+
+
+
+
+ );
+};
+
+Sidebar.propTypes = {
+ isDisplayUnitLocation: PropTypes.bool,
+};
+
+Sidebar.defaultProps = {
+ isDisplayUnitLocation: false,
+};
+
+export default Sidebar;
diff --git a/src/course-unit/sidebar/messages.js b/src/course-unit/sidebar/messages.js
new file mode 100644
index 000000000..bb9a75c31
--- /dev/null
+++ b/src/course-unit/sidebar/messages.js
@@ -0,0 +1,110 @@
+import { defineMessages } from '@edx/frontend-platform/i18n';
+
+const messages = defineMessages({
+ sidebarTitleDraftNeverPublished: {
+ id: 'course-authoring.course-unit.sidebar.title.draft.never-published',
+ defaultMessage: 'Draft (never published)',
+ },
+ sidebarTitleVisibleToStaffOnly: {
+ id: 'course-authoring.course-unit.sidebar.title.visible.to-staff-only',
+ defaultMessage: 'Visible to staff only',
+ },
+ sidebarTitlePublishedAndLive: {
+ id: 'course-authoring.course-unit.sidebar.title.published.live',
+ defaultMessage: 'Published and live',
+ },
+ sidebarTitleDraftUnpublishedChanges: {
+ id: 'course-authoring.course-unit.sidebar.title.draft.unpublished',
+ defaultMessage: 'Draft (unpublished changes)',
+ },
+ sidebarTitlePublishedNotYetReleased: {
+ id: 'course-authoring.course-unit.sidebar.title.published.not-yet-released',
+ defaultMessage: 'Published (not yet released)',
+ },
+ sidebarHeaderUnitLocationTitle: {
+ id: 'course-authoring.course-unit.sidebar.header.unit-location.title',
+ defaultMessage: 'Unit location',
+ },
+ sidebarBodyNote: {
+ id: 'course-authoring.course-unit.sidebar.body.note',
+ defaultMessage: 'Note: Do not hide graded assignments after they have been released.',
+ },
+ publishInfoPreviouslyPublished: {
+ id: 'course-authoring.course-unit.publish.info.previously-published',
+ defaultMessage: 'Previously published',
+ },
+ publishInfoDraftSaved: {
+ id: 'course-authoring.course-unit.publish.info.draft.saved',
+ defaultMessage: 'Draft saved on {editedOn} by {editedBy}',
+ },
+ publishLastPublished: {
+ id: 'course-authoring.course-unit.publish.info.last.published',
+ defaultMessage: 'Last published {publishedOn} by {publishedBy}',
+ },
+ releaseInfoUnscheduled: {
+ id: 'course-authoring.course-unit.release.info.unscheduled',
+ defaultMessage: 'Unscheduled',
+ },
+ releaseInfoWithSection: {
+ id: 'course-authoring.course-unit.release.info.with-unit',
+ defaultMessage: 'with {sectionName}',
+ },
+ visibilityIsVisibleToTitle: {
+ id: 'course-authoring.course-unit.visibility.is-visible-to.title',
+ defaultMessage: 'IS VISIBLE TO',
+ },
+ visibilityWillBeVisibleToTitle: {
+ id: 'course-authoring.course-unit.visibility.will-be-visible-to.title',
+ defaultMessage: 'WILL BE VISIBLE TO',
+ },
+ unitLocationTitle: {
+ id: 'course-authoring.course-unit.unit-location.title',
+ defaultMessage: 'LOCATION ID',
+ },
+ unitLocationDescription: {
+ id: 'course-authoring.course-unit.unit-location.description',
+ defaultMessage: 'To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value',
+ },
+ visibilityCheckboxTitle: {
+ id: 'course-authoring.course-unit.visibility.checkbox.title',
+ defaultMessage: 'Hide from learners',
+ },
+ visibilityStaffOnlyTitle: {
+ id: 'course-authoring.course-unit.visibility.staff-only.title',
+ defaultMessage: 'Staff only',
+ },
+ visibilityStaffAndLearnersTitle: {
+ id: 'course-authoring.course-unit.visibility.staff-and-learners.title',
+ defaultMessage: 'Staff and learners',
+ },
+ visibilityHasExplicitStaffLockText: {
+ id: 'course-authoring.course-unit.visibility.has-explicit-staff-lock.text',
+ defaultMessage: 'with {date} {sectionName}',
+ },
+ actionButtonPublishTitle: {
+ id: 'course-authoring.course-unit.action-buttons.publish.title',
+ defaultMessage: 'Publish',
+ },
+ actionButtonDiscardChangesTitle: {
+ id: 'course-authoring.course-unit.action-button.discard-changes.title',
+ defaultMessage: 'Discard changes',
+ },
+ actionButtonCopyUnitTitle: {
+ id: 'course-authoring.course-unit.action-button.copy-unit.title',
+ defaultMessage: 'Copy unit',
+ },
+ releaseStatusTitle: {
+ id: 'course-authoring.course-unit.status.release.title',
+ defaultMessage: 'RELEASE',
+ },
+ releasedStatusTitle: {
+ id: 'course-authoring.course-unit.status.released.title',
+ defaultMessage: 'RELEASED',
+ },
+ scheduledStatusTitle: {
+ id: 'course-authoring.course-unit.status.scheduled.title',
+ defaultMessage: 'SCHEDULED',
+ },
+});
+
+export default messages;
diff --git a/src/course-unit/sidebar/utils.js b/src/course-unit/sidebar/utils.js
new file mode 100644
index 000000000..9a36a3559
--- /dev/null
+++ b/src/course-unit/sidebar/utils.js
@@ -0,0 +1,102 @@
+import {
+ CheckCircle as CheckCircleIcon,
+ CheckCircleOutline as CheckCircleOutlineIcon,
+ InfoOutline as InfoOutlineIcon,
+} from '@openedx/paragon/icons';
+
+import { COLORS, UNIT_VISIBILITY_STATES } from '../constants';
+import messages from './messages';
+
+/**
+ * Get information about the publishing status.
+ * @param {Object} intl - The internationalization object.
+ * @param {boolean} hasChanges - Indicates if there are unpublished changes.
+ * @param {string} editedBy - The user who edited the content.
+ * @param {string} editedOn - The timestamp when the content was edited.
+ * @param {string} publishedBy - The user who last published the content.
+ * @param {string} publishedOn - The timestamp when the content was last published.
+ * @returns {string} Publish information based on the provided parameters.
+ */
+export const getPublishInfo = (intl, hasChanges, editedBy, editedOn, publishedBy, publishedOn) => {
+ let publishInfoText;
+ if (hasChanges && editedOn && editedBy) {
+ publishInfoText = intl.formatMessage(messages.publishInfoDraftSaved, { editedOn, editedBy });
+ } else if (publishedOn && publishedBy) {
+ publishInfoText = intl.formatMessage(messages.publishLastPublished, { publishedOn, publishedBy });
+ } else {
+ publishInfoText = intl.formatMessage(messages.publishInfoPreviouslyPublished);
+ }
+
+ return publishInfoText;
+};
+
+/**
+ * Get information about the release status.
+ * @param {Object} intl - The internationalization object.
+ * @param {string} releaseDate - The release date of the content.
+ * @param {string} releaseDateFrom - The section name associated with the release date.
+ * @returns {string|ReactElement} Release information based on the provided parameters.
+ */
+export const getReleaseInfo = (intl, releaseDate, releaseDateFrom) => {
+ if (releaseDate) {
+ return {
+ isScheduled: true,
+ releaseDate,
+ releaseDateFrom,
+ sectionNameMessage: intl.formatMessage(messages.releaseInfoWithSection, { sectionName: releaseDateFrom }),
+ };
+ }
+ return {
+ isScheduled: false,
+ message: intl.formatMessage(messages.releaseInfoUnscheduled),
+ };
+};
+
+/**
+ * Get the visibility title.
+ * @param {Object} intl - The internationalization object.
+ * @param {boolean} releasedToStudents - Indicates if the content is released to students.
+ * @param {boolean} published - Indicates if the content is published.
+ * @param {boolean} hasChanges - Indicates if there are unpublished changes.
+ * @returns {string} The visibility title determined by the provided parameters.
+ */
+export const getVisibilityTitle = (intl, releasedToStudents, published, hasChanges) => {
+ if (releasedToStudents && published && !hasChanges) {
+ return intl.formatMessage(messages.visibilityIsVisibleToTitle);
+ }
+
+ return intl.formatMessage(messages.visibilityWillBeVisibleToTitle);
+};
+
+/**
+ * Get the icon variant based on the provided visibility state and publication status.
+ * @param {string} visibilityState - The visibility state of the content.
+ * @param {boolean} published - Indicates if the content is published.
+ * @param {boolean} hasChanges - Indicates if there are unpublished changes.
+ * @returns {Object} An object containing the icon component and color variant.
+ * - iconSrc: The source component for the icon.
+ * - colorVariant: The color variant for the icon.
+ */
+export const getIconVariant = (visibilityState, published, hasChanges) => {
+ const iconVariants = {
+ [UNIT_VISIBILITY_STATES.staffOnly]: { iconSrc: InfoOutlineIcon, colorVariant: COLORS.BLACK },
+ [UNIT_VISIBILITY_STATES.live]: { iconSrc: CheckCircleIcon, colorVariant: COLORS.GREEN },
+ publishedNoChanges: { iconSrc: CheckCircleOutlineIcon, colorVariant: COLORS.BLACK },
+ publishedWithChanges: { iconSrc: InfoOutlineIcon, colorVariant: COLORS.BLACK },
+ default: { iconSrc: InfoOutlineIcon, colorVariant: COLORS.BLACK },
+ };
+ if (visibilityState in iconVariants) {
+ return iconVariants[visibilityState];
+ }
+ if (published) {
+ return hasChanges ? iconVariants.publishedWithChanges : iconVariants.publishedNoChanges;
+ }
+ return iconVariants.default;
+};
+
+/**
+ * Extracts the clear course unit ID from the given course unit data.
+ * @param {string} id - The course unit ID.
+ * @returns {string} The clear course unit ID extracted from the provided data.
+ */
+export const extractCourseUnitId = (id) => id.match(/block@(.+)$/)[1];
diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json
index 57a247dbf..a26a97c57 100644
--- a/src/i18n/messages/ar.json
+++ b/src/i18n/messages/ar.json
@@ -1010,7 +1010,6 @@
"course-authoring.certificates.sidebar.about2.description-2": "{strongText} delete certificates after a course has started; learners who have already earned certificates will no longer be able to access them.",
"course-authoring.certificates.sidebar.about2.description-2.strong": "Do not",
"course-authoring.certificates.sidebar.learnmore.button": "Learn more about certificates",
- "course-authoring.course-unit.add.component.button.text": "Add Component:",
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json
index e06d421e3..6a18e9e18 100644
--- a/src/i18n/messages/de.json
+++ b/src/i18n/messages/de.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/es_419.json b/src/i18n/messages/es_419.json
index 979df0d74..d6efdea78 100644
--- a/src/i18n/messages/es_419.json
+++ b/src/i18n/messages/es_419.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/fa_IR.json b/src/i18n/messages/fa_IR.json
index 1252d8c29..e2fc0af12 100644
--- a/src/i18n/messages/fa_IR.json
+++ b/src/i18n/messages/fa_IR.json
@@ -37,32 +37,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json
index 003397d4d..4c874a065 100644
--- a/src/i18n/messages/fr.json
+++ b/src/i18n/messages/fr.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/fr_CA.json b/src/i18n/messages/fr_CA.json
index 0b0f31624..f2c2d095d 100644
--- a/src/i18n/messages/fr_CA.json
+++ b/src/i18n/messages/fr_CA.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json
index e06d421e3..6a18e9e18 100644
--- a/src/i18n/messages/hi.json
+++ b/src/i18n/messages/hi.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json
index e06d421e3..6a18e9e18 100644
--- a/src/i18n/messages/it.json
+++ b/src/i18n/messages/it.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/it_IT.json b/src/i18n/messages/it_IT.json
index de45f7f48..3c53c5263 100644
--- a/src/i18n/messages/it_IT.json
+++ b/src/i18n/messages/it_IT.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json
index e06d421e3..6a18e9e18 100644
--- a/src/i18n/messages/pt.json
+++ b/src/i18n/messages/pt.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/pt_PT.json b/src/i18n/messages/pt_PT.json
index c804de275..88c7ddd23 100644
--- a/src/i18n/messages/pt_PT.json
+++ b/src/i18n/messages/pt_PT.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json
index e06d421e3..6a18e9e18 100644
--- a/src/i18n/messages/ru.json
+++ b/src/i18n/messages/ru.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/uk.json b/src/i18n/messages/uk.json
index e06d421e3..6a18e9e18 100644
--- a/src/i18n/messages/uk.json
+++ b/src/i18n/messages/uk.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",
diff --git a/src/i18n/messages/zh_CN.json b/src/i18n/messages/zh_CN.json
index e06d421e3..6a18e9e18 100644
--- a/src/i18n/messages/zh_CN.json
+++ b/src/i18n/messages/zh_CN.json
@@ -1014,32 +1014,6 @@
"course-authoring.course-unit.modal.button.text": "Select",
"course-authoring.course-unit.modal.container.title": "Add {componentTitle} component",
"course-authoring.course-unit.modal.container.cancel.button.text": "Cancel",
- "course-authoring.course-unit.sidebar.title.draft.never-published": "Draft (never published)",
- "course-authoring.course-unit.sidebar.title.visible.to-staff-only": "Visible to staff only",
- "course-authoring.course-unit.sidebar.title.published.live": "Published and live",
- "course-authoring.course-unit.sidebar.title.draft.unpublished": "Draft (unpublished changes)",
- "course-authoring.course-unit.sidebar.title.published.not-yet-released": "Published (not yet released)",
- "course-authoring.course-unit.sidebar.header.unit-location.title": "Unit location",
- "course-authoring.course-unit.sidebar.body.note": "Note: Do not hide graded assignments after they have been released.",
- "course-authoring.course-unit.publish.info.previously-published": "Previously published",
- "course-authoring.course-unit.publish.info.draft.saved": "Draft saved on {editedOn} by {editedBy}",
- "course-authoring.course-unit.publish.info.last.published": "Last published {publishedOn} by {publishedBy}",
- "course-authoring.course-unit.release.info.unscheduled": "Unscheduled",
- "course-authoring.course-unit.release.info.with-unit": "with {sectionName}",
- "course-authoring.course-unit.visibility.is-visible-to.title": "IS VISIBLE TO",
- "course-authoring.course-unit.visibility.will-be-visible-to.title": "WILL BE VISIBLE TO",
- "course-authoring.course-unit.unit-location.title": "LOCATION ID",
- "course-authoring.course-unit.unit-location.description": "To create a link to this unit from an HTML component in this course, enter /jump_to_id/{id} as the URL value",
- "course-authoring.course-unit.visibility.checkbox.title": "Hide from learners",
- "course-authoring.course-unit.visibility.staff-only.title": "Staff only",
- "course-authoring.course-unit.visibility.staff-and-learners.title": "Staff and learners",
- "course-authoring.course-unit.visibility.has-explicit-staff-lock.text": "with {date} {sectionName}",
- "course-authoring.course-unit.action-buttons.publish.title": "Publish",
- "course-authoring.course-unit.action-button.discard-changes.title": "Discard changes",
- "course-authoring.course-unit.action-button.copy-unit.title": "Copy unit",
- "course-authoring.course-unit.status.release.title": "RELEASE",
- "course-authoring.course-unit.status.released.title": "RELEASED",
- "course-authoring.course-unit.status.scheduled.title": "SCHEDULED",
"course-authoring.course-unit.xblock.button.edit.alt": "Edit Item",
"course-authoring.course-unit.xblock.button.copy.label": "Copy",
"course-authoring.course-unit.xblock.button.duplicate.label": "Duplicate",