2015-08-17 17:00:26 -07:00
/ * *
* @ file
* Dialog API inspired by HTML5 dialog element .
*
* @ see http : //www.whatwg.org/specs/web-apps/current-work/multipage/commands.html#the-dialog-element
* /
( function ( $ , Drupal , drupalSettings ) {
2015-10-21 21:44:50 -07:00
'use strict' ;
2015-08-17 17:00:26 -07:00
/ * *
* Default dialog options .
*
* @ type { object }
*
* @ prop { bool } [ autoOpen = true ]
* @ prop { string } [ dialogClass = '' ]
* @ prop { string } [ buttonClass = 'button' ]
* @ prop { string } [ buttonPrimaryClass = 'button--primary' ]
* @ prop { function } close
* /
drupalSettings . dialog = {
autoOpen : true ,
dialogClass : '' ,
// Drupal-specific extensions: see dialog.jquery-ui.js.
buttonClass : 'button' ,
buttonPrimaryClass : 'button--primary' ,
// When using this API directly (when generating dialogs on the client
// side), you may want to override this method and do
// `jQuery(event.target).remove()` as well, to remove the dialog on
// closing.
close : function ( event ) {
Drupal . detachBehaviors ( event . target , null , 'unload' ) ;
}
} ;
/ * *
* @ typedef { object } Drupal . dialog ~ dialogDefinition
*
* @ prop { boolean } open
* Is the dialog open or not .
* @ prop { * } returnValue
* Return value of the dialog .
* @ prop { function } show
* Method to display the dialog on the page .
* @ prop { function } showModal
* Method to display the dialog as a modal on the page .
* @ prop { function } close
* Method to hide the dialog from the page .
* /
/ * *
* Polyfill HTML5 dialog element with jQueryUI .
*
* @ param { HTMLElement } element
* @ param { object } options
* jQuery UI options to be passed to the dialog .
*
* @ return { Drupal . dialog ~ dialogDefinition }
* /
Drupal . dialog = function ( element , options ) {
function openDialog ( settings ) {
settings = $ . extend ( { } , drupalSettings . dialog , options , settings ) ;
// Trigger a global event to allow scripts to bind events to the dialog.
$ ( window ) . trigger ( 'dialog:beforecreate' , [ dialog , $element , settings ] ) ;
$element . dialog ( settings ) ;
dialog . open = true ;
$ ( window ) . trigger ( 'dialog:aftercreate' , [ dialog , $element , settings ] ) ;
}
function closeDialog ( value ) {
$ ( window ) . trigger ( 'dialog:beforeclose' , [ dialog , $element ] ) ;
$element . dialog ( 'close' ) ;
dialog . returnValue = value ;
dialog . open = false ;
$ ( window ) . trigger ( 'dialog:afterclose' , [ dialog , $element ] ) ;
}
var undef ;
var $element = $ ( element ) ;
var dialog = {
open : false ,
returnValue : undef ,
show : function ( ) {
openDialog ( { modal : false } ) ;
} ,
showModal : function ( ) {
openDialog ( { modal : true } ) ;
} ,
close : closeDialog
} ;
return dialog ;
} ;
} ) ( jQuery , Drupal , drupalSettings ) ;