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
This commit is contained in:
committed by
Adolfo R. Brandes
parent
f8095e6670
commit
073e191273
@@ -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}
|
||||
/>
|
||||
<Layout
|
||||
lg={[{ span: 9 }, { span: 3 }]}
|
||||
md={[{ span: 9 }, { span: 3 }]}
|
||||
sm={[{ span: 9 }, { span: 3 }]}
|
||||
lg={[{ span: 8 }, { span: 4 }]}
|
||||
md={[{ span: 8 }, { span: 4 }]}
|
||||
sm={[{ span: 8 }, { span: 3 }]}
|
||||
xs={[{ span: 9 }, { span: 3 }]}
|
||||
xl={[{ span: 9 }, { span: 3 }]}
|
||||
>
|
||||
@@ -110,7 +111,12 @@ const CourseUnit = ({ courseId }) => {
|
||||
handleCreateNewCourseXBlock={handleCreateNewCourseXBlock}
|
||||
/>
|
||||
</Layout.Element>
|
||||
<Layout.Element />
|
||||
<Layout.Element>
|
||||
<Stack gap={3}>
|
||||
<Sidebar />
|
||||
<Sidebar isDisplayUnitLocation />
|
||||
</Stack>
|
||||
</Layout.Element>
|
||||
</Layout>
|
||||
</section>
|
||||
</Container>
|
||||
|
||||
@@ -2,3 +2,4 @@
|
||||
@import "./course-sequence/CourseSequence";
|
||||
@import "./add-component/AddComponent";
|
||||
@import "./course-xblock/CourseXblock";
|
||||
@import "./sidebar/Sidebar";
|
||||
|
||||
@@ -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('<CourseUnit />', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('renders course unit details for a draft with unpublished changes', async () => {
|
||||
const { getByText } = render(<RootWrapper />);
|
||||
|
||||
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(<RootWrapper />);
|
||||
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))
|
||||
|
||||
@@ -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',
|
||||
};
|
||||
|
||||
71
src/course-unit/sidebar/Sidebar.scss
Normal file
71
src/course-unit/sidebar/Sidebar.scss
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
29
src/course-unit/sidebar/components/ReleaseInfoComponent.jsx
Normal file
29
src/course-unit/sidebar/components/ReleaseInfoComponent.jsx
Normal file
@@ -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 (
|
||||
<span className="course-unit-sidebar-date-and-with">
|
||||
<h6 className="course-unit-sidebar-date-timestamp m-0 d-inline">
|
||||
{releaseInfo.releaseDate}
|
||||
</h6>
|
||||
{releaseInfo.sectionNameMessage}
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
return releaseInfo.message;
|
||||
};
|
||||
|
||||
export default ReleaseInfoComponent;
|
||||
65
src/course-unit/sidebar/components/SidebarBody.jsx
Normal file
65
src/course-unit/sidebar/components/SidebarBody.jsx
Normal file
@@ -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 (
|
||||
<Card.Body className="course-unit-sidebar-date">
|
||||
<Stack>
|
||||
{isDisplayUnitLocation ? (
|
||||
<span>
|
||||
<h5 className="course-unit-sidebar-date-stage m-0">
|
||||
{intl.formatMessage(messages.unitLocationTitle)}
|
||||
</h5>
|
||||
<p className="m-0 font-weight-bold">
|
||||
{locationId}
|
||||
</p>
|
||||
</span>
|
||||
) : (
|
||||
<>
|
||||
<span>
|
||||
{getPublishInfo(intl, hasChanges, editedBy, editedOn, publishedBy, publishedOn)}
|
||||
</span>
|
||||
<span className="mt-3.5">
|
||||
<h5 className="course-unit-sidebar-date-stage m-0">
|
||||
{releaseLabel}
|
||||
</h5>
|
||||
<ReleaseInfoComponent />
|
||||
</span>
|
||||
<p className="mt-3.5 mb-0">
|
||||
{intl.formatMessage(messages.sidebarBodyNote)}
|
||||
</p>
|
||||
</>
|
||||
)}
|
||||
</Stack>
|
||||
</Card.Body>
|
||||
);
|
||||
};
|
||||
|
||||
SidebarBody.propTypes = {
|
||||
releaseLabel: PropTypes.string.isRequired,
|
||||
isDisplayUnitLocation: PropTypes.bool,
|
||||
locationId: PropTypes.string,
|
||||
};
|
||||
|
||||
SidebarBody.defaultProps = {
|
||||
isDisplayUnitLocation: false,
|
||||
locationId: null,
|
||||
};
|
||||
|
||||
export default SidebarBody;
|
||||
41
src/course-unit/sidebar/components/SidebarHeader.jsx
Normal file
41
src/course-unit/sidebar/components/SidebarHeader.jsx
Normal file
@@ -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 (
|
||||
<Stack className="course-unit-sidebar-header" direction="horizontal">
|
||||
{!isDisplayUnitLocation && (
|
||||
<Icon
|
||||
className="course-unit-sidebar-header-icon"
|
||||
svgAttrs={{ color: colorVariant }}
|
||||
src={iconSrc}
|
||||
/>
|
||||
)}
|
||||
<h3 className="course-unit-sidebar-header-title m-0">
|
||||
{isDisplayUnitLocation ? intl.formatMessage(messages.sidebarHeaderUnitLocationTitle) : title}
|
||||
</h3>
|
||||
</Stack>
|
||||
);
|
||||
};
|
||||
|
||||
SidebarHeader.propTypes = {
|
||||
title: PropTypes.string.isRequired,
|
||||
visibilityState: PropTypes.string.isRequired,
|
||||
isDisplayUnitLocation: PropTypes.bool,
|
||||
};
|
||||
|
||||
SidebarHeader.defaultProps = {
|
||||
isDisplayUnitLocation: false,
|
||||
};
|
||||
|
||||
export default SidebarHeader;
|
||||
3
src/course-unit/sidebar/components/index.js
Normal file
3
src/course-unit/sidebar/components/index.js
Normal file
@@ -0,0 +1,3 @@
|
||||
export { default as SidebarHeader } from './SidebarHeader';
|
||||
export { default as SidebarBody } from './SidebarBody';
|
||||
export { default as SidebarFooter } from './sidebar-footer';
|
||||
@@ -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) && (
|
||||
<Button
|
||||
className="mt-3.5"
|
||||
variant="outline-primary"
|
||||
size="sm"
|
||||
>
|
||||
{intl.formatMessage(messages.actionButtonPublishTitle)}
|
||||
</Button>
|
||||
)}
|
||||
{(published && hasChanges) && (
|
||||
<Button
|
||||
className="mt-2"
|
||||
variant="link"
|
||||
size="sm"
|
||||
>
|
||||
{intl.formatMessage(messages.actionButtonDiscardChangesTitle)}
|
||||
</Button>
|
||||
)}
|
||||
{enableCopyPasteUnits && (
|
||||
<Button
|
||||
className="mt-2"
|
||||
variant="outline-primary"
|
||||
size="sm"
|
||||
>
|
||||
{intl.formatMessage(messages.actionButtonCopyUnitTitle)}
|
||||
</Button>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default ActionButtons;
|
||||
@@ -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 (
|
||||
<>
|
||||
<small className="course-unit-sidebar-visibility-title">
|
||||
{getVisibilityTitle(intl, releasedToStudents, published, hasChanges)}
|
||||
</small>
|
||||
{visibleToStaffOnly ? (
|
||||
<>
|
||||
<h6 className="course-unit-sidebar-visibility-copy">
|
||||
{intl.formatMessage(messages.visibilityStaffOnlyTitle)}
|
||||
</h6>
|
||||
{!hasExplicitStaffLock && (
|
||||
<span>
|
||||
{intl.formatMessage(messages.visibilityHasExplicitStaffLockText, {
|
||||
date: releaseDateFrom, sectionName: staffLockFrom,
|
||||
})}
|
||||
</span>
|
||||
)}
|
||||
</>
|
||||
) : (
|
||||
<h6 className="course-unit-sidebar-visibility-copy">
|
||||
{intl.formatMessage(messages.visibilityStaffAndLearnersTitle)}
|
||||
</h6>
|
||||
)}
|
||||
<Form.Checkbox
|
||||
className="course-unit-sidebar-visibility-checkbox"
|
||||
checked={hasExplicitStaffLock}
|
||||
onChange={() => {}}
|
||||
>
|
||||
{intl.formatMessage(messages.visibilityCheckboxTitle)}
|
||||
</Form.Checkbox>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
export default UnitVisibilityInfo;
|
||||
40
src/course-unit/sidebar/components/sidebar-footer/index.jsx
Normal file
40
src/course-unit/sidebar/components/sidebar-footer/index.jsx
Normal file
@@ -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 (
|
||||
<Card.Footer className="course-unit-sidebar-footer" orientation="horizontal">
|
||||
<Stack className="course-unit-sidebar-visibility">
|
||||
{isDisplayUnitLocation ? (
|
||||
<small className="course-unit-sidebar-location-description">
|
||||
{intl.formatMessage(messages.unitLocationDescription, { id: locationId })}
|
||||
</small>
|
||||
) : (
|
||||
<>
|
||||
<UnitVisibilityInfo />
|
||||
<ActionButtons />
|
||||
</>
|
||||
)}
|
||||
</Stack>
|
||||
</Card.Footer>
|
||||
);
|
||||
};
|
||||
|
||||
SidebarFooter.propTypes = {
|
||||
isDisplayUnitLocation: PropTypes.bool,
|
||||
locationId: PropTypes.string,
|
||||
};
|
||||
|
||||
SidebarFooter.defaultProps = {
|
||||
isDisplayUnitLocation: false,
|
||||
locationId: null,
|
||||
};
|
||||
|
||||
export default SidebarFooter;
|
||||
43
src/course-unit/sidebar/hooks.jsx
Normal file
43
src/course-unit/sidebar/hooks.jsx
Normal file
@@ -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;
|
||||
52
src/course-unit/sidebar/index.jsx
Normal file
52
src/course-unit/sidebar/index.jsx
Normal file
@@ -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 (
|
||||
<Card
|
||||
className={classNames('course-unit-sidebar', {
|
||||
'is-stuff-only': visibleToStaffOnly,
|
||||
})}
|
||||
data-testid="course-unit-sidebar"
|
||||
>
|
||||
<SidebarHeader
|
||||
title={title}
|
||||
visibilityState={visibilityState}
|
||||
isDisplayUnitLocation={isDisplayUnitLocation}
|
||||
/>
|
||||
<SidebarBody
|
||||
locationId={locationId}
|
||||
releaseLabel={releaseLabel}
|
||||
isDisplayUnitLocation={isDisplayUnitLocation}
|
||||
/>
|
||||
<SidebarFooter
|
||||
locationId={locationId}
|
||||
isDisplayUnitLocation={isDisplayUnitLocation}
|
||||
/>
|
||||
</Card>
|
||||
);
|
||||
};
|
||||
|
||||
Sidebar.propTypes = {
|
||||
isDisplayUnitLocation: PropTypes.bool,
|
||||
};
|
||||
|
||||
Sidebar.defaultProps = {
|
||||
isDisplayUnitLocation: false,
|
||||
};
|
||||
|
||||
export default Sidebar;
|
||||
110
src/course-unit/sidebar/messages.js
Normal file
110
src/course-unit/sidebar/messages.js
Normal file
@@ -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;
|
||||
102
src/course-unit/sidebar/utils.js
Normal file
102
src/course-unit/sidebar/utils.js
Normal file
@@ -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];
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user