diff --git a/lms/djangoapps/learner_dashboard/config/__init__.py b/lms/djangoapps/learner_dashboard/config/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lms/djangoapps/learner_dashboard/config/waffle.py b/lms/djangoapps/learner_dashboard/config/waffle.py new file mode 100644 index 0000000000..0809383a48 --- /dev/null +++ b/lms/djangoapps/learner_dashboard/config/waffle.py @@ -0,0 +1,20 @@ +""" +This module contains various configuration settings via +waffle switches for the learner_dashboard app. +""" + +from edx_toggles.toggles import WaffleFlag + +# .. toggle_name: learner_dashboard.enable_program_discussions +# .. toggle_implementation: WaffleFlag +# .. toggle_default: False +# .. toggle_description: Waffle flag to enable new Program discussion experience for course. +# .. toggle_use_cases: temporary, open_edx +# .. toggle_creation_date: 2021-08-25 +# .. toggle_target_removal_date: 2021-12-31 +# .. toggle_warnings: When the flag is ON, the new experience for Program discussions will be enabled. +# .. toggle_tickets: TNL-8434 +ENABLE_PROGRAM_DISCUSSIONS = WaffleFlag( + 'learner_dashboard.enable_program_discussions', + __name__, +) diff --git a/lms/djangoapps/learner_dashboard/programs.py b/lms/djangoapps/learner_dashboard/programs.py index e8736f48a1..4d9e46f54b 100644 --- a/lms/djangoapps/learner_dashboard/programs.py +++ b/lms/djangoapps/learner_dashboard/programs.py @@ -12,7 +12,7 @@ from django.utils.translation import ugettext_lazy as _ # lint-amnesty, pylint: from web_fragments.fragment import Fragment from lms.djangoapps.commerce.utils import EcommerceService -from lms.djangoapps.learner_dashboard.utils import FAKE_COURSE_KEY, strip_course_id +from lms.djangoapps.learner_dashboard.utils import FAKE_COURSE_KEY, strip_course_id, program_discussions_is_enabled from openedx.core.djangoapps.catalog.constants import PathwayType from openedx.core.djangoapps.catalog.utils import get_pathways from openedx.core.djangoapps.credentials.utils import get_credentials_records_url @@ -136,6 +136,7 @@ class ProgramDetailsFragmentView(EdxFragmentView): 'certificate_data': certificate_data, 'industry_pathways': industry_pathways, 'credit_pathways': credit_pathways, + 'program_discussions_enabled': program_discussions_is_enabled() } html = render_to_string('learner_dashboard/program_details_fragment.html', context) diff --git a/lms/djangoapps/learner_dashboard/utils.py b/lms/djangoapps/learner_dashboard/utils.py index 6dfa1e0660..2b0385a9c6 100644 --- a/lms/djangoapps/learner_dashboard/utils.py +++ b/lms/djangoapps/learner_dashboard/utils.py @@ -5,6 +5,8 @@ The utility methods and functions to help the djangoapp logic from opaque_keys.edx.keys import CourseKey +from lms.djangoapps.learner_dashboard.config.waffle import ENABLE_PROGRAM_DISCUSSIONS + FAKE_COURSE_KEY = CourseKey.from_string('course-v1:fake+course+run') @@ -15,3 +17,10 @@ def strip_course_id(path): """ course_id = str(FAKE_COURSE_KEY) return path.split(course_id)[0] + + +def program_discussions_is_enabled(): + """ + check if program discussion is enabled. + """ + return ENABLE_PROGRAM_DISCUSSIONS.is_enabled() diff --git a/lms/static/js/learner_dashboard/views/program_details_view.js b/lms/static/js/learner_dashboard/views/program_details_view.js index c22779f8a3..5ff5d7456a 100644 --- a/lms/static/js/learner_dashboard/views/program_details_view.js +++ b/lms/static/js/learner_dashboard/views/program_details_view.js @@ -74,6 +74,7 @@ class ProgramDetailsView extends Backbone.View { remainingCount, completedCount, completeProgramURL: buyButtonUrl, + programDiscussionEnabled: this.options.programDiscussionEnabled, }; data = $.extend(data, this.programModel.toJSON()); HtmlUtils.setHtml(this.$el, this.tpl(data)); diff --git a/lms/static/sass/views/_program-details.scss b/lms/static/sass/views/_program-details.scss index 6d786588f1..43d4929515 100644 --- a/lms/static/sass/views/_program-details.scss +++ b/lms/static/sass/views/_program-details.scss @@ -837,3 +837,44 @@ $btn-color-primary: $primary-dark; } } } + +.program-detail-nav { + @extend .content; + + display: block; + width: 100%; + padding: 40px; + + .program-detail-nav-list { + @extend %ui-no-list; + + border-bottom: 1px solid $gray-base; + + .nav-item { + @extend %t-copy-base; + + font-weight: 500; + font-size: 1.125rem; + display: inline-block; + + .btn-link { + display: inline-block; + padding: ($baseline/2); + border: 0; + box-shadow: none; + text-shadow: none; + color: theme-color("primary"); + cursor: pointer; + + &:hover, + &:focus { + border-bottom: 3px solid theme-color("primary"); + } + + &.active { + border-bottom: 3px solid theme-color("primary"); + } + } + } + } +} diff --git a/lms/templates/learner_dashboard/program_details_fragment.html b/lms/templates/learner_dashboard/program_details_fragment.html index f686c4f943..015f01c9a7 100644 --- a/lms/templates/learner_dashboard/program_details_fragment.html +++ b/lms/templates/learner_dashboard/program_details_fragment.html @@ -20,6 +20,7 @@ ProgramDetailsFactory({ userPreferences: ${user_preferences | n, dump_js_escaped_json}, industryPathways: ${industry_pathways | n, dump_js_escaped_json}, creditPathways: ${credit_pathways | n, dump_js_escaped_json}, + programDiscussionEnabled: ${program_discussions_enabled | n, dump_js_escaped_json}, }); diff --git a/lms/templates/learner_dashboard/program_details_view.underscore b/lms/templates/learner_dashboard/program_details_view.underscore index a0523e3cad..304565b684 100644 --- a/lms/templates/learner_dashboard/program_details_view.underscore +++ b/lms/templates/learner_dashboard/program_details_view.underscore @@ -1,5 +1,31 @@
+ +<% if (programDiscussionEnabled) { %> +
+ +
+
+
Journey tab content
+
Community tab content
+
Live tab content
+
Pathways tab content
+
+<% } %> +
<% if (completedCount === totalCount) { %>