diff --git a/assets/css/src/modal.styl b/assets/css/src/modal.styl index ba53b87198..39133d00f6 100644 --- a/assets/css/src/modal.styl +++ b/assets/css/src/modal.styl @@ -45,7 +45,6 @@ body.mailpoet_modal_opened position: absolute z-index: 25 top: 48px - padding-bottom: 48px margin: 0 .mailpoet_popup_wrapper @@ -54,6 +53,7 @@ body.mailpoet_modal_opened position: relative width: 100% z-index: 0 + height: 96% .mailpoet_overlay_hidden .mailpoet_popup_wrapper border: 1px solid #333 @@ -75,6 +75,7 @@ body.mailpoet_modal_opened .mailpoet_popup_body padding: 10px 10px 10px 10px + height: 92% // modal panel #mailpoet_modal_overlay.mailpoet_panel_overlay diff --git a/assets/css/src/newsletter_editor/libraryOverrides.styl b/assets/css/src/newsletter_editor/libraryOverrides.styl index 85f2c67e0a..2efdebab9a 100644 --- a/assets/css/src/newsletter_editor/libraryOverrides.styl +++ b/assets/css/src/newsletter_editor/libraryOverrides.styl @@ -127,9 +127,6 @@ body background-color: $primary-background-color border: 1px solid $content-border-color -#mailpoet_modal_close - display: none - .wrap > .mailpoet_notice, .notice .update-nag diff --git a/assets/js/src/modal.js b/assets/js/src/modal.js index 7a1573d60d..c50b204d1c 100644 --- a/assets/js/src/modal.js +++ b/assets/js/src/modal.js @@ -1,643 +1,644 @@ -define('modal', ['mailpoet', 'jquery'], - function(MailPoet, jQuery) { - 'use strict'; - /*************************************************************************** - MailPoet Modal: - - version: 0.9 - author: Jonathan Labreuille - company: Wysija - dependencies: jQuery - - Usage: - // popup mode - MailPoet.Modal.popup(options); - - // panel mode - MailPoet.Modal.panel(options); - - // loading mode - MailPoet.Modal.loading(bool); - ***************************************************************************/ - - MailPoet.Modal = { - version: 0.9, - - // flags - initialized: false, - opened: false, - locked: false, - - // previously focused element - prevFocus: null, - - // sub panels - subpanels: [], - - // default values - defaults: { - // title - title: null, - - // type - type: null, - - // positionning - position: 'right', - - // data sources - data: {}, - url: null, - method: 'get', - params: {}, - - // template - template: null, - body_template: null, - - // dimensions - width: 'auto', - height: 'auto', - - // display overlay - overlay: false, - - // focus upon displaying - focus: true, - - // highlighted elements - highlight: null, - - // callbacks - onInit: null, - onSuccess: null, - onCancel: null - }, - renderer: 'html', - options: {}, - templates: { - overlay: '', - popup: '
'+ - '
'+ - ''+ - '

'+ - '
'+ - '
'+ - '
', - loading: '', - panel: '
'+ - ''+ - '
'+ - '
'+ - '
'+ - '
', - subpanel: '
'+ - '
'+ - '
' - }, - getContentContainer: function() { - return jQuery('.mailpoet_'+this.options.type+'_body'); - }, - setRenderer: function(renderer) { - this.renderer = renderer; - return this; - }, - compileTemplate: function(template) { - if(this.renderer === 'html') { - return function() { return template; }; - } else { - return Handlebars.compile(template); - } - return false; - }, - init: function(options) { - if(this.initialized === true) { - this.close(); - } - // merge options - this.options = jQuery.extend({}, this.defaults, options); - - // set renderer - this.setRenderer(this.options.renderer); - - // init overlay - this.initOverlay(); - - // toggle overlay - this.toggleOverlay(this.options.overlay); - - if(this.options.type !== null) { - // insert modal depending on its type - if(this.options.type === 'popup') { - var modal = this.compileTemplate( - this.templates[this.options.type] - ); - // create modal - jQuery('#mailpoet_modal_overlay') - .append(modal(this.options)); - // set title - jQuery('#mailpoet_popup_title h2') - .html(this.options.title); - } else if(this.options.type === 'panel') { - // create panel - jQuery('#mailpoet_modal_overlay') - .after(this.templates[this.options.type]); - } - - // add proper overlay class - jQuery('#mailpoet_modal_overlay') - .removeClass('mailpoet_popup_overlay mailpoet_panel_overlay') - .addClass('mailpoet_'+this.options.type+'_overlay'); - } - - // set "success" callback if specified - if(options.onSuccess !== undefined) { - this.options.onSuccess = options.onSuccess; - } - - // set "cancel" callback if specified - if(options.onCancel !== undefined) { - this.options.onCancel = options.onCancel; - } - - // compile template - this.options.body_template = this.compileTemplate( - this.options.template - ); - - // setup events - this.setupEvents(); - - // set popup as initialized - this.initialized = true; - - return this; - }, - initOverlay: function(toggle) { - if(jQuery('#mailpoet_modal_overlay').length === 0) { - // insert overlay into the DOM - jQuery('body').append(this.templates.overlay); - // insert loading indicator into overlay - jQuery('#mailpoet_modal_overlay').append(this.templates.loading); - } - return this; - }, - toggleOverlay: function(toggle) { - if(toggle === true) { - jQuery('#mailpoet_modal_overlay') - .removeClass('mailpoet_overlay_hidden'); - } else { - jQuery('#mailpoet_modal_overlay') - .addClass('mailpoet_overlay_hidden'); - } - - return this; - }, - setupEvents: function() { - // close popup when user clicks on close button - jQuery('#mailpoet_modal_close').on('click', this.cancel.bind(this)); - - // close popup when user clicks on overlay - jQuery('#mailpoet_modal_overlay').on('click', function(e) { - // we need to make sure that we are actually clicking on the overlay - // because when clicking on the popup content, it will trigger - // the click event on the overlay - if(e.target.id === 'mailpoet_modal_overlay') { this.cancel(); } - }.bind(this)); - - // close popup when user presses ESC key - jQuery(document).on('keyup.mailpoet_modal', function(e) { - if(this.opened === false) { return false; } - if(e.keyCode === 27) { this.cancel(); } - }.bind(this)); - - // make sure the popup is repositioned when the window is resized - jQuery(window).on('resize.mailpoet_modal', function() { - this.setPosition(); - }.bind(this)); - - return this; - }, - removeEvents: function() { - jQuery(document).unbind('keyup.mailpoet_modal'); - jQuery(window).unbind('resize.mailpoet_modal'); - jQuery('#mailpoet_modal_close').off('click'); - if(this.options.overlay === true) { - jQuery('#mailpoet_modal_overlay').off('click'); - } - - return this; - }, - lock: function() { - this.locked = true; - - return this; - }, - unlock: function() { - this.locked = false; - - return this; - }, - isLocked: function() { - return this.locked; - }, - loadTemplate: function() { - if(this.subpanels.length > 0) { - // hide panel - jQuery('.mailpoet_'+this.options.type+'_wrapper').hide(); - - // add sub panel wrapper - jQuery('#mailpoet_'+this.options.type) - .append(this.templates['subpanel']); - - // add sub panel content - jQuery('.mailpoet_'+this.options.type+'_body').last() - .html(this.subpanels[(this.subpanels.length - 1)].element); - - // focus on sub panel - if(this.options.focus) { - this.focus(); - } - } else if (this.options.element) { - jQuery('.mailpoet_'+this.options.type+'_body').empty(); - jQuery('.mailpoet_'+this.options.type+'_body') - .append(this.options.element); - } else { - jQuery('.mailpoet_'+this.options.type+'_body') - .html( - this.options.body_template( - this.options.data - ) - ); - } - - return this; - }, - loadUrl: function() { - if(this.options.method === 'get') { - // make ajax request - jQuery.getJSON(this.options.url, - function(data) { - this.options.data = jQuery.extend({}, this.options.data, data); - // load template using fetched data - this.loadTemplate(); - // show modal window - this.showModal(); - }.bind(this) - ); - } else if(this.options.method === 'post') { - // make ajax request - jQuery.post(this.options.url, JSON.stringify(this.options.params), - function(data) { - this.options.data = jQuery.extend({}, this.options.data, data); - // load template using fetched data - this.loadTemplate(); - // show modal window - this.showModal(); - }.bind(this), - 'json' - ); - } - - return this; - }, - setDimensions: function() { - switch(this.options.type) { - case 'popup': - // set popup dimensions - jQuery('#mailpoet_popup').css({ - width: this.options.width, - minHeight: this.options.height - }); - // set popup wrapper height - jQuery('#mailpoet_popup_wrapper').css({ - height: this.options.height - }); - break; - case 'panel': - // set dimensions - if(this.options.position === 'right') { - jQuery('#mailpoet_panel').css({ - width: this.options.width, - right: 0, - marginRight: '-' + this.options.width, - left: 'auto' - }); - } else if(this.options.position === 'left') { - jQuery('#mailpoet_panel').css({ - width: this.options.width, - left: 0, - marginLeft: '-' + this.options.width, - right: 'auto' - }); - } - jQuery('#mailpoet_panel').css({ minHeight: 'auto' }); - break; - } - - return this; - }, - setPosition: function() { - switch(this.options.type) { - case 'popup': - var screenWidth = jQuery(window).width(), - screenHeight = jQuery(window).height(), - modalWidth = jQuery('.mailpoet_'+ this.options.type +'_wrapper').width(), - modalHeight = jQuery('.mailpoet_'+ this.options.type +'_wrapper').height(); - - var top = Math.max(48, parseInt((screenHeight / 2) - (modalHeight / 2))), - left = Math.max(0, parseInt((screenWidth / 2) - (modalWidth / 2))); - - // set position of popup depending on screen dimensions. - jQuery('#mailpoet_popup').css({ - top: top, - left: left - }); - break; - case 'panel': - setTimeout(function() { - // set position of popup depending on screen dimensions. - if(this.options.position === 'right') { - jQuery('#mailpoet_panel').css({ - marginRight: 0 - }); - } else if(this.options.position === 'left') { - jQuery('#mailpoet_panel').css({ - marginLeft: 0 - }); - } - }.bind(this), 0); - break; - } - - return this; - }, - showModal: function() { - // set modal dimensions - this.setDimensions(); - - // remember the previously focused element - this.prevFocus = jQuery(':focus'); - - // add a flag on the body so that we can prevent scrolling - jQuery('body').addClass('mailpoet_modal_opened'); - - // show popup - jQuery('#mailpoet_'+this.options.type).show(); - - // display overlay - this.showOverlay(); - - // set modal position - this.setPosition(); - - // add class on highlighted elements - if(this.options.highlight !== null) { - if(this.options.highlight.length > 0) { - this.highlightOn(this.options.highlight); - } - } - - if(this.options.focus) { - this.focus(); - } - - // set popup as opened - this.opened = true; - - // trigger init event if specified - if(this.options.onInit !== null) { - this.options.onInit(this); - } - - return this; - }, - focus: function() { - if(this.options.type == 'popup') { - jQuery('#mailpoet_'+this.options.type).focus(); - } else { - // panel and subpanel - jQuery('#mailpoet_'+this.options.type+' .mailpoet_panel_wrapper') - .filter(':visible').focus(); - } - return this; - }, - highlightOn: function(element) { - jQuery(element).addClass('mailpoet_modal_highlight'); - return this; - }, - highlightOff: function() { - jQuery('.mailpoet_modal_highlight') - .removeClass('mailpoet_modal_highlight'); - return this; - }, - hideModal: function(callback) { - // set modal as closed - this.opened = false; - - // hide modal - jQuery('#mailpoet_'+this.options.type).hide(); - - // remove class on highlighted elements - this.highlightOff(); - - // remove class from body to let it be scrollable - jQuery('body').removeClass('mailpoet_modal_opened'); - - return this; - }, - showOverlay: function(force) { - jQuery('#mailpoet_modal_overlay').show(); - return this; - }, - hideOverlay: function() { - jQuery('#mailpoet_modal_overlay').hide(); - return this; - }, - popup: function(options) { - // get options - options = options || {}; - // set modal type - options.type = 'popup'; - // set overlay state - options.overlay = options.overlay || true; - // initialize modal - this.init(options); - // open modal - this.open(); - - return this; - }, - panel: function(options) { - // get options - options = options || {}; - // reset subpanels - this.subpanels = []; - // set modal type - options.type = 'panel'; - // set overlay state - options.overlay = options.overlay || false; - // set highlighted element - options.highlight = options.highlight || null; - // set modal dimensions - options.width = options.width || '40%'; - options.height = options.height || 'auto'; - // initialize modal - this.init(options); - // open modal - this.open(); - - return this; - }, - subpanel: function(options) { - if(this.opened === false) { - // if no panel is already opened, let's create one instead - this.panel(options); - } else { - // if a panel is already opened, add a sub panel to it - this.subpanels.push(options); - this.loadTemplate(); - } - - return this; - }, - loading: function(toggle) { - // make sure the overlay is initialized and that it's visible - this.initOverlay(true); - - if(toggle === true) { - this.showLoading(); - } else { - this.hideLoading(); - } - - return this; - }, - showLoading: function() { - jQuery('#mailpoet_loading').show(); - - // add loading class to overlay - jQuery('#mailpoet_modal_overlay') - .addClass('mailpoet_overlay_loading'); - - return this; - }, - hideLoading: function() { - jQuery('#mailpoet_loading').hide(); - - // remove loading class from overlay - jQuery('#mailpoet_modal_overlay') - .removeClass('mailpoet_overlay_loading'); - - return this; - }, - open: function() { - // load template if specified - if(this.options.template !== null) { - // check if a url was specified to get extra data - if(this.options.url !== null) { - this.loadUrl(); - } else { - // load template - this.loadTemplate(); - - // show modal window - this.showModal(); - } - } else { - this.cancel(); - } - - return this; - }, - success: function() { - if(this.subpanels.length > 0) { - if(this.subpanels[(this.subpanels.length - 1)].onSuccess !== undefined) { - this.subpanels[(this.subpanels.length - 1)].onSuccess(this.subpanels[(this.subpanels.length - 1)].data); - } - } else { - if(this.options.onSuccess !== null) { - this.options.onSuccess(this.options.data); - } - } - this.close(); - - return this; - }, - cancel: function() { - if(this.subpanels.length > 0) { - if(this.subpanels[(this.subpanels.length - 1)].onCancel !== undefined) { - this.subpanels[(this.subpanels.length - 1)].onCancel(this.subpanels[(this.subpanels.length - 1)].data); - } - } else { - if(this.options.onCancel !== null) { - this.options.onCancel(this.options.data); - } - } - this.close(); - - return this; - }, - destroy: function() { - this.hideOverlay(); - - // remove extra modal - if(jQuery('#mailpoet_'+this.options.type).length > 0) { - jQuery('#mailpoet_'+this.options.type).remove(); - } - - this.initialized = false; - - return this; - }, - close: function() { - if(this.isLocked() === true) { return this; } - - if(this.subpanels.length > 0) { - // close subpanel - jQuery('.mailpoet_'+this.options.type+'_wrapper').last().remove(); - - // show previous panel - jQuery('.mailpoet_'+this.options.type+'_wrapper').last().show(); - - // remove last subpanels - this.subpanels.pop(); - - // focus on previous panel - if(this.options.focus) { - this.focus(); - } - - return this; - } - - // remove event handlers - this.removeEvents(); - - // hide modal window - this.hideModal(); - - // destroy modal element - this.destroy(); - - // restore the previously focused element - if(this.prevFocus !== undefined){ - this.prevFocus.focus(); - } - - // reset options - this.options = { - onSuccess: null, - onCancel: null - }; - - return this; - } - }; - } -); - +define('modal', ['mailpoet', 'jquery'], + function(MailPoet, jQuery) { + 'use strict'; + /*************************************************************************** + MailPoet Modal: + + version: 0.9 + author: Jonathan Labreuille + company: Wysija + dependencies: jQuery + + Usage: + // popup mode + MailPoet.Modal.popup(options); + + // panel mode + MailPoet.Modal.panel(options); + + // loading mode + MailPoet.Modal.loading(bool); + ***************************************************************************/ + + MailPoet.Modal = { + version: 0.9, + + // flags + initialized: false, + opened: false, + locked: false, + + // previously focused element + prevFocus: null, + + // sub panels + subpanels: [], + + // default values + defaults: { + // title + title: null, + + // type + type: null, + + // positionning + position: 'right', + + // data sources + data: {}, + url: null, + method: 'get', + params: {}, + + // template + template: null, + body_template: null, + + // dimensions + width: 'auto', + height: 'auto', + + // display overlay + overlay: false, + + // focus upon displaying + focus: true, + + // highlighted elements + highlight: null, + + // callbacks + onInit: null, + onSuccess: null, + onCancel: null + }, + renderer: 'html', + options: {}, + templates: { + overlay: '', + popup: '
'+ + '
'+ + ''+ + '

'+ + '
'+ + '
'+ + '
', + loading: '', + panel: '
'+ + ''+ + '
'+ + '
'+ + '
'+ + '
', + subpanel: '
'+ + '
'+ + '
' + }, + getContentContainer: function() { + return jQuery('.mailpoet_'+this.options.type+'_body'); + }, + setRenderer: function(renderer) { + this.renderer = renderer; + return this; + }, + compileTemplate: function(template) { + if(this.renderer === 'html') { + return function() { return template; }; + } else { + return Handlebars.compile(template); + } + return false; + }, + init: function(options) { + if(this.initialized === true) { + this.close(); + } + // merge options + this.options = jQuery.extend({}, this.defaults, options); + + // set renderer + this.setRenderer(this.options.renderer); + + // init overlay + this.initOverlay(); + + // toggle overlay + this.toggleOverlay(this.options.overlay); + + if(this.options.type !== null) { + // insert modal depending on its type + if(this.options.type === 'popup') { + var modal = this.compileTemplate( + this.templates[this.options.type] + ); + // create modal + jQuery('#mailpoet_modal_overlay') + .append(modal(this.options)); + // set title + jQuery('#mailpoet_popup_title h2') + .html(this.options.title); + } else if(this.options.type === 'panel') { + // create panel + jQuery('#mailpoet_modal_overlay') + .after(this.templates[this.options.type]); + } + + // add proper overlay class + jQuery('#mailpoet_modal_overlay') + .removeClass('mailpoet_popup_overlay mailpoet_panel_overlay') + .addClass('mailpoet_'+this.options.type+'_overlay'); + } + + // set "success" callback if specified + if(options.onSuccess !== undefined) { + this.options.onSuccess = options.onSuccess; + } + + // set "cancel" callback if specified + if(options.onCancel !== undefined) { + this.options.onCancel = options.onCancel; + } + + // compile template + this.options.body_template = this.compileTemplate( + this.options.template + ); + + // setup events + this.setupEvents(); + + // set popup as initialized + this.initialized = true; + + return this; + }, + initOverlay: function(toggle) { + if(jQuery('#mailpoet_modal_overlay').length === 0) { + // insert overlay into the DOM + jQuery('body').append(this.templates.overlay); + // insert loading indicator into overlay + jQuery('#mailpoet_modal_overlay').append(this.templates.loading); + } + return this; + }, + toggleOverlay: function(toggle) { + if(toggle === true) { + jQuery('#mailpoet_modal_overlay') + .removeClass('mailpoet_overlay_hidden'); + } else { + jQuery('#mailpoet_modal_overlay') + .addClass('mailpoet_overlay_hidden'); + } + + return this; + }, + setupEvents: function() { + // close popup when user clicks on close button + jQuery('#mailpoet_modal_close').on('click', this.cancel.bind(this)); + + // close popup when user clicks on overlay + jQuery('#mailpoet_modal_overlay').on('click', function(e) { + // we need to make sure that we are actually clicking on the overlay + // because when clicking on the popup content, it will trigger + // the click event on the overlay + if(e.target.id === 'mailpoet_modal_overlay') { this.cancel(); } + }.bind(this)); + + // close popup when user presses ESC key + jQuery(document).on('keyup.mailpoet_modal', function(e) { + if(this.opened === false) { return false; } + if(e.keyCode === 27) { this.cancel(); } + }.bind(this)); + + // make sure the popup is repositioned when the window is resized + jQuery(window).on('resize.mailpoet_modal', function() { + this.setPosition(); + }.bind(this)); + + return this; + }, + removeEvents: function() { + jQuery(document).unbind('keyup.mailpoet_modal'); + jQuery(window).unbind('resize.mailpoet_modal'); + jQuery('#mailpoet_modal_close').off('click'); + if(this.options.overlay === true) { + jQuery('#mailpoet_modal_overlay').off('click'); + } + + return this; + }, + lock: function() { + this.locked = true; + + return this; + }, + unlock: function() { + this.locked = false; + + return this; + }, + isLocked: function() { + return this.locked; + }, + loadTemplate: function() { + if(this.subpanels.length > 0) { + // hide panel + jQuery('.mailpoet_'+this.options.type+'_wrapper').hide(); + + // add sub panel wrapper + jQuery('#mailpoet_'+this.options.type) + .append(this.templates['subpanel']); + + // add sub panel content + jQuery('.mailpoet_'+this.options.type+'_body').last() + .html(this.subpanels[(this.subpanels.length - 1)].element); + + // focus on sub panel + if(this.options.focus) { + this.focus(); + } + } else if (this.options.element) { + jQuery('.mailpoet_'+this.options.type+'_body').empty(); + jQuery('.mailpoet_'+this.options.type+'_body') + .append(this.options.element); + } else { + jQuery('.mailpoet_'+this.options.type+'_body') + .html( + this.options.body_template( + this.options.data + ) + ); + } + + return this; + }, + loadUrl: function() { + if(this.options.method === 'get') { + // make ajax request + jQuery.getJSON(this.options.url, + function(data) { + this.options.data = jQuery.extend({}, this.options.data, data); + // load template using fetched data + this.loadTemplate(); + // show modal window + this.showModal(); + }.bind(this) + ); + } else if(this.options.method === 'post') { + // make ajax request + jQuery.post(this.options.url, JSON.stringify(this.options.params), + function(data) { + this.options.data = jQuery.extend({}, this.options.data, data); + // load template using fetched data + this.loadTemplate(); + // show modal window + this.showModal(); + }.bind(this), + 'json' + ); + } + + return this; + }, + setDimensions: function() { + switch(this.options.type) { + case 'popup': + console.log(this.options) + // set popup dimensions + jQuery('#mailpoet_popup').css({ + width: this.options.width, + height: this.options.height + }); + // set popup wrapper height + jQuery('#mailpoet_popup_wrapper').css({ + height: this.options.height + }); + break; + case 'panel': + // set dimensions + if(this.options.position === 'right') { + jQuery('#mailpoet_panel').css({ + width: this.options.width, + right: 0, + marginRight: '-' + this.options.width, + left: 'auto' + }); + } else if(this.options.position === 'left') { + jQuery('#mailpoet_panel').css({ + width: this.options.width, + left: 0, + marginLeft: '-' + this.options.width, + right: 'auto' + }); + } + jQuery('#mailpoet_panel').css({ minHeight: 'auto' }); + break; + } + + return this; + }, + setPosition: function() { + switch(this.options.type) { + case 'popup': + var screenWidth = jQuery(window).width(), + screenHeight = jQuery(window).height(), + modalWidth = jQuery('.mailpoet_'+ this.options.type +'_wrapper').width(), + modalHeight = jQuery('.mailpoet_'+ this.options.type +'_wrapper').height(); + + var top = Math.max(48, parseInt((screenHeight / 2) - (modalHeight / 2))), + left = Math.max(0, parseInt((screenWidth / 2) - (modalWidth / 2))); + + // set position of popup depending on screen dimensions. + jQuery('#mailpoet_popup').css({ + top: top, + left: left + }); + break; + case 'panel': + setTimeout(function() { + // set position of popup depending on screen dimensions. + if(this.options.position === 'right') { + jQuery('#mailpoet_panel').css({ + marginRight: 0 + }); + } else if(this.options.position === 'left') { + jQuery('#mailpoet_panel').css({ + marginLeft: 0 + }); + } + }.bind(this), 0); + break; + } + + return this; + }, + showModal: function() { + // set modal dimensions + this.setDimensions(); + + // remember the previously focused element + this.prevFocus = jQuery(':focus'); + + // add a flag on the body so that we can prevent scrolling + jQuery('body').addClass('mailpoet_modal_opened'); + + // show popup + jQuery('#mailpoet_'+this.options.type).show(); + + // display overlay + this.showOverlay(); + + // set modal position + this.setPosition(); + + // add class on highlighted elements + if(this.options.highlight !== null) { + if(this.options.highlight.length > 0) { + this.highlightOn(this.options.highlight); + } + } + + if(this.options.focus) { + this.focus(); + } + + // set popup as opened + this.opened = true; + + // trigger init event if specified + if(this.options.onInit !== null) { + this.options.onInit(this); + } + + return this; + }, + focus: function() { + if(this.options.type == 'popup') { + jQuery('#mailpoet_'+this.options.type).focus(); + } else { + // panel and subpanel + jQuery('#mailpoet_'+this.options.type+' .mailpoet_panel_wrapper') + .filter(':visible').focus(); + } + return this; + }, + highlightOn: function(element) { + jQuery(element).addClass('mailpoet_modal_highlight'); + return this; + }, + highlightOff: function() { + jQuery('.mailpoet_modal_highlight') + .removeClass('mailpoet_modal_highlight'); + return this; + }, + hideModal: function(callback) { + // set modal as closed + this.opened = false; + + // hide modal + jQuery('#mailpoet_'+this.options.type).hide(); + + // remove class on highlighted elements + this.highlightOff(); + + // remove class from body to let it be scrollable + jQuery('body').removeClass('mailpoet_modal_opened'); + + return this; + }, + showOverlay: function(force) { + jQuery('#mailpoet_modal_overlay').show(); + return this; + }, + hideOverlay: function() { + jQuery('#mailpoet_modal_overlay').hide(); + return this; + }, + popup: function(options) { + // get options + options = options || {}; + // set modal type + options.type = 'popup'; + // set overlay state + options.overlay = options.overlay || true; + // initialize modal + this.init(options); + // open modal + this.open(); + + return this; + }, + panel: function(options) { + // get options + options = options || {}; + // reset subpanels + this.subpanels = []; + // set modal type + options.type = 'panel'; + // set overlay state + options.overlay = options.overlay || false; + // set highlighted element + options.highlight = options.highlight || null; + // set modal dimensions + options.width = options.width || '40%'; + options.height = options.height || 'auto'; + // initialize modal + this.init(options); + // open modal + this.open(); + + return this; + }, + subpanel: function(options) { + if(this.opened === false) { + // if no panel is already opened, let's create one instead + this.panel(options); + } else { + // if a panel is already opened, add a sub panel to it + this.subpanels.push(options); + this.loadTemplate(); + } + + return this; + }, + loading: function(toggle) { + // make sure the overlay is initialized and that it's visible + this.initOverlay(true); + + if(toggle === true) { + this.showLoading(); + } else { + this.hideLoading(); + } + + return this; + }, + showLoading: function() { + jQuery('#mailpoet_loading').show(); + + // add loading class to overlay + jQuery('#mailpoet_modal_overlay') + .addClass('mailpoet_overlay_loading'); + + return this; + }, + hideLoading: function() { + jQuery('#mailpoet_loading').hide(); + + // remove loading class from overlay + jQuery('#mailpoet_modal_overlay') + .removeClass('mailpoet_overlay_loading'); + + return this; + }, + open: function() { + // load template if specified + if(this.options.template !== null) { + // check if a url was specified to get extra data + if(this.options.url !== null) { + this.loadUrl(); + } else { + // load template + this.loadTemplate(); + + // show modal window + this.showModal(); + } + } else { + this.cancel(); + } + + return this; + }, + success: function() { + if(this.subpanels.length > 0) { + if(this.subpanels[(this.subpanels.length - 1)].onSuccess !== undefined) { + this.subpanels[(this.subpanels.length - 1)].onSuccess(this.subpanels[(this.subpanels.length - 1)].data); + } + } else { + if(this.options.onSuccess !== null) { + this.options.onSuccess(this.options.data); + } + } + this.close(); + + return this; + }, + cancel: function() { + if(this.subpanels.length > 0) { + if(this.subpanels[(this.subpanels.length - 1)].onCancel !== undefined) { + this.subpanels[(this.subpanels.length - 1)].onCancel(this.subpanels[(this.subpanels.length - 1)].data); + } + } else { + if(this.options.onCancel !== null) { + this.options.onCancel(this.options.data); + } + } + this.close(); + + return this; + }, + destroy: function() { + this.hideOverlay(); + + // remove extra modal + if(jQuery('#mailpoet_'+this.options.type).length > 0) { + jQuery('#mailpoet_'+this.options.type).remove(); + } + + this.initialized = false; + + return this; + }, + close: function() { + if(this.isLocked() === true) { return this; } + + if(this.subpanels.length > 0) { + // close subpanel + jQuery('.mailpoet_'+this.options.type+'_wrapper').last().remove(); + + // show previous panel + jQuery('.mailpoet_'+this.options.type+'_wrapper').last().show(); + + // remove last subpanels + this.subpanels.pop(); + + // focus on previous panel + if(this.options.focus) { + this.focus(); + } + + return this; + } + + // remove event handlers + this.removeEvents(); + + // hide modal window + this.hideModal(); + + // destroy modal element + this.destroy(); + + // restore the previously focused element + if(this.prevFocus !== undefined){ + this.prevFocus.focus(); + } + + // reset options + this.options = { + onSuccess: null, + onCancel: null + }; + + return this; + } + }; + } +); + diff --git a/assets/js/src/newsletter_editor/components/sidebar.js b/assets/js/src/newsletter_editor/components/sidebar.js index 8154760cc0..ad7708a5c8 100644 --- a/assets/js/src/newsletter_editor/components/sidebar.js +++ b/assets/js/src/newsletter_editor/components/sidebar.js @@ -272,10 +272,13 @@ define([ }); var view = this.previewView.render(); - + this.previewView.$el.css('height', '100%'); + MailPoet.Modal.popup({ template: '', element: this.previewView.$el, + width: '95%', + height: '94%', title: MailPoet.I18n.t('newsletterPreview'), onCancel: function() { this.previewView.destroy(); @@ -340,8 +343,10 @@ define([ getTemplate: function() { return templates.newsletterPreview; }, initialize: function(options) { this.previewUrl = options.previewUrl; - this.width = App.getConfig().get('newsletterPreview.width'); - this.height = App.getConfig().get('newsletterPreview.height') + this.width = '100%'; + this.height = '100%'; + // this.width = App.getConfig().get('newsletterPreview.width'); + // this.height = App.getConfig().get('newsletterPreview.height') }, templateContext: function() { return {