| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- /* global shippingZoneMethodsLocalizeScript, ajaxurl */
- ( function( $, data, wp, ajaxurl ) {
- $( function() {
- var $table = $( '.wc-shipping-zone-methods' ),
- $tbody = $( '.wc-shipping-zone-method-rows' ),
- $save_button = $( '.wc-shipping-zone-method-save' ),
- $row_template = wp.template( 'wc-shipping-zone-method-row' ),
- $blank_template = wp.template( 'wc-shipping-zone-method-row-blank' ),
- // Backbone model
- ShippingMethod = Backbone.Model.extend({
- changes: {},
- logChanges: function( changedRows ) {
- var changes = this.changes || {};
- _.each( changedRows.methods, function( row, id ) {
- changes.methods = changes.methods || { methods : {} };
- changes.methods[ id ] = _.extend( changes.methods[ id ] || { instance_id : id }, row );
- } );
- if ( typeof changedRows.zone_name !== 'undefined' ) {
- changes.zone_name = changedRows.zone_name;
- }
- if ( typeof changedRows.zone_locations !== 'undefined' ) {
- changes.zone_locations = changedRows.zone_locations;
- }
- if ( typeof changedRows.zone_postcodes !== 'undefined' ) {
- changes.zone_postcodes = changedRows.zone_postcodes;
- }
- this.changes = changes;
- this.trigger( 'change:methods' );
- },
- save: function() {
- $.post( ajaxurl + ( ajaxurl.indexOf( '?' ) > 0 ? '&' : '?' ) + 'action=woocommerce_shipping_zone_methods_save_changes', {
- wc_shipping_zones_nonce : data.wc_shipping_zones_nonce,
- changes : this.changes,
- zone_id : data.zone_id
- }, this.onSaveResponse, 'json' );
- },
- onSaveResponse: function( response, textStatus ) {
- if ( 'success' === textStatus ) {
- if ( response.success ) {
- if ( response.data.zone_id !== data.zone_id ) {
- data.zone_id = response.data.zone_id;
- if ( window.history.pushState ) {
- window.history.pushState({}, '', 'admin.php?page=wc-settings&tab=shipping&zone_id=' + response.data.zone_id );
- }
- }
- shippingMethod.set( 'methods', response.data.methods );
- shippingMethod.trigger( 'change:methods' );
- shippingMethod.changes = {};
- shippingMethod.trigger( 'saved:methods' );
- } else {
- window.alert( data.strings.save_failed );
- }
- }
- }
- } ),
- // Backbone view
- ShippingMethodView = Backbone.View.extend({
- rowTemplate: $row_template,
- initialize: function() {
- this.listenTo( this.model, 'change:methods', this.setUnloadConfirmation );
- this.listenTo( this.model, 'saved:methods', this.clearUnloadConfirmation );
- this.listenTo( this.model, 'saved:methods', this.render );
- $tbody.on( 'change', { view: this }, this.updateModelOnChange );
- $tbody.on( 'sortupdate', { view: this }, this.updateModelOnSort );
- $( window ).on( 'beforeunload', { view: this }, this.unloadConfirmation );
- $save_button.on( 'click', { view: this }, this.onSubmit );
- $( document.body ).on( 'input change', '#zone_name, #zone_locations, #zone_postcodes', { view: this }, this.onUpdateZone );
- $( document.body ).on( 'click', '.wc-shipping-zone-method-settings', { view: this }, this.onConfigureShippingMethod );
- $( document.body ).on( 'click', '.wc-shipping-zone-add-method', { view: this }, this.onAddShippingMethod );
- $( document.body ).on( 'wc_backbone_modal_response', this.onConfigureShippingMethodSubmitted );
- $( document.body ).on( 'wc_backbone_modal_response', this.onAddShippingMethodSubmitted );
- $( document.body ).on( 'change', '.wc-shipping-zone-method-selector select', this.onChangeShippingMethodSelector );
- $( document.body ).on( 'click', '.wc-shipping-zone-postcodes-toggle', this.onTogglePostcodes );
- },
- onUpdateZone: function( event ) {
- var view = event.data.view,
- model = view.model,
- value = $( this ).val(),
- $target = $( event.target ),
- attribute = $target.data( 'attribute' ),
- changes = {};
- event.preventDefault();
- changes[ attribute ] = value;
- model.set( attribute, value );
- model.logChanges( changes );
- view.render();
- },
- block: function() {
- $( this.el ).block({
- message: null,
- overlayCSS: {
- background: '#fff',
- opacity: 0.6
- }
- });
- },
- unblock: function() {
- $( this.el ).unblock();
- },
- render: function() {
- var methods = _.indexBy( this.model.get( 'methods' ), 'instance_id' ),
- zone_name = this.model.get( 'zone_name' ),
- view = this;
- // Set name.
- $('.wc-shipping-zone-name').text( zone_name ? zone_name : data.strings.default_zone_name );
- // Blank out the contents.
- this.$el.empty();
- this.unblock();
- if ( _.size( methods ) ) {
- // Sort methods
- methods = _.sortBy( methods, function( method ) {
- return parseInt( method.method_order, 10 );
- } );
- // Populate $tbody with the current methods
- $.each( methods, function( id, rowData ) {
- if ( 'yes' === rowData.enabled ) {
- rowData.enabled_icon = '<span class="woocommerce-input-toggle woocommerce-input-toggle--enabled">' + data.strings.yes + '</span>';
- } else {
- rowData.enabled_icon = '<span class="woocommerce-input-toggle woocommerce-input-toggle--disabled">' + data.strings.no + '</span>';
- }
- view.$el.append( view.rowTemplate( rowData ) );
- var $tr = view.$el.find( 'tr[data-id="' + rowData.instance_id + '"]');
- if ( ! rowData.has_settings ) {
- $tr.find( '.wc-shipping-zone-method-title > a' ).replaceWith('<span>' + $tr.find( '.wc-shipping-zone-method-title > a' ).text() + '</span>' );
- var $del = $tr.find( '.wc-shipping-zone-method-delete' );
- $tr.find( '.wc-shipping-zone-method-title .row-actions' ).empty().html($del);
- }
- } );
- // Make the rows function
- this.$el.find( '.wc-shipping-zone-method-delete' ).on( 'click', { view: this }, this.onDeleteRow );
- this.$el.find( '.wc-shipping-zone-method-enabled a').on( 'click', { view: this }, this.onToggleEnabled );
- } else {
- view.$el.append( $blank_template );
- }
- this.initTooltips();
- },
- initTooltips: function() {
- $( '#tiptip_holder' ).removeAttr( 'style' );
- $( '#tiptip_arrow' ).removeAttr( 'style' );
- $( '.tips' ).tipTip({ 'attribute': 'data-tip', 'fadeIn': 50, 'fadeOut': 50, 'delay': 50 });
- },
- onSubmit: function( event ) {
- event.data.view.block();
- event.data.view.model.save();
- event.preventDefault();
- },
- onDeleteRow: function( event ) {
- var view = event.data.view,
- model = view.model,
- methods = _.indexBy( model.get( 'methods' ), 'instance_id' ),
- changes = {},
- instance_id = $( this ).closest('tr').data('id');
- event.preventDefault();
- delete methods[ instance_id ];
- changes.methods = changes.methods || { methods : {} };
- changes.methods[ instance_id ] = _.extend( changes.methods[ instance_id ] || {}, { deleted : 'deleted' } );
- model.set( 'methods', methods );
- model.logChanges( changes );
- view.render();
- },
- onToggleEnabled: function( event ) {
- var view = event.data.view,
- $target = $( event.target ),
- model = view.model,
- methods = _.indexBy( model.get( 'methods' ), 'instance_id' ),
- instance_id = $target.closest( 'tr' ).data( 'id' ),
- enabled = $target.closest( 'tr' ).data( 'enabled' ) === 'yes' ? 'no' : 'yes',
- changes = {};
- event.preventDefault();
- methods[ instance_id ].enabled = enabled;
- changes.methods = changes.methods || { methods : {} };
- changes.methods[ instance_id ] = _.extend( changes.methods[ instance_id ] || {}, { enabled : enabled } );
- model.set( 'methods', methods );
- model.logChanges( changes );
- view.render();
- },
- setUnloadConfirmation: function() {
- this.needsUnloadConfirm = true;
- $save_button.removeAttr( 'disabled' );
- },
- clearUnloadConfirmation: function() {
- this.needsUnloadConfirm = false;
- $save_button.attr( 'disabled', 'disabled' );
- },
- unloadConfirmation: function( event ) {
- if ( event.data.view.needsUnloadConfirm ) {
- event.returnValue = data.strings.unload_confirmation_msg;
- window.event.returnValue = data.strings.unload_confirmation_msg;
- return data.strings.unload_confirmation_msg;
- }
- },
- updateModelOnChange: function( event ) {
- var model = event.data.view.model,
- $target = $( event.target ),
- instance_id = $target.closest( 'tr' ).data( 'id' ),
- attribute = $target.data( 'attribute' ),
- value = $target.val(),
- methods = _.indexBy( model.get( 'methods' ), 'instance_id' ),
- changes = {};
- if ( methods[ instance_id ][ attribute ] !== value ) {
- changes.methods[ instance_id ] = {};
- changes.methods[ instance_id ][ attribute ] = value;
- methods[ instance_id ][ attribute ] = value;
- }
- model.logChanges( changes );
- },
- updateModelOnSort: function( event ) {
- var view = event.data.view,
- model = view.model,
- methods = _.indexBy( model.get( 'methods' ), 'instance_id' ),
- changes = {};
- _.each( methods, function( method ) {
- var old_position = parseInt( method.method_order, 10 );
- var new_position = parseInt( $table.find( 'tr[data-id="' + method.instance_id + '"]').index() + 1, 10 );
- if ( old_position !== new_position ) {
- methods[ method.instance_id ].method_order = new_position;
- changes.methods = changes.methods || { methods : {} };
- changes.methods[ method.instance_id ] = _.extend( changes.methods[ method.instance_id ] || {}, { method_order : new_position } );
- }
- } );
- if ( _.size( changes ) ) {
- model.logChanges( changes );
- }
- },
- onConfigureShippingMethod: function( event ) {
- var instance_id = $( this ).closest( 'tr' ).data( 'id' ),
- model = event.data.view.model,
- methods = _.indexBy( model.get( 'methods' ), 'instance_id' ),
- method = methods[ instance_id ];
- // Only load modal if supported
- if ( ! method.settings_html ) {
- return true;
- }
- event.preventDefault();
- $( this ).WCBackboneModal({
- template : 'wc-modal-shipping-method-settings',
- variable : {
- instance_id : instance_id,
- method : method
- },
- data : {
- instance_id : instance_id,
- method : method
- }
- });
- $( document.body ).trigger( 'init_tooltips' );
- },
- onConfigureShippingMethodSubmitted: function( event, target, posted_data ) {
- if ( 'wc-modal-shipping-method-settings' === target ) {
- shippingMethodView.block();
- // Save method settings via ajax call
- $.post( ajaxurl + ( ajaxurl.indexOf( '?' ) > 0 ? '&' : '?' ) + 'action=woocommerce_shipping_zone_methods_save_settings', {
- wc_shipping_zones_nonce : data.wc_shipping_zones_nonce,
- instance_id : posted_data.instance_id,
- data : posted_data
- }, function( response, textStatus ) {
- if ( 'success' === textStatus && response.success ) {
- $( 'table.wc-shipping-zone-methods' ).parent().find( '#woocommerce_errors' ).remove();
- // If there were errors, prepend the form.
- if ( response.data.errors.length > 0 ) {
- shippingMethodView.showErrors( response.data.errors );
- }
- // Method was saved. Re-render.
- if ( _.size( shippingMethodView.model.changes ) ) {
- shippingMethodView.model.save();
- } else {
- shippingMethodView.model.onSaveResponse( response, textStatus );
- }
- } else {
- window.alert( data.strings.save_failed );
- shippingMethodView.unblock();
- }
- }, 'json' );
- }
- },
- showErrors: function( errors ) {
- var error_html = '<div id="woocommerce_errors" class="error notice is-dismissible">';
- $( errors ).each( function( index, value ) {
- error_html = error_html + '<p>' + value + '</p>';
- } );
- error_html = error_html + '</div>';
- $( 'table.wc-shipping-zone-methods' ).before( error_html );
- },
- onAddShippingMethod: function( event ) {
- event.preventDefault();
- $( this ).WCBackboneModal({
- template : 'wc-modal-add-shipping-method',
- variable : {
- zone_id : data.zone_id
- }
- });
- $( '.wc-shipping-zone-method-selector select' ).change();
- },
- onAddShippingMethodSubmitted: function( event, target, posted_data ) {
- if ( 'wc-modal-add-shipping-method' === target ) {
- shippingMethodView.block();
- // Add method to zone via ajax call
- $.post( ajaxurl + ( ajaxurl.indexOf( '?' ) > 0 ? '&' : '?' ) + 'action=woocommerce_shipping_zone_add_method', {
- wc_shipping_zones_nonce : data.wc_shipping_zones_nonce,
- method_id : posted_data.add_method_id,
- zone_id : data.zone_id
- }, function( response, textStatus ) {
- if ( 'success' === textStatus && response.success ) {
- if ( response.data.zone_id !== data.zone_id ) {
- data.zone_id = response.data.zone_id;
- if ( window.history.pushState ) {
- window.history.pushState({}, '', 'admin.php?page=wc-settings&tab=shipping&zone_id=' + response.data.zone_id );
- }
- }
- // Trigger save if there are changes, or just re-render
- if ( _.size( shippingMethodView.model.changes ) ) {
- shippingMethodView.model.save();
- } else {
- shippingMethodView.model.set( 'methods', response.data.methods );
- shippingMethodView.model.trigger( 'change:methods' );
- shippingMethodView.model.changes = {};
- shippingMethodView.model.trigger( 'saved:methods' );
- }
- }
- shippingMethodView.unblock();
- }, 'json' );
- }
- },
- onChangeShippingMethodSelector: function() {
- var description = $( this ).find( 'option:selected' ).data( 'description' );
- $( this ).parent().find( '.wc-shipping-zone-method-description' ).remove();
- $( this ).after( '<div class="wc-shipping-zone-method-description">' + description + '</div>' );
- $( this ).closest( 'article' ).height( $( this ).parent().height() );
- },
- onTogglePostcodes: function( event ) {
- event.preventDefault();
- var $tr = $( this ).closest( 'tr');
- $tr.find( '.wc-shipping-zone-postcodes' ).show();
- $tr.find( '.wc-shipping-zone-postcodes-toggle' ).hide();
- }
- } ),
- shippingMethod = new ShippingMethod({
- methods: data.methods,
- zone_name: data.zone_name
- } ),
- shippingMethodView = new ShippingMethodView({
- model: shippingMethod,
- el: $tbody
- } );
- shippingMethodView.render();
- $tbody.sortable({
- items: 'tr',
- cursor: 'move',
- axis: 'y',
- handle: 'td.wc-shipping-zone-method-sort',
- scrollSensitivity: 40
- });
- });
- })( jQuery, shippingZoneMethodsLocalizeScript, wp, ajaxurl );
|