feat: [AXIMST-24] Course unit - Sidebar buttons functional (#134)

* feat: [AXIMST-24] sidebar buttons functional

* refactor: removed modal extra className

* refactor: refactoring after review
This commit is contained in:
Peter Kulko
2024-01-29 14:42:04 +02:00
committed by Adolfo R. Brandes
parent 073e191273
commit e4d88fb1fa
30 changed files with 896 additions and 54 deletions

View File

@@ -26,6 +26,10 @@ export const NOTIFICATION_MESSAGES = {
deleting: 'Deleting',
copying: 'Copying',
pasting: 'Pasting',
discardChanges: 'Discarding changes',
publishing: 'Publishing',
hidingFromStudents: 'Hiding from students',
makingVisibleToStudents: 'Making visible to students',
empty: '',
};

View File

@@ -113,8 +113,8 @@ const CourseUnit = ({ courseId }) => {
</Layout.Element>
<Layout.Element>
<Stack gap={3}>
<Sidebar />
<Sidebar isDisplayUnitLocation />
<Sidebar blockId={blockId} data-testid="course-unit-sidebar" />
<Sidebar isDisplayUnitLocation data-testid="course-unit-location-sidebar" />
</Stack>
</Layout.Element>
</Layout>

View File

@@ -1,6 +1,6 @@
import MockAdapter from 'axios-mock-adapter';
import {
act, render, waitFor, fireEvent,
act, render, waitFor, fireEvent, within,
} from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { IntlProvider } from '@edx/frontend-platform/i18n';
@@ -17,6 +17,7 @@ import {
postXBlockBaseApiUrl,
} from './data/api';
import {
editCourseUnitVisibilityAndData,
fetchCourseSectionVerticalData,
fetchCourseUnitQuery,
fetchCourseVerticalChildrenData,
@@ -40,6 +41,7 @@ import { extractCourseUnitId } from './sidebar/utils';
import deleteModalMessages from '../generic/delete-modal/messages';
import courseXBlockMessages from './course-xblock/messages';
import addComponentMessages from './add-component/messages';
import { PUBLISH_TYPES, UNIT_VISIBILITY_STATES } from './constants';
let axiosMock;
let store;
@@ -47,6 +49,7 @@ const courseId = '123';
const blockId = '567890';
const unitDisplayName = courseUnitIndexMock.metadata.display_name;
const mockedUsedNavigate = jest.fn();
const userName = 'edx';
jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
@@ -418,4 +421,170 @@ describe('<CourseUnit />', () => {
expect(getByText('New Cloned XBlock')).toBeInTheDocument();
});
});
it('should toggle visibility and update course unit state accordingly', async () => {
const { getByRole, getByTestId } = render(<RootWrapper />);
let courseUnitSidebar;
let draftUnpublishedChangesHeading;
let visibilityCheckbox;
await waitFor(() => {
courseUnitSidebar = getByTestId('course-unit-sidebar');
draftUnpublishedChangesHeading = within(courseUnitSidebar)
.getByText(sidebarMessages.sidebarTitleDraftUnpublishedChanges.defaultMessage);
expect(draftUnpublishedChangesHeading).toBeInTheDocument();
visibilityCheckbox = within(courseUnitSidebar)
.getByLabelText(sidebarMessages.visibilityCheckboxTitle.defaultMessage);
expect(visibilityCheckbox).not.toBeChecked();
userEvent.click(visibilityCheckbox);
});
axiosMock
.onPost(getXBlockBaseApiUrl(blockId), {
publish: PUBLISH_TYPES.republish,
metadata: { visible_to_staff_only: true },
})
.reply(200, { dummy: 'value' });
axiosMock
.onGet(getCourseUnitApiUrl(blockId))
.reply(200, {
...courseUnitIndexMock,
visibility_state: UNIT_VISIBILITY_STATES.staffOnly,
has_explicit_staff_lock: true,
});
await executeThunk(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.republish, true), store.dispatch);
expect(visibilityCheckbox).toBeChecked();
expect(within(courseUnitSidebar)
.getByText(sidebarMessages.sidebarTitleVisibleToStaffOnly.defaultMessage)).toBeInTheDocument();
expect(within(courseUnitSidebar)
.getByText(sidebarMessages.visibilityStaffOnlyTitle.defaultMessage)).toBeInTheDocument();
userEvent.click(visibilityCheckbox);
const modalNotification = getByRole('dialog');
const makeVisibilityBtn = within(modalNotification).getByRole('button', { name: sidebarMessages.modalMakeVisibilityActionButtonText.defaultMessage });
const cancelBtn = within(modalNotification).getByRole('button', { name: sidebarMessages.modalMakeVisibilityCancelButtonText.defaultMessage });
const headingElement = within(modalNotification).getByRole('heading', { name: sidebarMessages.modalMakeVisibilityTitle.defaultMessage, class: 'pgn__modal-title' });
expect(makeVisibilityBtn).toBeInTheDocument();
expect(cancelBtn).toBeInTheDocument();
expect(headingElement).toBeInTheDocument();
expect(within(modalNotification)
.getByText(sidebarMessages.modalMakeVisibilityDescription.defaultMessage)).toBeInTheDocument();
userEvent.click(makeVisibilityBtn);
axiosMock
.onPost(getXBlockBaseApiUrl(blockId), {
publish: PUBLISH_TYPES.republish,
metadata: { visible_to_staff_only: null },
})
.reply(200, { dummy: 'value' });
axiosMock
.onGet(getCourseUnitApiUrl(blockId))
.reply(200, courseUnitIndexMock);
await executeThunk(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.republish, null), store.dispatch);
expect(within(courseUnitSidebar)
.getByText(sidebarMessages.visibilityStaffAndLearnersTitle.defaultMessage)).toBeInTheDocument();
expect(visibilityCheckbox).not.toBeChecked();
expect(draftUnpublishedChangesHeading).toBeInTheDocument();
});
it('should publish course unit after click on the "Publish" button', async () => {
const { getByTestId } = render(<RootWrapper />);
let courseUnitSidebar;
let publishBtn;
await waitFor(() => {
courseUnitSidebar = getByTestId('course-unit-sidebar');
publishBtn = within(courseUnitSidebar).queryByRole('button', { name: sidebarMessages.actionButtonPublishTitle.defaultMessage });
expect(publishBtn).toBeInTheDocument();
userEvent.click(publishBtn);
});
axiosMock
.onPost(getXBlockBaseApiUrl(blockId), {
publish: PUBLISH_TYPES.makePublic,
})
.reply(200, { dummy: 'value' });
axiosMock
.onGet(getCourseUnitApiUrl(blockId))
.reply(200, {
...courseUnitIndexMock,
visibility_state: UNIT_VISIBILITY_STATES.live,
has_changes: false,
published_by: userName,
});
await executeThunk(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.makePublic, true), store.dispatch);
expect(within(courseUnitSidebar)
.getByText(sidebarMessages.sidebarTitlePublishedAndLive.defaultMessage)).toBeInTheDocument();
expect(within(courseUnitSidebar).getByText(
sidebarMessages.publishLastPublished.defaultMessage
.replace('{publishedOn}', courseUnitIndexMock.published_on)
.replace('{publishedBy}', userName),
)).toBeInTheDocument();
expect(publishBtn).not.toBeInTheDocument();
});
it('should discard changes after click on the "Discard changes" button', async () => {
const { getByTestId, getByRole } = render(<RootWrapper />);
let courseUnitSidebar;
let discardChangesBtn;
await waitFor(() => {
courseUnitSidebar = getByTestId('course-unit-sidebar');
const draftUnpublishedChangesHeading = within(courseUnitSidebar)
.getByText(sidebarMessages.sidebarTitleDraftUnpublishedChanges.defaultMessage);
expect(draftUnpublishedChangesHeading).toBeInTheDocument();
discardChangesBtn = within(courseUnitSidebar).queryByRole('button', { name: sidebarMessages.actionButtonDiscardChangesTitle.defaultMessage });
expect(discardChangesBtn).toBeInTheDocument();
userEvent.click(discardChangesBtn);
const modalNotification = getByRole('dialog');
expect(modalNotification).toBeInTheDocument();
expect(within(modalNotification)
.getByText(sidebarMessages.modalDiscardUnitChangesDescription.defaultMessage)).toBeInTheDocument();
expect(within(modalNotification)
.getByText(sidebarMessages.modalDiscardUnitChangesCancelButtonText.defaultMessage)).toBeInTheDocument();
const headingElement = within(modalNotification).getByRole('heading', { name: sidebarMessages.modalDiscardUnitChangesTitle.defaultMessage, class: 'pgn__modal-title' });
expect(headingElement).toBeInTheDocument();
const actionBtn = within(modalNotification).getByRole('button', { name: sidebarMessages.modalDiscardUnitChangesActionButtonText.defaultMessage });
expect(actionBtn).toBeInTheDocument();
userEvent.click(actionBtn);
});
axiosMock
.onPost(getXBlockBaseApiUrl(blockId), {
publish: PUBLISH_TYPES.discardChanges,
})
.reply(200, { dummy: 'value' });
axiosMock
.onGet(getCourseUnitApiUrl(blockId))
.reply(200, {
...courseUnitIndexMock, published: true, has_changes: false,
});
await executeThunk(editCourseUnitVisibilityAndData(
blockId,
PUBLISH_TYPES.discardChanges,
true,
), store.dispatch);
expect(within(courseUnitSidebar)
.getByText(sidebarMessages.sidebarTitlePublishedNotYetReleased.defaultMessage)).toBeInTheDocument();
expect(discardChangesBtn).not.toBeInTheDocument();
});
});

View File

@@ -62,3 +62,9 @@ export const COLORS = {
BLACK: '#000',
GREEN: '#0D7D4D',
};
export const PUBLISH_TYPES = {
republish: 'republish',
discardChanges: 'discard_changes',
makePublic: 'make_public',
};

View File

@@ -2,6 +2,7 @@
import { camelCaseObject, getConfig } from '@edx/frontend-platform';
import { getAuthenticatedHttpClient } from '@edx/frontend-platform/auth';
import { PUBLISH_TYPES } from '../constants';
import {
normalizeLearningSequencesData,
normalizeMetadata,
@@ -130,6 +131,30 @@ export async function createCourseXblock({
return data;
}
/**
* Handles the visibility and data of a course unit, such as publishing, resetting to default values,
* and toggling visibility to students.
* @param {string} unitId - The ID of the course unit.
* @param {string} type - The action type (e.g., PUBLISH_TYPES.discardChanges).
* @param {boolean} isVisible - The visibility status for students.
* @returns {Promise<any>} A promise that resolves with the response data.
*/
export async function handleCourseUnitVisibilityAndData(unitId, type, isVisible) {
const body = {
publish: type,
...(type === PUBLISH_TYPES.republish ? {
metadata: {
visible_to_staff_only: isVisible,
},
} : {}),
};
const { data } = await getAuthenticatedHttpClient()
.post(getXBlockBaseApiUrl(unitId), body);
return camelCaseObject(data);
}
/**
* Get an object containing course section vertical children data.
* @param {string} itemId

View File

@@ -18,6 +18,7 @@ import {
getCourseSectionVerticalData,
createCourseXblock,
getCourseVerticalChildren,
handleCourseUnitVisibilityAndData,
deleteUnitItem,
duplicateUnitItem,
} from './api';
@@ -37,9 +38,11 @@ import {
updateLoadingCourseXblockStatus,
updateCourseVerticalChildren,
updateCourseVerticalChildrenLoadingStatus,
updateQueryPendingStatus,
deleteXBlock,
duplicateXBlock,
} from './slice';
import { getNotificationMessage } from './utils';
export function fetchCourseUnitQuery(courseId) {
return async (dispatch) => {
@@ -117,6 +120,31 @@ export function editCourseItemQuery(itemId, displayName, sequenceId) {
};
}
export function editCourseUnitVisibilityAndData(itemId, type, isVisible) {
return async (dispatch) => {
dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));
dispatch(updateQueryPendingStatus(true));
const notificationMessage = getNotificationMessage(type, isVisible);
dispatch(showProcessingNotification(notificationMessage));
try {
await handleCourseUnitVisibilityAndData(itemId, type, isVisible).then(async (result) => {
if (result) {
const courseUnit = await getCourseUnitData(itemId);
dispatch(fetchCourseItemSuccess(courseUnit));
const courseVerticalChildrenData = await getCourseVerticalChildren(itemId);
dispatch(updateCourseVerticalChildren(courseVerticalChildrenData));
dispatch(hideProcessingNotification());
dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));
}
});
} catch (error) {
dispatch(hideProcessingNotification());
dispatch(updateSavingStatus({ status: RequestStatus.FAILED }));
}
};
}
export function fetchCourse(courseId) {
return async (dispatch) => {
dispatch(fetchCourseRequest({ courseId }));
@@ -221,6 +249,8 @@ export function createNewCourseXBlock(body, callback, blockId) {
callback(result);
}
}
const courseUnit = await getCourseUnitData(blockId);
dispatch(fetchCourseItemSuccess(courseUnit));
});
} catch (error) {
dispatch(hideProcessingNotification());

View File

@@ -1,5 +1,8 @@
import { camelCaseObject } from '@edx/frontend-platform';
import { NOTIFICATION_MESSAGES } from '../../constants';
import { PUBLISH_TYPES } from '../constants';
export function getTimeOffsetMillis(headerDate, requestTime, responseTime) {
// Time offset computation should move down into the HttpClient wrapper to maintain a global time correction reference
// Requires 'Access-Control-Expose-Headers: Date' on the server response per https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#access-control-expose-headers
@@ -211,3 +214,25 @@ export function normalizeCourseSectionVerticalData(metadata) {
})),
};
}
/**
* Get the notification message based on the publishing type and visibility.
* @param {string} type - The publishing type.
* @param {boolean} isVisible - The visibility status.
* @returns {string} The corresponding notification message.
*/
export const getNotificationMessage = (type, isVisible) => {
let notificationMessage;
if (type === PUBLISH_TYPES.discardChanges) {
notificationMessage = NOTIFICATION_MESSAGES.discardChanges;
} else if (type === PUBLISH_TYPES.makePublic) {
notificationMessage = NOTIFICATION_MESSAGES.publishing;
} else if (type === PUBLISH_TYPES.republish && !isVisible) {
notificationMessage = NOTIFICATION_MESSAGES.makingVisibleToStudents;
} else if (type === PUBLISH_TYPES.republish && isVisible) {
notificationMessage = NOTIFICATION_MESSAGES.hidingFromStudents;
}
return notificationMessage;
};

View File

@@ -31,6 +31,7 @@
.course-unit-sidebar-location-description {
font-size: $font-size-xs;
line-height: $line-height-base;
word-break: break-word;
}
.course-unit-sidebar-visibility-copy {

View File

@@ -1,3 +1,4 @@
import PropTypes from 'prop-types';
import { useSelector } from 'react-redux';
import { Button } from '@openedx/paragon';
import { useIntl } from '@edx/frontend-platform/i18n';
@@ -5,7 +6,7 @@ import { useIntl } from '@edx/frontend-platform/i18n';
import { getCourseUnitData } from '../../../data/selectors';
import messages from '../../messages';
const ActionButtons = () => {
const ActionButtons = ({ openDiscardModal, handlePublishing }) => {
const intl = useIntl();
const {
published,
@@ -16,29 +17,17 @@ const ActionButtons = () => {
return (
<>
{(!published || hasChanges) && (
<Button
className="mt-3.5"
variant="outline-primary"
size="sm"
>
<Button size="sm" className="mt-3.5" variant="outline-primary" onClick={handlePublishing}>
{intl.formatMessage(messages.actionButtonPublishTitle)}
</Button>
)}
{(published && hasChanges) && (
<Button
className="mt-2"
variant="link"
size="sm"
>
<Button size="sm" variant="link" onClick={openDiscardModal} className="mt-2">
{intl.formatMessage(messages.actionButtonDiscardChangesTitle)}
</Button>
)}
{enableCopyPasteUnits && (
<Button
className="mt-2"
variant="outline-primary"
size="sm"
>
<Button size="sm" className="mt-2" variant="outline-primary">
{intl.formatMessage(messages.actionButtonCopyUnitTitle)}
</Button>
)}
@@ -46,4 +35,9 @@ const ActionButtons = () => {
);
};
ActionButtons.propTypes = {
openDiscardModal: PropTypes.func.isRequired,
handlePublishing: PropTypes.func.isRequired,
};
export default ActionButtons;

View File

@@ -1,23 +1,32 @@
import { useSelector } from 'react-redux';
import PropTypes from 'prop-types';
import { useDispatch, useSelector } from 'react-redux';
import { Form } from '@openedx/paragon';
import { useIntl } from '@edx/frontend-platform/i18n';
import { useParams } from 'react-router-dom';
import { getCourseUnitData } from '../../../data/selectors';
import { editCourseUnitVisibilityAndData } from '../../../data/thunk';
import { PUBLISH_TYPES } from '../../../constants';
import { getVisibilityTitle } from '../../utils';
import messages from '../../messages';
const UnitVisibilityInfo = () => {
const UnitVisibilityInfo = ({ openVisibleModal, visibleToStaffOnly }) => {
const intl = useIntl();
const { blockId } = useParams();
const dispatch = useDispatch();
const {
published,
hasChanges,
staffLockFrom,
releaseDateFrom,
releasedToStudents,
visibleToStaffOnly,
hasExplicitStaffLock,
} = useSelector(getCourseUnitData);
const handleCourseUnitVisibility = () => {
dispatch(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.republish, true));
};
return (
<>
<small className="course-unit-sidebar-visibility-title">
@@ -44,7 +53,8 @@ const UnitVisibilityInfo = () => {
<Form.Checkbox
className="course-unit-sidebar-visibility-checkbox"
checked={hasExplicitStaffLock}
onChange={() => {}}
onChange={hasExplicitStaffLock ? null : handleCourseUnitVisibility}
onClick={hasExplicitStaffLock ? openVisibleModal : null}
>
{intl.formatMessage(messages.visibilityCheckboxTitle)}
</Form.Checkbox>
@@ -52,4 +62,9 @@ const UnitVisibilityInfo = () => {
);
};
UnitVisibilityInfo.propTypes = {
openVisibleModal: PropTypes.func.isRequired,
visibleToStaffOnly: PropTypes.bool.isRequired,
};
export default UnitVisibilityInfo;

View File

@@ -6,7 +6,14 @@ import messages from '../../messages';
import UnitVisibilityInfo from './UnitVisibilityInfo';
import ActionButtons from './ActionButtons';
const SidebarFooter = ({ isDisplayUnitLocation, locationId }) => {
const SidebarFooter = ({
locationId,
openVisibleModal,
handlePublishing,
openDiscardModal,
visibleToStaffOnly,
isDisplayUnitLocation,
}) => {
const intl = useIntl();
return (
@@ -18,8 +25,14 @@ const SidebarFooter = ({ isDisplayUnitLocation, locationId }) => {
</small>
) : (
<>
<UnitVisibilityInfo />
<ActionButtons />
<UnitVisibilityInfo
openVisibleModal={openVisibleModal}
visibleToStaffOnly={visibleToStaffOnly}
/>
<ActionButtons
openDiscardModal={openDiscardModal}
handlePublishing={handlePublishing}
/>
</>
)}
</Stack>
@@ -28,8 +41,12 @@ const SidebarFooter = ({ isDisplayUnitLocation, locationId }) => {
};
SidebarFooter.propTypes = {
isDisplayUnitLocation: PropTypes.bool,
locationId: PropTypes.string,
isDisplayUnitLocation: PropTypes.bool,
openDiscardModal: PropTypes.func.isRequired,
openVisibleModal: PropTypes.func.isRequired,
handlePublishing: PropTypes.func.isRequired,
visibleToStaffOnly: PropTypes.bool.isRequired,
};
SidebarFooter.defaultProps = {

View File

@@ -1,13 +1,19 @@
import PropTypes from 'prop-types';
import { useSelector } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import classNames from 'classnames';
import { Card } from '@openedx/paragon';
import { Card, useToggle } from '@openedx/paragon';
import { InfoOutline as InfoOutlineIcon } from '@openedx/paragon/icons';
import { useIntl } from '@edx/frontend-platform/i18n';
import ModalNotification from '../../generic/modal-notification';
import { editCourseUnitVisibilityAndData } from '../data/thunk';
import { getCourseUnitData } from '../data/selectors';
import { PUBLISH_TYPES } from '../constants';
import { SidebarBody, SidebarFooter, SidebarHeader } from './components';
import useCourseUnitData from './hooks';
import messages from './messages';
const Sidebar = ({ isDisplayUnitLocation }) => {
const Sidebar = ({ blockId, isDisplayUnitLocation, ...props }) => {
const {
title,
locationId,
@@ -15,13 +21,31 @@ const Sidebar = ({ isDisplayUnitLocation }) => {
visibilityState,
visibleToStaffOnly,
} = useCourseUnitData(useSelector(getCourseUnitData));
const intl = useIntl();
const dispatch = useDispatch();
const [isOpenDiscardModal, openDiscardModal, closeDiscardModal] = useToggle(false);
const [isOpenVisibleModal, openVisibleModal, closeVisibleModal] = useToggle(false);
const handleCourseUnitVisibility = () => {
closeVisibleModal();
dispatch(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.republish, null));
};
const handleCourseUnitDiscardChanges = () => {
closeDiscardModal();
dispatch(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.discardChanges));
};
const handleCourseUnitPublish = () => {
dispatch(editCourseUnitVisibilityAndData(blockId, PUBLISH_TYPES.makePublic));
};
return (
<Card
className={classNames('course-unit-sidebar', {
'is-stuff-only': visibleToStaffOnly,
})}
data-testid="course-unit-sidebar"
{...props}
>
<SidebarHeader
title={title}
@@ -35,17 +59,43 @@ const Sidebar = ({ isDisplayUnitLocation }) => {
/>
<SidebarFooter
locationId={locationId}
openDiscardModal={openDiscardModal}
openVisibleModal={openVisibleModal}
isDisplayUnitLocation={isDisplayUnitLocation}
handlePublishing={handleCourseUnitPublish}
visibleToStaffOnly={visibleToStaffOnly}
/>
<ModalNotification
title={intl.formatMessage(messages.modalDiscardUnitChangesTitle)}
isOpen={isOpenDiscardModal}
actionButtonText={intl.formatMessage(messages.modalDiscardUnitChangesActionButtonText)}
cancelButtonText={intl.formatMessage(messages.modalDiscardUnitChangesCancelButtonText)}
handleAction={handleCourseUnitDiscardChanges}
handleCancel={closeDiscardModal}
message={intl.formatMessage(messages.modalDiscardUnitChangesDescription)}
icon={InfoOutlineIcon}
/>
<ModalNotification
title={intl.formatMessage(messages.modalMakeVisibilityTitle)}
isOpen={isOpenVisibleModal}
actionButtonText={intl.formatMessage(messages.modalMakeVisibilityActionButtonText)}
cancelButtonText={intl.formatMessage(messages.modalMakeVisibilityCancelButtonText)}
handleAction={handleCourseUnitVisibility}
handleCancel={closeVisibleModal}
message={intl.formatMessage(messages.modalMakeVisibilityDescription)}
icon={InfoOutlineIcon}
/>
</Card>
);
};
Sidebar.propTypes = {
blockId: PropTypes.string,
isDisplayUnitLocation: PropTypes.bool,
};
Sidebar.defaultProps = {
blockId: null,
isDisplayUnitLocation: false,
};

View File

@@ -105,6 +105,38 @@ const messages = defineMessages({
id: 'course-authoring.course-unit.status.scheduled.title',
defaultMessage: 'SCHEDULED',
},
modalDiscardUnitChangesTitle: {
id: 'course-authoring.course-unit.modal.discard-unit-changes.title',
defaultMessage: 'Discard changes',
},
modalDiscardUnitChangesActionButtonText: {
id: 'course-authoring.course-unit.modal.discard-unit-changes.btn.action.text',
defaultMessage: 'Discard changes',
},
modalDiscardUnitChangesCancelButtonText: {
id: 'course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text',
defaultMessage: 'Cancel',
},
modalDiscardUnitChangesDescription: {
id: 'course-authoring.course-unit.modal.discard-unit-changes.description',
defaultMessage: 'Are you sure you want to revert to the last published version of the unit? You cannot undo this action.',
},
modalMakeVisibilityTitle: {
id: 'course-authoring.course-unit.modal.make-visibility.title',
defaultMessage: 'Make visible to students',
},
modalMakeVisibilityActionButtonText: {
id: 'course-authoring.course-unit.modal.make-visibility.btn.action.text',
defaultMessage: 'Make visible to students',
},
modalMakeVisibilityCancelButtonText: {
id: 'course-authoring.course-unit.modal.make-visibility.btn.cancel.text',
defaultMessage: 'Cancel',
},
modalMakeVisibilityDescription: {
id: 'course-authoring.course-unit.modal.make-visibility.description',
defaultMessage: 'If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?',
},
});
export default messages;

View File

@@ -3,8 +3,9 @@ import { injectIntl, intlShape } from '@edx/frontend-platform/i18n';
import { useDispatch, useSelector } from 'react-redux';
import { getConfig } from '@edx/frontend-platform';
import PropTypes from 'prop-types';
import { Error as ErrorIcon } from '@openedx/paragon/icons';
import ModalError from '../../generic/modal-error/ModalError';
import ModalNotification from '../../generic/modal-notification';
import { getError, getIsErrorModalOpen } from '../data/selectors';
import { updateIsErrorModalOpen } from '../data/slice';
import messages from './messages';
@@ -20,7 +21,7 @@ const ExportModalError = ({
const handleUnitRedirect = () => { window.location.assign(unitErrorUrl); };
const handleRedirectCourseHome = () => { window.location.assign(`${getConfig().STUDIO_BASE_URL}/course/${courseId}`); };
return (
<ModalError
<ModalNotification
isOpen={isErrorModalOpen}
title={intl.formatMessage(messages.errorTitle)}
message={
@@ -39,6 +40,8 @@ const ExportModalError = ({
}
handleCancel={() => dispatch(updateIsErrorModalOpen(false))}
handleAction={unitErrorUrl ? handleUnitRedirect : handleRedirectCourseHome}
variant="danger"
icon={ErrorIcon}
/>
);
};

View File

@@ -1,16 +1,15 @@
import React from 'react';
import PropTypes from 'prop-types';
import { ActionRow, AlertModal, Button } from '@openedx/paragon';
import { Error } from '@openedx/paragon/icons';
const ModalError = ({
isOpen, title, message, handleCancel, handleAction, cancelButtonText, actionButtonText,
const ModalNotification = ({
isOpen, title, message, handleCancel, handleAction, cancelButtonText, actionButtonText, variant, icon,
}) => (
<AlertModal
title={title}
isOpen={isOpen}
variant="danger"
icon={Error}
variant={variant}
icon={icon}
footerNode={(
<ActionRow>
<Button variant="tertiary" onClick={handleCancel}>{cancelButtonText}</Button>
@@ -22,7 +21,7 @@ const ModalError = ({
</AlertModal>
);
ModalError.propTypes = {
ModalNotification.propTypes = {
isOpen: PropTypes.bool.isRequired,
title: PropTypes.string.isRequired,
message: PropTypes.string.isRequired,
@@ -30,6 +29,13 @@ ModalError.propTypes = {
handleAction: PropTypes.func.isRequired,
cancelButtonText: PropTypes.string.isRequired,
actionButtonText: PropTypes.string.isRequired,
variant: PropTypes.string,
icon: PropTypes.elementType,
};
export default ModalError;
ModalNotification.defaultProps = {
variant: 'default',
icon: undefined,
};
export default ModalNotification;

View File

@@ -1045,5 +1045,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience.",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1046,5 +1046,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience.",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?"
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -43,5 +43,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}

View File

@@ -1020,5 +1020,36 @@
"course-authoring.course-unit.xblock.button.move.label": "Move",
"course-authoring.course-unit.xblock.button.manageAccess.label": "Manage access",
"course-authoring.course-unit.xblock.button.delete.label": "Delete",
"course-authoring.course-unit.xblock.button.actions.alt": "Actions"
"course-authoring.course-unit.xblock.button.actions.alt": "Actions",
"course-authoring.course-unit.modal.discard-unit-changes.title": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.action.text": "Discard changes",
"course-authoring.course-unit.modal.discard-unit-changes.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.discard-unit-changes.description": "Are you sure you want to revert to the last published version of the unit? You cannot undo this action.",
"course-authoring.course-unit.modal.make-visibility.title": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.action.text": "Make visible to students",
"course-authoring.course-unit.modal.make-visibility.btn.cancel.text": "Cancel",
"course-authoring.course-unit.modal.make-visibility.description": "If the unit was previously published and released to students, any changes you made to the unit when it was hidden will now be visible to students. Do you want to proceed?",
"course-authoring.group-configurations.heading-title": "Group configurations",
"course-authoring.group-configurations.heading-sub-title": "Settings",
"course-authoring.group-configurations.container.empty-content-groups": "In the {outlineComponentLink}, use this group to control access to a component.",
"course-authoring.group-configurations.container.empty-experiment-group": "This group configuration is not in use. Start by adding a content experiment to any Unit via the {outlineComponentLink}.",
"course-authoring.group-configurations.container.course-outline": "Course outline",
"course-authoring.group-configurations.container.action.edit": "Edit",
"course-authoring.group-configurations.container.action.delete": "Delete",
"course-authoring.group-configurations.container.access-to": "This group controls access to:",
"course-authoring.group-configurations.container.experiment-access-to": "This group configuration is used in:",
"course-authoring.group-configurations.container.contains-groups": "Contains {len} groups",
"course-authoring.group-configurations.container.contains-group": "Contains 1 group",
"course-authoring.group-configurations.container.not-in-use": "Not in use",
"course-authoring.group-configurations.container.used-in-locations": "Used in {len} locations",
"course-authoring.group-configurations.container.used-in-location": "Used in 1 location",
"course-authoring.group-configurations.container.title-id": "ID: {id}",
"course-authoring.group-configurations.experiment-group.title": "Experiment group configurations",
"course-authoring.group-configurations.experiment-group.add-new-group": "New group configuration",
"course-authoring.group-configurations.empty-placeholder.title": "You have not created any content groups yet.",
"course-authoring.group-configurations.experimental-empty-placeholder.title": "You have not created any group configurations yet.",
"course-authoring.group-configurations.empty-placeholder.button": "Add your first content group",
"course-authoring.group-configurations.experimental-empty-placeholder.button": "Add your first group configuration",
"course-authoring.group-configurations.content-groups.add-new-group": "New content group",
"course-authoring.course-unit.general.alert.unpublished-version.description": "Note: The last published version of this unit is live. By publishing changes you will change the student experience."
}