Changeset 2786416
- Timestamp:
- 09/17/2022 07:10:39 PM (4 years ago)
- Location:
- deliveryplus-by-invisible-dragon
- Files:
-
- 2 added
- 12 edited
- 1 copied
-
tags/1.6 (copied) (copied from deliveryplus-by-invisible-dragon/trunk)
-
tags/1.6/admin.js (modified) (2 diffs)
-
tags/1.6/bin/deploy.sh (modified) (1 diff)
-
tags/1.6/class.DeliveryPlus_Filter_Distance.php (added)
-
tags/1.6/class.DeliveryPlus_Filters.php (modified) (4 diffs)
-
tags/1.6/class.DeliveryPlus_Shipping_Method.php (modified) (12 diffs)
-
tags/1.6/id-delivery.php (modified) (4 diffs)
-
tags/1.6/readme.txt (modified) (5 diffs)
-
trunk/admin.js (modified) (2 diffs)
-
trunk/bin/deploy.sh (modified) (1 diff)
-
trunk/class.DeliveryPlus_Filter_Distance.php (added)
-
trunk/class.DeliveryPlus_Filters.php (modified) (4 diffs)
-
trunk/class.DeliveryPlus_Shipping_Method.php (modified) (12 diffs)
-
trunk/id-delivery.php (modified) (4 diffs)
-
trunk/readme.txt (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
deliveryplus-by-invisible-dragon/tags/1.6/admin.js
r2282505 r2786416 5 5 6 6 $(document).ready(function() { 7 8 // Show the most helpful description on this element based on it's value 9 $("#woocommerce_deliveryplus_class_cost_mode").each(function(){ 10 let help = $("<p>").addClass("description").appendTo($(this).parent()); 11 $(this).on("change", function(){ 12 help.html( $(this).data( $(this).val() ) ); 13 }).trigger("change"); 14 }); 7 15 8 16 $(".id-filtering").each(function () { … … 66 74 } 67 75 68 }else { 76 } else if(nextType == 'distance') { 77 78 let n = $("<div>").addClass("id-filter-distance"); 79 nextDrop.replaceWith(n); 80 nextDrop = n; 81 82 let value = $("<input type='hidden' />").addClass("id-filter-value").appendTo(n); 83 84 let km = $("<input type='text' />").addClass("input-text").attr("placeholder", "km").appendTo(n); 85 let lat = $("<input type='text' />").addClass("input-text").attr("placeholder", "lat").appendTo(n); 86 let lng = $("<input type='text' />").addClass("input-text").attr("placeholder", "lng").appendTo(n); 87 $(".input-text", n).on("change update", function(){ 88 value.val( km.val() + "|" + lat.val() + "|" + lng.val() ).trigger("change"); 89 }); 90 91 if(nextDrop.parent().attr("data-value")) { 92 let splitValue = nextDrop.parent().attr("data-value").split("|"); 93 km.val( splitValue[0] ); 94 lat.val( splitValue[1] ); 95 lng.val( splitValue[2] ); 96 nextDrop.parent().removeAttr("data-value"); 97 } 98 99 } else { 69 100 nextDrop.text("! " + nextType); 70 101 } -
deliveryplus-by-invisible-dragon/tags/1.6/bin/deploy.sh
r2465699 r2786416 8 8 9 9 # TODO: Move to a function to pull out of id-delivery.php 10 env PLUGIN_VERSION=1. 310 env PLUGIN_VERSION=1.6 11 11 12 12 # Common cleanup actions. -
deliveryplus-by-invisible-dragon/tags/1.6/class.DeliveryPlus_Filters.php
r2711454 r2786416 81 81 require_once "class.DeliveryPlus_Filter_Override.php"; 82 82 require_once "class.DeliveryPlus_Filter_ShippingClass.php"; 83 require_once 'class.DeliveryPlus_Filter_Distance.php'; 83 84 84 85 DeliveryPlus_Filter_Category::activate(); … … 88 89 DeliveryPlus_Filter_Override::activate(); 89 90 DeliveryPlus_Filter_ShippingClass::activate(); 91 DeliveryPlus_Filter_Distance::activate(); 90 92 } 91 93 … … 137 139 138 140 } 139 141 140 142 public static function output_html($args) { 141 143 require("includes/filters.php"); … … 162 164 163 165 public static function filter_package( $filters, $package ) { 164 166 165 167 if(empty($filters)) { 166 168 return true; 167 169 } 168 170 169 171 foreach($filters as $block) { 170 172 -
deliveryplus-by-invisible-dragon/tags/1.6/class.DeliveryPlus_Shipping_Method.php
r2711454 r2786416 19 19 ); 20 20 $this->instance_form_fields = array( 21 'enabled' => array(22 'title' => __( 'Enable/Disable' ),23 'type' => 'checkbox',24 'label' => __( 'Enable this shipping method' ),25 'default' => 'no',26 ),27 21 'title' => array( 28 22 'title' => __( 'Method Title' ), … … 60 54 $shipping_classes = WC()->shipping()->get_shipping_classes(); 61 55 if (!empty($shipping_classes)) { 56 $this->instance_form_fields['class_cost_mode'] = array( 57 'title' => __('Shipping class cost mode'), 58 'type' => 'select', 59 'class' => 'wc-enhanced-select', 60 'default' => 'per-item', 61 'options' => array( 62 'per-class' => __('Per Class'), 63 'per-item' => __('Per Item') 64 ), 65 'custom_attributes' => [ 66 'data-per-class' => __( 67 'This cost will be added if the customer basket contains at'. 68 ' least 1 item with this shipping class. You can also use <code>[class_qty]</code> for'. 69 ' the total number of items in the basket with this shipping method (in addition to the' . 70 ' other variables)' 71 ), 72 'data-per-item' => __( 73 'This cost will be added for every item with this shipping class.' 74 ) 75 ] 76 ); 62 77 foreach ($shipping_classes as $shipping_class) { 63 78 if (!isset($shipping_class->term_id)) { … … 67 82 'title' => sprintf(__('"%s" shipping class cost'), esc_html($shipping_class->name)), 68 83 'type' => 'text', 69 'placeholder' => __('N/A'), 70 'description' => __('This cost will be added for each item which has this shipping class') 84 'placeholder' => __('N/A') 71 85 ); 72 86 } … … 112 126 } 113 127 114 $this->enabled = $this->get_option( 'enabled' );115 128 $this->title = $this->get_option( 'title' ); 116 129 $this->internal_name = $this->get_option( 'internal_name' ); … … 125 138 126 139 add_filter( 'woocommerce_shipping_' . $this->id . '_instance_settings_values', array( $this, 'acf_options' ) ); 127 140 128 141 } 129 142 … … 200 213 201 214 echo '<div class="id-filtering">'; 202 215 203 216 DeliveryPlus_Filters::output_html($args); 204 217 … … 257 270 return; 258 271 } 259 272 260 273 // form data 261 274 $post_id = 'woo_ship_' . $this->instance_id; 262 275 263 276 acf_form_data(array( 264 277 'screen' => 'deliveryplus', … … 266 279 'validation' => ($args['view'] == 'register') ? 0 : 1 267 280 )); 268 281 269 282 // loop 270 283 foreach( $field_groups as $field_group ) { 271 284 272 285 // vars 273 286 $fields = acf_get_fields( $field_group ); 274 287 275 288 // title 276 289 if( $field_group['style'] === 'default' ) { 277 290 echo '</table><h2>' . $field_group['title'] . '</h2><table class="form-table">'; 278 291 } 279 292 280 293 // render 281 294 acf_render_fields( $fields, $post_id, 'tr', $field_group['instruction_placement'] ); … … 313 326 $total_flat_area = 0; 314 327 315 $additional_cost = 0; 328 $additional_cost = []; 329 $shipping_classes = []; 316 330 317 331 foreach ( $package['contents'] as $item_id => $values ) { … … 340 354 if(!empty($shipping_class)) { 341 355 $shipping_class = get_term_by( 'slug', $shipping_class, 'product_shipping_class' ); 342 $charge = $this->get_option( 'class_cost_' . $shipping_class->term_id ); 343 if($charge) { 344 $additional_cost += $charge * $values['quantity']; 345 } 356 $class = $shipping_class->term_id; 357 if(!array_key_exists($class, $shipping_classes)) { 358 $shipping_classes[$class] = 0; 359 } 360 $shipping_classes[$class] += $values['quantity']; 346 361 } 347 362 } 363 } 364 365 foreach($shipping_classes as $class => $counter) { 366 $charge = $this->get_option( 'class_cost_' . $class ); 367 // If this was never set, it will return per-item 368 if($this->get_option('class_cost_mode', 'per-item') == 'per-item') { 369 // Wrap it up so it will charge per item 370 $charge = '(' . $charge . ') * [class_qty]'; 371 } 372 $charge = str_replace( '[class_qty]', $counter, $charge ); 373 $additional_cost[] = $charge; 348 374 } 349 375 … … 358 384 add_filter( 'pre_do_shortcode_tag', array( $this, 'do_shortcode' ), 0, 4 ); 359 385 360 $sum = do_shortcode( 361 str_replace( 362 array( 363 '[qty]', 364 '[width]', 365 '[height]', 366 '[length]', 367 '[flat_area]', 368 '[weight]', 369 '[cost]', 370 ), 371 array( 372 $total_quantity, 373 $total_width, 374 $total_height, 375 $total_length, 376 $total_flat_area, 377 $total_weight, 378 $package['contents_cost'], 379 ), 380 $formula 381 ) 386 $items = array( 387 '[qty]', 388 '[width]', 389 '[height]', 390 '[length]', 391 '[flat_area]', 392 '[weight]', 393 '[cost]', 382 394 ); 395 $replacements = array( 396 $total_quantity, 397 $total_width, 398 $total_height, 399 $total_length, 400 $total_flat_area, 401 $total_weight, 402 $package['contents_cost'], 403 ); 404 405 $sum = do_shortcode(str_replace( $items, $replacements, $formula ) ); 406 foreach($additional_cost as $cost) { 407 $cost = do_shortcode( str_replace($items, $replacements, $cost) ); 408 $sum = '(' . $sum . ') + ' . $cost; // add on this formula 409 } 383 410 384 411 // Remove filter … … 397 424 398 425 // Do the math. 399 return ($sum ? WC_Eval_Math::evaluate( $sum ) : 0) + $additional_cost;426 return ($sum ? WC_Eval_Math::evaluate( $sum ) : 0); 400 427 401 428 } -
deliveryplus-by-invisible-dragon/tags/1.6/id-delivery.php
r2711454 r2786416 10 10 Requires PHP: 5.6 11 11 12 WC requires at least: 4.613 WC tested up to: 5.012 WC requires at least: 6.9 13 WC tested up to: 6.9.2 14 14 */ 15 15 … … 171 171 } 172 172 173 public function show_entry( $order ) { 174 173 public function show_entry( $order ) { 174 175 175 $entry_id = get_post_meta( $order->get_id(), 'deliveryplus_gf_entry', true ); 176 176 … … 260 260 261 261 } 262 262 263 263 } 264 264 265 265 } 266 266 … … 279 279 } 280 280 } 281 } 281 } 282 282 283 283 add_filter( 'gform_submit_button', '__return_false' ); -
deliveryplus-by-invisible-dragon/tags/1.6/readme.txt
r2711454 r2786416 3 3 Donate link: https://ko-fi.com/invisibledragonltd 4 4 Tags: woocommerce, delivery, gravityforms, acf, advancedcustomfields 5 Requires at least: 5.16 Tested up to: 5.45 Requires at least: 6.0 6 Tested up to: 6.0 7 7 Requires PHP: 7.2 8 8 Stable tag: 4.3 9 9 License: GPLv2 or later 10 10 License URI: http://www.gnu.org/licenses/gpl-2.0.html 11 11 12 12 DeliveryPlus provides a delivery option with rate calculation and filter rules. Also integrates with Gravity Forms and Advanced Custom Fields. 13 13 14 14 == Description == 15 15 16 16 DeliveryPlus was born out of a need for a clean, easy to use and native delivery method for WooCommerce. This plugin doesn't add any additional tabs to the WordPress menu bar, instead sitting neatly inside of WooCommerce's shipping options as it should, appearing like any other. 17 17 … … 21 21 22 22 Again, if you have Advanced Custom Fields installed, you can create custom fields which appear inside of the shipping admin area and, with custom code, can be used to create an advanced shipping section on a custom theme. 23 23 24 24 == Installation == 25 25 26 26 The plugin installs in the standard WordPress fashion. Typically use the Plugins and then Add New and search for the plugin. Or, the manual way: 27 27 28 28 1. Upload the plugin directory to the `/wp-content/plugins/` directory 29 29 1. Activate the plugin through the 'Plugins' menu in WordPress 30 30 31 31 == Frequently Asked Questions == 32 32 33 33 = Does it work with any other form plugin? = 34 34 35 35 Not at the moment 36 36 … … 42 42 43 43 Not at the moment 44 44 45 45 == Screenshots == 46 46 … … 49 49 50 50 == Changelog == 51 51 52 52 = 1.0 = 53 53 * Initial Release … … 76 76 * Allow overrides to be a filter 77 77 78 = 1.6 = 79 * Shipping class improve functionality 80 * Fix enabled bug 81 * Precise location filter 82 78 83 == Upgrade Notice == 79 84 80 85 = 1.0 = 81 86 Initial Release -
deliveryplus-by-invisible-dragon/trunk/admin.js
r2282505 r2786416 5 5 6 6 $(document).ready(function() { 7 8 // Show the most helpful description on this element based on it's value 9 $("#woocommerce_deliveryplus_class_cost_mode").each(function(){ 10 let help = $("<p>").addClass("description").appendTo($(this).parent()); 11 $(this).on("change", function(){ 12 help.html( $(this).data( $(this).val() ) ); 13 }).trigger("change"); 14 }); 7 15 8 16 $(".id-filtering").each(function () { … … 66 74 } 67 75 68 }else { 76 } else if(nextType == 'distance') { 77 78 let n = $("<div>").addClass("id-filter-distance"); 79 nextDrop.replaceWith(n); 80 nextDrop = n; 81 82 let value = $("<input type='hidden' />").addClass("id-filter-value").appendTo(n); 83 84 let km = $("<input type='text' />").addClass("input-text").attr("placeholder", "km").appendTo(n); 85 let lat = $("<input type='text' />").addClass("input-text").attr("placeholder", "lat").appendTo(n); 86 let lng = $("<input type='text' />").addClass("input-text").attr("placeholder", "lng").appendTo(n); 87 $(".input-text", n).on("change update", function(){ 88 value.val( km.val() + "|" + lat.val() + "|" + lng.val() ).trigger("change"); 89 }); 90 91 if(nextDrop.parent().attr("data-value")) { 92 let splitValue = nextDrop.parent().attr("data-value").split("|"); 93 km.val( splitValue[0] ); 94 lat.val( splitValue[1] ); 95 lng.val( splitValue[2] ); 96 nextDrop.parent().removeAttr("data-value"); 97 } 98 99 } else { 69 100 nextDrop.text("! " + nextType); 70 101 } -
deliveryplus-by-invisible-dragon/trunk/bin/deploy.sh
r2465699 r2786416 8 8 9 9 # TODO: Move to a function to pull out of id-delivery.php 10 env PLUGIN_VERSION=1. 310 env PLUGIN_VERSION=1.6 11 11 12 12 # Common cleanup actions. -
deliveryplus-by-invisible-dragon/trunk/class.DeliveryPlus_Filters.php
r2711454 r2786416 81 81 require_once "class.DeliveryPlus_Filter_Override.php"; 82 82 require_once "class.DeliveryPlus_Filter_ShippingClass.php"; 83 require_once 'class.DeliveryPlus_Filter_Distance.php'; 83 84 84 85 DeliveryPlus_Filter_Category::activate(); … … 88 89 DeliveryPlus_Filter_Override::activate(); 89 90 DeliveryPlus_Filter_ShippingClass::activate(); 91 DeliveryPlus_Filter_Distance::activate(); 90 92 } 91 93 … … 137 139 138 140 } 139 141 140 142 public static function output_html($args) { 141 143 require("includes/filters.php"); … … 162 164 163 165 public static function filter_package( $filters, $package ) { 164 166 165 167 if(empty($filters)) { 166 168 return true; 167 169 } 168 170 169 171 foreach($filters as $block) { 170 172 -
deliveryplus-by-invisible-dragon/trunk/class.DeliveryPlus_Shipping_Method.php
r2711454 r2786416 19 19 ); 20 20 $this->instance_form_fields = array( 21 'enabled' => array(22 'title' => __( 'Enable/Disable' ),23 'type' => 'checkbox',24 'label' => __( 'Enable this shipping method' ),25 'default' => 'no',26 ),27 21 'title' => array( 28 22 'title' => __( 'Method Title' ), … … 60 54 $shipping_classes = WC()->shipping()->get_shipping_classes(); 61 55 if (!empty($shipping_classes)) { 56 $this->instance_form_fields['class_cost_mode'] = array( 57 'title' => __('Shipping class cost mode'), 58 'type' => 'select', 59 'class' => 'wc-enhanced-select', 60 'default' => 'per-item', 61 'options' => array( 62 'per-class' => __('Per Class'), 63 'per-item' => __('Per Item') 64 ), 65 'custom_attributes' => [ 66 'data-per-class' => __( 67 'This cost will be added if the customer basket contains at'. 68 ' least 1 item with this shipping class. You can also use <code>[class_qty]</code> for'. 69 ' the total number of items in the basket with this shipping method (in addition to the' . 70 ' other variables)' 71 ), 72 'data-per-item' => __( 73 'This cost will be added for every item with this shipping class.' 74 ) 75 ] 76 ); 62 77 foreach ($shipping_classes as $shipping_class) { 63 78 if (!isset($shipping_class->term_id)) { … … 67 82 'title' => sprintf(__('"%s" shipping class cost'), esc_html($shipping_class->name)), 68 83 'type' => 'text', 69 'placeholder' => __('N/A'), 70 'description' => __('This cost will be added for each item which has this shipping class') 84 'placeholder' => __('N/A') 71 85 ); 72 86 } … … 112 126 } 113 127 114 $this->enabled = $this->get_option( 'enabled' );115 128 $this->title = $this->get_option( 'title' ); 116 129 $this->internal_name = $this->get_option( 'internal_name' ); … … 125 138 126 139 add_filter( 'woocommerce_shipping_' . $this->id . '_instance_settings_values', array( $this, 'acf_options' ) ); 127 140 128 141 } 129 142 … … 200 213 201 214 echo '<div class="id-filtering">'; 202 215 203 216 DeliveryPlus_Filters::output_html($args); 204 217 … … 257 270 return; 258 271 } 259 272 260 273 // form data 261 274 $post_id = 'woo_ship_' . $this->instance_id; 262 275 263 276 acf_form_data(array( 264 277 'screen' => 'deliveryplus', … … 266 279 'validation' => ($args['view'] == 'register') ? 0 : 1 267 280 )); 268 281 269 282 // loop 270 283 foreach( $field_groups as $field_group ) { 271 284 272 285 // vars 273 286 $fields = acf_get_fields( $field_group ); 274 287 275 288 // title 276 289 if( $field_group['style'] === 'default' ) { 277 290 echo '</table><h2>' . $field_group['title'] . '</h2><table class="form-table">'; 278 291 } 279 292 280 293 // render 281 294 acf_render_fields( $fields, $post_id, 'tr', $field_group['instruction_placement'] ); … … 313 326 $total_flat_area = 0; 314 327 315 $additional_cost = 0; 328 $additional_cost = []; 329 $shipping_classes = []; 316 330 317 331 foreach ( $package['contents'] as $item_id => $values ) { … … 340 354 if(!empty($shipping_class)) { 341 355 $shipping_class = get_term_by( 'slug', $shipping_class, 'product_shipping_class' ); 342 $charge = $this->get_option( 'class_cost_' . $shipping_class->term_id ); 343 if($charge) { 344 $additional_cost += $charge * $values['quantity']; 345 } 356 $class = $shipping_class->term_id; 357 if(!array_key_exists($class, $shipping_classes)) { 358 $shipping_classes[$class] = 0; 359 } 360 $shipping_classes[$class] += $values['quantity']; 346 361 } 347 362 } 363 } 364 365 foreach($shipping_classes as $class => $counter) { 366 $charge = $this->get_option( 'class_cost_' . $class ); 367 // If this was never set, it will return per-item 368 if($this->get_option('class_cost_mode', 'per-item') == 'per-item') { 369 // Wrap it up so it will charge per item 370 $charge = '(' . $charge . ') * [class_qty]'; 371 } 372 $charge = str_replace( '[class_qty]', $counter, $charge ); 373 $additional_cost[] = $charge; 348 374 } 349 375 … … 358 384 add_filter( 'pre_do_shortcode_tag', array( $this, 'do_shortcode' ), 0, 4 ); 359 385 360 $sum = do_shortcode( 361 str_replace( 362 array( 363 '[qty]', 364 '[width]', 365 '[height]', 366 '[length]', 367 '[flat_area]', 368 '[weight]', 369 '[cost]', 370 ), 371 array( 372 $total_quantity, 373 $total_width, 374 $total_height, 375 $total_length, 376 $total_flat_area, 377 $total_weight, 378 $package['contents_cost'], 379 ), 380 $formula 381 ) 386 $items = array( 387 '[qty]', 388 '[width]', 389 '[height]', 390 '[length]', 391 '[flat_area]', 392 '[weight]', 393 '[cost]', 382 394 ); 395 $replacements = array( 396 $total_quantity, 397 $total_width, 398 $total_height, 399 $total_length, 400 $total_flat_area, 401 $total_weight, 402 $package['contents_cost'], 403 ); 404 405 $sum = do_shortcode(str_replace( $items, $replacements, $formula ) ); 406 foreach($additional_cost as $cost) { 407 $cost = do_shortcode( str_replace($items, $replacements, $cost) ); 408 $sum = '(' . $sum . ') + ' . $cost; // add on this formula 409 } 383 410 384 411 // Remove filter … … 397 424 398 425 // Do the math. 399 return ($sum ? WC_Eval_Math::evaluate( $sum ) : 0) + $additional_cost;426 return ($sum ? WC_Eval_Math::evaluate( $sum ) : 0); 400 427 401 428 } -
deliveryplus-by-invisible-dragon/trunk/id-delivery.php
r2711454 r2786416 10 10 Requires PHP: 5.6 11 11 12 WC requires at least: 4.613 WC tested up to: 5.012 WC requires at least: 6.9 13 WC tested up to: 6.9.2 14 14 */ 15 15 … … 171 171 } 172 172 173 public function show_entry( $order ) { 174 173 public function show_entry( $order ) { 174 175 175 $entry_id = get_post_meta( $order->get_id(), 'deliveryplus_gf_entry', true ); 176 176 … … 260 260 261 261 } 262 262 263 263 } 264 264 265 265 } 266 266 … … 279 279 } 280 280 } 281 } 281 } 282 282 283 283 add_filter( 'gform_submit_button', '__return_false' ); -
deliveryplus-by-invisible-dragon/trunk/readme.txt
r2711454 r2786416 3 3 Donate link: https://ko-fi.com/invisibledragonltd 4 4 Tags: woocommerce, delivery, gravityforms, acf, advancedcustomfields 5 Requires at least: 5.16 Tested up to: 5.45 Requires at least: 6.0 6 Tested up to: 6.0 7 7 Requires PHP: 7.2 8 8 Stable tag: 4.3 9 9 License: GPLv2 or later 10 10 License URI: http://www.gnu.org/licenses/gpl-2.0.html 11 11 12 12 DeliveryPlus provides a delivery option with rate calculation and filter rules. Also integrates with Gravity Forms and Advanced Custom Fields. 13 13 14 14 == Description == 15 15 16 16 DeliveryPlus was born out of a need for a clean, easy to use and native delivery method for WooCommerce. This plugin doesn't add any additional tabs to the WordPress menu bar, instead sitting neatly inside of WooCommerce's shipping options as it should, appearing like any other. 17 17 … … 21 21 22 22 Again, if you have Advanced Custom Fields installed, you can create custom fields which appear inside of the shipping admin area and, with custom code, can be used to create an advanced shipping section on a custom theme. 23 23 24 24 == Installation == 25 25 26 26 The plugin installs in the standard WordPress fashion. Typically use the Plugins and then Add New and search for the plugin. Or, the manual way: 27 27 28 28 1. Upload the plugin directory to the `/wp-content/plugins/` directory 29 29 1. Activate the plugin through the 'Plugins' menu in WordPress 30 30 31 31 == Frequently Asked Questions == 32 32 33 33 = Does it work with any other form plugin? = 34 34 35 35 Not at the moment 36 36 … … 42 42 43 43 Not at the moment 44 44 45 45 == Screenshots == 46 46 … … 49 49 50 50 == Changelog == 51 51 52 52 = 1.0 = 53 53 * Initial Release … … 76 76 * Allow overrides to be a filter 77 77 78 = 1.6 = 79 * Shipping class improve functionality 80 * Fix enabled bug 81 * Precise location filter 82 78 83 == Upgrade Notice == 79 84 80 85 = 1.0 = 81 86 Initial Release
Note: See TracChangeset
for help on using the changeset viewer.