| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365 |
- /**
- * Dashboard Layout View
- *
- * @package Ninja Forms
- * @subpackage Dashboard
- * @copyright (c) 2017 WP Ninjas
- * @since 3.2
- */
- define( [ 'views/sections/widgets.js', 'views/sections/services.js', 'views/sections/apps.js', 'views/sections/memberships.js', 'views/oauth.js', 'views/promotion.js' ], function( WidgetView, ServicesView, AppsView, MembershipsView, OAuthView, PromotionView ) {
- var view = Marionette.View.extend( {
- template: "#tmpl-nf-dashboard",
- currentView: 'widgets',
- regions: {
- notices: '.notices',
- promotions: '.promotions',
- content: '.content'
- },
- events: {
- 'click .widgets a': function(e){
- this.showChildView( 'content', new WidgetView() );
- jQuery( '.' + this.currentView).find( 'a' ).removeClass( 'active' );
- e.target.classList.add( 'active' );
- this.currentView = 'widgets';
- },
- 'click .services a': function(e){
- this.showChildView( 'content', new ServicesView() );
- jQuery( '.' + this.currentView).find( 'a' ).removeClass( 'active' );
- e.target.classList.add( 'active' );
- this.currentView = 'services';
- },
- 'click .apps a': function(e){
- this.showChildView( 'content', new AppsView() );
- jQuery( '.' + this.currentView).find( 'a' ).removeClass( 'active' );
- e.target.classList.add( 'active' );
- this.currentView = 'apps';
- },
- 'click .memberships a': function(e){
- this.showChildView( 'content', new MembershipsView() );
- jQuery( '.' + this.currentView).find( 'a' ).removeClass( 'active' );
- e.target.classList.add( 'active' );
- this.currentView = 'memberships';
- },
- },
- initialize: function() {
- switch( window.location.hash ) {
- case '#apps':
- this.currentView = 'apps';
- break;
- case '#services':
- this.currentView = 'services';
- break;
- case '#memberships':
- this.currentView = 'memberships';
- break;
- case '#widgets':
- default:
- this.currentView = 'widgets';
- }
- /**
- * Radio Routers
- * TODO: Clean this up.
- */
- nfRadio.channel( 'dashboard' ).reply( 'show:widgets', function(){
- this.showChildView('content', new WidgetView() );
- jQuery( 'nav.sections a.active' ).removeClass( 'active' );
- jQuery( 'nav.sections .widgets a' ).addClass( 'active' );
- this.currentView = 'widgets';
- }, this );
- nfRadio.channel( 'dashboard' ).reply( 'show:services', function(){
- this.showChildView('content', new ServicesView() );
- jQuery( 'nav.sections a.active' ).removeClass( 'active' );
- jQuery( 'nav.sections .services a' ).addClass( 'active' );
- this.currentView = 'services';
- }, this );
- nfRadio.channel( 'dashboard' ).reply( 'show:apps', function(){
- this.showChildView('content', new AppsView() );
- jQuery( 'nav.sections a.active' ).removeClass( 'active' );
- jQuery( 'nav.sections .apps a' ).addClass( 'active' );
- this.currentView = 'apps';
- }, this );
- },
- onRender: function() {
- if( useServices ) this.showChildView( 'notices', new OAuthView() );
- if( useServices ) this.showChildView( 'promotions', new PromotionView() );
- switch( window.location.hash ) {
- case '#apps':
- var childView = new AppsView();
- break;
- case '#memberships':
- var childView = new MembershipsView();
- break;
- case '#services':
- var childView = new ServicesView();
- break;
- case '#widgets':
- default:
- var childView = new WidgetView();
- }
- this.showChildView('content', childView );
- // If the user has not seen the opt-in modal yet...
- if ( '1' == nfAdmin.showOptin ) {
- // Declare all of our opt-in code here.
- var optinModal = new jBox( 'Modal', {
- closeOnEsc: false,
- closeOnClick: false,
- width: 400
- } );
- // Define the modal title.
- var title = document.createElement( 'div' );
- title.id = 'optin-modal-title';
- var titleStyling = document.createElement( 'h2' );
- titleStyling.innerHTML = 'Help make Ninja Forms better!';
- title.appendChild( titleStyling );
- // Define the modal content.
- var content = document.createElement( 'div' );
- content.classList.add( 'message' );
- content.style.padding = '0px 20px 20px 20px';
- content.innerHTML = nfi18n.optinContent;
- var p = document.createElement( 'p' );
- p.style.paddingBottom = '10px';
- var checkBox = document.createElement( 'input' );
- checkBox.id = 'optin-send-email';
- checkBox.setAttribute( 'type', 'checkbox' );
- checkBox.style.margin = '7px';
- var label = document.createElement( 'label' );
- label.setAttribute( 'for', 'optin-send-email' );
- label.innerHTML = nfi18n.optinYesplease;
- p.appendChild( checkBox );
- p.appendChild( label );
- content.appendChild( p );
- p = document.createElement( 'p' );
- p.id = 'optin-block';
- p.style.padding = '0px 5px 20px 5px';
- p.style.display = 'none';
- var email = document.createElement( 'input' );
- email.id = 'optin-email-address';
- email.setAttribute( 'type', 'text' );
- email.setAttribute( 'value', nfAdmin.currentUserEmail );
- email.style.width = '100%';
- email.style.fontSize = '16px';
- p.appendChild( email );
- content.appendChild( p );
- var spinner = document.createElement( 'span' );
- spinner.id = 'optin-spinner';
- spinner.classList.add( 'spinner' );
- spinner.style.display = 'none';
- content.appendChild( spinner );
- var actions = document.createElement( 'div' );
- actions.id = 'optin-buttons';
- actions.classList.add( 'buttons' );
- var cancel = document.createElement( 'div' );
- cancel.id = 'optout';
- cancel.classList.add( 'nf-button', 'secondary' );
- cancel.innerHTML = nfi18n.optinSecondary;
- actions.appendChild( cancel );
- var confirm = document.createElement( 'div' );
- confirm.id = 'optin';
- confirm.classList.add( 'nf-button', 'primary', 'pull-right' );
- confirm.innerHTML = nfi18n.optinPrimary;
- actions.appendChild( confirm );
- content.appendChild( actions );
- // Define the success title.
- var successTitle = document.createElement( 'h2' );
- successTitle.innerHTML = nfi18n.optinAwesome;
- // Define the success content.
- var successContent = document.createElement( 'div' );
- successContent.id = 'optin-thankyou';
- successContent.classList.add( 'message' );
- successContent.style.padding = '20px';
- successContent.innerHTML = nfi18n.optinThanks;
- // Set the options for the modal and open it.
- optinModal.setContent( document.createElement( 'div' ).appendChild( content ).innerHTML );
- optinModal.setTitle( document.createElement( 'div' ).appendChild( title ).innerHTML );
- optinModal.open();
- // Show/Hide email field, based on the opt-in checkbox.
- jQuery( '#optin-send-email' ).click( function( e ) {
- if( jQuery( this ).is( ':checked' ) ) {
- jQuery( '#optin-block' ).show();
- } else {
- jQuery( '#optin-block' ).hide();
- }
- } );
- // Setup the optin click event.
- jQuery( '#optin' ).click( function( e ) {
- var sendEmail;
- if ( jQuery( '#optin-send-email' ).attr( 'checked' ) ) {
- sendEmail = 1;
- userEmail = jQuery( '#optin-email-address' ).val();
- } else {
- sendEmail = 0;
- userEmail = '';
- }
- // Disable our buttons.
- jQuery( '#optin' ).unbind( 'click' );
- jQuery( '#optout' ).unbind( 'click' );
- // Get a reference to the current width (to avoid resizing the button).
- var width = jQuery( '#optin' ).width();
- // Show spinner.
- jQuery( '#optin' ).html( '<span class="dashicons dashicons-update dashicons-update-spin"></span>' );
- jQuery( '#optin' ).width( width );
- // Hit AJAX endpoint and opt-in.
- jQuery.post( ajaxurl, { action: 'nf_optin', ninja_forms_opt_in: 1, send_email: sendEmail, user_email: userEmail },
- function( response ) {
- /**
- * When we get a response from our endpoint, show a thank you and set a timeout
- * to close the modal.
- */
- optinModal.setTitle( document.createElement( 'div' ).appendChild( successTitle ).innerHTML );
- optinModal.setContent( document.createElement( 'div' ).appendChild( successContent ).innerHTML );
- setTimeout (
- function(){
- optinModal.close();
- },
- 2000
- );
- } );
- } );
- // Setup the optout click event.
- jQuery( '#optout' ).click( function( e ) {
- // Disable our buttons.
- jQuery( '#optin' ).unbind( 'click' );
- jQuery( '#optout' ).unbind( 'click' );
- // Get a reference to the current width (to avoid resizing the button).
- var width = jQuery( '#optout' ).width();
- // Show spinner.
- jQuery( '#optout' ).html( '<span class="dashicons dashicons-update dashicons-update-spin"></span>' );
- jQuery( '#optout' ).width( width );
- // Hit AJAX endpoint and opt-in.
- jQuery.post( ajaxurl, { action: 'nf_optin', ninja_forms_opt_in: 0 }, function( response ) {
- // When we get a response from our endpoint, close the modal.
- optinModal.close();
- } );
- } );
- } // If we've been told to run cleanup...
- else if ( '1' == nfAdmin.doingCleanup ) {
- // Get the context for later.
- var that = this;
- // Define our modal options.
- var modalData = {
- width: 450,
- closeOnClick: false,
- closeOnEsc: false,
- content: nfi18n.cleanupContent,
- useProgressBar: true,
- loadingText: nfi18n.cleanupLoading,
- btnSecondary: {
- text: nfi18n.cleanupSecondary,
- callback: function() {
- cleanupModal.toggleModal( false );
- }
- },
- btnPrimary: {
- text: nfi18n.cleanupPrimary,
- callback: function() {
- // Prevent the user from leaving without firing an alert.
- jQuery( window ).bind( 'beforeunload', function() {
- return 'Are you sure? Leaving before the process completes could cause damage to your data.';
- } );
- // Hide the buttons.
- cleanupModal.maybeShowActions( false );
- // Show the progress bar.
- cleanupModal.maybeShowProgress( true );
- // Begin our cleanup process.
- that.cleanupProcess( that, -1, cleanupModal );
- },
- },
- };
- // Setup our modal.
- var cleanupModal = new NinjaModal( modalData );
- }
- // If form telemetry is defined...
- // AND if we should run it...
- if ( 'undefined' !== typeof nfAdmin.formTelemetry && 1 == nfAdmin.formTelemetry ) {
- // Make our AJAX call.
- var data = {
- action: 'nf_form_telemetry',
- security: nfAdmin.ajaxNonce
- }
- // Make our AJAX call.
- jQuery.post( ajaxurl, data );
- }
- },
- templateContext: function() {
- var that = this;
- return {
- renderNav: function() {
- var content = document.createElement( 'div' );
- _.each( nfDashItems, function(section) {
- var item = document.createElement( 'li' );
- var link = document.createElement( 'a' );
- link.href = '#' + section.slug;
- if ( that.currentView == section.slug ) link.classList.add( 'active' );
- link.innerHTML = section.niceName;
- item.classList.add( section.slug );
- item.appendChild( link );
- content.appendChild( item );
- } );
- return content.innerHTML;
- },
- }
- },
-
- /**
- * Function to manage our data cleanup batch process response.
- *
- * @since 3.3.1
- *
- * @param context (this) The context at the time of function definition.
- * @param steps (int) The total number of steps in this process.
- * @param modal (jBox) A reference to the modal where this process is running.
- */
- cleanupProcess: function( context, steps, modal ) {
- var data = {
- action: 'nf_batch_process',
- batch_type: 'data_cleanup',
- security: nfAdmin.batchNonce
- };
- jQuery.post( ajaxurl, data, function( response ) {
- response = JSON.parse( response );
- // If we're done...
- if ( response.batch_complete ) {
- // Push our progress bar to 100%.
- modal.setProgress( 100 );
- // Allow the user to leave the page now.
- jQuery( window ).unbind( 'beforeunload' );
- modal.toggleModal( false );
- // Exit.
- return false;
- }
- // If we do not yet have a determined number of steps...
- if ( -1 == steps ) {
- // If step_toal is defined...
- if ( 'undefined' != typeof response.step_total ) {
- // Use the step_total.
- steps = response.step_total;
- } // Otherwise... (step_total is not defined)
- else {
- // Use step_remaining.
- steps = response.step_remaining;
- }
- }
- // Calculate our current step.
- var step = steps - response.step_remaining;
- // Calculate our maximum progress for this step.
- var maxProgress = Math.round( step / steps * 100 );
- // Increment the progress.
- modal.incrementProgress ( maxProgress );
- // Recall our function...
- context.cleanupProcess( context, steps, modal );
- } );
- }
- } );
- return view;
- } );
|