| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390 |
- /* global jQuery, jpSimplePaymentsStrings, confirm, _ */
- /* eslint no-var: 0, quote-props: 0 */
- ( function( api, wp, $ ) {
- var $document = $( document );
- $document.ready( function() {
- $document.on( 'widget-added', function( event, widgetContainer ) {
- if ( widgetContainer.is( '[id*="jetpack_simple_payments_widget"]' ) ) {
- initWidget( widgetContainer );
- }
- } );
- $document.on( 'widget-synced widget-updated', function( event, widgetContainer ) {
- //this fires for all widgets, this prevent errors for non SP widgets
- if ( ! widgetContainer.is( '[id*="jetpack_simple_payments_widget"]' ) ) {
- return;
- }
- event.preventDefault();
- syncProductLists();
- var widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' );
- enableFormActions( widgetForm );
- updateProductImage( widgetForm );
- } );
- } );
- function initWidget( widgetContainer ) {
- var widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' );
- //Add New Button
- widgetForm.find( '.jetpack-simple-payments-add-product' ).on( 'click', showAddNewForm( widgetForm ) );
- //Edit Button
- widgetForm.find( '.jetpack-simple-payments-edit-product' ).on( 'click', showEditForm( widgetForm ) );
- //Select an Image
- widgetForm.find( '.jetpack-simple-payments-image-fieldset .placeholder, .jetpack-simple-payments-image > img' ).on( 'click', selectImage( widgetForm ) );
- //Remove Image Button
- widgetForm.find( '.jetpack-simple-payments-remove-image' ).on( 'click', removeImage( widgetForm ) );
- //Save Product button
- widgetForm.find( '.jetpack-simple-payments-save-product' ).on( 'click', saveChanges( widgetForm ) );
- //Cancel Button
- widgetForm.find( '.jetpack-simple-payments-cancel-form' ).on( 'click', clearForm( widgetForm ) );
- //Delete Selected Product
- widgetForm.find( '.jetpack-simple-payments-delete-product' ).on( 'click', deleteProduct( widgetForm ) );
- //Input, Select and Checkbox change
- widgetForm.find( 'select, input, textarea, checkbox' ).on( 'change input propertychange', _.debounce( function() {
- disableFormActions( widgetForm );
- }, 250 ) );
- }
- function syncProductLists() {
- var request = wp.ajax.post( 'customize-jetpack-simple-payments-buttons-get', {
- 'customize-jetpack-simple-payments-nonce': api.settings.nonce[ 'customize-jetpack-simple-payments' ],
- 'customize_changeset_uuid': api.settings.changeset.uuid
- } );
- request.done( function( data ) {
- var selectedProduct = 0;
- $( document ).find( 'select.jetpack-simple-payments-products' ).each( function( index, select ) {
- var $select = $( select );
- selectedProduct = $select.val();
- $select.find( 'option' ).remove();
- $select.append( $.map( data, function( product ) {
- return $( '<option>', { value: product.ID, text: product.post_title } );
- } ) );
- $select.val( selectedProduct );
- } );
- } );
- }
- function showForm( widgetForm ) {
- //reset validations
- widgetForm.find( '.invalid' ).removeClass( 'invalid' );
- //disable widget title and product selector
- widgetForm.find( '.jetpack-simple-payments-widget-title' )
- .add( '.jetpack-simple-payments-products' )
- //disable add and edit buttons
- .add( '.jetpack-simple-payments-add-product' )
- .add( '.jetpack-simple-payments-edit-product' )
- //disable save, delete and cancel until the widget update event is fired
- .add( '.jetpack-simple-payments-save-product' )
- .add( '.jetpack-simple-payments-cancel-form' )
- .add( '.jetpack-simple-payments-delete-product' )
- .attr( 'disabled', 'disabled' );
- //show form
- widgetForm.find( '.jetpack-simple-payments-form' ).show();
- }
- function hideForm( widgetForm ) {
- //enable widget title and product selector
- widgetForm.find( '.jetpack-simple-payments-widget-title' )
- .add( '.jetpack-simple-payments-products' )
- .removeAttr( 'disabled' );
- //hide the form
- widgetForm.find( '.jetpack-simple-payments-form' ).hide();
- }
- function changeFormAction( widgetForm, action ) {
- widgetForm.find( '.jetpack-simple-payments-form-action' ).val( action ).change();
- }
- function showAddNewForm( widgetForm ) {
- return function( event ) {
- event.preventDefault();
- showForm( widgetForm );
- changeFormAction( widgetForm, 'add' );
- };
- }
- function showEditForm( widgetForm ) {
- return function( event ) {
- event.preventDefault();
- showForm( widgetForm );
- changeFormAction( widgetForm, 'edit' );
- };
- }
- function clearForm( widgetForm ) {
- return function( event ) {
- event.preventDefault();
- hideForm( widgetForm );
- widgetForm.find( '.jetpack-simple-payments-add-product, .jetpack-simple-payments-edit-product' ).attr( 'disabled', 'disabled' );
- changeFormAction( widgetForm, 'clear' );
- };
- }
- function enableFormActions( widgetForm ) {
- var isFormVisible = widgetForm.find( '.jetpack-simple-payments-form' ).is( ':visible' );
- var isProductSelectVisible = widgetForm.find( '.jetpack-simple-payments-products' ).is( ':visible' ); //areProductsVisible ?
- var isEdit = widgetForm.find( '.jetpack-simple-payments-form-action' ).val() === 'edit';
- if ( isFormVisible ) {
- widgetForm.find( '.jetpack-simple-payments-save-product' )
- .add( '.jetpack-simple-payments-cancel-form' )
- .removeAttr( 'disabled' );
- } else {
- widgetForm.find( '.jetpack-simple-payments-add-product' ).removeAttr( 'disabled' );
- }
- if ( isFormVisible && isEdit ) {
- widgetForm.find( '.jetpack-simple-payments-delete-product' ).removeAttr( 'disabled' );
- }
- if ( isProductSelectVisible && ! isFormVisible ) {
- widgetForm.find( '.jetpack-simple-payments-edit-product' ).removeAttr( 'disabled' );
- }
- }
- function disableFormActions( widgetForm ) {
- widgetForm.find( '.jetpack-simple-payments-add-product' )
- .add( '.jetpack-simple-payments-edit-product' )
- .add( '.jetpack-simple-payments-save-product' )
- .add( '.jetpack-simple-payments-cancel-form' )
- .add( '.jetpack-simple-payments-delete-product' )
- .attr( 'disabled', 'disabled' );
- }
- function selectImage( widgetForm ) {
- return function( event ) {
- event.preventDefault();
- var imageContainer = widgetForm.find( '.jetpack-simple-payments-image' );
- var mediaFrame = new wp.media.view.MediaFrame.Select( {
- title: 'Choose Product Image',
- multiple: false,
- library: { type: 'image' },
- button: { text: 'Choose Image' }
- } );
- mediaFrame.on( 'select', function() {
- var selection = mediaFrame.state().get( 'selection' ).first().toJSON();
- //hide placeholder
- widgetForm.find( '.jetpack-simple-payments-image-fieldset .placeholder' ).hide();
- //load image from media library
- imageContainer.find( 'img' )
- .attr( 'src', selection.url )
- .show();
- //show image and remove button
- widgetForm.find( '.jetpack-simple-payments-image' ).show();
- //set hidden field for the selective refresh
- widgetForm.find( '.jetpack-simple-payments-form-image-id' ).val( selection.id ).change();
- } );
- mediaFrame.open();
- };
- }
- function removeImage( widgetForm ) {
- return function( event ) {
- event.preventDefault();
- //show placeholder
- widgetForm.find( '.jetpack-simple-payments-image-fieldset .placeholder' ).show();
- //hide image and remove button
- widgetForm.find( '.jetpack-simple-payments-image' ).hide();
- //set hidden field for the selective refresh
- widgetForm.find( '.jetpack-simple-payments-form-image-id' ).val( '' ).change();
- };
- }
- function updateProductImage( widgetForm ) {
- var newImageId = parseInt( widgetForm.find( '.jetpack-simple-payments-form-image-id' ).val(), 10 );
- var newImageSrc = widgetForm.find( '.jetpack-simple-payments-form-image-src' ).val();
- var placeholder = widgetForm.find( '.jetpack-simple-payments-image-fieldset .placeholder' );
- var image = widgetForm.find( '.jetpack-simple-payments-image > img' );
- var imageControls = widgetForm.find( '.jetpack-simple-payments-image' );
- if ( newImageId && newImageSrc ) {
- image.attr( 'src', newImageSrc );
- placeholder.hide();
- imageControls.show();
- } else {
- placeholder.show();
- image.removeAttr( 'src' );
- imageControls.hide();
- }
- }
- function decimalPlaces( number ) {
- var parts = number.split( '.' );
- if ( parts.length > 2 ) {
- return null;
- }
- return parts[ 1 ] ? parts[ 1 ].length : 0;
- }
- function isFormValid( widgetForm ) {
- widgetForm.find( '.invalid' ).removeClass( 'invalid' );
- var errors = false;
- var postTitle = widgetForm.find( '.jetpack-simple-payments-form-product-title' ).val();
- if ( ! postTitle ) {
- widgetForm.find( '.jetpack-simple-payments-form-product-title' ).addClass( 'invalid' );
- errors = true;
- }
- var productPrice = widgetForm.find( '.jetpack-simple-payments-form-product-price' ).val();
- if ( ! productPrice || isNaN( productPrice ) || parseFloat( productPrice ) <= 0 ) {
- widgetForm.find( '.jetpack-simple-payments-form-product-price' ).addClass( 'invalid' );
- errors = true;
- }
- // Japan's Yen is the only supported currency with a zero decimal precision.
- var precision = widgetForm.find( '.jetpack-simple-payments-form-product-currency' ).val() === 'JPY' ? 0 : 2;
- var priceDecimalPlaces = decimalPlaces( productPrice );
- if ( priceDecimalPlaces === null || priceDecimalPlaces > precision ) {
- widgetForm.find( '.jetpack-simple-payments-form-product-price' ).addClass( 'invalid' );
- errors = true;
- }
- var productEmail = widgetForm.find( '.jetpack-simple-payments-form-product-email' ).val();
- var isProductEmailValid = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test( productEmail );
- if ( ! productEmail || ! isProductEmailValid ) {
- widgetForm.find( '.jetpack-simple-payments-form-product-email' ).addClass( 'invalid' );
- errors = true;
- }
- return ! errors;
- }
- function saveChanges( widgetForm ) {
- return function( event ) {
- event.preventDefault();
- var productPostId = widgetForm.find( '.jetpack-simple-payments-form-product-id' ).val();
- if ( ! isFormValid( widgetForm ) ) {
- return;
- }
- disableFormActions( widgetForm );
- widgetForm.find( '.spinner' ).show();
- var request = wp.ajax.post( 'customize-jetpack-simple-payments-button-save', {
- 'customize-jetpack-simple-payments-nonce': api.settings.nonce[ 'customize-jetpack-simple-payments' ],
- 'customize_changeset_uuid': api.settings.changeset.uuid,
- 'params': {
- 'product_post_id': productPostId,
- 'post_title': widgetForm.find( '.jetpack-simple-payments-form-product-title' ).val(),
- 'post_content': widgetForm.find( '.jetpack-simple-payments-form-product-description' ).val(),
- 'image_id': widgetForm.find( '.jetpack-simple-payments-form-image-id' ).val(),
- 'currency': widgetForm.find( '.jetpack-simple-payments-form-product-currency' ).val(),
- 'price': widgetForm.find( '.jetpack-simple-payments-form-product-price' ).val(),
- 'multiple': widgetForm.find( '.jetpack-simple-payments-form-product-multiple' ).is( ':checked' ) ? 1 : 0,
- 'email': widgetForm.find( '.jetpack-simple-payments-form-product-email' ).val()
- }
- } );
- request.done( function( data ) {
- var select = widgetForm.find( 'select.jetpack-simple-payments-products' );
- var productOption = select.find( 'option[value="' + productPostId + '"]' );
- if ( productOption.length > 0 ) {
- productOption.text( data.product_post_title );
- } else {
- select.append(
- $( '<option>', {
- value: data.product_post_id,
- text: data.product_post_title
- } )
- );
- select.val( data.product_post_id ).change();
- }
- widgetForm.find( '.jetpack-simple-payments-products-fieldset' ).show();
- widgetForm.find( '.jetpack-simple-payments-products-warning' ).hide();
- changeFormAction( widgetForm, 'clear' );
- hideForm( widgetForm );
- } );
- request.fail( function( data ) {
- var validCodes = {
- 'post_title': 'product-title',
- 'price': 'product-price',
- 'email': 'product-email'
- };
- data.forEach( function( item ) {
- if ( validCodes.hasOwnProperty( item.code ) ) {
- widgetForm.find( '.jetpack-simple-payments-form-' + validCodes[ item.code ] ).addClass( 'invalid' );
- }
- } );
- enableFormActions( widgetForm );
- } );
- };
- }
- function deleteProduct( widgetForm ) {
- return function( event ) {
- event.preventDefault();
- if ( ! confirm( jpSimplePaymentsStrings.deleteConfirmation ) ) {
- return;
- }
- var formProductId = parseInt( widgetForm.find( '.jetpack-simple-payments-form-product-id' ).val(), 10 );
- if ( ! formProductId ) {
- return;
- }
- disableFormActions( widgetForm );
- widgetForm.find( '.spinner' ).show();
- var request = wp.ajax.post( 'customize-jetpack-simple-payments-button-delete', {
- 'customize-jetpack-simple-payments-nonce': api.settings.nonce[ 'customize-jetpack-simple-payments' ],
- 'customize_changeset_uuid': api.settings.changeset.uuid,
- 'params': {
- 'product_post_id': formProductId
- }
- } );
- request.done( function() {
- var productList = widgetForm.find( 'select.jetpack-simple-payments-products' )[ 0 ];
- productList.remove( productList.selectedIndex );
- productList.dispatchEvent( new Event( 'change' ) );
- if ( $( productList ).has( 'option' ).length === 0 ) {
- //hide products select and label
- widgetForm.find( '.jetpack-simple-payments-products-fieldset' ).hide();
- //show empty products list warning
- widgetForm.find( '.jetpack-simple-payments-products-warning' ).show();
- }
- changeFormAction( widgetForm, 'clear' );
- hideForm( widgetForm );
- } );
- };
- }
- }( wp.customize, wp, jQuery ) );
|