From e4d88fb1faa760961fe502b09ec73364cfe9dd8a Mon Sep 17 00:00:00 2001 From: Peter Kulko <93188219+PKulkoRaccoonGang@users.noreply.github.com> Date: Mon, 29 Jan 2024 14:42:04 +0200 Subject: [PATCH] feat: [AXIMST-24] Course unit - Sidebar buttons functional (#134) * feat: [AXIMST-24] sidebar buttons functional * refactor: removed modal extra className * refactor: refactoring after review --- src/constants.js | 4 + src/course-unit/CourseUnit.jsx | 4 +- src/course-unit/CourseUnit.test.jsx | 171 +++++++++++++++++- src/course-unit/constants.js | 6 + src/course-unit/data/api.js | 25 +++ src/course-unit/data/thunk.js | 30 +++ src/course-unit/data/utils.js | 25 +++ src/course-unit/sidebar/Sidebar.scss | 1 + .../sidebar-footer/ActionButtons.jsx | 26 +-- .../sidebar-footer/UnitVisibilityInfo.jsx | 23 ++- .../components/sidebar-footer/index.jsx | 25 ++- src/course-unit/sidebar/index.jsx | 58 +++++- src/course-unit/sidebar/messages.js | 32 ++++ .../export-modal-error/ExportModalError.jsx | 7 +- .../index.jsx} | 20 +- src/i18n/messages/ar.json | 31 ++++ src/i18n/messages/de.json | 33 +++- src/i18n/messages/de_DE.json | 33 +++- src/i18n/messages/es_419.json | 33 +++- src/i18n/messages/fa_IR.json | 33 +++- src/i18n/messages/fr.json | 33 +++- src/i18n/messages/fr_CA.json | 33 +++- src/i18n/messages/hi.json | 33 +++- src/i18n/messages/it.json | 33 +++- src/i18n/messages/it_IT.json | 33 +++- src/i18n/messages/pt.json | 33 +++- src/i18n/messages/pt_PT.json | 33 +++- src/i18n/messages/ru.json | 33 +++- src/i18n/messages/uk.json | 33 +++- src/i18n/messages/zh_CN.json | 33 +++- 30 files changed, 896 insertions(+), 54 deletions(-) rename src/generic/{modal-error/ModalError.jsx => modal-notification/index.jsx} (72%) diff --git a/src/constants.js b/src/constants.js index eb1b17b37..2913884a9 100644 --- a/src/constants.js +++ b/src/constants.js @@ -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: '', }; diff --git a/src/course-unit/CourseUnit.jsx b/src/course-unit/CourseUnit.jsx index 682e991b1..f94bf3497 100644 --- a/src/course-unit/CourseUnit.jsx +++ b/src/course-unit/CourseUnit.jsx @@ -113,8 +113,8 @@ const CourseUnit = ({ courseId }) => { - - + + diff --git a/src/course-unit/CourseUnit.test.jsx b/src/course-unit/CourseUnit.test.jsx index 555aa1028..75d657862 100644 --- a/src/course-unit/CourseUnit.test.jsx +++ b/src/course-unit/CourseUnit.test.jsx @@ -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('', () => { expect(getByText('New Cloned XBlock')).toBeInTheDocument(); }); }); + + it('should toggle visibility and update course unit state accordingly', async () => { + const { getByRole, getByTestId } = render(); + 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(); + 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(); + 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(); + }); }); diff --git a/src/course-unit/constants.js b/src/course-unit/constants.js index ecf07815f..c32d12379 100644 --- a/src/course-unit/constants.js +++ b/src/course-unit/constants.js @@ -62,3 +62,9 @@ export const COLORS = { BLACK: '#000', GREEN: '#0D7D4D', }; + +export const PUBLISH_TYPES = { + republish: 'republish', + discardChanges: 'discard_changes', + makePublic: 'make_public', +}; diff --git a/src/course-unit/data/api.js b/src/course-unit/data/api.js index 43992f576..f7adc33b4 100644 --- a/src/course-unit/data/api.js +++ b/src/course-unit/data/api.js @@ -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} 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 diff --git a/src/course-unit/data/thunk.js b/src/course-unit/data/thunk.js index b6e247784..7117acd43 100644 --- a/src/course-unit/data/thunk.js +++ b/src/course-unit/data/thunk.js @@ -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()); diff --git a/src/course-unit/data/utils.js b/src/course-unit/data/utils.js index c41db3a85..afd6e0a03 100644 --- a/src/course-unit/data/utils.js +++ b/src/course-unit/data/utils.js @@ -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; +}; diff --git a/src/course-unit/sidebar/Sidebar.scss b/src/course-unit/sidebar/Sidebar.scss index 537e52108..eb4bd0ada 100644 --- a/src/course-unit/sidebar/Sidebar.scss +++ b/src/course-unit/sidebar/Sidebar.scss @@ -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 { diff --git a/src/course-unit/sidebar/components/sidebar-footer/ActionButtons.jsx b/src/course-unit/sidebar/components/sidebar-footer/ActionButtons.jsx index 3fb98f5cc..ac0a63287 100644 --- a/src/course-unit/sidebar/components/sidebar-footer/ActionButtons.jsx +++ b/src/course-unit/sidebar/components/sidebar-footer/ActionButtons.jsx @@ -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) && ( - )} {(published && hasChanges) && ( - )} {enableCopyPasteUnits && ( - )} @@ -46,4 +35,9 @@ const ActionButtons = () => { ); }; +ActionButtons.propTypes = { + openDiscardModal: PropTypes.func.isRequired, + handlePublishing: PropTypes.func.isRequired, +}; + export default ActionButtons; diff --git a/src/course-unit/sidebar/components/sidebar-footer/UnitVisibilityInfo.jsx b/src/course-unit/sidebar/components/sidebar-footer/UnitVisibilityInfo.jsx index 260333001..13c566b1b 100644 --- a/src/course-unit/sidebar/components/sidebar-footer/UnitVisibilityInfo.jsx +++ b/src/course-unit/sidebar/components/sidebar-footer/UnitVisibilityInfo.jsx @@ -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 ( <> @@ -44,7 +53,8 @@ const UnitVisibilityInfo = () => { {}} + onChange={hasExplicitStaffLock ? null : handleCourseUnitVisibility} + onClick={hasExplicitStaffLock ? openVisibleModal : null} > {intl.formatMessage(messages.visibilityCheckboxTitle)} @@ -52,4 +62,9 @@ const UnitVisibilityInfo = () => { ); }; +UnitVisibilityInfo.propTypes = { + openVisibleModal: PropTypes.func.isRequired, + visibleToStaffOnly: PropTypes.bool.isRequired, +}; + export default UnitVisibilityInfo; diff --git a/src/course-unit/sidebar/components/sidebar-footer/index.jsx b/src/course-unit/sidebar/components/sidebar-footer/index.jsx index 35ed27dc8..36387a08e 100644 --- a/src/course-unit/sidebar/components/sidebar-footer/index.jsx +++ b/src/course-unit/sidebar/components/sidebar-footer/index.jsx @@ -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 }) => { ) : ( <> - - + + )} @@ -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 = { diff --git a/src/course-unit/sidebar/index.jsx b/src/course-unit/sidebar/index.jsx index eae1e1b2f..cd35cd3e0 100644 --- a/src/course-unit/sidebar/index.jsx +++ b/src/course-unit/sidebar/index.jsx @@ -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 ( { /> + + ); }; Sidebar.propTypes = { + blockId: PropTypes.string, isDisplayUnitLocation: PropTypes.bool, }; Sidebar.defaultProps = { + blockId: null, isDisplayUnitLocation: false, }; diff --git a/src/course-unit/sidebar/messages.js b/src/course-unit/sidebar/messages.js index bb9a75c31..ddc4b4567 100644 --- a/src/course-unit/sidebar/messages.js +++ b/src/course-unit/sidebar/messages.js @@ -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; diff --git a/src/export-page/export-modal-error/ExportModalError.jsx b/src/export-page/export-modal-error/ExportModalError.jsx index 56921a84c..64d67f2f1 100644 --- a/src/export-page/export-modal-error/ExportModalError.jsx +++ b/src/export-page/export-modal-error/ExportModalError.jsx @@ -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 ( - dispatch(updateIsErrorModalOpen(false))} handleAction={unitErrorUrl ? handleUnitRedirect : handleRedirectCourseHome} + variant="danger" + icon={ErrorIcon} /> ); }; diff --git a/src/generic/modal-error/ModalError.jsx b/src/generic/modal-notification/index.jsx similarity index 72% rename from src/generic/modal-error/ModalError.jsx rename to src/generic/modal-notification/index.jsx index a4de402b6..ae1dc2ba8 100644 --- a/src/generic/modal-error/ModalError.jsx +++ b/src/generic/modal-notification/index.jsx @@ -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, }) => ( @@ -22,7 +21,7 @@ const ModalError = ({ ); -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; diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json index a26a97c57..0689d8e79 100644 --- a/src/i18n/messages/ar.json +++ b/src/i18n/messages/ar.json @@ -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" } diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json index 6a18e9e18..8bc76c831 100644 --- a/src/i18n/messages/de.json +++ b/src/i18n/messages/de.json @@ -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." } diff --git a/src/i18n/messages/de_DE.json b/src/i18n/messages/de_DE.json index 5ad4d1441..943696a97 100644 --- a/src/i18n/messages/de_DE.json +++ b/src/i18n/messages/de_DE.json @@ -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?" } diff --git a/src/i18n/messages/es_419.json b/src/i18n/messages/es_419.json index d6efdea78..b2124e2d7 100644 --- a/src/i18n/messages/es_419.json +++ b/src/i18n/messages/es_419.json @@ -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." } diff --git a/src/i18n/messages/fa_IR.json b/src/i18n/messages/fa_IR.json index e2fc0af12..12e151479 100644 --- a/src/i18n/messages/fa_IR.json +++ b/src/i18n/messages/fa_IR.json @@ -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." } diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json index 4c874a065..6f6a47dc5 100644 --- a/src/i18n/messages/fr.json +++ b/src/i18n/messages/fr.json @@ -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." } diff --git a/src/i18n/messages/fr_CA.json b/src/i18n/messages/fr_CA.json index f2c2d095d..8840d70b3 100644 --- a/src/i18n/messages/fr_CA.json +++ b/src/i18n/messages/fr_CA.json @@ -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." } diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json index 6a18e9e18..8bc76c831 100644 --- a/src/i18n/messages/hi.json +++ b/src/i18n/messages/hi.json @@ -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." } diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json index 6a18e9e18..8bc76c831 100644 --- a/src/i18n/messages/it.json +++ b/src/i18n/messages/it.json @@ -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." } diff --git a/src/i18n/messages/it_IT.json b/src/i18n/messages/it_IT.json index 3c53c5263..3bb8914ec 100644 --- a/src/i18n/messages/it_IT.json +++ b/src/i18n/messages/it_IT.json @@ -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." } diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index 6a18e9e18..8bc76c831 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -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." } diff --git a/src/i18n/messages/pt_PT.json b/src/i18n/messages/pt_PT.json index 88c7ddd23..9519dcc9d 100644 --- a/src/i18n/messages/pt_PT.json +++ b/src/i18n/messages/pt_PT.json @@ -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." } diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index 6a18e9e18..8bc76c831 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -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." } diff --git a/src/i18n/messages/uk.json b/src/i18n/messages/uk.json index 6a18e9e18..8bc76c831 100644 --- a/src/i18n/messages/uk.json +++ b/src/i18n/messages/uk.json @@ -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." } diff --git a/src/i18n/messages/zh_CN.json b/src/i18n/messages/zh_CN.json index 6a18e9e18..8bc76c831 100644 --- a/src/i18n/messages/zh_CN.json +++ b/src/i18n/messages/zh_CN.json @@ -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." }