xf/ui/xf.ui.slidemenu.js (78 lines of code) (raw):

define([ 'jquery', 'underscore', '../src/xf.core', '../src/xf.utils', '../ui/xf.ui.core' ], function($, _, XF) { /** Enhances headers view @param header DOM Object @private */ XF.ui.slidemenu = { selector : '[data-role=slidemenu]', render : function (menu, options) { var jQMenu = $(menu); if (!menu || !(jQMenu instanceof $) || jQMenu.attr('data-skip-enhance') == 'true') { return; } options.id = options.id || XF.utils.uniqueID(); options.title = options.title || ''; options.hasTitle = options.title !== '' ? true : false; options.isFixed = (options.fixed && options.fixed === true) ? true : false; options.buttons = options.buttons || []; options.html = jQMenu.html(); jQMenu.attr({ 'data-id': options.id, 'id': options.id, 'data-skip-enhance' : 'true' }).addClass('xf-slidemenu-wrapper'); var menuButton = '<button class="xf-slidemenu-button xf-button-float-' +jQMenu.data('button-position') + ' xf-button-header-' +jQMenu.data('button-position') + ' xf-button-small-icon-only xf-button-small xf-button" data-position="' +jQMenu.data('button-position') + '" data-skip-enhance="true"><span class="xf-icon xf-icon-list xf-icon-small"></span></button>', menuButtonContainer = $('#' + jQMenu.data('button-container')); menuButtonContainer.find('header').append(menuButton); options.menuButton = '<button class="xf-slidemenu-close-button xf-button-float-' +jQMenu.data('button-position') + ' xf-button-header-' +jQMenu.data('button-position') + ' xf-button-small-icon-only xf-button-small xf-button" data-position="' +jQMenu.data('button-position') + '" data-skip-enhance="true"><span class="xf-icon xf-icon-cross xf-icon-small"></span></button>'; var buttons = jQMenu.find(XF.ui.button.selector); options.buttonsClass = ''; for (var i = 0; i < buttons.length; ++i) { var button = buttons.eq(i); var butOpts = { 'iconClass' : button.attr('data-icon') ? 'xf-icon-' + button.attr('data-icon') : '', 'dataHrefString' : button.attr('data-href') ? button.attr('data-href') : '', 'textClass' : button.attr('data-text-class') ? button.attr('data-text-class') : '', 'id' : button.attr('data-id') ? button.attr('data-id') : options.id + '-item' + i, 'class' : button.attr('data-class') || '', 'text' : button.val() || button.text() || '' }; options.buttons.push(butOpts); } XF.router.on('route', function () { XF.ui.slidemenu.selectButton(jQMenu); if ($('.xf-slidemenu-wrapper')) { $('.xf-slidemenu-wrapper').removeClass('xf-slidemenu-show'); $('body').removeClass('blur-page'); } }); var _template = _.template( '<div class="xf-slidemenu-scrollable"><div class="xf-slidemenu-header"><%= title %><%= menuButton %></div>' + '<%= html %></div>' ); jQMenu.html(_template(options)); XF.trigger('ui:enhance', jQMenu); $('.xf-slidemenu-button').on('tap', function () { $('.xf-slidemenu-wrapper').addClass('xf-slidemenu-show xf-slidemenu-animation'); $('body').addClass('blur-page xf-viewport-transitioning'); return false; }); $('.xf-slidemenu-close-button').on('tap', function () { var delayTime = XF.device.isIOS ? 300 : 0; setTimeout(function () { $('.xf-slidemenu-wrapper').removeClass('xf-slidemenu-show'); $('body').removeClass('blur-page xf-viewport-transitioning'); }, delayTime); return false; }); this.selectButton(jQMenu); }, selectButton : function (el) { var page = XF.history.fragment !== '' ? XF.history.fragment : 'home'; el.find('a').removeClass('xf-slidemenu-item-active'); el.find('a[data-href="#' + page + '"], a[href="#' + page + '"]').addClass('xf-slidemenu-item-active'); } }; });