%PDF- %PDF-
Direktori : /www/varak.net/wiki.varak.net/extensions/MobileFrontend/resources/mobile.startup/ |
Current File : /www/varak.net/wiki.varak.net/extensions/MobileFrontend/resources/mobile.startup/Drawer.js |
( function ( M ) { var Panel = M.require( 'mobile.startup/Panel' ), util = M.require( 'mobile.startup/util' ), Icon = M.require( 'mobile.startup/Icon' ); /** * A {@link View} that pops up from the bottom of the screen. * @class Drawer * @extends Panel */ function Drawer() { Panel.apply( this, arguments ); } OO.mfExtend( Drawer, Panel, { /** * @memberof Drawer * @instance * @mixes Panel#defaults * @property {Object} defaults Default options hash. * @property {string} defaults.cancelButton HTML of the button that closes the drawer. */ defaults: util.extend( {}, Panel.prototype.defaults, { cancelButton: new Icon( { tagName: 'a', name: 'close-invert', additionalClassNames: 'cancel', label: mw.msg( 'mobile-frontend-overlay-close' ) } ).toHtmlString(), collapseIcon: new Icon( { name: 'arrow', additionalClassNames: 'cancel' } ).options } ), /** * @memberof Drawer * @instance */ templatePartials: util.extend( {}, Panel.prototype.templatePartials, { icon: Icon.prototype.template } ), /** * @memberof Drawer * @instance */ className: 'drawer position-fixed', /** * Defines an element that the Drawer should automatically be appended to. * @memberof Drawer * @instance * @property {string} */ appendToElement: 'body', /** * Whether the drawer should disappear on a scroll event * @memberof Drawer * @instance * @property {boolean} */ closeOnScroll: true, events: util.extend( {}, Panel.prototype.events, { click: 'stopPropagation' } ), /** * @inheritdoc * @memberof Drawer * @instance */ postRender: function () { var self = this; // This module might be loaded at the top of the page e.g. Special:Uploads // Thus ensure we wait for the DOM to be loaded util.docReady( function () { self.appendTo( self.appendToElement ); self.$el.parent().addClass( 'has-drawer' ); } ); this.on( 'show', this.onShowDrawer.bind( this ) ); this.on( 'hide', this.onHideDrawer.bind( this ) ); }, /** * Stop Propagation event handler * @memberof Drawer * @instance * @param {Object} ev event object * Allow the drawer itself to be clickable (e.g. for copying and pasting references * clicking links in reference) */ stopPropagation: function ( ev ) { ev.stopPropagation(); }, /** * ShowDrawer event handler * @memberof Drawer * @instance */ onShowDrawer: function () { var self = this; this.$el.parent().addClass( 'drawer-visible' ); setTimeout( function () { var $window = util.getWindow(); $window.one( 'click.drawer', self.hide.bind( self ) ); if ( self.closeOnScroll ) { $window.one( 'scroll.drawer', self.hide.bind( self ) ); } }, self.minHideDelay ); }, /** * HideDrawer event handler * @memberof Drawer * @instance */ onHideDrawer: function () { this.$el.parent().removeClass( 'drawer-visible' ); // .one() registers one callback for scroll and click independently // if one fired, get rid of the other one util.getWindow().off( '.drawer' ); } } ); M.define( 'mobile.startup/Drawer', Drawer ); }( mw.mobileFrontend ) );