| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342 |
- /**
- * Definition of the NinjaModal class.
- *
- * @param data (object) The default data to be passed into the class.
- * data.width (int) The width of the modal.
- * data.class (string) The class to be applied to the modal.
- * data.closeOnClick (string/bool) The click options to close the modal.
- * data.closeOnEsc (bool) Whether or not to close the modal on escape.
- * data.title (string) The title of the modal.
- * data.content (string) The content of the modal.
- * data.btnPrimary (object) Information about the primary button of the modal.
- * btnPrimary.text (string) The text content of the button.
- * btnPrimary.class (string) The class to be added to the button.
- * btnPrimary.callback (function) The function to be called when the button is clicked.
- * data.btnSecondary (object) Information about the secondary button of the modal.
- * btnSecondary.text (string) The text content of the button.
- * btnSecondary.class (string) The class to be added to the button.
- * btnSecondary.callback (function) The function to be called when the button is clicked.
- * data.useProgressBar (bool) Whether or not this modal needs the progress bar.
- * data.loadingText (string) The text to be shown while the progress bar is visible.
- */
- function NinjaModal ( data ) {
- // Setup our modal settings.
- this.settings = {
- width: ( 'undefined' != typeof data.width ? data.width : 400 ),
- class: ( 'undefined' != typeof data.class ? data.class : 'dashboard-modal' ),
- closeOnClick: ( 'undefined' != typeof data.closeOnClick ? data.closeOnClick : 'body' ),
- closeOnEsc: ( 'undefined' != typeof data.closeOnEsc ? data.closeOnEsc : true )
- }
- // Setup our title.
- this.title = ( 'undefined' != typeof data.title ? data.title : '' );
- // Setup our content.
- this.content = ( 'undefined' != typeof data.content ? data.content : '' );
- // See if we need buttons.
- this.buttons = {};
- this.buttons.primary = {};
- this.buttons.secondary = {};
- this.buttons.primary.data = ( 'undefined' != typeof data.btnPrimary ? data.btnPrimary : false );
- this.buttons.secondary.data = ( 'undefined' != typeof data.btnSecondary ? data.btnSecondary : false );
- // See if we need the progress bar.
- this.useProgressBar = ( 'undefined' != typeof data.useProgressBar ? data.useProgressBar : false );
- if ( this.useProgressBar ) {
- // TODO: translate
- this.loadingText = ( 'undefined' != typeof data.loadingText ? data.loadingText : 'Loading...' );
- }
- // Declare our popup item.
- this.popup;
- // Declare our button booleans.
- this.hasPrimary = false;
- this.hasSecondary = false;
- // Initialize the popup.
- this.initModal();
- // Show the popup.
- this.toggleModal( true );
- }
- /**
- * Function to destory the modal.
- */
- NinjaModal.prototype.destroy = function () {
- this.popup.destroy();
- }
- /**
- * Function to increment the progress bar.
- *
- * @param max (int) The maximum percentage of complete the progress bar can be.
- */
- NinjaModal.prototype.incrementProgress = function ( max ) {
- var progressBar = document.getElementById( 'nf-progress-bar-slider-' + this.popup.dataId );
- // Get our current progress.
- var currentProgress = progressBar.offsetWidth / progressBar.parentElement.offsetWidth * 100;
- // If we've not already passed the max value...
- if ( max > currentProgress ) {
- // Increase the progress by 1 step.
- currentProgress = Number( currentProgress ) + 1;
- this.setProgress( currentProgress );
- }
- }
- /**
- * Function to initialize the buttons.
- */
- NinjaModal.prototype.initButtons = function () {
- // If we have data for a primary button...
- if ( this.buttons.primary.data ) {
- // Create the button.
- var primary = document.createElement( 'div' );
- primary.id = 'nf-button-primary-' + this.popup.dataId;
- primary.classList.add( 'nf-button', 'primary', 'pull-right' );
- // If we have a class...
- if ( this.buttons.primary.data.class ) {
- // Add it to the class list.
- primary.classList.add( this.buttons.primary.data.class );
- }
- // If we were given button text...
- if ( 'undefined' != typeof this.buttons.primary.data.text ) {
- // Use it.
- primary.innerHTML = this.buttons.primary.data.text;
- } // Otherwise... (We were not given text.)
- else {
- // Use default text.
- // TODO: translate
- primary.innerHTML = 'Confirm';
- }
- this.buttons.primary.dom = primary;
- // Attach the callback.
- this.buttons.primary.callback = this.buttons.primary.data.callback;
- // Record that we have a primary button.
- this.hasPrimary = true;
- // Garbage collection...
- delete this.buttons.primary.data;
- }
- // If we have data for a secondary button...
- if ( this.buttons.secondary.data ) {
- // Create the button.
- var secondary = document.createElement( 'div' );
- secondary.id = 'nf-button-secondary-' + this.popup.dataId;
- secondary.classList.add( 'nf-button', 'secondary' );
- // If we have a class...
- if ( this.buttons.secondary.data.class ) {
- // Add it to the class list.
- secondary.classList.add( this.buttons.secondary.data.class );
- }
- // If we were given button text...
- if ( 'undefined' != typeof this.buttons.secondary.data.text ) {
- // Use it.
- secondary.innerHTML = this.buttons.secondary.data.text;
- } // Otherwise... (We were not given text.)
- else {
- // Use default text.
- // TODO: translate
- secondary.innerHTML = 'Cancel';
- }
- this.buttons.secondary.dom = secondary;
- // Attach the callback.
- this.buttons.secondary.callback = this.buttons.secondary.data.callback;
- // Record that we have a secondary button.
- this.hasSecondary = true;
- // Garbage collection...
- delete this.buttons.secondary.data;
- }
- }
- /**
- * Function to initialize the popup modal.
- */
- NinjaModal.prototype.initModal = function () {
- // Save the context of this for callbacks.
- var that = this;
- // Setup our popup.
- this.popup = new jBox( 'Modal', {
- width: this.settings.width,
- addClass: this.settings.class,
- overlay: true,
- closeOnClick: this.settings.closeOnClick,
- closeOnEsc: this.settings.closeOnEsc,
- onOpen: function() {
- // If we have a primary button...
- if ( that.hasPrimary ) {
- // Attach the callback.
- jQuery( this.content ).find( '#nf-button-primary-' + this.dataId ).click( that.buttons.primary.callback );
- }
- // If we have a secondary button...
- if ( that.hasSecondary ) {
- // Attach the callback.
- jQuery( this.content ).find( '#nf-button-secondary-' + this.dataId ).click( that.buttons.secondary.callback );
- }
- },
- } );
- // Setup our data id to keep the DOM ids unique.
- this.popup.dataId = this.popup.id.replace( 'jBoxID', '' );
- // Render the title.
- this.renderTitle();
- // Initialize the buttons (if they exist).
- this.initButtons();
- // Render the content.
- this.renderContent();
- }
- /**
- * Function to toggle the display of the action block.
- *
- * @param show (bool) Whether to show the block.
- */
- NinjaModal.prototype.maybeShowActions = function ( show ) {
- if ( this.hasPrimary || this.hasSecondary ) {
- if ( show ) {
- document.getElementById( 'nf-action-block-' + this.popup.dataId ).style.display = 'block';
- }
- else {
- document.getElementById( 'nf-action-block-' + this.popup.dataId ).style.display = 'none';
- }
- }
- }
- /**
- * Function to toggle the display of the progress block.
- *
- * @param show (bool) Whether to show the block.
- */
- NinjaModal.prototype.maybeShowProgress = function ( show ) {
- if ( this.useProgressBar ) {
- if ( show ) {
- document.getElementById( 'nf-progress-block-' + this.popup.dataId ).style.display = 'block';
- }
- else {
- document.getElementById( 'nf-progress-block-' + this.popup.dataId ).style.display = 'none';
- }
- }
- }
- /**
- * Function to append the content to the popup.
- */
- NinjaModal.prototype.renderContent = function () {
- // Delcare our template.
- var contentBox = document.createElement( 'div' );
- contentBox.classList.add( 'message' );
- contentBox.style.padding = '0px 20px 20px 20px';
- // Import our content.
- contentBox.innerHTML = this.content;
- // If we were told to use the progress bar...
- if ( this.useProgressBar ) {
- // Define our progress block.
- var progressBlock = document.createElement( 'div' );
- progressBlock.id = 'nf-progress-block-' + this.popup.dataId;
- progressBlock.style.display = 'none';
- // Define our progress bar.
- var progressBar = document.createElement( 'div' );
- progressBar.classList.add( 'nf-progress-bar' );
- var progressSlider = document.createElement( 'div' );
- progressSlider.id = 'nf-progress-bar-slider-' + this.popup.dataId;
- progressSlider.classList.add( 'nf-progress-bar-slider' );
- progressBar.appendChild( progressSlider );
- progressBlock.appendChild( progressBar );
- // Define our loading text.
- var loadingText = document.createElement( 'p' );
- loadingText.style.color = '#1ea9ea';
- loadingText.style.fontWeight = 'bold';
- loadingText.innerHTML = this.loadingText;
- progressBlock.appendChild( loadingText );
- // Append it to the content box.
- contentBox.appendChild( progressBlock );
- }
- // If we have buttons...
- if ( this.hasPrimary || this.hasSecondary ) {
- // Define our action block.
- var actionBlock = document.createElement( 'div' );
- actionBlock.id = 'nf-action-block-' + this.popup.dataId;
- actionBlock.classList.add( 'buttons' );
- // Insert the primary button, if one exists.
- if ( this.hasPrimary ) actionBlock.appendChild( this.buttons.primary.dom );
- // Insert the secondary button, if one exists.
- if ( this.hasSecondary ) actionBlock.appendChild( this.buttons.secondary.dom );
- // Append it to the content box.
- contentBox.appendChild( actionBlock );
- this.popup.onOpen = function() {
- this.buttons.primary.dom.onclick = this.buttons.primary.callback;
- this.buttons.secondary.dom.onclick = this.buttons.secondary.callback;
- }
- }
- // Set our content.
- this.popup.setContent( document.createElement( 'div' ).appendChild( contentBox ).parentElement.innerHTML );
- }
- /**
- * Function to append the title to the popup.
- */
- NinjaModal.prototype.renderTitle = function () {
- // If we have a title...
- if ( '' != this.title ) {
- // Set our title.
- this.popup.setTitle( this.title );
- }
- }
- /**
- * Function to set the value of the progress bar.
- *
- * @param percent (int) The value to set the progress bar to.
- */
- NinjaModal.prototype.setProgress = function ( percent ) {
- // Update the width of the element as a percentage.
- var progressBar = document.getElementById( 'nf-progress-bar-slider-' + this.popup.dataId );
- progressBar.style.width = percent + '%';
- }
- /**
- * Function to toggle the visibility of the popup.
- *
- * @param show (bool) Whether or not to show the popup.
- */
- NinjaModal.prototype.toggleModal = function ( show ) {
- // If we were told to show the modal...
- if ( show ) {
- // Open it.
- this.popup.open();
- } // Otherwise... (We were told to hide it.)
- else {
- // Close it.
- this.popup.close();
- }
- }
- /**
- * Function to update the content of the popup.
- *
- * @param content (string) The new content.
- */
- NinjaModal.prototype.updateContent = function ( content ) {
- // Set the new content.
- this.content = content;
- // Re-render.
- this.renderContent();
- }
- /**
- * Function to update the title of the popup.
- *
- * @param title (string) The new title.
- */
- NinjaModal.prototype.updateTitle = function ( title ) {
- // Set the new title.
- this.title = title;
- // Re-render.
- this.renderTitle();
- }
|