diff --git a/cms/static/js/factories/xblock_validation.js b/cms/static/js/factories/xblock_validation.js index 14ed40a953..4bcfc3b339 100644 --- a/cms/static/js/factories/xblock_validation.js +++ b/cms/static/js/factories/xblock_validation.js @@ -1,12 +1,16 @@ define(['js/views/xblock_validation', 'js/models/xblock_validation'], function(XBlockValidationView, XBlockValidationModel) { 'use strict'; - return function(validationMessages, hasEditingUrl, isRoot, validationEle) { + return function(validationMessages, hasEditingUrl, isRoot, isUnit, validationEle) { + var model, response; + if (hasEditingUrl && !isRoot) { validationMessages.showSummaryOnly = true; } + response = validationMessages; + response.isUnit = isUnit; - var model = new XBlockValidationModel(validationMessages, {parse: true}); + model = new XBlockValidationModel(response, {parse: true}); if (!model.get('empty')) { new XBlockValidationView({el: validationEle, model: model, root: isRoot}).render(); diff --git a/cms/static/js/models/xblock_validation.js b/cms/static/js/models/xblock_validation.js index 7f913668d7..bdfe645f78 100644 --- a/cms/static/js/models/xblock_validation.js +++ b/cms/static/js/models/xblock_validation.js @@ -19,7 +19,11 @@ define(['backbone', 'gettext', 'underscore'], function(Backbone, gettext, _) { var summary = 'summary' in response ? response.summary : {}; var messages = 'messages' in response ? response.messages : []; if (!summary.text) { - summary.text = gettext('This component has validation issues.'); + if (response.isUnit) { + summary.text = gettext('This unit has validation issues.'); + } else { + summary.text = gettext('This component has validation issues.'); + } } if (!summary.type) { summary.type = this.WARNING; diff --git a/cms/static/js/spec/factories/xblock_validation_spec.js b/cms/static/js/spec/factories/xblock_validation_spec.js index 7f5dc1182f..23cbcbc0e1 100644 --- a/cms/static/js/spec/factories/xblock_validation_spec.js +++ b/cms/static/js/spec/factories/xblock_validation_spec.js @@ -1,22 +1,22 @@ define(['jquery', 'js/factories/xblock_validation', 'common/js/spec_helpers/template_helpers'], function($, XBlockValidationFactory, TemplateHelpers) { describe('XBlockValidationFactory', function() { - var messageDiv; + var $messageDiv; beforeEach(function() { TemplateHelpers.installTemplate('xblock-validation-messages'); appendSetFixtures($('
')); - messageDiv = $('.messages'); + $messageDiv = $('.messages'); }); it('Does not attach a view if messages is empty', function() { - XBlockValidationFactory({'empty': true}, false, false, messageDiv); - expect(messageDiv.children().length).toEqual(0); + XBlockValidationFactory({empty: true}, false, false, false, $messageDiv); + expect($messageDiv.children().length).toEqual(0); }); it('Does attach a view if messages are not empty', function() { - XBlockValidationFactory({'empty': false}, false, false, messageDiv); - expect(messageDiv.children().length).toEqual(1); + XBlockValidationFactory({empty: false}, false, false, false, $messageDiv); + expect($messageDiv.children().length).toEqual(1); }); it('Passes through the root property to the view.', function() { @@ -29,12 +29,12 @@ define(['jquery', 'js/factories/xblock_validation', 'common/js/spec_helpers/temp 'xblock_id': 'id' }; // Root is false, will not add noContainerContent. - XBlockValidationFactory(notConfiguredMessages, true, false, messageDiv); - expect(messageDiv.find('.validation')).not.toHaveClass(noContainerContent); + XBlockValidationFactory(notConfiguredMessages, true, false, false, $messageDiv); + expect($messageDiv.find('.validation')).not.toHaveClass(noContainerContent); // Root is true, will add noContainerContent. - XBlockValidationFactory(notConfiguredMessages, true, true, messageDiv); - expect(messageDiv.find('.validation')).toHaveClass(noContainerContent); + XBlockValidationFactory(notConfiguredMessages, true, true, false, $messageDiv); + expect($messageDiv.find('.validation')).toHaveClass(noContainerContent); }); describe('Controls display of detailed messages based on url and root property', function() { @@ -50,25 +50,25 @@ define(['jquery', 'js/factories/xblock_validation', 'common/js/spec_helpers/temp }); checkDetailedMessages = function(expectedDetailedMessages) { - expect(messageDiv.children().length).toEqual(1); - expect(messageDiv.find('.xblock-message-item').length).toBe(expectedDetailedMessages); + expect($messageDiv.children().length).toEqual(1); + expect($messageDiv.find('.xblock-message-item').length).toBe(expectedDetailedMessages); }; it('Does not show details if xblock has an editing URL and it is not rendered as root', function() { - XBlockValidationFactory(messagesWithSummary, true, false, messageDiv); + XBlockValidationFactory(messagesWithSummary, true, false, false, $messageDiv); checkDetailedMessages(0); }); it('Shows details if xblock does not have its own editing URL, regardless of root value', function() { - XBlockValidationFactory(messagesWithSummary, false, false, messageDiv); + XBlockValidationFactory(messagesWithSummary, false, false, false, $messageDiv); checkDetailedMessages(2); - XBlockValidationFactory(messagesWithSummary, false, true, messageDiv); + XBlockValidationFactory(messagesWithSummary, false, true, false, $messageDiv); checkDetailedMessages(2); }); it('Shows details if xblock has its own editing URL and is rendered as root', function() { - XBlockValidationFactory(messagesWithSummary, true, true, messageDiv); + XBlockValidationFactory(messagesWithSummary, true, true, false, $messageDiv); checkDetailedMessages(2); }); }); diff --git a/cms/templates/studio_xblock_wrapper.html b/cms/templates/studio_xblock_wrapper.html index fea81c1e5f..66afb2aee9 100644 --- a/cms/templates/studio_xblock_wrapper.html +++ b/cms/templates/studio_xblock_wrapper.html @@ -3,6 +3,7 @@ from django.utils.translation import ugettext as _ from contentstore.views.helpers import xblock_studio_url from contentstore.utils import is_visible_to_specific_partition_groups +from lms.lib.utils import is_unit from openedx.core.djangolib.js_utils import ( dump_js_escaped_json, js_escaped_string ) @@ -14,6 +15,7 @@ section_class = "level-nesting" if show_inline else "level-element" collapsible_class = "is-collapsible" if xblock.has_children else "" label = xblock.display_name_with_default or xblock.scope_ids.block_type messages = xblock.validate().to_json() +block_is_unit = is_unit(xblock) %> <%namespace name='static' file='static_content.html'/> @@ -30,6 +32,7 @@ messages = xblock.validate().to_json() ${messages | n, dump_js_escaped_json}, ${bool(xblock_url) | n, dump_js_escaped_json}, // xblock_url will be None or a string ${bool(is_root) | n, dump_js_escaped_json}, // is_root will be None or a boolean + ${bool(block_is_unit) | n, dump_js_escaped_json}, // block_is_unit will be None or a boolean $('div.xblock-validation-messages[data-locator="${xblock.location | n, js_escaped_string}"]') ); }); diff --git a/cms/templates/visibility_editor.html b/cms/templates/visibility_editor.html index 98e8efcc68..191049024c 100644 --- a/cms/templates/visibility_editor.html +++ b/cms/templates/visibility_editor.html @@ -4,6 +4,7 @@ from django.conf import settings from django.utils.translation import ugettext as _ from contentstore.utils import ancestor_has_staff_lock, get_visibility_partition_info from openedx.core.djangolib.markup import HTML, Text +from lms.lib.utils import is_unit partition_info = get_visibility_partition_info(xblock) selectable_partitions = partition_info["selectable_partitions"] @@ -11,18 +12,30 @@ selected_partition_index = partition_info["selected_partition_index"] selected_groups_label = partition_info["selected_groups_label"] is_staff_locked = ancestor_has_staff_lock(xblock) +block_is_unit = is_unit(xblock) %> -${_('Access to this component is not restricted, but visibility might be affected by inherited settings.')}
- % if settings.FEATURES.get('ENABLE_ENROLLMENT_TRACK_USER_PARTITION'): -${_('You can restrict access to this component to learners in specific enrollment tracks or content groups.')}
+ % if block_is_unit: +${_('Access to this unit is not restricted, but visibility might be affected by inherited settings.')}
% else: -${_('You can restrict access to this component to learners in specific content groups.')}
+${_('Access to this component is not restricted, but visibility might be affected by inherited settings.')}
+ %endif + % if settings.FEATURES.get('ENABLE_ENROLLMENT_TRACK_USER_PARTITION'): + % if block_is_unit: +${_('You can restrict access to this unit to learners in specific enrollment tracks or content groups.')}
+ % else: +${_('You can restrict access to this component to learners in specific enrollment tracks or content groups.')}
+ % endif + % else: + % if block_is_unit: +${_('You can restrict access to this unit to learners in specific content groups.')}
+ % else: +${_('You can restrict access to this component to learners in specific content groups.')}
+ % endif % endif