2016-01-26 21:12:48 +03:00
import Base from './base'
import Util from './util'
const CollapseInline = ( ( $ ) => {
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Constants
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
const NAME = 'collapseInline'
const DATA _KEY = ` mdb. ${ NAME } `
const JQUERY _NAME = ` mdb ${ NAME . charAt ( 0 ) . toUpperCase ( ) + NAME . slice ( 1 ) } `
const JQUERY _NO _CONFLICT = $ . fn [ JQUERY _NAME ]
const Selector = {
ANY _INPUT : 'input, select, textarea'
}
const ClassName = {
IN : 'in' ,
COLLAPSE : 'collapse' ,
COLLAPSING : 'collapsing' ,
COLLAPSED : 'collapsed' ,
WIDTH : 'width'
}
const Default = { }
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* Class Definition
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
class CollapseInline extends Base {
// $element is expected to be the trigger
2016-03-21 17:56:51 +03:00
// i.e. <button class="btn bmd-btn-icon" for="search" data-toggle="collapse" data-target="#search-field" aria-expanded="false" aria-controls="search-field">
2016-01-26 21:12:48 +03:00
constructor ( $element , config ) {
super ( $element , $ . extend ( true , { } , Default , config ) )
this . $mdbFormGroup = this . findMdbFormGroup ( true )
let collapseSelector = $element . data ( 'target' )
this . $collapse = $ ( collapseSelector )
Util . assert ( $element , this . $collapse . length === 0 , ` Cannot find collapse target for ${ Util . describe ( $element ) } ` )
Util . assert ( this . $collapse , ! this . $collapse . hasClass ( ClassName . COLLAPSE ) , ` ${ Util . describe ( this . $collapse ) } is expected to have the ' ${ ClassName . COLLAPSE } ' class. It is being targeted by ${ Util . describe ( $element ) } ` )
// find the first input for focusing
let $inputs = this . $mdbFormGroup . find ( Selector . ANY _INPUT )
if ( $inputs . length > 0 ) {
this . $input = $inputs . first ( )
}
// automatically add the marker class to collapse width instead of height - nice convenience because it is easily forgotten
if ( ! this . $collapse . hasClass ( ClassName . WIDTH ) ) {
this . $collapse . addClass ( ClassName . WIDTH )
}
if ( this . $input ) {
// add a listener to set focus
this . $collapse . on ( 'shown.bs.collapse' , ( ) => {
this . $input . focus ( )
} )
// add a listener to collapse field
this . $input . blur ( ( ) => {
this . $collapse . collapse ( 'hide' )
} )
}
}
dispose ( ) {
super . dispose ( DATA _KEY )
this . $mdbFormGroup = null
this . $collapse = null
this . $input = null
}
// ------------------------------------------------------------------------
// private
// ------------------------------------------------------------------------
// static
static _jQueryInterface ( config ) {
return this . each ( function ( ) {
let $element = $ ( this )
let data = $element . data ( DATA _KEY )
if ( ! data ) {
data = new CollapseInline ( $element , config )
$element . data ( DATA _KEY , data )
}
} )
}
}
/ * *
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* jQuery
* -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
* /
$ . fn [ JQUERY _NAME ] = CollapseInline . _jQueryInterface
$ . fn [ JQUERY _NAME ] . Constructor = CollapseInline
$ . fn [ JQUERY _NAME ] . noConflict = ( ) => {
$ . fn [ JQUERY _NAME ] = JQUERY _NO _CONFLICT
return CollapseInline . _jQueryInterface
}
return CollapseInline
} ) ( jQuery )
export default CollapseInline