-
+
- ${course.display_org_with_default} +
- ${course.display_name} +
- ${_("Starts")}: +
diff --git a/openedx/core/djangoapps/theming/tests/test_helpers.py b/openedx/core/djangoapps/theming/tests/test_helpers.py index b7ca6dcc17..9774671233 100644 --- a/openedx/core/djangoapps/theming/tests/test_helpers.py +++ b/openedx/core/djangoapps/theming/tests/test_helpers.py @@ -25,6 +25,7 @@ class TestHelpers(TestCase): Theme('red-theme', 'red-theme', get_theme_base_dir('red-theme')), Theme('edge.edx.org', 'edge.edx.org', get_theme_base_dir('edge.edx.org')), Theme('edx.org', 'edx.org', get_theme_base_dir('edx.org')), + Theme('example', 'example', get_theme_base_dir('example')), Theme('stanford-style', 'stanford-style', get_theme_base_dir('stanford-style')), ] actual_themes = get_themes() diff --git a/themes/example/lms/static/images/about-img.png b/themes/example/lms/static/images/about-img.png new file mode 100644 index 0000000000..69768cd538 Binary files /dev/null and b/themes/example/lms/static/images/about-img.png differ diff --git a/themes/example/lms/static/images/course-thumbnail.jpg b/themes/example/lms/static/images/course-thumbnail.jpg new file mode 100644 index 0000000000..e4c3c4a850 Binary files /dev/null and b/themes/example/lms/static/images/course-thumbnail.jpg differ diff --git a/themes/example/lms/static/images/hero-course-catalog.png b/themes/example/lms/static/images/hero-course-catalog.png new file mode 100644 index 0000000000..b24a3cb97c Binary files /dev/null and b/themes/example/lms/static/images/hero-course-catalog.png differ diff --git a/themes/example/lms/static/images/hero-course-detail.jpg b/themes/example/lms/static/images/hero-course-detail.jpg new file mode 100644 index 0000000000..e5c4cdce13 Binary files /dev/null and b/themes/example/lms/static/images/hero-course-detail.jpg differ diff --git a/themes/example/lms/static/images/hero-home-page.jpg b/themes/example/lms/static/images/hero-home-page.jpg new file mode 100644 index 0000000000..624f53eb9d Binary files /dev/null and b/themes/example/lms/static/images/hero-home-page.jpg differ diff --git a/themes/example/lms/static/images/openedx-logo-tag.png b/themes/example/lms/static/images/openedx-logo-tag.png new file mode 100644 index 0000000000..5f8085cf10 Binary files /dev/null and b/themes/example/lms/static/images/openedx-logo-tag.png differ diff --git a/themes/example/lms/static/images/openedx-logo.png b/themes/example/lms/static/images/openedx-logo.png new file mode 100644 index 0000000000..eb944aacbb Binary files /dev/null and b/themes/example/lms/static/images/openedx-logo.png differ diff --git a/themes/example/lms/static/images/page-heading.png b/themes/example/lms/static/images/page-heading.png new file mode 100644 index 0000000000..9968a717db Binary files /dev/null and b/themes/example/lms/static/images/page-heading.png differ diff --git a/themes/example/lms/static/images/user-thumbnail.png b/themes/example/lms/static/images/user-thumbnail.png new file mode 100644 index 0000000000..9a65d8c8dc Binary files /dev/null and b/themes/example/lms/static/images/user-thumbnail.png differ diff --git a/themes/example/lms/static/images/vid-btn.png b/themes/example/lms/static/images/vid-btn.png new file mode 100644 index 0000000000..61eb221cec Binary files /dev/null and b/themes/example/lms/static/images/vid-btn.png differ diff --git a/themes/example/lms/static/images/vid-img.jpg b/themes/example/lms/static/images/vid-img.jpg new file mode 100644 index 0000000000..a05a362482 Binary files /dev/null and b/themes/example/lms/static/images/vid-img.jpg differ diff --git a/themes/example/lms/static/js/about-site.js b/themes/example/lms/static/js/about-site.js new file mode 100644 index 0000000000..9150795c5a --- /dev/null +++ b/themes/example/lms/static/js/about-site.js @@ -0,0 +1,31 @@ +(function(require) { + 'use strict'; + require(['edx-ui-toolkit/js/utils/html-utils'], function(HtmlUtils) { + function addSlider() { + var isMobileResolution = $(window).width() < 768, + sliderExists = $('.about-list').hasClass('slick-slider'); + $('.about-list').toggleClass('slidable', isMobileResolution); + if (isMobileResolution) { + if (!sliderExists) { + $('.about-list').find('.about-list-item').removeClass('col col-4'); + $('.slidable').slick({ + nextArrow: '', + prevArrow: '' + }); + } + } else { + HtmlUtils.setHtml('.about-container', HtmlUtils.HTML($('#about-content').html())); + } + } + + + $(function() { + HtmlUtils.setHtml('.about-container', HtmlUtils.HTML($('#about-content').html())); + addSlider(); + }); + + $(window).resize(function() { + addSlider(); + }); + }); +}).call(this, require || RequireJS.require); diff --git a/themes/example/lms/static/js/animation-scroll.js b/themes/example/lms/static/js/animation-scroll.js new file mode 100644 index 0000000000..56d35bef09 --- /dev/null +++ b/themes/example/lms/static/js/animation-scroll.js @@ -0,0 +1,15 @@ +$(document).ready(function() { + 'use strict'; + + var div = ''; + $('.back-to-top').on('click', function(event) { + event.preventDefault(); + $('html, body').animate({scrollTop: 0}, 300); + }); + + $('ul.list-divided li.item a').on('click', function(event) { + event.preventDefault(); + div = $(this).attr('href'); + $('html, body').animate({scrollTop: $(div).offset().top}, 300); + }); +}); diff --git a/themes/example/lms/static/js/contact-form.js b/themes/example/lms/static/js/contact-form.js new file mode 100644 index 0000000000..dd940a78d2 --- /dev/null +++ b/themes/example/lms/static/js/contact-form.js @@ -0,0 +1,82 @@ +(function(require) { + 'use strict'; + + require(['edx-ui-toolkit/js/utils/html-utils', 'edx-ui-toolkit/js/utils/string-utils'], + function(HtmlUtils, StringUtils) { + var errorMessages = { + name: 'Please provide your name.', + email: 'Please provide a valid e-mail.', + details: 'Please provide message.', + subject: 'Please provide an inquiry type.' + }; + function addErrorDiv(id) { + var start = HtmlUtils.HTML('
') + } + ); + $('#' + id).addClass('has-error'); + $('#' + id).parent().append(HtmlUtils.template(errorDiv)().toString()); + } + function submitForm(data) { + $.post('/submit_feedback', data, function() { + $('#success-message-btn').click(); + setTimeout(function() { + $('#lean_overlay').trigger('click'); + $('#contact_form').trigger('reset'); + }, 2000); + }).fail(function(xhr) { + var responseData = jQuery.parseJSON(xhr.responseText); + addErrorDiv(responseData.field); + }); + } + + function removeErrorDiv(id) { + $('#' + id).removeClass('has-error'); + $($('#' + id).next()).remove(); + } + function validateForm() { + var optionalFields = ['user_type']; // Optional fields array + var formValues = $('#contact_form').find(':input'), + i = 0, + data = {}, + value = '', + id = '', + response = { + is_form_validate: true, + data: '' + }; + + for (i = 0; i < formValues.length - 2; i++) { + value = $(formValues[i]).val(); + id = $(formValues[i]).attr('id'); + removeErrorDiv(id); + + if (value && value !== '') { + data[id] = value; + } else { + if ($.inArray(id, optionalFields) === -1) { + response.is_form_validate = false; + addErrorDiv(id); + } + } + } + response.data = data; + return response; + } + $(function() { + var validateFormData = ''; + $('#submit_btn').click(function(e) { + e.preventDefault(); + validateFormData = validateForm(); + if (validateFormData.is_form_validate) { + submitForm(validateFormData.data); + } + }); + }); + }); +}).call(this, require || RequireJS.require); diff --git a/themes/example/lms/static/js/course-about.js b/themes/example/lms/static/js/course-about.js new file mode 100644 index 0000000000..e7026e39fa --- /dev/null +++ b/themes/example/lms/static/js/course-about.js @@ -0,0 +1,70 @@ + +(function(require) { + 'use strict'; + + require([ + 'edx-ui-toolkit/js/utils/html-utils', + '/static/example/js/leanModal.js' + ], function(HtmlUtils) { // eslint-disable-line no-unused-vars // jshint ignore:line + function expandDescription(entireDescriptionContent) { + var showLessLinkHtml = 'Less'; + HtmlUtils.setHtml('.course-description', HtmlUtils.HTML(entireDescriptionContent + showLessLinkHtml)); + $('#description_less').click(function(event) { + event.preventDefault(); + truncateDescription(entireDescriptionContent); // eslint-disable-line no-use-before-define + }); + } + function truncateDescription(entireDescriptionContent) { + var showMoreLink = '', + truncatedContent = ''; + if (entireDescriptionContent.length > 500) { + showMoreLink = '... See More'; + truncatedContent = entireDescriptionContent.substring(0, entireDescriptionContent.indexOf(' ', 500)); + HtmlUtils.setHtml('.course-description', HtmlUtils.HTML(truncatedContent + showMoreLink)); + $('#description_show').click(function(event) { + event.preventDefault(); + expandDescription(entireDescriptionContent); + }); + } + } + function expandLearningPoints(entireLearningContent) { + var showLessLinkHtml = 'Less'; + HtmlUtils.setHtml( + '.course-learning .list-bulleted', + HtmlUtils.HTML(entireLearningContent + showLessLinkHtml) + ); + $('#learning_less').click(function() { + truncateLearningPoints(entireLearningContent); // eslint-disable-line no-use-before-define + }); + } + function truncateLearningPoints(entireLearningContent) { + var learningPointsCount = $('.course-learning .list-bulleted').children().length, + points = '', + showMoreLink = ''; + if (learningPointsCount > 6) { + points = $('.course-learning .list-bulleted').children().slice((6 - learningPointsCount)); + points.remove(); + showMoreLink = 'See More'; + HtmlUtils.append('.course-learning .list-bulleted', HtmlUtils.HTML(showMoreLink)); + $('#learning_show').click(function(event) { + event.preventDefault(); + expandLearningPoints(entireLearningContent); + }); + } + } + function init() { + var entireDescriptionContent = $('.course-description').html(), + entireLearningContent = $('.course-learning .list-bulleted').html(); + + // Truncating the Course Description + truncateDescription(entireDescriptionContent); + + // Truncating the Course learning points + truncateLearningPoints(entireLearningContent); + + // Instructor Modal + $('.instructor-image').leanModal({closeButton: '.modal_close', top: '10%'}); + } + init(); + }); +}).call(this, require || RequireJS.require); diff --git a/themes/example/lms/static/js/leanModal.js b/themes/example/lms/static/js/leanModal.js new file mode 100644 index 0000000000..e11fe8c8f7 --- /dev/null +++ b/themes/example/lms/static/js/leanModal.js @@ -0,0 +1,143 @@ +/*eslint-disable */ + +(function(require) { + "use strict"; + + require(['edx-ui-toolkit/js/utils/html-utils'], function(HtmlUtils) { + $.fn.extend({ + /* + * leanModal prepares an element to be a modal dialog. Call it once on the + * element that launches the dialog, when the page is ready. This function + * will add a .click() handler that properly opens the dialog. + * + * The launching element must: + * - be an element, not a button, + * - have an href= attribute identifying the id of the dialog element, + * - have rel='leanModal'. + */ + leanModal: function(options) { + var defaults = { + top: 100, + overlay: 0.5, + closeButton: null, + position: 'fixed' + }; + if ($("#lean_overlay").length === 0) { + var overlay = $(""); + $("body").append(HtmlUtils.template(overlay)().toString()); + } + options = $.extend(defaults, options); + return this.each(function() { + var o = options; + $(this).click(function(e) { + $(".modal").hide(); + var modal_id = $(this).attr("href"); + if ($(modal_id).hasClass("video-modal")) { + //Video modals need to be cloned before being presented as a modal + //This is because actions on the video get recorded in the history. + //Deleting the video (clone) prevents the odd back button behavior. + var modal_clone = $(modal_id).clone(true, + true); + modal_clone.attr('id', 'modal_clone'); + + $(modal_id).after(HtmlUtils.ensureHtml(modal_clone).toString()); + + modal_id = '#modal_clone'; + } + $("#lean_overlay").click(function(e) { + close_modal(modal_id, e); + }); + $(o.closeButton).click(function(e) { + close_modal(modal_id, e); + }); + // To enable closing of email modal when copy button hit + $(o.copyEmailButton).click(function(e) { + close_modal(modal_id, e); + }); + var modal_width = $(modal_id).outerWidth(); + $('#lean_overlay').css({ + 'display': 'block', + opacity: 0 + }); + $('#lean_overlay').fadeTo(200, o.overlay); + $('iframe', modal_id).attr('src', $('iframe', + modal_id).data('src')); + if ($(modal_id).hasClass("email-modal")) { + $(modal_id).css({ + 'width': 80 + '%', + 'height': 80 + '%', + 'position': o.position, + 'opacity': 0, + 'z-index': 11000, + 'left': 10 + '%', + 'top': 10 + '%' + }); + } else { + $(modal_id).css({ + 'position': o.position, + 'opacity': 0, + 'z-index': 11000, + 'left': 50 + '%', + 'margin-left': -(modal_width / 2) + + "px", + 'top': o.top + "px" + }); + } + $(modal_id).show().fadeTo(200, 1); + $(modal_id).find(".notice").hide().html(""); + var notice = $(this).data('notice'); + if (notice !== undefined) { + var $notice = $(modal_id).find(".notice"); + $notice.show(); + $notice.append(HtmlUtils.ensureHtml(notice).toString()); + + // This is for activating leanModal links that were in the notice. We should have a cleaner way of + // allowing all dynamically added leanmodal links to work. + $notice.find("a[rel*=leanModal]").leanModal({ + top: 120, + overlay: 1, + closeButton: ".close-modal", + position: 'absolute' + }); + } + e.preventDefault(); + }); + }); + + function close_modal(modal_id, e) { + $("#lean_overlay").fadeOut(200); + $('iframe', modal_id).attr('src', ''); + $(modal_id).css({ + 'display': 'none' + }); + if (modal_id === '#modal_clone') { + $(modal_id).remove(); + } + e.preventDefault(); + } + } + }); + $(document).ready(function($) { + $("a[rel*=leanModal]").each(function() { + $(this).leanModal({ + top: 120, + overlay: 1, + closeButton: ".close-modal", + position: 'absolute' + }); + var embed = $($(this).attr('href')).find('iframe'); + if (embed.length > 0 && embed.attr('src')) { + var sep = (embed.attr('src').indexOf("?") > 0) ? '&' : + '?'; + embed.data('src', embed.attr('src') + sep + + 'autoplay=1&rel=0'); + embed.attr('src', ''); + } + }); + }); + }); +}).call( + this, + typeof define === 'function' && define.amd ? define : + (typeof RequireJS !== 'undefined' ? RequireJS.define : "") +); diff --git a/themes/example/lms/static/js/slick.min.js b/themes/example/lms/static/js/slick.min.js new file mode 100755 index 0000000000..502b348b75 --- /dev/null +++ b/themes/example/lms/static/js/slick.min.js @@ -0,0 +1,20 @@ +/* + _ _ _ _ + ___| (_) ___| | __ (_)___ +/ __| | |/ __| |/ / | / __| +\__ \ | | (__| < _ | \__ \ +|___/_|_|\___|_|\_(_)/ |___/ + |__/ + + Version: 1.5.9 + Author: Ken Wheeler + Website: http://kenwheeler.github.io + Docs: http://kenwheeler.github.io/slick + Repo: http://github.com/kenwheeler/slick + Issues: http://github.com/kenwheeler/slick/issues + + */ + /* jshint ignore:start */ +!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"undefined"!=typeof exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){"use strict";var b=window.Slick||{};b=function(){function c(c,d){var f,e=this;e.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:a(c),appendDots:a(c),arrows:!0,asNavFor:null,prevArrow:'',nextArrow:'',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(a,b){return'"},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!1,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},e.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},a.extend(e,e.initials),e.activeBreakpoint=null,e.animType=null,e.animProp=null,e.breakpoints=[],e.breakpointSettings=[],e.cssTransitions=!1,e.hidden="hidden",e.paused=!1,e.positionProp=null,e.respondTo=null,e.rowCount=1,e.shouldClick=!0,e.$slider=a(c),e.$slidesCache=null,e.transformType=null,e.transitionType=null,e.visibilityChange="visibilitychange",e.windowWidth=0,e.windowTimer=null,f=a(c).data("slick")||{},e.options=a.extend({},e.defaults,f,d),e.currentSlide=e.options.initialSlide,e.originalSettings=e.options,"undefined"!=typeof document.mozHidden?(e.hidden="mozHidden",e.visibilityChange="mozvisibilitychange"):"undefined"!=typeof document.webkitHidden&&(e.hidden="webkitHidden",e.visibilityChange="webkitvisibilitychange"),e.autoPlay=a.proxy(e.autoPlay,e),e.autoPlayClear=a.proxy(e.autoPlayClear,e),e.changeSlide=a.proxy(e.changeSlide,e),e.clickHandler=a.proxy(e.clickHandler,e),e.selectHandler=a.proxy(e.selectHandler,e),e.setPosition=a.proxy(e.setPosition,e),e.swipeHandler=a.proxy(e.swipeHandler,e),e.dragHandler=a.proxy(e.dragHandler,e),e.keyHandler=a.proxy(e.keyHandler,e),e.autoPlayIterator=a.proxy(e.autoPlayIterator,e),e.instanceUid=b++,e.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,e.registerBreakpoints(),e.init(!0),e.checkResponsive(!0)}var b=0;return c}(),b.prototype.addSlide=b.prototype.slickAdd=function(b,c,d){var e=this;if("boolean"==typeof c)d=c,c=null;else if(0>c||c>=e.slideCount)return!1;e.unload(),"number"==typeof c?0===c&&0===e.$slides.length?a(b).appendTo(e.$slideTrack):d?a(b).insertBefore(e.$slides.eq(c)):a(b).insertAfter(e.$slides.eq(c)):d===!0?a(b).prependTo(e.$slideTrack):a(b).appendTo(e.$slideTrack),e.$slides=e.$slideTrack.children(this.options.slide),e.$slideTrack.children(this.options.slide).detach(),e.$slideTrack.append(e.$slides),e.$slides.each(function(b,c){a(c).attr("data-slick-index",b)}),e.$slidesCache=e.$slides,e.reinit()},b.prototype.animateHeight=function(){var a=this;if(1===a.options.slidesToShow&&a.options.adaptiveHeight===!0&&a.options.vertical===!1){var b=a.$slides.eq(a.currentSlide).outerHeight(!0);a.$list.animate({height:b},a.options.speed)}},b.prototype.animateSlide=function(b,c){var d={},e=this;e.animateHeight(),e.options.rtl===!0&&e.options.vertical===!1&&(b=-b),e.transformsEnabled===!1?e.options.vertical===!1?e.$slideTrack.animate({left:b},e.options.speed,e.options.easing,c):e.$slideTrack.animate({top:b},e.options.speed,e.options.easing,c):e.cssTransitions===!1?(e.options.rtl===!0&&(e.currentLeft=-e.currentLeft),a({animStart:e.currentLeft}).animate({animStart:b},{duration:e.options.speed,easing:e.options.easing,step:function(a){a=Math.ceil(a),e.options.vertical===!1?(d[e.animType]="translate("+a+"px, 0px)",e.$slideTrack.css(d)):(d[e.animType]="translate(0px,"+a+"px)",e.$slideTrack.css(d))},complete:function(){c&&c.call()}})):(e.applyTransition(),b=Math.ceil(b),e.options.vertical===!1?d[e.animType]="translate3d("+b+"px, 0px, 0px)":d[e.animType]="translate3d(0px,"+b+"px, 0px)",e.$slideTrack.css(d),c&&setTimeout(function(){e.disableTransition(),c.call()},e.options.speed))},b.prototype.asNavFor=function(b){var c=this,d=c.options.asNavFor;d&&null!==d&&(d=a(d).not(c.$slider)),null!==d&&"object"==typeof d&&d.each(function(){var c=a(this).slick("getSlick");c.unslicked||c.slideHandler(b,!0)})},b.prototype.applyTransition=function(a){var b=this,c={};b.options.fade===!1?c[b.transitionType]=b.transformType+" "+b.options.speed+"ms "+b.options.cssEase:c[b.transitionType]="opacity "+b.options.speed+"ms "+b.options.cssEase,b.options.fade===!1?b.$slideTrack.css(c):b.$slides.eq(a).css(c)},b.prototype.autoPlay=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer),a.slideCount>a.options.slidesToShow&&a.paused!==!0&&(a.autoPlayTimer=setInterval(a.autoPlayIterator,a.options.autoplaySpeed))},b.prototype.autoPlayClear=function(){var a=this;a.autoPlayTimer&&clearInterval(a.autoPlayTimer)},b.prototype.autoPlayIterator=function(){var a=this;a.options.infinite===!1?1===a.direction?(a.currentSlide+1===a.slideCount-1&&(a.direction=0),a.slideHandler(a.currentSlide+a.options.slidesToScroll)):(a.currentSlide-1===0&&(a.direction=1),a.slideHandler(a.currentSlide-a.options.slidesToScroll)):a.slideHandler(a.currentSlide+a.options.slidesToScroll)},b.prototype.buildArrows=function(){var b=this;b.options.arrows===!0&&(b.$prevArrow=a(b.options.prevArrow).addClass("slick-arrow"),b.$nextArrow=a(b.options.nextArrow).addClass("slick-arrow"),b.slideCount>b.options.slidesToShow?(b.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),b.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),b.htmlExpr.test(b.options.prevArrow)&&b.$prevArrow.prependTo(b.options.appendArrows),b.htmlExpr.test(b.options.nextArrow)&&b.$nextArrow.appendTo(b.options.appendArrows),b.options.infinite!==!0&&b.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):b.$prevArrow.add(b.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},b.prototype.buildDots=function(){var c,d,b=this;if(b.options.dots===!0&&b.slideCount>b.options.slidesToShow){for(d='",b.$dots=a(d).appendTo(b.options.appendDots),b.$dots.find("li").first().addClass("slick-active").attr("aria-hidden","false")}},b.prototype.buildOut=function(){var b=this;b.$slides=b.$slider.children(b.options.slide+":not(.slick-cloned)").addClass("slick-slide"),b.slideCount=b.$slides.length,b.$slides.each(function(b,c){a(c).attr("data-slick-index",b).data("originalStyling",a(c).attr("style")||"")}),b.$slider.addClass("slick-slider"),b.$slideTrack=0===b.slideCount?a('').appendTo(b.$slider):b.$slides.wrapAll('').parent(),b.$list=b.$slideTrack.wrap('').parent(),b.$slideTrack.css("opacity",0),(b.options.centerMode===!0||b.options.swipeToSlide===!0)&&(b.options.slidesToScroll=1),a("img[data-lazy]",b.$slider).not("[src]").addClass("slick-loading"),b.setupInfinite(),b.buildArrows(),b.buildDots(),b.updateDots(),b.setSlideClasses("number"==typeof b.currentSlide?b.currentSlide:0),b.options.draggable===!0&&b.$list.addClass("draggable")},b.prototype.buildRows=function(){var b,c,d,e,f,g,h,a=this;if(e=document.createDocumentFragment(),g=a.$slider.children(),a.options.rows>1){for(h=a.options.slidesPerRow*a.options.rows,f=Math.ceil(g.length/h),b=0;f>b;b++){var i=document.createElement("div");for(c=0;c${course_details.subtitle}
+${course_details.description}
+${_("You can purchase enrollment codes for this course to distribute to your team")}
+ + % if ecommerce_bulk_checkout_link: + <% + url = "mailto:harvardxplus@harvard.edu?Subject={course_id}%20{run}%20Bulk%20Discount".format(course_id=course_details.course_id, run=course_details.run) + link_start = HTML("").format(url=Text(url)) + %> + ${_("Purchase for a Group")} ++ ${Text(_("Bulk discounts may apply for groups larger than 10. Contact {link_start}harvardxplus@harvard.edu{link_end} for more information.")).format( + link_start=HTML(link_start), + link_end=HTML('') + )} +
+ % else: + <% + url = "mailto:harvardxplus@harvard.edu?Subject={course_id}%20{run}%20Group%20Purchase".format( + course_id=course_details.course_id, run=course_details.run) + %> + ${_("Email Us")} + % endif +Lorem ipsum dolor sit amet, sea te quaeque suscipiantur.
+