diff --git a/common/lib/xmodule/xmodule/tabs.py b/common/lib/xmodule/xmodule/tabs.py index 49d98c27ec..fbea4aa858 100644 --- a/common/lib/xmodule/xmodule/tabs.py +++ b/common/lib/xmodule/xmodule/tabs.py @@ -108,6 +108,13 @@ class CourseTab(object): """ raise NotImplementedError() + @property + def uses_bootstrap(self): + """ + Returns true if this tab is rendered with Bootstrap. + """ + return False + def get(self, key, default=None): """ Akin to the get method on Python dictionary objects, gracefully returns the value associated with the diff --git a/common/static/common/templates/discussion/customwmd-prompt.underscore b/common/static/common/templates/discussion/customwmd-prompt.underscore index 765919a736..a5e8fc3f85 100644 --- a/common/static/common/templates/discussion/customwmd-prompt.underscore +++ b/common/static/common/templates/discussion/customwmd-prompt.underscore @@ -44,8 +44,8 @@ %>
- - + +
diff --git a/common/static/common/templates/discussion/new-post.underscore b/common/static/common/templates/discussion/new-post.underscore index 3ccfcc742f..29ee79e998 100644 --- a/common/static/common/templates/discussion/new-post.underscore +++ b/common/static/common/templates/discussion/new-post.underscore @@ -2,7 +2,7 @@ class="thread-title"><%- gettext("Add a Post") %>> <% if (mode === 'inline') { %> - @@ -67,7 +67,7 @@ <% } %>
- - + +
diff --git a/common/static/common/templates/discussion/response-comment-edit.underscore b/common/static/common/templates/discussion/response-comment-edit.underscore index be36b57962..8460ffe50d 100644 --- a/common/static/common/templates/discussion/response-comment-edit.underscore +++ b/common/static/common/templates/discussion/response-comment-edit.underscore @@ -4,6 +4,6 @@
<%- body %>
- - + + diff --git a/common/static/common/templates/discussion/thread-edit.underscore b/common/static/common/templates/discussion/thread-edit.underscore index 856b73f2ea..25d6f457ba 100644 --- a/common/static/common/templates/discussion/thread-edit.underscore +++ b/common/static/common/templates/discussion/thread-edit.underscore @@ -14,5 +14,5 @@

<%- gettext('Edit your post below.') %>

<%- body %>
- - + + diff --git a/common/static/common/templates/discussion/thread-response-edit.underscore b/common/static/common/templates/discussion/thread-response-edit.underscore index e3a516d94b..97f7387eeb 100644 --- a/common/static/common/templates/discussion/thread-response-edit.underscore +++ b/common/static/common/templates/discussion/thread-response-edit.underscore @@ -4,6 +4,6 @@
<%- body %>
- - + + diff --git a/common/static/common/templates/discussion/thread-response.underscore b/common/static/common/templates/discussion/thread-response.underscore index 2b80d0cfac..a6934b35dc 100644 --- a/common/static/common/templates/discussion/thread-response.underscore +++ b/common/static/common/templates/discussion/thread-response.underscore @@ -15,7 +15,7 @@
- +
<% } %> diff --git a/common/static/common/templates/discussion/thread.underscore b/common/static/common/templates/discussion/thread.underscore index 9654470f97..8205854fc8 100644 --- a/common/static/common/templates/discussion/thread.underscore +++ b/common/static/common/templates/discussion/thread.underscore @@ -10,7 +10,7 @@
<% if (!readOnly) { %>
-
@@ -29,7 +29,7 @@
- +
<% } %> diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 57b29386a0..51e24103cf 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -554,11 +554,11 @@ class CourseTabView(EdxFragmentView): log.exception("Error while rendering courseware-error page") raise - def uses_bootstrap(self, request, course): + def uses_bootstrap(self, request, course, tab): """ Returns true if this view uses Bootstrap. """ - return False + return tab.uses_bootstrap def create_page_context(self, request, course=None, tab=None, **kwargs): """ @@ -566,7 +566,7 @@ class CourseTabView(EdxFragmentView): """ staff_access = has_access(request.user, 'staff', course) supports_preview_menu = tab.get('supports_preview_menu', False) - uses_bootstrap = self.uses_bootstrap(request, course) + uses_bootstrap = self.uses_bootstrap(request, course, tab=tab) if supports_preview_menu: masquerade, masquerade_user = setup_masquerade(request, course.id, staff_access, reset_masquerade_data=True) request.user = masquerade_user @@ -610,8 +610,9 @@ class CourseTabView(EdxFragmentView): """ if not page_context: page_context = self.create_page_context(request, course=course, tab=tab, **kwargs) + tab = page_context['tab'] page_context['fragment'] = fragment - if self.uses_bootstrap(request, course): + if self.uses_bootstrap(request, course, tab=tab): return render_to_response('courseware/tab-view.html', page_context) else: return render_to_response('courseware/tab-view-v2.html', page_context) diff --git a/lms/djangoapps/discussion/__init__.py b/lms/djangoapps/discussion/__init__.py index e69de29bb2..2ab03ad9fc 100644 --- a/lms/djangoapps/discussion/__init__.py +++ b/lms/djangoapps/discussion/__init__.py @@ -0,0 +1,11 @@ +""" +Discussion settings and flags. +""" + +from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace + +# Namespace for course experience waffle flags. +WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='edx_discussions') + +# Waffle flag to enable the use of Bootstrap +USE_BOOTSTRAP_FLAG = WaffleFlag(WAFFLE_FLAG_NAMESPACE, 'use_bootstrap') diff --git a/lms/djangoapps/discussion/plugins.py b/lms/djangoapps/discussion/plugins.py index 77037d41a2..fc4866cd28 100644 --- a/lms/djangoapps/discussion/plugins.py +++ b/lms/djangoapps/discussion/plugins.py @@ -9,6 +9,8 @@ import django_comment_client.utils as utils from courseware.tabs import EnrolledTab from xmodule.tabs import TabFragmentViewMixin +from . import USE_BOOTSTRAP_FLAG + class DiscussionTab(TabFragmentViewMixin, EnrolledTab): """ @@ -30,3 +32,10 @@ class DiscussionTab(TabFragmentViewMixin, EnrolledTab): if not super(DiscussionTab, cls).is_enabled(course, user): return False return utils.is_discussion_enabled(course.id) + + @property + def uses_bootstrap(self): + """ + Returns true if this tab is rendered with Bootstrap. + """ + return USE_BOOTSTRAP_FLAG.is_enabled() diff --git a/lms/djangoapps/discussion/static/discussion/js/discussion_router.js b/lms/djangoapps/discussion/static/discussion/js/discussion_router.js index 353ff0de03..4175f49646 100644 --- a/lms/djangoapps/discussion/static/discussion/js/discussion_router.js +++ b/lms/djangoapps/discussion/static/discussion/js/discussion_router.js @@ -65,7 +65,6 @@ }, allThreads: function() { - this.discussionBoardView.updateSidebar(); return this.discussionBoardView.goHome(); }, @@ -106,9 +105,6 @@ is_commentable_divided: this.discussion.is_commentable_divided }); this.main.render(); - this.main.on('thread:responses:rendered', function() { - return self.discussionBoardView.updateSidebar(); - }); return this.thread.on('thread:thread_type_updated', this.showMain); }, diff --git a/lms/djangoapps/discussion/static/discussion/js/views/discussion_board_view.js b/lms/djangoapps/discussion/static/discussion/js/views/discussion_board_view.js index 02ccf6c900..c2dafffd24 100644 --- a/lms/djangoapps/discussion/static/discussion/js/views/discussion_board_view.js +++ b/lms/djangoapps/discussion/static/discussion/js/views/discussion_board_view.js @@ -53,7 +53,6 @@ el: this.$('.forum-search') }).render(); this.renderBreadcrumbs(); - $(window).bind('load scroll resize', _.bind(this.updateSidebar, this)); this.showBrowseMenu(true); return this; }, @@ -88,7 +87,6 @@ $('.forum-nav-browse-filter-input').focus(); this.filterInputReset(); } - this.updateSidebar(); } }, @@ -101,7 +99,6 @@ if (this.selectedTopicId !== 'undefined') { this.$('.forum-nav-browse-filter-input').attr('aria-activedescendant', this.selectedTopicId); } - this.updateSidebar(); } }, @@ -135,37 +132,6 @@ this.discussionThreadListView.clearSearchAlerts(); }, - updateSidebar: function() { - var amount, browseFilterHeight, discussionBottomOffset, discussionsBodyBottom, - discussionsBodyTop, headerHeight, refineBarHeight, scrollTop, sidebarHeight, topOffset, - windowHeight, $discussionBody, $sidebar; - scrollTop = $(window).scrollTop(); - windowHeight = $(window).height(); - $discussionBody = this.$('.discussion-column'); - discussionsBodyTop = $discussionBody[0] ? $discussionBody.offset().top : undefined; - discussionsBodyBottom = discussionsBodyTop + $discussionBody.outerHeight(); - $sidebar = this.$('.forum-nav'); - if (scrollTop > discussionsBodyTop - this.sidebar_padding) { - $sidebar.css('top', scrollTop - discussionsBodyTop + this.sidebar_padding); - } else { - $sidebar.css('top', '0'); - } - sidebarHeight = windowHeight - Math.max(discussionsBodyTop - scrollTop, this.sidebar_padding); - topOffset = scrollTop + windowHeight; - discussionBottomOffset = discussionsBodyBottom + this.sidebar_padding; - amount = Math.max(topOffset - discussionBottomOffset, 0); - sidebarHeight = sidebarHeight - this.sidebar_padding - amount; - sidebarHeight = Math.min(sidebarHeight + 1, $discussionBody.outerHeight()); - $sidebar.css('height', sidebarHeight); - headerHeight = this.$('.forum-nav-header').outerHeight(); - refineBarHeight = this.$('.forum-nav-refine-bar').outerHeight(); - browseFilterHeight = this.$('.forum-nav-browse-filter').outerHeight(); - this.$('.forum-nav-thread-list') - .css('height', (sidebarHeight - headerHeight - refineBarHeight - 2) + 'px'); - this.$('.forum-nav-browse-menu') - .css('height', (sidebarHeight - headerHeight - browseFilterHeight - 2) + 'px'); - }, - goHome: function() { var url = DiscussionUtil.urlFor('notifications_status', window.user.get('id')); HtmlUtils.append(this.$('.forum-content').empty(), HtmlUtils.template(discussionHomeTemplate)({})); diff --git a/lms/djangoapps/discussion/static/discussion/templates/search.underscore b/lms/djangoapps/discussion/static/discussion/templates/search.underscore index e0239c8ad4..d7e724cce9 100644 --- a/lms/djangoapps/discussion/static/discussion/templates/search.underscore +++ b/lms/djangoapps/discussion/static/discussion/templates/search.underscore @@ -1,9 +1,9 @@ " /> - + diff --git a/lms/djangoapps/discussion/templates/discussion/discussion_board_fragment.html b/lms/djangoapps/discussion/templates/discussion/discussion_board_fragment.html index 94dc0052b2..bad1389b1b 100644 --- a/lms/djangoapps/discussion/templates/discussion/discussion_board_fragment.html +++ b/lms/djangoapps/discussion/templates/discussion/discussion_board_fragment.html @@ -15,7 +15,7 @@ from openedx.core.djangolib.js_utils import dump_js_escaped_json, js_escaped_str from openedx.core.djangolib.markup import HTML %> -
- +
% endif ## Search box @@ -46,16 +46,15 @@ from openedx.core.djangolib.markup import HTML lang="${course.language}" % endif > -
- - -
+
+
+
diff --git a/lms/djangoapps/discussion/templates/discussion/discussion_profile_page.html b/lms/djangoapps/discussion/templates/discussion/discussion_profile_page.html index 75e9e5b05f..283ac87589 100644 --- a/lms/djangoapps/discussion/templates/discussion/discussion_profile_page.html +++ b/lms/djangoapps/discussion/templates/discussion/discussion_profile_page.html @@ -51,7 +51,7 @@ from openedx.core.djangolib.js_utils import dump_js_escaped_json, js_escaped_str <%include file="../courseware/course_navigation.html" args="active_page='discussion'" /> <%block name="content"> -
+