api-keys.js
5 years ago
api-keys.min.js
5 years ago
backbone-modal.js
5 years ago
backbone-modal.min.js
5 years ago
marketplace-suggestions.js
4 years ago
marketplace-suggestions.min.js
3 years ago
meta-boxes-coupon.js
5 years ago
meta-boxes-coupon.min.js
3 years ago
meta-boxes-order.js
3 years ago
meta-boxes-order.min.js
3 years ago
meta-boxes-product-variation.js
3 years ago
meta-boxes-product-variation.min.js
3 years ago
meta-boxes-product.js
3 years ago
meta-boxes-product.min.js
3 years ago
meta-boxes.js
5 years ago
meta-boxes.min.js
5 years ago
network-orders.js
8 years ago
network-orders.min.js
3 years ago
product-editor.js
3 years ago
product-editor.min.js
3 years ago
product-ordering.js
3 years ago
product-ordering.min.js
3 years ago
quick-edit.js
4 years ago
quick-edit.min.js
3 years ago
reports.js
5 years ago
reports.min.js
3 years ago
settings-views-html-settings-tax.js
5 years ago
settings-views-html-settings-tax.min.js
3 years ago
settings.js
4 years ago
settings.min.js
3 years ago
system-status.js
3 years ago
system-status.min.js
3 years ago
term-ordering.js
4 years ago
term-ordering.min.js
4 years ago
users.js
5 years ago
users.min.js
3 years ago
wc-clipboard.js
5 years ago
wc-clipboard.min.js
5 years ago
wc-enhanced-select.js
3 years ago
wc-enhanced-select.min.js
3 years ago
wc-orders.js
3 years ago
wc-orders.min.js
3 years ago
wc-product-export.js
5 years ago
wc-product-export.min.js
5 years ago
wc-product-import.js
5 years ago
wc-product-import.min.js
5 years ago
wc-setup.js
5 years ago
wc-setup.min.js
3 years ago
wc-shipping-classes.js
5 years ago
wc-shipping-classes.min.js
3 years ago
wc-shipping-zone-methods.js
4 years ago
wc-shipping-zone-methods.min.js
3 years ago
wc-shipping-zones.js
5 years ago
wc-shipping-zones.min.js
3 years ago
wc-status-widget.js
4 years ago
wc-status-widget.min.js
4 years ago
woocommerce_admin.js
3 years ago
woocommerce_admin.min.js
3 years ago
wc-shipping-zones.js
276 lines
| 1 | /* global shippingZonesLocalizeScript, ajaxurl */ |
| 2 | ( function( $, data, wp, ajaxurl ) { |
| 3 | $( function() { |
| 4 | var $table = $( '.wc-shipping-zones' ), |
| 5 | $tbody = $( '.wc-shipping-zone-rows' ), |
| 6 | $save_button = $( '.wc-shipping-zone-save' ), |
| 7 | $row_template = wp.template( 'wc-shipping-zone-row' ), |
| 8 | $blank_template = wp.template( 'wc-shipping-zone-row-blank' ), |
| 9 | |
| 10 | // Backbone model |
| 11 | ShippingZone = Backbone.Model.extend({ |
| 12 | changes: {}, |
| 13 | logChanges: function( changedRows ) { |
| 14 | var changes = this.changes || {}; |
| 15 | |
| 16 | _.each( changedRows, function( row, id ) { |
| 17 | changes[ id ] = _.extend( changes[ id ] || { zone_id : id }, row ); |
| 18 | } ); |
| 19 | |
| 20 | this.changes = changes; |
| 21 | this.trigger( 'change:zones' ); |
| 22 | }, |
| 23 | discardChanges: function( id ) { |
| 24 | var changes = this.changes || {}, |
| 25 | set_position = null, |
| 26 | zones = _.indexBy( this.get( 'zones' ), 'zone_id' ); |
| 27 | |
| 28 | // Find current set position if it has moved since last save |
| 29 | if ( changes[ id ] && changes[ id ].zone_order !== undefined ) { |
| 30 | set_position = changes[ id ].zone_order; |
| 31 | } |
| 32 | |
| 33 | // Delete all changes |
| 34 | delete changes[ id ]; |
| 35 | |
| 36 | // If the position was set, and this zone does exist in DB, set the position again so the changes are not lost. |
| 37 | if ( set_position !== null && zones[ id ] && zones[ id ].zone_order !== set_position ) { |
| 38 | changes[ id ] = _.extend( changes[ id ] || {}, { zone_id : id, zone_order : set_position } ); |
| 39 | } |
| 40 | |
| 41 | this.changes = changes; |
| 42 | |
| 43 | // No changes? Disable save button. |
| 44 | if ( 0 === _.size( this.changes ) ) { |
| 45 | shippingZoneView.clearUnloadConfirmation(); |
| 46 | } |
| 47 | }, |
| 48 | save: function() { |
| 49 | if ( _.size( this.changes ) ) { |
| 50 | $.post( ajaxurl + ( ajaxurl.indexOf( '?' ) > 0 ? '&' : '?' ) + 'action=woocommerce_shipping_zones_save_changes', { |
| 51 | wc_shipping_zones_nonce : data.wc_shipping_zones_nonce, |
| 52 | changes : this.changes |
| 53 | }, this.onSaveResponse, 'json' ); |
| 54 | } else { |
| 55 | shippingZone.trigger( 'saved:zones' ); |
| 56 | } |
| 57 | }, |
| 58 | onSaveResponse: function( response, textStatus ) { |
| 59 | if ( 'success' === textStatus ) { |
| 60 | if ( response.success ) { |
| 61 | shippingZone.set( 'zones', response.data.zones ); |
| 62 | shippingZone.trigger( 'change:zones' ); |
| 63 | shippingZone.changes = {}; |
| 64 | shippingZone.trigger( 'saved:zones' ); |
| 65 | } else { |
| 66 | window.alert( data.strings.save_failed ); |
| 67 | } |
| 68 | } |
| 69 | } |
| 70 | } ), |
| 71 | |
| 72 | // Backbone view |
| 73 | ShippingZoneView = Backbone.View.extend({ |
| 74 | rowTemplate: $row_template, |
| 75 | initialize: function() { |
| 76 | this.listenTo( this.model, 'change:zones', this.setUnloadConfirmation ); |
| 77 | this.listenTo( this.model, 'saved:zones', this.clearUnloadConfirmation ); |
| 78 | this.listenTo( this.model, 'saved:zones', this.render ); |
| 79 | $tbody.on( 'change', { view: this }, this.updateModelOnChange ); |
| 80 | $tbody.on( 'sortupdate', { view: this }, this.updateModelOnSort ); |
| 81 | $( window ).on( 'beforeunload', { view: this }, this.unloadConfirmation ); |
| 82 | $( document.body ).on( 'click', '.wc-shipping-zone-add', { view: this }, this.onAddNewRow ); |
| 83 | }, |
| 84 | onAddNewRow: function() { |
| 85 | var $link = $( this ); |
| 86 | window.location.href = $link.attr( 'href' ); |
| 87 | }, |
| 88 | block: function() { |
| 89 | $( this.el ).block({ |
| 90 | message: null, |
| 91 | overlayCSS: { |
| 92 | background: '#fff', |
| 93 | opacity: 0.6 |
| 94 | } |
| 95 | }); |
| 96 | }, |
| 97 | unblock: function() { |
| 98 | $( this.el ).unblock(); |
| 99 | }, |
| 100 | render: function() { |
| 101 | var zones = _.indexBy( this.model.get( 'zones' ), 'zone_id' ), |
| 102 | view = this; |
| 103 | |
| 104 | view.$el.empty(); |
| 105 | view.unblock(); |
| 106 | |
| 107 | if ( _.size( zones ) ) { |
| 108 | // Sort zones |
| 109 | zones = _( zones ) |
| 110 | .chain() |
| 111 | .sortBy( function ( zone ) { return parseInt( zone.zone_id, 10 ); } ) |
| 112 | .sortBy( function ( zone ) { return parseInt( zone.zone_order, 10 ); } ) |
| 113 | .value(); |
| 114 | |
| 115 | // Populate $tbody with the current zones |
| 116 | $.each( zones, function( id, rowData ) { |
| 117 | view.renderRow( rowData ); |
| 118 | } ); |
| 119 | } else { |
| 120 | view.$el.append( $blank_template ); |
| 121 | } |
| 122 | |
| 123 | view.initRows(); |
| 124 | }, |
| 125 | renderRow: function( rowData ) { |
| 126 | var view = this; |
| 127 | view.$el.append( view.rowTemplate( rowData ) ); |
| 128 | view.initRow( rowData ); |
| 129 | }, |
| 130 | initRow: function( rowData ) { |
| 131 | var view = this; |
| 132 | var $tr = view.$el.find( 'tr[data-id="' + rowData.zone_id + '"]'); |
| 133 | |
| 134 | // List shipping methods |
| 135 | view.renderShippingMethods( rowData.zone_id, rowData.shipping_methods ); |
| 136 | $tr.find( '.wc-shipping-zone-delete' ).on( 'click', { view: this }, this.onDeleteRow ); |
| 137 | }, |
| 138 | initRows: function() { |
| 139 | // Stripe |
| 140 | if ( 0 === ( $( 'tbody.wc-shipping-zone-rows tr' ).length % 2 ) ) { |
| 141 | $table.find( 'tbody.wc-shipping-zone-rows' ).next( 'tbody' ).find( 'tr' ).addClass( 'odd' ); |
| 142 | } else { |
| 143 | $table.find( 'tbody.wc-shipping-zone-rows' ).next( 'tbody' ).find( 'tr' ).removeClass( 'odd' ); |
| 144 | } |
| 145 | // Tooltips |
| 146 | $( '#tiptip_holder' ).removeAttr( 'style' ); |
| 147 | $( '#tiptip_arrow' ).removeAttr( 'style' ); |
| 148 | $( '.tips' ).tipTip({ 'attribute': 'data-tip', 'fadeIn': 50, 'fadeOut': 50, 'delay': 50 }); |
| 149 | }, |
| 150 | renderShippingMethods: function( zone_id, shipping_methods ) { |
| 151 | var $tr = $( '.wc-shipping-zones tr[data-id="' + zone_id + '"]'); |
| 152 | var $method_list = $tr.find('.wc-shipping-zone-methods ul'); |
| 153 | |
| 154 | $method_list.find( '.wc-shipping-zone-method' ).remove(); |
| 155 | |
| 156 | if ( _.size( shipping_methods ) ) { |
| 157 | shipping_methods = _.sortBy( shipping_methods, function( method ) { |
| 158 | return parseInt( method.method_order, 10 ); |
| 159 | } ); |
| 160 | |
| 161 | _.each( shipping_methods, function( shipping_method ) { |
| 162 | var class_name = 'method_disabled'; |
| 163 | |
| 164 | if ( 'yes' === shipping_method.enabled ) { |
| 165 | class_name = 'method_enabled'; |
| 166 | } |
| 167 | |
| 168 | $method_list.append( |
| 169 | '<li class="wc-shipping-zone-method ' + class_name + '">' + shipping_method.title + '</li>' |
| 170 | ); |
| 171 | } ); |
| 172 | } else { |
| 173 | $method_list.append( '<li class="wc-shipping-zone-method">' + data.strings.no_shipping_methods_offered + '</li>' ); |
| 174 | } |
| 175 | }, |
| 176 | onDeleteRow: function( event ) { |
| 177 | var view = event.data.view, |
| 178 | model = view.model, |
| 179 | zones = _.indexBy( model.get( 'zones' ), 'zone_id' ), |
| 180 | changes = {}, |
| 181 | row = $( this ).closest('tr'), |
| 182 | zone_id = row.data('id'); |
| 183 | |
| 184 | event.preventDefault(); |
| 185 | |
| 186 | if ( window.confirm( data.strings.delete_confirmation_msg ) ) { |
| 187 | if ( zones[ zone_id ] ) { |
| 188 | delete zones[ zone_id ]; |
| 189 | changes[ zone_id ] = _.extend( changes[ zone_id ] || {}, { deleted : 'deleted' } ); |
| 190 | model.set( 'zones', zones ); |
| 191 | model.logChanges( changes ); |
| 192 | event.data.view.block(); |
| 193 | event.data.view.model.save(); |
| 194 | } |
| 195 | } |
| 196 | }, |
| 197 | setUnloadConfirmation: function() { |
| 198 | this.needsUnloadConfirm = true; |
| 199 | $save_button.prop( 'disabled', false ); |
| 200 | }, |
| 201 | clearUnloadConfirmation: function() { |
| 202 | this.needsUnloadConfirm = false; |
| 203 | $save_button.prop( 'disabled', true ); |
| 204 | }, |
| 205 | unloadConfirmation: function( event ) { |
| 206 | if ( event.data.view.needsUnloadConfirm ) { |
| 207 | event.returnValue = data.strings.unload_confirmation_msg; |
| 208 | window.event.returnValue = data.strings.unload_confirmation_msg; |
| 209 | return data.strings.unload_confirmation_msg; |
| 210 | } |
| 211 | }, |
| 212 | updateModelOnChange: function( event ) { |
| 213 | var model = event.data.view.model, |
| 214 | $target = $( event.target ), |
| 215 | zone_id = $target.closest( 'tr' ).data( 'id' ), |
| 216 | attribute = $target.data( 'attribute' ), |
| 217 | value = $target.val(), |
| 218 | zones = _.indexBy( model.get( 'zones' ), 'zone_id' ), |
| 219 | changes = {}; |
| 220 | |
| 221 | if ( ! zones[ zone_id ] || zones[ zone_id ][ attribute ] !== value ) { |
| 222 | changes[ zone_id ] = {}; |
| 223 | changes[ zone_id ][ attribute ] = value; |
| 224 | } |
| 225 | |
| 226 | model.logChanges( changes ); |
| 227 | }, |
| 228 | updateModelOnSort: function( event ) { |
| 229 | var view = event.data.view, |
| 230 | model = view.model, |
| 231 | zones = _.indexBy( model.get( 'zones' ), 'zone_id' ), |
| 232 | rows = $( 'tbody.wc-shipping-zone-rows tr' ), |
| 233 | changes = {}; |
| 234 | |
| 235 | // Update sorted row position |
| 236 | _.each( rows, function( row ) { |
| 237 | var zone_id = $( row ).data( 'id' ), |
| 238 | old_position = null, |
| 239 | new_position = parseInt( $( row ).index(), 10 ); |
| 240 | |
| 241 | if ( zones[ zone_id ] ) { |
| 242 | old_position = parseInt( zones[ zone_id ].zone_order, 10 ); |
| 243 | } |
| 244 | |
| 245 | if ( old_position !== new_position ) { |
| 246 | changes[ zone_id ] = _.extend( changes[ zone_id ] || {}, { zone_order : new_position } ); |
| 247 | } |
| 248 | } ); |
| 249 | |
| 250 | if ( _.size( changes ) ) { |
| 251 | model.logChanges( changes ); |
| 252 | event.data.view.block(); |
| 253 | event.data.view.model.save(); |
| 254 | } |
| 255 | } |
| 256 | } ), |
| 257 | shippingZone = new ShippingZone({ |
| 258 | zones: data.zones |
| 259 | } ), |
| 260 | shippingZoneView = new ShippingZoneView({ |
| 261 | model: shippingZone, |
| 262 | el: $tbody |
| 263 | } ); |
| 264 | |
| 265 | shippingZoneView.render(); |
| 266 | |
| 267 | $tbody.sortable({ |
| 268 | items: 'tr', |
| 269 | cursor: 'move', |
| 270 | axis: 'y', |
| 271 | handle: 'td.wc-shipping-zone-sort', |
| 272 | scrollSensitivity: 40 |
| 273 | }); |
| 274 | }); |
| 275 | })( jQuery, shippingZonesLocalizeScript, wp, ajaxurl ); |
| 276 |