From 6f460dd660e77921d04825958bab271154a284a8 Mon Sep 17 00:00:00 2001 From: PKulkoRaccoonGang Date: Tue, 26 Mar 2024 13:14:07 +0200 Subject: [PATCH 1/5] fix: [AXIMST-719] fixed xblock problems --- src/course-unit/course-xblock/xblock-content/XBlockContent.jsx | 2 +- .../xblock-content/iframe-wrapper/iframe-wrapper.js | 3 +++ src/course-unit/data/api.js | 2 +- src/course-unit/data/thunk.js | 1 - 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/course-unit/course-xblock/xblock-content/XBlockContent.jsx b/src/course-unit/course-xblock/xblock-content/XBlockContent.jsx index 39ec9e569c..8774b2a18f 100644 --- a/src/course-unit/course-xblock/xblock-content/XBlockContent.jsx +++ b/src/course-unit/course-xblock/xblock-content/XBlockContent.jsx @@ -111,7 +111,7 @@ const XBlockContent = ({ referrerPolicy="origin" frameBorder={0} scrolling="no" - onLoad={() => setIsLoading(!isLoading)} + onLoad={() => setIsLoading(false)} sandbox={[ 'allow-forms', 'allow-modals', diff --git a/src/course-unit/course-xblock/xblock-content/iframe-wrapper/iframe-wrapper.js b/src/course-unit/course-xblock/xblock-content/iframe-wrapper/iframe-wrapper.js index 08482d7693..77e7f2d45b 100644 --- a/src/course-unit/course-xblock/xblock-content/iframe-wrapper/iframe-wrapper.js +++ b/src/course-unit/course-xblock/xblock-content/iframe-wrapper/iframe-wrapper.js @@ -62,6 +62,9 @@ export default function wrapBlockHtmlForIFrame(html, sourceResources, studioBase + + + diff --git a/src/course-unit/data/api.js b/src/course-unit/data/api.js index d4b49e7455..b7b6c6127e 100644 --- a/src/course-unit/data/api.js +++ b/src/course-unit/data/api.js @@ -172,7 +172,7 @@ export async function setXBlockOrderList(blockId, children) { export async function getXBlockIFrameData(itemId) { const { data } = await getAuthenticatedHttpClient() .get(getXBlockContainerPreview(itemId)); - + console.log('DATA ===>', data); return camelCaseObject(data); } diff --git a/src/course-unit/data/thunk.js b/src/course-unit/data/thunk.js index 8dca7e9c73..45ff791e35 100644 --- a/src/course-unit/data/thunk.js +++ b/src/course-unit/data/thunk.js @@ -273,7 +273,6 @@ export function setXBlockOrderListQuery(blockId, xblockListIds, restoreCallback) export function fetchXBlockIFrameHtmlAndResourcesQuery(xblockId) { return async (dispatch) => { dispatch(updateSavingStatus({ status: RequestStatus.PENDING })); - dispatch(showProcessingNotification(NOTIFICATION_MESSAGES.adding)); try { const xblockIFrameData = await getXBlockIFrameData(xblockId); From ea82d85974a7626e25377a577c130feedcd6133d Mon Sep 17 00:00:00 2001 From: PKulkoRaccoonGang Date: Tue, 26 Mar 2024 15:57:59 +0200 Subject: [PATCH 2/5] fix: added asset and static replacer --- .../xblock-content/iframe-wrapper/iframe-wrapper.js | 6 +++--- .../xblock-content/iframe-wrapper/static/XBlockIFrame.css | 4 ++++ src/course-unit/data/api.js | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/course-unit/course-xblock/xblock-content/iframe-wrapper/iframe-wrapper.js b/src/course-unit/course-xblock/xblock-content/iframe-wrapper/iframe-wrapper.js index 77e7f2d45b..53691603c5 100644 --- a/src/course-unit/course-xblock/xblock-content/iframe-wrapper/iframe-wrapper.js +++ b/src/course-unit/course-xblock/xblock-content/iframe-wrapper/iframe-wrapper.js @@ -249,13 +249,13 @@ export default function wrapBlockHtmlForIFrame(html, sourceResources, studioBase modifiedHtml = modifyVoidHrefToPreventDefault(html); // Due to the use of edx-platform scripts in MFE, it is necessary to ensure that the paths for static files // and important data-attributes are correct. - modifiedHtml = modifiedHtml.replace(/url\('\/assets/g, `url('${studioBaseUrl}/assets`); + modifiedHtml = modifiedHtml.replace(/url\('\/asset/g, `url('${studioBaseUrl}/asset`); modifiedHtml = modifiedHtml.replace(/src="\/asset/g, `src="${studioBaseUrl}/asset`); modifiedHtml = modifiedHtml.replace(/src="\/asset/g, `src="${studioBaseUrl}/asset`); modifiedHtml = modifiedHtml.replace(/href="\/asset/g, `href="${studioBaseUrl}/asset`); - modifiedHtml = modifiedHtml.replace(/src="\/static\/studio/g, `src="${studioBaseUrl}/static/studio`); + modifiedHtml = modifiedHtml.replace(/src="\/static/g, `src="${studioBaseUrl}/static`); modifiedHtml = modifiedHtml.replace(/src="\/static/g, `src="${studioBaseUrl}/static`); - modifiedHtml = modifiedHtml.replace(/data-target="\/preview\/xblock/g, `data-target="${studioBaseUrl}/preview/xblock`); + modifiedHtml = modifiedHtml.replace(/data-target="\/preview/g, `data-target="${studioBaseUrl}/preview`); modifiedHtml = modifiedHtml.replace(/data-url="\/preview/g, `data-url="${studioBaseUrl}/preview`); modifiedHtml = modifiedHtml.replace(/src="\/media/g, `src="${studioBaseUrl}/media`); diff --git a/src/course-unit/course-xblock/xblock-content/iframe-wrapper/static/XBlockIFrame.css b/src/course-unit/course-xblock/xblock-content/iframe-wrapper/static/XBlockIFrame.css index 9a2dcfb34e..da5fdc2ffd 100644 --- a/src/course-unit/course-xblock/xblock-content/iframe-wrapper/static/XBlockIFrame.css +++ b/src/course-unit/course-xblock/xblock-content/iframe-wrapper/static/XBlockIFrame.css @@ -5,3 +5,7 @@ .wrapper-xblock { border: none; } + +body .poll-block-form-wrapper { + display: block; +} diff --git a/src/course-unit/data/api.js b/src/course-unit/data/api.js index b7b6c6127e..f93377467b 100644 --- a/src/course-unit/data/api.js +++ b/src/course-unit/data/api.js @@ -179,5 +179,5 @@ export async function getXBlockIFrameData(itemId) { export const getHandlerUrl = async (blockId) => { const baseUrl = getConfig().STUDIO_BASE_URL; - return `${baseUrl}/xblock/${blockId}/handler/handler_name`; + return `${baseUrl}/preview/xblock/${blockId}/handler/handler_name`; }; From dcbe89590cdba7126a988dc2e3538b528051c4d7 Mon Sep 17 00:00:00 2001 From: PKulkoRaccoonGang Date: Wed, 27 Mar 2024 13:35:39 +0200 Subject: [PATCH 3/5] feat: added style extractor --- .../course-xblock/CourseXBlock.jsx | 19 ++++++++ .../xblock-content/XBlockContent.jsx | 5 +- .../iframe-wrapper/iframe-wrapper.js | 47 +++++++++++++++---- 3 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/course-unit/course-xblock/CourseXBlock.jsx b/src/course-unit/course-xblock/CourseXBlock.jsx index eb774aef4b..81383554dd 100644 --- a/src/course-unit/course-xblock/CourseXBlock.jsx +++ b/src/course-unit/course-xblock/CourseXBlock.jsx @@ -59,6 +59,24 @@ const CourseXBlock = ({ ? intl.formatMessage(messages.visibilityMessage, { selectedGroupsLabel: userPartitionInfo.selectedGroupsLabel }) : null; + const styleTagPattern = /]*>([\s\S]*?)<\/style>/gi; + + function extractStylesWithContent(htmlString) { + const matches = []; + let match = styleTagPattern.exec(htmlString); + + while (match !== null) { + matches.push(match[1]); // Pushing content of `).join('\n'); + } + return ``; + }) + .join('\n'); + let cssTags = generateResourceTags(cssUrls, studioBaseUrl, type); cssTags += sheets.map(sheet => ``).join('\n'); @@ -249,15 +259,29 @@ export default function wrapBlockHtmlForIFrame(html, sourceResources, studioBase modifiedHtml = modifyVoidHrefToPreventDefault(html); // Due to the use of edx-platform scripts in MFE, it is necessary to ensure that the paths for static files // and important data-attributes are correct. - modifiedHtml = modifiedHtml.replace(/url\('\/asset/g, `url('${studioBaseUrl}/asset`); - modifiedHtml = modifiedHtml.replace(/src="\/asset/g, `src="${studioBaseUrl}/asset`); - modifiedHtml = modifiedHtml.replace(/src="\/asset/g, `src="${studioBaseUrl}/asset`); - modifiedHtml = modifiedHtml.replace(/href="\/asset/g, `href="${studioBaseUrl}/asset`); - modifiedHtml = modifiedHtml.replace(/src="\/static/g, `src="${studioBaseUrl}/static`); - modifiedHtml = modifiedHtml.replace(/src="\/static/g, `src="${studioBaseUrl}/static`); - modifiedHtml = modifiedHtml.replace(/data-target="\/preview/g, `data-target="${studioBaseUrl}/preview`); - modifiedHtml = modifiedHtml.replace(/data-url="\/preview/g, `data-url="${studioBaseUrl}/preview`); - modifiedHtml = modifiedHtml.replace(/src="\/media/g, `src="${studioBaseUrl}/media`); + modifiedHtml = modifiedHtml.replaceAll('url('/asset', `url('${studioBaseUrl}/asset`); + modifiedHtml = modifiedHtml.replaceAll('src="/asset', `src="${studioBaseUrl}/asset`); + modifiedHtml = modifiedHtml.replaceAll('src="/asset', `src="${studioBaseUrl}/asset`); + modifiedHtml = modifiedHtml.replaceAll('href="/asset', `href="${studioBaseUrl}/asset`); + modifiedHtml = modifiedHtml.replaceAll('src="/static', `src="${studioBaseUrl}/static`); + modifiedHtml = modifiedHtml.replaceAll('src="/static', `src="${studioBaseUrl}/static`); + modifiedHtml = modifiedHtml.replaceAll('data-target="/preview', `data-target="${studioBaseUrl}/preview`); + modifiedHtml = modifiedHtml.replaceAll('data-url="/preview', `data-url="${studioBaseUrl}/preview`); + modifiedHtml = modifiedHtml.replaceAll('src="/preview', `src="${studioBaseUrl}/preview`); + modifiedHtml = modifiedHtml.replaceAll('src="/media', `src="${studioBaseUrl}/media`); + modifiedHtml = modifiedHtml.replaceAll(': "/asset', `: "${studioBaseUrl}/asset`); + modifiedHtml = modifiedHtml.replaceAll(': "/xblock', `: "${studioBaseUrl}/xblock`); + + // modifiedHtml = modifiedHtml.replaceAll('url('/asset', `url('${studioBaseUrl}/asset`); + // modifiedHtml = modifiedHtml.replaceAll('src="/asset', `src="${studioBaseUrl}/asset`); + // modifiedHtml = modifiedHtml.replaceAll('src=""/asset', `src=""${studioBaseUrl}/asset`); + // modifiedHtml = modifiedHtml.replaceAll('href="/asset', `href="${studioBaseUrl}/asset`); + // modifiedHtml = modifiedHtml.replaceAll('src=""/static', `src=""${studioBaseUrl}/static`); + // modifiedHtml = modifiedHtml.replaceAll('src="/static', `src="${studioBaseUrl}/static`); + // modifiedHtml = modifiedHtml.replaceAll('data-target="/preview', `data-target="${studioBaseUrl}/preview`); + // modifiedHtml = modifiedHtml.replaceAll('data-url="/preview', `data-url="${studioBaseUrl}/preview`); + // modifiedHtml = modifiedHtml.replaceAll('src="/preview', `src="${studioBaseUrl}/preview`); + // modifiedHtml = modifiedHtml.replaceAll('src="/media', `src="${studioBaseUrl}/media`); if ( type === COMPONENT_TYPES.discussion @@ -272,6 +296,7 @@ export default function wrapBlockHtmlForIFrame(html, sourceResources, studioBase ${legacyIncludes} ${cssTags} + ${additionalCSSTags}
@@ -301,6 +326,7 @@ export default function wrapBlockHtmlForIFrame(html, sourceResources, studioBase ${legacyIncludes} ${cssTags} + ${additionalCSSTags}
@@ -324,6 +350,7 @@ export default function wrapBlockHtmlForIFrame(html, sourceResources, studioBase ${legacyIncludes} ${cssTags} + ${additionalCSSTags} ${modifiedHtml} From 4aee493bd816ef744a1d57533b46d2d310e9d62e Mon Sep 17 00:00:00 2001 From: PKulkoRaccoonGang Date: Thu, 28 Mar 2024 12:12:58 +0200 Subject: [PATCH 4/5] refactor: code refactoring --- .../course-xblock/CourseXBlock.jsx | 17 ++-------------- src/course-unit/course-xblock/constants.js | 2 ++ src/course-unit/course-xblock/utils.js | 19 ++++++++++++++++++ .../xblock-content/XBlockContent.jsx | 3 +++ .../iframe-wrapper/iframe-wrapper.js | 20 ++++++++----------- src/course-unit/data/api.js | 2 +- 6 files changed, 35 insertions(+), 28 deletions(-) create mode 100644 src/course-unit/course-xblock/utils.js diff --git a/src/course-unit/course-xblock/CourseXBlock.jsx b/src/course-unit/course-xblock/CourseXBlock.jsx index 81383554dd..3775de90ae 100644 --- a/src/course-unit/course-xblock/CourseXBlock.jsx +++ b/src/course-unit/course-xblock/CourseXBlock.jsx @@ -33,6 +33,7 @@ import XBlockMessages from './xblock-messages/XBlockMessages'; import RenderErrorAlert from './render-error-alert'; import { XBlockContent } from './xblock-content'; import messages from './messages'; +import { extractStylesWithContent } from './utils'; const CourseXBlock = ({ id, title, type, unitXBlockActions, shouldScroll, userPartitionInfo, @@ -59,22 +60,8 @@ const CourseXBlock = ({ ? intl.formatMessage(messages.visibilityMessage, { selectedGroupsLabel: userPartitionInfo.selectedGroupsLabel }) : null; - const styleTagPattern = /]*>([\s\S]*?)<\/style>/gi; - - function extractStylesWithContent(htmlString) { - const matches = []; - let match = styleTagPattern.exec(htmlString); - - while (match !== null) { - matches.push(match[1]); // Pushing content of `).join('\n'); - } - return ``; - }) - .join('\n'); + const additionalCssTags = stylesWithContent.flatMap(sheet => ``).join('\n'); let cssTags = generateResourceTags(cssUrls, studioBaseUrl, type); cssTags += sheets.map(sheet => ``).join('\n'); @@ -263,21 +255,29 @@ export default function wrapBlockHtmlForIFrame( let result = ''; let modifiedHtml = ''; - modifiedHtml = modifyVoidHrefToPreventDefault(html); // Due to the use of edx-platform scripts in MFE, it is necessary to ensure that the paths for static files // and important data-attributes are correct. - modifiedHtml = modifiedHtml.replaceAll('url('/asset', `url('${studioBaseUrl}/asset`); - modifiedHtml = modifiedHtml.replaceAll('src="/asset', `src="${studioBaseUrl}/asset`); - modifiedHtml = modifiedHtml.replaceAll('src="/asset', `src="${studioBaseUrl}/asset`); - modifiedHtml = modifiedHtml.replaceAll('href="/asset', `href="${studioBaseUrl}/asset`); - modifiedHtml = modifiedHtml.replaceAll('src="/static', `src="${studioBaseUrl}/static`); - modifiedHtml = modifiedHtml.replaceAll('src="/static', `src="${studioBaseUrl}/static`); - modifiedHtml = modifiedHtml.replaceAll('data-target="/preview', `data-target="${studioBaseUrl}/preview`); - modifiedHtml = modifiedHtml.replaceAll('data-url="/preview', `data-url="${studioBaseUrl}/preview`); - modifiedHtml = modifiedHtml.replaceAll('src="/preview', `src="${studioBaseUrl}/preview`); - modifiedHtml = modifiedHtml.replaceAll('src="/media', `src="${studioBaseUrl}/media`); - modifiedHtml = modifiedHtml.replaceAll(': "/asset', `: "${studioBaseUrl}/asset`); - modifiedHtml = modifiedHtml.replaceAll(': "/xblock', `: "${studioBaseUrl}/xblock`); + const relativeToAbsoluteXBlocksUrls = { + 'url('/asset': `url('${studioBaseUrl}/asset`, + 'src="/asset': `src="${studioBaseUrl}/asset`, + 'src="/asset': `src="${studioBaseUrl}/asset`, + 'href="/asset': `href="${studioBaseUrl}/asset`, + 'src="/static': `src="${studioBaseUrl}/static`, + 'src="/static': `src="${studioBaseUrl}/static`, + 'data-target="/preview': `data-target="${studioBaseUrl}/preview`, + 'data-url="/preview': `data-url="${studioBaseUrl}/preview`, + 'src="/preview': `src="${studioBaseUrl}/preview`, + 'src="/media': `src="${studioBaseUrl}/media`, + ': "/asset': `: "${studioBaseUrl}/asset`, + ': "/xblock': `: "${studioBaseUrl}/xblock`, + }; + + modifiedHtml = modifyVoidHrefToPreventDefault(html); + + // Block that replaces relative urls with absolute urls + Object.entries(relativeToAbsoluteXBlocksUrls).forEach(([key, value]) => { + modifiedHtml = modifiedHtml.replaceAll(key, value); + }); if ( type === COMPONENT_TYPES.discussion @@ -292,7 +292,7 @@ export default function wrapBlockHtmlForIFrame( ${legacyIncludes} ${cssTags} - ${additionalCSSTags} + ${additionalCssTags}
@@ -322,7 +322,7 @@ export default function wrapBlockHtmlForIFrame( ${legacyIncludes} ${cssTags} - ${additionalCSSTags} + ${additionalCssTags}
@@ -346,7 +346,7 @@ export default function wrapBlockHtmlForIFrame( ${legacyIncludes} ${cssTags} - ${additionalCSSTags} + ${additionalCssTags} ${modifiedHtml}