diff --git a/common/templates/xblock_v2/xblock_iframe.html b/common/templates/xblock_v2/xblock_iframe.html index 8b733373bd82..07d81b962a65 100644 --- a/common/templates/xblock_v2/xblock_iframe.html +++ b/common/templates/xblock_v2/xblock_iframe.html @@ -215,6 +215,16 @@ } return url; }, + notify: (eventName, data) => { + /** + * Used in `studio_view` to notify events and errors + **/ + window.parent.postMessage({ + type: 'xblock-event', + eventName, + data, + }, '*'); + } }; /** @@ -258,6 +268,25 @@ const blockJS = { element }; callback(blockJS); } + + if ('{{ view_name | safe }}' === 'studio_view') { + // Used when rendering the `studio_view`, in order to avoid open a new tab on click cancel or save + const selectors = [ + '.cancel-button', + '.save-button', + '.action-cancel', + '.action-save', + ]; + + for (const selector of selectors) { + const queryObject = document.querySelector(selector); + if (queryObject) { + queryObject.addEventListener('click', function() { + event.preventDefault(); + }); + } + } + } } // Recursively initialize the JavaScript code of each XBlock: diff --git a/openedx/core/djangoapps/xblock/rest_api/views.py b/openedx/core/djangoapps/xblock/rest_api/views.py index edcbf22e0d3d..a1fbd1e062a6 100644 --- a/openedx/core/djangoapps/xblock/rest_api/views.py +++ b/openedx/core/djangoapps/xblock/rest_api/views.py @@ -122,6 +122,7 @@ def embed_block_view(request, usage_key: UsageKeyV2, view_name: str): 'fragment': fragment, 'handler_urls_json': json.dumps(handler_urls), 'lms_root_url': lms_root_url, + 'view_name': view_name, 'is_development': settings.DEBUG, } response = render(request, 'xblock_v2/xblock_iframe.html', context, content_type='text/html') @@ -322,10 +323,6 @@ def post(self, request, usage_key, version: LatestVersion | int = LatestVersion. # Save after the callback so any changes made in the callback will get persisted. block.save() - # Signal that we've modified this block - context_impl = get_learning_context_impl(usage_key) - context_impl.send_block_updated_event(usage_key) - block_dict = { "id": str(block.usage_key), "display_name": get_block_display_name(block), # note this is also present in metadata diff --git a/openedx/core/djangoapps/xblock/runtime/learning_core_runtime.py b/openedx/core/djangoapps/xblock/runtime/learning_core_runtime.py index 44dedcf42874..c3885fbf11cc 100644 --- a/openedx/core/djangoapps/xblock/runtime/learning_core_runtime.py +++ b/openedx/core/djangoapps/xblock/runtime/learning_core_runtime.py @@ -314,6 +314,10 @@ def save_block(self, block): ) self.authored_data_store.mark_unchanged(block) + # Signal that we've modified this block + learning_context = get_learning_context_impl(usage_key) + learning_context.send_block_updated_event(usage_key) + def _get_component_from_usage_key(self, usage_key): """ Note that Components aren't ever really truly deleted, so this will