diff --git a/cms/djangoapps/contentstore/rest_api/v1/serializers/course_waffle_flags.py b/cms/djangoapps/contentstore/rest_api/v1/serializers/course_waffle_flags.py index c3e9342a1c95..46f8cebd140d 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/serializers/course_waffle_flags.py +++ b/cms/djangoapps/contentstore/rest_api/v1/serializers/course_waffle_flags.py @@ -21,6 +21,7 @@ class CourseWaffleFlagsSerializer(serializers.Serializer): use_new_import_page = serializers.SerializerMethodField() use_new_export_page = serializers.SerializerMethodField() use_new_files_uploads_page = serializers.SerializerMethodField() + use_new_pdf_editor = serializers.SerializerMethodField() use_new_video_uploads_page = serializers.SerializerMethodField() use_new_course_outline_page = serializers.SerializerMethodField() use_new_unit_page = serializers.SerializerMethodField() @@ -120,6 +121,12 @@ def get_use_new_files_uploads_page(self, obj): """ return True + def get_use_new_pdf_editor(self, obj): + """ + Method to get the use_new_pdf_editor switch + """ + return toggles.use_new_pdf_editor() + def get_use_new_video_uploads_page(self, obj): """ Method to get the use_new_video_uploads_page switch. diff --git a/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_course_waffle_flags.py b/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_course_waffle_flags.py index fd7b5882cf97..39783e191da4 100644 --- a/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_course_waffle_flags.py +++ b/cms/djangoapps/contentstore/rest_api/v1/views/tests/test_course_waffle_flags.py @@ -35,6 +35,7 @@ class CourseWaffleFlagsViewTest(CourseTestCase): "use_new_unit_page": True, "use_new_updates_page": True, "use_new_video_uploads_page": False, + "use_new_pdf_editor": True, "use_react_markdown_editor": False, "use_video_gallery_flow": False, "enable_course_optimizer_check_prev_run_links": False, diff --git a/cms/djangoapps/contentstore/toggles.py b/cms/djangoapps/contentstore/toggles.py index 7aadfe64e94d..b0c4ba032aca 100644 --- a/cms/djangoapps/contentstore/toggles.py +++ b/cms/djangoapps/contentstore/toggles.py @@ -105,6 +105,23 @@ def use_new_video_editor(course_key): return not LEGACY_STUDIO_VIDEO_EDITOR.is_enabled(course_key) +# .. toggle_name: legacy_studio.pdf_editor +# .. toggle_implementation: WaffleFlag +# .. toggle_default: False +# .. toggle_description: Use the PDF XBlock's studio_view instead of the new React-based editor. You may wish to do +# this if you run a custom PDF block. +# .. toggle_use_cases: opt_out +# .. toggle_creation_date: 2026-03-10 +LEGACY_STUDIO_PDF_EDITOR = WaffleFlag('legacy_studio.pdf_editor', __name__) + + +def use_new_pdf_editor(): + """ + Returns a boolean = true if new video editor is enabled + """ + return not LEGACY_STUDIO_PDF_EDITOR.is_enabled() + + # .. toggle_name: new_core_editors.use_video_gallery_flow # .. toggle_implementation: WaffleFlag # .. toggle_default: False diff --git a/cms/static/js/views/pages/container.js b/cms/static/js/views/pages/container.js index 7982740ad6b7..1a463b8b02b3 100644 --- a/cms/static/js/views/pages/container.js +++ b/cms/static/js/views/pages/container.js @@ -491,14 +491,14 @@ function($, _, Backbone, gettext, BasePage, if ($target.closest('button, a, input, label, .actions-list').length) { return; } - + var $wrapper = $target.closest('.studio-xblock-wrapper'); // Deselect all other xblocks this.$('.studio-xblock-wrapper.is-selected').not($wrapper).removeClass('is-selected'); $wrapper.toggleClass('is-selected'); - + if (this.options.isIframeEmbed) { const contentId = this.findXBlockElement(event.target).data('locator'); this.postMessageToParent({ @@ -540,10 +540,12 @@ function($, _, Backbone, gettext, BasePage, var useNewVideoEditor = primaryHeader.attr('use-new-editor-video'), blockType = primaryHeader.attr('data-block-type'); + var useNewPdfEditor = primaryHeader.attr('use-new-editor-pdf') if((blockType === 'html') || (useNewVideoEditor === 'True' && blockType === 'video') || (blockType === 'problem') + || (useNewPdfEditor && blockType === 'pdf') ) { var destinationUrl = primaryHeader.attr('authoring_MFE_base_url') + '/' + blockType diff --git a/cms/templates/container.html b/cms/templates/container.html index 047578be7595..09fcf19047e7 100644 --- a/cms/templates/container.html +++ b/cms/templates/container.html @@ -13,7 +13,7 @@ from django.utils.translation import gettext as _ from cms.djangoapps.contentstore.helpers import xblock_studio_url, xblock_type_display_name -from cms.djangoapps.contentstore.toggles import use_new_video_editor, use_video_gallery_flow +from cms.djangoapps.contentstore.toggles import use_new_pdf_editor, use_new_video_editor, use_video_gallery_flow from cms.djangoapps.contentstore.utils import get_editor_page_base_url from openedx.core.djangolib.js_utils import ( dump_js_escaped_json, js_escaped_string @@ -112,6 +112,7 @@ <% use_new_editor_video = use_new_video_editor(xblock_locator.course_key) +use_new_editor_pdf = use_new_pdf_editor() use_new_video_gallery_flow = use_video_gallery_flow() %> @@ -167,6 +168,7 @@