From acc3a045ca6680e6df8ede68cf2c354696d5c024 Mon Sep 17 00:00:00 2001 From: Brian Jacobel Date: Tue, 14 Feb 2017 14:46:58 -0500 Subject: [PATCH] Link outline subsections into the course --- .../xmodule/js/src/sequence/display.js | 11 ++++++- .../templates/sequence-breadcrumbs.underscore | 7 ++++ .../test/acceptance/pages/lms/courseware.py | 2 +- lms/djangoapps/courseware/static_tab.html | 33 +++++++++++++++++++ lms/djangoapps/courseware/tabs.py | 4 ++- lms/djangoapps/courseware/views/index.py | 6 +++- lms/djangoapps/courseware/views/views.py | 4 +-- .../sass/shared-v2/_course-outline.scss | 9 ++--- lms/templates/courseware/course-outline.html | 29 ---------------- lms/templates/courseware/courseware.html | 2 +- 10 files changed, 67 insertions(+), 40 deletions(-) create mode 100644 common/static/common/templates/sequence-breadcrumbs.underscore create mode 100644 lms/djangoapps/courseware/static_tab.html delete mode 100644 lms/templates/courseware/course-outline.html diff --git a/common/lib/xmodule/xmodule/js/src/sequence/display.js b/common/lib/xmodule/xmodule/js/src/sequence/display.js index 380eebcd9e..a0c1407943 100644 --- a/common/lib/xmodule/xmodule/js/src/sequence/display.js +++ b/common/lib/xmodule/xmodule/js/src/sequence/display.js @@ -268,7 +268,16 @@ this.updatePageTitle(); sequenceLinks = this.content_container.find('a.seqnav'); sequenceLinks.click(this.goto); - this.path.text(this.el.find('.nav-item.active').data('path')); + + edx.HtmlUtils.setHtml( + this.path, + edx.HtmlUtils.template($('#sequence-breadcrumbs-tpl').text())({ + courseId: this.el.parent().data('course-id'), + blockId: this.id, + pathText: this.el.find('.nav-item.active').data('path') + }) + ); + this.sr_container.focus(); } }; diff --git a/common/static/common/templates/sequence-breadcrumbs.underscore b/common/static/common/templates/sequence-breadcrumbs.underscore new file mode 100644 index 0000000000..c66e14b334 --- /dev/null +++ b/common/static/common/templates/sequence-breadcrumbs.underscore @@ -0,0 +1,7 @@ + + + <%- gettext('Return to course outline') %> + <%- gettext('Outline') %> + + > +<%- pathText %> diff --git a/common/test/acceptance/pages/lms/courseware.py b/common/test/acceptance/pages/lms/courseware.py index d3807324da..39e39ffea4 100644 --- a/common/test/acceptance/pages/lms/courseware.py +++ b/common/test/acceptance/pages/lms/courseware.py @@ -274,7 +274,7 @@ class CoursewarePage(CoursePage): @property def breadcrumb(self): """ Return the course tree breadcrumb shown above the sequential bar """ - return [part.strip() for part in self.q(css='.path').text[0].split('>')] + return [part.strip() for part in self.q(css='.path .position').text[0].split('>')] def unit_title_visible(self): """ Check if unit title is visible """ diff --git a/lms/djangoapps/courseware/static_tab.html b/lms/djangoapps/courseware/static_tab.html new file mode 100644 index 0000000000..3d977bc017 --- /dev/null +++ b/lms/djangoapps/courseware/static_tab.html @@ -0,0 +1,33 @@ +## mako + +<%page expression_filter="h"/> +<%! +from openedx.core.djangolib.markup import HTML +%> + +<%inherit file="/main.html" /> +<%block name="bodyclass">view-in-course view-statictab ${course.css_class or ''} +<%namespace name='static' file='/static_content.html'/> + +<%block name="headextra"> +<%static:css group='style-course-vendor'/> +<%static:css group='style-course'/> +${HTML(fragment.head_html())} + +<%block name="js_extra"> + +<%include file="/mathjax_include.html" args="disable_fast_preview=True"/> +${HTML(fragment.foot_html())} + + +<%block name="pagetitle">${tab['name']} | ${course.display_number_with_default} + +<%include file="/courseware/course_navigation.html" args="active_page=active_page" /> + +
+
+
+ ${HTML(fragment.body_html())} +
+
+
diff --git a/lms/djangoapps/courseware/tabs.py b/lms/djangoapps/courseware/tabs.py index b6b57b8760..22ebe9f357 100644 --- a/lms/djangoapps/courseware/tabs.py +++ b/lms/djangoapps/courseware/tabs.py @@ -10,6 +10,7 @@ from django.utils.translation import ugettext as _, ugettext_noop from courseware.access import has_access from courseware.entrance_exams import user_must_complete_entrance_exam from openedx.core.lib.course_tabs import CourseTabPluginManager +from request_cache.middleware import RequestCache from student.models import CourseEnrollment from xmodule.tabs import CourseTab, CourseTabList, key_checker, link_reverse_func @@ -41,7 +42,8 @@ class CoursewareTab(EnrolledTab): """ Returns a function that computes the URL for this tab. """ - if waffle.switch_is_active('unified_course_view'): + request = RequestCache.get_current_request() + if waffle.flag_is_active(request, 'unified_course_view'): return link_reverse_func('unified_course_view') else: return link_reverse_func('courseware') diff --git a/lms/djangoapps/courseware/views/index.py b/lms/djangoapps/courseware/views/index.py index 40a36cee54..f7808b41e1 100644 --- a/lms/djangoapps/courseware/views/index.py +++ b/lms/djangoapps/courseware/views/index.py @@ -21,12 +21,14 @@ from edxmako.shortcuts import render_to_response, render_to_string import logging import newrelic.agent import urllib +import waffle from xblock.fragment import Fragment from opaque_keys.edx.keys import CourseKey from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY from openedx.core.djangoapps.user_api.preferences.api import get_user_preference from openedx.core.djangoapps.crawlers.models import CrawlersConfig +from request_cache.middleware import RequestCache from shoppingcart.models import CourseRegistrationCode from student.models import CourseEnrollment from student.views import is_course_blocked @@ -396,6 +398,7 @@ class CoursewareIndex(View): Returns and creates the rendering context for the courseware. Also returns the table of contents for the courseware. """ + request = RequestCache.get_current_request() courseware_context = { 'csrf': csrf(self.request)['csrf_token'], 'COURSE_TITLE': self.course.display_name_with_default_escaped, @@ -411,7 +414,8 @@ class CoursewareIndex(View): 'language_preference': self._get_language_preference(), 'disable_optimizely': True, 'section_title': None, - 'sequence_title': None + 'sequence_title': None, + 'disable_accordion': waffle.flag_is_active(request, 'unified_course_view') } table_of_contents = toc_for_course( self.effective_user, diff --git a/lms/djangoapps/courseware/views/views.py b/lms/djangoapps/courseware/views/views.py index 13ac3f88ef..500a93eaf1 100644 --- a/lms/djangoapps/courseware/views/views.py +++ b/lms/djangoapps/courseware/views/views.py @@ -1680,7 +1680,7 @@ class CourseOutlineFragmentView(FragmentView): return block - def render_fragment(self, request, course_id=None): + def render_fragment(self, request, course_id=None, **kwargs): """ Renders the course outline as a fragment. """ @@ -1704,5 +1704,5 @@ class CourseOutlineFragmentView(FragmentView): # Recurse through the block tree, fleshing out each child object 'blocks': self.populate_children(course_block_tree, all_blocks['blocks']) } - html = render_to_string('courseware/course-outline.html', context) + html = render_to_string('courseware/course_outline.html', context) return Fragment(html) diff --git a/lms/static/sass/shared-v2/_course-outline.scss b/lms/static/sass/shared-v2/_course-outline.scss index 8bf1ea112d..819c1a9ee1 100644 --- a/lms/static/sass/shared-v2/_course-outline.scss +++ b/lms/static/sass/shared-v2/_course-outline.scss @@ -1,21 +1,22 @@ .course-outline { color: $lms-gray; - ul { + ol { margin: 0 $baseline; list-style: none; - > ul { + > ol { @include margin-left($baseline / 2); } - li.section-name { + div.section-name { @include padding($baseline * 0.75, $baseline * 0.75, $baseline * 0.75, $baseline / 4); background-color: $lms-background-color; border-top: 1px solid $lms-border-color; + margin-bottom: $baseline * 0.5; } - ul.outline-item { + ol.outline-item { @include margin-left($baseline); padding-bottom: ($baseline / 2); diff --git a/lms/templates/courseware/course-outline.html b/lms/templates/courseware/course-outline.html deleted file mode 100644 index 66af18f66a..0000000000 --- a/lms/templates/courseware/course-outline.html +++ /dev/null @@ -1,29 +0,0 @@ -## mako - -<%namespace name='static' file='../static_content.html'/> - -<%! -from django.utils.translation import ugettext as _ -%> - -<%static:require_module_async module_name="js/courseware/course_outline_factory" class_name="CourseOutlineFactory"> - CourseOutlineFactory('.block-tree'); - - -
- -
diff --git a/lms/templates/courseware/courseware.html b/lms/templates/courseware/courseware.html index c82ca94ac2..902e26b954 100644 --- a/lms/templates/courseware/courseware.html +++ b/lms/templates/courseware/courseware.html @@ -27,7 +27,7 @@ from openedx.core.djangolib.js_utils import js_escaped_string <%block name="header_extras"> -% for template_name in ["image-modal"]: +% for template_name in ["image-modal", "sequence-breadcrumbs"]: