<% if (!readOnly) { %>
-
@@ -29,7 +29,7 @@
- <%- gettext("Submit") %>
+ <%- gettext("Submit") %>
<% } %>
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 @@
"
/>
-
<%- gettext("Search") %>
+
<%- gettext("Search") %>
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
%>
-
- ${_("Add a Post")}
+ ${_("Add a Post")}
% endif
## Search box
@@ -46,16 +46,15 @@ from openedx.core.djangolib.markup import HTML
lang="${course.language}"
% endif
>
-