// eslint-disable-next-line no-shadow-restricted-names (function (undefined) { "use strict"; // [module Collapsible] // // [description] // Set of library functions that provide a simple way to add // collapsible functionality to elements. this.Collapsible = { setCollapsibles: setCollapsibles, toggleFull: toggleFull, toggleHint: toggleHint, }; // eslint-disable-next-line no-useless-return return; // [function setCollapsibles] // // [description] // Scan element's content for generic collapsible containers. // // [params] // el: container function setCollapsibles(el) { var linkBottom, linkTop, short_custom; linkTop = 'See full output'; linkBottom = 'See full output'; // Standard longform + shortfom pattern. el.find(".longform").hide(); el.find(".shortform").append(linkTop, linkBottom); // xss-lint: disable=javascript-jquery-append // Custom longform + shortform text pattern. short_custom = el.find(".shortform-custom"); // Set up each one individually. short_custom.each(function (index, elt) { var close_text, open_text; open_text = $(elt).data("open-text"); close_text = $(elt).data("close-text"); edx.HtmlUtils.append( $(elt), edx.HtmlUtils.joinHtml( edx.HtmlUtils.HTML(""), gettext(open_text), edx.HtmlUtils.HTML(""), ), ); $(elt) .find(".full-custom") .click(function (event) { Collapsible.toggleFull(event, open_text, close_text); }); }); // Collapsible pattern. el.find(".collapsible header + section").hide(); // Set up triggers. el.find(".full").click(function (event) { Collapsible.toggleFull(event, "See full output", "Hide output"); }); el.find(".collapsible header a").click(Collapsible.toggleHint); } // [function toggleFull] // // [description] // Toggle the display of full text for a collapsible element. // // [params] // event: jQuery event object associated with the event that // triggered this callback function. // open_text: text that should be displayed when the collapsible // is open. // close_text: text that should be displayed when the collapsible // is closed. function toggleFull(event, open_text, close_text) { var $el, new_text, parent; event.preventDefault(); parent = $(event.target).parent(); parent.siblings().slideToggle(); parent.parent().toggleClass("open"); if ($(event.target).text() === open_text) { new_text = close_text; } else { new_text = open_text; } if ($(event.target).hasClass("full")) { $el = parent.find(".full"); } else { $el = $(event.target); } $el.text(new_text); } // [function toggleHint] // // [description] // Toggle the collapsible open to show the hint. // // [params] // event: jQuery event object associated with the event that // triggered this callback function. function toggleHint(event) { event.preventDefault(); $(event.target).parent().siblings().slideToggle(); $(event.target).parent().parent().toggleClass("open"); } }).call(this);