);
diff --git a/src/course-unit/clipboard/paste-component/components/index.js b/src/generic/clipboard/paste-component/components/index.js
similarity index 63%
rename from src/course-unit/clipboard/paste-component/components/index.js
rename to src/generic/clipboard/paste-component/components/index.js
index 86980f4b9b..1336513b37 100644
--- a/src/course-unit/clipboard/paste-component/components/index.js
+++ b/src/generic/clipboard/paste-component/components/index.js
@@ -1,3 +1,3 @@
export { default as WhatsInClipboard } from './WhatsInClipboard';
-export { default as PasteComponentButton } from './PasteComponentButton';
+export { default as PasteButton } from './PasteButton';
export { default as PopoverContent } from './PopoverContent';
diff --git a/src/course-unit/clipboard/paste-component/constants.js b/src/generic/clipboard/paste-component/constants.js
similarity index 100%
rename from src/course-unit/clipboard/paste-component/constants.js
rename to src/generic/clipboard/paste-component/constants.js
diff --git a/src/course-unit/clipboard/paste-component/index.jsx b/src/generic/clipboard/paste-component/index.jsx
similarity index 78%
rename from src/course-unit/clipboard/paste-component/index.jsx
rename to src/generic/clipboard/paste-component/index.jsx
index ab140bf383..af4674952a 100644
--- a/src/course-unit/clipboard/paste-component/index.jsx
+++ b/src/generic/clipboard/paste-component/index.jsx
@@ -2,10 +2,12 @@ import { useRef, useState } from 'react';
import PropTypes from 'prop-types';
import { OverlayTrigger, Popover } from '@openedx/paragon';
-import { PopoverContent, PasteComponentButton, WhatsInClipboard } from './components';
+import { PopoverContent, PasteButton, WhatsInClipboard } from './components';
import { clipboardPropsTypes, OVERLAY_TRIGGERS } from './constants';
-const PasteComponent = ({ handleCreateNewCourseXBlock, clipboardData }) => {
+const PasteComponent = ({
+ onClick, clipboardData, text, className,
+}) => {
const [showPopover, togglePopover] = useState(false);
const popoverElementRef = useRef(null);
@@ -31,9 +33,7 @@ const PasteComponent = ({ handleCreateNewCourseXBlock, clipboardData }) => {
return (
<>
-
+ {
};
PasteComponent.propTypes = {
- handleCreateNewCourseXBlock: PropTypes.func.isRequired,
+ onClick: PropTypes.func.isRequired,
+ text: PropTypes.string.isRequired,
clipboardData: PropTypes.shape(clipboardPropsTypes),
+ blockType: PropTypes.string,
+ className: PropTypes.string,
};
PasteComponent.defaultProps = {
clipboardData: null,
+ blockType: null,
+ className: undefined,
};
export default PasteComponent;
diff --git a/src/generic/clipboard/paste-component/messages.js b/src/generic/clipboard/paste-component/messages.js
new file mode 100644
index 0000000000..47c229b06d
--- /dev/null
+++ b/src/generic/clipboard/paste-component/messages.js
@@ -0,0 +1,14 @@
+import { defineMessages } from '@edx/frontend-platform/i18n';
+
+const messages = defineMessages({
+ popoverContentText: {
+ id: 'course-authoring.generic.paste-component.popover.content.text',
+ defaultMessage: 'From:',
+ },
+ pasteButtonWhatsInClipboardText: {
+ id: 'course-authoring.generic.paste-component.paste-button.whats-in-clipboard.text',
+ defaultMessage: "What's in my clipboard?",
+ },
+});
+
+export default messages;
diff --git a/src/generic/data/api.js b/src/generic/data/api.js
index 6cec7b9159..83fd561ff3 100644
--- a/src/generic/data/api.js
+++ b/src/generic/data/api.js
@@ -8,6 +8,7 @@ export const getApiBaseUrl = () => getConfig().STUDIO_BASE_URL;
export const getCreateOrRerunCourseUrl = () => new URL('course/', getApiBaseUrl()).href;
export const getCourseRerunUrl = (courseId) => new URL(`/api/contentstore/v1/course_rerun/${courseId}`, getApiBaseUrl()).href;
export const getOrganizationsUrl = () => new URL('organizations', getApiBaseUrl()).href;
+export const getClipboardUrl = () => `${getApiBaseUrl()}/api/content-staging/v1/clipboard/`;
export const getTagsCountApiUrl = (contentPattern) => new URL(`api/content_tagging/v1/object_tag_counts/${contentPattern}/?count_implicit`, getApiBaseUrl()).href;
/**
@@ -45,6 +46,29 @@ export async function createOrRerunCourse(courseData) {
return camelCaseObject(data);
}
+/**
+ * Retrieves user's clipboard.
+ * @returns {Promise} - A Promise that resolves clipboard data.
+ */
+export async function getClipboard() {
+ const { data } = await getAuthenticatedHttpClient()
+ .get(getClipboardUrl());
+
+ return camelCaseObject(data);
+}
+
+/**
+ * Updates user's clipboard.
+ * @param {string} usageKey - The ID of the block.
+ * @returns {Promise} - A Promise that resolves clipboard data.
+ */
+export async function updateClipboard(usageKey) {
+ const { data } = await getAuthenticatedHttpClient()
+ .post(getClipboardUrl(), { usage_key: usageKey });
+
+ return camelCaseObject(data);
+}
+
/**
* Gets the tags count of multiple content by id separated by commas or a pattern using a '*' wildcard.
* @param {string} contentPattern
diff --git a/src/generic/data/selectors.js b/src/generic/data/selectors.js
index 461e09fe98..e111961b15 100644
--- a/src/generic/data/selectors.js
+++ b/src/generic/data/selectors.js
@@ -5,3 +5,4 @@ export const getCourseData = (state) => state.generic.createOrRerunCourse.course
export const getCourseRerunData = (state) => state.generic.createOrRerunCourse.courseRerunData;
export const getRedirectUrlObj = (state) => state.generic.createOrRerunCourse.redirectUrlObj;
export const getPostErrors = (state) => state.generic.createOrRerunCourse.postErrors;
+export const getClipboardData = (state) => state.generic.clipboardData;
diff --git a/src/generic/data/slice.js b/src/generic/data/slice.js
index a25112704e..f53ddc610e 100644
--- a/src/generic/data/slice.js
+++ b/src/generic/data/slice.js
@@ -18,6 +18,7 @@ const slice = createSlice({
redirectUrlObj: {},
postErrors: {},
},
+ clipboardData: null,
},
reducers: {
fetchOrganizations: (state, { payload }) => {
@@ -41,6 +42,9 @@ const slice = createSlice({
updatePostErrors: (state, { payload }) => {
state.createOrRerunCourse.postErrors = payload;
},
+ updateClipboardData: (state, { payload }) => {
+ state.clipboardData = payload;
+ },
},
});
@@ -52,6 +56,7 @@ export const {
updateSavingStatus,
updateCourseData,
updateRedirectUrlObj,
+ updateClipboardData,
} = slice.actions;
export const {
diff --git a/src/generic/data/thunks.js b/src/generic/data/thunks.js
index 0008a187f4..bceb760389 100644
--- a/src/generic/data/thunks.js
+++ b/src/generic/data/thunks.js
@@ -1,5 +1,12 @@
+import { logError } from '@edx/frontend-platform/logging';
+
+import { CLIPBOARD_STATUS, NOTIFICATION_MESSAGES } from '../../constants';
+import { handleResponseErrors } from '../saving-error-alert';
+import {
+ hideProcessingNotification,
+ showProcessingNotification,
+} from '../processing-notification/data/slice';
import { RequestStatus } from '../../data/constants';
-import { createOrRerunCourse, getOrganizations, getCourseRerun } from './api';
import {
fetchOrganizations,
updatePostErrors,
@@ -7,7 +14,15 @@ import {
updateRedirectUrlObj,
updateCourseRerunData,
updateSavingStatus,
+ updateClipboardData,
} from './slice';
+import {
+ createOrRerunCourse,
+ getOrganizations,
+ getCourseRerun,
+ updateClipboard,
+ getClipboard,
+} from './api';
export function fetchOrganizationsQuery() {
return async (dispatch) => {
@@ -49,3 +64,34 @@ export function updateCreateOrRerunCourseQuery(courseData) {
}
};
}
+
+export function copyToClipboard(usageKey) {
+ const POLL_INTERVAL_MS = 1000; // Timeout duration for polling in milliseconds
+
+ return async (dispatch) => {
+ dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.copying));
+ dispatch(updateSavingStatus({ status: RequestStatus.PENDING }));
+
+ try {
+ let clipboardData = await updateClipboard(usageKey);
+
+ while (clipboardData.content?.status === CLIPBOARD_STATUS.loading) {
+ // eslint-disable-next-line no-await-in-loop,no-promise-executor-return
+ await new Promise((resolve) => setTimeout(resolve, POLL_INTERVAL_MS));
+ clipboardData = await getClipboard(); // eslint-disable-line no-await-in-loop
+ }
+
+ if (clipboardData.content?.status === CLIPBOARD_STATUS.ready) {
+ dispatch(updateClipboardData(clipboardData));
+ dispatch(updateSavingStatus({ status: RequestStatus.SUCCESSFUL }));
+ } else {
+ throw new Error(`Unexpected clipboard status "${clipboardData.content?.status}" in successful API response.`);
+ }
+ } catch (error) {
+ logError('Error copying to clipboard:', error);
+ handleResponseErrors(error, dispatch, updateSavingStatus);
+ } finally {
+ dispatch(hideProcessingNotification());
+ }
+ };
+}
diff --git a/src/generic/saving-error-alert/SavingErrorAlert.jsx b/src/generic/saving-error-alert/SavingErrorAlert.jsx
index db3431a0a9..9f1dbb798d 100644
--- a/src/generic/saving-error-alert/SavingErrorAlert.jsx
+++ b/src/generic/saving-error-alert/SavingErrorAlert.jsx
@@ -1,9 +1,11 @@
import { useEffect, useState } from 'react';
+import { useSelector } from 'react-redux';
import PropTypes from 'prop-types';
import { Warning as WarningIcon } from '@openedx/paragon/icons';
import { useIntl } from '@edx/frontend-platform/i18n';
import { RequestStatus } from '../../data/constants';
+import { getSavingStatus as getGenericSavingStatus } from '../data/selectors';
import AlertMessage from '../alert-message';
import messages from './messages';
@@ -14,7 +16,8 @@ const SavingErrorAlert = ({
const intl = useIntl();
const [showAlert, setShowAlert] = useState(false);
const [isOnline, setIsOnline] = useState(window.navigator.onLine);
- const isQueryFailed = savingStatus === RequestStatus.FAILED;
+ const genericSavingStatus = useSelector(getGenericSavingStatus);
+ const isQueryFailed = savingStatus === RequestStatus.FAILED || genericSavingStatus === RequestStatus.FAILED;
useEffect(() => {
const handleOnlineStatus = () => setIsOnline(window.navigator.onLine);
diff --git a/src/generic/styles.scss b/src/generic/styles.scss
index e6b1f5de22..5fa8ed57e1 100644
--- a/src/generic/styles.scss
+++ b/src/generic/styles.scss
@@ -11,3 +11,4 @@
@import "./configure-modal/ConfigureModal";
@import "./drag-helper/ConditionalSortableElement";
@import "./divider/Divider";
+@import "./clipboard/paste-component/PasteComponent";
diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json
index 673177ddfa..c6e2d7962c 100644
--- a/src/i18n/messages/ar.json
+++ b/src/i18n/messages/ar.json
@@ -1149,8 +1149,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json
index a00ac08feb..98d259e4b0 100644
--- a/src/i18n/messages/de.json
+++ b/src/i18n/messages/de.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/de_DE.json b/src/i18n/messages/de_DE.json
index 1c17b44175..5084c6f75b 100644
--- a/src/i18n/messages/de_DE.json
+++ b/src/i18n/messages/de_DE.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/es_419.json b/src/i18n/messages/es_419.json
index e102967a36..8ec2c84a42 100644
--- a/src/i18n/messages/es_419.json
+++ b/src/i18n/messages/es_419.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/fa_IR.json b/src/i18n/messages/fa_IR.json
index 8718b99f6e..d14a0aaa5b 100644
--- a/src/i18n/messages/fa_IR.json
+++ b/src/i18n/messages/fa_IR.json
@@ -172,8 +172,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json
index fbf533265c..bac78040a3 100644
--- a/src/i18n/messages/fr.json
+++ b/src/i18n/messages/fr.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/fr_CA.json b/src/i18n/messages/fr_CA.json
index bd49fb0741..e1c85405c4 100644
--- a/src/i18n/messages/fr_CA.json
+++ b/src/i18n/messages/fr_CA.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json
index a00ac08feb..98d259e4b0 100644
--- a/src/i18n/messages/hi.json
+++ b/src/i18n/messages/hi.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json
index a00ac08feb..98d259e4b0 100644
--- a/src/i18n/messages/it.json
+++ b/src/i18n/messages/it.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/it_IT.json b/src/i18n/messages/it_IT.json
index 8d00b24408..0a3d9f5b36 100644
--- a/src/i18n/messages/it_IT.json
+++ b/src/i18n/messages/it_IT.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json
index 702e1473fb..a32a995601 100644
--- a/src/i18n/messages/pt.json
+++ b/src/i18n/messages/pt.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.upload-button.alt": "chapter-upload-button",
"course-authoring.textbooks.form.delete-button.tooltip": "Delete",
"course-authoring.textbooks.form.delete-button.alt": "chapter-delete-button",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/pt_PT.json b/src/i18n/messages/pt_PT.json
index 676aec8fc5..19529be1a4 100644
--- a/src/i18n/messages/pt_PT.json
+++ b/src/i18n/messages/pt_PT.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json
index a00ac08feb..98d259e4b0 100644
--- a/src/i18n/messages/ru.json
+++ b/src/i18n/messages/ru.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/uk.json b/src/i18n/messages/uk.json
index a00ac08feb..98d259e4b0 100644
--- a/src/i18n/messages/uk.json
+++ b/src/i18n/messages/uk.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",
diff --git a/src/i18n/messages/zh_CN.json b/src/i18n/messages/zh_CN.json
index a00ac08feb..98d259e4b0 100644
--- a/src/i18n/messages/zh_CN.json
+++ b/src/i18n/messages/zh_CN.json
@@ -1150,8 +1150,6 @@
"course-authoring.textbooks.form.delete-modal.description": "Deleting a textbook cannot be undone and once deleted any reference to it in your courseware's navigation will also be removed.",
"course-authoring.course-unit.xblock.iframe.error.text": "Unit iframe failed to load. Server possibly returned 4xx or 5xx response.",
"course-authoring.course-unit.paste-component.btn.text": "Paste component",
- "course-authoring.course-unit.popover.content.text": "From:",
- "course-authoring.course-unit.paste-component.whats-in-clipboard.text": "What's in my clipboard?",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.title": "Files need to be updated manually.",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.description": "The following files must be updated manually for components to work as intended:",
"course-authoring.course-unit.paste-notification.has-conflicting-errors.button.text": "Upload files",