UNPKG

metro4

Version:

The front-end framework for Build responsive, mobile-first projects on the web with the first front-end component library in Metro Style

211 lines (173 loc) 6.47 kB
/*global Metro, METRO_ANIMATION_DURATION */ (function(Metro, $){ 'use strict'; var Utils = Metro.utils; var AccordionDefaultConfig = { accordionDeferred: 0, showMarker: true, material: false, duration: METRO_ANIMATION_DURATION, oneFrame: true, showActive: true, activeFrameClass: "", activeHeadingClass: "", activeContentClass: "", clsFrame: "", clsHeading: "", clsContent: "", clsAccordion: "", clsActiveFrame: "", clsActiveFrameHeading: "", clsActiveFrameContent: "", onFrameOpen: Metro.noop, onFrameBeforeOpen: Metro.noop_true, onFrameClose: Metro.noop, onFrameBeforeClose: Metro.noop_true, onAccordionCreate: Metro.noop }; Metro.accordionSetup = function(options){ AccordionDefaultConfig = $.extend({}, AccordionDefaultConfig, options); }; if (typeof window["metroAccordionSetup"] !== undefined) { Metro.accordionSetup(window["metroAccordionSetup"]); } Metro.Component('accordion', { init: function( options, elem ) { this._super(elem, options, AccordionDefaultConfig); return this; }, _create: function(){ var element = this.element; this._createStructure(); this._createEvents(); this._fireEvent('accordionCreate', { element: element }); }, _createStructure: function(){ var that = this, element = this.element, o = this.options; var frames = element.children(".frame"); var active = element.children(".frame.active"); var frame_to_open; element .addClass("accordion") .addClass(o.clsAccordion) ; frames .addClass(o.clsFrame) .each(function(){ var $el = $(this); $el.children(".heading").addClass(o.clsHeading); $el.children(".content").addClass(o.clsContent); }) ; if (o.showMarker === true) { element.addClass("marker-on"); } if (o.material === true) { element.addClass("material"); } if (active.length === 0) { frame_to_open = frames[0]; } else { frame_to_open = active[0]; } this._hideAll(); if (o.showActive === true) { if (o.oneFrame === true) { this._openFrame(frame_to_open); } else { $.each(active, function(){ that._openFrame(this); }); } } }, _createEvents: function(){ var that = this, element = this.element, o = this.options; var active = element.children(".frame.active"); element.on(Metro.events.click, ".heading", function(){ var heading = $(this); var frame = heading.parent(); if (heading.closest(".accordion")[0] !== element[0]) { return false; } if (frame.hasClass("active")) { if (active.length === 1 && o.oneFrame) { /* eslint-disable-next-line */ } else { that._closeFrame(frame); } } else { that._openFrame(frame); } }); }, _openFrame: function(f){ var element = this.element, o = this.options; var frame = $(f); if (Utils.exec(o.onFrameBeforeOpen, [frame[0]], element[0]) === false) { return false; } if (o.oneFrame === true) { this._closeAll(frame[0]); } frame.addClass("active " + o.activeFrameClass).addClass(o.clsActiveFrame); frame.children(".heading").addClass(o.activeHeadingClass).addClass(o.clsActiveFrameHeading); frame.children(".content").addClass(o.activeContentClass).addClass(o.clsActiveFrameContent).slideDown(o.duration); this._fireEvent("frameOpen", { frame: frame[0] }); }, _closeFrame: function(f){ var element = this.element, o = this.options; var frame = $(f); if (!frame.hasClass("active")) { return ; } if (Utils.exec(o.onFrameBeforeClose, [frame[0]], element[0]) === false) { return ; } frame.removeClass("active " + o.activeFrameClass).removeClass(o.clsActiveFrame); frame.children(".heading").removeClass(o.activeHeadingClass).removeClass(o.clsActiveFrameHeading); frame.children(".content").removeClass(o.activeContentClass).removeClass(o.clsActiveFrameContent).slideUp(o.duration); this._fireEvent("frameClose", { frame: frame[0] }); }, _closeAll: function(skip){ var that = this, element = this.element; var frames = element.children(".frame"); $.each(frames, function(){ if (skip === this) return; that._closeFrame(this); }); }, _hideAll: function(){ var element = this.element; var frames = element.children(".frame"); $.each(frames, function(){ $(this).children(".content").hide(); }); }, _openAll: function(){ var that = this, element = this.element; var frames = element.children(".frame"); $.each(frames, function(){ that._openFrame(this); }); }, open: function(i){ var frame = this.element.children(".frame").eq(i); this._openFrame(frame); }, /* eslint-disable-next-line */ changeAttribute: function(attr, newVal){ }, destroy: function(){ var element = this.element; element.off(Metro.events.click, ".heading"); return element; } }); }(Metro, m4q));