WC Vendors - Version 2.1.3

Version Description

Download this release

Release Info

Developer digitalchild
Plugin Icon 128x128 WC Vendors
Version 2.1.3
Comparing to
See all releases

Code changes from version 2.1.2 to 2.1.3

Files changed (132) hide show
  1. changelog.txt +11 -2
  2. class-wc-vendors.php +66 -67
  3. classes/admin/class-setup-wizard.php +8 -0
  4. classes/admin/emails/class-wcv-vendor-notify-order.php +6 -4
  5. classes/class-commission.php +56 -63
  6. classes/class-cron.php +14 -19
  7. classes/class-install.php +14 -14
  8. classes/class-queries.php +28 -36
  9. classes/class-shipping.php +57 -49
  10. classes/class-uninstall.php +9 -9
  11. classes/class-vendors.php +95 -97
  12. classes/includes/wcv-template-functions.php +1 -1
  13. languages/wc-vendors.pot +85 -85
  14. package.json +1 -1
  15. readme.txt +13 -22
  16. templates/emails/plain/vendor-order-details.php +5 -0
  17. templates/emails/vendor-new-order.php +3 -1
  18. templates/emails/vendor-order-details.php +8 -0
  19. trunk/assets/banner-1544x500.png +0 -0
  20. trunk/assets/banner-772x250.png +0 -0
  21. trunk/assets/css/_variables.scss +0 -23
  22. trunk/assets/css/admin-orders.css +0 -7
  23. trunk/assets/css/select2.min.css +0 -1
  24. trunk/assets/css/wcv-activation.css +0 -21
  25. trunk/assets/css/wcv-activation.min.css +0 -1
  26. trunk/assets/css/wcv-activation.scss +0 -68
  27. trunk/assets/css/wcv-admin.css +0 -164
  28. trunk/assets/css/wcv-admin.min.css +0 -1
  29. trunk/assets/css/wcv-admin.scss +0 -483
  30. trunk/assets/css/wcv-frontend.css +0 -547
  31. trunk/assets/css/wcv-setup.css +0 -185
  32. trunk/assets/css/wcv-setup.min.css +0 -1
  33. trunk/assets/css/wcv-setup.scss +0 -540
  34. trunk/assets/icon-128x128.png +0 -0
  35. trunk/assets/icon-256x256.png +0 -0
  36. trunk/assets/icon.svg +0 -115
  37. trunk/assets/images/extensions/screenshot-1.png +0 -0
  38. trunk/assets/images/extensions/screenshot-2.png +0 -0
  39. trunk/assets/images/extensions/screenshot-3.png +0 -0
  40. trunk/assets/images/icons/truck.png +0 -0
  41. trunk/assets/images/wcvendors_logo.png +0 -0
  42. trunk/assets/js/admin/settings.js +0 -74
  43. trunk/assets/js/admin/wcv-setup.js +0 -0
  44. trunk/assets/js/admin/wcvendors-media.js +0 -52
  45. trunk/assets/js/front-orders.js +0 -8
  46. trunk/assets/js/select2.min.js +0 -3
  47. trunk/assets/js/wcv-admin-login.js +0 -11
  48. trunk/assets/js/wcv-admin-quick-edit.js +0 -34
  49. trunk/assets/js/wcv-commissions.js +0 -11
  50. trunk/assets/screenshot-1.png +0 -0
  51. trunk/assets/screenshot-2.png +0 -0
  52. trunk/assets/screenshot-3.png +0 -0
  53. trunk/assets/screenshot-4.png +0 -0
  54. trunk/assets/screenshot-5.png +0 -0
  55. trunk/assets/screenshot-6.png +0 -0
  56. trunk/assets/screenshot-7.png +0 -0
  57. trunk/changelog.txt +0 -837
  58. trunk/class-wc-vendors.php +0 -462
  59. trunk/classes/admin/class-admin-menus.php +0 -185
  60. trunk/classes/admin/class-admin-page.php +0 -882
  61. trunk/classes/admin/class-admin-reports.php +0 -546
  62. trunk/classes/admin/class-admin-users.php +0 -447
  63. trunk/classes/admin/class-product-meta.php +0 -326
  64. trunk/classes/admin/class-setup-wizard.php +0 -369
  65. trunk/classes/admin/class-vendor-admin-dashboard.php +0 -755
  66. trunk/classes/admin/class-vendor-applicants.php +0 -104
  67. trunk/classes/admin/class-vendor-reports.php +0 -121
  68. trunk/classes/admin/class-wcv-admin-extensions.php +0 -25
  69. trunk/classes/admin/class-wcv-admin-help.php +0 -120
  70. trunk/classes/admin/class-wcv-admin-notices.php +0 -249
  71. trunk/classes/admin/class-wcv-admin-settings.php +0 -703
  72. trunk/classes/admin/class-wcv-admin-setup.php +0 -309
  73. trunk/classes/admin/class-wcv-commissions-csv-exporter.php +0 -175
  74. trunk/classes/admin/class-wcv-commissions-page.php +0 -554
  75. trunk/classes/admin/class-wcv-commissions-sum-csv-exporter.php +0 -118
  76. trunk/classes/admin/emails/class-emails.php +0 -316
  77. trunk/classes/admin/emails/class-wc-approve-vendor.php +0 -165
  78. trunk/classes/admin/emails/class-wc-notify-admin.php +0 -176
  79. trunk/classes/admin/emails/class-wc-notify-shipped.php +0 -201
  80. trunk/classes/admin/emails/class-wc-notify-vendor.php +0 -355
  81. trunk/classes/admin/emails/class-wcv-admin-notify-application.php +0 -187
  82. trunk/classes/admin/emails/class-wcv-admin-notify-product.php +0 -190
  83. trunk/classes/admin/emails/class-wcv-admin-notify-shipped.php +0 -179
  84. trunk/classes/admin/emails/class-wcv-customer-notify-shipped.php +0 -233
  85. trunk/classes/admin/emails/class-wcv-vendor-notify-application.php +0 -165
  86. trunk/classes/admin/emails/class-wcv-vendor-notify-approved.php +0 -183
  87. trunk/classes/admin/emails/class-wcv-vendor-notify-denied.php +0 -201
  88. trunk/classes/admin/emails/class-wcv-vendor-notify-order.php +0 -225
  89. trunk/classes/admin/includes/class-wcv-walker-pagedropdown-multiple.php +0 -60
  90. trunk/classes/admin/settings/README.md +0 -126
  91. trunk/classes/admin/settings/assets/css/sf-styles.css +0 -167
  92. trunk/classes/admin/settings/assets/img/tip.png +0 -0
  93. trunk/classes/admin/settings/assets/js/bootstrap-tooltip.js +0 -126
  94. trunk/classes/admin/settings/assets/js/js.iml +0 -10
  95. trunk/classes/admin/settings/assets/js/select2/select2-bootstrap.css +0 -87
  96. trunk/classes/admin/settings/assets/js/select2/select2-spinner.gif +0 -0
  97. trunk/classes/admin/settings/assets/js/select2/select2.css +0 -704
  98. trunk/classes/admin/settings/assets/js/select2/select2.js +0 -3541
  99. trunk/classes/admin/settings/assets/js/select2/select2.min.js +0 -23
  100. trunk/classes/admin/settings/assets/js/select2/select2.png +0 -0
  101. trunk/classes/admin/settings/assets/js/select2/select2x2.png +0 -0
  102. trunk/classes/admin/settings/assets/js/sf-jquery.js +0 -23
  103. trunk/classes/admin/settings/assets/js/wcvendors-media.js +0 -52
  104. trunk/classes/admin/settings/class-wcv-settings-advanced.php +0 -115
  105. trunk/classes/admin/settings/class-wcv-settings-capabilities.php +0 -313
  106. trunk/classes/admin/settings/class-wcv-settings-commission.php +0 -88
  107. trunk/classes/admin/settings/class-wcv-settings-display.php +0 -286
  108. trunk/classes/admin/settings/class-wcv-settings-general.php +0 -123
  109. trunk/classes/admin/settings/class-wcv-settings-page.php +0 -144
  110. trunk/classes/admin/settings/class-wcv-settings-payments.php +0 -143
  111. trunk/classes/admin/settings/classes/sf-class-format-options.php +0 -347
  112. trunk/classes/admin/settings/classes/sf-class-sanitize.php +0 -199
  113. trunk/classes/admin/settings/classes/sf-class-settings.php +0 -978
  114. trunk/classes/admin/settings/sf-options.php +0 -363
  115. trunk/classes/admin/views/html-admin-commission-page.php +0 -39
  116. trunk/classes/admin/views/html-admin-page-extensions.php +0 -92
  117. trunk/classes/admin/views/html-admin-settings.php +0 -46
  118. trunk/classes/admin/views/html-vendor-meta.php +0 -153
  119. trunk/classes/admin/views/html-vendor-settings-page.php +0 -114
  120. trunk/classes/admin/views/notices/html-notice-custom.php +0 -14
  121. trunk/classes/admin/views/notices/html-notice-install.php +0 -14
  122. trunk/classes/admin/views/notices/html-notice-template-check.php +0 -17
  123. trunk/classes/admin/views/notices/html-notice-theme-support.php +0 -0
  124. trunk/classes/admin/views/notices/html-notice-update.php +0 -19
  125. trunk/classes/admin/views/notices/html-notice-updated.php +0 -14
  126. trunk/classes/admin/views/notices/html-notice-updating.php +0 -13
  127. trunk/classes/admin/views/setup/capabilities.php +0 -134
  128. trunk/classes/admin/views/setup/footer.php +0 -20
  129. trunk/classes/admin/views/setup/general.php +0 -99
  130. trunk/classes/admin/views/setup/header.php +0 -22
  131. trunk/classes/admin/views/setup/pages.php +0 -87
  132. trunk/classes/admin/views/setup/ready.php +0 -74
changelog.txt CHANGED
@@ -1,9 +1,18 @@
1
  Changelog for WC Vendors Marketplace
2
 
 
 
 
 
 
 
 
 
 
3
  Version 2.1.2
4
 
5
- * Updated: Tested with WooCommerce 3.5.0
6
- * Updated: Tested with Wordpress 5.0.0
7
  * Fixed: Error messages on product edit page
8
  * Fixed: Reverse commissions if order is trashed
9
  * Fixed: Added extra checks for vendor order method
1
  Changelog for WC Vendors Marketplace
2
 
3
+ Version 2.1.3
4
+
5
+ * Updated: Treat product as vendor page if product author is vendor (#505)
6
+ * Updated: WordPress Coding Standards and general code cleanup thanks to Robert Devore
7
+ * Fixed: Add email filters and action hooks to vendor notify order email
8
+ * Fixed: Calculate tax without order details by geolocating user
9
+ * Fixed: Setup wizard menu item is visible on the dashboard menu #507
10
+ * Fixed: Commissions are calculated on integers #499
11
+
12
  Version 2.1.2
13
 
14
+ * Updated: Support for WooCommerce 3.5.0
15
+ * Updated: Support for Wordpress 5.0.0
16
  * Fixed: Error messages on product edit page
17
  * Fixed: Reverse commissions if order is trashed
18
  * Fixed: Added extra checks for vendor order method
class-wc-vendors.php CHANGED
@@ -7,7 +7,7 @@
7
  * Author URI: https://www.wcvendors.com
8
  * GitHub Plugin URI: https://github.com/wcvendors/wcvendors
9
  *
10
- * Version: 2.1.2
11
  * Requires at least: 4.4.0
12
  * Tested up to: 5.0.0
13
  * WC requires at least: 3.3.0
@@ -47,7 +47,7 @@ function wcvendors_activate() {
47
  /**
48
  * Requires woocommerce to be installed and active
49
  */
50
- if ( !class_exists( 'WooCommerce' ) ) {
51
  deactivate_plugins( plugin_basename( __FILE__ ) );
52
  wp_die( __( 'WC Vendors Marketplace requires WooCommerce to run. Please install WooCommerce and activate before attempting to activate again.', 'wc-vendors' ) );
53
  }
@@ -58,7 +58,7 @@ function wcvendors_activate() {
58
  /**
59
  * Plugin deactivation hook
60
  */
61
- function wcvendors_deactivate(){
62
  require_once trailingslashit( dirname( __FILE__ ) ) . 'classes/class-uninstall.php';
63
  WCVendors_Uninstall::uninstall();
64
  }
@@ -79,10 +79,10 @@ require_once trailingslashit( dirname( __FILE__ ) ) . 'classes/includes/class-fu
79
  if ( wcv_is_woocommerce_activated() ) {
80
 
81
  /* Define an absolute path to our plugin directory. */
82
- if ( !defined( 'wcv_plugin_dir' ) ) define( 'wcv_plugin_dir', trailingslashit( dirname( __FILE__ ) ) );
83
- if ( !defined( 'wcv_assets_url' ) ) define( 'wcv_assets_url', trailingslashit( plugins_url( 'assets', __FILE__ ) ) );
84
- if ( !defined( 'wcv_plugin_base' ) ) define( 'wcv_plugin_base', plugin_basename( __FILE__ ) );
85
- if ( !defined( 'wcv_plugin_dir_path' ) ) define( 'wcv_plugin_dir_path', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
86
 
87
  /**
88
  * Main Product Vendor class
@@ -92,7 +92,7 @@ if ( wcv_is_woocommerce_activated() ) {
92
  class WC_Vendors
93
  {
94
 
95
- public $version = '2.1.1';
96
 
97
  /**
98
  * @var
@@ -114,35 +114,35 @@ if ( wcv_is_woocommerce_activated() ) {
114
  $this->define_constants();
115
 
116
  // Install & upgrade
117
- add_action( 'admin_init', array( $this, 'check_install' ) );
118
- add_action( 'init', array( $this, 'maybe_flush_permalinks' ), 99 );
119
- add_action( 'wcvendors_flush_rewrite_rules', array( $this, 'flush_rewrite_rules' ) );
120
- add_action( 'admin_init', array( $this, 'wcv_required_ignore_notices' ) );
121
 
122
  add_action( 'plugins_loaded', array( $this, 'include_gateways' ) );
123
  add_action( 'plugins_loaded', array( $this, 'include_core' ) );
124
- add_action( 'init', array( $this, 'include_init' ) );
125
  add_action( 'current_screen', array( $this, 'include_assets' ) );
126
 
127
  // // Start a PHP session, if not yet started then destroy if logged in or out
128
  if ( ( ! is_admin() || defined( 'DOING_AJAX' ) ) && ! defined( 'DOING_CRON' ) && ! defined( 'REST_REQUEST' ) ) {
129
- add_action( 'init', array( $this, 'init_session'), 1 );
130
- add_action( 'wp_logout', array( $this, 'destroy_session') );
131
- add_action( 'wp_login', array( $this, 'destroy_session') );
132
  }
133
 
134
  // // Legacy settings
135
- add_action( 'admin_init', array( 'WCVendors_Install', 'check_pro_version' ) );
136
  add_action( 'plugins_loaded', array( $this, 'load_legacy_settings' ) );
137
 
138
  // Show update notices
139
  $file = basename( __FILE__ );
140
  $folder = basename( dirname( __FILE__ ) );
141
- $hook = "in_plugin_update_message-{$folder}/{$file}";
142
- add_action( $hook, array( $this, 'show_upgrade_notification') , 10, 2);
143
 
144
  //Add become a vendor rewrite endpoint
145
- add_action( 'init', array( $this, 'add_rewrite_endpoint' ) );
146
  add_action( 'after_switch_theme', array( $this, 'flush_rewrite_rules') );
147
  }
148
 
@@ -161,7 +161,7 @@ if ( wcv_is_woocommerce_activated() ) {
161
 
162
  $this->define( 'WCV_VERSION', $this->version );
163
  $this->define( 'WCV_TEMPLATE_BASE', untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/templates/' );
164
- $this->define( 'WCV_ABSPATH_ADMIN', dirname( __FILE__ ) . '/classes/admin/');
165
 
166
  }
167
 
@@ -183,13 +183,13 @@ if ( wcv_is_woocommerce_activated() ) {
183
  */
184
  public function init_session(){
185
 
186
- if ( !session_id() && is_user_logged_in() ) {
187
  session_start();
188
  }
189
 
190
  } //init_session()
191
 
192
- public function destroy_session(){
193
 
194
  if ( session_id() ) {
195
  session_destroy();
@@ -229,7 +229,7 @@ if ( wcv_is_woocommerce_activated() ) {
229
  public function load_il8n() {
230
  $locale = is_admin() && function_exists( 'get_user_locale' ) ? get_user_locale() : get_locale();
231
  $locale = apply_filters( 'plugin_locale', $locale, 'wc-vendors' );
232
- load_textdomain( 'wc-vendors', WP_LANG_DIR.'/wc-vendors/wc-vendors-'.$locale.'.mo');
233
  load_plugin_textdomain( 'wc-vendors', false, plugin_basename( dirname( __FILE__ ) ) . '/languages/' );
234
 
235
  }
@@ -239,31 +239,31 @@ if ( wcv_is_woocommerce_activated() ) {
239
  */
240
  public function include_core() {
241
 
242
- include_once( wcv_plugin_dir . 'classes/class-queries.php');
243
- include_once( wcv_plugin_dir . 'classes/class-vendors.php');
244
- include_once( wcv_plugin_dir . 'classes/class-cron.php');
245
- include_once( wcv_plugin_dir . 'classes/class-commission.php');
246
- include_once( wcv_plugin_dir . 'classes/class-shipping.php');
247
- include_once( wcv_plugin_dir . 'classes/class-vendor-order.php');
248
- include_once( wcv_plugin_dir . 'classes/class-vendor-post-types.php');
249
- include_once( wcv_plugin_dir . 'classes/includes/wcv-template-functions.php');
250
- include_once( wcv_plugin_dir . 'classes/includes/wcv-update-functions.php');
251
- include_once( wcv_plugin_dir . 'classes/admin/emails/class-emails.php');
252
 
253
  if ( is_admin() ) {
254
 
255
  include_once( wcv_plugin_dir . 'classes/class-install.php' );
256
- include_once( wcv_plugin_dir . 'classes/admin/class-vendor-applicants.php');
257
- include_once( wcv_plugin_dir . 'classes/admin/class-admin-reports.php');
258
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-commissions-page.php');
259
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-setup.php');
260
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-notices.php');
261
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-settings.php');
262
- include_once( wcv_plugin_dir . 'classes/admin/class-admin-menus.php');
263
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-extensions.php');
264
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-help.php');
265
- include_once( wcv_plugin_dir . 'classes/admin/class-setup-wizard.php');
266
- include_once( wcv_plugin_dir . 'classes/admin/class-vendor-admin-dashboard.php');
267
 
268
  new WCV_Vendor_Applicants;
269
  new WCV_Admin_Setup;
@@ -272,13 +272,13 @@ if ( wcv_is_woocommerce_activated() ) {
272
 
273
  } else {
274
 
275
- include_once( wcv_plugin_dir . 'classes/includes/class-wcv-shortcodes.php');
276
- include_once( wcv_plugin_dir . 'classes/front/class-vendor-cart.php');
277
- include_once( wcv_plugin_dir . 'classes/front/dashboard/class-vendor-dashboard.php');
278
- include_once( wcv_plugin_dir . 'classes/front/class-vendor-shop.php');
279
- include_once( wcv_plugin_dir . 'classes/front/signup/class-vendor-signup.php');
280
- include_once( wcv_plugin_dir . 'classes/front/orders/class-orders.php');
281
- include_once( wcv_plugin_dir . 'classes/front/account/class-wc-account-links.php');
282
 
283
  new WCV_Orders;
284
  new WCV_Vendor_Dashboard;
@@ -290,7 +290,7 @@ if ( wcv_is_woocommerce_activated() ) {
290
  }
291
 
292
  // Include
293
- if ( !function_exists( 'woocommerce_wp_text_input' ) && !is_admin() ) {
294
  include_once( WC()->plugin_path() . '/includes/admin/wc-meta-box-functions.php' );
295
  }
296
 
@@ -325,12 +325,12 @@ if ( wcv_is_woocommerce_activated() ) {
325
  /**
326
  * Load plugin assets
327
  */
328
- public function include_assets(){
329
 
330
  $screen = get_current_screen();
331
 
332
  if ( in_array( $screen->id, array( 'edit-product' ) ) ) {
333
- wp_enqueue_script( 'wcv_quick-edit', wcv_assets_url. 'js/wcv-admin-quick-edit.js', array('jquery') );
334
  }
335
 
336
  }
@@ -339,8 +339,7 @@ if ( wcv_is_woocommerce_activated() ) {
339
  /**
340
  * Include payment gateways
341
  */
342
- public function include_gateways()
343
- {
344
  require_once wcv_plugin_dir . 'classes/gateways/PayPal_AdvPayments/paypal_ap.php';
345
  require_once wcv_plugin_dir . 'classes/gateways/PayPal_Masspay/class-paypal-masspay.php';
346
  require_once wcv_plugin_dir . 'classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php';
@@ -384,10 +383,10 @@ if ( wcv_is_woocommerce_activated() ) {
384
 
385
  /* If user clicks to ignore the notice, add that to their user meta */
386
  if ( isset( $_GET[ 'wcv_shop_ignore_notice' ] ) && '0' == $_GET[ 'wcv_shop_ignore_notice' ] ) {
387
- add_user_meta( $current_user_id, 'wcv_shop_ignore_notice', 'true', true);
388
  }
389
  if ( isset($_GET['wcv_pl_ignore_notice']) && '0' == $_GET['wcv_pl_ignore_notice'] ) {
390
- add_user_meta( $current_user_id, 'wcv_pl_ignore_notice', 'true' , true);
391
  }
392
 
393
  }
@@ -403,8 +402,8 @@ if ( wcv_is_woocommerce_activated() ) {
403
  */
404
  public static function log( $data = '', $prefix = '' ){
405
 
406
- $trace = debug_backtrace( false, 2 );
407
- $caller = ( isset( $trace[ 1 ]['class'] ) ) ? $trace[ 1 ]['class'] : basename( $trace[ 1 ][ 'file' ] );
408
 
409
  if ( is_array( $data ) || is_object( $data ) ) {
410
  if ( $prefix ){
@@ -431,18 +430,18 @@ if ( wcv_is_woocommerce_activated() ) {
431
  */
432
  public function show_upgrade_notification( $args, $response ) {
433
 
434
- $new_version = $response->new_version;
435
- $upgrade_notice = sprintf( __( 'WC Vendors 2.0 is a major update. This is not compatible with any of our existing extensions. You should test this update on a staging server before updating. Backup your site and update your theme and extensions, and <a href="%s">review update details here</a> before upgrading.', 'wc-vendors' ), 'https://docs.wcvendors.com/knowledge-base/upgrading-to-wc-vendors-2-0/');
436
 
437
- if ( version_compare( WCV_VERSION, '2.0.0', '<' ) && version_compare( $new_version, '2.0.0', '>=') ){
438
  echo '<h3>Important Upgrade Notice:</h3>';
439
  echo '<p style="background-color: #d54e21; padding: 10px; color: #f9f9f9; margin-top: 10px">';
440
  echo $upgrade_notice;
441
- if ( !class_exists( 'WCVendors_Pro' ) ) echo '</p>';
442
 
443
- if ( class_exists( 'WCVendors_Pro' ) ){
444
 
445
- if ( version_compare( WCV_PRO_VERSION, '1.5.0', '<' ) ){
446
  echo '<h3>WC Vendors Pro Notice</h3>';
447
  echo '<p style="background-color: #d54e21; padding: 10px; color: #f9f9f9; margin-top: 10px">';
448
  $pro_upgrade = sprintf( __( 'WC Vendors Pro 1.5.0 is required to run WC Vendors 2.0.0. Your current version %s will be deactivated. Please upgrade to the latest version.', 'wc-vendors' ), WCV_PRO_VERSION );
7
  * Author URI: https://www.wcvendors.com
8
  * GitHub Plugin URI: https://github.com/wcvendors/wcvendors
9
  *
10
+ * Version: 2.1.3
11
  * Requires at least: 4.4.0
12
  * Tested up to: 5.0.0
13
  * WC requires at least: 3.3.0
47
  /**
48
  * Requires woocommerce to be installed and active
49
  */
50
+ if ( ! class_exists( 'WooCommerce' ) ) {
51
  deactivate_plugins( plugin_basename( __FILE__ ) );
52
  wp_die( __( 'WC Vendors Marketplace requires WooCommerce to run. Please install WooCommerce and activate before attempting to activate again.', 'wc-vendors' ) );
53
  }
58
  /**
59
  * Plugin deactivation hook
60
  */
61
+ function wcvendors_deactivate() {
62
  require_once trailingslashit( dirname( __FILE__ ) ) . 'classes/class-uninstall.php';
63
  WCVendors_Uninstall::uninstall();
64
  }
79
  if ( wcv_is_woocommerce_activated() ) {
80
 
81
  /* Define an absolute path to our plugin directory. */
82
+ if ( ! defined( 'wcv_plugin_dir' ) ) define( 'wcv_plugin_dir', trailingslashit( dirname( __FILE__ ) ) );
83
+ if ( ! defined( 'wcv_assets_url' ) ) define( 'wcv_assets_url', trailingslashit( plugins_url( 'assets', __FILE__ ) ) );
84
+ if ( ! defined( 'wcv_plugin_base' ) ) define( 'wcv_plugin_base', plugin_basename( __FILE__ ) );
85
+ if ( ! defined( 'wcv_plugin_dir_path' ) ) define( 'wcv_plugin_dir_path', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
86
 
87
  /**
88
  * Main Product Vendor class
92
  class WC_Vendors
93
  {
94
 
95
+ public $version = '2.1.3';
96
 
97
  /**
98
  * @var
114
  $this->define_constants();
115
 
116
  // Install & upgrade
117
+ add_action( 'admin_init', array( $this, 'check_install' ) );
118
+ add_action( 'init', array( $this, 'maybe_flush_permalinks' ), 99 );
119
+ add_action( 'wcvendors_flush_rewrite_rules', array( $this, 'flush_rewrite_rules' ) );
120
+ add_action( 'admin_init', array( $this, 'wcv_required_ignore_notices' ) );
121
 
122
  add_action( 'plugins_loaded', array( $this, 'include_gateways' ) );
123
  add_action( 'plugins_loaded', array( $this, 'include_core' ) );
124
+ add_action( 'init', array( $this, 'include_init' ) );
125
  add_action( 'current_screen', array( $this, 'include_assets' ) );
126
 
127
  // // Start a PHP session, if not yet started then destroy if logged in or out
128
  if ( ( ! is_admin() || defined( 'DOING_AJAX' ) ) && ! defined( 'DOING_CRON' ) && ! defined( 'REST_REQUEST' ) ) {
129
+ add_action( 'init', array( $this, 'init_session'), 1 );
130
+ add_action( 'wp_logout', array( $this, 'destroy_session') );
131
+ add_action( 'wp_login', array( $this, 'destroy_session') );
132
  }
133
 
134
  // // Legacy settings
135
+ add_action( 'admin_init', array( 'WCVendors_Install', 'check_pro_version' ) );
136
  add_action( 'plugins_loaded', array( $this, 'load_legacy_settings' ) );
137
 
138
  // Show update notices
139
  $file = basename( __FILE__ );
140
  $folder = basename( dirname( __FILE__ ) );
141
+ $hook = "in_plugin_update_message-{$folder}/{$file}";
142
+ add_action( $hook, array( $this, 'show_upgrade_notification' ) , 10, 2);
143
 
144
  //Add become a vendor rewrite endpoint
145
+ add_action( 'init', array( $this, 'add_rewrite_endpoint' ) );
146
  add_action( 'after_switch_theme', array( $this, 'flush_rewrite_rules') );
147
  }
148
 
161
 
162
  $this->define( 'WCV_VERSION', $this->version );
163
  $this->define( 'WCV_TEMPLATE_BASE', untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/templates/' );
164
+ $this->define( 'WCV_ABSPATH_ADMIN', dirname( __FILE__ ) . '/classes/admin/' );
165
 
166
  }
167
 
183
  */
184
  public function init_session(){
185
 
186
+ if ( ! session_id() && is_user_logged_in() ) {
187
  session_start();
188
  }
189
 
190
  } //init_session()
191
 
192
+ public function destroy_session() {
193
 
194
  if ( session_id() ) {
195
  session_destroy();
229
  public function load_il8n() {
230
  $locale = is_admin() && function_exists( 'get_user_locale' ) ? get_user_locale() : get_locale();
231
  $locale = apply_filters( 'plugin_locale', $locale, 'wc-vendors' );
232
+ load_textdomain( 'wc-vendors', WP_LANG_DIR.'/wc-vendors/wc-vendors-'.$locale.'.mo' );
233
  load_plugin_textdomain( 'wc-vendors', false, plugin_basename( dirname( __FILE__ ) ) . '/languages/' );
234
 
235
  }
239
  */
240
  public function include_core() {
241
 
242
+ include_once( wcv_plugin_dir . 'classes/class-queries.php' );
243
+ include_once( wcv_plugin_dir . 'classes/class-vendors.php' );
244
+ include_once( wcv_plugin_dir . 'classes/class-cron.php' );
245
+ include_once( wcv_plugin_dir . 'classes/class-commission.php' );
246
+ include_once( wcv_plugin_dir . 'classes/class-shipping.php' );
247
+ include_once( wcv_plugin_dir . 'classes/class-vendor-order.php' );
248
+ include_once( wcv_plugin_dir . 'classes/class-vendor-post-types.php' );
249
+ include_once( wcv_plugin_dir . 'classes/includes/wcv-template-functions.php' );
250
+ include_once( wcv_plugin_dir . 'classes/includes/wcv-update-functions.php' );
251
+ include_once( wcv_plugin_dir . 'classes/admin/emails/class-emails.php' );
252
 
253
  if ( is_admin() ) {
254
 
255
  include_once( wcv_plugin_dir . 'classes/class-install.php' );
256
+ include_once( wcv_plugin_dir . 'classes/admin/class-vendor-applicants.php' );
257
+ include_once( wcv_plugin_dir . 'classes/admin/class-admin-reports.php' );
258
+ include_once( wcv_plugin_dir . 'classes/admin/class-wcv-commissions-page.php' );
259
+ include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-setup.php' );
260
+ include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-notices.php' );
261
+ include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-settings.php' );
262
+ include_once( wcv_plugin_dir . 'classes/admin/class-admin-menus.php' );
263
+ include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-extensions.php' );
264
+ include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-help.php' );
265
+ include_once( wcv_plugin_dir . 'classes/admin/class-setup-wizard.php' );
266
+ include_once( wcv_plugin_dir . 'classes/admin/class-vendor-admin-dashboard.php' );
267
 
268
  new WCV_Vendor_Applicants;
269
  new WCV_Admin_Setup;
272
 
273
  } else {
274
 
275
+ include_once( wcv_plugin_dir . 'classes/includes/class-wcv-shortcodes.php' );
276
+ include_once( wcv_plugin_dir . 'classes/front/class-vendor-cart.php' );
277
+ include_once( wcv_plugin_dir . 'classes/front/dashboard/class-vendor-dashboard.php' );
278
+ include_once( wcv_plugin_dir . 'classes/front/class-vendor-shop.php' );
279
+ include_once( wcv_plugin_dir . 'classes/front/signup/class-vendor-signup.php' );
280
+ include_once( wcv_plugin_dir . 'classes/front/orders/class-orders.php' );
281
+ include_once( wcv_plugin_dir . 'classes/front/account/class-wc-account-links.php' );
282
 
283
  new WCV_Orders;
284
  new WCV_Vendor_Dashboard;
290
  }
291
 
292
  // Include
293
+ if ( ! function_exists( 'woocommerce_wp_text_input' ) && ! is_admin() ) {
294
  include_once( WC()->plugin_path() . '/includes/admin/wc-meta-box-functions.php' );
295
  }
296
 
325
  /**
326
  * Load plugin assets
327
  */
328
+ public function include_assets() {
329
 
330
  $screen = get_current_screen();
331
 
332
  if ( in_array( $screen->id, array( 'edit-product' ) ) ) {
333
+ wp_enqueue_script( 'wcv_quick-edit', wcv_assets_url. 'js/wcv-admin-quick-edit.js', array( 'jquery' ) );
334
  }
335
 
336
  }
339
  /**
340
  * Include payment gateways
341
  */
342
+ public function include_gateways() {
 
343
  require_once wcv_plugin_dir . 'classes/gateways/PayPal_AdvPayments/paypal_ap.php';
344
  require_once wcv_plugin_dir . 'classes/gateways/PayPal_Masspay/class-paypal-masspay.php';
345
  require_once wcv_plugin_dir . 'classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php';
383
 
384
  /* If user clicks to ignore the notice, add that to their user meta */
385
  if ( isset( $_GET[ 'wcv_shop_ignore_notice' ] ) && '0' == $_GET[ 'wcv_shop_ignore_notice' ] ) {
386
+ add_user_meta( $current_user_id, 'wcv_shop_ignore_notice', 'true', true );
387
  }
388
  if ( isset($_GET['wcv_pl_ignore_notice']) && '0' == $_GET['wcv_pl_ignore_notice'] ) {
389
+ add_user_meta( $current_user_id, 'wcv_pl_ignore_notice', 'true' , true );
390
  }
391
 
392
  }
402
  */
403
  public static function log( $data = '', $prefix = '' ){
404
 
405
+ $trace = debug_backtrace( false, 2 );
406
+ $caller = ( isset( $trace[ 1 ]['class'] ) ) ? $trace[ 1 ]['class'] : basename( $trace[ 1 ][ 'file' ] );
407
 
408
  if ( is_array( $data ) || is_object( $data ) ) {
409
  if ( $prefix ){
430
  */
431
  public function show_upgrade_notification( $args, $response ) {
432
 
433
+ $new_version = $response->new_version;
434
+ $upgrade_notice = sprintf( __( 'WC Vendors 2.0 is a major update. This is not compatible with any of our existing extensions. You should test this update on a staging server before updating. Backup your site and update your theme and extensions, and <a href="%s">review update details here</a> before upgrading.', 'wc-vendors' ), 'https://docs.wcvendors.com/knowledge-base/upgrading-to-wc-vendors-2-0/' );
435
 
436
+ if ( version_compare( WCV_VERSION, '2.0.0', '<' ) && version_compare( $new_version, '2.0.0', '>=' ) ) {
437
  echo '<h3>Important Upgrade Notice:</h3>';
438
  echo '<p style="background-color: #d54e21; padding: 10px; color: #f9f9f9; margin-top: 10px">';
439
  echo $upgrade_notice;
440
+ if ( ! class_exists( 'WCVendors_Pro' ) ) echo '</p>';
441
 
442
+ if ( class_exists( 'WCVendors_Pro' ) ) {
443
 
444
+ if ( version_compare( WCV_PRO_VERSION, '1.5.0', '<' ) ) {
445
  echo '<h3>WC Vendors Pro Notice</h3>';
446
  echo '<p style="background-color: #d54e21; padding: 10px; color: #f9f9f9; margin-top: 10px">';
447
  $pro_upgrade = sprintf( __( 'WC Vendors Pro 1.5.0 is required to run WC Vendors 2.0.0. Your current version %s will be deactivated. Please upgrade to the latest version.', 'wc-vendors' ), WCV_PRO_VERSION );
classes/admin/class-setup-wizard.php CHANGED
@@ -46,6 +46,7 @@ class WCVendors_Admin_Setup_Wizard {
46
  if ( apply_filters( 'wcv_enable_setup_wizard', true ) && current_user_can( 'manage_woocommerce' ) ) {
47
  add_action( 'admin_menu', array( $this, 'admin_menus' ) );
48
  add_action( 'admin_init', array( $this, 'setup_wizard' ) );
 
49
  }
50
  }
51
 
@@ -56,6 +57,13 @@ class WCVendors_Admin_Setup_Wizard {
56
  add_dashboard_page( '', '', 'manage_options', 'wcv-setup', '' );
57
  }
58
 
 
 
 
 
 
 
 
59
  /**
60
  * Show the setup wizard.
61
  */
46
  if ( apply_filters( 'wcv_enable_setup_wizard', true ) && current_user_can( 'manage_woocommerce' ) ) {
47
  add_action( 'admin_menu', array( $this, 'admin_menus' ) );
48
  add_action( 'admin_init', array( $this, 'setup_wizard' ) );
49
+ add_action( 'admin_head', array( $this, 'hide_setup_wizard' ) );
50
  }
51
  }
52
 
57
  add_dashboard_page( '', '', 'manage_options', 'wcv-setup', '' );
58
  }
59
 
60
+ /**
61
+ * Hide the setup wizard menu item.
62
+ */
63
+ public function hide_setup_wizard() {
64
+ remove_submenu_page( 'index.php', 'wcv-setup' );
65
+ }
66
+
67
  /**
68
  * Show the setup wizard.
69
  */
classes/admin/emails/class-wcv-vendor-notify-order.php CHANGED
@@ -115,10 +115,11 @@ class WCVendors_Vendor_Notify_Order extends WC_Email {
115
  *
116
  * @access public
117
  * @return string
 
118
  */
119
  public function get_content_html() {
120
 
121
- return wc_get_template_html( $this->template_html, array(
122
  'order' => $this->object,
123
  'vendor_id' => $this->vendor_id,
124
  'vendor_items' => $this->order_items,
@@ -128,7 +129,7 @@ class WCVendors_Vendor_Notify_Order extends WC_Email {
128
  'sent_to_vendor' => true,
129
  'plain_text' => false,
130
  'email' => $this,
131
- ), 'woocommerce', $this->template_base );
132
  }
133
 
134
  /**
@@ -136,9 +137,10 @@ class WCVendors_Vendor_Notify_Order extends WC_Email {
136
  *
137
  * @access public
138
  * @return string
 
139
  */
140
  public function get_content_plain() {
141
- return wc_get_template_html( $this->template_plain, array(
142
  'order' => $this->object,
143
  'vendor_id' => $this->vendor_id,
144
  'vendor_items' => $this->order_items,
@@ -148,7 +150,7 @@ class WCVendors_Vendor_Notify_Order extends WC_Email {
148
  'totals_display' => $this->totals_display,
149
  'plain_text' => true,
150
  'email' => $this,
151
- ), 'woocommerce', $this->template_base );
152
  }
153
 
154
  /**
115
  *
116
  * @access public
117
  * @return string
118
+ * @version 2.1.3
119
  */
120
  public function get_content_html() {
121
 
122
+ return apply_filters( 'wcv_vendor_notify_order_get_content_html', wc_get_template_html( $this->template_html, array(
123
  'order' => $this->object,
124
  'vendor_id' => $this->vendor_id,
125
  'vendor_items' => $this->order_items,
129
  'sent_to_vendor' => true,
130
  'plain_text' => false,
131
  'email' => $this,
132
+ ), 'woocommerce', $this->template_base ), $this );
133
  }
134
 
135
  /**
137
  *
138
  * @access public
139
  * @return string
140
+ * @version 2.1.3
141
  */
142
  public function get_content_plain() {
143
+ return apply_filters( 'wcv_vendor_notify_order_get_content_plain', wc_get_template_html( $this->template_plain, array(
144
  'order' => $this->object,
145
  'vendor_id' => $this->vendor_id,
146
  'vendor_items' => $this->order_items,
150
  'totals_display' => $this->totals_display,
151
  'plain_text' => true,
152
  'email' => $this,
153
+ ), 'woocommerce', $this->template_base ), $this );
154
  }
155
 
156
  /**
classes/class-commission.php CHANGED
@@ -22,7 +22,7 @@ class WCV_Commission
22
 
23
  // Reverse the commission if the order is deleted
24
  add_action( 'deleted_post', array( $this, 'commissions_table_sync' ), 10 );
25
- add_action( 'wp_trash_post', array( $this ,'commissions_table_sync'), 10 );
26
  }
27
 
28
 
@@ -42,8 +42,7 @@ class WCV_Commission
42
  /**
43
  * Runs only on a manual order update by a human
44
  */
45
- public function check_order_complete()
46
- {
47
  foreach ( $this->get_completed_status() as $completed ) {
48
  add_action( 'woocommerce_order_status_' . $completed, array( 'WCV_Commission', 'log_commission_due' ) );
49
  }
@@ -53,9 +52,9 @@ class WCV_Commission
53
  public static function commission_status(){
54
 
55
  return apply_filters( 'wcvendors_commission_status', array(
56
- 'due' => __( 'Due', 'wc-vendors' ),
57
- 'paid' => __( 'Paid', 'wc-vendors' ),
58
- 'reversed' => __( 'Reversed', 'wc-vendors' )
59
  )
60
  );
61
  }
@@ -63,20 +62,22 @@ class WCV_Commission
63
  /**
64
  * return completed statuss
65
  */
66
- public function get_completed_status(){
67
 
68
  return $completed_statuses = apply_filters( 'wcvendors_completed_statuses',
69
  array(
70
  'completed',
71
  'processing',
72
- ) );
 
 
73
  }
74
 
75
 
76
  /*
77
  * Return reversed status's
78
  */
79
- public function get_reversed_status(){
80
 
81
  return $reverse_statuses = apply_filters( 'wcvendors_reversed_statuses',
82
  array(
@@ -84,7 +85,8 @@ class WCV_Commission
84
  'refunded',
85
  'cancelled',
86
  'failed',
87
- ) );
 
88
 
89
  }
90
 
@@ -98,13 +100,12 @@ class WCV_Commission
98
  *
99
  * @return unknown
100
  */
101
- public static function reverse_due_commission( $order_id )
102
- {
103
  global $wpdb;
104
 
105
  // Check if this order exists
106
  $count = WCV_Commission::count_commission_by_order( $order_id );
107
- if ( !$count ) return false;
108
 
109
  // Deduct this amount from the vendor's total due
110
  $results = WCV_Commission::sum_total_due_for_order( $order_id );
@@ -125,8 +126,7 @@ class WCV_Commission
125
  *
126
  * @param int $order_id
127
  */
128
- public static function log_commission_due( $order_id )
129
- {
130
  global $woocommerce;
131
 
132
  $order = wc_get_order( $order_id );
@@ -153,15 +153,15 @@ class WCV_Commission
153
  'order_id' => $order_id,
154
  'vendor_id' => $vendor_id,
155
  'product_id' => $product_id,
156
- 'total_due' => !empty( $insert_due[ $product_id ][ 'total_due' ] ) ? ( $detail[ 'commission' ] + $insert_due[ $product_id ][ 'total_due' ] ) : $detail[ 'commission' ],
157
- 'total_shipping' => !empty( $insert_due[ $product_id ][ 'total_shipping' ] ) ? ( $detail[ 'shipping' ] + $insert_due[ $product_id ][ 'total_shipping' ] ) : $detail[ 'shipping' ],
158
- 'tax' => !empty( $insert_due[ $product_id ][ 'tax' ] ) ? ( $detail[ 'tax' ] + $insert_due[ $product_id ][ 'tax' ] ) : $detail[ 'tax' ],
159
- 'qty' => !empty( $insert_due[ $product_id ][ 'qty' ] ) ? ( $detail[ 'qty' ] + $insert_due[ $product_id ][ 'qty' ] ) : $detail[ 'qty' ],
160
  'time' => date( 'Y-m-d H:i:s', strtotime( $order_date ) ),
161
  );
162
  }
163
 
164
- if ( !empty( $insert_due ) ) {
165
  WCV_Commission::insert_new_commission( array_values( $insert_due ) );
166
  }
167
  }
@@ -176,8 +176,7 @@ class WCV_Commission
176
  *
177
  * @return array
178
  */
179
- public static function sum_total_due_for_order( $order_id, $status = 'due' )
180
- {
181
  global $wpdb;
182
 
183
  $table_name = $wpdb->prefix . "pv_commission";
@@ -191,7 +190,7 @@ class WCV_Commission
191
  foreach ( $results as $commission ) {
192
  $commission_ids[ ] = $commission->id;
193
 
194
- $pay[ $commission->vendor_id ] = !empty( $pay[ $commission->vendor_id ] )
195
  ? ( $pay[ $commission->vendor_id ] + ( $commission->total_due + $commission->total_shipping + $commission->tax ) )
196
  : ( $commission->total_due + $commission->total_shipping + $commission->tax );
197
  }
@@ -210,8 +209,7 @@ class WCV_Commission
210
  *
211
  * @return object
212
  */
213
- public static function get_all_due()
214
- {
215
  global $wpdb;
216
 
217
  $table_name = $wpdb->prefix . "pv_commission";
@@ -232,8 +230,7 @@ class WCV_Commission
232
  *
233
  * @return int
234
  */
235
- public static function count_commission_by_order( $order_id )
236
- {
237
  global $wpdb;
238
  $table_name = $wpdb->prefix . "pv_commission";
239
 
@@ -261,11 +258,11 @@ class WCV_Commission
261
 
262
  global $wpdb;
263
 
264
- $table_name = $wpdb->prefix . "pv_commission";
265
 
266
- $order_id = $order[ 'order_id' ];
267
- $vendor_id = $order[ 'vendor_id' ];
268
- $product_id = $order[ 'product_id' ];
269
 
270
  $query = "SELECT count(order_id) AS order_count
271
  FROM {$table_name}
@@ -289,8 +286,7 @@ class WCV_Commission
289
  *
290
  * @return float
291
  */
292
- public static function get_commission_rate( $product_id )
293
- {
294
 
295
  $commission = 0;
296
 
@@ -303,15 +299,15 @@ class WCV_Commission
303
  $vendor_commission = WCV_Vendors::get_default_commission( $vendor_id );
304
  $default_commission = get_option( 'wcvendors_vendor_commission_rate' );
305
 
306
- if ( $product_commission != '' && $product_commission !== false ) {
307
  $commission = $product_commission;
308
  }
309
 
310
- else if ( $vendor_commission != '' && $vendor_commission !== false ) {
311
  $commission = $vendor_commission;
312
  }
313
 
314
- else if ( $default_commission != '' && $default_commission !== false ) {
315
  $commission = $default_commission;
316
  }
317
 
@@ -327,8 +323,7 @@ class WCV_Commission
327
  *
328
  * @return float
329
  */
330
- public static function calculate_commission( $product_price, $product_id, $order, $qty )
331
- {
332
  $commission_rate = WCV_Commission::get_commission_rate( $product_id );
333
  $commission = $product_price * ( $commission_rate / 100 );
334
  $commission = round( $commission, 2 );
@@ -346,8 +341,7 @@ class WCV_Commission
346
  *
347
  * @return unknown
348
  */
349
- public static function insert_new_commission( $orders = array() )
350
- {
351
  global $wpdb;
352
 
353
  if ( empty( $orders ) ) return false;
@@ -361,6 +355,7 @@ class WCV_Commission
361
  }
362
 
363
  foreach ( $orders as $key => $order ) {
 
364
  $where = array(
365
  'order_id' => $order[ 'order_id' ],
366
  'product_id' => $order[ 'product_id' ],
@@ -370,9 +365,10 @@ class WCV_Commission
370
  // Is the commission already paid?
371
  $count = WCV_Commission::check_commission_status( $order, 'paid' );
372
 
373
- if ( $count == 0 ) {
374
- $update = $wpdb->update( $table, $order, $where );
375
- if ( !$update ) $insert = $wpdb->insert( $table, $order );
 
376
  }
377
 
378
  }
@@ -392,8 +388,7 @@ class WCV_Commission
392
  *
393
  * @return bool.
394
  */
395
- public static function set_order_commission_paid( $order_id, $column_ids = false )
396
- {
397
  global $wpdb;
398
 
399
  $table_name = $wpdb->prefix . "pv_commission";
@@ -418,8 +413,7 @@ class WCV_Commission
418
  *
419
  * @return bool.
420
  */
421
- public static function set_vendor_commission_paid( $vendors )
422
- {
423
  global $wpdb;
424
 
425
  $table_name = $wpdb->prefix . "pv_commission";
@@ -446,8 +440,7 @@ class WCV_Commission
446
  *
447
  * @return bool.
448
  */
449
- public static function set_vendor_product_commission_paid( $vendor_id, $product_id, $order_id )
450
- {
451
  global $wpdb;
452
 
453
  $table_name = $wpdb->prefix . "pv_commission";
@@ -468,13 +461,13 @@ class WCV_Commission
468
  *
469
  * @return bool.
470
  */
471
- public function commissions_table_sync( $order_id ){
472
 
473
  global $wpdb;
474
 
475
  $table_name = $wpdb->prefix . "pv_commission";
476
- $query = "UPDATE `{$table_name}` SET `status` = 'reversed' WHERE `order_id` = %d";
477
- $results = $wpdb->query( $wpdb->prepare( $query, $order_id ) );
478
 
479
  } // commissions_table_sync()
480
 
@@ -488,7 +481,7 @@ class WCV_Commission
488
  * @param string $status the status to look for
489
  * @return object $totals as an object
490
  */
491
- public static function commissions_now( $vendor_id, $status = 'due', $inc_shipping = false, $inc_tax = false ){
492
 
493
  global $wpdb;
494
 
@@ -525,7 +518,7 @@ class WCV_Commission
525
  * @param int $product_id the product id to search for
526
  * @param int $vendor_id the vendor id to search for
527
  */
528
- public static function get_commission_due( $order_id, $product_id, $vendor_id ){
529
 
530
  global $wpdb;
531
 
@@ -553,7 +546,7 @@ class WCV_Commission
553
  * @since 2.0.0
554
  * @access public
555
  */
556
- public static function get_totals( $status = 'due' ){
557
 
558
  $total_due = 0;
559
 
@@ -576,13 +569,13 @@ class WCV_Commission
576
  * @since 2.0.3
577
  * @access public
578
  */
579
- public static function get_sum_vendor_totals(){
580
 
581
  global $wpdb;
582
 
583
- $due = array();
584
- $paid = array();
585
- $reversed = array();
586
 
587
  $table_name = $wpdb->prefix . "pv_commission";
588
  $query = "SELECT `id`, `total_due`, `total_shipping`, `tax`, `vendor_id`, `status`
@@ -595,7 +588,7 @@ class WCV_Commission
595
  $status_sql = '';
596
  $time_sql = '';
597
 
598
- if ( !empty( $_GET[ 'm' ] ) ) {
599
 
600
  $year = substr( $_GET[ 'm' ], 0, 4 );
601
  $month = substr( $_GET[ 'm' ], 4, 2 );
@@ -608,7 +601,7 @@ class WCV_Commission
608
  $query .= $time_sql;
609
  }
610
 
611
- if ( !empty( $_GET[ 'com_status' ] ) ) {
612
 
613
  if ( $time_sql == '' ) {
614
  $status_sql = "
@@ -623,9 +616,9 @@ class WCV_Commission
623
  $query .= $status_sql;
624
  }
625
 
626
- if ( !empty( $_GET[ 'vendor_id' ] ) ) {
627
 
628
- if ( $time_sql == '' && $status_sql == '' ) {
629
  $vendor_sql = "
630
  WHERE vendor_id = '$vendor_id'
631
  ";
22
 
23
  // Reverse the commission if the order is deleted
24
  add_action( 'deleted_post', array( $this, 'commissions_table_sync' ), 10 );
25
+ add_action( 'wp_trash_post', array( $this ,'commissions_table_sync' ), 10 );
26
  }
27
 
28
 
42
  /**
43
  * Runs only on a manual order update by a human
44
  */
45
+ public function check_order_complete() {
 
46
  foreach ( $this->get_completed_status() as $completed ) {
47
  add_action( 'woocommerce_order_status_' . $completed, array( 'WCV_Commission', 'log_commission_due' ) );
48
  }
52
  public static function commission_status(){
53
 
54
  return apply_filters( 'wcvendors_commission_status', array(
55
+ 'due' => __( 'Due', 'wc-vendors' ),
56
+ 'paid' => __( 'Paid', 'wc-vendors' ),
57
+ 'reversed' => __( 'Reversed', 'wc-vendors' )
58
  )
59
  );
60
  }
62
  /**
63
  * return completed statuss
64
  */
65
+ public function get_completed_status() {
66
 
67
  return $completed_statuses = apply_filters( 'wcvendors_completed_statuses',
68
  array(
69
  'completed',
70
  'processing',
71
+ )
72
+ );
73
+
74
  }
75
 
76
 
77
  /*
78
  * Return reversed status's
79
  */
80
+ public function get_reversed_status() {
81
 
82
  return $reverse_statuses = apply_filters( 'wcvendors_reversed_statuses',
83
  array(
85
  'refunded',
86
  'cancelled',
87
  'failed',
88
+ )
89
+ );
90
 
91
  }
92
 
100
  *
101
  * @return unknown
102
  */
103
+ public static function reverse_due_commission( $order_id ) {
 
104
  global $wpdb;
105
 
106
  // Check if this order exists
107
  $count = WCV_Commission::count_commission_by_order( $order_id );
108
+ if ( ! $count ) return false;
109
 
110
  // Deduct this amount from the vendor's total due
111
  $results = WCV_Commission::sum_total_due_for_order( $order_id );
126
  *
127
  * @param int $order_id
128
  */
129
+ public static function log_commission_due( $order_id ) {
 
130
  global $woocommerce;
131
 
132
  $order = wc_get_order( $order_id );
153
  'order_id' => $order_id,
154
  'vendor_id' => $vendor_id,
155
  'product_id' => $product_id,
156
+ 'total_due' => ! empty( $insert_due[ $product_id ][ 'total_due' ] ) ? ( $detail[ 'commission' ] + $insert_due[ $product_id ][ 'total_due' ] ) : $detail[ 'commission' ],
157
+ 'total_shipping' => ! empty( $insert_due[ $product_id ][ 'total_shipping' ] ) ? ( $detail[ 'shipping' ] + $insert_due[ $product_id ][ 'total_shipping' ] ) : $detail[ 'shipping' ],
158
+ 'tax' => ! empty( $insert_due[ $product_id ][ 'tax' ] ) ? ( $detail[ 'tax' ] + $insert_due[ $product_id ][ 'tax' ] ) : $detail[ 'tax' ],
159
+ 'qty' => ! empty( $insert_due[ $product_id ][ 'qty' ] ) ? ( $detail[ 'qty' ] + $insert_due[ $product_id ][ 'qty' ] ) : $detail[ 'qty' ],
160
  'time' => date( 'Y-m-d H:i:s', strtotime( $order_date ) ),
161
  );
162
  }
163
 
164
+ if ( ! empty( $insert_due ) ) {
165
  WCV_Commission::insert_new_commission( array_values( $insert_due ) );
166
  }
167
  }
176
  *
177
  * @return array
178
  */
179
+ public static function sum_total_due_for_order( $order_id, $status = 'due' ) {
 
180
  global $wpdb;
181
 
182
  $table_name = $wpdb->prefix . "pv_commission";
190
  foreach ( $results as $commission ) {
191
  $commission_ids[ ] = $commission->id;
192
 
193
+ $pay[ $commission->vendor_id ] = ! empty( $pay[ $commission->vendor_id ] )
194
  ? ( $pay[ $commission->vendor_id ] + ( $commission->total_due + $commission->total_shipping + $commission->tax ) )
195
  : ( $commission->total_due + $commission->total_shipping + $commission->tax );
196
  }
209
  *
210
  * @return object
211
  */
212
+ public static function get_all_due() {
 
213
  global $wpdb;
214
 
215
  $table_name = $wpdb->prefix . "pv_commission";
230
  *
231
  * @return int
232
  */
233
+ public static function count_commission_by_order( $order_id ) {
 
234
  global $wpdb;
235
  $table_name = $wpdb->prefix . "pv_commission";
236
 
258
 
259
  global $wpdb;
260
 
261
+ $table_name = $wpdb->prefix . "pv_commission";
262
 
263
+ $order_id = $order[ 'order_id' ];
264
+ $vendor_id = $order[ 'vendor_id' ];
265
+ $product_id = $order[ 'product_id' ];
266
 
267
  $query = "SELECT count(order_id) AS order_count
268
  FROM {$table_name}
286
  *
287
  * @return float
288
  */
289
+ public static function get_commission_rate( $product_id ) {
 
290
 
291
  $commission = 0;
292
 
299
  $vendor_commission = WCV_Vendors::get_default_commission( $vendor_id );
300
  $default_commission = get_option( 'wcvendors_vendor_commission_rate' );
301
 
302
+ if ( '' != $product_commission && false !== $product_commission ) {
303
  $commission = $product_commission;
304
  }
305
 
306
+ else if ( '' != $vendor_commission && false !== $vendor_commission ) {
307
  $commission = $vendor_commission;
308
  }
309
 
310
+ else if ( '' != $default_commission && false !== $default_commission ) {
311
  $commission = $default_commission;
312
  }
313
 
323
  *
324
  * @return float
325
  */
326
+ public static function calculate_commission( $product_price, $product_id, $order, $qty ) {
 
327
  $commission_rate = WCV_Commission::get_commission_rate( $product_id );
328
  $commission = $product_price * ( $commission_rate / 100 );
329
  $commission = round( $commission, 2 );
341
  *
342
  * @return unknown
343
  */
344
+ public static function insert_new_commission( $orders = array() ) {
 
345
  global $wpdb;
346
 
347
  if ( empty( $orders ) ) return false;
355
  }
356
 
357
  foreach ( $orders as $key => $order ) {
358
+
359
  $where = array(
360
  'order_id' => $order[ 'order_id' ],
361
  'product_id' => $order[ 'product_id' ],
365
  // Is the commission already paid?
366
  $count = WCV_Commission::check_commission_status( $order, 'paid' );
367
 
368
+ if ( 0 == $count ) {
369
+ $format = array( "%d", "%d", "%d", "%f", "%d", "%f", "%f", "%s", "%s" );
370
+ $update = $wpdb->update( $table, $order, $where, $format );
371
+ if ( !$update ) $insert = $wpdb->insert( $table, $order, $format );
372
  }
373
 
374
  }
388
  *
389
  * @return bool.
390
  */
391
+ public static function set_order_commission_paid( $order_id, $column_ids = false ) {
 
392
  global $wpdb;
393
 
394
  $table_name = $wpdb->prefix . "pv_commission";
413
  *
414
  * @return bool.
415
  */
416
+ public static function set_vendor_commission_paid( $vendors ) {
 
417
  global $wpdb;
418
 
419
  $table_name = $wpdb->prefix . "pv_commission";
440
  *
441
  * @return bool.
442
  */
443
+ public static function set_vendor_product_commission_paid( $vendor_id, $product_id, $order_id ) {
 
444
  global $wpdb;
445
 
446
  $table_name = $wpdb->prefix . "pv_commission";
461
  *
462
  * @return bool.
463
  */
464
+ public function commissions_table_sync( $order_id ) {
465
 
466
  global $wpdb;
467
 
468
  $table_name = $wpdb->prefix . "pv_commission";
469
+ $query = "UPDATE `{$table_name}` SET `status` = 'reversed' WHERE `order_id` = %d";
470
+ $results = $wpdb->query( $wpdb->prepare( $query, $order_id ) );
471
 
472
  } // commissions_table_sync()
473
 
481
  * @param string $status the status to look for
482
  * @return object $totals as an object
483
  */
484
+ public static function commissions_now( $vendor_id, $status = 'due', $inc_shipping = false, $inc_tax = false ) {
485
 
486
  global $wpdb;
487
 
518
  * @param int $product_id the product id to search for
519
  * @param int $vendor_id the vendor id to search for
520
  */
521
+ public static function get_commission_due( $order_id, $product_id, $vendor_id ) {
522
 
523
  global $wpdb;
524
 
546
  * @since 2.0.0
547
  * @access public
548
  */
549
+ public static function get_totals( $status = 'due' ) {
550
 
551
  $total_due = 0;
552
 
569
  * @since 2.0.3
570
  * @access public
571
  */
572
+ public static function get_sum_vendor_totals() {
573
 
574
  global $wpdb;
575
 
576
+ $due = array();
577
+ $paid = array();
578
+ $reversed = array();
579
 
580
  $table_name = $wpdb->prefix . "pv_commission";
581
  $query = "SELECT `id`, `total_due`, `total_shipping`, `tax`, `vendor_id`, `status`
588
  $status_sql = '';
589
  $time_sql = '';
590
 
591
+ if ( ! empty( $_GET[ 'm' ] ) ) {
592
 
593
  $year = substr( $_GET[ 'm' ], 0, 4 );
594
  $month = substr( $_GET[ 'm' ], 4, 2 );
601
  $query .= $time_sql;
602
  }
603
 
604
+ if ( ! empty( $_GET[ 'com_status' ] ) ) {
605
 
606
  if ( $time_sql == '' ) {
607
  $status_sql = "
616
  $query .= $status_sql;
617
  }
618
 
619
+ if ( ! empty( $_GET[ 'vendor_id' ] ) ) {
620
 
621
+ if ( '' == $time_sql && '' == $status_sql ) {
622
  $vendor_sql = "
623
  WHERE vendor_id = '$vendor_id'
624
  ";
classes/class-cron.php CHANGED
@@ -12,11 +12,10 @@ class WCV_Cron {
12
  /**
13
  * Constructor
14
  */
15
- function __construct()
16
- {
17
- add_filter( 'cron_schedules', array( 'WCV_Cron', 'custom_cron_intervals' ) );
18
- add_action( 'wcvendors_settings_save_payments', array( 'WCV_Cron', 'check_schedule' ) );
19
- add_filter( 'wcvendors_admin_settings_sanitize_option_wcvendors_payments_paypal_schedule', array( 'WCV_Cron', 'check_schedule_now') );
20
  // add_filter( WC_Vendors::$id . '_options_on_update', array( 'WCV_Cron', 'check_schedule_now' ) );
21
 
22
 
@@ -32,7 +31,7 @@ class WCV_Cron {
32
  public static function check_schedule() {
33
 
34
  $old_interval = wp_get_schedule( 'pv_schedule_mass_payments' );
35
- $new_interval = wc_string_to_bool( get_option( 'wcvendors_payments_paypal_schedule', '') );
36
  $instapay = wc_string_to_bool( get_option( 'wcvendors_payments_paypal_instantpay_enable', 'no' ) );
37
 
38
  /**
@@ -40,12 +39,12 @@ class WCV_Cron {
40
  * 2. Instapay is turned off
41
  * 3. Manual was not selected
42
  */
43
- if ( ( $old_interval != $new_interval ) && !$instapay && $new_interval != 'manual' ) {
44
  WCV_Cron::remove_cron_schedule();
45
  WCV_Cron::schedule_cron( $new_interval );
46
  }
47
 
48
- if ( $new_interval == 'manual' || $instapay ) {
49
  WCV_Cron::remove_cron_schedule( );
50
  }
51
 
@@ -63,7 +62,7 @@ class WCV_Cron {
63
 
64
  $old_schedule = get_option( 'wcvendors_payments_paypal_schedule' );
65
 
66
- if ( $new_schedule == 'now' ) {
67
  $return = WCV_Cron::pay_now();
68
  $options[ 'schedule' ] = $old_schedule;
69
  WCV_Cron::schedule_cron( $old_schedule );
@@ -79,12 +78,11 @@ class WCV_Cron {
79
  *
80
  * @return array
81
  */
82
- public static function pay_now()
83
- {
84
  $mass_pay = new WCV_Mass_Pay;
85
  $mass_pay = $mass_pay->do_payments();
86
 
87
- $message = !empty( $mass_pay[ 'total' ] )
88
  ? $mass_pay[ 'msg' ] . '<br/>' . sprintf( __( 'Payment total: %s', 'wc-vendors' ), wc_price( $mass_pay[ 'total' ] ) )
89
  : $mass_pay[ 'msg' ];
90
 
@@ -100,8 +98,7 @@ class WCV_Cron {
100
  *
101
  * @return bool
102
  */
103
- public static function remove_cron_schedule()
104
- {
105
  $timestamp = wp_next_scheduled( 'pv_schedule_mass_payments' );
106
 
107
  return wp_unschedule_event( $timestamp, 'pv_schedule_mass_payments' );
@@ -115,13 +112,12 @@ class WCV_Cron {
115
  *
116
  * @return bool
117
  */
118
- public static function schedule_cron( $interval )
119
- {
120
  // Scheduled event
121
  add_action( 'pv_schedule_mass_payments', array( 'WCV_Cron', 'pay_now' ) );
122
 
123
  // Schedule the event
124
- if ( !wp_next_scheduled( 'pv_schedule_mass_payments' ) ) {
125
  wp_schedule_event( time(), $interval, 'pv_schedule_mass_payments' );
126
 
127
  return true;
@@ -142,8 +138,7 @@ class WCV_Cron {
142
  *
143
  * @return array
144
  */
145
- public static function custom_cron_intervals( $schedules )
146
- {
147
 
148
  $schedules[ 'daily' ] = array(
149
  'interval' => 86400,
12
  /**
13
  * Constructor
14
  */
15
+ function __construct() {
16
+ add_filter( 'cron_schedules', array( 'WCV_Cron', 'custom_cron_intervals' ) );
17
+ add_action( 'wcvendors_settings_save_payments', array( 'WCV_Cron', 'check_schedule' ) );
18
+ add_filter( 'wcvendors_admin_settings_sanitize_option_wcvendors_payments_paypal_schedule', array( 'WCV_Cron', 'check_schedule_now' ) );
 
19
  // add_filter( WC_Vendors::$id . '_options_on_update', array( 'WCV_Cron', 'check_schedule_now' ) );
20
 
21
 
31
  public static function check_schedule() {
32
 
33
  $old_interval = wp_get_schedule( 'pv_schedule_mass_payments' );
34
+ $new_interval = wc_string_to_bool( get_option( 'wcvendors_payments_paypal_schedule', '' ) );
35
  $instapay = wc_string_to_bool( get_option( 'wcvendors_payments_paypal_instantpay_enable', 'no' ) );
36
 
37
  /**
39
  * 2. Instapay is turned off
40
  * 3. Manual was not selected
41
  */
42
+ if ( ( $old_interval != $new_interval ) && ! $instapay && 'manual' != $new_interval ) {
43
  WCV_Cron::remove_cron_schedule();
44
  WCV_Cron::schedule_cron( $new_interval );
45
  }
46
 
47
+ if ( 'manual' == $new_interval || $instapay ) {
48
  WCV_Cron::remove_cron_schedule( );
49
  }
50
 
62
 
63
  $old_schedule = get_option( 'wcvendors_payments_paypal_schedule' );
64
 
65
+ if ( 'now' == $new_schedule ) {
66
  $return = WCV_Cron::pay_now();
67
  $options[ 'schedule' ] = $old_schedule;
68
  WCV_Cron::schedule_cron( $old_schedule );
78
  *
79
  * @return array
80
  */
81
+ public static function pay_now() {
 
82
  $mass_pay = new WCV_Mass_Pay;
83
  $mass_pay = $mass_pay->do_payments();
84
 
85
+ $message = ! empty( $mass_pay[ 'total' ] )
86
  ? $mass_pay[ 'msg' ] . '<br/>' . sprintf( __( 'Payment total: %s', 'wc-vendors' ), wc_price( $mass_pay[ 'total' ] ) )
87
  : $mass_pay[ 'msg' ];
88
 
98
  *
99
  * @return bool
100
  */
101
+ public static function remove_cron_schedule() {
 
102
  $timestamp = wp_next_scheduled( 'pv_schedule_mass_payments' );
103
 
104
  return wp_unschedule_event( $timestamp, 'pv_schedule_mass_payments' );
112
  *
113
  * @return bool
114
  */
115
+ public static function schedule_cron( $interval ) {
 
116
  // Scheduled event
117
  add_action( 'pv_schedule_mass_payments', array( 'WCV_Cron', 'pay_now' ) );
118
 
119
  // Schedule the event
120
+ if ( ! wp_next_scheduled( 'pv_schedule_mass_payments' ) ) {
121
  wp_schedule_event( time(), $interval, 'pv_schedule_mass_payments' );
122
 
123
  return true;
138
  *
139
  * @return array
140
  */
141
+ public static function custom_cron_intervals( $schedules ) {
 
142
 
143
  $schedules[ 'daily' ] = array(
144
  'interval' => 86400,
classes/class-install.php CHANGED
@@ -40,13 +40,13 @@ class WCVendors_Install {
40
  */
41
  public static function init() {
42
 
43
- add_action( 'init', array( __CLASS__, 'check_version' ) );
44
- add_action( 'admin_init', array( __CLASS__, 'check_pro_version' ) );
45
- add_action( 'init', array( __CLASS__, 'init_background_updater' ), 5 );
46
- add_action( 'admin_init', array( __CLASS__, 'install_actions' ) );
47
- add_filter( 'plugin_row_meta', array( __CLASS__, 'plugin_row_meta' ), 10, 2 );
48
- add_filter( 'plugin_action_links_' . wcv_plugin_base, array( __CLASS__, 'plugin_action_links' ) );
49
- add_action( 'wcvendors_update_options_display', array( __CLASS__, 'maybe_flush_rewrite_rules' ) );
50
 
51
  } // init()
52
 
@@ -70,11 +70,11 @@ class WCVendors_Install {
70
  */
71
  public static function check_pro_version() {
72
 
73
- if ( class_exists( 'WCVendors_Pro' ) ){
74
 
75
- if ( version_compare( WCV_PRO_VERSION, '1.5.0', '<' ) ){
76
 
77
- if ( is_plugin_active( 'wc-vendors-pro/wcvendors-pro.php' ) ){
78
  $notice = sprintf( __( 'WC Vendors Pro %s or below detected. WC Vendors Pro 1.5.0 is required for WC Vendors 2.0.0 and above. WC Vendors Pro has been deactivated.' ), WCV_PRO_VERSION );
79
  WCVendors_Admin_Notices::add_custom_notice( 'pro_update', $notice );
80
  deactivate_plugins( 'wc-vendors-pro/wcvendors-pro.php' );
@@ -155,9 +155,9 @@ class WCVendors_Install {
155
  );
156
 
157
  remove_role( 'vendor' );
158
- $can_add = wc_string_to_bool( get_option( 'wcvendors_capability_products_enabled', 'yes' ) );
159
- $can_edit = wc_string_to_bool( get_option( 'wcvendors_capability_products_edit', 'yes' ) );
160
- $can_submit_live = wc_string_to_bool( get_option( 'wcvendors_capability_products_live', 'yes' ) );
161
  add_role(
162
  'vendor',
163
  sprintf( __( '%s', 'wc-vendors'), wcv_get_vendor_name() ) ,
@@ -302,7 +302,7 @@ class WCVendors_Install {
302
  $version_one = get_option( 'wc_prd_vendor_options', null );
303
  $updates = self::get_db_update_callbacks();
304
 
305
- if ( ! is_null( $version_one ) && is_null( $current_db_version ) ){
306
  return true;
307
  } else {
308
  return ! is_null( $current_db_version ) && version_compare( $current_db_version, max( array_keys( $updates ) ), '<' );
40
  */
41
  public static function init() {
42
 
43
+ add_action( 'init', array( __CLASS__, 'check_version' ) );
44
+ add_action( 'admin_init', array( __CLASS__, 'check_pro_version' ) );
45
+ add_action( 'init', array( __CLASS__, 'init_background_updater' ), 5 );
46
+ add_action( 'admin_init', array( __CLASS__, 'install_actions' ) );
47
+ add_filter( 'plugin_row_meta', array( __CLASS__, 'plugin_row_meta' ), 10, 2 );
48
+ add_filter( 'plugin_action_links_' . wcv_plugin_base, array( __CLASS__, 'plugin_action_links' ) );
49
+ add_action( 'wcvendors_update_options_display', array( __CLASS__, 'maybe_flush_rewrite_rules' ) );
50
 
51
  } // init()
52
 
70
  */
71
  public static function check_pro_version() {
72
 
73
+ if ( class_exists( 'WCVendors_Pro' ) ) {
74
 
75
+ if ( version_compare( WCV_PRO_VERSION, '1.5.0', '<' ) ) {
76
 
77
+ if ( is_plugin_active( 'wc-vendors-pro/wcvendors-pro.php' ) ) {
78
  $notice = sprintf( __( 'WC Vendors Pro %s or below detected. WC Vendors Pro 1.5.0 is required for WC Vendors 2.0.0 and above. WC Vendors Pro has been deactivated.' ), WCV_PRO_VERSION );
79
  WCVendors_Admin_Notices::add_custom_notice( 'pro_update', $notice );
80
  deactivate_plugins( 'wc-vendors-pro/wcvendors-pro.php' );
155
  );
156
 
157
  remove_role( 'vendor' );
158
+ $can_add = wc_string_to_bool( get_option( 'wcvendors_capability_products_enabled', 'yes' ) );
159
+ $can_edit = wc_string_to_bool( get_option( 'wcvendors_capability_products_edit', 'yes' ) );
160
+ $can_submit_live = wc_string_to_bool( get_option( 'wcvendors_capability_products_live', 'yes' ) );
161
  add_role(
162
  'vendor',
163
  sprintf( __( '%s', 'wc-vendors'), wcv_get_vendor_name() ) ,
302
  $version_one = get_option( 'wc_prd_vendor_options', null );
303
  $updates = self::get_db_update_callbacks();
304
 
305
+ if ( ! is_null( $version_one ) && is_null( $current_db_version ) ) {
306
  return true;
307
  } else {
308
  return ! is_null( $current_db_version ) && version_compare( $current_db_version, max( array_keys( $updates ) ), '<' );
classes/class-queries.php CHANGED
@@ -1,7 +1,6 @@
1
  <?php
2
 
3
- class WCV_Queries
4
- {
5
 
6
  /**
7
  *
@@ -11,18 +10,16 @@ class WCV_Queries
11
  * @return unknown
12
  */
13
 
14
-
15
- public static function get_commission_products( $user_id )
16
- {
17
  global $wpdb;
18
 
19
  $dates = WCV_Queries::orders_within_range();
20
  $vendor_products = array();
21
- $sql = '';
22
 
23
  $sql .= "SELECT product_id FROM {$wpdb->prefix}pv_commission WHERE vendor_id = {$user_id} ";
24
 
25
- if ( !empty( $dates ) ) {
26
  $sql .= "AND time >= '" . $dates[ 'after' ] . "' AND time <= '" . $dates[ 'before' ] . "'";
27
  }
28
 
@@ -34,14 +31,14 @@ class WCV_Queries
34
  $ids[ ] = $value->product_id;
35
  }
36
 
37
- if ( !empty( $ids ) ) {
38
  $vendor_products = get_posts( array(
39
- 'numberposts' => -1,
40
- 'orderby' => 'post_date',
41
- 'post_type' => array( 'product', 'product_variation' ),
42
- 'order' => 'DESC',
43
- 'include' => $ids
44
- )
45
  );
46
  }
47
 
@@ -57,8 +54,7 @@ class WCV_Queries
57
  */
58
 
59
 
60
- public static function get_products_for_order( $order_id )
61
- {
62
  global $wpdb;
63
 
64
  $vendor_products = array();
@@ -87,8 +83,7 @@ class WCV_Queries
87
  *
88
  * @return object
89
  */
90
- public static function get_orders_for_products( array $product_ids, array $args = array() )
91
- {
92
  global $wpdb;
93
 
94
  if ( empty( $product_ids ) ) return false;
@@ -112,7 +107,7 @@ class WCV_Queries
112
  AND status != 'reversed'
113
  ";
114
 
115
- if ( !empty( $args[ 'vendor_id' ] ) ) {
116
  $sql .= "
117
  AND vendor_id = {$args['vendor_id']}
118
  ";
@@ -137,8 +132,7 @@ class WCV_Queries
137
  *
138
  * @return object
139
  */
140
- public static function sum_orders_for_products( array $product_ids, array $args = array() )
141
- {
142
  global $wpdb;
143
 
144
  $dates = WCV_Queries::orders_within_range();
@@ -150,13 +144,13 @@ class WCV_Queries
150
 
151
  foreach ( $product_ids as $id ) {
152
  $posts = get_posts( array(
153
- 'numberposts' => -1,
154
- 'post_type' => 'product_variation',
155
- 'post_parent' => $id,
156
  )
157
  );
158
 
159
- if ( !empty( $posts ) ) {
160
  foreach ( $posts as $post ) {
161
  $product_ids[ ] = $post->ID;
162
  }
@@ -179,7 +173,7 @@ class WCV_Queries
179
  AND status != 'reversed'
180
  ";
181
 
182
- if ( !empty( $args[ 'vendor_id' ] ) ) {
183
  $sql .= "
184
  AND vendor_id = {$args['vendor_id']}
185
  ";
@@ -204,8 +198,7 @@ class WCV_Queries
204
  *
205
  * @return object
206
  */
207
- public static function sum_for_orders( array $order_ids, array $args = array(), $date_range = true )
208
- {
209
  global $wpdb;
210
 
211
  $dates = ( $date_range ) ? WCV_Queries::orders_within_range() : array();
@@ -228,14 +221,14 @@ class WCV_Queries
228
  AND status != 'reversed'
229
  ";
230
 
231
- if ( !empty ( $dates ) ){
232
  $sql .= "
233
  AND time >= '" . $dates[ 'after' ] . "'
234
  AND time <= '" . $dates[ 'before' ] . "'
235
  ";
236
  }
237
 
238
- if ( !empty( $args[ 'vendor_id' ] ) ) {
239
  $sql .= "
240
  AND vendor_id = {$args['vendor_id']}
241
  ";
@@ -257,19 +250,18 @@ class WCV_Queries
257
  *
258
  * @return array
259
  */
260
- public static function orders_within_range()
261
- {
262
  global $start_date, $end_date;
263
 
264
- $start_date = !empty( $_SESSION[ 'PV_Session' ][ 'start_date' ] ) ? $_SESSION[ 'PV_Session' ][ 'start_date' ] : strtotime( date( 'Ymd', strtotime( date( 'Ym', current_time( 'timestamp' ) ) . '01' ) ) );
265
- $end_date = !empty( $_SESSION[ 'PV_Session' ][ 'end_date' ] ) ? $_SESSION[ 'PV_Session' ][ 'end_date' ] : strtotime( date( 'Ymd', current_time( 'timestamp' ) ) );
266
 
267
- if ( !empty( $_POST[ 'start_date' ] ) ) {
268
  $start_date = strtotime( $_POST[ 'start_date' ] );
269
  $_SESSION[ 'PV_Session' ][ 'start_date' ] = $start_date;
270
  }
271
 
272
- if ( !empty( $_POST[ 'end_date' ] ) ) {
273
  $end_date = strtotime( $_POST[ 'end_date' ] );
274
  $_SESSION[ 'PV_Session' ][ 'end_date' ] = $end_date;
275
  }
1
  <?php
2
 
3
+ class WCV_Queries {
 
4
 
5
  /**
6
  *
10
  * @return unknown
11
  */
12
 
13
+ public static function get_commission_products( $user_id ) {
 
 
14
  global $wpdb;
15
 
16
  $dates = WCV_Queries::orders_within_range();
17
  $vendor_products = array();
18
+ $sql = '';
19
 
20
  $sql .= "SELECT product_id FROM {$wpdb->prefix}pv_commission WHERE vendor_id = {$user_id} ";
21
 
22
+ if ( ! empty( $dates ) ) {
23
  $sql .= "AND time >= '" . $dates[ 'after' ] . "' AND time <= '" . $dates[ 'before' ] . "'";
24
  }
25
 
31
  $ids[ ] = $value->product_id;
32
  }
33
 
34
+ if ( ! empty( $ids ) ) {
35
  $vendor_products = get_posts( array(
36
+ 'numberposts' => -1,
37
+ 'orderby' => 'post_date',
38
+ 'post_type' => array( 'product', 'product_variation' ),
39
+ 'order' => 'DESC',
40
+ 'include' => $ids
41
+ )
42
  );
43
  }
44
 
54
  */
55
 
56
 
57
+ public static function get_products_for_order( $order_id ) {
 
58
  global $wpdb;
59
 
60
  $vendor_products = array();
83
  *
84
  * @return object
85
  */
86
+ public static function get_orders_for_products( array $product_ids, array $args = array() ) {
 
87
  global $wpdb;
88
 
89
  if ( empty( $product_ids ) ) return false;
107
  AND status != 'reversed'
108
  ";
109
 
110
+ if ( ! empty( $args[ 'vendor_id' ] ) ) {
111
  $sql .= "
112
  AND vendor_id = {$args['vendor_id']}
113
  ";
132
  *
133
  * @return object
134
  */
135
+ public static function sum_orders_for_products( array $product_ids, array $args = array() ) {
 
136
  global $wpdb;
137
 
138
  $dates = WCV_Queries::orders_within_range();
144
 
145
  foreach ( $product_ids as $id ) {
146
  $posts = get_posts( array(
147
+ 'numberposts' => -1,
148
+ 'post_type' => 'product_variation',
149
+ 'post_parent' => $id,
150
  )
151
  );
152
 
153
+ if ( ! empty( $posts ) ) {
154
  foreach ( $posts as $post ) {
155
  $product_ids[ ] = $post->ID;
156
  }
173
  AND status != 'reversed'
174
  ";
175
 
176
+ if ( ! empty( $args[ 'vendor_id' ] ) ) {
177
  $sql .= "
178
  AND vendor_id = {$args['vendor_id']}
179
  ";
198
  *
199
  * @return object
200
  */
201
+ public static function sum_for_orders( array $order_ids, array $args = array(), $date_range = true ) {
 
202
  global $wpdb;
203
 
204
  $dates = ( $date_range ) ? WCV_Queries::orders_within_range() : array();
221
  AND status != 'reversed'
222
  ";
223
 
224
+ if ( ! empty ( $dates ) ) {
225
  $sql .= "
226
  AND time >= '" . $dates[ 'after' ] . "'
227
  AND time <= '" . $dates[ 'before' ] . "'
228
  ";
229
  }
230
 
231
+ if ( ! empty( $args[ 'vendor_id' ] ) ) {
232
  $sql .= "
233
  AND vendor_id = {$args['vendor_id']}
234
  ";
250
  *
251
  * @return array
252
  */
253
+ public static function orders_within_range() {
 
254
  global $start_date, $end_date;
255
 
256
+ $start_date = ! empty( $_SESSION[ 'PV_Session' ][ 'start_date' ] ) ? $_SESSION[ 'PV_Session' ][ 'start_date' ] : strtotime( date( 'Ymd', strtotime( date( 'Ym', current_time( 'timestamp' ) ) . '01' ) ) );
257
+ $end_date = ! empty( $_SESSION[ 'PV_Session' ][ 'end_date' ] ) ? $_SESSION[ 'PV_Session' ][ 'end_date' ] : strtotime( date( 'Ymd', current_time( 'timestamp' ) ) );
258
 
259
+ if ( ! empty( $_POST[ 'start_date' ] ) ) {
260
  $start_date = strtotime( $_POST[ 'start_date' ] );
261
  $_SESSION[ 'PV_Session' ][ 'start_date' ] = $start_date;
262
  }
263
 
264
+ if ( ! empty( $_POST[ 'end_date' ] ) ) {
265
  $end_date = strtotime( $_POST[ 'end_date' ] );
266
  $_SESSION[ 'PV_Session' ][ 'end_date' ] = $end_date;
267
  }
classes/class-shipping.php CHANGED
@@ -8,8 +8,7 @@
8
  */
9
 
10
 
11
- class WCV_Shipping
12
- {
13
  public static $trs2_shipping_rates;
14
  public static $trs2_shipping_calc_type;
15
  public static $pps_shipping_costs = array();
@@ -18,8 +17,7 @@ class WCV_Shipping
18
  /**
19
  * Constructor
20
  */
21
- function __construct()
22
- {
23
  // Table Rate Shipping 2 by WooThemes
24
  if ( function_exists( 'woocommerce_get_shipping_method_table_rate' ) ) {
25
  // add_action( 'wp', array( $this, 'trs2_clear_transients' ) );
@@ -37,42 +35,42 @@ class WCV_Shipping
37
  *
38
  * @return unknown
39
  */
40
- public static function get_shipping_due( $order_id, $order_item, $author, $product_id = 0 ){
41
 
42
- $shipping_costs = array( 'amount' => 0, 'tax' => 0);
43
- $shipping_due = 0;
44
- $method = '';
45
- $_product = wc_get_product( $order_item[ 'product_id' ] );
46
- $order = wc_get_order( $order_id );
47
- $tax_class = $order_item->get_tax_class();
48
 
49
- if ( $_product && $_product->needs_shipping() && !$_product->is_downloadable() ) {
50
 
51
  // Get Shipping methods.
52
  $shipping_methods = $order->get_shipping_methods();
53
 
54
  // TODO: Currently this only allows one shipping method per order, this definitely needs changing
55
- foreach ($shipping_methods as $shipping_method) {
56
- $method = $shipping_method['method_id'];
57
- break;
58
  }
59
 
60
  // Per Product Shipping
61
- if ( ( class_exists('WC_Shipping_Per_Product_Init') || function_exists( 'woocommerce_per_product_shipping' ) ) && $method == 'per_product' ) {
62
  $shipping_costs = WCV_Shipping::pps_get_due( $order_id, $order_item );
63
 
64
  // Local Delivery
65
- } else if ( $method == 'local_delivery' ) {
66
  $local_delivery = get_option( 'woocommerce_local_delivery_settings' );
67
 
68
- if ( $local_delivery[ 'type' ] == 'product' ) {
69
 
70
- $shipping_costs['amount'] = $order_item[ 'qty' ] * $local_delivery[ 'fee' ];
71
- $shipping_costs['tax'] = WCV_Shipping::calculate_shipping_tax( $shipping_costs['amount'], $order );
72
  }
73
 
74
  // International Delivery
75
- } else if ( $method == 'international_delivery' ) {
76
 
77
  $int_delivery = get_option( 'woocommerce_international_delivery_settings' );
78
 
@@ -118,7 +116,7 @@ class WCV_Shipping
118
  $package[ 'destination' ][ 'postcode' ] = $shipping_postcode;
119
  $product_id = !empty( $product['variation_id'] ) ? $product['variation_id'] : $product['product_id'];
120
 
121
- if ( !empty( $product['variation_id'] ) ) {
122
  $rule = woocommerce_per_product_shipping_get_matching_rule( $product['variation_id'], $package );
123
  }
124
 
@@ -126,10 +124,10 @@ class WCV_Shipping
126
  $rule = woocommerce_per_product_shipping_get_matching_rule( $product['product_id'], $package );
127
  }
128
 
129
- if ( !empty( $rule ) ) {
130
  $item_shipping_cost += $rule->rule_item_cost * $product[ 'qty' ];
131
 
132
- if ( !empty(self::$pps_shipping_costs[$order_id]) && ! in_array( $rule->rule_id, self::$pps_shipping_costs[$order_id] ) ) {
133
  $item_shipping_cost += $rule->rule_cost;
134
  } else if ( empty( self::$pps_shipping_costs[$order_id] ) ) {
135
  $item_shipping_cost += $rule->rule_cost;
@@ -139,7 +137,7 @@ class WCV_Shipping
139
  }
140
 
141
  $shipping_costs['amount'] = $item_shipping_cost;
142
- $shipping_costs['tax'] = ('taxable' === $taxable ) ? WCV_Shipping::calculate_shipping_tax( $item_shipping_cost, $order, $tax_class ) : 0;
143
 
144
  // return $item_shipping_cost;
145
  return $shipping_costs;
@@ -149,20 +147,35 @@ class WCV_Shipping
149
  /**
150
  * Calculate the shipping tax due for the product
151
  *
 
152
  */
153
- public static function calculate_shipping_tax( $shipping_amount, $order, $tax_class = '' ) {
154
 
155
  $tax_based_on = get_option( 'woocommerce_tax_based_on' );
156
  $wc_tax_enabled = get_option( 'woocommerce_calc_taxes' );
157
 
158
- $shipping_city = $order->get_shipping_city();
159
- $shipping_country = $order->get_shipping_country();
160
- $shipping_state = $order->get_shipping_state();
161
- $shipping_postcode = $order->get_shipping_postcode();
162
- $billing_city = $order->get_billing_city();
163
- $billing_country = $order->get_billing_country();
164
- $billing_state = $order->get_billing_state();
165
- $billing_postcode = $order->get_billing_postcode();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
 
167
  $woocommerce_shipping_tax_class = get_option( 'woocommerce_shipping_tax_class' );
168
  $tax_class = ( 'inherit' === $woocommerce_shipping_tax_class ) ? $tax_class : $woocommerce_shipping_tax_class;
@@ -224,8 +237,7 @@ class WCV_Shipping
224
  /**
225
  *
226
  */
227
- public function trs2_clear_transients()
228
- {
229
  global $woocommerce;
230
 
231
  if ( is_checkout() ) {
@@ -242,18 +254,17 @@ class WCV_Shipping
242
  *
243
  * @return unknown
244
  */
245
- public function trs2_get_due( $order_id, $product_id )
246
- {
247
- if ( !function_exists( 'woocommerce_get_shipping_method_table_rate' ) ) return;
248
 
249
  $shipping_due = 0;
250
 
251
  WCV_Shipping::trs2_retrieve_shipping_data( $order_id );
252
- if ( !empty( WCV_Shipping::$trs2_shipping_calc_type ) ) {
253
 
254
- $ship_id = ( WCV_Shipping::$trs2_shipping_calc_type == 'class' ) ? get_product( $product_id )->get_shipping_class_id() : $product_id;
255
 
256
- if ( !empty( WCV_Shipping::$trs2_shipping_rates[ $ship_id ] ) ) {
257
  $shipping_due = WCV_Shipping::$trs2_shipping_rates[ $ship_id ];
258
  unset( WCV_Shipping::$trs2_shipping_rates[ $ship_id ] );
259
  }
@@ -268,11 +279,10 @@ class WCV_Shipping
268
  *
269
  * @param unknown $order_id
270
  */
271
- public function trs2_retrieve_shipping_data( $order_id )
272
- {
273
  global $woocommerce;
274
 
275
- if ( !empty( WCV_Shipping::$trs2_shipping_rates ) ) return;
276
 
277
  WCV_Shipping::$trs2_shipping_rates = array_filter( (array) get_post_meta( $order_id, '_wcvendors_trs2_shipping_rates', true ) );
278
  WCV_Shipping::$trs2_shipping_calc_type = get_post_meta( $order_id, '_wcvendors_trs2_shipping_calc_type', true );
@@ -286,8 +296,7 @@ class WCV_Shipping
286
  * @param unknown $rates
287
  * @param unknown $per_item
288
  */
289
- public function trs2_store_shipping_data( $type, $rates, $per_item )
290
- {
291
  global $woocommerce;
292
 
293
  $types = (array) $woocommerce->session->trs2_shipping_class_type;
@@ -308,8 +317,7 @@ class WCV_Shipping
308
  *
309
  * @return unknown
310
  */
311
- public function trs2_add_shipping_data( $order_id, $post )
312
- {
313
  global $woocommerce;
314
 
315
  if ( empty( $woocommerce->session->trs2_shipping_rates ) ) {
8
  */
9
 
10
 
11
+ class WCV_Shipping {
 
12
  public static $trs2_shipping_rates;
13
  public static $trs2_shipping_calc_type;
14
  public static $pps_shipping_costs = array();
17
  /**
18
  * Constructor
19
  */
20
+ function __construct() {
 
21
  // Table Rate Shipping 2 by WooThemes
22
  if ( function_exists( 'woocommerce_get_shipping_method_table_rate' ) ) {
23
  // add_action( 'wp', array( $this, 'trs2_clear_transients' ) );
35
  *
36
  * @return unknown
37
  */
38
+ public static function get_shipping_due( $order_id, $order_item, $author, $product_id = 0 ) {
39
 
40
+ $shipping_costs = array( 'amount' => 0, 'tax' => 0 );
41
+ $shipping_due = 0;
42
+ $method = '';
43
+ $_product = wc_get_product( $order_item[ 'product_id' ] );
44
+ $order = wc_get_order( $order_id );
45
+ $tax_class = $order_item->get_tax_class();
46
 
47
+ if ( $_product && $_product->needs_shipping() && ! $_product->is_downloadable() ) {
48
 
49
  // Get Shipping methods.
50
  $shipping_methods = $order->get_shipping_methods();
51
 
52
  // TODO: Currently this only allows one shipping method per order, this definitely needs changing
53
+ foreach ( $shipping_methods as $shipping_method ) {
54
+ $method = $shipping_method['method_id'];
55
+ break;
56
  }
57
 
58
  // Per Product Shipping
59
+ if ( ( class_exists('WC_Shipping_Per_Product_Init' ) || function_exists( 'woocommerce_per_product_shipping' ) ) && 'per_product' == $method ) {
60
  $shipping_costs = WCV_Shipping::pps_get_due( $order_id, $order_item );
61
 
62
  // Local Delivery
63
+ } else if ( 'local_delivery' == $method ) {
64
  $local_delivery = get_option( 'woocommerce_local_delivery_settings' );
65
 
66
+ if ( 'product' == $local_delivery[ 'type' ] ) {
67
 
68
+ $shipping_costs['amount'] = $order_item[ 'qty' ] * $local_delivery[ 'fee' ];
69
+ $shipping_costs['tax'] = WCV_Shipping::calculate_shipping_tax( $shipping_costs['amount'], $order );
70
  }
71
 
72
  // International Delivery
73
+ } else if ( 'international_delivery' == $method ) {
74
 
75
  $int_delivery = get_option( 'woocommerce_international_delivery_settings' );
76
 
116
  $package[ 'destination' ][ 'postcode' ] = $shipping_postcode;
117
  $product_id = !empty( $product['variation_id'] ) ? $product['variation_id'] : $product['product_id'];
118
 
119
+ if ( ! empty( $product['variation_id'] ) ) {
120
  $rule = woocommerce_per_product_shipping_get_matching_rule( $product['variation_id'], $package );
121
  }
122
 
124
  $rule = woocommerce_per_product_shipping_get_matching_rule( $product['product_id'], $package );
125
  }
126
 
127
+ if ( ! empty( $rule ) ) {
128
  $item_shipping_cost += $rule->rule_item_cost * $product[ 'qty' ];
129
 
130
+ if ( ! empty(self::$pps_shipping_costs[$order_id]) && ! in_array( $rule->rule_id, self::$pps_shipping_costs[$order_id] ) ) {
131
  $item_shipping_cost += $rule->rule_cost;
132
  } else if ( empty( self::$pps_shipping_costs[$order_id] ) ) {
133
  $item_shipping_cost += $rule->rule_cost;
137
  }
138
 
139
  $shipping_costs['amount'] = $item_shipping_cost;
140
+ $shipping_costs['tax'] = ( 'taxable' === $taxable ) ? WCV_Shipping::calculate_shipping_tax( $item_shipping_cost, $order, $tax_class ) : 0;
141
 
142
  // return $item_shipping_cost;
143
  return $shipping_costs;
147
  /**
148
  * Calculate the shipping tax due for the product
149
  *
150
+ * @version 2.1.3
151
  */
152
+ public static function calculate_shipping_tax( $shipping_amount, $order = '', $tax_class = '' ) {
153
 
154
  $tax_based_on = get_option( 'woocommerce_tax_based_on' );
155
  $wc_tax_enabled = get_option( 'woocommerce_calc_taxes' );
156
 
157
+ if ( '' == $order ) {
158
+ $location = WC_Geolocation::geolocate_ip();
159
+
160
+ $shipping_city = '';
161
+ $shipping_country = $location[ 'country' ];
162
+ $shipping_state = $location[ 'state' ];
163
+ $shipping_postcode = '';
164
+ $billing_city = '';
165
+ $billing_country = $location[ 'country' ];
166
+ $billing_state = $location[ 'state' ];
167
+ $billing_postcode = '';
168
+ }
169
+ else{
170
+ $shipping_city = $order->get_shipping_city();
171
+ $shipping_country = $order->get_shipping_country();
172
+ $shipping_state = $order->get_shipping_state();
173
+ $shipping_postcode = $order->get_shipping_postcode();
174
+ $billing_city = $order->get_billing_city();
175
+ $billing_country = $order->get_billing_country();
176
+ $billing_state = $order->get_billing_state();
177
+ $billing_postcode = $order->get_billing_postcode();
178
+ }
179
 
180
  $woocommerce_shipping_tax_class = get_option( 'woocommerce_shipping_tax_class' );
181
  $tax_class = ( 'inherit' === $woocommerce_shipping_tax_class ) ? $tax_class : $woocommerce_shipping_tax_class;
237
  /**
238
  *
239
  */
240
+ public function trs2_clear_transients() {
 
241
  global $woocommerce;
242
 
243
  if ( is_checkout() ) {
254
  *
255
  * @return unknown
256
  */
257
+ public function trs2_get_due( $order_id, $product_id ) {
258
+ if ( ! function_exists( 'woocommerce_get_shipping_method_table_rate' ) ) return;
 
259
 
260
  $shipping_due = 0;
261
 
262
  WCV_Shipping::trs2_retrieve_shipping_data( $order_id );
263
+ if ( ! empty( WCV_Shipping::$trs2_shipping_calc_type ) ) {
264
 
265
+ $ship_id = ( 'class' == WCV_Shipping::$trs2_shipping_calc_type ) ? get_product( $product_id )->get_shipping_class_id() : $product_id;
266
 
267
+ if ( ! empty( WCV_Shipping::$trs2_shipping_rates[ $ship_id ] ) ) {
268
  $shipping_due = WCV_Shipping::$trs2_shipping_rates[ $ship_id ];
269
  unset( WCV_Shipping::$trs2_shipping_rates[ $ship_id ] );
270
  }
279
  *
280
  * @param unknown $order_id
281
  */
282
+ public function trs2_retrieve_shipping_data( $order_id ) {
 
283
  global $woocommerce;
284
 
285
+ if ( ! empty( WCV_Shipping::$trs2_shipping_rates ) ) return;
286
 
287
  WCV_Shipping::$trs2_shipping_rates = array_filter( (array) get_post_meta( $order_id, '_wcvendors_trs2_shipping_rates', true ) );
288
  WCV_Shipping::$trs2_shipping_calc_type = get_post_meta( $order_id, '_wcvendors_trs2_shipping_calc_type', true );
296
  * @param unknown $rates
297
  * @param unknown $per_item
298
  */
299
+ public function trs2_store_shipping_data( $type, $rates, $per_item ) {
 
300
  global $woocommerce;
301
 
302
  $types = (array) $woocommerce->session->trs2_shipping_class_type;
317
  *
318
  * @return unknown
319
  */
320
+ public function trs2_add_shipping_data( $order_id, $post ) {
 
321
  global $woocommerce;
322
 
323
  if ( empty( $woocommerce->session->trs2_shipping_rates ) ) {
classes/class-uninstall.php CHANGED
@@ -10,7 +10,7 @@ if ( ! defined( 'ABSPATH' ) ) {
10
  * @package WCVendors/Admin/Settings
11
  * @version 2.0.8
12
  */
13
- class WCVendors_Uninstall{
14
  /**
15
  * Check the uninstall options and delete the data
16
  *
@@ -18,23 +18,23 @@ class WCVendors_Uninstall{
18
  * @package
19
  * @since 2.0.8
20
  */
21
- public static function uninstall(){
22
- if ( get_option( 'wcvendors_uninstall_delete_all_data') == 'yes' ) {
23
  self::delete_all();
24
- }else{
25
- if ( get_option( 'wcvendors_uninstall_delete_custom_table') == 'yes' ) {
26
  self::delete_table();
27
  }
28
 
29
- if ( get_option( 'wcvendors_uninstall_delete_custom_pages') == 'yes' ) {
30
  self::delete_pages();
31
  }
32
 
33
- if ( get_option( 'wcvendors_uninstall_delete_settings_options') == 'yes' ) {
34
  self::delete_options();
35
  }
36
 
37
- if ( get_option( 'wcvendors_uninstall_delete_vendor_roles') == 'yes' ) {
38
  self::remove_roles();
39
  }
40
  }
@@ -90,7 +90,7 @@ class WCVendors_Uninstall{
90
  global $wpdb;
91
  $table_name = $wpdb->prefix . "pv_commission";
92
 
93
- $wpdb->query("DROP TABLE $table_name");
94
  }
95
 
96
  /**
10
  * @package WCVendors/Admin/Settings
11
  * @version 2.0.8
12
  */
13
+ class WCVendors_Uninstall {
14
  /**
15
  * Check the uninstall options and delete the data
16
  *
18
  * @package
19
  * @since 2.0.8
20
  */
21
+ public static function uninstall() {
22
+ if ( 'yes' == get_option( 'wcvendors_uninstall_delete_all_data') ) {
23
  self::delete_all();
24
+ } else {
25
+ if ( 'yes' == get_option( 'wcvendors_uninstall_delete_custom_table') ) {
26
  self::delete_table();
27
  }
28
 
29
+ if ( 'yes' == get_option( 'wcvendors_uninstall_delete_custom_pages') ) {
30
  self::delete_pages();
31
  }
32
 
33
+ if ( 'yes' == get_option( 'wcvendors_uninstall_delete_settings_options') ) {
34
  self::delete_options();
35
  }
36
 
37
+ if ( 'yes' == get_option( 'wcvendors_uninstall_delete_vendor_roles') ) {
38
  self::remove_roles();
39
  }
40
  }
90
  global $wpdb;
91
  $table_name = $wpdb->prefix . "pv_commission";
92
 
93
+ $wpdb->query( "DROP TABLE $table_name" );
94
  }
95
 
96
  /**
classes/class-vendors.php CHANGED
@@ -8,16 +8,14 @@
8
  */
9
 
10
 
11
- class WCV_Vendors
12
- {
13
 
14
  /**
15
  * Constructor
16
  */
17
- function __construct()
18
- {
19
  add_action( 'woocommerce_checkout_order_processed', array( __CLASS__, 'create_child_orders' ), 10, 1 );
20
- add_filter( 'init', array( $this, 'add_rewrite_rules' ), 0 );
21
  }
22
 
23
  /**
@@ -27,8 +25,7 @@ class WCV_Vendors
27
  *
28
  * @return object
29
  */
30
- public static function get_vendor_products( $vendor_id )
31
- {
32
  $args = array(
33
  'numberposts' => -1,
34
  'post_type' => 'product',
@@ -41,8 +38,7 @@ class WCV_Vendors
41
  return get_posts( $args );
42
  }
43
 
44
- public static function get_default_commission( $vendor_id )
45
- {
46
  return get_user_meta( $vendor_id, 'pv_custom_commission_rate', true );
47
  }
48
 
@@ -58,8 +54,8 @@ class WCV_Vendors
58
  */
59
  public static function get_vendors_from_order( $order, $items = false ) {
60
 
61
- $vendors = array();
62
- $vendor_items = array();
63
 
64
  if ( is_a( $order, 'WC_Order' ) ) {
65
 
@@ -103,36 +99,35 @@ class WCV_Vendors
103
  *
104
  * @return unknown
105
  */
106
- public static function get_vendor_dues_from_order( $order, $group = true )
107
- {
108
  global $woocommerce;
109
 
110
- $give_tax = 'yes' == get_option( 'wcvendors_vendor_give_taxes', 'no' ) ? true : false;
111
- $give_shipping = 'yes' == get_option( 'wcvendors_vendor_give_shipping', 'no' ) ? true : false;
112
- $receiver = array();
113
- $shipping_given = 0;
114
- $tax_given = 0;
115
 
116
  WCV_Shipping::$pps_shipping_costs = array();
117
 
118
  foreach ( $order->get_items() as $key => $order_item ) {
119
 
120
- $product_id = !empty( $order_item[ 'variation_id' ] ) ? $order_item[ 'variation_id' ] : $order_item[ 'product_id' ];
121
- $author = WCV_Vendors::get_vendor_from_product( $product_id );
122
- $give_tax_override = get_user_meta( $author, 'wcv_give_vendor_tax', true );
123
- $give_shipping_override = get_user_meta( $author, 'wcv_give_vendor_shipping', true );
124
- $is_vendor = WCV_Vendors::is_vendor( $author );
125
- $commission = $is_vendor ? WCV_Commission::calculate_commission( $order_item[ 'line_subtotal' ], $product_id, $order, $order_item[ 'qty' ] ) : 0;
126
- $tax = !empty( $order_item[ 'line_tax' ] ) ? (float) $order_item[ 'line_tax' ] : 0;
127
- $order_id = $order->get_id();
128
 
129
  // Check if shipping is enabled
130
- if ( get_option('woocommerce_calc_shipping') === 'no' ) {
131
  $shipping = 0; $shipping_tax = 0;
132
  } else {
133
  $shipping_costs = WCV_Shipping::get_shipping_due( $order_id, $order_item, $author, $product_id );
134
- $shipping = $shipping_costs['amount'];
135
- $shipping_tax = $shipping_costs['tax'];
136
  }
137
 
138
  $_product = new WC_Product( $order_item['product_id'] );
@@ -151,7 +146,7 @@ class WCV_Vendors
151
  $tax_given += $give_tax ? $total_tax : 0;
152
 
153
  $give = 0;
154
- $give += !empty( $receiver[ $author ][ 'total' ] ) ? $receiver[ $author ][ 'total' ] : 0;
155
  $give += $give_shipping ? $shipping : 0;
156
  $give += $commission;
157
  $give += $give_tax ? $total_tax : 0;
@@ -160,10 +155,10 @@ class WCV_Vendors
160
 
161
  $receiver[ $author ] = array(
162
  'vendor_id' => (int) $author,
163
- 'commission' => !empty( $receiver[ $author ][ 'commission' ] ) ? $receiver[ $author ][ 'commission' ] + $commission : $commission,
164
- 'shipping' => $give_shipping ? ( !empty( $receiver[ $author ][ 'shipping' ] ) ? $receiver[ $author ][ 'shipping' ] + $shipping : $shipping) : 0,
165
- 'tax' => $give_tax ? ( !empty( $receiver[ $author ][ 'tax' ] ) ? $receiver[ $author ][ 'tax' ] + $total_tax : $total_tax ) : 0,
166
- 'qty' => !empty( $receiver[ $author ][ 'qty' ] ) ? $receiver[ $author ][ 'qty' ] + $order_item[ 'qty' ] : $order_item[ 'qty' ],
167
  'total' => $give,
168
  );
169
 
@@ -176,7 +171,7 @@ class WCV_Vendors
176
  'shipping' => $give_shipping ? $shipping : 0,
177
  'tax' => $give_tax ? $total_tax : 0,
178
  'qty' => $order_item[ 'qty' ],
179
- 'total' => ($give_shipping ? $shipping : 0) + $commission + ( $give_tax ? $total_tax : 0 ),
180
  );
181
 
182
  }
@@ -188,9 +183,9 @@ class WCV_Vendors
188
  if ( $group ) {
189
  $receiver[ 1 ] = array(
190
  'vendor_id' => 1,
191
- 'qty' => !empty( $receiver[ 1 ][ 'qty' ] ) ? $receiver[ 1 ][ 'qty' ] + $order_item[ 'qty' ] : $order_item[ 'qty' ],
192
- 'commission' => !empty( $receiver[ 1 ][ 'commission' ] ) ? $receiver[ 1 ][ 'commission' ] + $admin_comm : $admin_comm,
193
- 'total' => !empty( $receiver[ 1 ] ) ? $receiver[ 1 ][ 'total' ] + $admin_comm : $admin_comm,
194
  );
195
  } else {
196
  $receiver[ 1 ][ $key ] = array(
@@ -207,13 +202,13 @@ class WCV_Vendors
207
  }
208
 
209
  // Add remainders on end to admin
210
- $discount = $order->get_total_discount();
211
- $shipping = round( ( $order->get_total_shipping() - $shipping_given ), 2 );
212
- $tax = round( $order->get_total_tax() - $tax_given, 2);
213
- $total = ( $tax + $shipping ) - $discount;
214
 
215
  if ( $group ) {
216
- $r_total = round( $receiver[ 1 ][ 'total' ], 2 ) ;
217
  $receiver[ 1 ][ 'commission' ] = round( $receiver[ 1 ][ 'commission' ], 2 ) - round( $discount, 2 );
218
  $receiver[ 1 ][ 'shipping' ] = $shipping;
219
  $receiver[ 1 ][ 'tax' ] = $tax;
@@ -242,10 +237,9 @@ class WCV_Vendors
242
  *
243
  * @return string
244
  */
245
- public static function get_vendor_paypal( $vendor_id )
246
- {
247
  $paypal = get_user_meta( $vendor_id, $meta_key = 'pv_paypal', true );
248
- $paypal = !empty( $paypal ) ? $paypal : get_the_author_meta( 'user_email', $vendor_id, false );
249
 
250
  return $paypal;
251
  }
@@ -259,8 +253,7 @@ class WCV_Vendors
259
  *
260
  * @return int
261
  */
262
- public static function count_due_by_vendor( $vendor_id, $order_id )
263
- {
264
  global $wpdb;
265
 
266
  $table_name = $wpdb->prefix . "pv_commission";
@@ -283,8 +276,7 @@ class WCV_Vendors
283
  *
284
  * @return int
285
  */
286
- public static function get_due_orders_by_vendor( $vendor_id )
287
- {
288
  global $wpdb;
289
 
290
  $table_name = $wpdb->prefix . "pv_commission";
@@ -306,14 +298,13 @@ class WCV_Vendors
306
  *
307
  * @return unknown
308
  */
309
- public static function get_vendor_from_product( $product_id )
310
- {
311
  // Make sure we are returning an author for products or product variations only
312
  if ( 'product' === get_post_type( $product_id ) || 'product_variation' === get_post_type( $product_id ) ) {
313
  $parent = get_post_ancestors( $product_id );
314
  if ( $parent ) $product_id = $parent[ 0 ];
315
 
316
- $post = get_post( $product_id );
317
  $author = $post ? $post->post_author : 1;
318
  $author = apply_filters( 'pv_product_author', $author, $product_id );
319
  } else {
@@ -332,16 +323,16 @@ class WCV_Vendors
332
  */
333
  public static function is_vendor( $user_id ) {
334
 
335
- $user = get_userdata( $user_id );
336
- $vendor_roles = apply_filters( 'wcvendors_vendor_roles', array( 'vendor') );
337
- $is_vendor = false;
338
 
339
  if ( is_object( $user ) && is_array( $user->roles ) ) {
340
 
341
- foreach ($vendor_roles as $role ) {
342
- if ( in_array( $role , $user->roles ) ){
343
- $is_vendor = true;
344
- break;
345
  }
346
  }
347
  }
@@ -358,19 +349,18 @@ class WCV_Vendors
358
  *
359
  * @return unknown
360
  */
361
- public static function get_vendor_id( $input )
362
- {
363
  if ( empty( $input ) ) {
364
  return false;
365
  }
366
 
367
  $users = get_users( array( 'meta_key' => 'pv_shop_slug', 'meta_value' => sanitize_title( $input ) ) );
368
 
369
- if ( !empty( $users ) && count( $users ) == 1 ) {
370
  $vendor = $users[ 0 ];
371
  } else {
372
  $int_vendor = is_numeric( $input );
373
- $vendor = !empty( $int_vendor ) ? get_userdata( $input ) : get_user_by( 'login', $input );
374
  }
375
 
376
  if ( $vendor ) {
@@ -391,13 +381,12 @@ class WCV_Vendors
391
  *
392
  * @return string
393
  */
394
- public static function get_vendor_shop_page( $vendor_id )
395
- {
396
  $vendor_id = self::get_vendor_id( $vendor_id );
397
- if ( !$vendor_id ) return;
398
 
399
  $slug = get_user_meta( $vendor_id, 'pv_shop_slug', true );
400
- $vendor = !$slug ? get_userdata( $vendor_id )->user_login : $slug;
401
 
402
  if ( get_option( 'permalink_structure' ) ) {
403
  $permalink = trailingslashit( get_option( 'wcvendors_vendor_shop_permalink' ) );
@@ -416,8 +405,7 @@ class WCV_Vendors
416
  *
417
  * @return string
418
  */
419
- public static function get_vendor_shop_name( $vendor_id )
420
- {
421
  $vendor_id = self::get_vendor_id( $vendor_id );
422
  $name = $vendor_id ? get_user_meta( $vendor_id, 'pv_shop_name', true ) : false;
423
  $shop_name = ( ! $name && $vendor = get_userdata( $vendor_id ) ) ? $vendor->user_login : $name;
@@ -433,12 +421,11 @@ class WCV_Vendors
433
  *
434
  * @return unknown
435
  */
436
- public static function is_pending( $user_id )
437
- {
438
  $user = get_userdata( $user_id );
439
 
440
  $role = !empty( $user->roles ) ? array_shift( $user->roles ) : false;
441
- $is_pending = ( $role == 'pending_vendor' );
442
 
443
  return $is_pending;
444
  }
@@ -448,17 +435,28 @@ class WCV_Vendors
448
  * @param uknown $role
449
  */
450
  public static function is_vendor_product($role) {
451
- return ($role === 'Vendor') ? true : false;
452
  }
453
 
454
- /*
455
- * Is this the vendors shop archive page ?
456
- */
 
 
 
 
457
  public static function is_vendor_page() {
 
458
 
459
  $vendor_shop = urldecode( get_query_var( 'vendor_shop' ) );
460
  $vendor_id = WCV_Vendors::get_vendor_id( $vendor_shop );
461
 
 
 
 
 
 
 
462
  return $vendor_id ? true : false;
463
 
464
  } // is_vendor_page()
@@ -466,9 +464,9 @@ class WCV_Vendors
466
  /*
467
  * Is this a vendor single product page ?
468
  */
469
- public static function is_vendor_product_page($vendor_id) {
470
 
471
- $vendor_product = WCV_Vendors::is_vendor_product( wcv_get_user_role($vendor_id) );
472
  return $vendor_product ? true : false;
473
 
474
  } // is_vendor_product_page()
@@ -476,9 +474,9 @@ class WCV_Vendors
476
  public static function get_vendor_sold_by( $vendor_id ){
477
 
478
  $vendor_display_name = get_option( 'wcvendors_display_shop_display_name' );
479
- $vendor = get_userdata( $vendor_id );
480
 
481
- switch ($vendor_display_name) {
482
  case 'display_name':
483
  $display_name = $vendor->display_name;
484
  break;
@@ -507,31 +505,31 @@ class WCV_Vendors
507
  */
508
  public static function create_child_orders ( $order_id ) {
509
 
510
- $order = wc_get_order( $order_id );
511
- $items = $order->get_items();
512
  $vendor_items = array();
513
 
514
- foreach ($items as $item_id => $item) {
515
- if ( isset($item['product_id']) && $item['product_id'] !== 0 ) {
516
  // check if product is from vendor
517
  $product_author = get_post_field( 'post_author', $item['product_id'] );
518
- if (WCV_Vendors::is_vendor( $product_author ) ) {
519
  $vendor_items[ $product_author ][ $item_id ] = array (
520
- 'item_id' => $item_id,
521
- 'qty' => $item['qty'],
522
- 'total' => $item['line_total'],
523
- 'subtotal' => $item['line_subtotal'],
524
- 'tax' => $item['line_tax'],
525
- 'subtotal_tax' => $item['line_subtotal_tax'],
526
- 'tax_data' => maybe_unserialize( $item['line_tax_data'] ),
527
- 'commission' => WCV_Commission::calculate_commission( $item['line_subtotal'], $item['product_id'], $order, $item['qty'] ),
528
  );
529
  }
530
  }
531
  }
532
 
533
- foreach ($vendor_items as $vendor_id => $items) {
534
- if (!empty($items)) {
535
  $vendor_order = WCV_Vendors::create_vendor_order( array(
536
  'order_id' => $order_id,
537
  'vendor_id' => $vendor_id,
@@ -732,7 +730,7 @@ class WCV_Vendors
732
  $permalink = untrailingslashit( get_option( 'wcvendors_vendor_shop_permalink' ) );
733
 
734
  // Remove beginning slash
735
- if ( substr( $permalink, 0, 1 ) == '/' ) {
736
  $permalink = substr( $permalink, 1, strlen( $permalink ) );
737
  }
738
 
8
  */
9
 
10
 
11
+ class WCV_Vendors {
 
12
 
13
  /**
14
  * Constructor
15
  */
16
+ function __construct() {
 
17
  add_action( 'woocommerce_checkout_order_processed', array( __CLASS__, 'create_child_orders' ), 10, 1 );
18
+ add_filter( 'init', array( $this, 'add_rewrite_rules' ), 0 );
19
  }
20
 
21
  /**
25
  *
26
  * @return object
27
  */
28
+ public static function get_vendor_products( $vendor_id ) {
 
29
  $args = array(
30
  'numberposts' => -1,
31
  'post_type' => 'product',
38
  return get_posts( $args );
39
  }
40
 
41
+ public static function get_default_commission( $vendor_id ) {
 
42
  return get_user_meta( $vendor_id, 'pv_custom_commission_rate', true );
43
  }
44
 
54
  */
55
  public static function get_vendors_from_order( $order, $items = false ) {
56
 
57
+ $vendors = array();
58
+ $vendor_items = array();
59
 
60
  if ( is_a( $order, 'WC_Order' ) ) {
61
 
99
  *
100
  * @return unknown
101
  */
102
+ public static function get_vendor_dues_from_order( $order, $group = true ) {
 
103
  global $woocommerce;
104
 
105
+ $give_tax = 'yes' == get_option( 'wcvendors_vendor_give_taxes', 'no' ) ? true : false;
106
+ $give_shipping = 'yes' == get_option( 'wcvendors_vendor_give_shipping', 'no' ) ? true : false;
107
+ $receiver = array();
108
+ $shipping_given = 0;
109
+ $tax_given = 0;
110
 
111
  WCV_Shipping::$pps_shipping_costs = array();
112
 
113
  foreach ( $order->get_items() as $key => $order_item ) {
114
 
115
+ $product_id = ! empty( $order_item[ 'variation_id' ] ) ? $order_item[ 'variation_id' ] : $order_item[ 'product_id' ];
116
+ $author = WCV_Vendors::get_vendor_from_product( $product_id );
117
+ $give_tax_override = get_user_meta( $author, 'wcv_give_vendor_tax', true );
118
+ $give_shipping_override = get_user_meta( $author, 'wcv_give_vendor_shipping', true );
119
+ $is_vendor = WCV_Vendors::is_vendor( $author );
120
+ $commission = $is_vendor ? WCV_Commission::calculate_commission( $order_item[ 'line_subtotal' ], $product_id, $order, $order_item[ 'qty' ] ) : 0;
121
+ $tax = ! empty( $order_item[ 'line_tax' ] ) ? (float) $order_item[ 'line_tax' ] : 0;
122
+ $order_id = $order->get_id();
123
 
124
  // Check if shipping is enabled
125
+ if ( 'no' === get_option('woocommerce_calc_shipping') ) {
126
  $shipping = 0; $shipping_tax = 0;
127
  } else {
128
  $shipping_costs = WCV_Shipping::get_shipping_due( $order_id, $order_item, $author, $product_id );
129
+ $shipping = $shipping_costs['amount'];
130
+ $shipping_tax = $shipping_costs['tax'];
131
  }
132
 
133
  $_product = new WC_Product( $order_item['product_id'] );
146
  $tax_given += $give_tax ? $total_tax : 0;
147
 
148
  $give = 0;
149
+ $give += ! empty( $receiver[ $author ][ 'total' ] ) ? $receiver[ $author ][ 'total' ] : 0;
150
  $give += $give_shipping ? $shipping : 0;
151
  $give += $commission;
152
  $give += $give_tax ? $total_tax : 0;
155
 
156
  $receiver[ $author ] = array(
157
  'vendor_id' => (int) $author,
158
+ 'commission' => ! empty( $receiver[ $author ][ 'commission' ] ) ? $receiver[ $author ][ 'commission' ] + $commission : $commission,
159
+ 'shipping' => $give_shipping ? ( ! empty( $receiver[ $author ][ 'shipping' ] ) ? $receiver[ $author ][ 'shipping' ] + $shipping : $shipping) : 0,
160
+ 'tax' => $give_tax ? ( ! empty( $receiver[ $author ][ 'tax' ] ) ? $receiver[ $author ][ 'tax' ] + $total_tax : $total_tax ) : 0,
161
+ 'qty' => ! empty( $receiver[ $author ][ 'qty' ] ) ? $receiver[ $author ][ 'qty' ] + $order_item[ 'qty' ] : $order_item[ 'qty' ],
162
  'total' => $give,
163
  );
164
 
171
  'shipping' => $give_shipping ? $shipping : 0,
172
  'tax' => $give_tax ? $total_tax : 0,
173
  'qty' => $order_item[ 'qty' ],
174
+ 'total' => ( $give_shipping ? $shipping : 0 ) + $commission + ( $give_tax ? $total_tax : 0 ),
175
  );
176
 
177
  }
183
  if ( $group ) {
184
  $receiver[ 1 ] = array(
185
  'vendor_id' => 1,
186
+ 'qty' => ! empty( $receiver[ 1 ][ 'qty' ] ) ? $receiver[ 1 ][ 'qty' ] + $order_item[ 'qty' ] : $order_item[ 'qty' ],
187
+ 'commission' => ! empty( $receiver[ 1 ][ 'commission' ] ) ? $receiver[ 1 ][ 'commission' ] + $admin_comm : $admin_comm,
188
+ 'total' => ! empty( $receiver[ 1 ] ) ? $receiver[ 1 ][ 'total' ] + $admin_comm : $admin_comm,
189
  );
190
  } else {
191
  $receiver[ 1 ][ $key ] = array(
202
  }
203
 
204
  // Add remainders on end to admin
205
+ $discount = $order->get_total_discount();
206
+ $shipping = round( ( $order->get_total_shipping() - $shipping_given ), 2 );
207
+ $tax = round( $order->get_total_tax() - $tax_given, 2);
208
+ $total = ( $tax + $shipping ) - $discount;
209
 
210
  if ( $group ) {
211
+ $r_total = round( $receiver[ 1 ][ 'total' ], 2 ) ;
212
  $receiver[ 1 ][ 'commission' ] = round( $receiver[ 1 ][ 'commission' ], 2 ) - round( $discount, 2 );
213
  $receiver[ 1 ][ 'shipping' ] = $shipping;
214
  $receiver[ 1 ][ 'tax' ] = $tax;
237
  *
238
  * @return string
239
  */
240
+ public static function get_vendor_paypal( $vendor_id ) {
 
241
  $paypal = get_user_meta( $vendor_id, $meta_key = 'pv_paypal', true );
242
+ $paypal = ! empty( $paypal ) ? $paypal : get_the_author_meta( 'user_email', $vendor_id, false );
243
 
244
  return $paypal;
245
  }
253
  *
254
  * @return int
255
  */
256
+ public static function count_due_by_vendor( $vendor_id, $order_id ) {
 
257
  global $wpdb;
258
 
259
  $table_name = $wpdb->prefix . "pv_commission";
276
  *
277
  * @return int
278
  */
279
+ public static function get_due_orders_by_vendor( $vendor_id ) {
 
280
  global $wpdb;
281
 
282
  $table_name = $wpdb->prefix . "pv_commission";
298
  *
299
  * @return unknown
300
  */
301
+ public static function get_vendor_from_product( $product_id ) {
 
302
  // Make sure we are returning an author for products or product variations only
303
  if ( 'product' === get_post_type( $product_id ) || 'product_variation' === get_post_type( $product_id ) ) {
304
  $parent = get_post_ancestors( $product_id );
305
  if ( $parent ) $product_id = $parent[ 0 ];
306
 
307
+ $post = get_post( $product_id );
308
  $author = $post ? $post->post_author : 1;
309
  $author = apply_filters( 'pv_product_author', $author, $product_id );
310
  } else {
323
  */
324
  public static function is_vendor( $user_id ) {
325
 
326
+ $user = get_userdata( $user_id );
327
+ $vendor_roles = apply_filters( 'wcvendors_vendor_roles', array( 'vendor' ) );
328
+ $is_vendor = false;
329
 
330
  if ( is_object( $user ) && is_array( $user->roles ) ) {
331
 
332
+ foreach ( $vendor_roles as $role ) {
333
+ if ( in_array( $role , $user->roles ) ) {
334
+ $is_vendor = true;
335
+ break;
336
  }
337
  }
338
  }
349
  *
350
  * @return unknown
351
  */
352
+ public static function get_vendor_id( $input ) {
 
353
  if ( empty( $input ) ) {
354
  return false;
355
  }
356
 
357
  $users = get_users( array( 'meta_key' => 'pv_shop_slug', 'meta_value' => sanitize_title( $input ) ) );
358
 
359
+ if ( ! empty( $users ) && 1 == count( $users ) ) {
360
  $vendor = $users[ 0 ];
361
  } else {
362
  $int_vendor = is_numeric( $input );
363
+ $vendor = ! empty( $int_vendor ) ? get_userdata( $input ) : get_user_by( 'login', $input );
364
  }
365
 
366
  if ( $vendor ) {
381
  *
382
  * @return string
383
  */
384
+ public static function get_vendor_shop_page( $vendor_id ) {
 
385
  $vendor_id = self::get_vendor_id( $vendor_id );
386
+ if ( ! $vendor_id ) return;
387
 
388
  $slug = get_user_meta( $vendor_id, 'pv_shop_slug', true );
389
+ $vendor = ! $slug ? get_userdata( $vendor_id )->user_login : $slug;
390
 
391
  if ( get_option( 'permalink_structure' ) ) {
392
  $permalink = trailingslashit( get_option( 'wcvendors_vendor_shop_permalink' ) );
405
  *
406
  * @return string
407
  */
408
+ public static function get_vendor_shop_name( $vendor_id ) {
 
409
  $vendor_id = self::get_vendor_id( $vendor_id );
410
  $name = $vendor_id ? get_user_meta( $vendor_id, 'pv_shop_name', true ) : false;
411
  $shop_name = ( ! $name && $vendor = get_userdata( $vendor_id ) ) ? $vendor->user_login : $name;
421
  *
422
  * @return unknown
423
  */
424
+ public static function is_pending( $user_id ) {
 
425
  $user = get_userdata( $user_id );
426
 
427
  $role = !empty( $user->roles ) ? array_shift( $user->roles ) : false;
428
+ $is_pending = ( 'pending_vendor' == $role );
429
 
430
  return $is_pending;
431
  }
435
  * @param uknown $role
436
  */
437
  public static function is_vendor_product($role) {
438
+ return ( 'Vendor' === $role ) ? true : false;
439
  }
440
 
441
+ /**
442
+ * Is this the vendors shop archive page or a single vendor product?
443
+ *
444
+ * @return boolean
445
+ * @since 2.1.3
446
+ * @version 2.1.3
447
+ */
448
  public static function is_vendor_page() {
449
+ global $post;
450
 
451
  $vendor_shop = urldecode( get_query_var( 'vendor_shop' ) );
452
  $vendor_id = WCV_Vendors::get_vendor_id( $vendor_shop );
453
 
454
+ if ( ! $vendor_id && is_a( $post, 'WC_Product' ) ) {
455
+ if ( self::is_vendor( $post->post_author ) ) {
456
+ $vendor_id = $post->post_author;
457
+ }
458
+ }
459
+
460
  return $vendor_id ? true : false;
461
 
462
  } // is_vendor_page()
464
  /*
465
  * Is this a vendor single product page ?
466
  */
467
+ public static function is_vendor_product_page( $vendor_id ) {
468
 
469
+ $vendor_product = WCV_Vendors::is_vendor_product( wcv_get_user_role( $vendor_id ) );
470
  return $vendor_product ? true : false;
471
 
472
  } // is_vendor_product_page()
474
  public static function get_vendor_sold_by( $vendor_id ){
475
 
476
  $vendor_display_name = get_option( 'wcvendors_display_shop_display_name' );
477
+ $vendor = get_userdata( $vendor_id );
478
 
479
+ switch ( $vendor_display_name ) {
480
  case 'display_name':
481
  $display_name = $vendor->display_name;
482
  break;
505
  */
506
  public static function create_child_orders ( $order_id ) {
507
 
508
+ $order = wc_get_order( $order_id );
509
+ $items = $order->get_items();
510
  $vendor_items = array();
511
 
512
+ foreach ( $items as $item_id => $item ) {
513
+ if ( isset( $item['product_id'] ) && 0 !== $item['product_id'] ) {
514
  // check if product is from vendor
515
  $product_author = get_post_field( 'post_author', $item['product_id'] );
516
+ if ( WCV_Vendors::is_vendor( $product_author ) ) {
517
  $vendor_items[ $product_author ][ $item_id ] = array (
518
+ 'item_id' => $item_id,
519
+ 'qty' => $item['qty'],
520
+ 'total' => $item['line_total'],
521
+ 'subtotal' => $item['line_subtotal'],
522
+ 'tax' => $item['line_tax'],
523
+ 'subtotal_tax' => $item['line_subtotal_tax'],
524
+ 'tax_data' => maybe_unserialize( $item['line_tax_data'] ),
525
+ 'commission' => WCV_Commission::calculate_commission( $item['line_subtotal'], $item['product_id'], $order, $item['qty'] ),
526
  );
527
  }
528
  }
529
  }
530
 
531
+ foreach ( $vendor_items as $vendor_id => $items ) {
532
+ if ( ! empty( $items ) ) {
533
  $vendor_order = WCV_Vendors::create_vendor_order( array(
534
  'order_id' => $order_id,
535
  'vendor_id' => $vendor_id,
730
  $permalink = untrailingslashit( get_option( 'wcvendors_vendor_shop_permalink' ) );
731
 
732
  // Remove beginning slash
733
+ if ( '/' == substr( $permalink, 0, 1 ) ) {
734
  $permalink = substr( $permalink, 1, strlen( $permalink ) );
735
  }
736
 
classes/includes/wcv-template-functions.php CHANGED
@@ -96,7 +96,7 @@ if ( ! function_exists( 'wcv_get_vendor_item_totals' ) ) {
96
  }
97
 
98
  // Commission subtotal
99
- if ( 'commission' === $totals_display || 'both' === $totals_display ){
100
  // Commission Subtotal
101
  $total_rows[ 'commission_subtotal' ] = array(
102
  'label' => __( 'Commission subtotal:', 'wc-vendors' ),
96
  }
97
 
98
  // Commission subtotal
99
+ if ( 'commission' === $totals_display || 'both' === $totals_display ){
100
  // Commission Subtotal
101
  $total_rows[ 'commission_subtotal' ] = array(
102
  'label' => __( 'Commission subtotal:', 'wc-vendors' ),
languages/wc-vendors.pot CHANGED
@@ -28,27 +28,27 @@ msgstr ""
28
  msgid "<b>WC Vendors Marketplace is inactive</b>. WC Vendors Marketplace requires a minimum of WooCommerce 3.0.0 to operate."
29
  msgstr ""
30
 
31
- #: class-wc-vendors.php:435
32
  msgid "WC Vendors 2.0 is a major update. This is not compatible with any of our existing extensions. You should test this update on a staging server before updating. Backup your site and update your theme and extensions, and <a href=\"%s\">review update details here</a> before upgrading."
33
  msgstr ""
34
 
35
- #: class-wc-vendors.php:448
36
  msgid "WC Vendors Pro 1.5.0 is required to run WC Vendors 2.0.0. Your current version %s will be deactivated. Please upgrade to the latest version."
37
  msgstr ""
38
 
39
- #: classes/class-commission.php:56, classes/admin/class-admin-reports.php:350, classes/admin/class-admin-reports.php:443, classes/admin/class-wcv-commissions-page.php:278, classes/admin/class-wcv-commissions-page.php:544
40
  msgid "Due"
41
  msgstr ""
42
 
43
- #: classes/class-commission.php:57, classes/admin/class-admin-reports.php:349, classes/admin/class-admin-reports.php:444, classes/admin/class-wcv-commissions-page.php:279, classes/admin/class-wcv-commissions-page.php:545
44
  msgid "Paid"
45
  msgstr ""
46
 
47
- #: classes/class-commission.php:58, classes/admin/class-admin-reports.php:348, classes/admin/class-admin-reports.php:445, classes/admin/class-wcv-commissions-page.php:280, classes/admin/class-wcv-commissions-page.php:546
48
  msgid "Reversed"
49
  msgstr ""
50
 
51
- #: classes/class-cron.php:88
52
  msgid "Payment total: %s"
53
  msgstr ""
54
 
@@ -56,7 +56,7 @@ msgstr ""
56
  msgid "Pending %s"
57
  msgstr ""
58
 
59
- #: classes/class-install.php:163, classes/admin/class-admin-reports.php:173, classes/admin/class-admin-reports.php:458, classes/admin/class-product-meta.php:245, classes/admin/class-setup-wizard.php:301, classes/admin/class-wcv-admin-setup.php:141, classes/admin/class-wcv-admin-setup.php:304, classes/admin/class-wcv-commissions-csv-exporter.php:43, classes/admin/class-wcv-commissions-page.php:118, classes/admin/class-wcv-commissions-sum-csv-exporter.php:41, classes/admin/settings/class-wcv-settings-display.php:107, classes/admin/settings/class-wcv-settings-display.php:115, classes/admin/settings/class-wcv-settings-display.php:202
60
  msgid "%s"
61
  msgstr ""
62
 
@@ -136,11 +136,11 @@ msgstr ""
136
  msgid "%s Orders"
137
  msgstr ""
138
 
139
- #: classes/class-vendors.php:576
140
  msgid "%s Order &ndash; %s"
141
  msgstr ""
142
 
143
- #: classes/class-vendors.php:576
144
  msgctxt "Order date parsed by strftime"
145
  msgid "%b %d, %Y @ %I:%M %p"
146
  msgstr ""
@@ -217,7 +217,7 @@ msgstr ""
217
  msgid "Order"
218
  msgstr ""
219
 
220
- #: classes/admin/class-admin-reports.php:172, classes/admin/class-wcv-commissions-csv-exporter.php:41, classes/admin/class-wcv-commissions-page.php:116, templates/dashboard/reports.php:35, templates/emails/notify-vendor-shipped.php:27, templates/emails/vendor-new-order.php:31, templates/emails/vendor-order-details.php:36, classes/admin/emails/class-wcv-vendor-notify-order.php:192
221
  msgid "Product"
222
  msgstr ""
223
 
@@ -265,7 +265,7 @@ msgstr ""
265
  msgid "Tax"
266
  msgstr ""
267
 
268
- #: classes/admin/class-admin-reports.php:347, classes/admin/class-wcv-commissions-csv-exporter.php:45, classes/admin/class-wcv-commissions-page.php:120, templates/dashboard/orders.php:51, templates/orders/orders.php:129, classes/admin/settings/class-wcv-settings-capabilities.php:107
269
  msgid "Shipping"
270
  msgstr ""
271
 
@@ -293,7 +293,7 @@ msgstr ""
293
  msgid "Assign media to %s"
294
  msgstr ""
295
 
296
- #: classes/admin/class-product-meta.php:173, classes/admin/class-product-meta.php:189, classes/admin/class-wcv-commissions-csv-exporter.php:44, classes/admin/class-wcv-commissions-page.php:119, templates/dashboard/reports.php:37, templates/emails/vendor-order-details.php:39, classes/admin/emails/class-wcv-vendor-notify-order.php:191, classes/admin/settings/class-wcv-settings-commission.php:31, classes/admin/views/html-admin-commission-page.php:23, classes/admin/views/setup/general.php:79
297
  msgid "Commission"
298
  msgstr ""
299
 
@@ -301,24 +301,24 @@ msgstr ""
301
  msgid "Leave blank for default"
302
  msgstr ""
303
 
304
- #: classes/admin/class-setup-wizard.php:69
305
  msgid "Start"
306
  msgstr ""
307
 
308
- #: classes/admin/class-setup-wizard.php:74, classes/admin/settings/class-wcv-settings-capabilities.php:31
309
  msgid "Capabilities"
310
  msgstr ""
311
 
312
- #: classes/admin/class-setup-wizard.php:79, classes/admin/settings/class-wcv-settings-display.php:169, classes/admin/views/setup/pages.php:19
313
  msgid "Pages"
314
  msgstr ""
315
 
316
- #: classes/admin/class-setup-wizard.php:84
317
  msgid "Ready!"
318
  msgstr ""
319
 
320
  #. translators: %1$s: link to videos, %2$s: link to docs
321
- #: classes/admin/class-setup-wizard.php:360
322
  msgid "Don't forget to check our <a href=\"%1$s\" target=\"_blank\">documentation</a> to learn more about setting up WC Vendors and if you need help, be sure to visit our <a href=\"%2$s\" target=\"_blank\">free support forums</a>."
323
  msgstr ""
324
 
@@ -326,7 +326,7 @@ msgstr ""
326
  msgid "Shop Settings"
327
  msgstr ""
328
 
329
- #: classes/admin/class-vendor-admin-dashboard.php:23, classes/admin/class-vendor-admin-dashboard.php:23, classes/admin/class-vendor-admin-dashboard.php:209, templates/dashboard/orders.php:41, classes/admin/settings/class-wcv-settings-capabilities.php:45, classes/admin/settings/class-wcv-settings-capabilities.php:271, classes/admin/settings/class-wcv-settings-display.php:193, classes/admin/views/setup/capabilities.php:70
330
  msgid "Orders"
331
  msgstr ""
332
 
@@ -358,7 +358,7 @@ msgstr ""
358
  msgid "Customer"
359
  msgstr ""
360
 
361
- #: classes/admin/class-vendor-admin-dashboard.php:350, classes/admin/settings/class-wcv-settings-capabilities.php:44, classes/admin/settings/class-wcv-settings-capabilities.php:238, classes/admin/views/setup/capabilities.php:19
362
  msgid "Products"
363
  msgstr ""
364
 
@@ -866,15 +866,15 @@ msgstr ""
866
  msgid "Price"
867
  msgstr ""
868
 
869
- #: templates/emails/notify-vendor-shipped.php:61, templates/emails/vendor-new-order.php:67
870
  msgid "Customer details"
871
  msgstr ""
872
 
873
- #: templates/emails/notify-vendor-shipped.php:64, templates/emails/vendor-new-order.php:70
874
  msgid "Email:"
875
  msgstr ""
876
 
877
- #: templates/emails/notify-vendor-shipped.php:67, templates/emails/vendor-new-order.php:73
878
  msgid "Tel:"
879
  msgstr ""
880
 
@@ -903,7 +903,7 @@ msgstr ""
903
  msgid "Order #%s"
904
  msgstr ""
905
 
906
- #: templates/emails/vendor-order-details.php:81, templates/emails/plain/vendor-order-details.php:45
907
  msgid "Note:"
908
  msgstr ""
909
 
@@ -955,11 +955,11 @@ msgstr ""
955
  msgid "[{blogname}] Your %s application has been {status}"
956
  msgstr ""
957
 
958
- #: classes/admin/emails/class-wc-approve-vendor.php:123, classes/admin/emails/class-wc-notify-admin.php:134, classes/admin/emails/class-wc-notify-shipped.php:166, classes/admin/emails/class-wc-notify-vendor.php:268, classes/admin/emails/class-wcv-admin-notify-application.php:131, classes/admin/emails/class-wcv-admin-notify-product.php:146, classes/admin/emails/class-wcv-admin-notify-shipped.php:135, classes/admin/emails/class-wcv-customer-notify-shipped.php:142, classes/admin/emails/class-wcv-vendor-notify-application.php:129, classes/admin/emails/class-wcv-vendor-notify-approved.php:138, classes/admin/emails/class-wcv-vendor-notify-denied.php:148, classes/admin/emails/class-wcv-vendor-notify-order.php:160, classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:62
959
  msgid "Enable/Disable"
960
  msgstr ""
961
 
962
- #: classes/admin/emails/class-wc-approve-vendor.php:125, classes/admin/emails/class-wc-notify-admin.php:136, classes/admin/emails/class-wc-notify-shipped.php:168, classes/admin/emails/class-wc-notify-vendor.php:270, classes/admin/emails/class-wcv-admin-notify-application.php:133, classes/admin/emails/class-wcv-admin-notify-product.php:148, classes/admin/emails/class-wcv-admin-notify-shipped.php:137, classes/admin/emails/class-wcv-customer-notify-shipped.php:144, classes/admin/emails/class-wcv-vendor-notify-application.php:131, classes/admin/emails/class-wcv-vendor-notify-approved.php:140, classes/admin/emails/class-wcv-vendor-notify-denied.php:150, classes/admin/emails/class-wcv-vendor-notify-order.php:162
963
  msgid "Enable this email notification"
964
  msgstr ""
965
 
@@ -967,7 +967,7 @@ msgstr ""
967
  msgid "Enter recipients (comma separated) for this email. Defaults to <code>%s</code>."
968
  msgstr ""
969
 
970
- #: classes/admin/emails/class-wc-approve-vendor.php:136, classes/admin/emails/class-wc-notify-admin.php:147, classes/admin/emails/class-wc-notify-shipped.php:172, classes/admin/emails/class-wc-notify-vendor.php:274, classes/admin/emails/class-wcv-admin-notify-application.php:145, classes/admin/emails/class-wcv-admin-notify-product.php:160, classes/admin/emails/class-wcv-admin-notify-shipped.php:149, classes/admin/emails/class-wcv-customer-notify-shipped.php:148, classes/admin/emails/class-wcv-vendor-notify-application.php:135, classes/admin/emails/class-wcv-vendor-notify-approved.php:144, classes/admin/emails/class-wcv-vendor-notify-denied.php:154, classes/admin/emails/class-wcv-vendor-notify-order.php:166
971
  msgid "Subject"
972
  msgstr ""
973
 
@@ -983,11 +983,11 @@ msgstr ""
983
  msgid "This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>."
984
  msgstr ""
985
 
986
- #: classes/admin/emails/class-wc-approve-vendor.php:150, classes/admin/emails/class-wc-notify-admin.php:161, classes/admin/emails/class-wc-notify-shipped.php:186, classes/admin/emails/class-wc-notify-vendor.php:294, classes/admin/emails/class-wcv-admin-notify-application.php:175, classes/admin/emails/class-wcv-admin-notify-product.php:178, classes/admin/emails/class-wcv-admin-notify-shipped.php:167, classes/admin/emails/class-wcv-customer-notify-shipped.php:166, classes/admin/emails/class-wcv-vendor-notify-application.php:153, classes/admin/emails/class-wcv-vendor-notify-approved.php:171, classes/admin/emails/class-wcv-vendor-notify-denied.php:189, classes/admin/emails/class-wcv-vendor-notify-order.php:204
987
  msgid "Email type"
988
  msgstr ""
989
 
990
- #: classes/admin/emails/class-wc-approve-vendor.php:152, classes/admin/emails/class-wc-notify-admin.php:163, classes/admin/emails/class-wc-notify-shipped.php:188, classes/admin/emails/class-wc-notify-vendor.php:296, classes/admin/emails/class-wcv-admin-notify-application.php:177, classes/admin/emails/class-wcv-admin-notify-product.php:180, classes/admin/emails/class-wcv-admin-notify-shipped.php:169, classes/admin/emails/class-wcv-customer-notify-shipped.php:168, classes/admin/emails/class-wcv-vendor-notify-application.php:155, classes/admin/emails/class-wcv-vendor-notify-approved.php:173, classes/admin/emails/class-wcv-vendor-notify-denied.php:191, classes/admin/emails/class-wcv-vendor-notify-order.php:206
991
  msgid "Choose which format of email to send."
992
  msgstr ""
993
 
@@ -1116,11 +1116,11 @@ msgstr ""
1116
  #. translators: %s: list of placeholders
1117
  #. translators: %s: list of placeholders
1118
  #. translators: %s: list of placeholders
1119
- #: classes/admin/emails/class-wcv-admin-notify-application.php:149, classes/admin/emails/class-wcv-admin-notify-application.php:158, classes/admin/emails/class-wcv-admin-notify-product.php:164, classes/admin/emails/class-wcv-admin-notify-product.php:173, classes/admin/emails/class-wcv-admin-notify-shipped.php:153, classes/admin/emails/class-wcv-admin-notify-shipped.php:162, classes/admin/emails/class-wcv-customer-notify-shipped.php:152, classes/admin/emails/class-wcv-customer-notify-shipped.php:161, classes/admin/emails/class-wcv-vendor-notify-application.php:139, classes/admin/emails/class-wcv-vendor-notify-application.php:148, classes/admin/emails/class-wcv-vendor-notify-approved.php:148, classes/admin/emails/class-wcv-vendor-notify-approved.php:166, classes/admin/emails/class-wcv-vendor-notify-denied.php:158, classes/admin/emails/class-wcv-vendor-notify-denied.php:167, classes/admin/emails/class-wcv-vendor-notify-denied.php:184, classes/admin/emails/class-wcv-vendor-notify-order.php:170, classes/admin/emails/class-wcv-vendor-notify-order.php:179
1120
  msgid "Available placeholders: %s"
1121
  msgstr ""
1122
 
1123
- #: classes/admin/emails/class-wcv-admin-notify-application.php:154, classes/admin/emails/class-wcv-admin-notify-product.php:169, classes/admin/emails/class-wcv-admin-notify-shipped.php:158, classes/admin/emails/class-wcv-customer-notify-shipped.php:157, classes/admin/emails/class-wcv-vendor-notify-application.php:144, classes/admin/emails/class-wcv-vendor-notify-approved.php:162, classes/admin/emails/class-wcv-vendor-notify-denied.php:180, classes/admin/emails/class-wcv-vendor-notify-order.php:175
1124
  msgid "Email heading"
1125
  msgstr ""
1126
 
@@ -1264,31 +1264,31 @@ msgstr ""
1264
  msgid "New Customer Order"
1265
  msgstr ""
1266
 
1267
- #: classes/admin/emails/class-wcv-vendor-notify-order.php:184
1268
  msgid "Totals Display"
1269
  msgstr ""
1270
 
1271
- #: classes/admin/emails/class-wcv-vendor-notify-order.php:186
1272
  msgid "Choose how to display the product totals. Including commission or without or no totals at all."
1273
  msgstr ""
1274
 
1275
- #: classes/admin/emails/class-wcv-vendor-notify-order.php:190
1276
  msgid "Both"
1277
  msgstr ""
1278
 
1279
- #: classes/admin/emails/class-wcv-vendor-notify-order.php:193
1280
  msgid "None"
1281
  msgstr ""
1282
 
1283
- #: classes/admin/emails/class-wcv-vendor-notify-order.php:198
1284
  msgid "Payment method"
1285
  msgstr ""
1286
 
1287
- #: classes/admin/emails/class-wcv-vendor-notify-order.php:200
1288
  msgid "Include the payment method in the email"
1289
  msgstr ""
1290
 
1291
- #: classes/admin/settings/class-wcv-settings-advanced.php:27, classes/admin/settings/class-wcv-settings-advanced.php:39, classes/admin/settings/class-wcv-settings-capabilities.php:111, classes/admin/settings/class-wcv-settings-display.php:45
1292
  msgid "Advanced"
1293
  msgstr ""
1294
 
@@ -1340,7 +1340,7 @@ msgstr ""
1340
  msgid "Remove custom roles registered by WC Vendors."
1341
  msgstr ""
1342
 
1343
- #: classes/admin/settings/class-wcv-settings-capabilities.php:43, classes/admin/settings/class-wcv-settings-capabilities.php:105, classes/admin/settings/class-wcv-settings-commission.php:43, classes/admin/settings/class-wcv-settings-display.php:43, classes/admin/settings/class-wcv-settings-general.php:31, classes/admin/settings/class-wcv-settings-general.php:43, classes/admin/settings/class-wcv-settings-payments.php:44, classes/admin/views/setup/general.php:19
1344
  msgid "General"
1345
  msgstr ""
1346
 
@@ -1360,191 +1360,191 @@ msgstr ""
1360
  msgid "This controls what product types the %s can create"
1361
  msgstr ""
1362
 
1363
- #: classes/admin/settings/class-wcv-settings-capabilities.php:82
1364
  msgid "Product Type Options"
1365
  msgstr ""
1366
 
1367
- #: classes/admin/settings/class-wcv-settings-capabilities.php:83
1368
  msgid "This controls what product type options the %s can use"
1369
  msgstr ""
1370
 
1371
- #: classes/admin/settings/class-wcv-settings-capabilities.php:90
1372
  msgid "Virtual"
1373
  msgstr ""
1374
 
1375
- #: classes/admin/settings/class-wcv-settings-capabilities.php:91
1376
  msgid "Downloadable"
1377
  msgstr ""
1378
 
1379
- #: classes/admin/settings/class-wcv-settings-capabilities.php:97
1380
  msgid "Product Data Tabs"
1381
  msgstr ""
1382
 
1383
- #: classes/admin/settings/class-wcv-settings-capabilities.php:98
1384
  msgid "This controls what product data tabs the %s can use"
1385
  msgstr ""
1386
 
1387
- #: classes/admin/settings/class-wcv-settings-capabilities.php:106
1388
  msgid "Inventory"
1389
  msgstr ""
1390
 
1391
- #: classes/admin/settings/class-wcv-settings-capabilities.php:108
1392
  msgid "Linked Products"
1393
  msgstr ""
1394
 
1395
- #: classes/admin/settings/class-wcv-settings-capabilities.php:109
1396
  msgid "Attributes"
1397
  msgstr ""
1398
 
1399
- #: classes/admin/settings/class-wcv-settings-capabilities.php:110
1400
  msgid "Variations"
1401
  msgstr ""
1402
 
1403
- #: classes/admin/settings/class-wcv-settings-capabilities.php:118
1404
  msgid "Featured Product"
1405
  msgstr ""
1406
 
1407
- #: classes/admin/settings/class-wcv-settings-capabilities.php:119
1408
  msgid "Allow %s to use the featured product option"
1409
  msgstr ""
1410
 
1411
- #: classes/admin/settings/class-wcv-settings-capabilities.php:126
1412
  msgid "Duplicate Product"
1413
  msgstr ""
1414
 
1415
- #: classes/admin/settings/class-wcv-settings-capabilities.php:127
1416
  msgid "Allow %s to duplicate products"
1417
  msgstr ""
1418
 
1419
- #: classes/admin/settings/class-wcv-settings-capabilities.php:134
1420
  msgid "SKU"
1421
  msgstr ""
1422
 
1423
- #: classes/admin/settings/class-wcv-settings-capabilities.php:135
1424
  msgid "Hide sku field from %s"
1425
  msgstr ""
1426
 
1427
- #: classes/admin/settings/class-wcv-settings-capabilities.php:142
1428
  msgid "Taxes"
1429
  msgstr ""
1430
 
1431
- #: classes/admin/settings/class-wcv-settings-capabilities.php:143
1432
  msgid "Hide tax fields from %s"
1433
  msgstr ""
1434
 
1435
- #: classes/admin/settings/class-wcv-settings-capabilities.php:159
1436
  msgid "Configure what order information a %s can view from an order"
1437
  msgstr ""
1438
 
1439
- #: classes/admin/settings/class-wcv-settings-capabilities.php:164
1440
  msgid "View Order Notes"
1441
  msgstr ""
1442
 
1443
- #: classes/admin/settings/class-wcv-settings-capabilities.php:165, classes/admin/views/setup/capabilities.php:102
1444
  msgid "Allow %s to view order notes"
1445
  msgstr ""
1446
 
1447
- #: classes/admin/settings/class-wcv-settings-capabilities.php:172
1448
  msgid "Add Order notes"
1449
  msgstr ""
1450
 
1451
- #: classes/admin/settings/class-wcv-settings-capabilities.php:173, classes/admin/views/setup/capabilities.php:115
1452
  msgid "Allow %s to add order notes."
1453
  msgstr ""
1454
 
1455
- #: classes/admin/settings/class-wcv-settings-capabilities.php:180
1456
  msgid "Customer Name"
1457
  msgstr ""
1458
 
1459
- #: classes/admin/settings/class-wcv-settings-capabilities.php:181
1460
  msgid "Allow %s to view customer name fields"
1461
  msgstr ""
1462
 
1463
- #: classes/admin/settings/class-wcv-settings-capabilities.php:188
1464
  msgid "Customer Billing Address"
1465
  msgstr ""
1466
 
1467
- #: classes/admin/settings/class-wcv-settings-capabilities.php:189
1468
  msgid "Allow %s to view customer billing address fields"
1469
  msgstr ""
1470
 
1471
- #: classes/admin/settings/class-wcv-settings-capabilities.php:196
1472
  msgid "Customer Shipping Address"
1473
  msgstr ""
1474
 
1475
- #: classes/admin/settings/class-wcv-settings-capabilities.php:197
1476
  msgid "Allow %s to view the customer shipping fields"
1477
  msgstr ""
1478
 
1479
- #: classes/admin/settings/class-wcv-settings-capabilities.php:204
1480
  msgid "Customer Email"
1481
  msgstr ""
1482
 
1483
- #: classes/admin/settings/class-wcv-settings-capabilities.php:205
1484
  msgid "Allow %s to view the customer email address"
1485
  msgstr ""
1486
 
1487
- #: classes/admin/settings/class-wcv-settings-capabilities.php:212
1488
  msgid "Customer Phone"
1489
  msgstr ""
1490
 
1491
- #: classes/admin/settings/class-wcv-settings-capabilities.php:213
1492
  msgid "Allow %s to view the customer phone number"
1493
  msgstr ""
1494
 
1495
- #: classes/admin/settings/class-wcv-settings-capabilities.php:228
1496
  msgid "Permissions"
1497
  msgstr ""
1498
 
1499
- #: classes/admin/settings/class-wcv-settings-capabilities.php:230
1500
  msgid "Enable or disable functionality for your %s"
1501
  msgstr ""
1502
 
1503
- #: classes/admin/settings/class-wcv-settings-capabilities.php:244
1504
  msgid "Submit Products"
1505
  msgstr ""
1506
 
1507
- #: classes/admin/settings/class-wcv-settings-capabilities.php:245, classes/admin/views/setup/capabilities.php:25
1508
  msgid "Allow %s to add/edit products"
1509
  msgstr ""
1510
 
1511
- #: classes/admin/settings/class-wcv-settings-capabilities.php:252
1512
  msgid "Edit Live Products"
1513
  msgstr ""
1514
 
1515
- #: classes/admin/settings/class-wcv-settings-capabilities.php:253, classes/admin/views/setup/capabilities.php:38
1516
  msgid "Allow %s to edit published (live) products"
1517
  msgstr ""
1518
 
1519
- #: classes/admin/settings/class-wcv-settings-capabilities.php:260
1520
  msgid "Publish Approval"
1521
  msgstr ""
1522
 
1523
- #: classes/admin/settings/class-wcv-settings-capabilities.php:261
1524
  msgid "Allow %s to publish products directly to the marketplace without requiring approval."
1525
  msgstr ""
1526
 
1527
- #: classes/admin/settings/class-wcv-settings-capabilities.php:277
1528
  msgid "View Orders"
1529
  msgstr ""
1530
 
1531
- #: classes/admin/settings/class-wcv-settings-capabilities.php:278, classes/admin/views/setup/capabilities.php:76
1532
  msgid "Allow %s to view orders"
1533
  msgstr ""
1534
 
1535
- #: classes/admin/settings/class-wcv-settings-capabilities.php:285
1536
  msgid "Export Orders"
1537
  msgstr ""
1538
 
1539
- #: classes/admin/settings/class-wcv-settings-capabilities.php:286, classes/admin/views/setup/capabilities.php:89
1540
  msgid "Allow %s to export their orders to a CSV file"
1541
  msgstr ""
1542
 
1543
- #: classes/admin/settings/class-wcv-settings-capabilities.php:293
1544
  msgid "Front End Sales Reports"
1545
  msgstr ""
1546
 
1547
- #: classes/admin/settings/class-wcv-settings-capabilities.php:294
1548
  msgid "Allow %s to view sales table on the frontend on the %s dashboard page."
1549
  msgstr ""
1550
 
28
  msgid "<b>WC Vendors Marketplace is inactive</b>. WC Vendors Marketplace requires a minimum of WooCommerce 3.0.0 to operate."
29
  msgstr ""
30
 
31
+ #: class-wc-vendors.php:434
32
  msgid "WC Vendors 2.0 is a major update. This is not compatible with any of our existing extensions. You should test this update on a staging server before updating. Backup your site and update your theme and extensions, and <a href=\"%s\">review update details here</a> before upgrading."
33
  msgstr ""
34
 
35
+ #: class-wc-vendors.php:447
36
  msgid "WC Vendors Pro 1.5.0 is required to run WC Vendors 2.0.0. Your current version %s will be deactivated. Please upgrade to the latest version."
37
  msgstr ""
38
 
39
+ #: classes/class-commission.php:55, classes/admin/class-admin-reports.php:350, classes/admin/class-admin-reports.php:443, classes/admin/class-wcv-commissions-page.php:278, classes/admin/class-wcv-commissions-page.php:544
40
  msgid "Due"
41
  msgstr ""
42
 
43
+ #: classes/class-commission.php:56, classes/admin/class-admin-reports.php:349, classes/admin/class-admin-reports.php:444, classes/admin/class-wcv-commissions-page.php:279, classes/admin/class-wcv-commissions-page.php:545
44
  msgid "Paid"
45
  msgstr ""
46
 
47
+ #: classes/class-commission.php:57, classes/admin/class-admin-reports.php:348, classes/admin/class-admin-reports.php:445, classes/admin/class-wcv-commissions-page.php:280, classes/admin/class-wcv-commissions-page.php:546
48
  msgid "Reversed"
49
  msgstr ""
50
 
51
+ #: classes/class-cron.php:86
52
  msgid "Payment total: %s"
53
  msgstr ""
54
 
56
  msgid "Pending %s"
57
  msgstr ""
58
 
59
+ #: classes/class-install.php:163, classes/admin/class-admin-reports.php:173, classes/admin/class-admin-reports.php:458, classes/admin/class-product-meta.php:245, classes/admin/class-setup-wizard.php:309, classes/admin/class-wcv-admin-setup.php:141, classes/admin/class-wcv-admin-setup.php:304, classes/admin/class-wcv-commissions-csv-exporter.php:43, classes/admin/class-wcv-commissions-page.php:118, classes/admin/class-wcv-commissions-sum-csv-exporter.php:41, classes/admin/settings/class-wcv-settings-display.php:107, classes/admin/settings/class-wcv-settings-display.php:115, classes/admin/settings/class-wcv-settings-display.php:202
60
  msgid "%s"
61
  msgstr ""
62
 
136
  msgid "%s Orders"
137
  msgstr ""
138
 
139
+ #: classes/class-vendors.php:574
140
  msgid "%s Order &ndash; %s"
141
  msgstr ""
142
 
143
+ #: classes/class-vendors.php:574
144
  msgctxt "Order date parsed by strftime"
145
  msgid "%b %d, %Y @ %I:%M %p"
146
  msgstr ""
217
  msgid "Order"
218
  msgstr ""
219
 
220
+ #: classes/admin/class-admin-reports.php:172, classes/admin/class-wcv-commissions-csv-exporter.php:41, classes/admin/class-wcv-commissions-page.php:116, templates/dashboard/reports.php:35, templates/emails/notify-vendor-shipped.php:27, templates/emails/vendor-new-order.php:31, templates/emails/vendor-order-details.php:36, classes/admin/emails/class-wcv-vendor-notify-order.php:194
221
  msgid "Product"
222
  msgstr ""
223
 
265
  msgid "Tax"
266
  msgstr ""
267
 
268
+ #: classes/admin/class-admin-reports.php:347, classes/admin/class-wcv-commissions-csv-exporter.php:45, classes/admin/class-wcv-commissions-page.php:120, templates/dashboard/orders.php:51, templates/orders/orders.php:129, classes/admin/settings/class-wcv-settings-capabilities.php:104
269
  msgid "Shipping"
270
  msgstr ""
271
 
293
  msgid "Assign media to %s"
294
  msgstr ""
295
 
296
+ #: classes/admin/class-product-meta.php:173, classes/admin/class-product-meta.php:189, classes/admin/class-wcv-commissions-csv-exporter.php:44, classes/admin/class-wcv-commissions-page.php:119, templates/dashboard/reports.php:37, templates/emails/vendor-order-details.php:39, classes/admin/emails/class-wcv-vendor-notify-order.php:193, classes/admin/settings/class-wcv-settings-commission.php:31, classes/admin/views/html-admin-commission-page.php:23, classes/admin/views/setup/general.php:79
297
  msgid "Commission"
298
  msgstr ""
299
 
301
  msgid "Leave blank for default"
302
  msgstr ""
303
 
304
+ #: classes/admin/class-setup-wizard.php:77
305
  msgid "Start"
306
  msgstr ""
307
 
308
+ #: classes/admin/class-setup-wizard.php:82, classes/admin/settings/class-wcv-settings-capabilities.php:31
309
  msgid "Capabilities"
310
  msgstr ""
311
 
312
+ #: classes/admin/class-setup-wizard.php:87, classes/admin/settings/class-wcv-settings-display.php:169, classes/admin/views/setup/pages.php:19
313
  msgid "Pages"
314
  msgstr ""
315
 
316
+ #: classes/admin/class-setup-wizard.php:92
317
  msgid "Ready!"
318
  msgstr ""
319
 
320
  #. translators: %1$s: link to videos, %2$s: link to docs
321
+ #: classes/admin/class-setup-wizard.php:368
322
  msgid "Don't forget to check our <a href=\"%1$s\" target=\"_blank\">documentation</a> to learn more about setting up WC Vendors and if you need help, be sure to visit our <a href=\"%2$s\" target=\"_blank\">free support forums</a>."
323
  msgstr ""
324
 
326
  msgid "Shop Settings"
327
  msgstr ""
328
 
329
+ #: classes/admin/class-vendor-admin-dashboard.php:23, classes/admin/class-vendor-admin-dashboard.php:23, classes/admin/class-vendor-admin-dashboard.php:209, templates/dashboard/orders.php:41, classes/admin/settings/class-wcv-settings-capabilities.php:45, classes/admin/settings/class-wcv-settings-capabilities.php:268, classes/admin/settings/class-wcv-settings-display.php:193, classes/admin/views/setup/capabilities.php:70
330
  msgid "Orders"
331
  msgstr ""
332
 
358
  msgid "Customer"
359
  msgstr ""
360
 
361
+ #: classes/admin/class-vendor-admin-dashboard.php:350, classes/admin/settings/class-wcv-settings-capabilities.php:44, classes/admin/settings/class-wcv-settings-capabilities.php:235, classes/admin/views/setup/capabilities.php:19
362
  msgid "Products"
363
  msgstr ""
364
 
866
  msgid "Price"
867
  msgstr ""
868
 
869
+ #: templates/emails/notify-vendor-shipped.php:61, templates/emails/vendor-new-order.php:69
870
  msgid "Customer details"
871
  msgstr ""
872
 
873
+ #: templates/emails/notify-vendor-shipped.php:64, templates/emails/vendor-new-order.php:72
874
  msgid "Email:"
875
  msgstr ""
876
 
877
+ #: templates/emails/notify-vendor-shipped.php:67, templates/emails/vendor-new-order.php:75
878
  msgid "Tel:"
879
  msgstr ""
880
 
903
  msgid "Order #%s"
904
  msgstr ""
905
 
906
+ #: templates/emails/vendor-order-details.php:88, templates/emails/plain/vendor-order-details.php:49
907
  msgid "Note:"
908
  msgstr ""
909
 
955
  msgid "[{blogname}] Your %s application has been {status}"
956
  msgstr ""
957
 
958
+ #: classes/admin/emails/class-wc-approve-vendor.php:123, classes/admin/emails/class-wc-notify-admin.php:134, classes/admin/emails/class-wc-notify-shipped.php:166, classes/admin/emails/class-wc-notify-vendor.php:268, classes/admin/emails/class-wcv-admin-notify-application.php:131, classes/admin/emails/class-wcv-admin-notify-product.php:146, classes/admin/emails/class-wcv-admin-notify-shipped.php:135, classes/admin/emails/class-wcv-customer-notify-shipped.php:142, classes/admin/emails/class-wcv-vendor-notify-application.php:129, classes/admin/emails/class-wcv-vendor-notify-approved.php:138, classes/admin/emails/class-wcv-vendor-notify-denied.php:148, classes/admin/emails/class-wcv-vendor-notify-order.php:162, classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php:62
959
  msgid "Enable/Disable"
960
  msgstr ""
961
 
962
+ #: classes/admin/emails/class-wc-approve-vendor.php:125, classes/admin/emails/class-wc-notify-admin.php:136, classes/admin/emails/class-wc-notify-shipped.php:168, classes/admin/emails/class-wc-notify-vendor.php:270, classes/admin/emails/class-wcv-admin-notify-application.php:133, classes/admin/emails/class-wcv-admin-notify-product.php:148, classes/admin/emails/class-wcv-admin-notify-shipped.php:137, classes/admin/emails/class-wcv-customer-notify-shipped.php:144, classes/admin/emails/class-wcv-vendor-notify-application.php:131, classes/admin/emails/class-wcv-vendor-notify-approved.php:140, classes/admin/emails/class-wcv-vendor-notify-denied.php:150, classes/admin/emails/class-wcv-vendor-notify-order.php:164
963
  msgid "Enable this email notification"
964
  msgstr ""
965
 
967
  msgid "Enter recipients (comma separated) for this email. Defaults to <code>%s</code>."
968
  msgstr ""
969
 
970
+ #: classes/admin/emails/class-wc-approve-vendor.php:136, classes/admin/emails/class-wc-notify-admin.php:147, classes/admin/emails/class-wc-notify-shipped.php:172, classes/admin/emails/class-wc-notify-vendor.php:274, classes/admin/emails/class-wcv-admin-notify-application.php:145, classes/admin/emails/class-wcv-admin-notify-product.php:160, classes/admin/emails/class-wcv-admin-notify-shipped.php:149, classes/admin/emails/class-wcv-customer-notify-shipped.php:148, classes/admin/emails/class-wcv-vendor-notify-application.php:135, classes/admin/emails/class-wcv-vendor-notify-approved.php:144, classes/admin/emails/class-wcv-vendor-notify-denied.php:154, classes/admin/emails/class-wcv-vendor-notify-order.php:168
971
  msgid "Subject"
972
  msgstr ""
973
 
983
  msgid "This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>."
984
  msgstr ""
985
 
986
+ #: classes/admin/emails/class-wc-approve-vendor.php:150, classes/admin/emails/class-wc-notify-admin.php:161, classes/admin/emails/class-wc-notify-shipped.php:186, classes/admin/emails/class-wc-notify-vendor.php:294, classes/admin/emails/class-wcv-admin-notify-application.php:175, classes/admin/emails/class-wcv-admin-notify-product.php:178, classes/admin/emails/class-wcv-admin-notify-shipped.php:167, classes/admin/emails/class-wcv-customer-notify-shipped.php:166, classes/admin/emails/class-wcv-vendor-notify-application.php:153, classes/admin/emails/class-wcv-vendor-notify-approved.php:171, classes/admin/emails/class-wcv-vendor-notify-denied.php:189, classes/admin/emails/class-wcv-vendor-notify-order.php:206
987
  msgid "Email type"
988
  msgstr ""
989
 
990
+ #: classes/admin/emails/class-wc-approve-vendor.php:152, classes/admin/emails/class-wc-notify-admin.php:163, classes/admin/emails/class-wc-notify-shipped.php:188, classes/admin/emails/class-wc-notify-vendor.php:296, classes/admin/emails/class-wcv-admin-notify-application.php:177, classes/admin/emails/class-wcv-admin-notify-product.php:180, classes/admin/emails/class-wcv-admin-notify-shipped.php:169, classes/admin/emails/class-wcv-customer-notify-shipped.php:168, classes/admin/emails/class-wcv-vendor-notify-application.php:155, classes/admin/emails/class-wcv-vendor-notify-approved.php:173, classes/admin/emails/class-wcv-vendor-notify-denied.php:191, classes/admin/emails/class-wcv-vendor-notify-order.php:208
991
  msgid "Choose which format of email to send."
992
  msgstr ""
993
 
1116
  #. translators: %s: list of placeholders
1117
  #. translators: %s: list of placeholders
1118
  #. translators: %s: list of placeholders
1119
+ #: classes/admin/emails/class-wcv-admin-notify-application.php:149, classes/admin/emails/class-wcv-admin-notify-application.php:158, classes/admin/emails/class-wcv-admin-notify-product.php:164, classes/admin/emails/class-wcv-admin-notify-product.php:173, classes/admin/emails/class-wcv-admin-notify-shipped.php:153, classes/admin/emails/class-wcv-admin-notify-shipped.php:162, classes/admin/emails/class-wcv-customer-notify-shipped.php:152, classes/admin/emails/class-wcv-customer-notify-shipped.php:161, classes/admin/emails/class-wcv-vendor-notify-application.php:139, classes/admin/emails/class-wcv-vendor-notify-application.php:148, classes/admin/emails/class-wcv-vendor-notify-approved.php:148, classes/admin/emails/class-wcv-vendor-notify-approved.php:166, classes/admin/emails/class-wcv-vendor-notify-denied.php:158, classes/admin/emails/class-wcv-vendor-notify-denied.php:167, classes/admin/emails/class-wcv-vendor-notify-denied.php:184, classes/admin/emails/class-wcv-vendor-notify-order.php:172, classes/admin/emails/class-wcv-vendor-notify-order.php:181
1120
  msgid "Available placeholders: %s"
1121
  msgstr ""
1122
 
1123
+ #: classes/admin/emails/class-wcv-admin-notify-application.php:154, classes/admin/emails/class-wcv-admin-notify-product.php:169, classes/admin/emails/class-wcv-admin-notify-shipped.php:158, classes/admin/emails/class-wcv-customer-notify-shipped.php:157, classes/admin/emails/class-wcv-vendor-notify-application.php:144, classes/admin/emails/class-wcv-vendor-notify-approved.php:162, classes/admin/emails/class-wcv-vendor-notify-denied.php:180, classes/admin/emails/class-wcv-vendor-notify-order.php:177
1124
  msgid "Email heading"
1125
  msgstr ""
1126
 
1264
  msgid "New Customer Order"
1265
  msgstr ""
1266
 
1267
+ #: classes/admin/emails/class-wcv-vendor-notify-order.php:186
1268
  msgid "Totals Display"
1269
  msgstr ""
1270
 
1271
+ #: classes/admin/emails/class-wcv-vendor-notify-order.php:188
1272
  msgid "Choose how to display the product totals. Including commission or without or no totals at all."
1273
  msgstr ""
1274
 
1275
+ #: classes/admin/emails/class-wcv-vendor-notify-order.php:192
1276
  msgid "Both"
1277
  msgstr ""
1278
 
1279
+ #: classes/admin/emails/class-wcv-vendor-notify-order.php:195
1280
  msgid "None"
1281
  msgstr ""
1282
 
1283
+ #: classes/admin/emails/class-wcv-vendor-notify-order.php:200
1284
  msgid "Payment method"
1285
  msgstr ""
1286
 
1287
+ #: classes/admin/emails/class-wcv-vendor-notify-order.php:202
1288
  msgid "Include the payment method in the email"
1289
  msgstr ""
1290
 
1291
+ #: classes/admin/settings/class-wcv-settings-advanced.php:27, classes/admin/settings/class-wcv-settings-advanced.php:39, classes/admin/settings/class-wcv-settings-capabilities.php:108, classes/admin/settings/class-wcv-settings-display.php:45
1292
  msgid "Advanced"
1293
  msgstr ""
1294
 
1340
  msgid "Remove custom roles registered by WC Vendors."
1341
  msgstr ""
1342
 
1343
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:43, classes/admin/settings/class-wcv-settings-capabilities.php:102, classes/admin/settings/class-wcv-settings-commission.php:43, classes/admin/settings/class-wcv-settings-display.php:43, classes/admin/settings/class-wcv-settings-general.php:31, classes/admin/settings/class-wcv-settings-general.php:43, classes/admin/settings/class-wcv-settings-payments.php:44, classes/admin/views/setup/general.php:19
1344
  msgid "General"
1345
  msgstr ""
1346
 
1360
  msgid "This controls what product types the %s can create"
1361
  msgstr ""
1362
 
1363
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:81
1364
  msgid "Product Type Options"
1365
  msgstr ""
1366
 
1367
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:82
1368
  msgid "This controls what product type options the %s can use"
1369
  msgstr ""
1370
 
1371
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:88
1372
  msgid "Virtual"
1373
  msgstr ""
1374
 
1375
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:89
1376
  msgid "Downloadable"
1377
  msgstr ""
1378
 
1379
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:95
1380
  msgid "Product Data Tabs"
1381
  msgstr ""
1382
 
1383
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:96
1384
  msgid "This controls what product data tabs the %s can use"
1385
  msgstr ""
1386
 
1387
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:103
1388
  msgid "Inventory"
1389
  msgstr ""
1390
 
1391
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:105
1392
  msgid "Linked Products"
1393
  msgstr ""
1394
 
1395
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:106
1396
  msgid "Attributes"
1397
  msgstr ""
1398
 
1399
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:107
1400
  msgid "Variations"
1401
  msgstr ""
1402
 
1403
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:115
1404
  msgid "Featured Product"
1405
  msgstr ""
1406
 
1407
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:116
1408
  msgid "Allow %s to use the featured product option"
1409
  msgstr ""
1410
 
1411
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:123
1412
  msgid "Duplicate Product"
1413
  msgstr ""
1414
 
1415
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:124
1416
  msgid "Allow %s to duplicate products"
1417
  msgstr ""
1418
 
1419
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:131
1420
  msgid "SKU"
1421
  msgstr ""
1422
 
1423
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:132
1424
  msgid "Hide sku field from %s"
1425
  msgstr ""
1426
 
1427
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:139
1428
  msgid "Taxes"
1429
  msgstr ""
1430
 
1431
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:140
1432
  msgid "Hide tax fields from %s"
1433
  msgstr ""
1434
 
1435
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:156
1436
  msgid "Configure what order information a %s can view from an order"
1437
  msgstr ""
1438
 
1439
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:161
1440
  msgid "View Order Notes"
1441
  msgstr ""
1442
 
1443
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:162, classes/admin/views/setup/capabilities.php:102
1444
  msgid "Allow %s to view order notes"
1445
  msgstr ""
1446
 
1447
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:169
1448
  msgid "Add Order notes"
1449
  msgstr ""
1450
 
1451
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:170, classes/admin/views/setup/capabilities.php:115
1452
  msgid "Allow %s to add order notes."
1453
  msgstr ""
1454
 
1455
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:177
1456
  msgid "Customer Name"
1457
  msgstr ""
1458
 
1459
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:178
1460
  msgid "Allow %s to view customer name fields"
1461
  msgstr ""
1462
 
1463
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:185
1464
  msgid "Customer Billing Address"
1465
  msgstr ""
1466
 
1467
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:186
1468
  msgid "Allow %s to view customer billing address fields"
1469
  msgstr ""
1470
 
1471
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:193
1472
  msgid "Customer Shipping Address"
1473
  msgstr ""
1474
 
1475
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:194
1476
  msgid "Allow %s to view the customer shipping fields"
1477
  msgstr ""
1478
 
1479
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:201
1480
  msgid "Customer Email"
1481
  msgstr ""
1482
 
1483
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:202
1484
  msgid "Allow %s to view the customer email address"
1485
  msgstr ""
1486
 
1487
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:209
1488
  msgid "Customer Phone"
1489
  msgstr ""
1490
 
1491
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:210
1492
  msgid "Allow %s to view the customer phone number"
1493
  msgstr ""
1494
 
1495
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:225
1496
  msgid "Permissions"
1497
  msgstr ""
1498
 
1499
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:227
1500
  msgid "Enable or disable functionality for your %s"
1501
  msgstr ""
1502
 
1503
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:241
1504
  msgid "Submit Products"
1505
  msgstr ""
1506
 
1507
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:242, classes/admin/views/setup/capabilities.php:25
1508
  msgid "Allow %s to add/edit products"
1509
  msgstr ""
1510
 
1511
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:249
1512
  msgid "Edit Live Products"
1513
  msgstr ""
1514
 
1515
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:250, classes/admin/views/setup/capabilities.php:38
1516
  msgid "Allow %s to edit published (live) products"
1517
  msgstr ""
1518
 
1519
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:257
1520
  msgid "Publish Approval"
1521
  msgstr ""
1522
 
1523
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:258
1524
  msgid "Allow %s to publish products directly to the marketplace without requiring approval."
1525
  msgstr ""
1526
 
1527
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:274
1528
  msgid "View Orders"
1529
  msgstr ""
1530
 
1531
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:275, classes/admin/views/setup/capabilities.php:76
1532
  msgid "Allow %s to view orders"
1533
  msgstr ""
1534
 
1535
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:282
1536
  msgid "Export Orders"
1537
  msgstr ""
1538
 
1539
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:283, classes/admin/views/setup/capabilities.php:89
1540
  msgid "Allow %s to export their orders to a CSV file"
1541
  msgstr ""
1542
 
1543
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:290
1544
  msgid "Front End Sales Reports"
1545
  msgstr ""
1546
 
1547
+ #: classes/admin/settings/class-wcv-settings-capabilities.php:291
1548
  msgid "Allow %s to view sales table on the frontend on the %s dashboard page."
1549
  msgstr ""
1550
 
package.json CHANGED
@@ -1,6 +1,6 @@
1
  {
2
  "name": "wc-vendors",
3
- "version": "2.0.0",
4
  "private": true,
5
  "dependencies": {},
6
  "devDependencies": {
1
  {
2
  "name": "wc-vendors",
3
+ "version": "2.1.3",
4
  "private": true,
5
  "dependencies": {},
6
  "devDependencies": {
readme.txt CHANGED
@@ -1,13 +1,13 @@
1
  === WC Vendors Marketplace ===
2
  Contributors: digitalchild, benwcv, annawcvendors
3
- Tags: best marketplace, multi vendor marketplace, multi vendor, multi seller, woocommerce vendor, woocommerce marketplace, product vendors, vendor, vendors, wc multivendor, dokan, wc markpletace, commissions, commission rate, woocommerce product vendors
4
  Donate link: https://www.wcvendors.com/
5
  Author URI: https://www.wcvendors.com/
6
  Plugin URI: https://www.wcvendors.com/
7
  Requires at least: 4.4.0
8
  Requires PHP: 5.6
9
  Tested up to: 5.0.0
10
- Stable tag: 2.1.2
11
  License: GPLv2 or later
12
 
13
  The number one marketplace plugin for WooCommerce. Now you can allow anyone to open a store on your WooCommerce site!
@@ -145,34 +145,25 @@ WC Vendors Marketplace does not work with multisite WordPress. There are no plan
145
 
146
  == Changelog ==
147
 
 
 
 
 
 
 
 
 
 
148
  = Version 2.1.2 - 22nd October 2018 =
149
 
150
- * Updated: Tested with WooCommerce 3.5.0
151
- * Updated: Tested with Wordpress 5.0.0
152
  * Fixed: Error messages on product edit page
153
  * Fixed: Reverse commissions if order is trashed
154
  * Fixed: Added extra checks for vendor order method
155
  * Fixed: Load user locale when loading text domain
156
  * Fixed: Loopback request failure #453
157
 
158
- = Version 2.1.1 =
159
-
160
- * Added: Export Commission Order ID #460
161
- * Added: Export Commission Totals use filters #459
162
- * Added: Remove Ability to Register from the WP Login screen. #489
163
- * Fixed: Invalid variable reference
164
- * Fixed: Uninstall loading order to ensure table still exists when getting settings fields
165
- * Fixed: Incorrect capabilities set on initial install and via setup wizard
166
- * Fixed: Handle PayPal Adaptive Payments IPN status inconsistencies (#495)
167
- * Fixed: Incorrect javascript method name
168
- * Fixed: No terms and conditions warning (#494)
169
- * Fixed: Replace vendor with function call (#493)
170
- * Fixed: Update methods in the wrong location
171
- * Fixed: Line item id's incorrectly set
172
-
173
- Templates Updated:
174
- templates/dashboard/denied.php
175
-
176
  = Version 2.1.1 15th September 2018 =
177
 
178
  * Added: Export Commission Order ID #460
1
  === WC Vendors Marketplace ===
2
  Contributors: digitalchild, benwcv, annawcvendors
3
+ Tags: best marketplace, multi vendor marketplace, multi vendor, multi seller, woocommerce vendor, woocommerce marketplace, product vendors, vendor, vendors, wc multivendor, commissions, commission rate
4
  Donate link: https://www.wcvendors.com/
5
  Author URI: https://www.wcvendors.com/
6
  Plugin URI: https://www.wcvendors.com/
7
  Requires at least: 4.4.0
8
  Requires PHP: 5.6
9
  Tested up to: 5.0.0
10
+ Stable tag: 2.1.3
11
  License: GPLv2 or later
12
 
13
  The number one marketplace plugin for WooCommerce. Now you can allow anyone to open a store on your WooCommerce site!
145
 
146
  == Changelog ==
147
 
148
+ = Version 2.1.3 - 24th November 2018 =
149
+
150
+ * Updated: Treat product as vendor page if product author is vendor (#505)
151
+ * Updated: WordPress Coding Standards and general code cleanup thanks to Robert Devore
152
+ * Fixed: Add email filters and action hooks to vendor notify order email
153
+ * Fixed: Calculate tax without order details by geolocating user
154
+ * Fixed: Setup wizard menu item is visible on the dashboard menu #507
155
+ * Fixed: Commissions are calculated on integers #499
156
+
157
  = Version 2.1.2 - 22nd October 2018 =
158
 
159
+ * Updated: Support for WooCommerce 3.5.0
160
+ * Updated: Support for Wordpress 5.0.0
161
  * Fixed: Error messages on product edit page
162
  * Fixed: Reverse commissions if order is trashed
163
  * Fixed: Added extra checks for vendor order method
164
  * Fixed: Load user locale when loading text domain
165
  * Fixed: Loopback request failure #453
166
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
167
  = Version 2.1.1 15th September 2018 =
168
 
169
  * Added: Export Commission Order ID #460
templates/emails/plain/vendor-order-details.php CHANGED
@@ -19,6 +19,7 @@ do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plai
19
  /* translators: %s: Order ID. */
20
  echo wp_kses_post( wc_strtoupper( sprintf( __( 'Order number: %s', 'wc-vendors' ), $order->get_order_number() ) ) ) . "\n";
21
  echo wc_format_datetime( $order->get_date_created() ) . "\n"; // WPCS: XSS ok.
 
22
  echo "\n" . wcv_get_vendor_order_items( $order, array( // WPCS: XSS ok.
23
  'show_sku' => $sent_to_vendor,
24
  'vendor_id' => $vendor_id,
@@ -30,10 +31,12 @@ echo "\n" . wcv_get_vendor_order_items( $order, array( // WPCS: XSS ok.
30
  'sent_to_admin' => $sent_to_admin,
31
  'sent_to_vendor' => $sent_to_vendor,
32
  ) );
 
33
 
34
  echo "==========\n\n";
35
 
36
  $totals = wcv_get_vendor_item_totals( $order, $vendor_items, $vendor_id, $email, $totals_display );
 
37
 
38
  if ( $totals ) {
39
  foreach ( $totals as $total ) {
@@ -42,7 +45,9 @@ if ( $totals ) {
42
  }
43
 
44
  if ( $order->get_customer_note() ) {
 
45
  echo esc_html__( 'Note:', 'wc-vendors' ) . "\t " . wp_kses_post( wptexturize( $order->get_customer_note() ) ) . "\n";
 
46
  }
47
 
48
 
19
  /* translators: %s: Order ID. */
20
  echo wp_kses_post( wc_strtoupper( sprintf( __( 'Order number: %s', 'wc-vendors' ), $order->get_order_number() ) ) ) . "\n";
21
  echo wc_format_datetime( $order->get_date_created() ) . "\n"; // WPCS: XSS ok.
22
+ do_action( 'wcv_email_vendor_notify_order_before_order_items' ) . "\n";
23
  echo "\n" . wcv_get_vendor_order_items( $order, array( // WPCS: XSS ok.
24
  'show_sku' => $sent_to_vendor,
25
  'vendor_id' => $vendor_id,
31
  'sent_to_admin' => $sent_to_admin,
32
  'sent_to_vendor' => $sent_to_vendor,
33
  ) );
34
+ do_action( 'wcv_email_vendor_notify_order_after_order_items' ) . "\n";
35
 
36
  echo "==========\n\n";
37
 
38
  $totals = wcv_get_vendor_item_totals( $order, $vendor_items, $vendor_id, $email, $totals_display );
39
+ $totals = apply_filters( 'wcv_vendor_notify_order_item_totals', $totals, $order, $vendor_items, $vendor_id, $email, $totals_display );
40
 
41
  if ( $totals ) {
42
  foreach ( $totals as $total ) {
45
  }
46
 
47
  if ( $order->get_customer_note() ) {
48
+ do_action( 'wcv_vendor_notify_order_before_customer_note' ) . "\n";
49
  echo esc_html__( 'Note:', 'wc-vendors' ) . "\t " . wp_kses_post( wptexturize( $order->get_customer_note() ) ) . "\n";
50
+ do_action( 'wcv_vendor_notify_order_after_customer_note' ) . "\n";
51
  }
52
 
53
 
templates/emails/vendor-new-order.php CHANGED
@@ -34,6 +34,7 @@ $order_date = $order->get_date_created();
34
  </tr>
35
  </thead>
36
  <tbody>
 
37
  <?php
38
  echo wc_get_email_order_items( $order, array(
39
  'show_sku' => true,
@@ -42,7 +43,8 @@ $order_date = $order->get_date_created();
42
  'plain_text' => false,
43
  'sent_to_admin' => false,
44
  ) );
45
- ?>
 
46
  </tbody>
47
  <tfoot>
48
  <?php
34
  </tr>
35
  </thead>
36
  <tbody>
37
+ <?php do_action( 'wcv_after_vendor_new_order_items' ); ?>
38
  <?php
39
  echo wc_get_email_order_items( $order, array(
40
  'show_sku' => true,
43
  'plain_text' => false,
44
  'sent_to_admin' => false,
45
  ) );
46
+ ?>
47
+ <?php do_action( 'wcv_after_vendor_new_order_items' ); ?>
48
  </tbody>
49
  <tfoot>
50
  <?php
templates/emails/vendor-order-details.php CHANGED
@@ -45,6 +45,7 @@ do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plai
45
  </tr>
46
  </thead>
47
  <tbody>
 
48
  <?php
49
  echo wcv_get_vendor_order_items( $order, array( // WPCS: XSS ok.
50
  'show_sku' => $sent_to_vendor,
@@ -58,10 +59,13 @@ do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plai
58
  'sent_to_vendor' => $sent_to_vendor,
59
  ) );
60
  ?>
 
61
  </tbody>
62
  <tfoot>
63
  <?php
64
  $totals = wcv_get_vendor_item_totals( $order, $vendor_items, $vendor_id, $email, $totals_display );
 
 
65
 
66
  if ( $totals ) {
67
  $i = 0;
@@ -75,12 +79,16 @@ do_action( 'woocommerce_email_before_order_table', $order, $sent_to_admin, $plai
75
  <?php
76
  }
77
  }
 
 
 
78
  if ( $order->get_customer_note() ) {
79
  ?>
80
  <tr>
81
  <th class="td" scope="row" colspan="<?php echo $colspan; ?>" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Note:', 'wc-vendors' ); ?></th>
82
  <td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php echo wp_kses_post( wptexturize( $order->get_customer_note() ) ); ?></td>
83
  </tr>
 
84
  <?php
85
  }
86
  ?>
45
  </tr>
46
  </thead>
47
  <tbody>
48
+ <?php do_action( 'wcv_email_vendor_notify_order_before_order_items', $order, $sent_to_admin, $plain_text, $email ); ?>
49
  <?php
50
  echo wcv_get_vendor_order_items( $order, array( // WPCS: XSS ok.
51
  'show_sku' => $sent_to_vendor,
59
  'sent_to_vendor' => $sent_to_vendor,
60
  ) );
61
  ?>
62
+ <?php do_action( 'wcv_email_vendor_notify_order_after_order_items', $order, $sent_to_admin, $plain_text, $email ); ?>
63
  </tbody>
64
  <tfoot>
65
  <?php
66
  $totals = wcv_get_vendor_item_totals( $order, $vendor_items, $vendor_id, $email, $totals_display );
67
+
68
+ do_action( 'wcv_before_vendor_item_totals', $order, $vendor_id, $email, $totals, $colspan, $text_align );
69
 
70
  if ( $totals ) {
71
  $i = 0;
79
  <?php
80
  }
81
  }
82
+
83
+ do_action( 'wcv_before_vendor_item_totals', $order, $vendor_id, $email, $totals, $colspan, $text_align );
84
+
85
  if ( $order->get_customer_note() ) {
86
  ?>
87
  <tr>
88
  <th class="td" scope="row" colspan="<?php echo $colspan; ?>" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php esc_html_e( 'Note:', 'wc-vendors' ); ?></th>
89
  <td class="td" style="text-align:<?php echo esc_attr( $text_align ); ?>;"><?php echo wp_kses_post( wptexturize( $order->get_customer_note() ) ); ?></td>
90
  </tr>
91
+ <?php do_action( 'wcv_vendor_notify_order_after_customer_note', $order, $vendor_id, $email ); ?>
92
  <?php
93
  }
94
  ?>
trunk/assets/banner-1544x500.png DELETED
Binary file
trunk/assets/banner-772x250.png DELETED
Binary file
trunk/assets/css/_variables.scss DELETED
@@ -1,23 +0,0 @@
1
- /**
2
- * WooCommerce CSS Variables
3
- */
4
-
5
- $wcvendors: #005580;
6
- $wcvendors-light: #5897b6;
7
- $green: #7ad03a;
8
- $red: #a00;
9
- $orange: #ffba00;
10
- $blue: #2ea2cc;
11
-
12
- $primary: #a46497; // Primary color for buttons (alt)
13
- $primarytext: desaturate(lighten($primary, 50%), 18%); // Text on primary color bg
14
-
15
- $secondary: desaturate(lighten($primary, 40%), 21%); // Secondary buttons
16
- $secondarytext: desaturate(darken($secondary, 60%), 21%); // Text on secondary color bg
17
-
18
- $highlight: adjust-hue($primary, 150deg); // Prices, In stock labels, sales flash
19
- $highlightext: desaturate(lighten($highlight, 50%), 18%); // Text on highlight color bg
20
-
21
- $contentbg: #fff; // Content BG - Tabs (active state)
22
- $subtext: #777; // small, breadcrumbs etc
23
- $white: #fff;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/css/admin-orders.css DELETED
@@ -1,7 +0,0 @@
1
- .wp-list-table .column-order_id { width: 10%; }
2
- .wp-list-table .column-customer { width: 15%; }
3
- .wp-list-table .column-product { width: 35%; }
4
- .wp-list-table .column-total { width: 10%;}
5
- /*.wp-list-table .column-comments { width: 27.5%;}*/
6
- .wp-list-table .column-date { width: 15%;}
7
- .wp-list-table .column-status { width: 15%;}
 
 
 
 
 
 
 
trunk/assets/css/select2.min.css DELETED
@@ -1 +0,0 @@
1
- .select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb}
 
trunk/assets/css/wcv-activation.css DELETED
@@ -1,21 +0,0 @@
1
- /** activation.scss Styles applied to elements displayed on activation */
2
- /** Styling begins */
3
- div.wcvendors-message { overflow: hidden; position: relative; border-left-color: #005580 !important; }
4
-
5
- div.wcvendors-message p { max-width: 700px; }
6
-
7
- div.wcvendors-message p:last-child { max-width: inherit; }
8
-
9
- p.wcvendors-actions .button-primary, .wcvendors-message .button-primary { background: #005580; border-color: #005580; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #a36597; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #a36597; color: #fff; text-shadow: 0 -1px 1px #005580, 1px 0 1px #005580, 0 1px 1px #005580, -1px 0 1px #005580; }
10
-
11
- p.wcvendors-actions .button-primary:hover, p.wcvendors-actions .button-primary:focus, p.wcvendors-actions .button-primary:active, .wcvendors-message .button-primary:hover, .wcvendors-message .button-primary:focus, .wcvendors-message .button-primary:active { background: #005580; border-color: #005580; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #005580; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #005580; }
12
-
13
- p.wcvendors-actions a.wcvendors-message-close, .wcvendors-message a.wcvendors-message-close { position: absolute; top: 0; right: 0; padding: 10px 15px 10px 21px; font-size: 13px; line-height: 1.23076923; text-decoration: none; }
14
-
15
- p.wcvendors-actions a.wcvendors-message-close::before, .wcvendors-message a.wcvendors-message-close::before { position: absolute; top: 8px; left: 0; -webkit-transition: all 0.1s ease-in-out; transition: all 0.1s ease-in-out; }
16
-
17
- p.wcvendors-actions .button-primary, p.wcvendors-actions .button-secondary, .wcvendors-message .button-primary, .wcvendors-message .button-secondary { text-decoration: none !important; }
18
-
19
- p.wcvendors-actions .twitter-share-button, .wcvendors-message .twitter-share-button { margin-top: -3px; margin-left: 3px; vertical-align: middle; }
20
-
21
- p.wcvendors-actions, .wcvendors-about-text { margin-bottom: 1em !important; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/css/wcv-activation.min.css DELETED
@@ -1 +0,0 @@
1
- div.wcvendors-message{overflow:hidden;position:relative;border-left-color:#005580!important}div.wcvendors-message p{max-width:700px}div.wcvendors-message p:last-child{max-width:inherit}.wcvendors-message .button-primary,p.wcvendors-actions .button-primary{background:#005580;border-color:#005580;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #005580,1px 0 1px #005580,0 1px 1px #005580,-1px 0 1px #005580}.wcvendors-message .button-primary:active,.wcvendors-message .button-primary:focus,.wcvendors-message .button-primary:hover,p.wcvendors-actions .button-primary:active,p.wcvendors-actions .button-primary:focus,p.wcvendors-actions .button-primary:hover{background:#005580;border-color:#005580;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #005580;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #005580}.wcvendors-message a.wcvendors-message-close,p.wcvendors-actions a.wcvendors-message-close{position:absolute;top:0;right:0;padding:10px 15px 10px 21px;font-size:13px;line-height:1.23076923;text-decoration:none}.wcvendors-message a.wcvendors-message-close::before,p.wcvendors-actions a.wcvendors-message-close::before{position:absolute;top:8px;left:0;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.wcvendors-message .button-primary,.wcvendors-message .button-secondary,p.wcvendors-actions .button-primary,p.wcvendors-actions .button-secondary{text-decoration:none!important}.wcvendors-message .twitter-share-button,p.wcvendors-actions .twitter-share-button{margin-top:-3px;margin-left:3px;vertical-align:middle}.wcvendors-about-text,p.wcvendors-actions{margin-bottom:1em!important}
 
trunk/assets/css/wcv-activation.scss DELETED
@@ -1,68 +0,0 @@
1
- /**
2
- * activation.scss
3
- * Styles applied to elements displayed on activation
4
- */
5
-
6
- /**
7
- * Styling begins
8
- */
9
- div.wcvendors-message {
10
- overflow: hidden;
11
- position: relative;
12
- border-left-color: #005580 !important;
13
- p {
14
- max-width: 700px;
15
- }
16
- p:last-child {
17
- max-width: inherit;
18
- }
19
- }
20
-
21
- p.wcvendors-actions,
22
- .wcvendors-message {
23
- .button-primary {
24
- background: #005580;
25
- border-color: #005580;
26
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #a36597;
27
- color: #fff;
28
- text-shadow: 0 -1px 1px #005580, 1px 0 1px #005580, 0 1px 1px #005580, -1px 0 1px #005580;
29
-
30
- &:hover, &:focus, &:active {
31
- background: #005580;
32
- border-color: #005580;
33
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #005580;
34
- }
35
- }
36
-
37
- a.wcvendors-message-close {
38
- position: absolute;
39
- top: 0;
40
- right: 0;
41
- padding: 10px 15px 10px 21px;
42
- font-size: 13px;
43
- line-height: 1.23076923;
44
- text-decoration: none;
45
- &::before {
46
- position: absolute;
47
- top: 8px;
48
- left: 0;
49
- transition: all 0.1s ease-in-out;
50
- }
51
- }
52
-
53
- .button-primary,
54
- .button-secondary {
55
- text-decoration: none !important;
56
- }
57
-
58
- .twitter-share-button {
59
- margin-top: -3px;
60
- margin-left: 3px;
61
- vertical-align: middle;
62
- }
63
- }
64
-
65
- p.wcvendors-actions,
66
- .wcvendors-about-text {
67
- margin-bottom: 1em !important;
68
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/css/wcv-admin.css DELETED
@@ -1,164 +0,0 @@
1
- .wcv_addons_wrap { max-width: 1200px; }
2
-
3
- .wcv_addons_wrap h1.search-form-title { clear: left; padding: 0; }
4
-
5
- .wcv_addons_wrap .update-plugins .update-count { background-color: #d54e21; border-radius: 10px; color: #fff; display: inline-block; font-size: 9px; font-weight: 600; line-height: 17px; margin: 1px 0 0 2px; padding: 0 6px; vertical-align: text-top; }
6
-
7
- .wcv_addons_wrap .addons-featured { margin: 0; }
8
-
9
- .wcv_addons_wrap ul.feature-list { list-style: inherit; }
10
-
11
- .wcv_addons_wrap ul.feature-list li { margin-left: 20px; }
12
-
13
- .wcv_addons_wrap ul.subsubsub.subsubsub { margin: -2px 0 12px; }
14
-
15
- .wcv_addons_wrap .subsubsub li::after { content: '|'; }
16
-
17
- .wcv_addons_wrap .subsubsub li:last-child::after { content: ''; }
18
-
19
- .wcv_addons_wrap .addons-banner-block-item-icon, .wcv_addons_wrap .addons-column-block-item-icon { -webkit-box-align: center; -ms-flex-align: center; align-items: center; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; }
20
-
21
- .wcv_addons_wrap .addons-banner-block, .wcv_addons_wrap .addons-wcs-banner-block { background: #ffffff; border: 1px solid #ddd; margin: 0 0 1em 0; padding: 2em 2em 1em; }
22
-
23
- .wcv_addons_wrap .addons-banner-block img { height: 62px; }
24
-
25
- .wcv_addons_wrap .addons-banner-block p { margin: 0 0 20px; }
26
-
27
- .wcv_addons_wrap .addons-banner-block-items { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -ms-flex-wrap: wrap; flex-wrap: wrap; -ms-flex-pack: distribute; justify-content: space-around; margin: 0 -10px 0 -10px; }
28
-
29
- .wcv_addons_wrap .addons-banner-block-item { border: 1px solid #e6e6e6; border-radius: 3px; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; margin: 1em; min-width: 200px; width: 30%; }
30
-
31
- .wcv_addons_wrap .addons-banner-block-item-icon { background: #f7f7f7; height: 143px; }
32
-
33
- .wcv_addons_wrap .addons-banner-block-item-content { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; height: 184px; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; padding: 24px; }
34
-
35
- .wcv_addons_wrap .addons-banner-block-item-content h3 { margin-top: 0; }
36
-
37
- .wcv_addons_wrap .addons-banner-block-item-content p { margin: 0 0 auto; }
38
-
39
- .wcv_addons_wrap .addons-wcs-banner-block { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; }
40
-
41
- .wcv_addons_wrap .addons-wcs-banner-block-image { background: #f7f7f7; border: 1px solid #e6e6e6; margin-right: 2em; width: 400px; padding: 1em; text-align: center; }
42
-
43
- .wcv_addons_wrap .addons-wcs-banner-block-image .addons-img { margin: auto 0; max-height: 350px; max-width: 350px; }
44
-
45
- .wcv_addons_wrap .addons-shipping-methods .addons-wcs-banner-block { margin-left: 0; margin-right: 0; margin-top: 1em; }
46
-
47
- .wcv_addons_wrap .addons-wcs-banner-block-content { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -ms-flex-pack: distribute; justify-content: space-around; -ms-flex-item-align: stretch; align-self: stretch; padding: 1em 0; }
48
-
49
- .wcv_addons_wrap .addons-wcs-banner-block-content h1 { padding-bottom: 0; }
50
-
51
- .wcv_addons_wrap .addons-wcs-banner-block-content p { margin-bottom: 0; }
52
-
53
- .wcv_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo { max-width: 40px; }
54
-
55
- .wcv_addons_wrap .addons-column-section { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -ms-flex-wrap: wrap; flex-wrap: wrap; -ms-flex-pack: distribute; justify-content: space-around; }
56
-
57
- .wcv_addons_wrap .addons-column { -webkit-box-flex: 1; -ms-flex: 1; flex: 1; width: 50%; padding: 0 .5em; }
58
-
59
- .wcv_addons_wrap .addons-column:nth-child(2) { margin-right: 0; }
60
-
61
- .wcv_addons_wrap .addons-small-light-block, .wcv_addons_wrap .addons-small-dark-block, .wcv_addons_wrap .addons-column-block { -webkit-box-sizing: border-box; box-sizing: border-box; border: 1px solid #ddd; margin: 0 0 1em; padding: 20px; }
62
-
63
- .wcv_addons_wrap .addons-column-block img { max-height: 50px; max-width: 50px; }
64
-
65
- .wcv_addons_wrap .addons-small-light-block, .wcv_addons_wrap .addons-column-block { background: #ffffff; }
66
-
67
- .wcv_addons_wrap .addons-column-block-left { float: left; }
68
-
69
- .wcv_addons_wrap .addons-column-block-right { float: right; }
70
-
71
- .wcv_addons_wrap .addons-column-block-item { border-top: 2px solid #f9f9f9; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-direction: row; flex-direction: row; -ms-flex-wrap: wrap; flex-wrap: wrap; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; margin: 0 -20px; padding: 20px; }
72
-
73
- .wcv_addons_wrap .addons-column-block-item-icon { background: #f7f7f7; border: 1px solid #e6e6e6; height: 100px; margin: 0 10px 10px 0; width: 100px; }
74
-
75
- .wcv_addons_wrap .addons-column-block-item-content { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; -ms-flex-wrap: wrap; flex-wrap: wrap; height: 20%; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; min-width: 200px; }
76
-
77
- .wcv_addons_wrap .addons-column-block-item-content h2 { float: left; margin-top: 8px; }
78
-
79
- .wcv_addons_wrap .addons-column-block-item-content a { float: right; }
80
-
81
- .wcv_addons_wrap .addons-column-block-item-content p { float: left; }
82
-
83
- .wcv_addons_wrap .addons-banner-block-item, .wcv_addons_wrap .addons-column-block-item { display: none; }
84
-
85
- .wcv_addons_wrap .addons-banner-block-item:nth-child(-n+3) { display: block; }
86
-
87
- .wcv_addons_wrap .addons-column-block-item:nth-of-type(-n+3) { display: -webkit-box; display: -ms-flexbox; display: flex; }
88
-
89
- .wcv_addons_wrap .addons-small-dark-block { background-color: #54687d; text-align: center; }
90
-
91
- .wcv_addons_wrap .addons-small-dark-items { display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; -ms-flex-pack: distribute; justify-content: space-around; }
92
-
93
- .wcv_addons_wrap .addons-small-dark-item { margin: 0 0 20px; }
94
-
95
- .wcv_addons_wrap .addons-small-dark-block h1 { color: #ffffff; }
96
-
97
- .wcv_addons_wrap .addons-small-dark-block p { color: #fafafa; }
98
-
99
- .wcv_addons_wrap .addons-small-dark-item-icon img { height: 30px; }
100
-
101
- .wcv_addons_wrap .addons-small-dark-item a { margin: 28px auto 0; }
102
-
103
- .wcv_addons_wrap .addons-small-light-block { display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; }
104
-
105
- .wcv_addons_wrap .addons-small-light-block h1 { margin-top: -12px; }
106
-
107
- .wcv_addons_wrap .addons-small-light-block p { margin-top: 0; }
108
-
109
- .wcv_addons_wrap .addons-small-light-block img { height: 225px; margin: 0 0 0 -20px; }
110
-
111
- .wcv_addons_wrap .addons-small-light-block-content { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-flex: 1; -ms-flex: 1 1 100px; flex: 1 1 100px; -webkit-box-orient: vertical; -webkit-box-direction: normal; -ms-flex-direction: column; flex-direction: column; -ms-flex-pack: distribute; justify-content: space-around; }
112
-
113
- .wcv_addons_wrap .addons-small-light-block-buttons { display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; }
114
-
115
- .wcv_addons_wrap .addons-small-light-block-content a { width: 48%; }
116
-
117
- .wcv_addons_wrap .product-addons-button { cursor: pointer; display: block; height: 37px; line-height: 37px; text-align: center; text-decoration: none; width: 124px; }
118
-
119
- .wcv_addons_wrap .product-addons-button-solid { background-color: #005580; color: #ffffff; }
120
-
121
- .wcv_addons_wrap .addons-button { border-radius: 3px; cursor: pointer; display: block; height: 37px; line-height: 37px; text-align: center; text-decoration: none; width: 124px; }
122
-
123
- .wcv_addons_wrap .addons-button-solid { background-color: #005580; color: #ffffff; }
124
-
125
- .wcv_addons_wrap .addons-button-solid:hover { color: #ffffff; opacity: 0.8; }
126
-
127
- .wcv_addons_wrap .addons-button-outline-green { border: 1px solid #73ae39; color: #73ae39; }
128
-
129
- .wcv_addons_wrap .addons-button-outline-green:hover { color: #73ae39; opacity: 0.8; }
130
-
131
- .wcv_addons_wrap .addons-button-outline-white { border: 1px solid #ffffff; color: #ffffff; }
132
-
133
- .wcv_addons_wrap .addons-button-outline-white:hover { color: #ffffff; opacity: 0.8; }
134
-
135
- .wcv_addons_wrap .addons-button-installed { background: #e6e6e6; color: #3c3c3c; }
136
-
137
- .wcv_addons_wrap .addons-button-installed:hover { color: #3c3c3c; opacity: 0.8; }
138
-
139
- @media only screen and (max-width: 400px) { .wcv_addons_wrap .addons-featured { margin: -1% -5%; }
140
- .wcv_addons_wrap .addons-button { width: 100%; }
141
- .wcv_addons_wrap .addons-small-dark-item { width: 100%; }
142
- .wcv_addons_wrap .addons-column-block-item-icon { background: none; border: none; height: 75px; margin: 0 10px 10px 0; width: 75px; } }
143
-
144
- .wcv_addons_wrap .colorpickpreview { padding: 7px 0; line-height: 1em; display: inline-block; width: 26px; border: 1px solid #ddd; font-size: 14px; }
145
-
146
- .wcv_addons_wrap .products { overflow: hidden; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -ms-flex-flow: row; flex-flow: row; -ms-flex-wrap: wrap; flex-wrap: wrap; margin: 0 -.5em; }
147
-
148
- .wcv_addons_wrap .products li { float: left; border: 1px solid #ddd; margin: 0 .5em 1em !important; padding: 0; vertical-align: top; width: 25%; min-width: 280px; min-height: 220px; -webkit-box-flex: 1; -ms-flex: 1; flex: 1; overflow: hidden; background: #f5f5f5; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), inset 0 -1px 0 rgba(0, 0, 0, 0.1); }
149
-
150
- .wcv_addons_wrap .products li a { text-decoration: none; color: inherit; display: block; height: 100%; }
151
-
152
- .wcv_addons_wrap .products li a .product-img-wrap { background: #fff; display: block; }
153
-
154
- .wcv_addons_wrap .products li a img { max-width: 258px; max-height: 24px; padding: 17px 20px; display: block; margin: 0; background: #fff; border-right: 260px solid #fff; }
155
-
156
- .wcv_addons_wrap .products li a img.extension-thumb + h3 { display: none; }
157
-
158
- .wcv_addons_wrap .products li a .price { display: none; }
159
-
160
- .wcv_addons_wrap .products li a h2, .wcv_addons_wrap .products li a h3 { margin: 0 !important; padding: 20px !important; background: #fff; }
161
-
162
- .wcv_addons_wrap .products li a p { padding: 20px !important; margin: 0 !important; border-top: 1px solid #f1f1f1; }
163
-
164
- .wcv_addons_wrap .products li a:hover, .wcv_addons_wrap .products li a:focus { background-color: #fff; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/css/wcv-admin.min.css DELETED
@@ -1 +0,0 @@
1
- .wcv_addons_wrap{max-width:1200px}.wcv_addons_wrap h1.search-form-title{clear:left;padding:0}.wcv_addons_wrap .update-plugins .update-count{background-color:#d54e21;border-radius:10px;color:#fff;display:inline-block;font-size:9px;font-weight:600;line-height:17px;margin:1px 0 0 2px;padding:0 6px;vertical-align:text-top}.wcv_addons_wrap .addons-featured{margin:0}.wcv_addons_wrap ul.feature-list{list-style:inherit}.wcv_addons_wrap ul.feature-list li{margin-left:20px}.wcv_addons_wrap ul.subsubsub.subsubsub{margin:-2px 0 12px}.wcv_addons_wrap .subsubsub li::after{content:'|'}.wcv_addons_wrap .subsubsub li:last-child::after{content:''}.wcv_addons_wrap .addons-banner-block-item-icon,.wcv_addons_wrap .addons-column-block-item-icon{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.wcv_addons_wrap .addons-banner-block,.wcv_addons_wrap .addons-wcs-banner-block{background:#fff;border:1px solid #ddd;margin:0 0 1em 0;padding:2em 2em 1em}.wcv_addons_wrap .addons-banner-block img{height:62px}.wcv_addons_wrap .addons-banner-block p{margin:0 0 20px}.wcv_addons_wrap .addons-banner-block-items{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:distribute;justify-content:space-around;margin:0 -10px 0 -10px}.wcv_addons_wrap .addons-banner-block-item{border:1px solid #e6e6e6;border-radius:3px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:1em;min-width:200px;width:30%}.wcv_addons_wrap .addons-banner-block-item-icon{background:#f7f7f7;height:143px}.wcv_addons_wrap .addons-banner-block-item-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:184px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:24px}.wcv_addons_wrap .addons-banner-block-item-content h3{margin-top:0}.wcv_addons_wrap .addons-banner-block-item-content p{margin:0 0 auto}.wcv_addons_wrap .addons-wcs-banner-block{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.wcv_addons_wrap .addons-wcs-banner-block-image{background:#f7f7f7;border:1px solid #e6e6e6;margin-right:2em;width:400px;padding:1em;text-align:center}.wcv_addons_wrap .addons-wcs-banner-block-image .addons-img{margin:auto 0;max-height:350px;max-width:350px}.wcv_addons_wrap .addons-shipping-methods .addons-wcs-banner-block{margin-left:0;margin-right:0;margin-top:1em}.wcv_addons_wrap .addons-wcs-banner-block-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around;-ms-flex-item-align:stretch;align-self:stretch;padding:1em 0}.wcv_addons_wrap .addons-wcs-banner-block-content h1{padding-bottom:0}.wcv_addons_wrap .addons-wcs-banner-block-content p{margin-bottom:0}.wcv_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo{max-width:40px}.wcv_addons_wrap .addons-column-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:distribute;justify-content:space-around}.wcv_addons_wrap .addons-column{-webkit-box-flex:1;-ms-flex:1;flex:1;width:50%;padding:0 .5em}.wcv_addons_wrap .addons-column:nth-child(2){margin-right:0}.wcv_addons_wrap .addons-column-block,.wcv_addons_wrap .addons-small-dark-block,.wcv_addons_wrap .addons-small-light-block{-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ddd;margin:0 0 1em;padding:20px}.wcv_addons_wrap .addons-column-block img{max-height:50px;max-width:50px}.wcv_addons_wrap .addons-column-block,.wcv_addons_wrap .addons-small-light-block{background:#fff}.wcv_addons_wrap .addons-column-block-left{float:left}.wcv_addons_wrap .addons-column-block-right{float:right}.wcv_addons_wrap .addons-column-block-item{border-top:2px solid #f9f9f9;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:0 -20px;padding:20px}.wcv_addons_wrap .addons-column-block-item-icon{background:#f7f7f7;border:1px solid #e6e6e6;height:100px;margin:0 10px 10px 0;width:100px}.wcv_addons_wrap .addons-column-block-item-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap;height:20%;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;min-width:200px}.wcv_addons_wrap .addons-column-block-item-content h2{float:left;margin-top:8px}.wcv_addons_wrap .addons-column-block-item-content a{float:right}.wcv_addons_wrap .addons-column-block-item-content p{float:left}.wcv_addons_wrap .addons-banner-block-item,.wcv_addons_wrap .addons-column-block-item{display:none}.wcv_addons_wrap .addons-banner-block-item:nth-child(-n+3){display:block}.wcv_addons_wrap .addons-column-block-item:nth-of-type(-n+3){display:-webkit-box;display:-ms-flexbox;display:flex}.wcv_addons_wrap .addons-small-dark-block{background-color:#54687d;text-align:center}.wcv_addons_wrap .addons-small-dark-items{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:distribute;justify-content:space-around}.wcv_addons_wrap .addons-small-dark-item{margin:0 0 20px}.wcv_addons_wrap .addons-small-dark-block h1{color:#fff}.wcv_addons_wrap .addons-small-dark-block p{color:#fafafa}.wcv_addons_wrap .addons-small-dark-item-icon img{height:30px}.wcv_addons_wrap .addons-small-dark-item a{margin:28px auto 0}.wcv_addons_wrap .addons-small-light-block{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.wcv_addons_wrap .addons-small-light-block h1{margin-top:-12px}.wcv_addons_wrap .addons-small-light-block p{margin-top:0}.wcv_addons_wrap .addons-small-light-block img{height:225px;margin:0 0 0 -20px}.wcv_addons_wrap .addons-small-light-block-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 100px;flex:1 1 100px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around}.wcv_addons_wrap .addons-small-light-block-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.wcv_addons_wrap .addons-small-light-block-content a{width:48%}.wcv_addons_wrap .product-addons-button{cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wcv_addons_wrap .product-addons-button-solid{background-color:#005580;color:#fff}.wcv_addons_wrap .addons-button{border-radius:3px;cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wcv_addons_wrap .addons-button-solid{background-color:#005580;color:#fff}.wcv_addons_wrap .addons-button-solid:hover{color:#fff;opacity:.8}.wcv_addons_wrap .addons-button-outline-green{border:1px solid #73ae39;color:#73ae39}.wcv_addons_wrap .addons-button-outline-green:hover{color:#73ae39;opacity:.8}.wcv_addons_wrap .addons-button-outline-white{border:1px solid #fff;color:#fff}.wcv_addons_wrap .addons-button-outline-white:hover{color:#fff;opacity:.8}.wcv_addons_wrap .addons-button-installed{background:#e6e6e6;color:#3c3c3c}.wcv_addons_wrap .addons-button-installed:hover{color:#3c3c3c;opacity:.8}@media only screen and (max-width:400px){.wcv_addons_wrap .addons-featured{margin:-1% -5%}.wcv_addons_wrap .addons-button{width:100%}.wcv_addons_wrap .addons-small-dark-item{width:100%}.wcv_addons_wrap .addons-column-block-item-icon{background:0 0;border:none;height:75px;margin:0 10px 10px 0;width:75px}}.wcv_addons_wrap .colorpickpreview{padding:7px 0;line-height:1em;display:inline-block;width:26px;border:1px solid #ddd;font-size:14px}.wcv_addons_wrap .products{overflow:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row;flex-flow:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 -.5em}.wcv_addons_wrap .products li{float:left;border:1px solid #ddd;margin:0 .5em 1em!important;padding:0;vertical-align:top;width:25%;min-width:280px;min-height:220px;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;background:#f5f5f5;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1)}.wcv_addons_wrap .products li a{text-decoration:none;color:inherit;display:block;height:100%}.wcv_addons_wrap .products li a .product-img-wrap{background:#fff;display:block}.wcv_addons_wrap .products li a img{max-width:258px;max-height:24px;padding:17px 20px;display:block;margin:0;background:#fff;border-right:260px solid #fff}.wcv_addons_wrap .products li a img.extension-thumb+h3{display:none}.wcv_addons_wrap .products li a .price{display:none}.wcv_addons_wrap .products li a h2,.wcv_addons_wrap .products li a h3{margin:0!important;padding:20px!important;background:#fff}.wcv_addons_wrap .products li a p{padding:20px!important;margin:0!important;border-top:1px solid #f1f1f1}.wcv_addons_wrap .products li a:focus,.wcv_addons_wrap .products li a:hover{background-color:#fff}
 
trunk/assets/css/wcv-admin.scss DELETED
@@ -1,483 +0,0 @@
1
- .wcv_addons_wrap {
2
- max-width: 1200px;
3
-
4
- h1.search-form-title {
5
- clear: left;
6
- padding: 0;
7
- }
8
-
9
- .update-plugins .update-count {
10
- background-color: #d54e21;
11
- border-radius: 10px;
12
- color: #fff;
13
- display: inline-block;
14
- font-size: 9px;
15
- font-weight: 600;
16
- line-height: 17px;
17
- margin: 1px 0 0 2px;
18
- padding: 0 6px;
19
- vertical-align: text-top;
20
- }
21
-
22
- .addons-featured {
23
- margin: 0;
24
- }
25
-
26
- ul.feature-list {
27
- list-style: inherit;
28
-
29
- li {
30
- margin-left: 20px;
31
- }
32
- }
33
-
34
- ul.subsubsub.subsubsub {
35
- margin: -2px 0 12px;
36
- }
37
-
38
- .subsubsub li::after {
39
- content: '|';
40
- }
41
-
42
- .subsubsub li:last-child::after {
43
- content: '';
44
- }
45
-
46
- .addons-banner-block-item-icon,
47
- .addons-column-block-item-icon {
48
- align-items: center;
49
- display: flex;
50
- justify-content: center;
51
- }
52
-
53
- .addons-banner-block,
54
- .addons-wcs-banner-block {
55
- background: #ffffff;
56
- border: 1px solid #ddd;
57
- margin: 0 0 1em 0;
58
- padding: 2em 2em 1em;
59
- }
60
-
61
- .addons-banner-block img {
62
- height: 62px;
63
- }
64
-
65
- .addons-banner-block p {
66
- margin: 0 0 20px;
67
- }
68
-
69
- .addons-banner-block-items {
70
- display: flex;
71
- flex-direction: row;
72
- flex-wrap: wrap;
73
- justify-content: space-around;
74
- margin: 0 -10px 0 -10px;
75
- }
76
-
77
- .addons-banner-block-item {
78
- border: 1px solid #e6e6e6;
79
- border-radius: 3px;
80
- flex: 1;
81
- margin: 1em;
82
- min-width: 200px;
83
- width: 30%;
84
- }
85
-
86
- .addons-banner-block-item-icon {
87
- background: #f7f7f7;
88
- height: 143px;
89
- }
90
-
91
- .addons-banner-block-item-content {
92
- display: flex;
93
- flex-direction: column;
94
- height: 184px;
95
- justify-content: space-between;
96
- padding: 24px;
97
- }
98
-
99
- .addons-banner-block-item-content h3 {
100
- margin-top: 0;
101
- }
102
-
103
- .addons-banner-block-item-content p {
104
- margin: 0 0 auto;
105
- }
106
-
107
- .addons-wcs-banner-block {
108
- display: flex;
109
- align-items: center;
110
- }
111
-
112
- .addons-wcs-banner-block-image {
113
- background: #f7f7f7;
114
- border: 1px solid #e6e6e6;
115
- margin-right: 2em;
116
- width: 400px;
117
- padding: 1em;
118
- text-align: center;
119
-
120
- .addons-img {
121
- margin: auto 0;
122
- max-height: 350px;
123
- max-width: 350px;
124
- }
125
- }
126
-
127
- .addons-shipping-methods .addons-wcs-banner-block {
128
- margin-left: 0;
129
- margin-right: 0;
130
- margin-top: 1em;
131
- }
132
-
133
- .addons-wcs-banner-block-content {
134
- display: flex;
135
- flex-direction: column;
136
- justify-content: space-around;
137
- align-self: stretch;
138
- padding: 1em 0;
139
-
140
- h1 {
141
- padding-bottom: 0;
142
- }
143
-
144
- p {
145
- margin-bottom: 0;
146
- }
147
-
148
- .wcs-service-logo {
149
- max-width: 40px;
150
- }
151
- }
152
-
153
- .addons-column-section {
154
- display: flex;
155
- flex-direction: row;
156
- flex-wrap: wrap;
157
- justify-content: space-around;
158
- }
159
-
160
- .addons-column {
161
- flex: 1;
162
- width: 50%;
163
- padding: 0 .5em;
164
- }
165
-
166
- .addons-column:nth-child(2) {
167
- margin-right: 0;
168
- }
169
-
170
- .addons-small-light-block,
171
- .addons-small-dark-block,
172
- .addons-column-block {
173
- box-sizing: border-box;
174
- border: 1px solid #ddd;
175
- margin: 0 0 1em;
176
- padding: 20px;
177
- }
178
-
179
- .addons-column-block img {
180
- max-height: 50px;
181
- max-width: 50px;
182
- }
183
-
184
- .addons-small-light-block,
185
- .addons-column-block {
186
- background: #ffffff;
187
- }
188
-
189
- .addons-column-block-left {
190
- float: left;
191
- }
192
-
193
- .addons-column-block-right {
194
- float: right;
195
- }
196
-
197
- .addons-column-block-item {
198
- border-top: 2px solid #f9f9f9;
199
- flex-direction: row;
200
- flex-wrap: wrap;
201
- justify-content: space-between;
202
- margin: 0 -20px;
203
- padding: 20px;
204
- }
205
-
206
- .addons-column-block-item-icon {
207
- background: #f7f7f7;
208
- border: 1px solid #e6e6e6;
209
- height: 100px;
210
- margin: 0 10px 10px 0;
211
- width: 100px;
212
- }
213
-
214
- .addons-column-block-item-content {
215
- display: flex;
216
- flex: 1;
217
- flex-wrap: wrap;
218
- height: 20%;
219
- justify-content: space-between;
220
- min-width: 200px;
221
- }
222
-
223
- .addons-column-block-item-content h2 {
224
- float: left;
225
- margin-top: 8px;
226
- }
227
-
228
- .addons-column-block-item-content a {
229
- float: right;
230
- }
231
-
232
- .addons-column-block-item-content p {
233
- float: left;
234
- }
235
-
236
- .addons-banner-block-item,
237
- .addons-column-block-item {
238
- display: none;
239
- }
240
-
241
- .addons-banner-block-item:nth-child(-n+3) {
242
- display: block;
243
- }
244
- .addons-column-block-item:nth-of-type(-n+3) {
245
- display: flex;
246
- }
247
-
248
- .addons-small-dark-block {
249
- background-color: #54687d;
250
- text-align: center;
251
- }
252
-
253
- .addons-small-dark-items {
254
- display: flex;
255
- flex-wrap: wrap;
256
- justify-content: space-around;
257
- }
258
-
259
- .addons-small-dark-item {
260
- margin: 0 0 20px;
261
- }
262
-
263
- .addons-small-dark-block h1 {
264
- color: #ffffff;
265
- }
266
-
267
- .addons-small-dark-block p {
268
- color: #fafafa;
269
- }
270
-
271
- .addons-small-dark-item-icon img {
272
- height: 30px;
273
- }
274
-
275
- .addons-small-dark-item a {
276
- margin: 28px auto 0;
277
- }
278
-
279
- .addons-small-light-block {
280
- display: flex;
281
- flex-wrap: wrap;
282
- }
283
-
284
- .addons-small-light-block h1 {
285
- margin-top: -12px;
286
- }
287
-
288
- .addons-small-light-block p {
289
- margin-top: 0;
290
- }
291
-
292
- .addons-small-light-block img {
293
- height: 225px;
294
- margin: 0 0 0 -20px;
295
- }
296
-
297
- .addons-small-light-block-content {
298
- display: flex;
299
- flex: 1 1 100px;
300
- flex-direction: column;
301
- justify-content: space-around;
302
- }
303
-
304
- .addons-small-light-block-buttons {
305
- display: flex;
306
- justify-content: space-between;
307
- }
308
-
309
- .addons-small-light-block-content a {
310
- width: 48%;
311
- }
312
-
313
- .product-addons-button {
314
- // border-radius: 3px;
315
- cursor: pointer;
316
- display: block;
317
- height: 37px;
318
- line-height: 37px;
319
- text-align: center;
320
- text-decoration: none;
321
- width: 124px;
322
- }
323
-
324
- .product-addons-button-solid {
325
- background-color: #005580;
326
- color: #ffffff;
327
- }
328
-
329
- .addons-button {
330
- border-radius: 3px;
331
- cursor: pointer;
332
- display: block;
333
- height: 37px;
334
- line-height: 37px;
335
- text-align: center;
336
- text-decoration: none;
337
- width: 124px;
338
- }
339
-
340
- .addons-button-solid {
341
- background-color: #005580;
342
- color: #ffffff;
343
- }
344
-
345
- .addons-button-solid:hover {
346
- color: #ffffff;
347
- opacity: 0.8;
348
- }
349
-
350
- .addons-button-outline-green {
351
- border: 1px solid #73ae39;
352
- color: #73ae39;
353
- }
354
-
355
- .addons-button-outline-green:hover {
356
- color: #73ae39;
357
- opacity: 0.8;
358
- }
359
-
360
- .addons-button-outline-white {
361
- border: 1px solid #ffffff;
362
- color: #ffffff;
363
- }
364
-
365
- .addons-button-outline-white:hover {
366
- color: #ffffff;
367
- opacity: 0.8;
368
- }
369
-
370
- .addons-button-installed {
371
- background: #e6e6e6;
372
- color: #3c3c3c;
373
- }
374
-
375
- .addons-button-installed:hover {
376
- color: #3c3c3c;
377
- opacity: 0.8;
378
- }
379
-
380
- @media only screen and (max-width : 400px) {
381
- .addons-featured {
382
- margin: -1% -5%;
383
- }
384
-
385
- .addons-button {
386
- width: 100%;
387
- }
388
-
389
- .addons-small-dark-item {
390
- width: 100%;
391
- }
392
-
393
- .addons-column-block-item-icon {
394
- background: none;
395
- border: none;
396
- height: 75px;
397
- margin: 0 10px 10px 0;
398
- width: 75px;
399
- }
400
- }
401
-
402
- .colorpickpreview {
403
- padding: 7px 0;
404
- line-height: 1em;
405
- display: inline-block;
406
- width: 26px;
407
- border: 1px solid #ddd;
408
- font-size: 14px;
409
- }
410
-
411
- .products {
412
- overflow: hidden;
413
- display: flex;
414
- flex-flow: row;
415
- flex-wrap: wrap;
416
- margin: 0 -.5em;
417
-
418
- li {
419
- float: left;
420
- border: 1px solid #ddd;
421
- margin: 0 .5em 1em !important;
422
- padding: 0;
423
- vertical-align: top;
424
- width: 25%;
425
- min-width: 280px;
426
- min-height: 220px;
427
- flex: 1;
428
- overflow: hidden;
429
- background: #f5f5f5;
430
- box-shadow:
431
- inset 0 1px 0 rgba(255, 255, 255, 0.2),
432
- inset 0 -1px 0 rgba(0, 0, 0, 0.1);
433
-
434
- a {
435
- text-decoration: none;
436
- color: inherit;
437
- display: block;
438
- height: 100%;
439
-
440
- .product-img-wrap {
441
- background: #fff;
442
- display: block;
443
- }
444
-
445
- img {
446
- max-width: 258px;
447
- max-height: 24px;
448
- padding: 17px 20px;
449
- display: block;
450
- margin: 0;
451
- background: #fff;
452
- border-right: 260px solid #fff;
453
- }
454
-
455
- img.extension-thumb + h3 {
456
- display: none;
457
- }
458
-
459
- .price {
460
- display: none;
461
- }
462
-
463
- h2, h3 {
464
- margin: 0 !important;
465
- padding: 20px !important;
466
- background: #fff;
467
- }
468
-
469
- p {
470
- padding: 20px !important;
471
- margin: 0 !important;
472
- border-top: 1px solid #f1f1f1;
473
- }
474
-
475
- &:hover,
476
- &:focus {
477
- background-color: #fff;
478
- }
479
- }
480
- }
481
- }
482
-
483
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/css/wcv-frontend.css DELETED
@@ -1,547 +0,0 @@
1
- /*!
2
- * Bootstrap v2.1.1
3
- *
4
- * Copyright 2012 Twitter, Inc
5
- * Licensed under the Apache License v2.0
6
- * http://www.apache.org/licenses/LICENSE-2.0
7
- *
8
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
9
- */
10
- clearfix {
11
- *zoom: 1;
12
- }
13
-
14
- .clearfix:before, .clearfix:after {
15
- display: table;
16
- content: "";
17
- line-height: 0;
18
- }
19
-
20
- .clearfix:after {
21
- clear: both;
22
- }
23
-
24
- .hide-text {
25
- font: 0/0 a;
26
- color: transparent;
27
- text-shadow: none;
28
- background-color: transparent;
29
- border: 0;
30
- }
31
-
32
- .input-block-level {
33
- display: block;
34
- width: 100%;
35
- min-height: 30px;
36
- -webkit-box-sizing: border-box;
37
- -moz-box-sizing: border-box;
38
- box-sizing: border-box;
39
- }
40
-
41
- .wcv-btn {
42
- display: inline-block;
43
- *display: inline;
44
- *zoom: 1;
45
- padding: 4px 14px;
46
- margin-bottom: 0;
47
- font-size: 14px;
48
- line-height: 20px;
49
- *line-height: 20px;
50
- text-align: center;
51
- vertical-align: middle;
52
- cursor: pointer;
53
- color: #333333;
54
- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
55
- background-color: #f5f5f5;
56
- background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
57
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
58
- background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
59
- background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
60
- background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
61
- background-repeat: repeat-x;
62
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
63
- border-color: #e6e6e6 #e6e6e6 #bfbfbf;
64
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
65
- *background-color: #e6e6e6;
66
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
67
- border: 1px solid #bbbbbb;
68
- *border: 0;
69
- border-bottom-color: #a2a2a2;
70
- -webkit-border-radius: 4px;
71
- -moz-border-radius: 4px;
72
- border-radius: 4px;
73
- *margin-left: .3em;
74
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
75
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
76
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
77
- }
78
-
79
- .wcv-btn:hover, .wcv-btn:active, .wcv-btn.active, .wcv-btn.disabled, .wcv-btn[disabled] {
80
- color: #333333;
81
- background-color: #e6e6e6;
82
- *background-color: #d9d9d9;
83
- }
84
-
85
- .wcv-btn:active, .wcv-btn.active {
86
- background-color: #cccccc \9;
87
- }
88
-
89
- .wcv-btn:first-child {
90
- *margin-left: 0;
91
- }
92
-
93
- .wcv-btn:hover {
94
- color: #333333;
95
- text-decoration: none;
96
- background-color: #e6e6e6;
97
- *background-color: #d9d9d9;
98
- background-position: 0 -15px;
99
- -webkit-transition: background-position 0.1s linear;
100
- -moz-transition: background-position 0.1s linear;
101
- -o-transition: background-position 0.1s linear;
102
- transition: background-position 0.1s linear;
103
- }
104
-
105
- .wcv-btn:focus {
106
- outline: thin dotted #333;
107
- outline: 5px auto -webkit-focus-ring-color;
108
- outline-offset: -2px;
109
- }
110
-
111
- .wcv-btn.active, .wcv-btn:active {
112
- background-color: #e6e6e6;
113
- background-color: #d9d9d9 \9;
114
- background-image: none;
115
- outline: 0;
116
- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
117
- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
118
- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
119
- }
120
-
121
- .wcv-btn.disabled, .wcv-btn[disabled] {
122
- cursor: default;
123
- background-color: #e6e6e6;
124
- background-image: none;
125
- opacity: 0.65;
126
- filter: alpha(opacity=65);
127
- -webkit-box-shadow: none;
128
- -moz-box-shadow: none;
129
- box-shadow: none;
130
- }
131
-
132
- .wcv-btn-large {
133
- padding: 9px 14px;
134
- font-size: 16px;
135
- line-height: normal;
136
- -webkit-border-radius: 5px;
137
- -moz-border-radius: 5px;
138
- border-radius: 5px;
139
- }
140
-
141
- .wcv-btn-large [class^="icon-"] {
142
- margin-top: 2px;
143
- }
144
-
145
- .wcv-btn-small {
146
- padding: 3px 9px;
147
- font-size: 12px;
148
- line-height: 18px;
149
- }
150
-
151
- .wcv-btn-small [class^="icon-"] {
152
- margin-top: 0;
153
- }
154
-
155
- .wcv-btn-mini {
156
- padding: 2px 6px;
157
- font-size: 11px;
158
- line-height: 17px;
159
- }
160
-
161
- .wcv-btn-block {
162
- display: block;
163
- width: 100%;
164
- padding-left: 0;
165
- padding-right: 0;
166
- -webkit-box-sizing: border-box;
167
- -moz-box-sizing: border-box;
168
- box-sizing: border-box;
169
- }
170
-
171
- .wcv-btn-block + .wcv-btn-block {
172
- margin-top: 5px;
173
- }
174
-
175
- input[type="submit"].wcv-btn-block, input[type="reset"].wcv-btn-block, input[type="button"].wcv-btn-block {
176
- width: 100%;
177
- }
178
-
179
- .wcv-btn-primary.active, .wcv-btn-warning.active, .wcv-btn-danger.active, .wcv-btn-success.active, .wcv-btn-info.active, .wcv-btn-inverse.active {
180
- color: rgba(255, 255, 255, 0.75);
181
- }
182
-
183
- .wcv-btn {
184
- border-color: #c5c5c5;
185
- border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
186
- }
187
-
188
- .wcv-btn-primary {
189
- color: #ffffff;
190
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
191
- background-color: #006dcc;
192
- background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
193
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
194
- background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
195
- background-image: -o-linear-gradient(top, #0088cc, #0044cc);
196
- background-image: linear-gradient(to bottom, #0088cc, #0044cc);
197
- background-repeat: repeat-x;
198
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
199
- border-color: #0044cc #0044cc #002a80;
200
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
201
- *background-color: #0044cc;
202
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
203
- }
204
-
205
- .wcv-btn-primary:hover, .wcv-btn-primary:active, .wcv-btn-primary.active, .wcv-btn-primary.disabled, .wcv-btn-primary[disabled] {
206
- color: #ffffff;
207
- background-color: #0044cc;
208
- *background-color: #003bb3;
209
- }
210
-
211
- .wcv-btn-primary:active, .wcv-btn-primary.active {
212
- background-color: #003399 \9;
213
- }
214
-
215
- .wcv-btn-warning {
216
- color: #ffffff;
217
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
218
- background-color: #faa732;
219
- background-image: -moz-linear-gradient(top, #fbb450, #f89406);
220
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
221
- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
222
- background-image: -o-linear-gradient(top, #fbb450, #f89406);
223
- background-image: linear-gradient(to bottom, #fbb450, #f89406);
224
- background-repeat: repeat-x;
225
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
226
- border-color: #f89406 #f89406 #ad6704;
227
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
228
- *background-color: #f89406;
229
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
230
- }
231
-
232
- .wcv-btn-warning:hover, .wcv-btn-warning:active, .wcv-btn-warning.active, .wcv-btn-warning.disabled, .wcv-btn-warning[disabled] {
233
- color: #ffffff;
234
- background-color: #f89406;
235
- *background-color: #df8505;
236
- }
237
-
238
- .wcv-btn-warning:active, .wcv-btn-warning.active {
239
- background-color: #c67605 \9;
240
- }
241
-
242
- .wcv-btn-danger {
243
- color: #ffffff;
244
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
245
- background-color: #da4f49;
246
- background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
247
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
248
- background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
249
- background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
250
- background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
251
- background-repeat: repeat-x;
252
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
253
- border-color: #bd362f #bd362f #802420;
254
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
255
- *background-color: #bd362f;
256
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
257
- }
258
-
259
- .wcv-btn-danger:hover, .wcv-btn-danger:active, .wcv-btn-danger.active, .wcv-btn-danger.disabled, .wcv-btn-danger[disabled] {
260
- color: #ffffff;
261
- background-color: #bd362f;
262
- *background-color: #a9302a;
263
- }
264
-
265
- .wcv-btn-danger:active, .wcv-btn-danger.active {
266
- background-color: #942a25 \9;
267
- }
268
-
269
- .wcv-btn-success {
270
- color: #ffffff;
271
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
272
- background-color: #5bb75b;
273
- background-image: -moz-linear-gradient(top, #62c462, #51a351);
274
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
275
- background-image: -webkit-linear-gradient(top, #62c462, #51a351);
276
- background-image: -o-linear-gradient(top, #62c462, #51a351);
277
- background-image: linear-gradient(to bottom, #62c462, #51a351);
278
- background-repeat: repeat-x;
279
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
280
- border-color: #51a351 #51a351 #387038;
281
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
282
- *background-color: #51a351;
283
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
284
- }
285
-
286
- .wcv-btn-success:hover, .wcv-btn-success:active, .wcv-btn-success.active, .wcv-btn-success.disabled, .wcv-btn-success[disabled] {
287
- color: #ffffff;
288
- background-color: #51a351;
289
- *background-color: #499249;
290
- }
291
-
292
- .wcv-btn-success:active, .wcv-btn-success.active {
293
- background-color: #408140 \9;
294
- }
295
-
296
- .wcv-btn-info {
297
- color: #ffffff;
298
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
299
- background-color: #49afcd;
300
- background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
301
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
302
- background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
303
- background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
304
- background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
305
- background-repeat: repeat-x;
306
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
307
- border-color: #2f96b4 #2f96b4 #1f6377;
308
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
309
- *background-color: #2f96b4;
310
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
311
- }
312
-
313
- .wcv-btn-info:hover, .wcv-btn-info:active, .wcv-btn-info.active, .wcv-btn-info.disabled, .wcv-btn-info[disabled] {
314
- color: #ffffff;
315
- background-color: #2f96b4;
316
- *background-color: #2a85a0;
317
- }
318
-
319
- .wcv-btn-info:active, .wcv-btn-info.active {
320
- background-color: #24748c \9;
321
- }
322
-
323
- .wcv-btn-inverse {
324
- color: #ffffff;
325
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
326
- background-color: #363636;
327
- background-image: -moz-linear-gradient(top, #444444, #222222);
328
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
329
- background-image: -webkit-linear-gradient(top, #444444, #222222);
330
- background-image: -o-linear-gradient(top, #444444, #222222);
331
- background-image: linear-gradient(to bottom, #444444, #222222);
332
- background-repeat: repeat-x;
333
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
334
- border-color: #222222 #222222 #000000;
335
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
336
- *background-color: #222222;
337
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
338
- }
339
-
340
- .wcv-btn-inverse:hover, .wcv-btn-inverse:active, .wcv-btn-inverse.active, .wcv-btn-inverse.disabled, .wcv-btn-inverse[disabled] {
341
- color: #ffffff;
342
- background-color: #222222;
343
- *background-color: #151515;
344
- }
345
-
346
- .wcv-btn-inverse:active, .wcv-btn-inverse.active {
347
- background-color: #080808 \9;
348
- }
349
-
350
- button.wcv-btn, input[type="submit"].wcv-btn {
351
- *padding-top: 3px;
352
- *padding-bottom: 3px;
353
- }
354
-
355
- button.wcv-btn::-moz-focus-inner, input[type="submit"].wcv-btn::-moz-focus-inner {
356
- padding: 0;
357
- border: 0;
358
- }
359
-
360
- button.wcv-btn.wcv-btn-large, input[type="submit"].wcv-btn.wcv-btn-large {
361
- *padding-top: 7px;
362
- *padding-bottom: 7px;
363
- }
364
-
365
- button.wcv-btn.wcv-btn-small, input[type="submit"].wcv-btn.wcv-btn-small {
366
- *padding-top: 3px;
367
- *padding-bottom: 3px;
368
- }
369
-
370
- button.wcv-btn.wcv-btn-mini, input[type="submit"].wcv-btn.wcv-btn-mini {
371
- *padding-top: 1px;
372
- *padding-bottom: 1px;
373
- }
374
-
375
- .wcv-btn-link, .wcv-btn-link:active, .wcv-btn-link[disabled] {
376
- background-color: transparent;
377
- background-image: none;
378
- -webkit-box-shadow: none;
379
- -moz-box-shadow: none;
380
- box-shadow: none;
381
- }
382
-
383
- .wcv-btn-link {
384
- border-color: transparent;
385
- cursor: pointer;
386
- color: #0088cc;
387
- -webkit-border-radius: 0;
388
- -moz-border-radius: 0;
389
- border-radius: 0;
390
- }
391
-
392
- .wcv-btn-link:hover {
393
- color: #005580;
394
- text-decoration: underline;
395
- background-color: transparent;
396
- }
397
-
398
- .wcv-btn-link[disabled]:hover {
399
- color: #333333;
400
- text-decoration: none;
401
- }
402
-
403
- table {
404
- max-width: 100%;
405
- background-color: transparent;
406
- border-collapse: collapse;
407
- border-spacing: 0;
408
- }
409
-
410
- .table {
411
- width: 100%;
412
- margin-bottom: 20px;
413
- }
414
-
415
- .table th, .table td {
416
- padding: 8px;
417
- line-height: 20px;
418
- text-align: left;
419
- vertical-align: top;
420
- border-top: 1px solid #dddddd;
421
- }
422
-
423
- .table th {
424
- font-weight: bold;
425
- }
426
-
427
- .table thead th {
428
- vertical-align: bottom;
429
- }
430
-
431
- .table caption + thead tr:first-child th, .table caption + thead tr:first-child td, .table colgroup + thead tr:first-child th, .table colgroup + thead tr:first-child td, .table thead:first-child tr:first-child th, .table thead:first-child tr:first-child td {
432
- border-top: 0;
433
- }
434
-
435
- .table tbody + tbody {
436
- border-top: 2px solid #dddddd;
437
- }
438
-
439
- .table-condensed th, .table-condensed td {
440
- padding: 4px 5px;
441
- }
442
-
443
- .table-bordered {
444
- border: 1px solid #dddddd;
445
- border-collapse: separate;
446
- *border-collapse: collapse;
447
- border-left: 0;
448
- -webkit-border-radius: 4px;
449
- -moz-border-radius: 4px;
450
- border-radius: 4px;
451
- }
452
-
453
- .table-bordered th, .table-bordered td {
454
- border-left: 1px solid #dddddd;
455
- }
456
-
457
- .table-bordered caption + thead tr:first-child th, .table-bordered caption + tbody tr:first-child th, .table-bordered caption + tbody tr:first-child td, .table-bordered colgroup + thead tr:first-child th, .table-bordered colgroup + tbody tr:first-child th, .table-bordered colgroup + tbody tr:first-child td, .table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td {
458
- border-top: 0;
459
- }
460
-
461
- .table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child {
462
- -webkit-border-top-left-radius: 4px;
463
- border-top-left-radius: 4px;
464
- -moz-border-radius-topleft: 4px;
465
- }
466
-
467
- .table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child {
468
- -webkit-border-top-right-radius: 4px;
469
- border-top-right-radius: 4px;
470
- -moz-border-radius-topright: 4px;
471
- }
472
-
473
- .table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child, .table-bordered tfoot:last-child tr:last-child td:first-child {
474
- -webkit-border-radius: 0 0 0 4px;
475
- -moz-border-radius: 0 0 0 4px;
476
- border-radius: 0 0 0 4px;
477
- -webkit-border-bottom-left-radius: 4px;
478
- border-bottom-left-radius: 4px;
479
- -moz-border-radius-bottomleft: 4px;
480
- }
481
-
482
- .table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child, .table-bordered tfoot:last-child tr:last-child td:last-child {
483
- -webkit-border-bottom-right-radius: 4px;
484
- border-bottom-right-radius: 4px;
485
- -moz-border-radius-bottomright: 4px;
486
- }
487
-
488
- .table-bordered caption + thead tr:first-child th:first-child, .table-bordered caption + tbody tr:first-child td:first-child, .table-bordered colgroup + thead tr:first-child th:first-child, .table-bordered colgroup + tbody tr:first-child td:first-child {
489
- -webkit-border-top-left-radius: 4px;
490
- border-top-left-radius: 4px;
491
- -moz-border-radius-topleft: 4px;
492
- }
493
-
494
- .table-bordered caption + thead tr:first-child th:last-child, .table-bordered caption + tbody tr:first-child td:last-child, .table-bordered colgroup + thead tr:first-child th:last-child, .table-bordered colgroup + tbody tr:first-child td:last-child {
495
- -webkit-border-top-right-radius: 4px;
496
- border-top-right-radius: 4px;
497
- -moz-border-radius-topleft: 4px;
498
- }
499
-
500
- .table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th {
501
- background-color: #f9f9f9;
502
- }
503
-
504
- .table-hover tbody tr:hover td, .table-hover tbody tr:hover th {
505
- background-color: #f5f5f5;
506
- }
507
-
508
- table [class*=span], .row-fluid table [class*=span] {
509
- display: table-cell;
510
- float: none;
511
- margin-left: 0;
512
- }
513
-
514
- .table tbody tr.success td {
515
- background-color: #dff0d8;
516
- }
517
-
518
- .table tbody tr.error td {
519
- background-color: #f2dede;
520
- }
521
-
522
- .table tbody tr.warning td {
523
- background-color: #fcf8e3;
524
- }
525
-
526
- .table tbody tr.info td {
527
- background-color: #d9edf7;
528
- }
529
-
530
- .table-hover tbody tr.success:hover td {
531
- background-color: #d0e9c6;
532
- }
533
-
534
- .table-hover tbody tr.error:hover td {
535
- background-color: #ebcccc;
536
- }
537
-
538
- .table-hover tbody tr.warning:hover td {
539
- background-color: #faf2cc;
540
- }
541
-
542
- .table-hover tbody tr.info:hover td {
543
- background-color: #c4e3f3;
544
- }
545
- .hidden { display: none; }
546
-
547
- .vendor_list .button { width: 100%; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/css/wcv-setup.css DELETED
@@ -1,185 +0,0 @@
1
- /** WC Vendors setup wizard styles */
2
- /** WooCommerce CSS Variables */
3
- body { margin: 65px auto 24px; -webkit-box-shadow: none; box-shadow: none; background: #f1f1f1; padding: 0; }
4
-
5
- #wcv-logo { border: 0; margin: 0 0 24px; padding: 0; text-align: center; }
6
-
7
- #wcv-logo img { max-width: 30%; }
8
-
9
- .wcv-setup-content { -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13); padding: 2em; margin: 0 0 20px; background: #fff; overflow: hidden; zoom: 1; }
10
-
11
- .wcv-setup-content h1, .wcv-setup-content h2, .wcv-setup-content h3, .wcv-setup-content table { margin: 0 0 20px; border: 0; padding: 0; color: #666; clear: none; font-weight: 500; }
12
-
13
- .wcv-setup-content p { margin: 20px 0; font-size: 1em; line-height: 1.75em; color: #666; }
14
-
15
- .wcv-setup-content table { font-size: 1em; line-height: 1.75em; color: #666; }
16
-
17
- .wcv-setup-content a { color: #005580; }
18
-
19
- .wcv-setup-content a:hover, .wcv-setup-content a:focus { color: #111; }
20
-
21
- .wcv-setup-content h4.help-title { text-align: center; }
22
-
23
- .wcv-setup-content .wcv-setup-input input { padding: 5px 10px; font-size: 1em; }
24
-
25
- .wcv-setup-content .wcv-setup-next-steps { overflow: hidden; margin: 0 0 24px; padding-bottom: 2px; }
26
-
27
- .wcv-setup-content .wcv-setup-next-steps h2 { margin-bottom: 12px; }
28
-
29
- .wcv-setup-content .wcv-setup-next-steps .wcv-setup-next-steps-first { float: left; width: 50%; -webkit-box-sizing: border-box; box-sizing: border-box; }
30
-
31
- .wcv-setup-content .wcv-setup-next-steps .wcv-setup-next-steps-last { float: right; width: 50%; -webkit-box-sizing: border-box; box-sizing: border-box; }
32
-
33
- .wcv-setup-content .wcv-setup-next-steps ul { padding: 0 2em 0 0; list-style: none outside; margin: 0; }
34
-
35
- .wcv-setup-content .wcv-setup-next-steps ul li a { display: block; padding: 0 0 0.75em; }
36
-
37
- .wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button { background-color: #f7f7f7; border-color: #ccc; color: #23282d; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #ccc; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #ccc; text-shadow: 1px 0 1px #eee, 0 1px 1px #eee; font-size: 1em; height: auto; line-height: 1.75em; margin: 0 0 0.75em; opacity: 1; padding: 1em; text-align: center; }
38
-
39
- .wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button:hover, .wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button:focus, .wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button:active { background: #5897b6; border-color: #aaa; }
40
-
41
- .wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button-primary { color: #fff; background-color: #bb77ae; border-color: #5897b6; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #5897b6; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #5897b6; text-shadow: 0 -1px 1px #5897b6, 1px 0 1px #5897b6, 0 1px 1px #5897b6, -1px 0 1px #5897b6; }
42
-
43
- .wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button-primary:hover, .wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button-primary:focus, .wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button-primary:active { color: #fff; background: #5897b6; border-color: #5897b6; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #5897b6; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #5897b6; }
44
-
45
- .wcv-setup-content .wcv-setup-next-steps ul li a::before { color: #82878c; font: normal 20px/1 'dashicons'; speak: none; display: inline-block; padding: 0 10px 0 0; top: 1px; position: relative; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-decoration: none !important; vertical-align: top; }
46
-
47
- .wcv-setup-content .wcv-setup-next-steps ul .learn-more a::before { content: '\f105'; }
48
-
49
- .wcv-setup-content .wcv-setup-next-steps ul .video-walkthrough a::before { content: '\f126'; }
50
-
51
- .wcv-setup-content .wcv-setup-next-steps ul .newsletter a::before { content: '\f465'; }
52
-
53
- .wcv-setup-content .wcvendors-newsletter, .wcv-setup-content .wcvendors-tracker, .wcv-setup-content .updated { padding: 24px 24px 0; margin: 0 0 24px; overflow: hidden; background: #f5f5f5; }
54
-
55
- .wcv-setup-content .wcvendors-newsletter p, .wcv-setup-content .wcvendors-tracker p, .wcv-setup-content .updated p { padding: 0; margin: 0 0 12px; }
56
-
57
- .wcv-setup-content .wcvendors-newsletter form, .wcv-setup-content .wcvendors-newsletter p:last-child, .wcv-setup-content .wcvendors-tracker form, .wcv-setup-content .wcvendors-tracker p:last-child, .wcv-setup-content .updated form, .wcv-setup-content .updated p:last-child { margin: 0 0 24px; }
58
-
59
- .wcv-setup-content .wcvendors-tracker + .wcvendors-newsletter { margin-top: -24px; border-top: 2px dashed #ddd; }
60
-
61
- .wcv-setup-steps { padding: 0 0 24px; margin: 0; list-style: none outside; overflow: hidden; color: #ccc; width: 100%; display: -webkit-inline-box; display: -ms-inline-flexbox; display: inline-flex; }
62
-
63
- .wcv-setup-steps li { width: 25%; float: left; padding: 0 0 0.8em; margin: 0; text-align: center; position: relative; border-bottom: 4px solid #ccc; line-height: 1.4em; }
64
-
65
- .wcv-setup-steps li::before { content: ''; border: 4px solid #ccc; border-radius: 100%; width: 4px; height: 4px; position: absolute; bottom: 0; left: 50%; margin-left: -6px; margin-bottom: -8px; background: #fff; }
66
-
67
- .wcv-setup-steps li.active { border-color: #5897b6; color: #005580; }
68
-
69
- .wcv-setup-steps li.active::before { border-color: #005580; }
70
-
71
- .wcv-setup-steps li.done { border-color: #5897b6; color: #005580; }
72
-
73
- .wcv-setup-steps li.done::before { border-color: #5897b6; background: #5897b6; }
74
-
75
- .wcv-setup .wcv-setup-actions { overflow: hidden; margin: 20px 0 0; }
76
-
77
- .wcv-setup .wcv-setup-actions .button { font-size: 1.25em; line-height: 1em; margin-right: 0.5em; margin-bottom: 2px; height: auto; border-radius: 4px; }
78
-
79
- .wcv-setup .wcv-setup-actions .button-primary { background-color: #005580; border-color: #5897b6; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #5897b6; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #5897b6; text-shadow: 0 -1px 1px #5897b6, 1px 0 1px #5897b6, 0 1px 1px #5897b6, -1px 0 1px #5897b6; margin: 0; opacity: 1; }
80
-
81
- .wcv-setup .wcv-setup-actions .button-primary:hover, .wcv-setup .wcv-setup-actions .button-primary:focus, .wcv-setup .wcv-setup-actions .button-primary:active { background: #5897b6; border-color: #5897b6; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #5897b6; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #5897b6; }
82
-
83
- .wcv-setup-content p:last-child { margin-bottom: 0; }
84
-
85
- .wcv-setup-content p.store-setup { margin-top: 0; }
86
-
87
- .wcv-return-to-dashboard { font-size: 0.85em; color: #b5b5b5; margin: 1.18em 0; display: block; text-align: center; }
88
-
89
- .wcv-wizard-storefront .wcv-wizard-storefront-intro { padding: 40px 40px 0; background: #F5F5F5; text-align: center; }
90
-
91
- .wcv-wizard-storefront .wcv-wizard-storefront-intro img { margin: 40px 0 0 0; width: 100%; display: block; }
92
-
93
- .wcv-wizard-storefront .wcv-wizard-storefront-features { list-style: none outside; margin: 0 0 20px; padding: 0 0 0 30px; overflow: hidden; }
94
-
95
- .wcv-wizard-storefront .wcv-wizard-storefront-feature { margin: 0; padding: 20px 30px 20px 2em; width: 50%; -webkit-box-sizing: border-box; box-sizing: border-box; }
96
-
97
- .wcv-wizard-storefront .wcv-wizard-storefront-feature::before { margin-left: -2em; position: absolute; }
98
-
99
- .wcv-wizard-storefront .wcv-wizard-storefront-feature.first { clear: both; float: left; }
100
-
101
- .wcv-wizard-storefront .wcv-wizard-storefront-feature.last { float: right; }
102
-
103
- .hide { display: none; }
104
-
105
- .wcv-wizard-features { display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; list-style: none; padding: 0; }
106
-
107
- .wcv-wizard-features .wcv-wizard-feature-item { -ms-flex-preferred-size: calc( 50% - 4em - 3px); flex-basis: calc( 50% - 4em - 3px); border: 1px solid #eee; padding: 2em; }
108
-
109
- .wcv-wizard-features .wcv-wizard-feature-item:nth-child(1) { border-radius: 4px 0 0 0; }
110
-
111
- .wcv-wizard-features .wcv-wizard-feature-item:nth-child(2) { border-left: 0; border-radius: 0 4px 0 0; }
112
-
113
- .wcv-wizard-features .wcv-wizard-feature-item:nth-child(3) { border-top: 0; border-radius: 0 0 0 4px; }
114
-
115
- .wcv-wizard-features .wcv-wizard-feature-item:nth-child(4) { border-top: 0; border-left: 0; border-radius: 0 0 4px 0; }
116
-
117
- .wcv-wizard-features p.wcv-wizard-feature-name, .wcv-wizard-features p.wcv-wizard-feature-description { margin: 0; line-height: 1.5em; }
118
-
119
- .step { text-align: center; }
120
-
121
- .wcv-setup .wcv-setup-actions .button { font-weight: 300; font-size: 16px; padding: 0.5em 1em; -webkit-box-shadow: none; box-shadow: none; min-width: 12em; min-width: auto; margin-top: 10px; background-color: #005580; color: #fff; }
122
-
123
- .wcv-setup .wcv-setup-actions .button:focus, .wcv-setup .wcv-setup-actions .button:hover, .wcv-setup .wcv-setup-actions .button:active { -webkit-box-shadow: none; box-shadow: none; background-color: #5897b6; }
124
-
125
- .location-prompt { color: #666; font-size: 13px; font-weight: 500; margin-bottom: 0.5em; margin-top: 1em; display: inline-block; }
126
-
127
- .address-step .select2 { min-width: 100%; }
128
-
129
- .store-address-container { margin-bottom: 24px; }
130
-
131
- .store-address-container .city-and-postcode { display: -webkit-box; display: -ms-flexbox; display: flex; }
132
-
133
- .store-address-container .city-and-postcode div { -ms-flex-preferred-size: 50%; flex-basis: 50%; margin-right: 1em; }
134
-
135
- .store-address-container .city-and-postcode div:last-of-type { margin-right: 0; }
136
-
137
- .wcv-wizard-service-settings .payment-email-input { border: 1px solid #aaa; border-color: #ddd; border-radius: 4px; height: 30px; padding: 0 8px; font-size: 14px; color: #444; background-color: #fff; display: inline-block; }
138
-
139
- .newsletter-form-container { display: -webkit-box; display: -ms-flexbox; display: flex; }
140
-
141
- .newsletter-form-container .newsletter-form-email { border: 1px solid #aaa; border-color: #ddd; border-radius: 4px; height: 42px; padding: 0 8px; font-size: 16px; color: #666; background-color: #fff; display: inline-block; margin-right: 6px; -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; }
142
-
143
- .newsletter-form-container .newsletter-form-button-container { -webkit-box-flex: 0; -ms-flex-positive: 0; flex-grow: 0; }
144
-
145
- .wcv-setup .wcv-setup-actions .button.newsletter-form-button { height: 42px; padding: 0 1em; margin: 0; }
146
-
147
- .wcv-wizard-next-steps { border: 1px solid #eee; border-radius: 4px; list-style: none; padding: 0; }
148
-
149
- .wcv-wizard-next-steps li { padding: 0; }
150
-
151
- .wcv-wizard-next-steps .wcv-wizard-next-step-item { display: -webkit-box; display: -ms-flexbox; display: flex; border-top: 1px solid #eee; }
152
-
153
- .wcv-wizard-next-steps .wcv-wizard-next-step-item:first-child { border-top: 0; }
154
-
155
- .wcv-wizard-next-steps .wcv-wizard-next-step-description { -webkit-box-flex: 1; -ms-flex-positive: 1; flex-grow: 1; margin: 1.5em; }
156
-
157
- .wcv-wizard-next-steps .wcv-wizard-next-step-action { -webkit-box-flex: 0; -ms-flex-positive: 0; flex-grow: 0; display: -webkit-box; display: -ms-flexbox; display: flex; -webkit-box-align: center; -ms-flex-align: center; align-items: center; }
158
-
159
- .wcv-wizard-next-steps .wcv-wizard-next-step-action .button { margin: 1em; }
160
-
161
- .wcv-wizard-next-steps p.next-step-heading { margin: 0; font-size: 0.95em; font-weight: 400; font-variant: all-petite-caps; }
162
-
163
- .wcv-wizard-next-steps p.next-step-extra-info { margin: 0; }
164
-
165
- .wcv-wizard-next-steps h3.next-step-description { margin: 0; font-size: 16px; font-weight: 600; }
166
-
167
- p.next-steps-help-text { color: #9f9f9f; padding: 0 2em; text-align: center; font-size: .9em; }
168
-
169
- .wcv-setup-table { width: 100%; }
170
-
171
- .wcv-setup-table .table-desc { width: 80%; }
172
-
173
- .wcv-setup-table .table-check { width: 20%; text-align: right; }
174
-
175
- .wcv-setup-table .table-check input.option_check { line-height: 4em; }
176
-
177
- .wcv-setup-table-pages { width: 100%; }
178
-
179
- .wcv-setup-table-pages .table-desc { width: 60%; }
180
-
181
- .wcv-setup-table-pages .table-check { width: 40%; }
182
-
183
- .wcv-setup-table-pages select { width: 100%; }
184
-
185
- .wcv-setup-table-pages .tool-tip { font-size: 0.75em; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/css/wcv-setup.min.css DELETED
@@ -1 +0,0 @@
1
- body{margin:65px auto 24px;-webkit-box-shadow:none;box-shadow:none;background:#f1f1f1;padding:0}#wcv-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wcv-logo img{max-width:30%}.wcv-setup-content{-webkit-box-shadow:0 1px 3px rgba(0,0,0,.13);box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1}.wcv-setup-content h1,.wcv-setup-content h2,.wcv-setup-content h3,.wcv-setup-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.wcv-setup-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.wcv-setup-content table{font-size:1em;line-height:1.75em;color:#666}.wcv-setup-content a{color:#005580}.wcv-setup-content a:focus,.wcv-setup-content a:hover{color:#111}.wcv-setup-content h4.help-title{text-align:center}.wcv-setup-content .wcv-setup-input input{padding:5px 10px;font-size:1em}.wcv-setup-content .wcv-setup-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.wcv-setup-content .wcv-setup-next-steps h2{margin-bottom:12px}.wcv-setup-content .wcv-setup-next-steps .wcv-setup-next-steps-first{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}.wcv-setup-content .wcv-setup-next-steps .wcv-setup-next-steps-last{float:right;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}.wcv-setup-content .wcv-setup-next-steps ul{padding:0 2em 0 0;list-style:none outside;margin:0}.wcv-setup-content .wcv-setup-next-steps ul li a{display:block;padding:0 0 .75em}.wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button{background-color:#f7f7f7;border-color:#ccc;color:#23282d;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;text-shadow:1px 0 1px #eee,0 1px 1px #eee;font-size:1em;height:auto;line-height:1.75em;margin:0 0 .75em;opacity:1;padding:1em;text-align:center}.wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button:active,.wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button:focus,.wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button:hover{background:#5897b6;border-color:#aaa}.wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button-primary{color:#fff;background-color:#bb77ae;border-color:#5897b6;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #5897b6;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #5897b6;text-shadow:0 -1px 1px #5897b6,1px 0 1px #5897b6,0 1px 1px #5897b6,-1px 0 1px #5897b6}.wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button-primary:active,.wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button-primary:focus,.wcv-setup-content .wcv-setup-next-steps ul .setup-product a.button-primary:hover{color:#fff;background:#5897b6;border-color:#5897b6;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #5897b6;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #5897b6}.wcv-setup-content .wcv-setup-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 10px 0 0;top:1px;position:relative;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-decoration:none!important;vertical-align:top}.wcv-setup-content .wcv-setup-next-steps ul .learn-more a::before{content:'\f105'}.wcv-setup-content .wcv-setup-next-steps ul .video-walkthrough a::before{content:'\f126'}.wcv-setup-content .wcv-setup-next-steps ul .newsletter a::before{content:'\f465'}.wcv-setup-content .updated,.wcv-setup-content .wcvendors-newsletter,.wcv-setup-content .wcvendors-tracker{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.wcv-setup-content .updated p,.wcv-setup-content .wcvendors-newsletter p,.wcv-setup-content .wcvendors-tracker p{padding:0;margin:0 0 12px}.wcv-setup-content .updated form,.wcv-setup-content .updated p:last-child,.wcv-setup-content .wcvendors-newsletter form,.wcv-setup-content .wcvendors-newsletter p:last-child,.wcv-setup-content .wcvendors-tracker form,.wcv-setup-content .wcvendors-tracker p:last-child{margin:0 0 24px}.wcv-setup-content .wcvendors-tracker+.wcvendors-newsletter{margin-top:-24px;border-top:2px dashed #ddd}.wcv-setup-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.wcv-setup-steps li{width:25%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.wcv-setup-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.wcv-setup-steps li.active{border-color:#5897b6;color:#005580}.wcv-setup-steps li.active::before{border-color:#005580}.wcv-setup-steps li.done{border-color:#5897b6;color:#005580}.wcv-setup-steps li.done::before{border-color:#5897b6;background:#5897b6}.wcv-setup .wcv-setup-actions{overflow:hidden;margin:20px 0 0}.wcv-setup .wcv-setup-actions .button{font-size:1.25em;line-height:1em;margin-right:.5em;margin-bottom:2px;height:auto;border-radius:4px}.wcv-setup .wcv-setup-actions .button-primary{background-color:#005580;border-color:#5897b6;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #5897b6;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #5897b6;text-shadow:0 -1px 1px #5897b6,1px 0 1px #5897b6,0 1px 1px #5897b6,-1px 0 1px #5897b6;margin:0;opacity:1}.wcv-setup .wcv-setup-actions .button-primary:active,.wcv-setup .wcv-setup-actions .button-primary:focus,.wcv-setup .wcv-setup-actions .button-primary:hover{background:#5897b6;border-color:#5897b6;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #5897b6;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #5897b6}.wcv-setup-content p:last-child{margin-bottom:0}.wcv-setup-content p.store-setup{margin-top:0}.wcv-return-to-dashboard{font-size:.85em;color:#b5b5b5;margin:1.18em 0;display:block;text-align:center}.wcv-wizard-storefront .wcv-wizard-storefront-intro{padding:40px 40px 0;background:#f5f5f5;text-align:center}.wcv-wizard-storefront .wcv-wizard-storefront-intro img{margin:40px 0 0 0;width:100%;display:block}.wcv-wizard-storefront .wcv-wizard-storefront-features{list-style:none outside;margin:0 0 20px;padding:0 0 0 30px;overflow:hidden}.wcv-wizard-storefront .wcv-wizard-storefront-feature{margin:0;padding:20px 30px 20px 2em;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}.wcv-wizard-storefront .wcv-wizard-storefront-feature::before{margin-left:-2em;position:absolute}.wcv-wizard-storefront .wcv-wizard-storefront-feature.first{clear:both;float:left}.wcv-wizard-storefront .wcv-wizard-storefront-feature.last{float:right}.hide{display:none}.wcv-wizard-features{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;padding:0}.wcv-wizard-features .wcv-wizard-feature-item{-ms-flex-preferred-size:calc(50% - 4em - 3px);flex-basis:calc(50% - 4em - 3px);border:1px solid #eee;padding:2em}.wcv-wizard-features .wcv-wizard-feature-item:nth-child(1){border-radius:4px 0 0 0}.wcv-wizard-features .wcv-wizard-feature-item:nth-child(2){border-left:0;border-radius:0 4px 0 0}.wcv-wizard-features .wcv-wizard-feature-item:nth-child(3){border-top:0;border-radius:0 0 0 4px}.wcv-wizard-features .wcv-wizard-feature-item:nth-child(4){border-top:0;border-left:0;border-radius:0 0 4px 0}.wcv-wizard-features p.wcv-wizard-feature-description,.wcv-wizard-features p.wcv-wizard-feature-name{margin:0;line-height:1.5em}.step{text-align:center}.wcv-setup .wcv-setup-actions .button{font-weight:300;font-size:16px;padding:.5em 1em;-webkit-box-shadow:none;box-shadow:none;min-width:12em;min-width:auto;margin-top:10px;background-color:#005580;color:#fff}.wcv-setup .wcv-setup-actions .button:active,.wcv-setup .wcv-setup-actions .button:focus,.wcv-setup .wcv-setup-actions .button:hover{-webkit-box-shadow:none;box-shadow:none;background-color:#5897b6}.location-prompt{color:#666;font-size:13px;font-weight:500;margin-bottom:.5em;margin-top:1em;display:inline-block}.address-step .select2{min-width:100%}.store-address-container{margin-bottom:24px}.store-address-container .city-and-postcode{display:-webkit-box;display:-ms-flexbox;display:flex}.store-address-container .city-and-postcode div{-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:1em}.store-address-container .city-and-postcode div:last-of-type{margin-right:0}.wcv-wizard-service-settings .payment-email-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;padding:0 8px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.newsletter-form-container{display:-webkit-box;display:-ms-flexbox;display:flex}.newsletter-form-container .newsletter-form-email{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:42px;padding:0 8px;font-size:16px;color:#666;background-color:#fff;display:inline-block;margin-right:6px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.newsletter-form-container .newsletter-form-button-container{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.wcv-setup .wcv-setup-actions .button.newsletter-form-button{height:42px;padding:0 1em;margin:0}.wcv-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.wcv-wizard-next-steps li{padding:0}.wcv-wizard-next-steps .wcv-wizard-next-step-item{display:-webkit-box;display:-ms-flexbox;display:flex;border-top:1px solid #eee}.wcv-wizard-next-steps .wcv-wizard-next-step-item:first-child{border-top:0}.wcv-wizard-next-steps .wcv-wizard-next-step-description{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin:1.5em}.wcv-wizard-next-steps .wcv-wizard-next-step-action{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.wcv-wizard-next-steps .wcv-wizard-next-step-action .button{margin:1em}.wcv-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.wcv-wizard-next-steps p.next-step-extra-info{margin:0}.wcv-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}p.next-steps-help-text{color:#9f9f9f;padding:0 2em;text-align:center;font-size:.9em}.wcv-setup-table{width:100%}.wcv-setup-table .table-desc{width:80%}.wcv-setup-table .table-check{width:20%;text-align:right}.wcv-setup-table .table-check input.option_check{line-height:4em}.wcv-setup-table-pages{width:100%}.wcv-setup-table-pages .table-desc{width:60%}.wcv-setup-table-pages .table-check{width:40%}.wcv-setup-table-pages select{width:100%}.wcv-setup-table-pages .tool-tip{font-size:.75em}
 
trunk/assets/css/wcv-setup.scss DELETED
@@ -1,540 +0,0 @@
1
- /**
2
- * WC Vendors setup wizard styles
3
- */
4
-
5
- @import 'variables';
6
-
7
- body {
8
- margin: 65px auto 24px;
9
- box-shadow: none;
10
- background: #f1f1f1;
11
- padding: 0;
12
- }
13
- #wcv-logo {
14
- border: 0;
15
- margin: 0 0 24px;
16
- padding: 0;
17
- text-align: center;
18
- img {
19
- max-width: 30%;
20
- }
21
- }
22
- .wcv-setup-content {
23
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13);
24
- padding: 2em;
25
- margin: 0 0 20px;
26
- background: #fff;
27
- overflow: hidden;
28
- zoom: 1;
29
-
30
- h1, h2, h3, table {
31
- margin: 0 0 20px;
32
- border: 0;
33
- padding: 0;
34
- color: #666;
35
- clear: none;
36
- font-weight: 500;
37
- }
38
- p {
39
- margin: 20px 0;
40
- font-size: 1em;
41
- line-height: 1.75em;
42
- color: #666;
43
- }
44
- table {
45
- font-size: 1em;
46
- line-height: 1.75em;
47
- color: #666;
48
- }
49
- a {
50
- color: $wcvendors;
51
- &:hover, &:focus {
52
- color: #111;
53
- }
54
- }
55
- h4.help-title {
56
- text-align: center;
57
- }
58
- .wcv-setup-input {
59
-
60
- input {
61
- padding: 5px 10px;
62
- font-size: 1em;
63
- }
64
-
65
- }
66
- .wcv-setup-next-steps {
67
- overflow: hidden;
68
- margin: 0 0 24px;
69
- padding-bottom: 2px;
70
- h2 {
71
- margin-bottom: 12px;
72
- }
73
- .wcv-setup-next-steps-first {
74
- float: left;
75
- width: 50%;
76
- box-sizing: border-box;
77
- }
78
- .wcv-setup-next-steps-last {
79
- float: right;
80
- width: 50%;
81
- box-sizing: border-box;
82
- }
83
- ul {
84
- padding: 0 2em 0 0;
85
- list-style: none outside;
86
- margin: 0;
87
- li a {
88
- display: block;
89
- padding: 0 0 0.75em;
90
- }
91
- .setup-product {
92
- a.button {
93
- background-color: #f7f7f7;
94
- border-color: #ccc;
95
- color: #23282d;
96
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #ccc;
97
- text-shadow: 1px 0 1px #eee, 0 1px 1px #eee;
98
- font-size: 1em;
99
- height: auto;
100
- line-height: 1.75em;
101
- margin: 0 0 0.75em;
102
- opacity: 1;
103
- padding: 1em;
104
- text-align: center;
105
-
106
- &:hover, &:focus, &:active {
107
- background: $wcvendors-light;
108
- border-color: #aaa;
109
- }
110
- }
111
- a.button-primary {
112
- color: #fff;
113
- background-color: #bb77ae;
114
- border-color: $wcvendors-light;
115
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 $wcvendors-light;
116
- text-shadow: 0 -1px 1px $wcvendors-light, 1px 0 1px $wcvendors-light, 0 1px 1px $wcvendors-light, -1px 0 1px $wcvendors-light;
117
-
118
- &:hover, &:focus, &:active {
119
- color: #fff;
120
- background: $wcvendors-light;
121
- border-color: $wcvendors-light;
122
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 $wcvendors-light;
123
- }
124
- }
125
- }
126
- li a::before {
127
- color: #82878c;
128
- font: normal 20px/1 'dashicons';
129
- speak: none;
130
- display: inline-block;
131
- padding: 0 10px 0 0;
132
- top: 1px;
133
- position: relative;
134
- -webkit-font-smoothing: antialiased;
135
- -moz-osx-font-smoothing: grayscale;
136
- text-decoration: none !important;
137
- vertical-align: top;
138
- }
139
- .learn-more a::before {
140
- content: '\f105';
141
- }
142
- .video-walkthrough a::before {
143
- content: '\f126';
144
- }
145
- .newsletter a::before {
146
- content: '\f465';
147
- }
148
- }
149
- }
150
- .wcvendors-newsletter,
151
- .wcvendors-tracker,
152
- .updated {
153
- padding: 24px 24px 0;
154
- margin: 0 0 24px;
155
- overflow: hidden;
156
- background: #f5f5f5;
157
- p {
158
- padding: 0;
159
- margin: 0 0 12px;
160
- }
161
- form,
162
- p:last-child {
163
- margin: 0 0 24px;
164
- }
165
- }
166
- .wcvendors-tracker + .wcvendors-newsletter {
167
- margin-top: -24px;
168
- border-top: 2px dashed #ddd;
169
- }
170
- }
171
- .wcv-setup-steps {
172
- padding: 0 0 24px;
173
- margin: 0;
174
- list-style: none outside;
175
- overflow: hidden;
176
- color: #ccc;
177
- width:100%;
178
- display: inline-flex;
179
- li {
180
- width: 25%;
181
- float: left;
182
- padding: 0 0 0.8em;
183
- margin: 0;
184
- text-align: center;
185
- position: relative;
186
- border-bottom: 4px solid #ccc;
187
- line-height: 1.4em;
188
- }
189
- li::before {
190
- content: '';
191
- border: 4px solid #ccc;
192
- border-radius: 100%;
193
- width: 4px;
194
- height: 4px;
195
- position: absolute;
196
- bottom: 0;
197
- left: 50%;
198
- margin-left: -6px;
199
- margin-bottom: -8px;
200
- background: #fff;
201
- }
202
- li.active {
203
- border-color: $wcvendors-light;
204
- color: $wcvendors;
205
- &::before {
206
- border-color: #005580;
207
- }
208
- }
209
- li.done {
210
- border-color: $wcvendors-light;
211
- color: $wcvendors;
212
- &::before {
213
- border-color: $wcvendors-light;
214
- background: $wcvendors-light;
215
- }
216
- }
217
- }
218
- .wcv-setup .wcv-setup-actions {
219
- overflow: hidden;
220
- margin: 20px 0 0;
221
- .button {
222
- font-size: 1.25em;
223
- line-height: 1em;
224
- margin-right: 0.5em;
225
- margin-bottom: 2px;
226
- height: auto;
227
- border-radius: 4px;
228
- }
229
- .button-primary {
230
- background-color: $wcvendors;
231
- border-color: $wcvendors-light;
232
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 $wcvendors-light;
233
- text-shadow: 0 -1px 1px $wcvendors-light, 1px 0 1px $wcvendors-light, 0 1px 1px $wcvendors-light, -1px 0 1px $wcvendors-light;
234
- margin: 0;
235
- opacity: 1;
236
-
237
- &:hover, &:focus, &:active {
238
- background: $wcvendors-light;
239
- border-color: $wcvendors-light;
240
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 $wcvendors-light;
241
- }
242
- }
243
- }
244
-
245
- .wcv-setup-content p:last-child {
246
- margin-bottom: 0;
247
- }
248
-
249
- .wcv-setup-content p.store-setup {
250
- margin-top: 0;
251
- }
252
-
253
- .wcv-return-to-dashboard {
254
- font-size: 0.85em;
255
- color: #b5b5b5;
256
- margin: 1.18em 0;
257
- display: block;
258
- text-align: center;
259
- }
260
-
261
- .wcv-wizard-storefront {
262
- .wcv-wizard-storefront-intro {
263
- padding: 40px 40px 0;
264
- background: #F5F5F5;
265
- text-align: center;
266
-
267
- img {
268
- margin: 40px 0 0 0;
269
- width: 100%;
270
- display: block;
271
- }
272
- }
273
- .wcv-wizard-storefront-features {
274
- list-style: none outside;
275
- margin: 0 0 20px;
276
- padding: 0 0 0 30px;
277
- overflow: hidden;
278
- }
279
- .wcv-wizard-storefront-feature {
280
- margin: 0;
281
- padding: 20px 30px 20px 2em;
282
- width: 50%;
283
- box-sizing: border-box;
284
-
285
- &::before {
286
- margin-left: -2em;
287
- position: absolute;
288
- }
289
- &.first {
290
- clear: both;
291
- float: left;
292
- }
293
- &.last {
294
- float: right;
295
- }
296
- }
297
- }
298
-
299
- .hide {
300
- display: none;
301
- }
302
-
303
- .wcv-wizard-features {
304
- display: flex;
305
- flex-wrap: wrap;
306
- list-style: none;
307
- padding: 0;
308
-
309
- .wcv-wizard-feature-item {
310
- flex-basis: calc( 50% - 4em - 3px); // two columns, account for padding and borders
311
- border: 1px solid #eee;
312
- padding: 2em;
313
- }
314
-
315
- .wcv-wizard-feature-item:nth-child(1) {
316
- border-radius: 4px 0 0 0;
317
- }
318
-
319
- .wcv-wizard-feature-item:nth-child(2) {
320
- border-left: 0;
321
- border-radius: 0 4px 0 0;
322
- }
323
-
324
- .wcv-wizard-feature-item:nth-child(3) {
325
- border-top: 0;
326
- border-radius: 0 0 0 4px;
327
- }
328
-
329
- .wcv-wizard-feature-item:nth-child(4) {
330
- border-top: 0;
331
- border-left: 0;
332
- border-radius: 0 0 4px 0;
333
- }
334
-
335
- p.wcv-wizard-feature-name,
336
- p.wcv-wizard-feature-description {
337
- margin: 0;
338
- line-height: 1.5em;
339
- }
340
- }
341
-
342
- .step {
343
- text-align: center;
344
- }
345
-
346
- .wcv-setup .wcv-setup-actions .button {
347
- font-weight: 300;
348
- font-size: 16px;
349
- padding: 0.5em 1em;
350
- box-shadow: none;
351
- min-width: 12em;
352
- min-width: auto;
353
- margin-top:10px;
354
- background-color: $wcvendors;
355
- color: $white;
356
-
357
- &:focus,
358
- &:hover,
359
- &:active {
360
- box-shadow: none;
361
- background-color: $wcvendors-light;
362
- }
363
- }
364
-
365
- .location-prompt {
366
- color: #666;
367
- font-size: 13px;
368
- font-weight: 500;
369
- margin-bottom: 0.5em;
370
- margin-top: 1em;
371
- display: inline-block;
372
- }
373
-
374
- .address-step {
375
- .select2 {
376
- min-width: 100%; // widen currency, product type dropdowns
377
- }
378
- }
379
-
380
- .store-address-container {
381
- margin-bottom: 24px; // match margin-bottom on top paragraph
382
-
383
- .city-and-postcode {
384
- display: flex;
385
-
386
- div {
387
- flex-basis: 50%;
388
- margin-right: 1em;
389
-
390
- &:last-of-type {
391
- margin-right: 0;
392
- }
393
- }
394
- }
395
- }
396
-
397
- .wcv-wizard-service-settings {
398
- .payment-email-input {
399
- border: 1px solid #aaa;
400
- border-color: #ddd;
401
- border-radius: 4px;
402
- height: 30px;
403
- padding: 0 8px;
404
- font-size: 14px;
405
- color: #444;
406
- background-color: #fff;
407
- display: inline-block;
408
- }
409
- }
410
-
411
- .newsletter-form-container {
412
- display: flex;
413
-
414
- .newsletter-form-email {
415
- border: 1px solid #aaa;
416
- border-color: #ddd;
417
- border-radius: 4px;
418
- height: 42px;
419
- padding: 0 8px;
420
- font-size: 16px;
421
- color: #666;
422
- background-color: #fff;
423
- display: inline-block;
424
- margin-right: 6px;
425
- flex-grow: 1;
426
- }
427
-
428
- .newsletter-form-button-container {
429
- flex-grow: 0;
430
- }
431
- }
432
-
433
- .wcv-setup .wcv-setup-actions .button.newsletter-form-button {
434
- height: 42px;
435
- padding: 0 1em;
436
- margin: 0;
437
- }
438
-
439
- .wcv-wizard-next-steps {
440
- border: 1px solid #eee;
441
- border-radius: 4px;
442
- list-style: none;
443
- padding: 0;
444
-
445
- li {
446
- padding: 0;
447
- }
448
-
449
- .wcv-wizard-next-step-item {
450
- display: flex;
451
- border-top: 1px solid #eee;
452
-
453
- &:first-child {
454
- border-top: 0;
455
- }
456
- }
457
-
458
- .wcv-wizard-next-step-description {
459
- flex-grow: 1;
460
- margin: 1.5em;
461
- }
462
-
463
- .wcv-wizard-next-step-action {
464
- flex-grow: 0;
465
- display: flex;
466
- align-items: center;
467
-
468
- .button {
469
- margin: 1em;
470
- }
471
- }
472
-
473
- p {
474
- &.next-step-heading {
475
- margin: 0;
476
- font-size: 0.95em;
477
- font-weight: 400;
478
- font-variant: all-petite-caps;
479
- }
480
-
481
- &.next-step-extra-info {
482
- margin: 0;
483
- }
484
- }
485
-
486
- h3 {
487
- &.next-step-description {
488
- margin: 0;
489
- font-size: 16px;
490
- font-weight: 600;
491
- }
492
- }
493
- }
494
-
495
- p.next-steps-help-text {
496
- color: #9f9f9f;
497
- padding: 0 2em;
498
- text-align: center;
499
- font-size: .9em;
500
- }
501
-
502
- .wcv-setup-table {
503
- width: 100%;
504
-
505
- .table-desc {
506
- width: 80%;
507
- }
508
-
509
- .table-check {
510
- width: 20%;
511
- text-align: right;
512
-
513
- input.option_check {
514
- line-height: 4em;
515
- }
516
- }
517
- }
518
-
519
- .wcv-setup-table-pages {
520
-
521
- width: 100%;
522
-
523
- .table-desc {
524
- width: 60%;
525
- }
526
-
527
- .table-check{
528
- width: 40%;
529
-
530
- }
531
-
532
- select {
533
- width: 100%;
534
- }
535
-
536
- .tool-tip {
537
- font-size: 0.75em;
538
- }
539
-
540
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/icon-128x128.png DELETED
Binary file
trunk/assets/icon-256x256.png DELETED
Binary file
trunk/assets/icon.svg DELETED
@@ -1,115 +0,0 @@
1
- <svg viewBox="0 0 500 500" xmlns:xlink="http://www.w3.org/1999/xlink" height="500pt" xmlns="http://www.w3.org/2000/svg" width="500pt" version="1.1"><defs>
2
- <path d="M0.00 0.00 L500.00 0.00 L500.00 500.00 L0.00 500.00 L0.00 0.00" id="p1" />
3
- <path d="M81.20 65.86 C86.56 60.77 91.79 55.56 97.38 50.72 C107.88 60.16 117.24 70.79 127.00 80.99 C128.97 82.95 130.73 85.43 133.41 86.45 C159.98 91.11 186.86 94.12 213.31 99.49 C210.33 110.00 209.66 121.01 210.56 131.87 C209.92 132.04 208.62 132.39 207.98 132.56 C202.01 127.72 197.14 121.68 191.11 116.90 C189.06 118.91 187.01 120.94 185.01 123.02 C190.35 131.20 200.26 135.94 203.39 145.57 C209.87 163.03 216.76 180.34 223.07 197.87 C224.22 201.13 225.75 204.40 225.73 207.92 C225.48 210.20 224.29 212.23 223.45 214.33 C218.99 214.61 213.97 215.23 210.88 218.83 C206.43 223.50 206.18 231.57 210.72 236.26 C214.45 240.56 221.21 241.88 226.19 239.01 C229.57 237.26 231.39 233.76 233.26 230.63 C245.84 230.66 258.41 230.60 270.99 230.62 C273.85 234.22 277.18 238.38 282.14 238.75 C290.33 239.91 298.02 231.30 296.09 223.30 C295.06 218.43 291.12 213.77 285.94 213.32 C283.08 213.15 279.97 212.97 277.41 214.48 C274.11 216.23 272.37 219.70 270.36 222.67 C257.45 222.43 244.54 222.73 231.63 222.60 C231.23 221.17 230.42 219.79 230.48 218.28 C232.02 214.41 234.51 211.00 236.64 207.44 C258.76 207.23 280.89 207.41 303.02 207.35 C306.26 207.36 309.47 206.89 312.68 206.51 C318.99 188.69 324.59 170.62 330.81 152.76 C335.01 141.26 338.42 129.35 338.50 117.01 C340.36 116.86 342.22 116.70 344.09 116.61 C361.99 119.04 379.93 121.68 397.83 124.32 C402.13 124.81 406.39 125.63 410.62 126.55 C403.27 145.65 395.55 164.62 387.85 183.58 C378.36 207.78 368.47 231.83 358.81 255.96 C358.00 257.55 357.28 260.14 354.98 259.62 C302.96 259.67 250.95 259.66 198.94 259.64 C192.82 268.77 187.99 278.69 182.23 288.04 C183.91 290.90 185.62 293.75 187.31 296.60 C219.72 296.40 252.14 296.83 284.55 296.58 C286.89 292.12 289.20 287.47 293.01 284.04 C299.46 278.23 308.31 274.89 317.02 275.69 C323.90 276.57 330.74 279.33 335.69 284.30 C344.03 292.07 347.71 304.76 344.07 315.67 C340.38 328.98 326.77 338.79 312.95 337.73 C305.62 337.97 298.61 334.62 293.18 329.88 C289.31 326.54 286.92 321.92 284.65 317.42 C252.37 317.52 220.08 317.37 187.79 317.40 C184.23 327.96 175.12 336.50 164.06 338.49 C157.93 338.96 151.44 339.27 145.74 336.56 C136.84 332.90 130.00 324.79 127.80 315.44 C123.88 301.38 131.94 285.22 145.36 279.60 C151.47 276.43 158.54 277.23 165.16 277.52 C168.19 272.67 171.14 267.76 173.92 262.75 C174.75 261.00 175.93 259.01 175.05 257.05 C156.08 206.34 137.13 155.61 118.35 104.82 C116.85 100.91 113.30 98.43 110.51 95.50 C100.78 85.58 90.84 75.87 81.20 65.86" id="p2" />
4
- <path d="M253.24 60.18 C263.69 56.37 275.17 55.47 286.08 57.67 C306.03 61.43 323.82 75.24 332.41 93.63 C335.86 100.47 337.10 108.10 338.47 115.57 C340.34 115.90 342.21 116.25 344.09 116.61 C342.22 116.70 340.36 116.86 338.50 117.01 C338.42 129.35 335.01 141.26 330.81 152.76 C330.91 152.05 331.11 150.61 331.21 149.90 C327.89 149.46 324.57 149.03 321.26 148.54 C324.36 145.83 326.00 142.01 327.03 138.11 C322.06 139.30 317.29 141.18 312.62 143.23 C312.54 144.58 312.47 145.93 312.39 147.28 C304.65 146.22 296.88 145.38 289.15 144.31 C296.20 144.79 303.34 144.08 309.67 140.72 C309.16 130.99 307.96 121.15 304.13 112.11 C294.74 115.07 285.26 117.86 276.27 121.91 C278.45 129.10 280.84 136.23 283.68 143.20 C281.05 142.76 278.41 142.43 275.79 142.02 C277.11 142.05 278.44 142.07 279.76 142.06 C278.04 135.54 276.02 129.08 273.04 123.01 C263.51 125.91 254.10 129.22 244.90 133.05 C245.84 134.76 246.79 136.47 247.76 138.18 C246.23 137.96 244.70 137.73 243.18 137.48 C242.91 136.63 242.38 134.93 242.11 134.08 C240.17 134.82 238.24 135.58 236.29 136.25 C234.13 135.94 231.97 135.60 229.80 135.37 C233.53 133.99 237.13 132.29 240.76 130.67 C238.29 121.32 236.29 111.85 235.33 102.22 C230.57 103.65 225.55 104.63 221.26 107.25 C219.83 107.98 219.46 109.65 219.15 111.08 C217.74 118.45 218.42 126.01 219.67 133.35 C222.15 133.94 224.63 134.56 227.13 135.09 C220.73 134.36 214.33 133.60 207.98 132.56 C208.62 132.39 209.92 132.04 210.56 131.87 C209.66 121.01 210.33 110.00 213.31 99.49 C214.95 97.03 216.72 94.62 217.77 91.82 C224.02 76.61 237.71 65.12 253.24 60.18" id="p3" />
5
- <path d="M275.16 65.49 C285.44 65.01 295.90 68.43 304.25 74.39 C299.93 76.02 295.68 78.09 291.08 78.77 C289.26 78.22 288.12 76.47 286.74 75.25 C283.30 71.52 279.12 68.62 275.16 65.49" id="p4" />
6
- <path d="M257.29 67.74 C260.96 67.01 264.82 64.89 268.55 66.41 C275.87 69.13 281.83 74.53 286.98 80.25 C279.76 83.40 272.26 85.85 264.77 88.30 C261.91 81.58 259.74 74.61 257.29 67.74" id="p5" />
7
- <path d="M244.73 74.69 C246.69 71.38 250.73 70.47 253.98 68.91 C256.43 75.78 259.22 82.55 261.07 89.62 C253.86 92.39 246.55 94.88 239.17 97.13 C239.01 89.33 240.64 81.39 244.73 74.69" id="p6" />
8
- <path d="M293.00 81.94 C298.24 80.55 303.16 77.58 308.64 77.32 C316.48 83.22 322.52 91.57 326.03 100.72 C319.66 103.33 313.07 105.32 306.68 107.85 C304.99 104.32 303.45 100.72 301.81 97.17 C299.36 91.82 295.93 87.02 293.00 81.94" id="p7" />
9
- <path d="M223.06 99.00 C226.54 90.81 231.87 83.26 238.92 77.77 C237.24 84.66 235.54 91.61 235.40 98.75 C231.38 100.03 227.16 99.59 223.06 99.00" id="p8" />
10
- <path d="M265.96 91.87 C273.55 88.59 281.49 86.23 289.21 83.26 C295.39 91.04 300.24 99.97 303.07 109.51 C301.21 109.62 299.35 109.77 297.49 109.73 C289.68 109.23 282.02 107.44 274.21 106.86 C272.58 106.37 270.71 105.75 269.96 104.07 C268.00 100.24 267.22 95.95 265.96 91.87" id="p9" />
11
- <path d="M244.65 98.80 C250.62 96.97 256.46 94.72 262.47 93.04 C264.07 97.12 265.59 101.23 266.82 105.43 C266.08 105.31 264.58 105.05 263.84 104.93 C255.85 103.73 247.89 102.15 239.82 101.67 C241.19 100.36 242.79 99.29 244.65 98.80" id="p10" />
12
- <path d="M221.08 100.93 C223.47 100.26 225.92 99.94 228.40 99.93 C226.49 101.61 224.27 102.88 221.97 103.96 C221.68 102.94 221.38 101.93 221.08 100.93" id="p11" />
13
- <path d="M221.26 107.25 C225.55 104.63 230.57 103.65 235.33 102.22 C236.29 111.85 238.29 121.32 240.76 130.67 C237.13 132.29 233.53 133.99 229.80 135.37 C229.13 135.30 227.79 135.16 227.13 135.09 C224.63 134.56 222.15 133.94 219.67 133.35 C218.42 126.01 217.74 118.45 219.15 111.08 C219.46 109.65 219.83 107.98 221.26 107.25" id="p12" />
14
- <path d="M238.32 101.65 C238.69 101.65 239.44 101.67 239.82 101.67 C247.89 102.15 255.85 103.73 263.84 104.93 C269.90 107.04 270.01 114.59 271.94 119.75 C262.84 123.54 253.47 126.65 244.14 129.82 C240.28 120.92 239.46 111.16 238.32 101.65" id="p13" />
15
- <path d="M309.15 110.27 C315.15 108.26 321.12 106.14 327.11 104.09 C328.26 107.44 328.98 110.92 329.43 114.43 C328.57 114.32 326.85 114.11 325.99 114.00 C320.71 113.11 315.39 112.32 310.02 112.23 C309.80 111.74 309.37 110.76 309.15 110.27" id="p14" />
16
- <path d="M271.10 106.60 C271.88 106.67 273.43 106.80 274.21 106.86 C282.02 107.44 289.68 109.23 297.49 109.73 C291.10 114.55 282.87 115.54 275.71 118.80 C273.39 115.07 271.97 110.89 271.10 106.60" id="p15" />
17
- <path d="M276.27 121.91 C285.26 117.86 294.74 115.07 304.13 112.11 C307.96 121.15 309.16 130.99 309.67 140.72 C303.34 144.08 296.20 144.79 289.15 144.31 C287.33 143.93 285.51 143.52 283.68 143.20 C280.84 136.23 278.45 129.10 276.27 121.91" id="p16" />
18
- <path d="M308.08 112.16 C308.56 112.18 309.54 112.21 310.02 112.23 C315.39 112.32 320.71 113.11 325.99 114.00 C327.22 114.33 328.42 114.74 329.63 115.15 C329.71 120.23 330.06 125.37 329.19 130.41 C328.85 131.79 328.60 133.45 327.26 134.23 C322.80 136.90 317.60 137.90 312.62 139.17 C312.24 130.00 310.00 121.09 308.08 112.16" id="p17" />
19
- <path d="M185.01 123.02 C187.01 120.94 189.06 118.91 191.11 116.90 C197.14 121.68 202.01 127.72 207.98 132.56 C214.33 133.60 220.73 134.36 227.13 135.09 C227.79 135.16 229.13 135.30 229.80 135.37 C231.97 135.60 234.13 135.94 236.29 136.25 C238.59 136.64 240.87 137.11 243.18 137.48 C244.70 137.73 246.23 137.96 247.76 138.18 C257.11 139.42 266.44 140.80 275.79 142.02 C278.41 142.43 281.05 142.76 283.68 143.20 C285.51 143.52 287.33 143.93 289.15 144.31 C296.88 145.38 304.65 146.22 312.39 147.28 C315.36 147.60 318.31 148.07 321.26 148.54 C324.57 149.03 327.89 149.46 331.21 149.90 C331.11 150.61 330.91 152.05 330.81 152.76 C324.59 170.62 318.99 188.69 312.68 206.51 C309.47 206.89 306.26 207.36 303.02 207.35 C280.89 207.41 258.76 207.23 236.64 207.44 C234.51 211.00 232.02 214.41 230.48 218.28 C230.42 219.79 231.23 221.17 231.63 222.60 C244.54 222.73 257.45 222.43 270.36 222.67 C272.37 219.70 274.11 216.23 277.41 214.48 C279.97 212.97 283.08 213.15 285.94 213.32 C291.12 213.77 295.06 218.43 296.09 223.30 C298.02 231.30 290.33 239.91 282.14 238.75 C277.18 238.38 273.85 234.22 270.99 230.62 C258.41 230.60 245.84 230.66 233.26 230.63 C231.39 233.76 229.57 237.26 226.19 239.01 C221.21 241.88 214.45 240.56 210.72 236.26 C206.18 231.57 206.43 223.50 210.88 218.83 C213.97 215.23 218.99 214.61 223.45 214.33 C224.29 212.23 225.48 210.20 225.73 207.92 C225.75 204.40 224.22 201.13 223.07 197.87 C216.76 180.34 209.87 163.03 203.39 145.57 C200.26 135.94 190.35 131.20 185.01 123.02" id="p18" />
20
- <path d="M244.90 133.05 C254.10 129.22 263.51 125.91 273.04 123.01 C276.02 129.08 278.04 135.54 279.76 142.06 C278.44 142.07 277.11 142.05 275.79 142.02 C266.44 140.80 257.11 139.42 247.76 138.18 C246.79 136.47 245.84 134.76 244.90 133.05" id="p19" />
21
- <path d="M236.29 136.25 C238.24 135.58 240.17 134.82 242.11 134.08 C242.38 134.93 242.91 136.63 243.18 137.48 C240.87 137.11 238.59 136.64 236.29 136.25" id="p20" />
22
- <path d="M312.62 143.23 C317.29 141.18 322.06 139.30 327.03 138.11 C326.00 142.01 324.36 145.83 321.26 148.54 C318.31 148.07 315.36 147.60 312.39 147.28 C312.47 145.93 312.54 144.58 312.62 143.23" id="p21" />
23
- <path d="M307.28 144.01 C308.89 142.91 310.81 145.58 308.86 146.46 C307.25 147.55 305.34 144.90 307.28 144.01" id="p22" />
24
- <path d="M334.44 364.50 C337.13 364.56 339.83 364.56 342.52 364.53 C342.61 382.95 342.59 401.36 342.60 419.78 C340.72 419.54 338.71 419.77 336.95 418.99 C335.99 417.77 335.28 416.38 334.50 415.05 C331.13 417.51 327.44 420.24 323.01 419.85 C318.57 420.21 314.00 418.16 311.74 414.26 C308.30 408.88 308.10 402.15 308.80 395.99 C309.63 388.95 314.97 382.17 322.23 381.16 C326.53 380.09 330.61 382.39 334.44 384.02 C334.50 377.51 334.48 371.00 334.44 364.50" id="p23" />
25
- <path d="M143.41 370.40 C153.35 363.44 167.47 364.52 176.74 372.15 C175.45 374.12 174.16 376.09 172.89 378.07 C168.25 375.68 163.45 372.78 157.99 373.35 C150.51 373.18 143.91 379.07 142.29 386.21 C140.36 394.04 141.45 403.57 147.86 409.11 C152.13 413.05 158.33 413.23 163.78 412.54 C167.33 411.93 170.22 409.61 173.11 407.64 C174.60 409.18 176.12 410.71 177.66 412.22 C171.73 419.80 161.09 421.64 152.09 419.87 C143.82 418.24 136.85 411.76 134.26 403.80 C130.24 392.30 133.04 377.63 143.41 370.40" id="p24" />
26
- <path d="M178.93 366.41 C181.81 366.43 184.70 366.45 187.58 366.46 C191.15 373.80 193.75 381.54 196.85 389.06 C199.50 395.69 202.23 402.30 204.41 409.10 C207.00 401.05 210.22 393.23 213.47 385.43 C216.14 379.11 217.79 372.37 221.19 366.37 C224.12 366.38 227.06 366.39 229.99 366.39 C222.35 383.96 215.94 402.03 208.42 419.64 C205.73 419.62 203.05 419.62 200.37 419.66 C193.36 401.85 185.80 384.27 178.93 366.41" id="p25" />
27
- <path d="M53.08 366.56 C54.07 366.56 56.03 366.57 57.02 366.58 C59.99 376.33 63.12 386.04 66.10 395.79 C68.45 403.67 71.43 411.37 73.07 419.45 C71.64 418.81 70.22 418.18 68.81 417.54 C63.90 400.45 58.20 383.59 53.08 366.56" id="p26" />
28
- <path d="M57.02 366.58 C59.94 366.60 62.94 366.20 65.80 366.93 C67.30 368.09 67.56 370.16 68.20 371.83 C70.70 380.91 73.68 389.86 75.87 399.03 C76.58 398.07 77.29 397.11 78.00 396.17 C77.41 399.59 77.49 403.08 77.87 406.52 C80.78 400.52 82.51 394.06 84.63 387.77 C87.02 380.58 89.38 373.38 91.82 366.21 C93.85 366.39 95.88 366.47 97.89 366.82 C100.03 368.84 100.44 371.96 101.47 374.60 C104.30 382.72 106.30 391.18 110.29 398.85 C110.83 401.34 111.42 403.82 112.07 406.29 C116.25 393.06 119.43 379.54 123.93 366.41 C126.82 366.48 129.71 366.51 132.60 366.59 C127.46 384.35 121.60 401.89 116.44 419.64 C113.67 419.69 110.90 419.73 108.13 419.84 C104.06 406.35 99.53 393.00 95.02 379.66 C94.47 382.07 93.95 384.49 93.38 386.91 C92.32 388.69 91.14 390.43 90.50 392.42 C87.65 401.55 84.83 410.70 81.53 419.67 C77.67 420.08 73.80 420.33 69.92 420.43 C69.55 419.46 69.18 418.50 68.81 417.54 C70.22 418.18 71.64 418.81 73.07 419.45 C71.43 411.37 68.45 403.67 66.10 395.79 C63.12 386.04 59.99 376.33 57.02 366.58" id="p27" />
29
- <path d="M87.64 367.66 C88.84 366.71 90.38 366.53 91.82 366.21 C89.38 373.38 87.02 380.58 84.63 387.77 C82.51 394.06 80.78 400.52 77.87 406.52 C77.49 403.08 77.41 399.59 78.00 396.17 C80.06 389.57 82.26 383.01 84.45 376.46 C85.45 373.51 86.05 370.38 87.64 367.66" id="p28" />
30
- <path d="M110.29 398.85 C113.64 388.16 116.22 377.23 119.93 366.65 C121.26 366.56 122.60 366.48 123.93 366.41 C119.43 379.54 116.25 393.06 112.07 406.29 C111.42 403.82 110.83 401.34 110.29 398.85" id="p29" />
31
- <path d="M93.38 386.91 C93.95 384.49 94.47 382.07 95.02 379.66 C99.53 393.00 104.06 406.35 108.13 419.84 C106.82 419.76 105.51 419.70 104.20 419.64 C100.73 408.69 97.31 397.70 93.38 386.91" id="p30" />
32
- <path d="M240.45 381.73 C245.53 380.89 251.36 380.95 255.44 384.55 C260.47 388.46 261.75 395.23 261.36 401.26 C252.58 401.58 243.79 401.33 235.01 401.45 C235.52 405.78 236.64 410.89 241.00 412.92 C246.63 415.31 252.58 412.65 257.78 410.41 C258.80 411.69 259.83 412.96 260.85 414.24 C253.37 422.03 238.99 422.70 231.76 414.24 C227.04 408.88 226.65 401.18 227.77 394.46 C229.20 388.37 234.33 383.12 240.45 381.73" id="p31" />
33
- <path d="M276.09 385.85 C279.07 383.74 282.21 381.30 286.05 381.30 C290.21 380.89 294.83 382.15 297.38 385.66 C300.32 389.80 300.32 395.13 300.31 400.00 C300.18 406.54 300.59 413.09 299.88 419.61 C297.38 419.58 294.88 419.57 292.39 419.59 C292.34 412.04 292.43 404.50 292.37 396.95 C292.22 394.02 292.11 390.37 289.38 388.58 C284.98 386.05 278.71 388.04 276.18 392.26 C275.20 401.33 276.03 410.54 275.84 419.66 C273.33 419.61 270.82 419.59 268.31 419.58 C268.03 411.39 268.50 403.19 267.93 395.01 C267.67 390.53 267.76 386.04 268.07 381.57 C269.65 381.63 271.24 381.63 272.82 381.86 C274.32 382.78 275.06 384.48 276.09 385.85" id="p32" />
34
- <path d="M362.54 381.76 C368.44 380.79 375.43 380.52 380.15 384.84 C384.95 388.66 386.95 395.04 386.72 401.01 C386.89 407.38 383.97 414.05 378.42 417.45 C374.26 420.20 369.00 419.98 364.24 419.55 C356.95 418.56 351.03 412.20 350.37 404.91 C350.02 400.00 349.71 394.70 352.21 390.25 C354.24 386.12 358.06 382.91 362.54 381.76" id="p33" />
35
- <path d="M409.50 381.26 C411.81 380.14 414.33 381.12 416.67 381.59 C416.48 383.91 416.32 386.23 416.15 388.55 C412.77 388.73 409.05 388.26 406.05 390.15 C403.52 392.27 402.42 395.71 402.52 398.94 C402.49 405.78 402.68 412.61 402.48 419.44 C399.86 419.42 397.24 419.41 394.63 419.41 C394.67 406.79 394.49 394.17 394.69 381.56 C396.87 381.58 399.04 381.63 401.23 381.69 C401.44 383.79 401.63 385.89 401.81 387.99 C404.06 385.44 406.14 382.42 409.50 381.26" id="p34" />
36
- <path d="M426.86 382.05 C433.14 379.23 440.14 381.39 445.61 384.95 C444.77 386.46 443.94 387.97 443.10 389.48 C438.67 388.10 433.45 384.99 429.04 388.07 C427.05 389.20 427.51 391.75 427.18 393.66 C432.77 397.46 440.85 397.10 445.01 402.96 C448.54 408.99 444.44 417.02 438.03 418.97 C431.50 420.68 424.21 419.88 418.70 415.77 C419.50 414.12 420.32 412.50 421.17 410.88 C425.94 412.40 431.21 416.20 436.20 413.24 C439.21 411.93 439.70 406.96 436.60 405.45 C431.65 402.58 424.89 402.74 421.17 397.88 C417.30 392.40 420.67 384.08 426.86 382.05" id="p35" />
37
- <path d="M241.60 387.61 C244.69 386.95 248.48 386.69 250.97 389.01 C253.20 390.77 253.61 393.74 254.33 396.31 C247.93 396.56 241.51 396.60 235.11 396.33 C236.00 392.73 237.71 388.76 241.60 387.61" id="p36" />
38
- <path d="M323.47 387.57 C327.21 386.79 332.49 387.10 334.27 391.07 C334.79 395.71 334.47 400.40 334.54 405.06 C335.59 412.84 323.62 416.76 319.06 410.94 C316.44 406.87 316.21 401.71 316.83 397.05 C317.45 393.16 319.41 388.80 323.47 387.57" id="p37" />
39
- <path d="M364.46 387.73 C368.51 386.76 373.52 387.21 376.12 390.88 C378.70 394.66 378.78 399.58 378.39 403.99 C377.91 407.70 376.28 412.02 372.35 413.21 C368.58 414.10 363.76 414.21 361.07 410.93 C357.83 407.06 358.04 401.71 358.41 396.99 C358.73 393.24 360.61 388.95 364.46 387.73" id="p38" /></defs><g stroke-width="10pt">
40
- <use stroke="#fff" xlink:href="#p1" />
41
- <use stroke="#005580" xlink:href="#p2" />
42
- <use stroke="#5e9ab8" xlink:href="#p3" />
43
- <use stroke="#fff" xlink:href="#p4" />
44
- <use stroke="#fff" xlink:href="#p5" />
45
- <use stroke="#fff" xlink:href="#p6" />
46
- <use stroke="#fff" xlink:href="#p7" />
47
- <use stroke="#fff" xlink:href="#p8" />
48
- <use stroke="#fff" xlink:href="#p9" />
49
- <use stroke="#fff" xlink:href="#p10" />
50
- <use stroke="#005580" xlink:href="#p11" />
51
- <use stroke="#005580" xlink:href="#p12" />
52
- <use stroke="#005580" xlink:href="#p13" />
53
- <use stroke="#fff" xlink:href="#p14" />
54
- <use stroke="#005580" xlink:href="#p15" />
55
- <use stroke="#005580" xlink:href="#p16" />
56
- <use stroke="#005580" xlink:href="#p17" />
57
- <use stroke="#fff" xlink:href="#p18" />
58
- <use stroke="#005580" xlink:href="#p19" />
59
- <use stroke="#005580" xlink:href="#p20" />
60
- <use stroke="#005580" xlink:href="#p21" />
61
- <use stroke="#005580" xlink:href="#p22" />
62
- <use stroke="#5e9ab8" xlink:href="#p23" />
63
- <use stroke="#5e9ab8" xlink:href="#p24" />
64
- <use stroke="#5e9ab8" xlink:href="#p25" />
65
- <use stroke="#005580" xlink:href="#p26" />
66
- <use stroke="#5e9ab8" xlink:href="#p27" />
67
- <use stroke="#005580" xlink:href="#p28" />
68
- <use stroke="#005580" xlink:href="#p29" />
69
- <use stroke="#005580" xlink:href="#p30" />
70
- <use stroke="#5e9ab8" xlink:href="#p31" />
71
- <use stroke="#5e9ab8" xlink:href="#p32" />
72
- <use stroke="#5e9ab8" xlink:href="#p33" />
73
- <use stroke="#5e9ab8" xlink:href="#p34" />
74
- <use stroke="#5e9ab8" xlink:href="#p35" />
75
- <use stroke="#fff" xlink:href="#p36" />
76
- <use stroke="#fff" xlink:href="#p37" />
77
- <use stroke="#fff" xlink:href="#p38" /></g><g>
78
- <use xlink:href="#p1" fill="#fff" />
79
- <use xlink:href="#p2" fill="#005580" />
80
- <use xlink:href="#p3" fill="#5e9ab8" />
81
- <use xlink:href="#p4" fill="#fff" />
82
- <use xlink:href="#p5" fill="#fff" />
83
- <use xlink:href="#p6" fill="#fff" />
84
- <use xlink:href="#p7" fill="#fff" />
85
- <use xlink:href="#p8" fill="#fff" />
86
- <use xlink:href="#p9" fill="#fff" />
87
- <use xlink:href="#p10" fill="#fff" />
88
- <use xlink:href="#p11" fill="#005580" />
89
- <use xlink:href="#p12" fill="#005580" />
90
- <use xlink:href="#p13" fill="#005580" />
91
- <use xlink:href="#p14" fill="#fff" />
92
- <use xlink:href="#p15" fill="#005580" />
93
- <use xlink:href="#p16" fill="#005580" />
94
- <use xlink:href="#p17" fill="#005580" />
95
- <use xlink:href="#p18" fill="#fff" />
96
- <use xlink:href="#p19" fill="#005580" />
97
- <use xlink:href="#p20" fill="#005580" />
98
- <use xlink:href="#p21" fill="#005580" />
99
- <use xlink:href="#p22" fill="#005580" />
100
- <use xlink:href="#p23" fill="#5e9ab8" />
101
- <use xlink:href="#p24" fill="#5e9ab8" />
102
- <use xlink:href="#p25" fill="#5e9ab8" />
103
- <use xlink:href="#p26" fill="#005580" />
104
- <use xlink:href="#p27" fill="#5e9ab8" />
105
- <use xlink:href="#p28" fill="#005580" />
106
- <use xlink:href="#p29" fill="#005580" />
107
- <use xlink:href="#p30" fill="#005580" />
108
- <use xlink:href="#p31" fill="#5e9ab8" />
109
- <use xlink:href="#p32" fill="#5e9ab8" />
110
- <use xlink:href="#p33" fill="#5e9ab8" />
111
- <use xlink:href="#p34" fill="#5e9ab8" />
112
- <use xlink:href="#p35" fill="#5e9ab8" />
113
- <use xlink:href="#p36" fill="#fff" />
114
- <use xlink:href="#p37" fill="#fff" />
115
- <use xlink:href="#p38" fill="#fff" /></g></svg>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/images/extensions/screenshot-1.png DELETED
Binary file
trunk/assets/images/extensions/screenshot-2.png DELETED
Binary file
trunk/assets/images/extensions/screenshot-3.png DELETED
Binary file
trunk/assets/images/icons/truck.png DELETED
Binary file
trunk/assets/images/wcvendors_logo.png DELETED
Binary file
trunk/assets/js/admin/settings.js DELETED
@@ -1,74 +0,0 @@
1
- /* global wcvendors_settings_params */
2
- ( function( $ ) {
3
-
4
- // Edit prompt
5
- $( function() {
6
- var changed = false;
7
-
8
- $( 'input, textarea, select, checkbox' ).change( function() {
9
- changed = true;
10
- });
11
-
12
- $( '.wcv-nav-tab-wrapper a' ).click( function() {
13
- if ( changed ) {
14
- window.onbeforeunload = function() {
15
- return wcvendors_settings_params.i18n_nav_warning;
16
- };
17
- } else {
18
- window.onbeforeunload = '';
19
- }
20
- });
21
-
22
- $( '.submit input' ).click( function() {
23
- window.onbeforeunload = '';
24
- });
25
- });
26
-
27
- // Select all/none
28
- $( '.wcvendors' ).on( 'click', '.select_all', function() {
29
- $( this ).closest( 'td' ).find( 'select option' ).attr( 'selected', 'selected' );
30
- $( this ).closest( 'td' ).find( 'select' ).trigger( 'change' );
31
- return false;
32
- });
33
-
34
- $( '.wcvendors' ).on( 'click', '.select_none', function() {
35
- $( this ).closest( 'td' ).find( 'select option' ).removeAttr( 'selected' );
36
- $( this ).closest( 'td' ).find( 'select' ).trigger( 'change' );
37
- return false;
38
- });
39
-
40
- // Color picker
41
- $( '.colorpick' )
42
-
43
- .iris({
44
- change: function( event, ui ) {
45
- $( this ).parent().find( '.colorpickpreview' ).css({ backgroundColor: ui.color.toString() });
46
- },
47
- hide: true,
48
- border: true
49
- })
50
-
51
- .on( 'click focus', function( event ) {
52
- event.stopPropagation();
53
- $( '.iris-picker' ).hide();
54
- $( this ).closest( 'td' ).find( '.iris-picker' ).show();
55
- $( this ).data( 'original-value', $( this ).val() );
56
- })
57
-
58
- .on( 'change', function() {
59
- if ( $( this ).is( '.iris-error' ) ) {
60
- var original_value = $( this ).data( 'original-value' );
61
-
62
- if ( original_value.match( /^\#([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/ ) ) {
63
- $( this ).val( $( this ).data( 'original-value' ) ).change();
64
- } else {
65
- $( this ).val( '' ).change();
66
- }
67
- }
68
- });
69
-
70
- $( 'body' ).on( 'click', function() {
71
- $( '.iris-picker' ).hide();
72
- });
73
-
74
- })( jQuery );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/js/admin/wcv-setup.js DELETED
File without changes
trunk/assets/js/admin/wcvendors-media.js DELETED
@@ -1,52 +0,0 @@
1
- jQuery( function( $ ){
2
-
3
- var id;
4
-
5
- // Iterate over all instances of the uploader on the page
6
- $('.wcv-img-id').each( function () {
7
-
8
- id = $( this ).data( 'id' );
9
-
10
- // Handle Add banner
11
- $( '#wcv-add-' + id ).on( 'click', function(e) {
12
- e.preventDefault();
13
- file_uploader( id );
14
- return false;
15
- });
16
-
17
- });
18
-
19
- function file_uploader( id )
20
- {
21
-
22
- var media_uploader, json;
23
-
24
- if (undefined !== media_uploader ) {
25
- media_uploader.open();
26
- return;
27
- }
28
-
29
- media_uploader = wp.media({
30
- title: $( '#wcv-add-' + id ).data('window_title'),
31
- button: {
32
- text: $( '#wcv-add-' + id ).data('save_button'),
33
- },
34
- multiple: false // Set to true to allow multiple files to be selected
35
- });
36
-
37
- media_uploader.on( 'select' , function(){
38
-
39
- json = media_uploader.state().get('selection').first().toJSON();
40
-
41
- if ( 0 > $.trim( json.url.length ) ) {
42
- return;
43
- }
44
-
45
- $( '.wcv-image-container-' + id ).prop( 'src', json.sizes.full.url );
46
- $( '#' + id ).val( json.sizes.full.url );
47
-
48
- });
49
-
50
- media_uploader.open();
51
- }
52
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/js/front-orders.js DELETED
@@ -1,8 +0,0 @@
1
- jQuery(function () {
2
- jQuery('div.order-comments, div.order-tracking').hide();
3
-
4
- jQuery('a.order-comments-link, a.order-tracking-link').on('click', function (e) {
5
- e.preventDefault();
6
- jQuery(this).next('div').slideToggle();
7
- });
8
- });
 
 
 
 
 
 
 
 
trunk/assets/js/select2.min.js DELETED
@@ -1,3 +0,0 @@
1
- /*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return u.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n=b&&b.split("/"),o=s.map,p=o&&o["*"]||{};if(a&&"."===a.charAt(0))if(b){for(a=a.split("/"),g=a.length-1,s.nodeIdCompat&&w.test(a[g])&&(a[g]=a[g].replace(w,"")),a=n.slice(0,n.length-1).concat(a),k=0;k<a.length;k+=1)if(m=a[k],"."===m)a.splice(k,1),k-=1;else if(".."===m){if(1===k&&(".."===a[2]||".."===a[0]))break;k>0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}else 0===a.indexOf("./")&&(a=a.substring(2));if((n||p)&&o){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),n)for(l=n.length;l>0;l-=1)if(e=o[n.slice(0,l).join("/")],e&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&p&&p[d]&&(i=p[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=v.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),n.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){q[a]=b}}function j(a){if(e(r,a)){var c=r[a];delete r[a],t[a]=!0,m.apply(b,c)}if(!e(q,a)&&!e(t,a))throw new Error("No "+a);return q[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return function(){return s&&s.config&&s.config[a]||{}}}var m,n,o,p,q={},r={},s={},t={},u=Object.prototype.hasOwnProperty,v=[].slice,w=/\.js$/;o=function(a,b){var c,d=k(a),e=d[0];return a=d[1],e&&(e=f(e,b),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(b)):f(a,b):(a=f(a,b),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},p={require:function(a){return g(a)},exports:function(a){var b=q[a];return"undefined"!=typeof b?b:q[a]={}},module:function(a){return{id:a,uri:"",exports:q[a],config:l(a)}}},m=function(a,c,d,f){var h,k,l,m,n,s,u=[],v=typeof d;if(f=f||a,"undefined"===v||"function"===v){for(c=!c.length&&d.length?["require","exports","module"]:c,n=0;n<c.length;n+=1)if(m=o(c[n],f),k=m.f,"require"===k)u[n]=p.require(a);else if("exports"===k)u[n]=p.exports(a),s=!0;else if("module"===k)h=u[n]=p.module(a);else if(e(q,k)||e(r,k)||e(t,k))u[n]=j(k);else{if(!m.p)throw new Error(a+" missing "+k);m.p.load(m.n,g(f,!0),i(k),{}),u[n]=q[k]}l=d?d.apply(q[a],u):void 0,a&&(h&&h.exports!==b&&h.exports!==q[a]?q[a]=h.exports:l===b&&s||(q[a]=l))}else a&&(q[a]=d)},a=c=n=function(a,c,d,e,f){if("string"==typeof a)return p[a]?p[a](c):j(o(a,c).f);if(!a.splice){if(s=a,s.deps&&n(s.deps,s.callback),!c)return;c.splice?(a=c,c=d,d=null):a=b}return c=c||function(){},"function"==typeof d&&(d=e,e=f),e?m(b,a,c,d):setTimeout(function(){m(b,a,c,d)},4),n},n.config=function(a){return n(a)},a._defined=q,d=function(a,b,c){if("string"!=typeof a)throw new Error("See almond README: incorrect module build, no module name");b.splice||(c=b,b=[]),e(q,a)||e(r,a)||(r[a]=[a,b,c])},d.amd={jQuery:!0}}(),b.requirejs=a,b.require=c,b.define=d}}(),b.define("almond",function(){}),b.define("jquery",[],function(){var b=a||$;return null==b&&console&&console.error&&console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."),b}),b.define("select2/utils",["jquery"],function(a){function b(a){var b=a.prototype,c=[];for(var d in b){var e=b[d];"function"==typeof e&&"constructor"!==d&&c.push(d)}return c}var c={};c.Extend=function(a,b){function c(){this.constructor=a}var d={}.hasOwnProperty;for(var e in b)d.call(b,e)&&(a[e]=b[e]);return c.prototype=b.prototype,a.prototype=new c,a.__super__=b.prototype,a},c.Decorate=function(a,c){function d(){var b=Array.prototype.unshift,d=c.prototype.constructor.length,e=a.prototype.constructor;d>0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h<g.length;h++){var i=g[h];d.prototype[i]=a.prototype[i]}for(var j=(function(a){var b=function(){};a in d.prototype&&(b=d.prototype[a]);var e=c.prototype[a];return function(){var a=Array.prototype.unshift;return a.call(arguments,b),e.apply(this,arguments)}}),k=0;k<f.length;k++){var l=f[k];d.prototype[l]=j(l)}return d};var d=function(){this.listeners={}};return d.prototype.on=function(a,b){this.listeners=this.listeners||{},a in this.listeners?this.listeners[a].push(b):this.listeners[a]=[b]},d.prototype.trigger=function(a){var b=Array.prototype.slice,c=b.call(arguments,1);this.listeners=this.listeners||{},null==c&&(c=[]),0===c.length&&c.push({}),c[0]._type=a,a in this.listeners&&this.invoke(this.listeners[a],b.call(arguments,1)),"*"in this.listeners&&this.invoke(this.listeners["*"],arguments)},d.prototype.invoke=function(a,b){for(var c=0,d=a.length;d>c;c++)a[c].apply(this,b)},c.Observable=d,c.generateChars=function(a){for(var b="",c=0;a>c;c++){var d=Math.floor(36*Math.random());b+=d.toString(36)}return b},c.bind=function(a,b){return function(){a.apply(b,arguments)}},c._convertData=function(a){for(var b in a){var c=b.split("-"),d=a;if(1!==c.length){for(var e=0;e<c.length;e++){var f=c[e];f=f.substring(0,1).toLowerCase()+f.substring(1),f in d||(d[f]={}),e==c.length-1&&(d[f]=a[b]),d=d[f]}delete a[b]}}return a},c.hasScroll=function(b,c){var d=a(c),e=c.style.overflowX,f=c.style.overflowY;return e!==f||"hidden"!==f&&"visible"!==f?"scroll"===e||"scroll"===f?!0:d.innerHeight()<c.scrollHeight||d.innerWidth()<c.scrollWidth:!1},c.escapeMarkup=function(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c<a.results.length;c++){var d=a.results[c],e=this.option(d);b.push(e)}this.$results.append(b)},c.prototype.position=function(a,b){var c=b.find(".select2-results");c.append(a)},c.prototype.sort=function(a){var b=this.options.get("sorter");return b(a)},c.prototype.highlightFirstItem=function(){var a=this.$results.find(".select2-results__option[aria-selected]"),b=a.filter("[aria-selected=true]");b.length>0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var b=this;this.data.current(function(c){var d=a.map(c,function(a){return a.id.toString()}),e=b.$results.find(".select2-results__option[aria-selected]");e.each(function(){var b=a(this),c=a.data(this,"data"),e=""+c.id;null!=c.element&&c.element.selected||null==c.element&&a.inArray(e,d)>-1?b.attr("aria-selected","true"):b.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(b){var c=document.createElement("li");c.className="select2-results__option";var d={role:"treeitem","aria-selected":"false"};b.disabled&&(delete d["aria-selected"],d["aria-disabled"]="true"),null==b.id&&delete d["aria-selected"],null!=b._resultId&&(c.id=b._resultId),b.title&&(c.title=b.title),b.children&&(d.role="group",d["aria-label"]=b.text,delete d["aria-selected"]);for(var e in d){var f=d[e];c.setAttribute(e,f)}if(b.children){var g=a(c),h=document.createElement("strong");h.className="select2-results__group";a(h);this.template(b,h);for(var i=[],j=0;j<b.children.length;j++){var k=b.children[j],l=this.option(k);i.push(l)}var m=a("<ul></ul>",{"class":"select2-results__options select2-results__options--nested"});m.append(i),g.append(h),g.append(m)}else this.template(b,c);return a.data(c,"data",b),c},c.prototype.bind=function(b,c){var d=this,e=b.id+"-results";this.$results.attr("id",e),b.on("results:all",function(a){d.clear(),d.append(a.data),b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("results:append",function(a){d.append(a.data),b.isOpen()&&d.setClasses()}),b.on("query",function(a){d.hideMessages(),d.showLoading(a)}),b.on("select",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("unselect",function(){b.isOpen()&&(d.setClasses(),d.highlightFirstItem())}),b.on("open",function(){d.$results.attr("aria-expanded","true"),d.$results.attr("aria-hidden","false"),d.setClasses(),d.ensureHighlightVisible()}),b.on("close",function(){d.$results.attr("aria-expanded","false"),d.$results.attr("aria-hidden","true"),d.$results.removeAttr("aria-activedescendant")}),b.on("results:toggle",function(){var a=d.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),b.on("results:select",function(){var a=d.getHighlightedResults();if(0!==a.length){var b=a.data("data");"true"==a.attr("aria-selected")?d.trigger("close",{}):d.trigger("select",{data:b})}}),b.on("results:previous",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a);if(0!==c){var e=c-1;0===a.length&&(e=0);var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top,h=f.offset().top,i=d.$results.scrollTop()+(h-g);0===e?d.$results.scrollTop(0):0>h-g&&d.$results.scrollTop(i)}}),b.on("results:next",function(){var a=d.getHighlightedResults(),b=d.$results.find("[aria-selected]"),c=b.index(a),e=c+1;if(!(e>=b.length)){var f=b.eq(e);f.trigger("mouseenter");var g=d.$results.offset().top+d.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=d.$results.scrollTop()+h-g;0===e?d.$results.scrollTop(0):h>g&&d.$results.scrollTop(i)}}),b.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),b.on("results:message",function(a){d.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=d.$results.scrollTop(),c=d.$results.get(0).scrollHeight-b+a.deltaY,e=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=d.$results.height();e?(d.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(d.$results.scrollTop(d.$results.get(0).scrollHeight-d.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(b){var c=a(this),e=c.data("data");return"true"===c.attr("aria-selected")?void(d.options.get("multiple")?d.trigger("unselect",{originalEvent:b,data:e}):d.trigger("close",{})):void d.trigger("select",{originalEvent:b,data:e})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(b){var c=a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"),d.trigger("results:focus",{data:c,element:a(this)})})},c.prototype.getHighlightedResults=function(){var a=this.$results.find(".select2-results__option--highlighted");return a},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),2>=c?this.$results.scrollTop(0):(g>this.$results.outerHeight()||0>g)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){var a={BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46};return a}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var b=a('<span class="select2-selection" role="combobox" aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex=0,null!=this.$element.data("old-tabindex")?this._tabindex=this.$element.data("old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),b.attr("title",this.$element.attr("title")),b.attr("tabindex",this._tabindex),this.$selection=b,b},d.prototype.bind=function(a,b){var d=this,e=(a.id+"-container",a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),d.$selection.focus(),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(b){a(document.body).on("mousedown.select2."+b.id,function(b){var c=a(b.target),d=c.closest(".select2"),e=a(".select2.select2-container--open");e.each(function(){var b=a(this);if(this!=d[0]){var c=b.data("element");c.select2("close")}})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){var c=b.find(".selection");c.append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()}),a.on("selection:update",function(a){c.update(a.data)})},e.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},e.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},e.prototype.selectionContainer=function(){return a("<span></span>")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.prop("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('<ul class="select2-selection__rendered"></ul>'),a},d.prototype.bind=function(b,c){var e=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){e.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!e.options.get("disabled")){var c=a(this),d=c.parent(),f=d.data("data");e.trigger("unselect",{originalEvent:b,data:f})}})},d.prototype.clear=function(){this.$selection.find(".select2-selection__rendered").empty()},d.prototype.display=function(a,b){var c=this.options.get("templateSelection"),d=this.options.get("escapeMarkup");return d(c(a,b))},d.prototype.selectionContainer=function(){var b=a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d<a.length;d++){var e=a[d],f=this.selectionContainer(),g=this.display(e,f);f.append(g),f.prop("title",e.title||e.text),f.data("data",e),b.push(f)}var h=this.$selection.find(".select2-selection__rendered");c.appendMany(h,b)}},d}),b.define("select2/selection/placeholder",["../utils"],function(a){function b(a,b,c){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c)}return b.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},b.prototype.createPlaceholder=function(a,b){var c=this.selectionContainer();return c.html(this.display(b)),c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"),c},b.prototype.update=function(a,b){var c=1==b.length&&b[0].id!=this.placeholder.id,d=b.length>1;if(d||c)return a.call(this,b);this.clear();var e=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e)},b}),b.define("select2/selection/allowClear",["jquery","../keys"],function(a,b){function c(){}return c.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},c.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var c=this.$selection.find(".select2-selection__clear");if(0!==c.length){b.stopPropagation();for(var d=c.data("data"),e=0;e<d.length;e++){var f={data:d[e]};if(this.trigger("unselect",f),f.prevented)return}this.$element.val(this.placeholder.id).trigger("change"),this.trigger("toggle",{})}}},c.prototype._handleKeyboardClear=function(a,c,d){d.isOpen()||(c.which==b.DELETE||c.which==b.BACKSPACE)&&this._handleClear(c)},c.prototype.update=function(b,c){if(b.call(this,c),!(this.$selection.find(".select2-selection__placeholder").length>0||0===c.length)){var d=a('<span class="select2-selection__clear">&times;</span>');d.data("data",c),this.$selection.find(".select2-selection__rendered").prepend(d)}},c}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,b,d){var e=this;a.call(this,b,d),b.on("open",function(){e.$search.trigger("focus")}),b.on("close",function(){e.$search.val(""),e.$search.removeAttr("aria-activedescendant"),e.$search.trigger("focus")}),b.on("enable",function(){e.$search.prop("disabled",!1),e._transferTabIndex()}),b.on("disable",function(){e.$search.prop("disabled",!0)}),b.on("focus",function(a){e.$search.trigger("focus")}),b.on("results:focus",function(a){e.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){e.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){e._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){a.stopPropagation(),e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented();var b=a.which;if(b===c.BACKSPACE&&""===e.$search.val()){var d=e.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var f=d.data("data");e.searchRemoveChoice(f),a.preventDefault()}}});var f=document.documentMode,g=f&&11>=f;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){return g?void e.$selection.off("input.search input.searchcheck"):void e.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(g&&"input"===a.type)return void e.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&e.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c&&this.$search.focus()},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{var b=this.$search.val().length+1;a=.75*b+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting"],g=["opening","closing","selecting","unselecting"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){var a={"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ω":"ω","ς":"σ"};return a}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),d+=null!=c.id?"-"+c.id.toString():"-"+a.generateChars(4)},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");
2
- if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f<a.length;f++){var g=a[f].id;-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")});else{var d=a.id;this.$element.val(d),this.$element.trigger("change")}},d.prototype.unselect=function(a){var b=this;if(this.$element.prop("multiple"))return a.selected=!1,c(a.element).is("option")?(a.element.selected=!1,void this.$element.trigger("change")):void this.current(function(d){for(var e=[],f=0;f<d.length;f++){var g=d[f].id;g!==a.id&&-1===c.inArray(g,e)&&e.push(g)}b.$element.val(e),b.$element.trigger("change")})},d.prototype.bind=function(a,b){var c=this;this.container=a,a.on("select",function(a){c.select(a.data)}),a.on("unselect",function(a){c.unselect(a.data)})},d.prototype.destroy=function(){this.$element.find("*").each(function(){c.removeData(this,"data")})},d.prototype.query=function(a,b){var d=[],e=this,f=this.$element.children();f.each(function(){var b=c(this);if(b.is("option")||b.is("optgroup")){var f=e.item(b),g=e.matches(a,f);null!==g&&d.push(g)}}),b({results:d})},d.prototype.addOptions=function(a){b.appendMany(this.$element,a)},d.prototype.option=function(a){var b;a.children?(b=document.createElement("optgroup"),b.label=a.text):(b=document.createElement("option"),void 0!==b.textContent?b.textContent=a.text:b.innerText=a.text),a.id&&(b.value=a.id),a.disabled&&(b.disabled=!0),a.selected&&(b.selected=!0),a.title&&(b.title=a.title);var d=c(b),e=this._normalizeItem(a);return e.element=b,c.data(b,"data",e),d},d.prototype.item=function(a){var b={};if(b=c.data(a[0],"data"),null!=b)return b;if(a.is("option"))b={id:a.val(),text:a.text(),disabled:a.prop("disabled"),selected:a.prop("selected"),title:a.prop("title")};else if(a.is("optgroup")){b={text:a.prop("label"),children:[],title:a.prop("title")};for(var d=a.children("option"),e=[],f=0;f<d.length;f++){var g=c(d[f]),h=this.item(g);e.push(h)}b.children=e}return b=this._normalizeItem(b),b.element=a[0],c.data(a[0],"data",b),b},d.prototype._normalizeItem=function(a){c.isPlainObject(a)||(a={id:a,text:a}),a=c.extend({},{text:""},a);var b={selected:!1,disabled:!1};return null!=a.id&&(a.id=a.id.toString()),null!=a.text&&(a.text=a.text.toString()),null==a._resultId&&a.id&&null!=this.container&&(a._resultId=this.generateResultId(this.container,a)),c.extend({},b,a)},d.prototype.matches=function(a,b){var c=this.options.get("matcher");return c(a,b)},d}),b.define("select2/data/array",["./select","../utils","jquery"],function(a,b,c){function d(a,b){var c=b.get("data")||[];d.__super__.constructor.call(this,a,b),this.addOptions(this.convertToOptions(c))}return b.Extend(d,a),d.prototype.select=function(a){var b=this.$element.find("option").filter(function(b,c){return c.value==a.id.toString()});0===b.length&&(b=this.option(a),this.addOptions(b)),d.__super__.select.call(this,a)},d.prototype.convertToOptions=function(a){function d(a){return function(){return c(this).val()==a.id}}for(var e=this,f=this.$element.find("option"),g=f.map(function(){return e.item(c(this)).id}).get(),h=[],i=0;i<a.length;i++){var j=this._normalizeItem(a[i]);if(c.inArray(j.id,g)>=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){d.status&&"0"===d.status||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h<e.length;h++){var i=e[h],j=this._normalizeItem(i),k=this.option(j);this.$element.append(k)}}return b.prototype.query=function(a,b,c){function d(a,f){for(var g=a.results,h=0;h<g.length;h++){var i=g[h],j=null!=i.children&&!d({results:i.children},!0),k=i.text===b.term;if(k||j)return f?!1:(a.data=g,void c(a))}if(f)return!0;var l=e.createTag(b);if(null!=l){var m=e.option(l);m.attr("data-select2-tag",!0),e.addOptions([m]),e.insertTag(g,l)}a.results=g,c(a)}var e=this;return this._removeOldTags(),null==b.term||null!=b.page?void a.call(this,b,c):void a.call(this,b,d)},b.prototype.createTag=function(b,c){var d=a.trim(c.term);return""===d?null:{id:d,text:d}},b.prototype.insertTag=function(a,b,c){b.unshift(c)},b.prototype._removeOldTags=function(b){var c=(this._lastTag,this.$element.find("option[data-select2-tag]"));c.each(function(){this.selected||a(this).remove()})},b}),b.define("select2/data/tokenizer",["jquery"],function(a){function b(a,b,c){var d=c.get("tokenizer");void 0!==d&&(this.tokenizer=d),a.call(this,b,c)}return b.prototype.bind=function(a,b,c){a.call(this,b,c),this.$search=b.dropdown.$search||b.selection.$search||c.find(".select2-search__field")},b.prototype.query=function(b,c,d){function e(b){var c=g._normalizeItem(b),d=g.$element.find("option").filter(function(){return a(this).val()===c.id});if(!d.length){var e=g.option(c);e.attr("data-select2-tag",!0),g._removeOldTags(),g.addOptions([e])}f(c)}function f(a){g.trigger("select",{data:a})}var g=this;c.term=c.term||"";var h=this.tokenizer(c,this.options,e);h.term!==c.term&&(this.$search.length&&(this.$search.val(h.term),this.$search.focus()),c.term=h.term),b.call(this,c,d)},b.prototype.tokenizer=function(b,c,d,e){for(var f=d.get("tokenSeparators")||[],g=c.term,h=0,i=this.createTag||function(a){return{id:a.term,text:a.term}};h<g.length;){var j=g[h];if(-1!==a.inArray(j,f)){var k=g.substr(0,h),l=a.extend({},c,{term:k}),m=i(l);null!=m?(e(m),g=g.substr(h+1)||"",h=0):h++}else h++}return{term:g}},b}),b.define("select2/data/minimumInputLength",[],function(){function a(a,b,c){this.minimumInputLength=c.get("minimumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",b.term.length<this.minimumInputLength?void this.trigger("results:message",{message:"inputTooShort",args:{minimum:this.minimumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumInputLength",[],function(){function a(a,b,c){this.maximumInputLength=c.get("maximumInputLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){return b.term=b.term||"",this.maximumInputLength>0&&b.term.length>this.maximumInputLength?void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}}):void a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;return d.maximumSelectionLength>0&&f>=d.maximumSelectionLength?void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}}):void a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val("")}),c.on("focus",function(){c.isOpen()&&e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){var b=e.showSearch(a);b?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){var c=e.$results.offset().top+e.$results.outerHeight(!1),d=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1);c+50>=d&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a("<span></span>"),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){a(this).data("select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(b){var c=a(this).data("select2-scroll-position");a(this).scrollTop(c.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id,h=this.$container.parents().filter(b.hasScroll);h.off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.top<f.top-h.height,k=i.bottom>f.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d<b.length;d++){var e=b[d];e.children?c+=a(e.children):c++}return c}function b(a,b,c,d){this.minimumResultsForSearch=c.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),a.call(this,b,c,d)}return b.prototype.showSearch=function(b,c){return a(c.data.results)<this.minimumResultsForSearch?!1:b.call(this,c)},b}),b.define("select2/dropdown/selectOnClose",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("close",function(a){d._handleSelectOnClose(a)})},a.prototype._handleSelectOnClose=function(a,b){if(b&&null!=b.originalSelect2Event){var c=b.originalSelect2Event;if("select"===c._type||"unselect"===c._type)return}var d=this.getHighlightedResults();if(!(d.length<1)){var e=d.data("data");null!=e.element&&e.element.selected||null==e.element&&e.selected||this.trigger("select",{data:e})}},a}),b.define("select2/dropdown/closeOnSelect",[],function(){function a(){}return a.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),b.on("select",function(a){d._selectTriggered(a)}),b.on("unselect",function(a){d._selectTriggered(a)})},a.prototype._selectTriggered=function(a,b){var c=b.originalEvent;c&&c.ctrlKey||this.trigger("close",{originalEvent:c,originalSelect2Event:b})},a}),b.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(a){var b=a.input.length-a.maximum,c="Please delete "+b+" character";return 1!=b&&(c+="s"),c},inputTooShort:function(a){var b=a.minimum-a.input.length,c="Please enter "+b+" or more characters";return c},loadingMore:function(){return"Loading more results…"},maximumSelected:function(a){var b="You can only select "+a.maximum+" item";return 1!=a.maximum&&(b+="s"),b},noResults:function(){return"No results found"},searching:function(){return"Searching…"}}}),b.define("select2/defaults",["jquery","require","./results","./selection/single","./selection/multiple","./selection/placeholder","./selection/allowClear","./selection/search","./selection/eventRelay","./utils","./translation","./diacritics","./data/select","./data/array","./data/ajax","./data/tags","./data/tokenizer","./data/minimumInputLength","./data/maximumInputLength","./data/maximumSelectionLength","./dropdown","./dropdown/search","./dropdown/hidePlaceholder","./dropdown/infiniteScroll","./dropdown/attachBody","./dropdown/minimumResultsForSearch","./dropdown/selectOnClose","./dropdown/closeOnSelect","./i18n/en"],function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C){function D(){this.reset()}D.prototype.apply=function(l){if(l=a.extend(!0,{},this.defaults,l),null==l.dataAdapter){if(null!=l.ajax?l.dataAdapter=o:null!=l.data?l.dataAdapter=n:l.dataAdapter=m,l.minimumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),(null!=l.tokenSeparators||null!=l.tokenizer)&&(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L<K.length;L++){var M=K[L],N={};try{N=k.loadPath(M)}catch(O){try{M=this.defaults.amdLanguageBase+M,N=k.loadPath(M)}catch(P){l.debug&&window.console&&console.warn&&console.warn('Select2: The language file for "'+M+'" could not be automatically loaded. A fallback will be used instead.');continue}}J.extend(N)}l.translations=J}else{var Q=k.loadPath(this.defaults.amdLanguageBase+"en"),R=new k(l.language);R.extend(Q),l.translations=R}return l},D.prototype.reset=function(){function b(a){function b(a){return l[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function c(d,e){if(""===a.trim(d.term))return e;if(e.children&&e.children.length>0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){var h=e.children[g],i=c(d,h);null==i&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var j=b(e.text).toUpperCase(),k=b(d.term).toUpperCase();return j.indexOf(k)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(this.defaults,f)};var E=new D;return E}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){var c=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),a.data("select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),a.data("data",a.data("select2Tags")),a.data("tags",!0)),a.data("ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",a.data("ajaxUrl")),a.data("ajax--url",a.data("ajaxUrl")));var e={};e=b.fn.jquery&&"1."==b.fn.jquery.substr(0,2)&&a[0].dataset?b.extend(!0,{},a[0].dataset,a.data()):a.data();var f=b.extend(!0,{},e);f=d._convertData(f);for(var g in f)b.inArray(g,c)>-1||(b.isPlainObject(this.options[g])?b.extend(this.options[g],f[g]):this.options[g]=f[g]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,c){null!=a.data("select2")&&a.data("select2").destroy(),this.$element=a,this.id=this._generateId(a),c=c||{},this.options=new b(c,a),e.__super__.constructor.call(this);var d=a.attr("tabindex")||0;a.data("old-tabindex",d),a.attr("tabindex","-1");var f=this.options.get("dataAdapter");this.dataAdapter=new f(a,this.options);var g=this.render();this._placeContainer(g);var h=this.options.get("selectionAdapter");this.selection=new h(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,g);var i=this.options.get("dropdownAdapter");this.dropdown=new i(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,g);var j=this.options.get("resultsAdapter");this.results=new j(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var k=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){k.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return 0>=e?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;i>h;h+=1){var j=g[h].replace(/\s/g,""),k=j.match(c);if(null!==k&&k.length>=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e<b.addedNodes.length;e++){var f=b.addedNodes[e];f.selected&&(c=!0)}else b.removedNodes&&b.removedNodes.length>0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),(null==a||0===a.length)&&(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",this.$element.data("old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null;
3
- },e.prototype.render=function(){var b=a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),b.data("element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults"],function(a,b,c,d){if(null==a.fn.select2){var e=["open","close","destroy"];a.fn.select2=function(b){if(b=b||{},"object"==typeof b)return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,f=Array.prototype.slice.call(arguments,1);return this.each(function(){var c=a(this).data("select2");null==c&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=c[b].apply(c,f)}),a.inArray(b,e)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c});
 
 
 
trunk/assets/js/wcv-admin-login.js DELETED
@@ -1,11 +0,0 @@
1
- jQuery( function () {
2
- if ( $( '#terms_and_conditions_visibility' ).val() == 'no' ){
3
- if (jQuery('#apply_for_vendor').is(':checked')) {
4
- jQuery('.agree-to-terms-container').show();
5
- }
6
-
7
- jQuery('#apply_for_vendor').on('click', function () {
8
- jQuery('.agree-to-terms-container').slideToggle();
9
- });
10
- }
11
- });
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/js/wcv-admin-quick-edit.js DELETED
@@ -1,34 +0,0 @@
1
- jQuery(function(){
2
- jQuery('#the-list').on('click', '.editinline', function(){
3
-
4
- if (jQuery('.inline-edit-author').length && jQuery('.inline-edit-author-new').length) {
5
- jQuery('.inline-edit-author').hide();
6
- jQuery('.inline-edit-author').attr('class', 'inline-edit-author-old');
7
- jQuery('select[name=post_author]').attr('name', 'post_author-old');
8
- jQuery('.inline-edit-author-new').attr('class', 'inline-edit-author');
9
- jQuery('select[name=post_author-new]').attr('name', 'post_author');
10
- }
11
-
12
- inlineEditPost.revert();
13
-
14
- var post_id = jQuery(this).closest('tr').attr('id');
15
-
16
- post_id = post_id.replace("post-", "");
17
-
18
- var wcv_inline_data = jQuery('#vendor_' + post_id),
19
- wc_inline_data = jQuery('#woocommerce_inline_' + post_id );
20
-
21
- var vendor = wcv_inline_data.find("#_vendor").text();
22
-
23
- jQuery('select[name="post_author"] option[value="' + vendor + '"]', '.inline-edit-row').attr('selected', 'selected');
24
-
25
- var product_type = wc_inline_data.find('.product_type').val();
26
-
27
- if (product_type=='simple' || product_type=='external') {
28
- jQuery('.vendor', '.inline-edit-row').show();
29
- } else {
30
- jQuery('.vendor', '.inline-edit-row').hide();
31
- }
32
-
33
- });
34
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/js/wcv-commissions.js DELETED
@@ -1,11 +0,0 @@
1
- // global variable
2
- jQuery(function(){
3
-
4
- jQuery('.select2').select2(
5
- {
6
- placeholder: wcv_commissions_select.placeholder,
7
- allowClear: wcv_commissions_select.allowclear
8
- }
9
- );
10
-
11
- });
 
 
 
 
 
 
 
 
 
 
 
trunk/assets/screenshot-1.png DELETED
Binary file
trunk/assets/screenshot-2.png DELETED
Binary file
trunk/assets/screenshot-3.png DELETED
Binary file
trunk/assets/screenshot-4.png DELETED
Binary file
trunk/assets/screenshot-5.png DELETED
Binary file
trunk/assets/screenshot-6.png DELETED
Binary file
trunk/assets/screenshot-7.png DELETED
Binary file
trunk/changelog.txt DELETED
@@ -1,837 +0,0 @@
1
- Changelog for WC Vendors Marketplace
2
-
3
- Version 2.1.2
4
-
5
- * Updated: Support for WooCommerce 3.5.0
6
- * Updated: Support for Wordpress 5.0.0
7
- * Fixed: Error messages on product edit page
8
- * Fixed: Reverse commissions if order is trashed
9
- * Fixed: Added extra checks for vendor order method
10
- * Fixed: Load user locale when loading text domain
11
- * Fixed: Loopback request failure #453
12
-
13
- Version 2.1.1
14
-
15
- * Added: Export Commission Order ID #460
16
- * Added: Export Commission Totals use filters #459
17
- * Added: Remove Ability to Register from the WP Login screen. #489
18
- * Fixed: Invalid variable reference
19
- * Fixed: Uninstall loading order to ensure table still exists when getting settings fields
20
- * Fixed: Incorrect capabilities set on initial install and via setup wizard
21
- * Fixed: Handle PayPal Adaptive Payments IPN status inconsistencies (#495)
22
- * Fixed: Incorrect javascript method name
23
- * Fixed: No terms and conditions warning (#494)
24
- * Fixed: Replace vendor with function call (#493)
25
- * Fixed: Update methods in the wrong location
26
- * Fixed: Line item id's incorrectly set
27
-
28
- Templates Updated:
29
- templates/dashboard/denied.php
30
-
31
- Version 2.1.0
32
-
33
- * Added Option to remove "Become a Vendor" tab on the my-account page
34
- * Update: Make it easier to visually see which emails have been deprecated
35
- * Fixed: Virtual / Downloadable Hide option does not work #483
36
- * Fixed: Admin notify vendor application not firing #468
37
- * Fixed: Username not showing in Admin notification email subject
38
- * Fixed: Terms & conditions on wp-register page #479
39
- * Fixed: Capabilities resetting disables edit live products #466
40
- * Fixed: Vendor labels can't be translated #451
41
- * Fixed: "Become a Vendor" tab is not hidden for vendor role #472
42
- * Fixed: WooCommerce Product Enquiry emails not working #465
43
- * Fixed: Color picker class not working when adding custom class (#469)
44
- * Fixed: Stop vendor notification sending twice
45
- * Fixed: Shipping cost to be added onto Vendor commissions #463
46
- * Fixed: Using wrong method in classes/class-shipping.php #461
47
-
48
- Version 2.0.10
49
-
50
- * Fixed: Commission by Product report is not functioning & shows errors #456
51
- * Fixed: Disable upgrade notice if pro already active
52
- * Fixed: Added check in case user incorrectly sets orders page
53
- * Fixed: Vendor emails not firing #450
54
- * Fixed: Included translations no longer work #455
55
- * Fixed: Parameter 2 to be array in class-admin-users.php on line 174 #454
56
- * Fixed: my-account "become a vendor" tab is leading to a 404 #447
57
- * Fixed: Pending vendors no longer see the Vendor Application Form #448
58
-
59
- Version 2.0.9
60
-
61
- * Fixed: Vendor shop pages are in 404
62
- * Fixed: Become a vendor on my account page goes to a 404 #445
63
- * Fixed: Call to undefined function wcv_get_settings_mapping() #444
64
- * Fixed: Typo in separator statement
65
-
66
- Version 2.0.8
67
-
68
- * Added: Ability to uninstall the plugin including advanced options
69
- * Added: Option to assign media to vendor when assigning product
70
- * Added: All references to vendor changed to an option to rename vendors
71
- * Added: Sold by separator option #420
72
- * Added: Multi page select admin setting type
73
- * Updated: Language files
74
- * Fixed: Commissions Totals Incorrect in Reports #432
75
- * Fixed: Paypal Manual payout not working #430
76
- * Fixed: Class loading issues #427
77
- * Fixed: Vendor Featured product shortcode not working #418
78
- * Fixed: Vendor Top rated products shortcode not working #417
79
- * Fixed: Unable to use image settings type for admin settings
80
-
81
- Version 2.0.7
82
-
83
- * Added: Become a vendor link to WooCommerce My Account page
84
- * Fixed: Fatal Error WP Admin vendor orders #422
85
- * Fixed: Only run vendor dashboard class on the front end
86
- * Fixed: Admin dashboard error
87
- * Fixed: fatal error get_id on integer
88
- * Fixed: Hide signup form if current user is already a vendor
89
- * Fixed: Tags stripped from wysiwyg settings #419
90
- * Fixed: Spelling mistake across the code base
91
- * Updated: language files
92
- * Updated: Wording for settings
93
-
94
- Templates Updated:
95
- templates/dashboard/denied.php
96
-
97
- Version 2.0.6
98
-
99
- * Added: Payment details to totals CSV export #414
100
- * Added: New background updater
101
- * Added: New reference to the GDPR for users in the readme
102
- * Updated: Invalid text domain in woocommerce registration errors
103
- * Updated: Only show major update warning for WC Vendors below 2.0.0
104
- * Fixed: Payment message output
105
- * Fixed: PayPal cron schedules not working #416
106
- * Fixed: Incorrect page name
107
- * Fixed: Incorrect default settings in setup wizard
108
- * Fixed: Call correct background updater
109
- * Fixed: Reference to documentation
110
- * Fixed: Increased input width for commission input in settings
111
-
112
- Version 2.0.5
113
-
114
- * Updated: Legacy WooCommerce calls
115
- * Updated: Changed how options are retrieved from the database
116
- * Fixed: Customer details not filtered on WP Admin orders screen #413
117
- * Fixed: Customer details not filtered on emails #411
118
- * Fixed: Totals display in vendor order notification emails
119
- * Fixed: Duplicate new product admin notification emails
120
- * Fixed: New product admin notification email trigger not working
121
- * Fixed: Username placeholder in vendor application email
122
- * Fixed: Vendor Sold By name is not appearing on customer order #412
123
- * Fixed: Update dialog is stuck #409
124
- * Fixed: Order capabilities not working #410
125
- * Fixed: Incorrect label in emails
126
-
127
- Templates Added:
128
- templates/emails/plain/vendor-order-addresses.php
129
- templates/emails/vendor-order-addresses.php
130
-
131
- Templates Updated:
132
- templates/dashboard/dashboard/orders.php
133
- templates/emails/plain/vendor-order-details.php
134
- templates/emails/vendor-order-details.php
135
-
136
- Version 2.0.4
137
-
138
- * Fixed: Critical commission calculation error
139
-
140
- Version 2.0.3
141
-
142
- * Added: Export Commission Sum Totals
143
- * Added: New setting to rename vendors store wide
144
- * Fixed: Update Dialog is stuck #409
145
- * Updated: Langage file
146
-
147
- Version 2.0.2
148
-
149
- * Fixed: Corrected settings conditional checks across classes
150
- * Fixed: Vendor Capabilities
151
- * Fixed: Reset vendor roles
152
- * Fixed: Incorrect get_option calls
153
- * Fixed: Permission check for product submit and order view
154
- * Updated: Templates to make tracking changes possible
155
- * Updated: Disable add new product completely if disabled
156
- * Updated: Make denied product message translateable.
157
-
158
- Version 2.0.1
159
-
160
- * Fixed: Update notice won't complete
161
- * Fixed: Legacy settings options loading
162
- * Fixed: Errors on activation when unsupported plugin is detected
163
- * Fixed: Display sold_by option not working
164
-
165
- Version 2.0.0
166
-
167
- * Added: New WC Vendors Admin menu
168
- * Added: Bank details fields for vendors
169
- * Added: New all new email system and templates
170
- * Added: New contextual help menus on settings pages
171
- * Added: New settings system and admin notice system
172
- * Added: Setup Wizard
173
- * Added: Support for PHP 7.1+
174
- * Updated: styles and script build script
175
- * Updated: language file cleanup
176
- * Updated: Brazilian Portuguese translation thanks CasperBraske
177
- * Fixed: Permalinks not flushing on settings save
178
- * Fixed: Terms & Conditions Checkbox for Vendor Registration does not show #392
179
- * Fixed: deprecated calls on orders screen
180
- * Fixed: Vendor role capabilities updated when new settings updated.
181
- * Fixed: Vendors can delete media they uploaded
182
- * Fixed: Added check for woocommerce shipping tax class setting
183
- * Fixed: Tax classes not being used in shipping tax calculations
184
- * Fixed: Make compatible with translate.wordpress.org #396
185
- * Fixed: undefined index notice for reports that have been removed
186
- * Fixed: Removed focus from select on vendor drop down on product edit screen
187
-
188
- Templates Added:
189
- templates/emails/plain/admin-notify-product.php
190
- templates/emails/plain/admin-notify-shipped.php
191
- templates/emails/plain/admin-notify-application.php
192
- templates/emails/plain/customer-notify-shipped.php
193
- templates/emails/plain/vendor-notify-application.php
194
- templates/emails/plain/vendor-notify-approved.php
195
- templates/emails/plain/vendor-notify-denied.php
196
- templates/emails/plain/vendor-notify-order.php
197
- templates/emails/plain/vendor-order-details.php
198
- templates/emails/plain/vendor-order-items.php
199
- templates/emails/admin-notify-product.php
200
- templates/emails/admin-notify-shipped.php
201
- templates/emails/admin-notify-application.php
202
- templates/emails/customer-notify-shipped.php
203
- templates/emails/vendor-notify-application.php
204
- templates/emails/vendor-notify-approved.php
205
- templates/emails/vendor-notify-denied.php
206
- templates/emails/vendor-notify-order.php
207
- templates/emails/vendor-order-details.php
208
- templates/emails/vendor-order-items.php
209
-
210
- Templates Updated:
211
- templates/dashboard/settings/settings.php
212
- templates/order/table-body.php
213
-
214
- Version 1.9.14
215
-
216
- * Added: Export commissions via CSV
217
- * Added: Commission Table Links #166
218
- * Added: Apply to become a vendor on wp-login registration page #245
219
- * Added: Apply filter to get_vendor_dues_from_order()
220
- * Fixed: wp-admin Commissions Page sorted by status & vendor #374
221
- * Fixed: Commission filters loading too early so they cannot be applied.
222
- * Fixed: WooCommerce Reports are showing 2X accurate sales #388
223
- * Fixed: Shortcodes do not work for products assigned to vendor by admin #385
224
- * Fixed: Text domain in read me for glotpress translations
225
- * Fixed: "sold by" is showing in several areas despite deselected admin setting #386
226
-
227
- Version 1.9.13
228
-
229
- * Added: Notice for deprecated gateway
230
- * Added: A filter for role change: Denied Vendor #351
231
- * Added: WooCommerce tested header for new WooCommerce Status page
232
- * Added: Filter for vendor signup form so it can be overriden
233
- * Added: "Approve" Vendor action on Pending Vendors Page #372
234
- * Updated: Brazillian Port wcvendors-pt_BR.pot
235
- * Fixed: Moved sprintf must be outside #381 thanks CasperBraske
236
- * Fixed: Re-Send email options in admin/orders are not available after WooCommerce update #383
237
- * Fixed: deprecated screen_icon method call
238
- * Fixed: Use wc_get_order instead of new WC_Order #382
239
- * Fixed: Post called incorrectly #378
240
- * Fixed: Get correct product name in commission table if variation deleted
241
- * Fixed: Commissions reversed when order deleted
242
- * Fixed: mistake in vendor_shop_query
243
- * Fixed: Return 404 if vendor doesn't exist
244
- * Fixed: The shop name background doesn’t scale with shop image #366
245
- * Fixed: deprecated functions #368 thanks @stodorovic
246
- * Fixed: Changed how customer address is displayed based on Woo Options. Thanks @debain
247
-
248
- Version 1.9.12
249
-
250
- * Added: For hook for vendor order content
251
- * Updated: Portuguese translations thanks Elsa
252
- * Updated: Show SKU in emails as per pre WC3.0 updates
253
- * Fixed: Static reference calls in commision class
254
- * Fixed: Shipping tax bug in vendor calculations
255
- * Fixed: Variations showing $0 price in emails thanks damanmehta
256
- * Fixed: Prevent PHP notice for getting non-existing vendor name from JeroenSormani/master
257
-
258
- Version 1.9.11
259
-
260
- * Fixed: Correct product id being parsed to shipping function
261
- * Fixed: Payment method notice due to direct access to object property
262
- * Fixed: Sold by incorrectly showing in cart for variations
263
-
264
- Version 1.9.10
265
-
266
- * Fixed: Terms & Conditions Checkbox is not functioning normally #348
267
- * Fixed: Apply to Become a Vendor Checkbox is Missing with WC 3.0 + WC Vendors 1.9.9 #349
268
- * Fixed: New product title formatting is showing product #350
269
- * Fixed: Incorrect use of wpdb->prepare
270
- * Fixed: Mark shipped filter not providing parameters correctly
271
- * Fixed: Incorrect reference to billing email in notification email
272
- * Updated: Removed Sales reports from backend
273
-
274
- Version 1.9.9
275
-
276
- * Added: Filters to vendor admin dashboard class for custom columns #339
277
- * Added: Vendor shop name to the <title> tag on products archive page
278
- * Updated Woocommerce 2.7 compatibility
279
- * Updated: i18n text domain loading for proper translations #341
280
- * Fixed: Class logger when called via includes files
281
- * Fixed: Bug in how admin notices are displayed when saving shop settings
282
- * Fixed: 2.7 compatibility bugs
283
- * Fixed: Commissions Subtotal showing Full Product Price in vendor email #330
284
- * Fixed: Capabilities Fix for Resetting Roles #329
285
- * Fixed: HTML title attribute doesn't change for store pages #328
286
- * Fixed: Login form not displayed if get variable set
287
- * Fixed: deprecated action in product edit screen
288
-
289
- Templates Updated:
290
- templates/emails/vendor-new-order.php
291
- templates/emails/notify-vendor-shipped.php
292
- templates/order/orders.php
293
-
294
- Version 1.9.8
295
-
296
- * Fixed: Paypal adaptive payments url changes
297
- * Added: Store Vendor ID in vendor child order #326
298
- * Added: 100% Japanese translations thanks to Shohei Tanaka
299
-
300
- Version 1.9.7
301
-
302
- * Fixed: Capabilities Fix for Resetting Roles #329
303
-
304
- Version 1.9.6
305
-
306
- * Added: Commission Query Functions #321
307
- * Added: Template for sold by in shop loop #324
308
- * Merged: Extended commissions management #319 from MounirHamani
309
- * Updated: Brazilian Portuguese translation
310
- * Template Added:
311
- templates/front/vendor-sold-by.php
312
-
313
- Version 1.9.5
314
-
315
- * Added: Automated language file builds
316
- * Added: Vendors can now delete media in the media uploader
317
- * Updated: Commissions table in backend now shows cost breakdowns
318
- * Fixed: Removed legacy code for unsupported shipping methods
319
- * Fixed: Rounding issue with 100% commission and coupons in pro
320
-
321
- Version 1.9.4
322
-
323
- * Added: Filter to add delayed payment possibility #309
324
- * Added: WPML support configuration file
325
- * Updated: Brazilian translation files thanks Luis!
326
- * Fixed: Using "date_i18n" instead of just "date" #316 from CasperBraske
327
- * Fixed: Geczy text domain in the settings file #314
328
- * Fixed: Commissions lock on one vendor after some actions are made #311
329
- * Fixed: Vendor dashboard Orders Export link is dead #306
330
- * Fixed: Vendor sorting in commissions - no option to NOT choose a vendor #305
331
- * Fixed: vendor order admin product metadata loading #298 from mikko-niemikorpi
332
- * Fixed: Commission status translatable in reports thanks CasperBraske
333
- * Fixed: Translatable strings thanks CasperBraske
334
- * Fixed: Issues with translation strings
335
- * Fixed: Incorrect variable reference
336
- * Fixed: bp_setup_current_user was called incorrectly
337
- * Fixed: Display of variations on main dashboard
338
- * Fixed: Trying to get property of non-object
339
- * Fixed: Variation data styles in order display in wp-admin
340
- * Fixed: Save user meta fields when pending vendor
341
- * Fixed: Incorrect url string format in french translation
342
- * Templates Updated:
343
- templates/dashboard/orders.php
344
-
345
- Version 1.9.3
346
-
347
- * Fixed: Only load asset on orders page in admin
348
- * Fixed: Not showing orders on vendor dashboard for new installations
349
- * Updated: Persian translations thanks to Alireza
350
-
351
- Version 1.9.2
352
-
353
- * Added: Reverse commission when order emptied from trash #277
354
- * Added: Daily Payout option for PayPal Cron #297
355
- * Added: Vendor select2 on the commissions page #284
356
- * Added: Button to reset vendor roles & WC Vendors settings to WooCoomerce system status tools page #230
357
- * Added: Dutch Translation, thanks @jjclinton
358
- * Added: Date filter for order queries
359
- * Added: Turkish translations thanks Hakan
360
- * Added: $wc_vendors object variable
361
- * Added: Action to fire after dashboard links (wcvendors_after_links)
362
- * Added: Body css classes to set pages
363
- * Updated: Support for woo commerce minimum and readme
364
- * Fixed: Mark commission reversed bulk action on commissions table
365
- * Fixed: No longer have to save permalink settings when updating WC Vendors options
366
- * Fixed: Orders page not set on fresh install
367
- * Fixed: Property of non object #300
368
- * Fixed: Translation for Mark Shipped #296
369
- * Fixed: Too many redirect loops if pages not set #290
370
- * Fixed: Non-Object Notice in install #289
371
- * Fixed: Rounding error with 100% commission thanks Brett!
372
- * Fixed: text domain for email templates
373
- * Fixed: Don't start session if user isn't logged
374
- * Fixed: Session error on log out if session doesn't exist
375
- * Fixed: Settings image selector bug
376
- * Merged pull request #302 from NicolasBernier - Completed French Translations, Thanks!
377
- * Merged: pull request #293 from stodorovic/fix_init_sessions
378
-
379
- Version 1.9.1
380
-
381
- * Added: GitHub Plugin URI for afragen/github-updater #282 thanks Agoruh
382
- * Added: Edit and View page settings options
383
- * Fixed: Missing Argument WCV_Admin_Users::filter_product_types() #288
384
- * Fixed: Critical: PHP Fatal error: Call to a member function get_children() #287
385
- * Fixed: Date range session data is not working #285
386
- * Fixed HTML escaped characters in PaypalAP Cancel and Return URLs: #286 thanks Nicolas
387
- * Fixed: Post type check to trigger_new_product() function #276
388
- * Fixed: Updated to notices instead of wordpress errors
389
- * Fixed: Product attribute fetch and returning HTML #283 thanks Mikko
390
- * Fixed: Vendor Mark Shipped Security Fix #280 thanks Agoruh
391
- * Fixed: Missing argument in Vendors Class
392
- * Fixed: Rounded product commission to avoid error 589023 when submitting to PayPal #275 thanks Nicolas
393
-
394
- Version 1.9.0
395
-
396
- * Added: Support for WooCommerce 2.6
397
- * Added: Vendor roles filter wcvendors_vendor_roles
398
- * Added: Product and Vendor id's to sold_by filters
399
- * Added: Vendor Signup Filters #269
400
- * Added: Notify Vendors Email - Add Product SKU, if set #263
401
- * Added: New Option: Notify Vendors show Purchase Price or Commissions #253
402
- * Added: Option to disable sold by #236
403
- * Added: Initial sub order management code #196 thanks Spreeuw
404
- * Fixed: Sold by meta removal
405
- * Fixed: Sequential Orders Support Commissions table #270
406
- * Fixed: Notify Vendors Email Customizer Not Working #240
407
- * Fixed: Commissions Total Report a-z sorting #239
408
- * Fixed: need to agree to terms for this to process correctly
409
- * Fixed: save pending vendor for login screen
410
- * Fixed: Notify Vendors Email in WC 2.5+ #265
411
- * Fixed: Order table layout
412
- * Fixed: Orders screen for vendors in admin #231
413
- * Fixed: product management in WC 2.6
414
- * Fixed: Duplicate application emails firing in free and pro
415
- * Fixed: Commission display issue in notify vendor email
416
- * Fixed: New ítem meta compatability with WC 2.5 and above
417
-
418
- Version 1.8.9
419
-
420
- * Fixed: Commission Totals Report Inaccurate #267
421
- * Added: Swedish Translation Thanks Arvid!
422
-
423
- Version 1.8.8
424
-
425
- * Fixed: Undefined variable error in commission class
426
- * Fixed: Pagination bug in wcv_vendorslist shortcode
427
-
428
- Version 1.8.7
429
-
430
- * Added: New qty argument to commission calculations
431
- * Added: Image uploader settings type
432
- * Added: New commission function for payment gateways
433
- * Fixed: Prefixed all btn css classes to stop theme collision
434
- * Fixed: Sold By:Name spaces issue #256
435
- * Fixed: Show extended fields for vendor and pending vendor roles
436
- * Fixed: Check if product is taxable
437
- * Fixed: deprecated function calls in email templates
438
- * Fixed: Commission giving tax on none taxable items #251
439
- * Fixed: Sold by label issues with WC 2.5 #250
440
-
441
- Version 1.8.6
442
-
443
- * Fixed: Critical issue with paypal loading classes incorrectly
444
-
445
- Version 1.8.5
446
-
447
- * Fixed: Issue with PayPal on some sites - Rolled back issue #247
448
- * Fixed: Reverted ticket #216 for email conflicts
449
- * Added: New KnowledgeBase URL
450
-
451
- Version 1.8.4
452
-
453
- * Added: Removed fields from users that aren't vendors
454
- * Added: actions to hook into approve/deny vendor
455
- * Added: Ability to integrate with any order status for emails #216
456
- * Added: Terms & Conditions Opens in New Tab #246
457
- * Updated: Added trigger for on-hold to processing/completed for Notify Vendor Email #238
458
- * Updated: Settings page helper text and clarifications
459
- * Fixed: Sold by formatting issue #248
460
- * Fixed: wp_redirect caches with W3 Total Cache #237
461
- * Fixed: Bug in single page settings generator
462
- * Fixed: Category title missing bug #213
463
- * Fixed: Undefined index for non vendor users
464
- * Merge: pull request #247 from archonic/hotfix/oauth-class-exists
465
-
466
-
467
- Version 1.8.3
468
-
469
- * Fixed: Fatal Error on activation Merge pull request #235 from oleggen/patch-1
470
- * Added: Seller info label option
471
-
472
- Version 1.8.2
473
-
474
- * Added: Sold By label option
475
- * Added: New Vendor Commission Totals Report #234
476
- * Fixed: Added 'Shipped' if marked as shipped #233 can be found on WooCommerce > Reports > WC Vendors > Commission Totals
477
- * Fixed: Renamed internal function to stop theme and plugin clash
478
-
479
- Version 1.8.1
480
-
481
- * Added: New options updated action for settings
482
- * Added: New plugin activation hook for testing woocommerce active
483
- * Added: vendor id to get shipping due filter
484
- * Added: Warning on settings page if user registration in WooCommerce is not enabled
485
- * Added: Russian Translations thanks Natalia
486
-
487
- Version 1.8.0
488
-
489
- * Fixed: Mark $0.00 commissions as paid instead of due #205
490
- * Fixed: Email trigger should be filter not action - Thanks ontiuk #215
491
- * Updated: Read me with link to Pro and Updated Language List
492
- * Added: Portuguese Language (Thanks Renato) #212
493
- * Remove Forced HTTP Protocol on Sent IPN URL #207 from GoTeamScotch
494
-
495
- Version 1.7.9
496
-
497
- * Fixed: woocommerce filter and action issues on product edit page
498
-
499
- Version 1.7.8
500
-
501
- * Fixed: Vendors can not register #193
502
- * Fixed: Variation product image upload #194
503
- * Added: Order actions thanks GoTeamScotch
504
- * Updated: New item meta in WC 2.4+
505
- * Updated: WooCommerce Shipment Tracking v1.2.7+
506
- * Fixed: Paypal Logging thanks to GoTeamScotch
507
- * Updated: Templates now fully translatable #195
508
- * Fixed: Translations not loading bug
509
- * Fixed: vendors not defined error
510
- * Updated: Base translation files
511
-
512
- Version 1.7.7
513
-
514
- * Fixed: Terms and conditions processing #182
515
- * Added: filter to order note for overrides
516
- * Added: Order note for marked shipped #187
517
- * Fixed: order retrieval for wp-admin orders table for vendors
518
- * Fixed: pagination bug #179
519
- * Updated: styles for orders table in admin for vendors
520
- * Fixed: Vendor displaying issue #180
521
- * Updated: Admin Commission Report Column Names #183
522
- * Updated: Admin Commissions Page now shows times a product has sold in total #184
523
-
524
- Version 1.7.6
525
-
526
- * Added: Stock notifications go to vendors #114
527
- * Fixed: Instant Pay bug #174
528
- * Fixed: wcv_vendorslist paging #178
529
- * Added: Vendor display name now translatable
530
- * deprecated: Dashboard vendor reports
531
- * Added: Chinese Language files thanks to SundayLau
532
- * Fixed: Added support for WPML #177
533
- * Update: default pot language file
534
-
535
- Version 1.7.5
536
-
537
- * Merged: Check product post type in vendor dashboard thanks simplementNat
538
- * Updated: Base language file
539
- * Updated: Compatibility for Shipment Tracking for v1.3.5 #167
540
- * Fixed: Shipping taxes
541
- * Fixed: Pending Products for Vendors #168
542
- * Added: Vendor shipping override #171
543
- * Added: Give Tax Per Vendor Override #56
544
- * Added: Hide duplicate product option
545
- * Fixed: Email firing for pending status only
546
- * Updated: Unified vendor-main/mini-header variables
547
- * Fixed: Email template paths to woocommerce paths
548
- * Merged: Updated Brazilian Portuguese thanks carlosramosweb
549
- * Added: Seller Info to header #161
550
- * Updated: Spanish Translations #160
551
- * Updated: Brazilian Portuguese Language #156
552
-
553
- Version 1.7.4
554
-
555
- * Added: Mark shipped filter #157
556
- * Fixed: Added Tax total to vendor email #146
557
- * Updated: Location of email templates in theme to wc-vendors/emails
558
- * Added: User email to Vendor Display Options #158
559
- * Fixed: Mass Pay Now Bug #159
560
- * Fixed: Mark as shipped for downloadable product #40
561
- * Added: Brazilian Portuguese language #156
562
- * Updated: Default Language file
563
- * Fixed: Translation issue for query test #155
564
- * Updated: Template base for emails
565
- * Fixed: Vendor email and renamed template #135
566
- * Fixed: Better CSV Output #63
567
- * Fixed: Made PayPal optional on Vendor Dashboard Shop Settings #144
568
- * Update: fixed return query var
569
- * Fixed: Test for product post types #149
570
- * Fixed: 2.1 deprecated return call
571
- * Fixed: PHP Strict static call in commissions class
572
- * Merged: Is Vendor checks all user roles #147 thanks crabilld
573
-
574
- Version 1.7.3
575
-
576
- * Fixed: Paypal AP IPN url issue
577
-
578
- Version 1.7.2
579
-
580
- * Added: Filters for seller tab #141
581
- * Fixed: URI Too Large Error #143
582
- * Fixed: Give tax to vendors #142
583
- * Updated: Spanish Translations #140
584
- * Added: Persian Translation #139
585
-
586
- Version 1.7.1
587
-
588
- * Fixed: Invalid argument on new orders dashboard page #138
589
- * Updated: Base translation file
590
-
591
- Version 1.7.0
592
-
593
- * Fixed: add_query_arg/remove_query_arg XSS issue
594
- * Fixed: Hide Notice not working for admin settings
595
- * Added: Shop Settings page in WordPress dashboard
596
- * Added: Orders page in WordPress dashboard
597
-
598
- Version 1.6.2
599
-
600
- * Added: Option to change sold by vendor name #106
601
- * Fixed: Error notice in vendor dashboard #133
602
- * Fixed: Pagination in commissions admin screen #68
603
- * Added: Support for WooCommerce Order Status Manager
604
- * Fixed: Updated media filter method for vendors #132
605
- * Fixed: Commission not logged for variations #131
606
-
607
- Version 1.6.1
608
-
609
- * Fixed: Support for Per Product Shipping 2.2.x #126
610
- * Added: Filter to change commission label in vendor email #127
611
-
612
- Version 1.6.0
613
-
614
- * Added: Admin notices for vendor page slug & permalinks
615
- * Fixed: Plugin row meta links
616
- * Added: Upgrade notice
617
- * Fixed: Rounding issue #120
618
- * Fixed: Paypal https host check deprecated call
619
- * Added: show_products attribute #107
620
- * Updated: Text in denied template to make more sense when registration disabled #123
621
- * Updated: wcv_vendorslist shortcode now shows 3 column output #123
622
- * Fixed: Index issue #122
623
- * Updated: New plugin and template directory structure - IMPORTANT READ KB
624
-
625
- Version 1.5.0
626
-
627
- * Added: Spanish translation thanks Mauricio
628
- * Added: French translation thanks JP
629
- * Added: CSS class for sold by (classes same as filters in those files)
630
- * Fixed: Paypal return URL
631
- * Added: Vendor Dashboard UI Improvements
632
- * Added: WC Vendors Test Gateway
633
- * Updated: ToolTips to be more helpful
634
- * Added: Admin option for not giving shipping cost to vendor
635
- * Fixed: Disable notify admin
636
- * Fixed: Mark as shipped/unshipped
637
- * Fixed: Duplicate column name
638
-
639
- Version 1.4.5
640
-
641
- * Updated: select2 3.5.2 for settings api
642
- * Fixed: Replaced Chosen with Select2 #102
643
- * Fixed: Table Rate Shipping issue #103
644
- * Fixed: Featured column issue #100
645
- * Updated: Filter call for report
646
- * Fixed: Call to deprecated function #98
647
-
648
- Version 1.4.4
649
-
650
- * Fixed: Hardcoded table in wcv_vendorslist shortcode
651
-
652
- Version 1.4.3
653
-
654
- * Fixed: Placeholder on Product Reports
655
-
656
- Version 1.4.2
657
-
658
- * Added: Commission status sort to commissions page
659
- * Fixed: Recent Commissions limit of 20 now works on selected date range
660
- * Fixed: Report By product in WC2.3
661
- * Fixed: Vendor Report date selector in wp-admin
662
- * Fixed: Tracking plugin Order Meta
663
- * Added: New filter wcvendors_dashboard_google_maps_link
664
- * Fixed: Formatting error for Google maps link
665
- * Added: New actions in vendor-dashboard wcvendors_vendor_unship, wcvendors_vendor_ship (thanks Nathan H)
666
-
667
- Version 1.4.1
668
-
669
- * Fixed: Language file loading issue
670
- * Fixed: Static function calls in commision class for php 5.6
671
- * Fixed: Static call in Vendor Cart
672
- * Added: New language files for de_AT, de_DE (thanks to theHubi), it_IT (thanks to Nicole)
673
- * Added: New actions for main and mini headers (before and after see KB)
674
-
675
- Version 1.4.0
676
-
677
- * Added: product category + vendor shortcode [wcv_product_category category="category" vendor="vendorname"]
678
- * Added: Tracking number support via WooThemes Shipment Tracking plugin
679
- * Added: Google Maps for delivery address on front end
680
- * Fixed: woocommerce_wp_text_input via merged pull request from svenl77
681
- * Added: Vendor List shortcode [wcv_vendorlist] + template for styling see KB for full details
682
- * Fixed: Report not showing Commission by Product
683
- * Fixed: Paths in language files
684
-
685
- Version 1.3.1
686
-
687
- * Fixed: Sold by in invoices
688
-
689
- Version 1.3.0
690
-
691
- * Added: show vendor on all emails #29
692
- * Fixed: Critical issue #58
693
- * Added: Vendor header templates #65
694
- * Added: Vendor to QuickEdit #12
695
- * Fixed: Updating notices to use 2.1 Notice API #62
696
- * Added: wcvendors_registration_checkbox filter to denied.php template view
697
- * Added: wcvendors_vendor_registration_checkbox filter to filter "Apply to become a vendor?" at registration.
698
- * Added: wcvendors_vendor_registration_checkbox to filter "Apply to become a vendor?"
699
-
700
- Version 1.2.0
701
-
702
- * Added new filters to change sold by text see Knowledge base for details
703
- * Added sold by to product loop for archive-product.php, see knowledge base on how to disable or change this
704
- * Added new option to hide "Featured product" from vendors
705
- * Added Sold By Filter as per #3
706
- * Removing unused tag filter
707
- * Updated default.pot
708
- * Fixing attribute bug #48 - Thanks to gcskye
709
- * Removing legacy translations
710
- * Fixed Orders view errors
711
- * Fixing call to incorrect method #45
712
-
713
- Version 1.1.5
714
-
715
- * Fixed orders view to remove incorrect call to woocommerce print messages
716
-
717
- Version 1.1.4
718
-
719
- * Fixed called to incorrect notice method
720
- * Moved methods into parent class See #41
721
- * PHP Strict updates
722
- * Deprecated Class due to PHP strict issues
723
- * fixing static call
724
- * Tidying up and comments.
725
- * Renaming class to new standard
726
- * Removing deprecated wc methods.
727
- * Fixing incorrect method call
728
- * Problem with undefined variable.
729
- * fixing static call issues
730
- * fixing static call problems
731
- * Fixing more strict issues
732
- * fixing encoding issue
733
- * Fixing tax rounding issue #37
734
- * Fixing deprecated calls #42
735
- * Fixing strict standards
736
- * Fixing constant reference #36
737
- * Fixed reference to old plugin name
738
- * Fixing strict errors #27
739
- * New Default POT translations #26
740
- * Fixing translation strings #26
741
- * Updated description
742
- * Fix link to paypal adaptive payments #25
743
- * Fixing issue #22
744
- * Remove support for woo commerce 2.1 and below
745
- * Class rename
746
- * Fixed incorrect table name see #35
747
- * Fixed Class description
748
- * Added label on vendor email shipping line see #22
749
- * Fix issue #23 Notify vendor email problem
750
- * Fixing Issue #28 & removing WC2.0 support
751
- * Strict Standards in WCV_Vendors #32
752
- * Fixing Issue #31 PHP Strict Issues
753
- * Fixing Issue #30 PHP Strict Standards
754
- * Change Log added for release changes
755
- * WC Version Requirement changed
756
- * Updating author to include wc after modifications
757
- * Rename class
758
- * Fixing up link to documentation
759
- * Updated Readme
760
-
761
- Version 1.1.3
762
-
763
- * Fixing table names for compatibility
764
- * Rename class
765
- * Fixing Fatal error #18
766
- * Fatal error fixed, version bump
767
- * Fixing Class call
768
- * Fixing all references to incorrect class name
769
- * Commission and report fixes
770
- * Fixing spelling
771
- * Update readme.txt
772
- * Fixing author
773
- * Version bump
774
- * Check if shipping is enabled
775
- * Comment for future reference
776
-
777
- Version 1.1.1
778
-
779
- * Start of adding woocomerce short codes enhanced
780
- * Shortcodes class
781
- * Removing temp file
782
- * Adding short code support
783
- * Version Bump
784
- * PHP Strict Issue #5
785
- * Fatal Error: Class 'PV_Commission' #14
786
- * Fixing references to PV_Vendors
787
- * Renamed filters and actions
788
- * Rename Reports Submenu #15
789
- * "Mark Shipped" Icon #16
790
- * Version increased after bug fixes
791
-
792
- Version 1.0.2
793
-
794
- * Fix up admin settings notices
795
- * Renamed shortcodes
796
- * Version bump for short code rename
797
-
798
-
799
- Version 1.0.1
800
-
801
- * Initial Commit
802
- * First commit - no modifications to existing plugin
803
- * Updating README
804
- * Update README.md
805
- * Features added
806
- * Updated Details of plugin
807
- * Fixing up formatting
808
- * More fixes.
809
- * Updating readme
810
- * Updating more details
811
- * Update denied.php
812
- * Added mac file ignore
813
- * updated read me
814
- * Plugin Rename
815
- * Plugin rename
816
- * Rename plugin
817
- * Rename plugin
818
- * more updates
819
- * Plugin Updater removed
820
- * Updating text domain
821
- * Basic rename complete
822
- * Replacement includes classes
823
- * text domain updates
824
- * text domain updates
825
- * new change log for new fork
826
- * Rename main class
827
- * renaming constants
828
- * updated constants
829
- * plugin constant
830
- * Renaming queries class
831
- * constants updated
832
- * rename vendor shop class
833
- * rename vendor cart class
834
- * Renaming classes
835
- * Author updates
836
- * Class renaming
837
- * Version bump
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/class-wc-vendors.php DELETED
@@ -1,462 +0,0 @@
1
- <?php
2
- /**
3
- * Plugin Name: WC Vendors Marketplace
4
- * Plugin URI: https://www.wcvendors.com
5
- * Description: Create a marketplace with WooCommerce and allow vendors to sell their own products and receive a commission for each sale.
6
- * Author: WC Vendors
7
- * Author URI: https://www.wcvendors.com
8
- * GitHub Plugin URI: https://github.com/wcvendors/wcvendors
9
- *
10
- * Version: 2.1.2
11
- * Requires at least: 4.4.0
12
- * Tested up to: 5.0.0
13
- * WC requires at least: 3.3.0
14
- * WC tested up to: 3.5.0
15
- *
16
- * Text Domain: wc-vendors
17
- * Domain Path: /languages/
18
- *
19
- * @category Plugin
20
- * @copyright Copyright © 2012 Matt Gates
21
- * @copyright Copyright © 2018 WC Vendors
22
- * @author Matt Gates, WC Vendors
23
- * @package WCVendors
24
- * @license GPL2
25
-
26
- WC Vendors Marketplace is free software: you can redistribute it and/or modify
27
- it under the terms of the GNU General Public License as published by
28
- the Free Software Foundation, either version 2 of the License, or
29
- any later version.
30
-
31
- WC Vendors Marketplace is distributed in the hope that it will be useful,
32
- but WITHOUT ANY WARRANTY; without even the implied warranty of
33
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
34
- GNU General Public License for more details.
35
-
36
- You should have received a copy of the GNU General Public License
37
- along with WC Vendors Marketplace. If not, see http://www.gnu.org/licenses/gpl-2.0.txt.
38
-
39
- */
40
-
41
-
42
- /**
43
- * Plugin activation hook
44
- */
45
- function wcvendors_activate() {
46
-
47
- /**
48
- * Requires woocommerce to be installed and active
49
- */
50
- if ( !class_exists( 'WooCommerce' ) ) {
51
- deactivate_plugins( plugin_basename( __FILE__ ) );
52
- wp_die( __( 'WC Vendors Marketplace requires WooCommerce to run. Please install WooCommerce and activate before attempting to activate again.', 'wc-vendors' ) );
53
- }
54
- //Flush rewrite rules when activating plugin
55
- flush_rewrite_rules();
56
- } // wcvendors_activate()
57
-
58
- /**
59
- * Plugin deactivation hook
60
- */
61
- function wcvendors_deactivate(){
62
- require_once trailingslashit( dirname( __FILE__ ) ) . 'classes/class-uninstall.php';
63
- WCVendors_Uninstall::uninstall();
64
- }
65
-
66
- register_activation_hook( __FILE__, 'wcvendors_activate' );
67
-
68
- register_deactivation_hook( __FILE__, 'wcvendors_deactivate' );
69
-
70
-
71
- /**
72
- * Required functions
73
- */
74
- require_once trailingslashit( dirname( __FILE__ ) ) . 'classes/includes/class-functions.php';
75
-
76
- /**
77
- * Check if WooCommerce is active
78
- */
79
- if ( wcv_is_woocommerce_activated() ) {
80
-
81
- /* Define an absolute path to our plugin directory. */
82
- if ( !defined( 'wcv_plugin_dir' ) ) define( 'wcv_plugin_dir', trailingslashit( dirname( __FILE__ ) ) );
83
- if ( !defined( 'wcv_assets_url' ) ) define( 'wcv_assets_url', trailingslashit( plugins_url( 'assets', __FILE__ ) ) );
84
- if ( !defined( 'wcv_plugin_base' ) ) define( 'wcv_plugin_base', plugin_basename( __FILE__ ) );
85
- if ( !defined( 'wcv_plugin_dir_path' ) ) define( 'wcv_plugin_dir_path', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
86
-
87
- /**
88
- * Main Product Vendor class
89
- *
90
- * @package WCVendors
91
- */
92
- class WC_Vendors
93
- {
94
-
95
- public $version = '2.1.1';
96
-
97
- /**
98
- * @var
99
- */
100
- public static $pv_options;
101
- public static $id = 'wc_prd_vendor';
102
-
103
- /**
104
- * Constructor.
105
- */
106
- public function __construct()
107
- {
108
-
109
- // Load text domain
110
- add_action( 'plugins_loaded', array( $this, 'load_il8n' ) );
111
-
112
- $this->title = __( 'WC Vendors Marketplace', 'wc-vendors' );
113
-
114
- $this->define_constants();
115
-
116
- // Install & upgrade
117
- add_action( 'admin_init', array( $this, 'check_install' ) );
118
- add_action( 'init', array( $this, 'maybe_flush_permalinks' ), 99 );
119
- add_action( 'wcvendors_flush_rewrite_rules', array( $this, 'flush_rewrite_rules' ) );
120
- add_action( 'admin_init', array( $this, 'wcv_required_ignore_notices' ) );
121
-
122
- add_action( 'plugins_loaded', array( $this, 'include_gateways' ) );
123
- add_action( 'plugins_loaded', array( $this, 'include_core' ) );
124
- add_action( 'init', array( $this, 'include_init' ) );
125
- add_action( 'current_screen', array( $this, 'include_assets' ) );
126
-
127
- // // Start a PHP session, if not yet started then destroy if logged in or out
128
- if ( ( ! is_admin() || defined( 'DOING_AJAX' ) ) && ! defined( 'DOING_CRON' ) && ! defined( 'REST_REQUEST' ) ) {
129
- add_action( 'init', array( $this, 'init_session'), 1 );
130
- add_action( 'wp_logout', array( $this, 'destroy_session') );
131
- add_action( 'wp_login', array( $this, 'destroy_session') );
132
- }
133
-
134
- // // Legacy settings
135
- add_action( 'admin_init', array( 'WCVendors_Install', 'check_pro_version' ) );
136
- add_action( 'plugins_loaded', array( $this, 'load_legacy_settings' ) );
137
-
138
- // Show update notices
139
- $file = basename( __FILE__ );
140
- $folder = basename( dirname( __FILE__ ) );
141
- $hook = "in_plugin_update_message-{$folder}/{$file}";
142
- add_action( $hook, array( $this, 'show_upgrade_notification') , 10, 2);
143
-
144
- //Add become a vendor rewrite endpoint
145
- add_action( 'init', array( $this, 'add_rewrite_endpoint' ) );
146
- add_action( 'after_switch_theme', array( $this, 'flush_rewrite_rules') );
147
- }
148
-
149
-
150
- /**
151
- *
152
- */
153
- public function invalid_wc_version() {
154
- echo '<div class="error"><p>' . __( '<b>WC Vendors Marketplace is inactive</b>. WC Vendors Marketplace requires a minimum of WooCommerce 3.0.0 to operate.', 'wc-vendors' ) . '</p></div>';
155
- }
156
-
157
- /**
158
- * Define WC Constants.
159
- */
160
- private function define_constants() {
161
-
162
- $this->define( 'WCV_VERSION', $this->version );
163
- $this->define( 'WCV_TEMPLATE_BASE', untrailingslashit( plugin_dir_path( __FILE__ ) ) . '/templates/' );
164
- $this->define( 'WCV_ABSPATH_ADMIN', dirname( __FILE__ ) . '/classes/admin/');
165
-
166
- }
167
-
168
- /**
169
- * Define constant if not already set.
170
- *
171
- * @param string $name Constant name.
172
- * @param string|bool $value Constant value.
173
- */
174
- private function define( $name, $value ) {
175
- if ( ! defined( $name ) ) {
176
- define( $name, $value );
177
- }
178
- }
179
-
180
-
181
- /**
182
- * Start the session
183
- */
184
- public function init_session(){
185
-
186
- if ( !session_id() && is_user_logged_in() ) {
187
- session_start();
188
- }
189
-
190
- } //init_session()
191
-
192
- public function destroy_session(){
193
-
194
- if ( session_id() ) {
195
- session_destroy();
196
- }
197
-
198
- } // destroy_session()
199
-
200
-
201
- /**
202
- * Check whether install has ran before or not
203
- *
204
- * Run install if it hasn't.
205
- *
206
- * @return unknown
207
- */
208
- public function check_install() {
209
-
210
- if ( version_compare( WC_VERSION, '3.0.0', '<' ) ) {
211
- add_action( 'admin_notices', array( $this, 'invalid_wc_version' ) );
212
- deactivate_plugins( plugin_basename( __FILE__ ) );
213
- return false;
214
- }
215
-
216
- }
217
-
218
-
219
- /**
220
- * Set static $pv_options to hold options class
221
- */
222
- public function load_legacy_settings() {
223
- if ( empty( self::$pv_options ) ) {
224
- include_once( wcv_plugin_dir . 'classes/includes/class-sf-settings.php' );
225
- self::$pv_options = new SF_Settings_API();
226
- }
227
- }
228
-
229
- public function load_il8n() {
230
- $locale = is_admin() && function_exists( 'get_user_locale' ) ? get_user_locale() : get_locale();
231
- $locale = apply_filters( 'plugin_locale', $locale, 'wc-vendors' );
232
- load_textdomain( 'wc-vendors', WP_LANG_DIR.'/wc-vendors/wc-vendors-'.$locale.'.mo');
233
- load_plugin_textdomain( 'wc-vendors', false, plugin_basename( dirname( __FILE__ ) ) . '/languages/' );
234
-
235
- }
236
-
237
- /**
238
- * Include core files
239
- */
240
- public function include_core() {
241
-
242
- include_once( wcv_plugin_dir . 'classes/class-queries.php');
243
- include_once( wcv_plugin_dir . 'classes/class-vendors.php');
244
- include_once( wcv_plugin_dir . 'classes/class-cron.php');
245
- include_once( wcv_plugin_dir . 'classes/class-commission.php');
246
- include_once( wcv_plugin_dir . 'classes/class-shipping.php');
247
- include_once( wcv_plugin_dir . 'classes/class-vendor-order.php');
248
- include_once( wcv_plugin_dir . 'classes/class-vendor-post-types.php');
249
- include_once( wcv_plugin_dir . 'classes/includes/wcv-template-functions.php');
250
- include_once( wcv_plugin_dir . 'classes/includes/wcv-update-functions.php');
251
- include_once( wcv_plugin_dir . 'classes/admin/emails/class-emails.php');
252
-
253
- if ( is_admin() ) {
254
-
255
- include_once( wcv_plugin_dir . 'classes/class-install.php' );
256
- include_once( wcv_plugin_dir . 'classes/admin/class-vendor-applicants.php');
257
- include_once( wcv_plugin_dir . 'classes/admin/class-admin-reports.php');
258
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-commissions-page.php');
259
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-setup.php');
260
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-notices.php');
261
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-settings.php');
262
- include_once( wcv_plugin_dir . 'classes/admin/class-admin-menus.php');
263
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-extensions.php');
264
- include_once( wcv_plugin_dir . 'classes/admin/class-wcv-admin-help.php');
265
- include_once( wcv_plugin_dir . 'classes/admin/class-setup-wizard.php');
266
- include_once( wcv_plugin_dir . 'classes/admin/class-vendor-admin-dashboard.php');
267
-
268
- new WCV_Vendor_Applicants;
269
- new WCV_Admin_Setup;
270
- new WCV_Vendor_Admin_Dashboard;
271
- new WCV_Admin_Reports;
272
-
273
- } else {
274
-
275
- include_once( wcv_plugin_dir . 'classes/includes/class-wcv-shortcodes.php');
276
- include_once( wcv_plugin_dir . 'classes/front/class-vendor-cart.php');
277
- include_once( wcv_plugin_dir . 'classes/front/dashboard/class-vendor-dashboard.php');
278
- include_once( wcv_plugin_dir . 'classes/front/class-vendor-shop.php');
279
- include_once( wcv_plugin_dir . 'classes/front/signup/class-vendor-signup.php');
280
- include_once( wcv_plugin_dir . 'classes/front/orders/class-orders.php');
281
- include_once( wcv_plugin_dir . 'classes/front/account/class-wc-account-links.php');
282
-
283
- new WCV_Orders;
284
- new WCV_Vendor_Dashboard;
285
- new WCV_Vendor_Signup;
286
- new WCV_Vendor_Shop;
287
- new WCV_Vendor_Cart;
288
- new WCV_Shortcodes;
289
- new WCV_Account_Links;
290
- }
291
-
292
- // Include
293
- if ( !function_exists( 'woocommerce_wp_text_input' ) && !is_admin() ) {
294
- include_once( WC()->plugin_path() . '/includes/admin/wc-meta-box-functions.php' );
295
- }
296
-
297
-
298
- new WCV_Shipping;
299
- new WCV_Cron;
300
- new WCV_Commission;
301
- new WCV_Vendors;
302
- new WCV_Emails;
303
- }
304
-
305
-
306
- /**
307
- * These need to be initlized later in loading to fix interaction with other plugins that call current_user_can at the right time.
308
- *
309
- * @since 1.9.4
310
- * @access public
311
- */
312
- public function include_init(){
313
-
314
- require_once wcv_plugin_dir . 'classes/admin/class-vendor-reports.php';
315
- require_once wcv_plugin_dir . 'classes/admin/class-product-meta.php';
316
- require_once wcv_plugin_dir . 'classes/admin/class-admin-users.php';
317
-
318
-
319
- new WCV_Vendor_Reports;
320
- new WCV_Product_Meta;
321
- new WCV_Admin_Users;
322
-
323
- } // include_init()
324
-
325
- /**
326
- * Load plugin assets
327
- */
328
- public function include_assets(){
329
-
330
- $screen = get_current_screen();
331
-
332
- if ( in_array( $screen->id, array( 'edit-product' ) ) ) {
333
- wp_enqueue_script( 'wcv_quick-edit', wcv_assets_url. 'js/wcv-admin-quick-edit.js', array('jquery') );
334
- }
335
-
336
- }
337
-
338
-
339
- /**
340
- * Include payment gateways
341
- */
342
- public function include_gateways()
343
- {
344
- require_once wcv_plugin_dir . 'classes/gateways/PayPal_AdvPayments/paypal_ap.php';
345
- require_once wcv_plugin_dir . 'classes/gateways/PayPal_Masspay/class-paypal-masspay.php';
346
- require_once wcv_plugin_dir . 'classes/gateways/WCV_Gateway_Test/class-wcv-gateway-test.php';
347
- }
348
-
349
- /**
350
- * If the settings are updated and the vendor page link has changed update permalinks
351
- * @access public
352
- *
353
- */
354
- public function maybe_flush_permalinks() {
355
- if ( wc_string_to_bool( get_option( 'wcvendors_queue_flush_rewrite_rules', 'no' ) ) ) {
356
- $this->flush_rewrite_rules();
357
- update_option( 'wcvendors_queue_flush_rewrite_rules', 'no' );
358
- }
359
- }
360
-
361
- public function flush_rewrite_rules(){
362
- flush_rewrite_rules();
363
- }
364
-
365
- /**
366
- * Add rewrite endpoint
367
- *
368
- * @return void
369
- */
370
- public function add_rewrite_endpoint(){
371
- add_rewrite_endpoint( 'become-a-vendor', EP_PAGES );
372
- $this->flush_rewrite_rules();
373
- }
374
-
375
-
376
- /**
377
- * Add user meta to remember ignore notices
378
- * @access public
379
- *
380
- */
381
- public function wcv_required_ignore_notices(){
382
- global $current_user;
383
- $current_user_id = $current_user->ID;
384
-
385
- /* If user clicks to ignore the notice, add that to their user meta */
386
- if ( isset( $_GET[ 'wcv_shop_ignore_notice' ] ) && '0' == $_GET[ 'wcv_shop_ignore_notice' ] ) {
387
- add_user_meta( $current_user_id, 'wcv_shop_ignore_notice', 'true', true);
388
- }
389
- if ( isset($_GET['wcv_pl_ignore_notice']) && '0' == $_GET['wcv_pl_ignore_notice'] ) {
390
- add_user_meta( $current_user_id, 'wcv_pl_ignore_notice', 'true' , true);
391
- }
392
-
393
- }
394
-
395
- /**
396
- * Class logger so that we can keep our debug and logging information cleaner
397
- *
398
- * @since 2.0.0
399
- * @version 2.0.0
400
- * @access public
401
- *
402
- * @param mixed - $data the data to go to the error log could be string, array or object
403
- */
404
- public static function log( $data = '', $prefix = '' ){
405
-
406
- $trace = debug_backtrace( false, 2 );
407
- $caller = ( isset( $trace[ 1 ]['class'] ) ) ? $trace[ 1 ]['class'] : basename( $trace[ 1 ][ 'file' ] );
408
-
409
- if ( is_array( $data ) || is_object( $data ) ) {
410
- if ( $prefix ){
411
- error_log( '===========================' );
412
- error_log( $prefix );
413
- error_log( '===========================' );
414
- }
415
- error_log( $caller . ' : ' . print_r( $data, true ) );
416
- } else {
417
- if ( $prefix ){
418
- error_log( '===========================' );
419
- error_log( $prefix );
420
- error_log( '===========================' );
421
- }
422
- error_log( $caller . ' : ' . $data );
423
- }
424
-
425
- } // log()
426
-
427
-
428
- /*
429
- * Upgrade notice displayed on the plugin screen
430
- *
431
- */
432
- public function show_upgrade_notification( $args, $response ) {
433
-
434
- $new_version = $response->new_version;
435
- $upgrade_notice = sprintf( __( 'WC Vendors 2.0 is a major update. This is not compatible with any of our existing extensions. You should test this update on a staging server before updating. Backup your site and update your theme and extensions, and <a href="%s">review update details here</a> before upgrading.', 'wc-vendors' ), 'https://docs.wcvendors.com/knowledge-base/upgrading-to-wc-vendors-2-0/');
436
-
437
- if ( version_compare( WCV_VERSION, '2.0.0', '<' ) && version_compare( $new_version, '2.0.0', '>=') ){
438
- echo '<h3>Important Upgrade Notice:</h3>';
439
- echo '<p style="background-color: #d54e21; padding: 10px; color: #f9f9f9; margin-top: 10px">';
440
- echo $upgrade_notice;
441
- if ( !class_exists( 'WCVendors_Pro' ) ) echo '</p>';
442
-
443
- if ( class_exists( 'WCVendors_Pro' ) ){
444
-
445
- if ( version_compare( WCV_PRO_VERSION, '1.5.0', '<' ) ){
446
- echo '<h3>WC Vendors Pro Notice</h3>';
447
- echo '<p style="background-color: #d54e21; padding: 10px; color: #f9f9f9; margin-top: 10px">';
448
- $pro_upgrade = sprintf( __( 'WC Vendors Pro 1.5.0 is required to run WC Vendors 2.0.0. Your current version %s will be deactivated. Please upgrade to the latest version.', 'wc-vendors' ), WCV_PRO_VERSION );
449
-
450
- echo $pro_upgrade;
451
- }
452
-
453
- }
454
-
455
- }
456
- } // show_upgrade_notification()
457
-
458
- }
459
-
460
- $wc_vendors = new WC_Vendors;
461
-
462
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-admin-menus.php DELETED
@@ -1,185 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) {
3
- exit;
4
- }
5
-
6
- /**
7
- * The admin class handles all admin custom page functions for admin view
8
- *
9
- * @author Jamie Madden, WC Vendors
10
- * @category Admin
11
- * @package WCVendors/Admin
12
- * @version 2.0.0
13
- */
14
- class WCVendors_Admin_Menus {
15
-
16
- public $commissions_table;
17
-
18
- /**
19
- * Constructor
20
- */
21
- public function __construct(){
22
-
23
- // Add menus
24
- add_action( 'admin_menu', array( $this, 'admin_menu' ) );
25
- add_action( 'admin_menu', array( $this, 'commissions_menu' ), 50 );
26
- add_action( 'admin_menu', array( $this, 'settings_menu' ), 70 );
27
- add_action( 'admin_menu', array( $this, 'extensions_menu'), 80 );
28
- add_action( 'admin_head', array( $this, 'commission_table_header_styles' ) );
29
-
30
- add_filter( 'set-screen-option', array( __CLASS__, 'set_commissions_screen' ), 10, 3 );
31
-
32
- }
33
-
34
- /**
35
- * WC Vendors menu
36
- */
37
- public function admin_menu() {
38
-
39
- global $menu;
40
-
41
- if ( current_user_can( 'manage_woocommerce' ) ) {
42
- $menu[] = array( '', 'read', 'separator-woocommerce', '', 'wp-menu-separator wcvendors' );
43
- }
44
-
45
- add_menu_page( __( 'WC Vendors', 'wc-vendors' ), __( 'WC Vendors', 'wc-vendors' ), 'manage_woocommerce', 'wc-vendors', array( $this, 'extensions_page' ), 'dashicons-cart', '50' );
46
- }
47
-
48
- /**
49
- * Addons menu item.
50
- */
51
- public function extensions_menu() {
52
- add_submenu_page( 'wc-vendors', __( 'WC Vendors Extensions', 'wc-vendors' ), __( 'Extensions', 'wc-vendors' ), 'manage_woocommerce', 'wcv-extensions', array( $this, 'extensions_page' ) );
53
- remove_submenu_page( 'wc-vendors', 'wc-vendors' );
54
- }
55
-
56
- /**
57
- * Addons Page
58
- */
59
- public function extensions_page(){
60
- WCVendors_Admin_Extensions::output();
61
- }
62
-
63
- /**
64
- * Add the commissions sub menu
65
- *
66
- * @since 1.0.0
67
- * @access public
68
- *
69
- */
70
- public function commissions_menu() {
71
-
72
- $commissions_page = add_submenu_page( 'wc-vendors', __( 'Commissions', 'wc-vendors' ), __( 'Commissions', 'wc-vendors' ), 'manage_woocommerce', 'wcv-commissions', array( $this, 'commissions_page' ) );\
73
- add_action( "load-$commissions_page", array( $this, 'commission_screen_options' ) );
74
-
75
- } // commissions_menu()
76
-
77
-
78
- /**
79
- * Settings menu item
80
- */
81
- public function settings_menu(){
82
- $settings_page = add_submenu_page( 'wc-vendors', __( 'WC Vendors Settings', 'wcvendors' ), __( 'Settings', 'wcvendors' ), 'manage_woocommerce', 'wcv-settings', array( $this, 'settings_page' ) );
83
- add_action( 'load-' . $settings_page, array( $this, 'settings_page_init') );
84
- }
85
-
86
-
87
- /**
88
- * Loads required objects into memory for use within settings
89
- */
90
- public function settings_page_init() {
91
-
92
- global $current_tab, $current_section;
93
-
94
- // Include settings pages
95
- WCVendors_Admin_Settings::get_settings_pages();
96
-
97
- // Get current tab/section
98
- $current_tab = empty( $_GET['tab'] ) ? 'general' : sanitize_title( $_GET['tab'] );
99
- $current_section = empty( $_REQUEST['section'] ) ? '' : sanitize_title( $_REQUEST['section'] );
100
-
101
- // Save settings if data has been posted
102
- if ( ! empty( $_POST ) ) {
103
- WCVendors_Admin_Settings::save();
104
- }
105
-
106
- // Add any posted messages
107
- if ( ! empty( $_GET['wcv_error'] ) ) {
108
- WCVendors_Admin_Settings::add_error( stripslashes( $_GET['wcv_error'] ) );
109
- }
110
-
111
- if ( ! empty( $_GET['wcv_message'] ) ) {
112
- WCVendors_Admin_Settings::add_message( stripslashes( $_GET['wcv_message'] ) );
113
- }
114
- }
115
-
116
- /**
117
- * Settings Page
118
- */
119
- public function settings_page(){
120
- WCVendors_Admin_Settings::output();
121
- }
122
-
123
- /**
124
- * Commission page output
125
- *
126
- * @since 2.0.0
127
- */
128
- public function commissions_page(){
129
- include( WCV_ABSPATH_ADMIN . 'views/html-admin-commission-page.php' );
130
- }
131
-
132
-
133
- /**
134
- * Screen options
135
- */
136
- public function commission_screen_options() {
137
-
138
- $option = 'per_page';
139
- $args = [
140
- 'label' => 'Commissions',
141
- 'default' => 10,
142
- 'option' => 'commissions_per_page'
143
- ];
144
-
145
- add_screen_option( $option, $args );
146
-
147
- $this->commissions_table = new WCVendors_Commissions_Page();
148
- }
149
-
150
- public static function set_commissions_screen( $status, $option, $value ) {
151
- return $value;
152
- }
153
-
154
- /**
155
- * Load styles for the commissions table page
156
- */
157
- public function commission_table_header_styles() {
158
-
159
- $page = ( isset( $_GET[ 'page' ] ) ) ? esc_attr( $_GET[ 'page' ] ) : false;
160
-
161
-
162
- wp_enqueue_style( 'wcv-admin-styles', wcv_assets_url . 'css/wcv-admin.css', array(), WCV_VERSION );
163
-
164
- // Only load the styles on the license table page
165
-
166
- if ( 'wcv_admin_commissions' !== $page ) return;
167
-
168
- echo '<style type="text/css">';
169
- echo '.wp-list-table .column-product_id { width: 20%; }';
170
- echo '.wp-list-table .column-vendor_id { width: 15%; }';
171
- echo '.wp-list-table .column-order_id { width: 8%; }';
172
- echo '.wp-list-table .column-total_due { width: 10%;}';
173
- echo '.wp-list-table .column-total_shipping { width: 10%;}';
174
- echo '.wp-list-table .column-tax { width: 10%;}';
175
- echo '.wp-list-table .column-totals { width: 10%;}';
176
- echo '.wp-list-table .column-status { width: 5%;}';
177
- echo '.wp-list-table .column-time { width: 10%;}';
178
- echo '</style>';
179
-
180
- } //table_header_styles()
181
-
182
-
183
- }
184
-
185
- new WCVendors_Admin_Menus();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-admin-page.php DELETED
@@ -1,882 +0,0 @@
1
- <?php
2
-
3
- class WCV_Admin_Setup
4
- {
5
- /**
6
- * WC > Referrals menu
7
- */
8
-
9
- public function __construct()
10
- {
11
- add_filter( 'set-screen-option', array( 'WCV_Admin_Setup', 'set_table_option' ), 10, 3 );
12
- add_action( 'admin_menu', array( 'WCV_Admin_Setup', 'menu' ) );
13
-
14
- add_action( 'woocommerce_admin_order_data_after_shipping_address', array( $this, 'add_vendor_details' ), 10, 2 );
15
- add_action( 'woocommerce_admin_order_actions_end', array( $this, 'append_actions' ), 10, 1 );
16
-
17
- add_filter( 'woocommerce_debug_tools', array( $this, 'wcvendors_tools' ) );
18
-
19
- add_action( 'admin_head', array( $this, 'commission_table_header_styles' ) );
20
-
21
- add_action( 'admin_init', array( $this, 'export_commissions' ) );
22
- }
23
-
24
-
25
- public function add_vendor_details( $order )
26
- {
27
- $actions = $this->append_actions( $order, true );
28
-
29
- if (empty( $actions['wc_pv_shipped']['name'] )) {
30
- return;
31
- }
32
-
33
- echo '<h4>' . __('Vendors shipped', 'wcvendors') . '</h4><br/>';
34
- echo $actions['wc_pv_shipped']['name'];
35
- }
36
-
37
- public function append_actions( $order, $order_page = false )
38
- {
39
- global $woocommerce;
40
-
41
- $order_id = ( version_compare( WC_VERSION, '2.7', '<' ) ) ? $order->id : $order->get_id();
42
-
43
- $authors = WCV_Vendors::get_vendors_from_order( $order );
44
- $authors = $authors ? array_keys( $authors ) : array();
45
- if ( empty( $authors ) ) return false;
46
-
47
- $shipped = (array) get_post_meta( $order_id, 'wc_pv_shipped', true );
48
- $string = '</br></br>';
49
-
50
- foreach ($authors as $author ) {
51
- $string .= in_array( $author, $shipped ) ? '&#10004; ' : '&#10005; ';
52
- $string .= WCV_Vendors::get_vendor_shop_name( $author );
53
- $string .= '</br>';
54
- }
55
-
56
- $response = array(
57
- 'url' => '#',
58
- 'name' => __('Vendors Shipped', 'wcvendors') . $string,
59
- 'action' => 'wc_pv_shipped',
60
- 'image_url' => wcv_assets_url . '/images/icons/truck.png',
61
- );
62
-
63
- if ( ! $order_page ) {
64
- printf( '<a class="button tips %s" href="%s" data-tip="%s"><img style="width:16px;height:16px;" src="%s"></a>', $response['action'], $response['url'], $response['name'], $response['image_url'] );
65
- } else {
66
- echo $response['name'];
67
- }
68
-
69
- return $response;
70
- }
71
-
72
-
73
- /**
74
- * Add the commissions sub menu
75
- *
76
- * @since 1.0.0
77
- * @access public
78
- *
79
- */
80
- public static function menu()
81
- {
82
- $hook = add_submenu_page(
83
- 'woocommerce',
84
- __( 'Commission', 'wcvendors' ), __( 'Commission', 'wcvendors' ),
85
- 'manage_woocommerce',
86
- 'pv_admin_commissions',
87
- array( 'WCV_Admin_Setup', 'commissions_page' )
88
- );
89
-
90
- add_action( "load-$hook", array( 'WCV_Admin_Setup', 'add_options' ) );
91
-
92
- add_action( "admin_print_styles-$hook", array( 'WCV_Admin_Setup', 'commission_enqueue_style' ) );
93
- add_action( "admin_print_scripts-$hook", array( 'WCV_Admin_Setup', 'commission_my_enqueue_script' ) );
94
-
95
-
96
-
97
- } // menu()
98
-
99
-
100
- /**
101
- * Add tools to the woocommerce status tools page
102
- *
103
- * @since 1.9.2
104
- * @access public
105
- */
106
- public function wcvendors_tools( $tools ){
107
-
108
- $tools[ 'reset_wcvendor_roles' ] = array(
109
- 'name' => __( 'Reset WC Vendors roles ', 'wcvendors' ),
110
- 'button' => __( 'Reset WC Vendor Roles', 'wcvendors' ),
111
- 'desc' => __( 'This will reset the wcvendors roles ( vendor & pending_vendor ), back to the default capabilities.', 'wcvendors' ),
112
- 'callback' => array( 'WCV_Admin_Setup', 'reset_vendor_roles' )
113
- );
114
-
115
- $tools[ 'reset_wcvendors' ] = array(
116
- 'name' => __( 'Reset WC Vendors ', 'wcvendors' ),
117
- 'button' => __( 'Reset WC Vendors Settings', 'wcvendors' ),
118
- 'desc' => __( 'This will reset wcvendors back to defaults. This DELETES ALL YOUR Settings.', 'wcvendors' ),
119
- 'callback' => array( 'WCV_Admin_Setup', 'reset_wcvendors' )
120
- );
121
-
122
- return $tools;
123
-
124
- } // wcvendors_tools()
125
-
126
- /**
127
- * Reset the vendor roles
128
- *
129
- * @since 1.9.2
130
- * @access public
131
- */
132
- public static function reset_vendor_roles(){
133
-
134
- $can_add = WC_Vendors::$pv_options->get_option( 'can_submit_products' );
135
- $can_edit = WC_Vendors::$pv_options->get_option( 'can_edit_published_products' );
136
- $can_submit_live = WC_Vendors::$pv_options->get_option( 'can_submit_live_products' );
137
- $can_view_reports = WC_Vendors::$pv_options->get_option( 'can_view_backend_reports' );
138
-
139
- $args = array(
140
- 'assign_product_terms' => $can_add,
141
- 'edit_products' => $can_add || $can_edit,
142
- 'edit_published_products' => $can_edit,
143
- 'delete_published_products' => $can_edit,
144
- 'delete_products' => $can_edit,
145
- 'manage_product' => $can_add,
146
- 'publish_products' => $can_submit_live,
147
- 'read' => true,
148
- 'read_products' => $can_edit || $can_add,
149
- 'upload_files' => true,
150
- 'import' => true,
151
- 'view_woocommerce_reports' => false,
152
- );
153
-
154
- remove_role( 'vendor' );
155
- add_role( 'vendor', __('Vendor', 'wcvendors'), $args );
156
-
157
- remove_role( 'pending_vendor');
158
- add_role( 'pending_vendor', __( 'Pending Vendor', 'wcvendors' ), array(
159
- 'read' => true,
160
- 'edit_posts' => false,
161
- 'delete_posts' => true
162
- ) );
163
-
164
- echo '<div class="updated inline"><p>' . __( 'WC Vendor roles successfully reset.', 'wcvendors' ) . '</p></div>';
165
-
166
- } // reset_vendor_roles()
167
-
168
-
169
- /**
170
- * Reset wcvendors
171
- *
172
- * @since 1.9.2
173
- * @access public
174
- */
175
- public static function reset_wcvendors(){
176
-
177
- delete_option( WC_Vendors::$id . '_options' );
178
- echo '<div class="updated inline"><p>' . __( 'WC Vendors was successfully reset. All settings have been reset.', 'wcvendors' ) . '</p></div>';
179
-
180
- } // reset_wcvendors()
181
-
182
-
183
- public static function commission_enqueue_style(){
184
-
185
- wp_enqueue_style( 'commissions_select2_css', wcv_assets_url . 'css/select2.min.css' );
186
-
187
- } //commission_enqueue_style()
188
-
189
- public static function commission_my_enqueue_script(){
190
-
191
- $select2_args = apply_filters( 'wcvendors_select2_commission_args', array(
192
- 'placeholder' => __( 'Select a Vendor', 'wcvendors' ),
193
- 'allowclear' => true,
194
- ) );
195
-
196
- wp_enqueue_script( 'commissions_select2_styles_js', wcv_assets_url. 'js/select2.min.js', array('jquery') );
197
-
198
- wp_register_script( 'commissions_select2_load_js', wcv_assets_url. 'js/wcv-commissions.js', array('jquery') );
199
- wp_localize_script( 'commissions_select2_load_js', 'wcv_commissions_select', $select2_args );
200
- wp_enqueue_script( 'commissions_select2_load_js' );
201
-
202
- }
203
-
204
- /**
205
- * Load styles for the commissions table page
206
- */
207
- public function commission_table_header_styles() {
208
-
209
- $page = ( isset( $_GET[ 'page' ] ) ) ? esc_attr( $_GET[ 'page' ] ) : false;
210
-
211
- // Only load the styles on the license table page
212
-
213
- if ( 'pv_admin_commissions' !== $page ) return;
214
-
215
- echo '<style type="text/css">';
216
- echo '.wp-list-table .column-product_id { width: 20%; }';
217
- echo '.wp-list-table .column-vendor_id { width: 15%; }';
218
- echo '.wp-list-table .column-order_id { width: 8%; }';
219
- echo '.wp-list-table .column-total_due { width: 10%;}';
220
- echo '.wp-list-table .column-total_shipping { width: 10%;}';
221
- echo '.wp-list-table .column-tax { width: 10%;}';
222
- echo '.wp-list-table .column-totals { width: 10%;}';
223
- echo '.wp-list-table .column-status { width: 5%;}';
224
- echo '.wp-list-table .column-time { width: 10%;}';
225
- echo '</style>';
226
-
227
- } //table_header_styles()
228
-
229
- /**
230
- *
231
- *
232
- * @param unknown $status
233
- * @param unknown $option
234
- * @param unknown $value
235
- *
236
- * @return unknown
237
- */
238
- public static function set_table_option( $status, $option, $value )
239
- {
240
- if ( $option == 'commission_per_page' ) {
241
- return $value;
242
- }
243
- }
244
-
245
-
246
- /**
247
- *
248
- */
249
- public static function add_options()
250
- {
251
- global $PV_Admin_Page;
252
-
253
- $args = array(
254
- 'label' => 'Rows',
255
- 'default' => 10,
256
- 'option' => 'commission_per_page'
257
- );
258
- add_screen_option( 'per_page', $args );
259
-
260
- $PV_Admin_Page = new WCV_Admin_Page();
261
-
262
- }
263
-
264
-
265
- /**
266
- * HTML setup for the WC > Commission page
267
- */
268
- public static function commissions_page()
269
- {
270
- global $woocommerce, $PV_Admin_Page;
271
- ?>
272
-
273
- <div class="wrap">
274
-
275
- <div id="icon-woocommerce" class="icon32 icon32-woocommerce-reports"><br/></div>
276
- <h2><?php _e( 'Commission', 'wcvendors' ); ?></h2>
277
-
278
- <form id="posts-filter" method="get">
279
-
280
- <?php
281
- $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRIPPED );
282
- $paged = filter_input( INPUT_GET, 'paged', FILTER_SANITIZE_NUMBER_INT );
283
-
284
- printf( '<input type="hidden" name="page" value="%s" />', $page );
285
- printf( '<input type="hidden" name="paged" value="%d" />', $paged );
286
- ?>
287
-
288
- <input type="hidden" name="page" value="pv_admin_commissions"/>
289
-
290
- <?php $PV_Admin_Page->prepare_items(); ?>
291
- <?php $PV_Admin_Page->views() ?>
292
- <?php $PV_Admin_Page->display() ?>
293
-
294
- </form>
295
- <div id="ajax-response"></div>
296
- <br class="clear"/>
297
- </div>
298
- <?php
299
- }
300
-
301
- /*
302
- * Export commissions via csv
303
- */
304
- public function export_commissions(){
305
-
306
- // prepare the items to export
307
-
308
-
309
- if ( isset( $_GET['action'], $_GET['nonce'] ) && wp_verify_nonce( wp_unslash( $_GET['nonce'] ), 'export_commissions' ) && 'export_commissions' === wp_unslash( $_GET['action'] ) ) {
310
-
311
- include_once( 'class-wcv-commissions-csv-exporter.php' );
312
-
313
- $exporter = new WCV_Commissions_CSV_Export();
314
-
315
- $date = date( 'Y-M-d' );
316
-
317
- if ( ! empty( $_GET['com_status'] ) ) { // WPCS: input var ok.
318
- $exporter->set_filename( 'wcv_commissions_'. wp_unslash( $_GET['com_status'] ) . '-' . $date . '.csv' ); // WPCS: input var ok, sanitization ok.
319
- } else {
320
- $exporter->set_filename( 'wcv_commissions-' . $date . '.csv' ); // WPCS: input var ok, sanitization ok.
321
- }
322
-
323
- $exporter->export();
324
- }
325
-
326
- }
327
-
328
-
329
- }
330
-
331
-
332
- if ( !class_exists( 'WP_List_Table' ) ) require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
333
-
334
- /**
335
- * WC_Simple_Referral_Admin class.
336
- *
337
- * @extends WP_List_Table
338
- */
339
- class WCV_Admin_Page extends WP_List_Table
340
- {
341
-
342
- public $index;
343
-
344
-
345
- /**
346
- * __construct function.
347
- *
348
- * @access public
349
- */
350
- function __construct()
351
- {
352
- global $status, $page;
353
-
354
- $this->index = 0;
355
-
356
- //Set parent defaults
357
- parent::__construct( array(
358
- 'singular' => 'commission',
359
- 'plural' => 'commissions',
360
- 'ajax' => false
361
- ) );
362
- }
363
-
364
-
365
- /**
366
- * column_default function.
367
- *
368
- * @access public
369
- *
370
- * @param unknown $item
371
- * @param mixed $column_name
372
- *
373
- * @return unknown
374
- */
375
- function column_default( $item, $column_name )
376
- {
377
- global $wpdb;
378
-
379
- switch ( $column_name ) {
380
- case 'id' :
381
- return $item->id;
382
- case 'vendor_id' :
383
- $user = get_userdata( $item->vendor_id );
384
- return '<a href="' . admin_url( 'user-edit.php?user_id=' . $item->vendor_id ) . '">' . WCV_Vendors::get_vendor_shop_name( $item->vendor_id ) . '</a>';
385
- case 'total_due' :
386
- return wc_price( $item->total_due );
387
- case 'total_shipping':
388
- return wc_price($item->total_shipping );
389
- case 'tax':
390
- return wc_price( $item->tax );
391
- case 'totals' :
392
- $totals = ( wc_tax_enabled() ) ? $item->total_due + $item->total_shipping + $item->tax : $item->total_due + $item->total_shipping;
393
- return wc_price( $totals );
394
- case 'product_id' :
395
- $parent = get_post_ancestors( $item->product_id );
396
- $product_id = $parent ? $parent[ 0 ] : $item->product_id;
397
- $wcv_total_sales = get_post_meta( $product_id, 'total_sales', true );
398
- if ( ! get_post_status( $product_id ) ) {
399
- $product_id = WCV_Vendors::find_parent_id_from_order( $item->order_id, $product_id );
400
- }
401
- return '<a href="' . admin_url( 'post.php?post=' . $product_id . '&action=edit' ) . '">' . get_the_title( $product_id ) . '</a> (<span title="' . get_the_title( $product_id ) .' has sold ' . $wcv_total_sales . ' times total.">' . $wcv_total_sales . '</span>)';
402
- case 'order_id' :
403
- $order = wc_get_order( $item->order_id );
404
- if ( $order ) {
405
- return '<a href="' . admin_url( 'post.php?post=' . $item->order_id . '&action=edit' ) . '">' . $order->get_order_number() . '</a>';
406
- } else {
407
- return $item->order_id;
408
- }
409
- case 'status' :
410
- return $item->status;
411
- case 'time' :
412
- return date_i18n( get_option( 'date_format' ), strtotime( $item->time ) );
413
- }
414
- }
415
-
416
-
417
- /**
418
- * column_cb function.
419
- *
420
- * @access public
421
- *
422
- * @param mixed $item
423
- *
424
- * @return unknown
425
- */
426
- function column_cb( $item )
427
- {
428
- return sprintf(
429
- '<input type="checkbox" name="%1$s[]" value="%2$s" />',
430
- /*$1%s*/
431
- 'id',
432
- /*$2%s*/
433
- $item->id
434
- );
435
- }
436
-
437
-
438
- /**
439
- * get_columns function.
440
- *
441
- * @access public
442
- * @return unknown
443
- */
444
- function get_columns()
445
- {
446
- $columns = array(
447
- 'cb' => '<input type="checkbox" />',
448
- 'product_id' => __( 'Product', 'wcvendors' ),
449
- 'order_id' => __( 'Order ID', 'wcvendors' ),
450
- 'vendor_id' => __( 'Vendor', 'wcvendors' ),
451
- 'total_due' => __( 'Commission', 'wcvendors' ),
452
- 'total_shipping' => __( 'Shipping', 'wcvendors' ),
453
- 'tax' => __( 'Tax', 'wcvendors' ),
454
- 'totals' => __( 'Total', 'wcvendors' ),
455
- 'status' => __( 'Status', 'wcvendors' ),
456
- 'time' => __( 'Date', 'wcvendors' ),
457
- );
458
-
459
- if ( ! wc_tax_enabled() ) unset( $columns[ 'tax'] );
460
-
461
- return $columns;
462
- }
463
-
464
-
465
- /**
466
- * get_sortable_columns function.
467
- *
468
- * @access public
469
- * @return unknown
470
- */
471
- function get_sortable_columns()
472
- {
473
- $sortable_columns = array(
474
- 'time' => array( 'time', true ),
475
- 'product_id' => array( 'product_id', false ),
476
- 'order_id' => array( 'order_id', false ),
477
- 'total_due' => array( 'total_due', false ),
478
- 'total_shipping' => array( 'total_shipping', false ),
479
- 'tax' => array( 'tax', false ),
480
- 'totals' => array( 'totals', false ),
481
- 'status' => array( 'status', false ),
482
- 'vendor_id' => array( 'vendor_id', false ),
483
- 'status' => array( 'status', false ),
484
- );
485
-
486
- if ( ! wc_tax_enabled() ) unset( $sortable_columns[ 'tax'] );
487
-
488
- return $sortable_columns;
489
- }
490
-
491
-
492
- /**
493
- * Get bulk actions
494
- *
495
- * @return unknown
496
- */
497
- function get_bulk_actions()
498
- {
499
- $actions = array(
500
- 'mark_paid' => __( 'Mark paid', 'wcvendors' ),
501
- 'mark_due' => __( 'Mark due', 'wcvendors' ),
502
- 'mark_reversed' => __( 'Mark reversed', 'wcvendors' ),
503
- // 'delete' => __('Delete', 'wcvendors'),
504
- );
505
-
506
- $actions = apply_filters('wcv_edit_bulk_actions', $actions);
507
-
508
- return $actions;
509
- }
510
-
511
-
512
- /**
513
- *
514
- */
515
- function extra_tablenav( $which )
516
- {
517
- $m = isset( $_GET[ 'm' ] ) ? (int) $_GET[ 'm' ] : 0;
518
- $com_status = isset( $_GET[ 'com_status' ] ) ? $_GET[ 'com_status' ] : '';
519
- $vendor_id = isset( $_GET[ 'vendor_id' ] ) ? $_GET[ 'vendor_id' ] : '';
520
- $args_url = '';
521
-
522
- if ( $m ) $args_url .= '&m='. $m;
523
- if ( $com_status ) $args_url .= '&com_status='. $com_status;
524
- if ( $vendor_id ) $args_url .= '&vendor_id='. $vendor_id;
525
-
526
- if ( $which == 'top' ) {
527
- echo '<div class="alignleft actions" style="width: 70%;">';
528
-
529
- // Months drop down
530
- $this->months_dropdown( 'commission' );
531
-
532
- // commission status drop down
533
- $this->status_dropdown( 'commission' );
534
-
535
- // Vendor drop down
536
- $this->vendor_dropdown( 'commission' );
537
-
538
- submit_button( __( 'Filter' ), false, false, false, array( 'id' => "post-query-submit", 'name' => 'do-filter' ) );
539
-
540
- echo '<a class="button" style="width: 110px; float: left;" href="' . wp_nonce_url( admin_url( 'admin.php?page=pv_admin_commissions&action=export_commissions'. $args_url ), 'export_commissions', 'nonce' ) . '">' . __('Export to CSV') . '</a>';
541
- echo '</div>';
542
-
543
- }
544
- }
545
-
546
-
547
- /**
548
- * Display a monthly dropdown for filtering items
549
- *
550
- * @since 3.1.0
551
- * @access protected
552
- *
553
- * @param unknown $post_type
554
- */
555
- function months_dropdown( $post_type )
556
- {
557
- global $wpdb, $wp_locale;
558
-
559
- $table_name = $wpdb->prefix . "pv_commission";
560
-
561
- $months = $wpdb->get_results( "
562
- SELECT DISTINCT YEAR( time ) AS year, MONTH( time ) AS month
563
- FROM $table_name
564
- ORDER BY time DESC
565
- " );
566
-
567
- $month_count = count( $months );
568
-
569
- if ( !$month_count || ( 1 == $month_count && 0 == $months[ 0 ]->month ) )
570
- return;
571
-
572
- $m = isset( $_GET[ 'm' ] ) ? (int) $_GET[ 'm' ] : 0;
573
- ?>
574
- <select name="m" id="filter-by-date">
575
- <option<?php selected( $m, 0 ); ?> value='0'><?php _e( 'Show all dates', 'wcvendors' ); ?></option>
576
- <?php
577
- foreach ( $months as $arc_row ) {
578
- if ( 0 == $arc_row->year )
579
- continue;
580
-
581
- $month = zeroise( $arc_row->month, 2 );
582
- $year = $arc_row->year;
583
-
584
- printf( "<option %s value='%s'>%s</option>\n",
585
- selected( $m, $year . $month, false ),
586
- esc_attr( $arc_row->year . $month ),
587
- /* translators: 1: month name, 2: 4-digit year */
588
- sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )
589
- );
590
- }
591
- ?>
592
- </select>
593
-
594
- <?php
595
- }
596
-
597
- /**
598
- * Display a status dropdown for filtering items
599
- *
600
- * @since 3.1.0
601
- * @access protected
602
- *
603
- * @param unknown $post_type
604
- */
605
- function status_dropdown( $post_type )
606
- {
607
- $com_status = isset( $_GET[ 'com_status' ] ) ? $_GET[ 'com_status' ] : '';
608
- ?>
609
- <select name="com_status">
610
- <option<?php selected( $com_status, '' ); ?> value=''><?php _e( 'Show all Statuses', 'wcvendors' ); ?></option>
611
- <option<?php selected( $com_status, 'due' ); ?> value="due"><?php _e( 'Due', 'wcvendors' ); ?></option>
612
- <option<?php selected( $com_status, 'paid' ); ?> value="paid"><?php _e( 'Paid', 'wcvendors' ); ?></option>
613
- <option<?php selected( $com_status, 'reversed' ); ?> value="reversed"><?php _e( 'Reversed', 'wcvendors' ); ?></option>
614
- </select>
615
- <?php
616
- }
617
-
618
- /**
619
- * Display a vendor dropdown for filtering commissions
620
- *
621
- * @since 1.9.2
622
- * @access public
623
- *
624
- * @param unknown $post_type
625
- */
626
- public function vendor_dropdown( $post_type ){
627
-
628
- $user_args = array( 'fields' => array( 'ID', 'display_name' ) );
629
- $vendor_id = isset( $_GET[ 'vendor_id' ] ) ? $_GET[ 'vendor_id' ] : '';
630
- $new_args = $user_args;
631
- $new_args[ 'role' ] = 'vendor';
632
- $users = get_users( $new_args );
633
-
634
- // Generate the drop down
635
- $output = '<select style="width: 30%;" name="vendor_id" id="vendor_id" class="select2">';
636
- $output .= "<option></option>";
637
- foreach ( (array) $users as $user ) {
638
- $select = selected( $user->ID, $vendor_id, false );
639
- $output .= "<option value='$user->ID' $select>$user->display_name</option>";
640
- }
641
- $output .= '</select>';
642
-
643
- echo $output;
644
-
645
- } // vendor_dropdown()
646
-
647
-
648
-
649
- /**
650
- * Process bulk actions
651
- *
652
- * @return unknown
653
- */
654
- function process_bulk_action()
655
- {
656
- if ( !isset( $_GET[ 'id' ] ) ) return;
657
-
658
- $items = array_map( 'intval', $_GET[ 'id' ] );
659
- $ids = implode( ',', $items );
660
-
661
- switch ( $this->current_action() ) {
662
- case 'mark_paid':
663
- $result = $this->mark_paid( $ids );
664
-
665
- if ( $result )
666
- echo '<div class="updated"><p>' . __( 'Commission marked paid.', 'wcvendors' ) . '</p></div>';
667
- break;
668
-
669
- case 'mark_due':
670
- $result = $this->mark_due( $ids );
671
-
672
- if ( $result )
673
- echo '<div class="updated"><p>' . __( 'Commission marked due.', 'wcvendors' ) . '</p></div>';
674
- break;
675
-
676
- case 'mark_reversed':
677
- $result = $this->mark_reversed( $ids );
678
-
679
- if ( $result )
680
- echo '<div class="updated"><p>' . __( 'Commission marked reversed.', 'wcvendors' ) . '</p></div>';
681
- break;
682
-
683
- default:
684
- // code...
685
- do_action('wcv_edit_process_bulk_actions', $this->current_action(), $ids);
686
- break;
687
- }
688
-
689
- }
690
-
691
-
692
- /**
693
- *
694
- *
695
- * @param unknown $ids (optional)
696
- *
697
- * @return unknown
698
- */
699
- public function mark_paid( $ids = array() )
700
- {
701
- global $wpdb;
702
-
703
- $table_name = $wpdb->prefix . "pv_commission";
704
-
705
- $query = "UPDATE `{$table_name}` SET `status` = 'paid' WHERE id IN ($ids) AND `status` = 'due'";
706
- $result = $wpdb->query( $query );
707
-
708
- return $result;
709
- }
710
-
711
-
712
- /**
713
- *
714
- *
715
- * @param unknown $ids (optional)
716
- *
717
- * @return unknown
718
- */
719
- public function mark_reversed( $ids = array() )
720
- {
721
- global $wpdb;
722
-
723
- $table_name = $wpdb->prefix . "pv_commission";
724
- $query = "UPDATE `{$table_name}` SET `status` = 'reversed' WHERE id IN ($ids)";
725
- $result = $wpdb->query( $query );
726
-
727
- return $result;
728
-
729
- }
730
-
731
-
732
- /**
733
- *
734
- *
735
- * @param unknown $ids (optional)
736
- *
737
- * @return unknown
738
- */
739
- public function mark_due( $ids = array() )
740
- {
741
- global $wpdb;
742
-
743
- $table_name = $wpdb->prefix . "pv_commission";
744
-
745
- $query = "UPDATE `{$table_name}` SET `status` = 'due' WHERE id IN ($ids)";
746
- $result = $wpdb->query( $query );
747
-
748
- return $result;
749
- }
750
-
751
-
752
- /**
753
- * cubrid_prepare(conn_identifier, prepare_stmt)_items function.
754
- *
755
- * @access public
756
- */
757
- function prepare_items()
758
- {
759
- global $wpdb;
760
-
761
- $_SERVER['REQUEST_URI'] = remove_query_arg( '_wp_http_referer', $_SERVER['REQUEST_URI'] );
762
-
763
- $per_page = $this->get_items_per_page( 'commission_per_page', 10 );
764
- $current_page = $this->get_pagenum();
765
-
766
- $orderby = !empty( $_REQUEST[ 'orderby' ] ) ? esc_attr( $_REQUEST[ 'orderby' ] ) : 'time';
767
- $order = ( !empty( $_REQUEST[ 'order' ] ) && $_REQUEST[ 'order' ] == 'asc' ) ? 'ASC' : 'DESC';
768
- $com_status = !empty( $_REQUEST[ 'com_status' ] ) ? esc_attr( $_REQUEST[ 'com_status' ] ) : '';
769
- $vendor_id = !empty( $_REQUEST[ 'vendor_id' ] ) ? esc_attr( $_REQUEST[ 'vendor_id' ] ) : '';
770
- $status_sql = '';
771
- $time_sql = '';
772
-
773
- /**
774
- * Init column headers
775
- */
776
- $this->_column_headers = $this->get_column_info();
777
-
778
- /**
779
- * Process bulk actions
780
- */
781
- $this->process_bulk_action();
782
-
783
- /**
784
- * Get items
785
- */
786
- $sql = "SELECT COUNT(id) FROM {$wpdb->prefix}pv_commission";
787
-
788
- if ( !empty( $_GET[ 'm' ] ) ) {
789
-
790
- $year = substr( $_GET[ 'm' ], 0, 4 );
791
- $month = substr( $_GET[ 'm' ], 4, 2 );
792
-
793
- $time_sql = "
794
- WHERE MONTH(`time`) = '$month'
795
- AND YEAR(`time`) = '$year'
796
- ";
797
-
798
- $sql .= $time_sql;
799
- }
800
-
801
- if ( !empty( $_GET[ 'com_status' ] ) ) {
802
-
803
- if ( $time_sql == '' ) {
804
- $status_sql = "
805
- WHERE status = '$com_status'
806
- ";
807
- } else {
808
- $status_sql = "
809
- AND status = '$com_status'
810
- ";
811
- }
812
-
813
- $sql .= $status_sql;
814
- }
815
-
816
-
817
- if ( !empty( $_GET[ 'vendor_id' ] ) ) {
818
-
819
- if ( $time_sql == '' && $status_sql == '' ) {
820
- $vendor_sql = "
821
- WHERE vendor_id = '$vendor_id'
822
- ";
823
- } else {
824
- $vendor_sql = "
825
- AND vendor_id = '$vendor_id'
826
- ";
827
- }
828
-
829
- $sql .= $vendor_sql;
830
- }
831
-
832
- $max = $wpdb->get_var( $sql );
833
-
834
- $sql = "
835
- SELECT * FROM {$wpdb->prefix}pv_commission
836
- ";
837
-
838
- if ( !empty( $_GET[ 'm' ] ) ) {
839
- $sql .= $time_sql;
840
- }
841
-
842
- if ( !empty( $_GET['com_status'] ) ) {
843
- $sql .= $status_sql;
844
- }
845
-
846
- if ( !empty( $_GET['vendor_id'] ) ) {
847
- $sql .= $vendor_sql;
848
- }
849
-
850
- $offset = ( $current_page - 1 ) * $per_page;
851
-
852
- $sql .= "
853
- ORDER BY `{$orderby}` {$order}
854
- LIMIT {$offset}, {$per_page}
855
- ";
856
-
857
- // $this->items = $wpdb->get_results( $wpdb->prepare( $sql, ( $current_page - 1 ) * $per_page, $per_page ) );
858
- $this->items = $wpdb->get_results( $sql );
859
-
860
- /**
861
- * Pagination
862
- */
863
- $this->set_pagination_args( array(
864
- 'total_items' => $max,
865
- 'per_page' => $per_page,
866
- 'total_pages' => ceil( $max / $per_page )
867
- ) );
868
- }
869
-
870
- public function get_views() {
871
- $views = array(
872
- 'all' => '<li class="all"><a href="' . admin_url( 'admin.php?page=pv_admin_commissions' ) . '">' . __( 'All', 'wcvendors' ) . '</a></li>',
873
- 'due' => '<li class="all"><a href="' . admin_url( 'admin.php?page=pv_admin_commissions&com_status=due' ) . '">' . __( 'Due', 'wcvendors' ) . '</a></li>',
874
- 'paid' => '<li class="all"><a href="' . admin_url( 'admin.php?page=pv_admin_commissions&com_status=paid' ) . '">' . __( 'Paid', 'wcvendors' ) . '</a></li>',
875
- 'void' => '<li class="all"><a href="' . admin_url( 'admin.php?page=pv_admin_commissions&com_status=void' ) . '">' . __( 'Void', 'wcvendors' ) . '</a></li>',
876
- );
877
-
878
- return $views;
879
- }
880
-
881
-
882
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-admin-reports.php DELETED
@@ -1,546 +0,0 @@
1
- <?php
2
- /**
3
- * WCV_Admin_Reports class.
4
- *
5
- * Shows reports related to software in the woocommerce backend
6
- *
7
- * @author Matt Gates <http://mgates.me>
8
- * @package
9
- */
10
-
11
-
12
- class WCV_Admin_Reports
13
- {
14
-
15
-
16
- /**
17
- * __construct function.
18
- *
19
- * @access public
20
- * @return void
21
- *
22
- * @param bool $debug (optional) (default: false)
23
- */
24
- function __construct( $debug = false )
25
- {
26
- add_filter( 'woocommerce_admin_reports', array( $this, 'reports_tab' ) );
27
- }
28
-
29
- /**
30
- * reports_tab function.
31
- *
32
- * @access public
33
- *
34
- * @param unknown $reports
35
- *
36
- * @return void
37
- */
38
- function reports_tab( $reports )
39
- {
40
- $reports[ 'vendors' ] = array(
41
- 'title' => __( 'WC Vendors', 'wc-vendors' ),
42
- 'charts' => array(
43
- array(
44
- 'title' => __( 'Overview', 'wc-vendors' ),
45
- 'description' => '',
46
- 'hide_title' => true,
47
- 'function' => array( $this, 'sales' ),
48
- ),
49
- array(
50
- 'title' => sprintf( __( 'Commission by %s', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
51
- 'description' => '',
52
- 'hide_title' => true,
53
- 'function' => array( $this, 'commission' ),
54
- ),
55
- array(
56
- 'title' => __( 'Commission by product', 'wc-vendors' ),
57
- 'description' => '',
58
- 'hide_title' => true,
59
- 'function' => array( $this, 'commission' ),
60
- ),
61
- array(
62
- 'title' => __( 'Commission Totals', 'wc-vendors' ),
63
- 'description' => __( 'Commission totals for all vendors includes shipping and taxes. By default no date range is used and all due commissions are returned. Use the date range to filter.', 'wc-vendors' ),
64
- 'hide_title' => true,
65
- 'function' => array( $this, 'commission_totals' ),
66
- ),
67
- ),
68
- );
69
-
70
- return apply_filters( 'wcvendors_admin_reports_tab', $reports );
71
- }
72
-
73
-
74
- /**
75
- *
76
- */
77
- function sales()
78
- {
79
-
80
- global $start_date, $end_date, $woocommerce, $wpdb;
81
-
82
- $commission_status_labels = WCV_Commission::commission_status();
83
-
84
- $start_date = !empty( $_POST[ 'start_date' ] ) ? $_POST[ 'start_date' ] : strtotime( date( 'Ymd', strtotime( date( 'Ym', current_time( 'timestamp' ) ) . '01' ) ) );
85
- $end_date = !empty( $_POST[ 'end_date' ] ) ? $_POST[ 'end_date' ] : strtotime( date( 'Ymd', current_time( 'timestamp' ) ) );
86
-
87
- if ( !empty( $_POST[ 'start_date' ] ) ) {
88
- $start_date = strtotime( $_POST[ 'start_date' ] );
89
- }
90
-
91
- if ( !empty( $_POST[ 'end_date' ] ) ) {
92
- $end_date = strtotime( $_POST[ 'end_date' ] );
93
- }
94
-
95
- $after = date( 'Y-m-d', $start_date );
96
- $before = date( 'Y-m-d', strtotime( '+1 day', $end_date ) );
97
-
98
- $commission_due = $wpdb->get_var( "
99
- SELECT SUM(total_due + total_shipping + tax) FROM {$wpdb->prefix}pv_commission WHERE status = 'due'
100
- AND time >= '" . $after . "'
101
- AND time <= '" . $before . "'
102
- " );
103
-
104
- $reversed = $wpdb->get_var( "
105
- SELECT SUM(total_due + total_shipping + tax) FROM {$wpdb->prefix}pv_commission WHERE status = 'reversed'
106
- AND time >= '" . $after . "'
107
- AND time <= '" . $before . "'
108
- " );
109
-
110
- $paid = $wpdb->get_var( "
111
- SELECT SUM(total_due + total_shipping + tax) FROM {$wpdb->prefix}pv_commission WHERE status = 'paid'
112
- AND time >= '" . $after . "'
113
- AND time <= '" . $before . "'
114
- " );
115
-
116
- ?>
117
-
118
- <form method="post" action="">
119
- <p><label for="from"><?php _e( 'From:', 'wc-vendors' ); ?></label>
120
- <input type="text" size="9" placeholder="yyyy-mm-dd" value="<?php echo esc_attr( date( 'Y-m-d', $start_date ) ); ?>" name="start_date" class="range_datepicker from" id="from" />
121
- <label for="to"><?php _e( 'To:', 'wc-vendors' ); ?></label>
122
- <input type="text" size="9" placeholder="yyyy-mm-dd" value="<?php echo esc_attr( date( 'Y-m-d', $end_date ) ); ?>" name="end_date" class="range_datepicker to" id="to" />
123
- <input type="submit" class="button" value="<?php _e( 'Show', 'wc-vendors' ); ?>"/></p>
124
- </form>
125
-
126
- <div id="poststuff" class="woocommerce-reports-wrap">
127
- <div class="woocommerce-reports-sidebar">
128
- <div class="postbox">
129
- <h3><span><?php _e( 'Total paid in range', 'wc-vendors' ); ?></span></h3>
130
-
131
- <div class="inside">
132
- <p class="stat"><?php if ( $paid > 0 ) echo wc_price( $paid ); else _e( 'n/a', 'wc-vendors' ); ?></p>
133
- </div>
134
- </div>
135
- <div class="postbox">
136
- <h3><span><?php _e( 'Total due in range', 'wc-vendors' ); ?></span></h3>
137
-
138
- <div class="inside">
139
- <p class="stat"><?php if ( $commission_due > 0 ) echo wc_price( $commission_due ); else _e( 'n/a', 'wc-vendors' ); ?></p>
140
- </div>
141
- </div>
142
- <div class="postbox">
143
- <h3><span><?php _e( 'Total reversed in range', 'wc-vendors' ); ?></span></h3>
144
-
145
- <div class="inside">
146
- <p class="stat"><?php if ( $reversed > 0 ) echo wc_price( $reversed ); else _e( 'n/a', 'wc-vendors' ); ?></p>
147
- </div>
148
- </div>
149
- </div>
150
-
151
- <div class="woocommerce-reports-main">
152
- <div class="postbox">
153
- <h3><span><?php _e( 'Recent Commission', 'wc-vendors' ); ?></span></h3>
154
-
155
- <div>
156
- <?php
157
- $commission = $wpdb->get_results( "
158
- SELECT * FROM {$wpdb->prefix}pv_commission
159
- WHERE time >= '" . $after . "'
160
- AND time <= '" . $before . "'
161
- ORDER BY time DESC
162
- " );
163
-
164
- if ( sizeof( $commission ) > 0 ) {
165
-
166
- ?>
167
- <div class="woocommerce_order_items_wrapper">
168
- <table id="commission-table" class="woocommerce_order_items" cellspacing="0">
169
- <thead>
170
- <tr>
171
- <th><?php _e( 'Order', 'wc-vendors' ) ?></th>
172
- <th><?php _e( 'Product', 'wc-vendors' ) ?></th>
173
- <th><?php printf( __( '%s', 'wc-vendors' ), wcv_get_vendor_name() ); ?></th>
174
- <th><?php _e( 'Total', 'wc-vendors' ) ?></th>
175
- <th><?php _e( 'Date &amp; Time', 'wc-vendors' ) ?></th>
176
- <th><?php _e( 'Status', 'wc-vendors' ) ?></th>
177
- </tr>
178
- </thead>
179
- <tbody>
180
- <?php $i = 1;
181
- foreach ( $commission as $row ) : $i++ ?>
182
- <tr<?php if ( $i % 2 == 1 ) echo ' class="alternate"' ?>>
183
- <td><?php if ( $row->order_id ) : ?><a
184
- href="<?php echo admin_url( 'post.php?post=' . $row->order_id . '&action=edit' ); ?>"><?php echo $row->order_id; ?></a><?php else : _e( 'N/A', 'wc-vendors' ); endif; ?>
185
- </td>
186
- <td><?php echo get_the_title( $row->product_id ); ?></td>
187
- <td><?php echo WCV_Vendors::get_vendor_shop_name( $row->vendor_id ); ?></td>
188
- <td><?php echo wc_price( $row->total_due + $row->total_shipping + $row->tax ) ?></td>
189
- <td><?php echo date_i18n( __( 'D j M Y \a\t h:ia', 'wc-vendors' ), strtotime( $row->time ) ) ?></td>
190
- <td><?php echo $commission_status_labels[ $row->status ]; ?></td>
191
- </tr>
192
- <?php endforeach; ?>
193
- </tbody>
194
- </table>
195
- </div>
196
- <?php
197
- } else {
198
- ?><p><?php _e( 'No commission yet', 'wc-vendors' ) ?></p><?php
199
- }
200
- ?>
201
- </div>
202
- </div>
203
- </div>
204
- </div>
205
- <?php
206
-
207
- }
208
-
209
-
210
- /**
211
- *
212
- */
213
- function commission()
214
- {
215
- global $start_date, $end_date, $woocommerce, $wpdb;
216
-
217
- $latest_woo = version_compare( $woocommerce->version, '2.3', '>' );
218
-
219
- $first_year = $wpdb->get_var( "SELECT time FROM {$wpdb->prefix}pv_commission ORDER BY time ASC LIMIT 1;" );
220
- $first_year = $first_year ? date( 'Y', strtotime( $first_year ) ) : date( 'Y' );
221
- $current_year = isset( $_POST[ 'show_year' ] ) ? $_POST[ 'show_year' ] : date( 'Y', current_time( 'timestamp' ) );
222
- $start_date = strtotime( $current_year . '0101' );
223
-
224
- $vendors = get_users( array( 'role' => 'vendor' ) );
225
- $vendors = apply_filters( 'pv_commission_vendors_list', $vendors );
226
- $selected_vendor = !empty( $_POST[ 'show_vendor' ] ) ? (int) $_POST[ 'show_vendor' ] : false;
227
- $products = !empty( $_POST[ 'product_ids' ] ) ? (array) $_POST[ 'product_ids' ] : array();
228
-
229
- ?>
230
-
231
- <form method="post" action="" class="report_filters">
232
- <label for="show_year"><?php _e( 'Show:', 'wc-vendors' ); ?></label>
233
- <select name="show_year" id="show_year">
234
- <?php
235
- for ( $i = $first_year; $i <= date( 'Y' ); $i++ )
236
- printf( '<option value="%s" %s>%s</option>', $i, selected( $current_year, $i, false ), $i );
237
- ?>
238
- </select>
239
- <?php if ( $_GET[ 'report' ] == 2 ) {
240
- if ($latest_woo) { ?>
241
- <select id="product_ids" name="product_ids[]" class="wc-product-search ajax_chosen_select_products" multiple="multiple"
242
- data-placeholder="<?php _e( 'Type in a product name to start searching...', 'wc-vendors' ); ?>"
243
- style="width: 400px;"></select>
244
- <?php } else { ?>
245
- <select id="product_ids" name="product_ids[]" class="ajax_chosen_select_products" multiple="multiple"
246
- data-placeholder="<?php _e( 'Type in a product name to start searching...', 'wc-vendors' ); ?>"
247
- style="width: 400px;"></select>
248
- <script type="text/javascript">
249
- jQuery(function () {
250
-
251
- // Ajax Chosen Product Selectors
252
- jQuery("select.ajax_chosen_select_products").ajaxChosen({
253
- method: 'GET',
254
- url: '<?php echo admin_url('admin-ajax.php'); ?>',
255
- dataType: 'json',
256
- afterTypeDelay: 100,
257
- data: {
258
- action: 'woocommerce_json_search_products',
259
- security: '<?php echo wp_create_nonce("search-products"); ?>'
260
- }
261
- }, function (data) {
262
-
263
- var terms = {};
264
-
265
- jQuery.each(data, function (i, val) {
266
- terms[i] = val;
267
- });
268
-
269
- return terms;
270
- });
271
-
272
- });
273
- </script>
274
-
275
- <?php }
276
- } else { ?>
277
- <select class="chosen_select" id="show_vendor" name="show_vendor" style="width: 300px;"
278
- data-placeholder="<?php echo sprintf( __( 'Select a %s&hellip;', 'wc-vendors' ), wcv_get_vendor_name() ); ?>">
279
- <option></option>
280
- <?php foreach ( $vendors as $key => $vendor ) printf( '<option value="%s" %s>%s</option>', $vendor->ID, selected( $selected_vendor, $vendor->ID, false ), $vendor->display_name ); ?>
281
- </select>
282
- <?php } ?>
283
- <input type="submit" class="button" value="<?php _e( 'Show', 'wc-vendors' ); ?>"/>
284
- </form>
285
-
286
- <?php
287
-
288
- if ( !empty( $selected_vendor ) || !empty( $products ) ) {
289
-
290
- foreach ($products as $key => $product_id) {
291
- $_product = wc_get_product($product_id);
292
- $childs = $_product->get_children();
293
- $products = array_merge($childs, $products);
294
- }
295
-
296
- $commissions = array();
297
- $filter = !empty( $selected_vendor ) ? (" WHERE vendor_id = " . $selected_vendor) : (" WHERE product_id IN ( " . implode( ', ', $products ) ." )");
298
-
299
- $sql = "SELECT
300
- SUM(total_due + total_shipping + tax) as total,
301
- SUM(total_due) as commission,
302
- SUM(total_shipping) as shipping,
303
- SUM(tax) as tax
304
- FROM {$wpdb->prefix}pv_commission
305
- ";
306
-
307
- $paid_sql = "SELECT SUM(total_due + total_shipping + tax) FROM {$wpdb->prefix}pv_commission " . $filter . " AND status = 'paid'";
308
- $reversed_sql = "SELECT SUM(total_due + total_shipping + tax) FROM {$wpdb->prefix}pv_commission" . $filter . " AND status = 'reversed'";
309
- $date_sql = " AND date_format(`time`,'%%Y%%m') = %d";
310
-
311
- for ( $count = 0; $count < 12; $count++ ) {
312
- $time = strtotime( date( 'Ym', strtotime( '+ ' . $count . ' MONTH', $start_date ) ) . '01' );
313
- if ( $time > current_time( 'timestamp' ) ) continue;
314
-
315
- $month = date( 'Ym', strtotime( date( 'Ym', strtotime( '+ ' . $count . ' MONTH', $start_date ) ) . '01' ) );
316
-
317
- $fetch_results = $wpdb->prepare( $sql . $filter . $date_sql, $month );
318
-
319
- $results = $wpdb->get_results( $fetch_results );
320
- if ( !empty( $results[ 0 ] ) ) {
321
- extract( get_object_vars( $results[ 0 ] ) );
322
- }
323
-
324
- $paid = $wpdb->get_var( $wpdb->prepare( $paid_sql . $date_sql, $month ) );
325
- $reversed = $wpdb->get_var( $wpdb->prepare( $reversed_sql . $date_sql, $month ) );
326
-
327
- $commissions[ date( 'M', strtotime( $month . '01' ) ) ] = array(
328
- 'commission' => $commission,
329
- 'tax' => $tax,
330
- 'shipping' => $shipping,
331
- 'reversed' => $reversed,
332
- 'paid' => $paid,
333
- 'total' => $total - $reversed - $paid,
334
- );
335
-
336
- }
337
-
338
- ?>
339
-
340
- <div class="woocommerce-reports-main">
341
- <table class="widefat">
342
- <thead>
343
- <tr>
344
- <th><?php _e( 'Month', 'wc-vendors' ); ?></th>
345
- <th class="total_row"><?php _e( 'Commission Totals', 'wc-vendors' ); ?></th>
346
- <th class="total_row"><?php _e( 'Tax', 'wc-vendors' ); ?></th>
347
- <th class="total_row"><?php _e( 'Shipping', 'wc-vendors' ); ?></th>
348
- <th class="total_row"><?php _e( 'Reversed', 'wc-vendors' ); ?></th>
349
- <th class="total_row"><?php _e( 'Paid', 'wc-vendors' ); ?></th>
350
- <th class="total_row"><?php _e( 'Due', 'wc-vendors' ); ?></th>
351
- </tr>
352
- </thead>
353
- <tfoot>
354
- <tr>
355
- <?php
356
- $total = array(
357
- 'commission' => 0,
358
- 'tax' => 0,
359
- 'shipping' => 0,
360
- 'reversed' => 0,
361
- 'paid' => 0,
362
- 'total' => 0,
363
- );
364
-
365
- foreach ( $commissions as $month => $commission ) {
366
- $total[ 'commission' ] += $commission[ 'commission' ];
367
- $total[ 'tax' ] += $commission[ 'tax' ];
368
- $total[ 'shipping' ] += $commission[ 'shipping' ];
369
- $total[ 'reversed' ] += $commission[ 'reversed' ];
370
- $total[ 'paid' ] += $commission[ 'paid' ];
371
- $total[ 'total' ] += $commission[ 'total' ];
372
- }
373
-
374
- echo '<td>' . __( 'Total', 'wc-vendors' ) . '</td>';
375
-
376
- foreach ( $total as $value ) {
377
- echo '<td class="total_row">' . wc_price( $value ) . '</td>';
378
- }
379
- ?>
380
- </tr>
381
- </tfoot>
382
- <tbody>
383
- <?php
384
- foreach ( $commissions as $month => $commission ) {
385
- $alt = ( isset( $alt ) && $alt == 'alt' ) ? '' : 'alt';
386
-
387
- echo '<tr class="' . $alt . '"><td>' . $month . '</td>';
388
-
389
- foreach ( $commission as $value ) {
390
- echo '<td class="total_row">' . wc_price( $value ) . '</td>';
391
- }
392
-
393
- echo '</tr>';
394
- }
395
- ?>
396
- </tbody>
397
- </table>
398
- </div>
399
-
400
- <?php } ?>
401
- <?php
402
-
403
- }
404
-
405
-
406
- /**
407
- * Commission Totals for vendors reports
408
- *
409
- * @since 1.8.4
410
- */
411
- function commission_totals(){
412
-
413
- global $wpdb;
414
-
415
- $total_start_date = !empty( $_POST[ 'total_start_date' ] ) ? $_POST[ 'total_start_date' ] : strtotime( date( 'Ymd', strtotime( date( 'Ym', current_time( 'timestamp' ) ) . '01' ) ) );
416
- $total_end_date = !empty( $_POST[ 'total_end_date' ] ) ? $_POST[ 'total_end_date' ] : strtotime( date( 'Ymd', current_time( 'timestamp' ) ) );
417
- $commission_status = !empty( $_POST[ 'commission_status' ] ) ? $_POST[ 'commission_status' ] : 'due';
418
- $date_sql = ( !empty( $_POST[ 'total_start_date' ] ) && !empty( $_POST[ 'total_end_date' ] ) ) ? " time BETWEEN '$total_start_date 00:00:00' AND '$total_end_date 23:59:59' AND" : "";
419
-
420
- $status_sql = " status='$commission_status'";
421
-
422
- $sql = "SELECT vendor_id, total_due, total_shipping, tax, status FROM {$wpdb->prefix}pv_commission WHERE";
423
-
424
- $commissions = $wpdb->get_results( $sql . $date_sql . $status_sql );
425
-
426
- if ( !empty( $_POST[ 'total_start_date' ] ) ) {
427
- $total_start_date = strtotime( $_POST[ 'total_start_date' ] );
428
- }
429
-
430
- if ( !empty( $_POST[ 'total_end_date' ] ) ) {
431
- $total_end_date = strtotime( $_POST[ 'total_end_date' ] );
432
- }
433
-
434
- $totals = $this->calculate_totals( $commissions );
435
-
436
- ?><form method="post" action="">
437
- <p><label for="from"><?php _e( 'From:', 'wc-vendors' ); ?></label>
438
- <input type="text" size="9" placeholder="yyyy-mm-dd" value="<?php echo esc_attr( date( 'Y-m-d', $total_start_date ) ); ?>" name="total_start_date" class="range_datepicker from" id="from" />
439
- <label for="to"><?php _e( 'To:', 'wc-vendors' ); ?></label>
440
- <input type="text" size="9" placeholder="yyyy-mm-dd" value="<?php echo esc_attr( date( 'Y-m-d', $total_end_date ) ); ?>" name="total_end_date" class="range_datepicker to" id="to" />
441
-
442
- <select name="commission_status">
443
- <option value="due"><?php _e( 'Due', 'wc-vendors' ); ?></option>
444
- <option value="paid"><?php _e( 'Paid', 'wc-vendors' ); ?></option>
445
- <option value="reversed"><?php _e( 'Reversed', 'wc-vendors' ); ?></option>
446
- </select>
447
-
448
- <input type="submit" class="button" value="<?php _e( 'Show', 'wc-vendors' ); ?>"/>
449
-
450
- <?php do_action( 'wcvendors_after_commission_reports', $commissions ); ?>
451
- </p>
452
- </form>
453
-
454
- <div class="woocommerce-reports-main">
455
- <table class="widefat">
456
- <thead>
457
- <tr>
458
- <th class="total_row"><?php printf( __( '%s', 'wc-vendors' ),wcv_get_vendor_name() ); ?></th>
459
- <th class="total_row"><?php _e( 'Tax Total', 'wc-vendors' ); ?></th>
460
- <th class="total_row"><?php _e( 'Shipping Total', 'wc-vendors' ); ?></th>
461
- <th class="total_row"><?php _e( 'Status', 'wc-vendors' ); ?></th>
462
- <th class="total_row"><?php _e( 'Commission Total', 'wc-vendors' ); ?></th>
463
- </tr>
464
- </thead>
465
- <tbody>
466
- <?php
467
-
468
- if ( !empty( $commissions ) ){
469
-
470
- foreach ( $totals as $totals ) {
471
-
472
- echo '<tr>';
473
- echo '<td>' . $totals[ 'user_login' ]. '</td>';
474
- echo '<td>' . wc_price( $totals[ 'tax' ] ). '</td>';
475
- echo '<td>' . wc_price( $totals[ 'total_shipping' ] ). '</td>';
476
- echo '<td>' . $totals[ 'status' ] . '</td>';
477
- echo '<td>' . wc_price( $totals[ 'total_due' ] ). '</td>';
478
- echo '</tr>';
479
-
480
- }
481
-
482
- } else {
483
- echo '<tr>';
484
- echo '<td colspan="5">'. __( 'No commissions found.', 'wc-vendors' ) . '</td>';
485
- echo '</tr>';
486
-
487
- }
488
- ?>
489
- </tbody>
490
- </table>
491
-
492
- <?php
493
-
494
-
495
- } // commission_totals()
496
-
497
- /**
498
- * Calculate the totals of the commissions return an array with vendor id as the key with the totals
499
- *
500
- * @param array $commissions total commissions array
501
- * @return array $totals calculated totals
502
- */
503
- function calculate_totals( $commissions ){
504
-
505
- $totals = array();
506
-
507
- $vendors = get_users( array( 'role' => 'vendor', 'fields' => array( 'ID', 'user_login' ) ) );
508
- $vendor_names = wp_list_pluck( $vendors, 'user_login', 'ID' );
509
-
510
- foreach ($commissions as $commission ) {
511
-
512
- if ( array_key_exists( $commission->vendor_id, $totals ) ){
513
-
514
- $totals[ $commission->vendor_id ][ 'total_due' ] += $commission->total_due + $commission->tax + $commission->total_shipping;
515
- $totals[ $commission->vendor_id ][ 'tax' ] += $commission->tax;
516
- $totals[ $commission->vendor_id ][ 'total_shipping' ] += $commission->total_shipping;
517
-
518
- } else {
519
-
520
- if ( array_key_exists( $commission->vendor_id, $vendor_names) ){
521
-
522
- $temp_array = array(
523
- 'user_login' => $vendor_names[ $commission->vendor_id ],
524
- 'total_due' => $commission->total_due + $commission->tax + $commission->total_shipping,
525
- 'tax' => $commission->tax,
526
- 'total_shipping' => $commission->total_shipping,
527
- 'status' => $commission->status,
528
- );
529
-
530
- $totals[ $commission->vendor_id ] = $temp_array ;
531
-
532
- }
533
-
534
- }
535
-
536
- }
537
-
538
- usort( $totals, function( $a, $b ) {
539
- return strcmp( strtolower( $a[ 'user_login' ] ), strtolower( $b[ 'user_login' ] ) );
540
- });
541
-
542
- return $totals;
543
-
544
- } // calculate_totals()
545
-
546
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-admin-users.php DELETED
@@ -1,447 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * WP-Admin users page
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package WC_Vendors
8
- */
9
-
10
-
11
- class WCV_Admin_Users
12
- {
13
-
14
-
15
- /**
16
- * Constructor
17
- */
18
- function __construct()
19
- {
20
- if ( !is_admin() ) return;
21
-
22
- add_action( 'edit_user_profile', array( $this, 'show_extra_profile_fields' ) );
23
- add_action( 'edit_user_profile_update', array( $this, 'save_extra_profile_fields' ) );
24
-
25
- add_filter( 'add_menu_classes', array( $this, 'show_pending_number' ) );
26
-
27
- // Disabling non-vendor related items on the admin screens
28
- if ( WCV_Vendors::is_vendor( get_current_user_id() ) ) {
29
- add_filter( 'woocommerce_csv_product_role', array( $this, 'csv_import_suite_compatibility' ) );
30
- add_filter( 'woocommerce_csv_product_export_args', array( $this, 'csv_import_suite_compatibility_export' ) );
31
-
32
- // Admin page lockdown
33
- remove_action( 'admin_init', 'woocommerce_prevent_admin_access' );
34
- add_action( 'admin_init', array( $this, 'prevent_admin_access' ) );
35
-
36
- add_filter( 'woocommerce_prevent_admin_access', array( $this, 'deny_admin_access' ) );
37
-
38
- // WC > Product page fixes
39
- add_action( 'load-post-new.php', array( $this, 'confirm_access_to_add' ) );
40
- add_action( 'load-edit.php', array( $this, 'edit_nonvendors' ) );
41
- add_filter( 'views_edit-product', array( $this, 'hide_nonvendor_links' ) );
42
-
43
- // Filter user attachments so they only see their own attachements
44
- add_action( 'ajax_query_attachments_args', array( $this, 'show_user_attachment_ajax' ) );
45
- add_filter( 'parse_query', array( $this, 'show_user_attachment_page' ) );
46
-
47
- add_action( 'admin_menu', array( $this, 'remove_menu_page' ), 99 );
48
- add_action( 'add_meta_boxes', array( $this, 'remove_meta_boxes' ), 99 );
49
- add_filter( 'product_type_selector', array( $this, 'filter_product_types' ), 99 );
50
- add_filter( 'product_type_options', array( $this, 'filter_product_type_options' ), 99 );
51
- add_filter( 'woocommerce_product_data_tabs', array( $this, 'filter_product_data_tabs' ), 99, 2 );
52
-
53
- // Vendor Capabilities
54
- // Duplicate product
55
- add_filter( 'woocommerce_duplicate_product_capability', array( $this, 'add_duplicate_capability' ) );
56
-
57
- // WC > Product featured
58
- add_filter( 'manage_product_posts_columns', array( $this, 'manage_product_columns'), 99);
59
-
60
- //Check allowed product types and hide controls
61
- add_filter( 'product_type_options', array( $this, 'check_allowed_product_type_options' ) );
62
-
63
- }
64
-
65
- }
66
-
67
- public function confirm_access_to_add()
68
- {
69
- if ( empty( $_GET['post_type'] ) || $_GET['post_type'] != 'product' ) {
70
- return;
71
- }
72
-
73
- $can_submit = wc_string_to_bool( get_option( 'wcvendors_capability_products_enabled', 'no' ) );
74
-
75
- if ( ! $can_submit ) {
76
- wp_die( sprintf( __( 'You are not allowed to submit products. <a href="%s">Go Back</a>', 'wc-vendors' ), admin_url( 'edit.php?post_type=product' ) ) );
77
- }
78
- }
79
-
80
- public function csv_import_suite_compatibility( $capability )
81
- {
82
- return 'manage_product';
83
- }
84
-
85
- public function csv_import_suite_compatibility_export( $args )
86
- {
87
- $args[ 'author' ] = get_current_user_id();
88
-
89
- return $args;
90
- }
91
-
92
- /*
93
- * Enable/disable duplicate product
94
- */
95
- public function add_duplicate_capability( $capability ){
96
- if ( wc_string_to_bool( get_option( 'wcvendors_capability_product_duplicate', 'no' ) ) ) {
97
- return 'manage_product';
98
- }
99
- return $capability;
100
- }
101
-
102
-
103
- /**
104
- *
105
- *
106
- * @param unknown $menu
107
- *
108
- * @return unknown
109
- */
110
- public function show_pending_number( $menu )
111
- {
112
-
113
- $args = array(
114
- 'post_type' => 'product',
115
- 'author' => get_current_user_id(),
116
- 'post_status' => 'pending'
117
- );
118
-
119
- if (!WCV_Vendors::is_vendor( get_current_user_id() ) ) unset( $args['author'] );
120
-
121
- $pending_posts = get_posts( $args );
122
-
123
- $pending_count = is_array( $pending_posts ) ? count( $pending_posts ) : 0;
124
-
125
- $menu_str = 'edit.php?post_type=product';
126
-
127
- foreach ( $menu as $menu_key => $menu_data ) {
128
-
129
- if ( $menu_str != $menu_data[ 2 ] ) continue;
130
-
131
- if ($pending_count > 0 ) {
132
- $menu[ $menu_key ][ 0 ] .= " <span class='update-plugins counting-$pending_count'><span class='plugin-count'>" . number_format_i18n( $pending_count ) . '</span></span>';
133
- }
134
- }
135
-
136
- return $menu;
137
- }
138
-
139
- /**
140
- *
141
- *
142
- * @param unknown $types
143
- * @param unknown $product_type
144
- *
145
- * @return unknown
146
- */
147
- function filter_product_types( $types ) {
148
-
149
- $product_types = ( array ) get_option( 'wcvendors_capability_product_types', array() );
150
- $product_misc = array(
151
- 'taxes' => wc_string_to_bool( get_option( 'wcvendors_capability_product_taxes', 'no' ) ) ,
152
- 'sku' => wc_string_to_bool( get_option( 'wcvendors_capability_product_sku', 'no' ) ) ,
153
- 'duplicate' => wc_string_to_bool( get_option( 'wcvendors_capability_product_duplicate', 'no' ) ) ,
154
- 'delete' => wc_string_to_bool( get_option( 'wcvendors_capability_product_delete', 'no' ) ) ,
155
- 'featured' => wc_string_to_bool( get_option( 'wcvendors_capability_product_featured', 'no' ) ) ,
156
- );
157
-
158
- // Add any custom css
159
- $css = get_option( 'wcvendors_display_advanced_stylesheet' );
160
- // Filter taxes
161
- if ( !empty( $product_misc[ 'taxes' ] ) ) {
162
- $css .= '.form-field._tax_status_field, .form-field._tax_class_field{display:none !important;}';
163
- }
164
- unset( $product_misc[ 'taxes' ] );
165
-
166
- // Filter the rest of the fields
167
- foreach ( $product_misc as $key => $value ) {
168
- if ( $value ) $css .= sprintf( '._%s_field{display:none !important;}', $key );
169
- }
170
-
171
- echo '<style>';
172
- echo $css;
173
- echo '</style>';
174
-
175
- // Filter product type drop down
176
- foreach ( $types as $key => $value ) {
177
- if ( in_array( $key, $product_types ) ){
178
- unset( $types[ $key ] );
179
- }
180
- }
181
-
182
- return $types;
183
- }
184
-
185
- /**
186
- * Filter the product meta tabs in wp-admin
187
- * @since 1.9.0
188
- */
189
- function filter_product_data_tabs( $tabs ){
190
-
191
- $product_panel = get_option( 'wcvendors_capability_product_data_tabs', array() );
192
-
193
- if ( !$product_panel ) return $tabs;
194
-
195
- foreach ( $tabs as $key => $value ){
196
- if ( in_array($key, $product_panel ) ){
197
- unset( $tabs[ $key ] );
198
- }
199
- }
200
-
201
- return $tabs;
202
-
203
- } // filter_product_data_tabs()
204
-
205
-
206
- /**
207
- *
208
- *
209
- * @param unknown $types
210
- *
211
- * @return unknown
212
- */
213
- function filter_product_type_options( $types )
214
- {
215
- $product_options = get_option( 'wcvendors_capability_product_type_options', array() );
216
-
217
- if ( !$product_options ) return $types;
218
-
219
- foreach ( $types as $key => $value ) {
220
- if ( !empty( $product_options[ $key ] ) ) {
221
- unset( $types[ $key ] );
222
- }
223
- }
224
-
225
- return $types;
226
- }
227
-
228
-
229
- /**
230
- * Show attachments only belonging to vendor
231
- *
232
- * @param object $query
233
- */
234
- function show_user_attachment_ajax ( $query ) {
235
-
236
- $user_id = get_current_user_id();
237
- if ( $user_id ) {
238
- $query['author'] = $user_id;
239
- }
240
- return $query;
241
- }
242
-
243
- /**
244
- * Show attachments only belonging to vendor
245
- *
246
- * @param object $query
247
- */
248
- function show_user_attachment_page ( $query ) {
249
-
250
- global $current_user, $pagenow;
251
-
252
- if ( !is_a( $current_user, 'WP_User') )
253
- return;
254
-
255
- if ( 'upload.php' != $pagenow && 'media-upload.php' != $pagenow)
256
- return;
257
-
258
- if ( !current_user_can('delete_pages') )
259
- $query->set('author', $current_user->ID );
260
-
261
- return;
262
- }
263
-
264
- /**
265
- * Allow vendors to access admin when disabled
266
- */
267
- public function prevent_admin_access()
268
- {
269
- $permitted_user = ( current_user_can( 'edit_posts' ) || current_user_can( 'manage_woocommerce' ) || current_user_can( 'vendor' ) );
270
-
271
- if ( get_option( 'woocommerce_lock_down_admin' ) == 'yes' && !is_ajax() && !$permitted_user ) {
272
- wp_safe_redirect( get_permalink( woocommerce_get_page_id( 'myaccount' ) ) );
273
- exit;
274
- }
275
- }
276
-
277
- public function deny_admin_access()
278
- {
279
- return false;
280
- }
281
-
282
-
283
- /**
284
- * Request when load-edit.php
285
- */
286
- public function edit_nonvendors()
287
- {
288
- add_action( 'request', array( $this, 'hide_nonvendor_products' ) );
289
- }
290
-
291
-
292
- /**
293
- * Hide links that don't matter anymore from vendors
294
- *
295
- * @param array $views
296
- *
297
- * @return array
298
- */
299
- public function hide_nonvendor_links( $views )
300
- {
301
- return array();
302
- }
303
-
304
-
305
- /**
306
- * Hide products that don't belong to the vendor
307
- *
308
- * @param array $query_vars
309
- *
310
- * @return array
311
- */
312
- public function hide_nonvendor_products( $query_vars )
313
- {
314
- if (array_key_exists('post_type', $query_vars) && ($query_vars['post_type'] == 'product')) {
315
- $query_vars[ 'author' ] = get_current_user_id();
316
- }
317
-
318
- return $query_vars;
319
- }
320
-
321
-
322
- /**
323
- * Remove the media library menu
324
- */
325
- public function remove_menu_page(){
326
- global $pagenow;
327
-
328
- remove_menu_page( 'index.php' ); /* Hides Dashboard menu */
329
- remove_menu_page( 'separator1' ); /* Hides separator under Dashboard menu*/
330
- remove_all_actions( 'admin_notices' );
331
-
332
- $can_submit = 'yes' == get_option( 'wcvendors_capability_products_enabled' ) ? true : false;
333
-
334
- if ( ! $can_submit ) {
335
- global $submenu;
336
- unset($submenu['edit.php?post_type=product'][10]);
337
- }
338
-
339
- if ( $pagenow == 'index.php' ) {
340
- wp_redirect( admin_url( 'profile.php' ) );
341
- }
342
- }
343
-
344
-
345
- /**
346
- *
347
- */
348
- public function remove_meta_boxes()
349
- {
350
- remove_meta_box( 'postcustom', 'product', 'normal' );
351
- remove_meta_box( 'wpseo_meta', 'product', 'normal' );
352
- remove_meta_box( 'expirationdatediv', 'product', 'side' );
353
- }
354
-
355
-
356
- /**
357
- * Update the vendor PayPal email
358
- *
359
- * @param int $vendor_id
360
- *
361
- * @return bool
362
- */
363
- public function save_extra_profile_fields( $vendor_id )
364
- {
365
- if ( !current_user_can( 'edit_user', $vendor_id ) ) return false;
366
-
367
- if ( ! WCV_Vendors::is_pending( $vendor_id ) && ! WCV_Vendors::is_vendor( $vendor_id ) ) { return; }
368
-
369
- $users = get_users( array( 'meta_key' => 'pv_shop_slug', 'meta_value' => sanitize_title( $_POST[ 'pv_shop_name' ] ) ) );
370
- if ( empty( $users ) || $users[ 0 ]->ID == $vendor_id ) {
371
- update_user_meta( $vendor_id, 'pv_shop_name', $_POST[ 'pv_shop_name' ] );
372
- update_user_meta( $vendor_id, 'pv_shop_slug', sanitize_title( $_POST[ 'pv_shop_name' ] ) );
373
- }
374
-
375
- update_user_meta( $vendor_id, 'pv_paypal', $_POST[ 'pv_paypal' ] );
376
- update_user_meta( $vendor_id, 'pv_shop_html_enabled', isset( $_POST[ 'pv_shop_html_enabled' ] ) );
377
- update_user_meta( $vendor_id, 'pv_custom_commission_rate', $_POST[ 'pv_custom_commission_rate' ] );
378
- update_user_meta( $vendor_id, 'pv_shop_description', $_POST[ 'pv_shop_description' ] );
379
- update_user_meta( $vendor_id, 'pv_seller_info', $_POST[ 'pv_seller_info' ] );
380
- update_user_meta( $vendor_id, 'wcv_give_vendor_tax', isset( $_POST[ 'wcv_give_vendor_tax' ] ) );
381
- update_user_meta( $vendor_id, 'wcv_give_vendor_shipping', isset( $_POST[ 'wcv_give_vendor_shipping' ] ) );
382
-
383
- // Bank details
384
- update_user_meta( $vendor_id, 'wcv_bank_account_name', $_POST['wcv_bank_account_name'] );
385
- update_user_meta( $vendor_id, 'wcv_bank_account_number', $_POST['wcv_bank_account_number'] );
386
- update_user_meta( $vendor_id, 'wcv_bank_name', $_POST['wcv_bank_name'] );
387
- update_user_meta( $vendor_id, 'wcv_bank_routing_number', $_POST['wcv_bank_routing_number'] );
388
- update_user_meta( $vendor_id, 'wcv_bank_iban', $_POST['wcv_bank_iban'] );
389
- update_user_meta( $vendor_id, 'wcv_bank_bic_swift', $_POST['wcv_bank_bic_swift'] );
390
-
391
- do_action( 'wcvendors_update_admin_user', $vendor_id );
392
- }
393
-
394
-
395
- /**
396
- * Show the PayPal field and commision due table
397
- *
398
- * @param unknown $user
399
- */
400
- public function show_extra_profile_fields( $user ) {
401
-
402
- if ( ! WCV_Vendors::is_vendor( $user->ID ) && ! WCV_Vendors::is_pending( $user->ID ) ) {
403
- return;
404
- }
405
-
406
- include( apply_filters( 'wcvendors_vendor_meta_partial', WCV_ABSPATH_ADMIN . 'views/html-vendor-meta.php' ) );
407
- }
408
-
409
- /*
410
- Manage product columns on product page
411
- */
412
- public function manage_product_columns( $columns ){
413
-
414
- // Featured Product
415
- if ( 'yes' !== get_option( 'wcvendors_capability_product_featured', 'no' ) ) {
416
- unset($columns['featured']);
417
- }
418
-
419
- // SKU
420
- if ( wc_string_to_bool( get_option( 'wcvendors_capability_product_sku', 'no' ) ) ){
421
- unset($columns['sku']);
422
- }
423
-
424
-
425
- return $columns;
426
- }
427
-
428
- /**
429
- * Hide the virtual or downloadable product types if hidden in settings
430
- *
431
- * @param array $type_options - the product types
432
- * @return void
433
- *
434
- * @since 2.1.1
435
- */
436
- public static function check_allowed_product_type_options( $type_options ){
437
-
438
- $product_types = get_option( 'wcvendors_capability_product_type_options', array() );
439
-
440
- foreach( $product_types as $type ) {
441
- unset( $type_options[ $type ] );
442
- }
443
-
444
- return $type_options;
445
- }
446
-
447
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-product-meta.php DELETED
@@ -1,326 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Product meta configurations
5
- *
6
- * @package WCVendors
7
- */
8
-
9
-
10
- class WCV_Product_Meta
11
- {
12
-
13
-
14
- /**
15
- * Constructor
16
- */
17
- function __construct()
18
- {
19
- if ( !current_user_can( 'manage_woocommerce' ) ) return;
20
-
21
- // Allow products to have authors
22
- add_post_type_support( 'product', 'author' );
23
-
24
- add_action( 'add_meta_boxes', array( $this, 'change_author_meta_box_title' ) );
25
- add_action( 'wp_dropdown_users', array( $this, 'author_vendor_roles' ), 0, 1 );
26
- if ( apply_filters( 'wcv_product_commission_tab', true ) ) {
27
- add_action( 'woocommerce_product_write_panel_tabs', array( $this, 'add_tab' ) );
28
- add_action( 'woocommerce_product_data_panels', array( $this, 'add_panel' ) );
29
- add_action( 'woocommerce_process_product_meta', array( $this, 'save_panel' ) );
30
- }
31
-
32
- add_action( 'woocommerce_product_quick_edit_end', array($this, 'display_vendor_dd_quick_edit') );
33
- add_action( 'woocommerce_product_quick_edit_save', array($this, 'save_vendor_quick_edit'), 2, 99 );
34
- add_action( 'manage_product_posts_custom_column', array($this, 'display_vendor_column'), 2, 99 );
35
- add_filter( 'manage_product_posts_columns', array($this, 'vendor_column_quickedit') );
36
-
37
- add_action( 'woocommerce_process_product_meta', array( $this, 'update_post_media_author' ) );
38
-
39
- }
40
-
41
-
42
- /**
43
- * Change the "Author" metabox to "Vendor"
44
- */
45
- public function change_author_meta_box_title()
46
- {
47
- global $wp_meta_boxes;
48
- $wp_meta_boxes[ 'product' ][ 'normal' ][ 'core' ][ 'authordiv' ][ 'title' ] = wcv_get_vendor_name();
49
- }
50
-
51
-
52
- /**
53
- * Override the authors selectbox with +vendor roles
54
- *
55
- * @param html $output
56
- *
57
- * @return html
58
- */
59
- public function author_vendor_roles( $output )
60
- {
61
- global $post;
62
-
63
- if ( empty( $post ) ) return $output;
64
-
65
- // Return if this isn't a WooCommerce product post type
66
- if ( $post->post_type != 'product' ) return $output;
67
-
68
- // Return if this isn't the vendor author override dropdown
69
- if ( !strpos( $output, 'post_author_override' ) ) return $output;
70
-
71
- $args = array(
72
- 'selected' => $post->post_author,
73
- 'id' => 'post_author_override',
74
- );
75
-
76
- $output = $this->vendor_selectbox( $args );
77
-
78
- return $output;
79
- }
80
-
81
-
82
- /**
83
- * Create a selectbox to display vendor & administrator roles
84
- *
85
- * @param array $args
86
- *
87
- * @return html
88
- */
89
- public function vendor_selectbox( $args )
90
- {
91
- $default_args = array(
92
- 'placeholder',
93
- 'id',
94
- 'class',
95
- );
96
-
97
- foreach ( $default_args as $key ) {
98
- if ( !is_array( $key ) && empty( $args[ $key ] ) ) $args[ $key ] = '';
99
- else if ( is_array( $key ) ) foreach ( $key as $val ) $args[ $key ][ $val ] = esc_attr( $args[ $key ][ $val ] );
100
- }
101
- extract( $args );
102
-
103
- $roles = array( 'vendor', 'administrator' );
104
- $user_args = array( 'fields' => array( 'ID', 'user_login' ) );
105
-
106
- $output = "<select style='width:200px;' name='$id' id='$id' class='$class' data-placeholder='$placeholder'>\n";
107
- $output .= "\t<option value=''></option>\n";
108
-
109
- foreach ( $roles as $role ) {
110
-
111
- $new_args = $user_args;
112
- $new_args[ 'role' ] = $role;
113
- $users = get_users( $new_args );
114
-
115
- if ( empty( $users ) ) continue;
116
- foreach ( (array) $users as $user ) {
117
- $select = selected( $user->ID, $selected, false );
118
- $output .= "\t<option value='$user->ID' $select>$user->user_login</option>\n";
119
- }
120
-
121
- }
122
- $output .= "</select>";
123
-
124
- $output .= '<br class="clear" />';
125
- $output .= '<p><label class="product_media_author_override">';
126
- $output .= '<input name="product_media_author_override" type="checkbox" /> ';
127
- $output .= sprintf( __('Assign media to %s', 'wc-vendors' ), wcv_get_vendor_name() );
128
- $output .= '</label></p>';
129
-
130
- // Convert this selectbox with select2
131
- $output .= '
132
- <script type="text/javascript">jQuery(function() { jQuery("#' . $id . '").select2(); } );</script>';
133
-
134
- return $output;
135
- }
136
-
137
-
138
- /**
139
- * Save commission rate of a product
140
- *
141
- * @param int $post_id
142
- */
143
- public function save_panel( $post_id )
144
- {
145
- if ( isset( $_POST[ 'pv_commission_rate' ] ) ) {
146
- update_post_meta( $post_id, 'pv_commission_rate', is_numeric( $_POST[ 'pv_commission_rate' ] ) ? (float) $_POST[ 'pv_commission_rate' ] : false );
147
- }
148
-
149
- }
150
-
151
- /**
152
- * Update the author of the media attached to this product
153
- *
154
- * @param int $post_id the ID of the product to be updated
155
- * @return void
156
- * @since 2.0.8
157
- */
158
- public function update_post_media_author( $post_id ) {
159
- $product = wc_get_product( $post_id );
160
- if ( isset( $_POST['product_media_author_override'] ) ) {
161
- $this->save_product_media( $product );
162
- }
163
- }
164
-
165
-
166
- /**
167
- * Add the Commission tab to a product
168
- */
169
- public function add_tab()
170
- {
171
- ?>
172
- <li class="commission_tab">
173
- <a href="#commission"><?php _e( 'Commission', 'wc-vendors' ) ?></a>
174
- </li> <?php
175
- }
176
-
177
-
178
- /**
179
- * Add the Commission panel to a product
180
- */
181
- public function add_panel()
182
- {
183
- global $post; ?>
184
-
185
- <div id="commission" class="panel woocommerce_options_panel">
186
- <fieldset>
187
-
188
- <p class='form-field commission_rate_field'>
189
- <label for='pv_commission_rate'><?php _e( 'Commission', 'wc-vendors' ); ?> (%)</label>
190
- <input type='number' id='pv_commission_rate'
191
- name='pv_commission_rate'
192
- class='short'
193
- max="100"
194
- min="0"
195
- step='any'
196
- placeholder='<?php _e( 'Leave blank for default', 'wc-vendors' ); ?>'
197
- value="<?php echo get_post_meta( $post->ID, 'pv_commission_rate', true ); ?>"/>
198
- </p>
199
-
200
- </fieldset>
201
- </div> <?php
202
-
203
- }
204
-
205
- /*
206
- * Rename the Authors column to Vendor on products page
207
- */
208
- public function vendor_column_quickedit($posts_columns) {
209
- $posts_columns['author'] = wcv_get_vendor_name();
210
-
211
- return $posts_columns;
212
- }
213
-
214
- /*
215
- * Display the vendor drop down on the quick edit screen
216
- */
217
- public function display_vendor_dd_quick_edit() {
218
-
219
- global $post;
220
- $selected = $post->post_author;
221
-
222
- $roles = array( 'vendor', 'administrator' );
223
- $user_args = array( 'fields' => array( 'ID', 'display_name' ) );
224
-
225
- $output = "<select style='width:200px;' name='post_author-new' class='select'>\n";
226
-
227
- foreach ( $roles as $role ) {
228
-
229
- $new_args = $user_args;
230
- $new_args[ 'role' ] = $role;
231
- $users = get_users( $new_args );
232
-
233
- if ( empty( $users ) ) continue;
234
- foreach ( (array) $users as $user ) {
235
- $select = selected( $user->ID, $selected, false );
236
- $output .= "\t<option value='$user->ID' $select>$user->display_name</option>\n";
237
- }
238
-
239
- }
240
- $output .= "</select>";
241
-
242
- ?>
243
- <br class="clear" />
244
- <label class="inline-edit-author-new">
245
- <span class="title"><?php printf( __('%s', 'wc-vendors' ), wcv_get_vendor_name() ); ?></span>
246
- <?php echo $output; ?>
247
- </label>
248
- <br class="clear" />
249
- <label class="inline-edit-author-new">
250
- <input name="product_media_author_override" type="checkbox" />
251
- <span class="title">Media</span>
252
- <?php printf( __('Assign media to %s', 'wc-vendors' ), wcv_get_vendor_name() ); ?>
253
-
254
- </label>
255
- <?php
256
- }
257
-
258
-
259
- /*
260
- * Save the vendor on the quick edit screen
261
- */
262
- public function save_vendor_quick_edit( $product ) {
263
- if ( $product->is_type('simple') || $product->is_type('external') ) {
264
- if ( isset( $_REQUEST['_vendor'] ) ) {
265
- $vendor = wc_clean($_REQUEST['_vendor']);
266
- $post = get_post( $product->get_id() );
267
- $post->post_author = $vendor;
268
- }
269
-
270
- if ( isset( $_REQUEST['product_media_author_override'] ) ) {
271
- $this->save_product_media( $product );
272
- }
273
- }
274
- return $product;
275
- }
276
-
277
- /**
278
- * Override the product media author
279
- *
280
- * @param object $product
281
- * @param int $vendor
282
- * @return void
283
- * @since 2.0.8
284
- */
285
- public function save_product_media( $product ){
286
- global $post;
287
- if ( ! is_a( $product, 'WC_Product' ) ) return;
288
- $vendor = $post->post_author;
289
-
290
- $attachment_ids = $product->get_gallery_image_ids( 'edit' );
291
- $attachment_ids[] = $product->get_image_id( 'edit' );
292
-
293
- foreach( $attachment_ids as $id ) {
294
- $edit_attachment = array(
295
- 'ID' => $id,
296
- 'post_author' => $vendor
297
- );
298
-
299
- wp_update_post( $edit_attachment );
300
- }
301
- }
302
-
303
- /*
304
- * Display hidden column data for js
305
- */
306
- public function display_vendor_column( $column, $post_id ){
307
-
308
- $vendor = get_post_field( 'post_author', $post_id );
309
-
310
- switch ( $column ) {
311
- case 'name' :
312
-
313
- ?>
314
- <div class="hidden vendor" id="vendor_<?php echo $post_id; ?>">
315
- <div id="post_author"><?php echo $vendor; ?></div>
316
- </div>
317
- <?php
318
-
319
- break;
320
-
321
- default :
322
- break;
323
- }
324
-
325
- }
326
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-setup-wizard.php DELETED
@@ -1,369 +0,0 @@
1
- <?php
2
- /**
3
- * Admin setup wziard
4
- *
5
- * @author WooCommerce, Jamie Madden, WC Vendors
6
- * @category Admin
7
- * @package WCVendors/Admin
8
- * @version 2.0.0
9
- */
10
-
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- /**
16
- * WCVendors_Admin_Setup_Wizard class.
17
- */
18
- class WCVendors_Admin_Setup_Wizard {
19
-
20
- /**
21
- * Current step
22
- *
23
- * @var string
24
- */
25
- private $step = '';
26
-
27
- /**
28
- * Steps for the setup wizard
29
- *
30
- * @var array
31
- */
32
- private $steps = array();
33
-
34
- /**
35
- * Actions to be executed after the HTTP response has completed
36
- *
37
- * @var array
38
- */
39
- private $deferred_actions = array();
40
-
41
- /**
42
- * Hook in tabs.
43
- */
44
- public function __construct() {
45
-
46
- if ( apply_filters( 'wcv_enable_setup_wizard', true ) && current_user_can( 'manage_woocommerce' ) ) {
47
- add_action( 'admin_menu', array( $this, 'admin_menus' ) );
48
- add_action( 'admin_init', array( $this, 'setup_wizard' ) );
49
- }
50
- }
51
-
52
- /**
53
- * Add admin menus/screens.
54
- */
55
- public function admin_menus() {
56
- add_dashboard_page( '', '', 'manage_options', 'wcv-setup', '' );
57
- }
58
-
59
- /**
60
- * Show the setup wizard.
61
- */
62
- public function setup_wizard() {
63
-
64
- if ( empty( $_GET['page'] ) || 'wcv-setup' !== $_GET['page'] ) {
65
- return;
66
- }
67
- $default_steps = array(
68
- 'store_setup' => array(
69
- 'name' => __( 'Start', 'wc-vendors' ),
70
- 'view' => array( $this, 'wcv_setup_general' ),
71
- 'handler' => array( $this, 'wcv_setup_general_save' ),
72
- ),
73
- 'capabilities' => array(
74
- 'name' => __( 'Capabilities', 'wc-vendors' ),
75
- 'view' => array( $this, 'wcv_setup_capabilities' ),
76
- 'handler' => array( $this, 'wcv_setup_capabilities_save' ),
77
- ),
78
- 'pages' => array(
79
- 'name' => __( 'Pages', 'wc-vendors' ),
80
- 'view' => array( $this, 'wcv_setup_pages' ),
81
- 'handler' => array( $this, 'wcv_setup_pages_save' ),
82
- ),
83
- 'ready' => array(
84
- 'name' => __( 'Ready!', 'wc-vendors' ),
85
- 'view' => array( $this, 'wcv_setup_ready' ),
86
- 'handler' => '',
87
- ),
88
- );
89
-
90
- $this->steps = apply_filters( 'wcv_setup_wizard_steps', $default_steps );
91
- $this->step = isset( $_GET['step'] ) ? sanitize_key( $_GET['step'] ) : current( array_keys( $this->steps ) );
92
- $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
93
-
94
- wp_register_script( 'jquery-blockui', WC()->plugin_url() . '/assets/js/jquery-blockui/jquery.blockUI' . $suffix . '.js', array( 'jquery' ), '2.70', true );
95
- wp_register_script( 'selectWoo', WC()->plugin_url() . '/assets/js/selectWoo/selectWoo.full' . $suffix . '.js', array( 'jquery' ), '1.0.0' );
96
- wp_register_script( 'wc-enhanced-select', WC()->plugin_url() . '/assets/js/admin/wc-enhanced-select' . $suffix . '.js', array( 'jquery', 'selectWoo' ), WC_VERSION );
97
- wp_localize_script( 'wc-enhanced-select', 'wc_enhanced_select_params', array(
98
- 'i18n_no_matches' => _x( 'No matches found', 'enhanced select', 'wcvendors' ),
99
- 'i18n_ajax_error' => _x( 'Loading failed', 'enhanced select', 'wcvendors' ),
100
- 'i18n_input_too_short_1' => _x( 'Please enter 1 or more characters', 'enhanced select', 'wcvendors' ),
101
- 'i18n_input_too_short_n' => _x( 'Please enter %qty% or more characters', 'enhanced select', 'wcvendors' ),
102
- 'i18n_input_too_long_1' => _x( 'Please delete 1 character', 'enhanced select', 'wcvendors' ),
103
- 'i18n_input_too_long_n' => _x( 'Please delete %qty% characters', 'enhanced select', 'wcvendors' ),
104
- 'i18n_selection_too_long_1' => _x( 'You can only select 1 item', 'enhanced select', 'wcvendors' ),
105
- 'i18n_selection_too_long_n' => _x( 'You can only select %qty% items', 'enhanced select', 'wcvendors' ),
106
- 'i18n_load_more' => _x( 'Loading more results&hellip;', 'enhanced select', 'wcvendors' ),
107
- 'i18n_searching' => _x( 'Searching&hellip;', 'enhanced select', 'wcvendors' ),
108
- 'ajax_url' => admin_url( 'admin-ajax.php' ),
109
- 'search_products_nonce' => wp_create_nonce( 'search-products' ),
110
- 'search_customers_nonce' => wp_create_nonce( 'search-customers' ),
111
- ) );
112
- // @todo fix the select2 styles in our admin.css
113
- wp_enqueue_style( 'woocommerce_admin_styles', WC()->plugin_url() . '/assets/css/admin.css', array(), WC_VERSION );
114
-
115
- wp_enqueue_style( 'wcv-setup', wcv_assets_url . 'css/wcv-setup.css', array( 'dashicons', 'install' ), WCV_VERSION );
116
- wp_register_script( 'wcv-setup', wcv_assets_url . 'js/admin/wcv-setup.js', array( 'jquery', 'wc-enhanced-select', 'jquery-blockui', 'wp-util' ), WCV_VERSION );
117
-
118
- if ( ! empty( $_POST['save_step'] ) && isset( $this->steps[ $this->step ]['handler'] ) ) {
119
- call_user_func( $this->steps[ $this->step ]['handler'], $this );
120
- }
121
-
122
- ob_start();
123
- $this->setup_wizard_header();
124
- $this->setup_wizard_steps();
125
- $this->setup_wizard_content();
126
- $this->setup_wizard_footer();
127
- exit;
128
- }
129
-
130
- /**
131
- * Get the URL for the next step's screen.
132
- *
133
- * @param string $step slug (default: current step).
134
- * @return string URL for next step if a next step exists.
135
- * Admin URL if it's the last step.
136
- * Empty string on failure.
137
- * @since 2.0.0
138
- */
139
- public function get_next_step_link( $step = '' ) {
140
- if ( ! $step ) {
141
- $step = $this->step;
142
- }
143
-
144
- $keys = array_keys( $this->steps );
145
- if ( end( $keys ) === $step ) {
146
- return admin_url();
147
- }
148
-
149
- $step_index = array_search( $step, $keys );
150
- if ( false === $step_index ) {
151
- return '';
152
- }
153
-
154
- return add_query_arg( 'step', $keys[ $step_index + 1 ], remove_query_arg( 'activate_error' ) );
155
- }
156
-
157
- /**
158
- * Setup Wizard Header.
159
- */
160
- public function setup_wizard_header() {
161
-
162
- include( WCV_ABSPATH_ADMIN . 'views/setup/header.php' );
163
- }
164
-
165
- /**
166
- * Setup Wizard Footer.
167
- */
168
- public function setup_wizard_footer() {
169
- include( WCV_ABSPATH_ADMIN . 'views/setup/footer.php' );
170
- }
171
-
172
- /**
173
- * Output the steps.
174
- */
175
- public function setup_wizard_steps() {
176
- $output_steps = $this->steps;
177
- include( WCV_ABSPATH_ADMIN . 'views/setup/steps.php' );
178
- }
179
-
180
- /**
181
- * Output the content for the current step.
182
- */
183
- public function setup_wizard_content() {
184
- echo '<div class="wcv-setup-content">';
185
- if ( ! empty( $this->steps[ $this->step ]['view'] ) ) {
186
- call_user_func( $this->steps[ $this->step ]['view'], $this );
187
- }
188
- echo '</div>';
189
- }
190
-
191
- /**
192
- * Helper method to retrieve the current user's email address.
193
- *
194
- * @return string Email address
195
- */
196
- protected function get_current_user_email() {
197
- $current_user = wp_get_current_user();
198
- $user_email = $current_user->user_email;
199
-
200
- return $user_email;
201
- }
202
-
203
- /**
204
- * Initial "marketplace setup" step.
205
- * Vendor registration, taxes and shipping
206
- */
207
- public function wcv_setup_general() {
208
-
209
- $allow_registration = get_option( 'wcvendors_vendor_allow_registration', 'yes' );
210
- $manual_approval = get_option( 'wcvendors_vendor_approve_registration', 'no' );
211
- $vendor_taxes = get_option( 'wcvendors_vendor_give_taxes', 'no' );
212
- $vendor_shipping = get_option( 'wcvendors_vendor_give_shipping', 'no' );
213
- $commission_rate = get_option( 'wcvendors_vendor_commission_rate', '' );
214
-
215
- include( WCV_ABSPATH_ADMIN . 'views/setup/general.php' );
216
- }
217
-
218
- /**
219
- * Save initial marketplace settings.
220
- */
221
- public function wcv_setup_general_save() {
222
-
223
- check_admin_referer( 'wcv-setup' );
224
-
225
- $allow_registration = isset( $_POST[ 'wcv_vendor_allow_registration' ] ) ? sanitize_text_field( $_POST[ 'wcv_vendor_allow_registration' ] ) : '';
226
- $manual_approval = isset( $_POST[ 'wcv_vendor_approve_registration'] ) ? sanitize_text_field( $_POST[ 'wcv_vendor_approve_registration' ] ) : '';
227
- $vendor_taxes = isset( $_POST[ 'wcv_vendor_give_taxes' ] ) ? sanitize_text_field( $_POST[ 'wcv_vendor_give_taxes' ] ) : '';
228
- $vendor_shipping = isset( $_POST[ 'wcv_vendor_give_shipping' ] ) ? sanitize_text_field( $_POST[ 'wcv_vendor_give_shipping' ] ) : '';
229
- $commission_rate = sanitize_text_field( $_POST[ 'wcv_vendor_commission_rate' ] );
230
-
231
- update_option( 'wcvendors_vendor_allow_registration', $allow_registration );
232
- update_option( 'wcvendors_vendor_approve_registration', $manual_approval );
233
- update_option( 'wcvendors_vendor_give_taxes', $vendor_taxes );
234
- update_option( 'wcvendors_vendor_give_shipping', $vendor_shipping );
235
- update_option( 'wcvendors_vendor_commission_rate', $commission_rate );
236
-
237
- WCVendors_Install::create_pages();
238
- wp_redirect( esc_url_raw( $this->get_next_step_link() ) );
239
- exit;
240
- }
241
-
242
- /**
243
- * General setup
244
- * Vendor registration, taxes and shipping
245
- */
246
- public function wcv_setup_capabilities() {
247
-
248
- $products_enabled = get_option( 'wcvendors_capability_products_enabled', 'yes' );
249
- $live_products = get_option( 'wcvendors_capability_products_edit', 'yes' );
250
- $products_approval = get_option( 'wcvendors_capability_products_live', 'yes' );
251
- $orders_enabled = get_option( 'wcvendors_capability_orders_enabled', 'yes' );
252
- $export_orders = get_option( 'wcvendors_capability_orders_export', 'yes' );
253
- $view_order_notes = get_option( 'wcvendors_capability_order_read_notes', 'yes' );
254
- $add_order_notes = get_option( 'wcvendors_capability_order_update_notes', 'yes' );
255
-
256
- include( WCV_ABSPATH_ADMIN . 'views/setup/capabilities.php' );
257
- }
258
-
259
- /**
260
- * Save capabilities settings.
261
- */
262
- public function wcv_setup_capabilities_save() {
263
-
264
- check_admin_referer( 'wcv-setup' );
265
-
266
- $products_enabled = isset( $_POST[ 'wcv_capability_products_enabled' ] ) ? sanitize_text_field( $_POST[ 'wcv_capability_products_enabled' ] ) : '';
267
- $live_products = isset( $_POST[ 'wcv_capability_products_edit' ] ) ? sanitize_text_field( $_POST[ 'wcv_capability_products_edit' ] ) : '';
268
- $products_approval = isset( $_POST[ 'wcv_capability_products_live' ] ) ? sanitize_text_field( $_POST[ 'wcv_capability_products_live' ] ) : '';
269
- $orders_enabled = isset( $_POST[ 'wcv_capability_orders_enabled' ] ) ? sanitize_text_field( $_POST[ 'wcv_capability_orders_enabled' ] ) : '';
270
- $export_orders = isset( $_POST[ 'wcv_capability_orders_export' ] ) ? sanitize_text_field( $_POST[ 'wcv_capability_orders_export' ] ) : '';
271
- $view_order_notes = isset( $_POST[ 'wcv_capability_order_read_notes' ] ) ? sanitize_text_field( $_POST[ 'wcv_capability_order_read_notes' ] ) : '';
272
- $add_order_notes = isset( $_POST[ 'wcv_capability_order_update_notes' ] ) ? sanitize_text_field( $_POST[ 'wcv_capability_order_update_notes' ] ) : '';
273
-
274
- update_option( 'wcvendors_capability_products_enabled', $products_enabled );
275
- update_option( 'wcvendors_capability_products_edit', $live_products );
276
- update_option( 'wcvendors_capability_products_live', $products_approval );
277
- update_option( 'wcvendors_capability_orders_enabled', $orders_enabled );
278
- update_option( 'wcvendors_capability_orders_export', $export_orders );
279
- update_option( 'wcvendors_capability_order_read_notes', $view_order_notes );
280
- update_option( 'wcvendors_capability_order_update_notes', $add_order_notes );
281
-
282
- // Update actual role
283
- $args = array(
284
- 'assign_product_terms' => $products_enabled,
285
- 'edit_products' => $products_enabled || $live_products,
286
- 'edit_product' => $products_enabled || $live_products,
287
- 'edit_published_products' => $live_products,
288
- 'delete_published_products' => $live_products,
289
- 'delete_products' => $live_products,
290
- 'manage_product' => $products_enabled,
291
- 'publish_products' => $products_approval,
292
- 'delete_posts' => true,
293
- 'read' => true,
294
- 'read_products' => $live_products || $products_enabled,
295
- 'upload_files' => true,
296
- 'import' => true,
297
- 'view_woocommerce_reports' => false,
298
- );
299
-
300
- remove_role( 'vendor' );
301
- add_role( 'vendor', sprintf( __('%s', 'wc-vendors'), wcv_get_vendor_name() ), $args );
302
-
303
- wp_redirect( esc_url_raw( $this->get_next_step_link() ) );
304
- exit;
305
- }
306
-
307
- /**
308
- * Initial "marketplace setup" step.
309
- * Vendor registration, taxes and shipping
310
- */
311
- public function wcv_setup_pages() {
312
-
313
- $vendor_dashboard_page_id = get_option( 'wcvendors_vendor_dashboard_page_id' );
314
- $shop_settings_page_id = get_option( 'wcvendors_shop_settings_page_id' );
315
- $product_orders_page_id = get_option( 'wcvendors_product_orders_page_id' );
316
- $vendors_page_id = get_option( 'wcvendors_vendors_page_id' );
317
- $terms_page_id = get_option( 'wcvendors_vendor_terms_page_id' );
318
-
319
- include( WCV_ABSPATH_ADMIN . 'views/setup/pages.php' );
320
- }
321
-
322
- /**
323
- * Initial "marketplace setup" step.
324
- * Vendor registration, taxes and shipping
325
- */
326
- public function wcv_setup_pages_save() {
327
-
328
-
329
- $vendor_dashboard_page_id = sanitize_text_field( $_POST[ 'wcvendors_vendor_dashboard_page_id' ] );
330
- $shop_settings_page_id = sanitize_text_field( $_POST[ 'wcvendors_shop_settings_page_id' ] );
331
- $product_orders_page_id = sanitize_text_field( $_POST[ 'wcvendors_product_orders_page_id' ] );
332
- $vendors_page_id = sanitize_text_field( $_POST[ 'wcvendors_vendors_page_id' ] );
333
- $terms_page_id = sanitize_text_field( $_POST[ 'wcvendors_vendor_terms_page_id' ] );
334
-
335
- update_option( 'wcvendors_vendor_dashboard_page_id', $vendor_dashboard_page_id );
336
- update_option( 'wcvendors_shop_settings_page_id', $shop_settings_page_id );
337
- update_option( 'wcvendors_product_orders_page_id', $product_orders_page_id );
338
- update_option( 'wcvendors_vendors_page_id', $vendors_page_id );
339
- update_option( 'wcvendors_vendor_terms_page_id', $terms_page_id );
340
-
341
- wp_redirect( esc_url_raw( $this->get_next_step_link() ) );
342
- exit;
343
-
344
- }
345
-
346
- /**
347
- * Final step.
348
- */
349
- public function wcv_setup_ready() {
350
-
351
- WCVendors_Admin_Notices::remove_notice( 'install' );
352
- WCVendors_Install::update_db_version();
353
- flush_rewrite_rules();
354
-
355
- $user_email = $this->get_current_user_email();
356
- $forums = 'https://wordpress.org/support/plugin/wc-vendors';
357
- $docs_url = 'https://docs.wcvendors.com/?utm_source=setup_wizard&utm_medium=plugin&utm_campaign=setup_complete';
358
- $help_text = sprintf(
359
- /* translators: %1$s: link to videos, %2$s: link to docs */
360
- __( 'Don\'t forget to check our <a href="%1$s" target="_blank">documentation</a> to learn more about setting up WC Vendors and if you need help, be sure to visit our <a href="%2$s" target="_blank">free support forums</a>.', 'wc-vendors' ),
361
- $docs_url,
362
- $forums
363
- );
364
-
365
- include( WCV_ABSPATH_ADMIN . 'views/setup/ready.php' );
366
- }
367
- }
368
-
369
- new WCVendors_Admin_Setup_Wizard();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-vendor-admin-dashboard.php DELETED
@@ -1,755 +0,0 @@
1
- <?php
2
- /**
3
- * WC Vendor Admin Dashboard - Vendor WP-Admin Dashboard Pages
4
- *
5
- * @author Jamie Madden <http://wcvendors.com / https://github.com/digitalchild>
6
- * @package WCVendors
7
- */
8
-
9
- Class WCV_Vendor_Admin_Dashboard {
10
-
11
- public $dashboard_error_msg;
12
-
13
- function __construct(){
14
- // Add Shop Settings page
15
- add_action( 'admin_menu', array( $this, 'vendor_dashboard_pages') );
16
- // Hook into init for form processing
17
- add_action( 'admin_init', array( $this, 'save_shop_settings' ) );
18
- add_action( 'admin_head', array( $this, 'admin_enqueue_order_style') );
19
- }
20
-
21
- function vendor_dashboard_pages(){
22
- add_menu_page( __('Shop Settings', 'wc-vendors'), __('Shop Settings', 'wc-vendors'), 'manage_product', 'wcv-vendor-shopsettings', array( $this, 'settings_page' ) );
23
- $hook = add_menu_page( __( 'Orders', 'wc-vendors' ), __( 'Orders', 'wc-vendors' ), 'manage_product', 'wcv-vendor-orders', array( 'WCV_Vendor_Admin_Dashboard', 'orders_page' ) );
24
- add_action( "load-$hook", array( 'WCV_Vendor_Admin_Dashboard', 'add_options' ) );
25
- }
26
-
27
- function settings_page() {
28
- $user_id = get_current_user_id();
29
- $paypal_address = true;
30
- $shop_description = true;
31
- $description = get_user_meta( $user_id, 'pv_shop_description', true );
32
- $seller_info = get_user_meta( $user_id, 'pv_seller_info', true );
33
- $has_html = get_user_meta( $user_id, 'pv_shop_html_enabled', true );
34
- $shop_page = WCV_Vendors::get_vendor_shop_page( wp_get_current_user()->user_login );
35
- $global_html = wc_string_to_bool( get_option( 'wcvendors_display_shop_description_html', 'no' ) );
36
- include('views/html-vendor-settings-page.php');
37
- }
38
-
39
- function admin_enqueue_order_style() {
40
-
41
- $screen = get_current_screen();
42
-
43
- if ( ! $screen ) return;
44
-
45
- $screen_id = $screen->id;
46
-
47
- if ( 'wcv-vendor-orders' === $screen_id ){
48
-
49
- add_thickbox();
50
- wp_enqueue_style( 'admin_order_styles', wcv_assets_url . 'css/admin-orders.css' );
51
- }
52
- }
53
-
54
- /**
55
- * Save shop settings
56
- */
57
- public function save_shop_settings()
58
- {
59
- $user_id = get_current_user_id();
60
- $error = false;
61
- $error_msg = '';
62
-
63
- if (isset ( $_POST[ 'wc-vendors-nonce' ] ) ) {
64
-
65
- if ( !wp_verify_nonce( $_POST[ 'wc-vendors-nonce' ], 'save-shop-settings-admin' ) ) {
66
- return false;
67
- }
68
-
69
- if ( isset( $_POST[ 'pv_paypal' ] ) && '' !== $_POST[ 'pv_paypal' ] ) {
70
- if ( !is_email( $_POST[ 'pv_paypal' ] ) ) {
71
- $error_msg .= __( 'Your PayPal address is not a valid email address.', 'wc-vendors' );
72
- $error = true;
73
- } else {
74
- update_user_meta( $user_id, 'pv_paypal', $_POST[ 'pv_paypal' ] );
75
- }
76
- } else {
77
- update_user_meta( $user_id, 'pv_paypal', $_POST[ 'pv_paypal' ] );
78
- }
79
-
80
- if ( !empty( $_POST[ 'pv_shop_name' ] ) ) {
81
- $users = get_users( array( 'meta_key' => 'pv_shop_slug', 'meta_value' => sanitize_title( $_POST[ 'pv_shop_name' ] ) ) );
82
- if ( !empty( $users ) && $users[ 0 ]->ID != $user_id ) {
83
- $error_msg .= __( 'That shop name is already taken. Your shop name must be unique.', 'wc-vendors' );
84
- $error = true;
85
- } else {
86
- update_user_meta( $user_id, 'pv_shop_name', $_POST[ 'pv_shop_name' ] );
87
- update_user_meta( $user_id, 'pv_shop_slug', sanitize_title( $_POST[ 'pv_shop_name' ] ) );
88
- }
89
- }
90
-
91
- if ( isset( $_POST[ 'pv_shop_description' ] ) ) {
92
- update_user_meta( $user_id, 'pv_shop_description', $_POST[ 'pv_shop_description' ] );
93
- }
94
-
95
- if ( isset( $_POST[ 'pv_seller_info' ] ) ) {
96
- update_user_meta( $user_id, 'pv_seller_info', $_POST[ 'pv_seller_info' ] );
97
- }
98
-
99
- // Bank details
100
- if ( isset( $_POST[ 'wcv_bank_account_name' ] ) ){
101
- update_user_meta( $user_id, 'wcv_bank_account_name', $_POST['wcv_bank_account_name'] );
102
- }
103
- if ( isset( $_POST[ 'wcv_bank_account_number' ] ) ){
104
- update_user_meta( $user_id, 'wcv_bank_account_name', $_POST['wcv_bank_account_name'] );
105
- }
106
- if ( isset( $_POST[ 'wcv_bank_name' ] ) ){
107
- update_user_meta( $user_id, 'wcv_bank_name', $_POST['wcv_bank_name'] );
108
- }
109
- if ( isset( $_POST[ 'wcv_bank_routing_number' ] ) ){
110
- update_user_meta( $user_id, 'wcv_bank_routing_number', $_POST['wcv_bank_routing_number'] );
111
- }
112
- if ( isset( $_POST[ 'wcv_bank_iban' ] ) ){
113
- update_user_meta( $user_id, 'wcv_bank_iban', $_POST['wcv_bank_iban'] );
114
- }
115
- if ( isset( $_POST[ 'wcv_bank_bic_swift' ] ) ){
116
- update_user_meta( $user_id, 'wcv_bank_bic_swift', $_POST['wcv_bank_bic_swift'] );
117
- }
118
-
119
-
120
-
121
- do_action( 'wcvendors_shop_settings_admin_saved', $user_id );
122
-
123
- if ( ! $error ) {
124
- add_action( 'admin_notices', array( $this, 'add_admin_notice_success' ) );
125
- } else {
126
- $this->dashboard_error_msg = $error_msg;
127
- add_action( 'admin_notices', array( $this, 'add_admin_notice_error' ) );
128
- }
129
- }
130
- }
131
-
132
- /**
133
- * Output a sucessful message after saving the shop settings
134
- *
135
- * @since 1.9.9
136
- * @access public
137
- */
138
- public function add_admin_notice_success( ){
139
-
140
- echo '<div class="updated"><p>';
141
- echo __( 'Settings saved.', 'wc-vendors' );
142
- echo '</p></div>';
143
-
144
- } // add_admin_notice_success()
145
-
146
- /**
147
- * Output an error message
148
- *
149
- * @since 1.9.9
150
- * @access public
151
- */
152
- public function add_admin_notice_error( ){
153
-
154
- echo '<div class="error"><p>';
155
- echo $this->dashboard_error_msg;
156
- echo '</p></div>';
157
-
158
- } // add_admin_notice_error()
159
-
160
- /**
161
- *
162
- *
163
- * @param unknown $status
164
- * @param unknown $option
165
- * @param unknown $value
166
- *
167
- * @return unknown
168
- */
169
- public static function set_table_option( $status, $option, $value )
170
- {
171
- if ( $option == 'orders_per_page' ) {
172
- return $value;
173
- }
174
- }
175
-
176
-
177
- /**
178
- *
179
- */
180
- public static function add_options()
181
- {
182
- global $WCV_Vendor_Order_Page;
183
-
184
- $args = array(
185
- 'label' => 'Rows',
186
- 'default' => 10,
187
- 'option' => 'orders_per_page'
188
- );
189
- add_screen_option( 'per_page', $args );
190
-
191
- $WCV_Vendor_Order_Page = new WCV_Vendor_Order_Page();
192
-
193
- }
194
-
195
-
196
- /**
197
- * HTML setup for the Orders Page
198
- */
199
- public static function orders_page()
200
- {
201
- global $woocommerce, $WCV_Vendor_Order_Page;
202
-
203
- $WCV_Vendor_Order_Page->prepare_items();
204
-
205
- ?>
206
- <div class="wrap">
207
-
208
- <div id="icon-woocommerce" class="icon32 icon32-woocommerce-reports"><br/></div>
209
- <h2><?php _e( 'Orders', 'wc-vendors' ); ?></h2>
210
-
211
- <form id="posts-filter" method="get">
212
-
213
- <input type="hidden" name="page" value="wcv-vendor-orders"/>
214
- <?php $WCV_Vendor_Order_Page->display() ?>
215
-
216
- </form>
217
- <div id="ajax-response"></div>
218
- <br class="clear"/>
219
- </div>
220
-
221
- <?php }
222
-
223
- } // End WCV_Vendor_Admin_Dashboard
224
-
225
- if ( !class_exists( 'WP_List_Table' ) ) require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
226
-
227
- /**
228
- * WCV Vendor Order Page
229
- *
230
- * @author Jamie Madden <http://wcvendors.com / https://github.com/digitalchild>
231
- * @package WCVendors
232
- * @extends WP_List_Table
233
- */
234
- class WCV_Vendor_Order_Page extends WP_List_Table
235
- {
236
-
237
- public $index;
238
-
239
- /**
240
- * can_view_comments
241
- *
242
- * @since 1.0.0
243
- * @access public
244
- * @var string $can_view_comments permission check for view comments
245
- */
246
- public $can_view_comments;
247
-
248
-
249
- /**
250
- * can_add_comments
251
- *
252
- * @since 1.0.0
253
- * @access public
254
- * @var string $can_add_comments permission check for add comments
255
- */
256
- public $can_add_comments;
257
-
258
-
259
- /**
260
- * __construct function.
261
- *
262
- * @access public
263
- */
264
- function __construct()
265
- {
266
- global $status, $page;
267
-
268
- $this->index = 0;
269
-
270
- //Set parent defaults
271
- parent::__construct( array(
272
- 'singular' => __( 'order', 'wc-vendors' ),
273
- 'plural' => __( 'orders', 'wc-vendors' ),
274
- 'ajax' => false
275
- ) );
276
-
277
- $this->can_view_comments = wc_string_to_bool( get_option( 'wcvendors_capability_order_read_notes', 'no' ) );
278
- $this->can_add_comments = wc_string_to_bool( get_option( 'wcvendors_capability_order_update_notes', 'no' ) );
279
- }
280
-
281
-
282
- /**
283
- * column_default function.
284
- *
285
- * @access public
286
- *
287
- * @param unknown $item
288
- * @param mixed $column_name
289
- *
290
- * @return unknown
291
- */
292
- function column_default( $item, $column_name )
293
- {
294
- global $wpdb;
295
-
296
- switch ( $column_name ) {
297
- case 'order_id' :
298
- return $item->order_id;
299
- case 'customer' :
300
- return $item->customer;
301
- case 'products' :
302
- return $item->products;
303
- case 'total' :
304
- return $item->total;
305
- // case 'comments' :
306
- // return $item->comments;
307
- case 'date' :
308
- return $item->date;
309
- case 'status' :
310
- return $item->status;
311
- default:
312
- return apply_filters( 'wcvendors_vendor_order_page_column_default', '', $item, $column_name );
313
- }
314
- }
315
-
316
-
317
- /**
318
- * column_cb function.
319
- *
320
- * @access public
321
- *
322
- * @param mixed $item
323
- *
324
- * @return unknown
325
- */
326
- function column_cb( $item )
327
- {
328
- return sprintf(
329
- '<input type="checkbox" name="%1$s[]" value="%2$s" />',
330
- /*$1%s*/
331
- 'order_id',
332
- /*$2%s*/
333
- $item->order_id
334
- );
335
- }
336
-
337
-
338
- /**
339
- * get_columns function.
340
- *
341
- * @access public
342
- * @return unknown
343
- */
344
- function get_columns()
345
- {
346
- $columns = array(
347
- 'cb' => '<input type="checkbox" />',
348
- 'order_id' => __( 'Order ID', 'wc-vendors' ),
349
- 'customer' => __( 'Customer', 'wc-vendors' ),
350
- 'products' => __( 'Products', 'wc-vendors' ),
351
- 'total' => __( 'Total', 'wc-vendors' ),
352
- // 'comments' => __( 'Comments to Customer', 'wc-vendors' ),
353
- 'date' => __( 'Date', 'wc-vendors' ),
354
- 'status' => __( 'Shipped', 'wc-vendors' ),
355
- );
356
-
357
- if ( !$this->can_view_comments ) unset( $columns['comments'] );
358
-
359
- return apply_filters( 'wcvendors_vendor_order_page_get_columns', $columns );
360
-
361
- }
362
-
363
-
364
- /**
365
- * get_sortable_columns function.
366
- *
367
- * @access public
368
- * @return unknown
369
- */
370
- function get_sortable_columns()
371
- {
372
- $sortable_columns = array(
373
- 'order_id' => array( 'order_id', false ),
374
- 'total' => array( 'total', false ),
375
- 'status' => array( 'status', false ),
376
- );
377
-
378
- return $sortable_columns;
379
- }
380
-
381
-
382
- /**
383
- * Get bulk actions
384
- *
385
- * @return unknown
386
- */
387
- function get_bulk_actions()
388
- {
389
- $actions = array(
390
- 'mark_shipped' => apply_filters( 'wcvendors_mark_shipped_label', __( 'Mark shipped', 'wc-vendors' ) ),
391
- );
392
-
393
- return $actions;
394
- }
395
-
396
-
397
- /**
398
- * Process bulk actions
399
- *
400
- * @return unknown
401
- */
402
- function process_bulk_action()
403
- {
404
- if ( !isset( $_GET[ 'order_id' ] ) ) return;
405
-
406
- if (is_array( $_GET[ 'order_id' ] ) ) {
407
-
408
- $items = array_map( 'intval', $_GET[ 'order_id' ] );
409
-
410
- switch ( $this->current_action() ) {
411
- case 'mark_shipped':
412
-
413
- $result = $this->mark_shipped( $items );
414
-
415
- if ( $result )
416
- echo '<div class="updated"><p>' . __( 'Orders marked shipped.', 'wc-vendors' ) . '</p></div>';
417
- break;
418
-
419
- default:
420
- // code...
421
- break;
422
- }
423
-
424
- } else {
425
-
426
- if ( !isset( $_GET[ 'action' ] ) ) return;
427
- }
428
-
429
-
430
- }
431
-
432
-
433
- /**
434
- * Mark orders as shipped
435
- *
436
- * @param unknown $ids (optional)
437
- *
438
- * @version 2.0.0
439
- * @return unknown
440
- */
441
- public function mark_shipped( $ids = array() ){
442
-
443
- $user_id = get_current_user_id();
444
-
445
- if ( !empty( $ids ) ) {
446
-
447
- foreach ($ids as $order_id ) {
448
- $order = wc_get_order( $order_id );
449
- $vendors = WCV_Vendors::get_vendors_from_order( $order );
450
- $vendor_ids = array_keys( $vendors );
451
-
452
- if ( !in_array( $user_id, $vendor_ids ) ) {
453
- return;
454
- }
455
-
456
- $shippers = (array) get_post_meta( $order_id, 'wc_pv_shipped', true );
457
-
458
- if( !in_array($user_id, $shippers ) ) {
459
-
460
- $shippers[] = $user_id;
461
-
462
- if ( !empty( $mails ) ) {
463
- WC()->mailer()->emails[ 'WC_Email_Notify_Shipped' ]->trigger( $order_id, $user_id );
464
- }
465
- do_action( 'wcvendors_vendor_ship', $order_id, $user_id, $order );
466
- }
467
-
468
- update_post_meta( $order_id, 'wc_pv_shipped', $shippers );
469
- }
470
- return true;
471
- }
472
- return false;
473
- }
474
-
475
-
476
-
477
- /**
478
- * Get Orders to display in admin
479
- *
480
- * @return $orders
481
- */
482
- function get_orders() {
483
-
484
- $user_id = get_current_user_id();
485
- $orders = array();
486
- $products = array();
487
- $vendor_products = $this->get_vendor_products( $user_id );
488
-
489
- foreach ( $vendor_products as $_product ) {
490
- $products[] = $_product->ID;
491
- }
492
-
493
- $_orders = $this->get_orders_for_vendor_products( $products );
494
-
495
- $model_id = 0;
496
-
497
- if ( !empty( $_orders ) ) {
498
-
499
- foreach ( $_orders as $_order ) {
500
-
501
- // Check to see that the order hasn't been deleted or in the trash
502
- if ( ! get_post_status( $_order->order_id ) || 'trash' === get_post_status( $_order->order_id ) ) continue;
503
-
504
- $order = wc_get_order( $_order->order_id );
505
- $valid_items = WCV_Queries::get_products_for_order( $_order->order_id );
506
- $valid = array();
507
- $items = $order->get_items();
508
-
509
- foreach ( $items as $order_item_id => $item) {
510
- if ( in_array( $item[ 'variation_id' ], $valid_items) || in_array( $item[ 'product_id' ], $valid_items ) ) {
511
- $valid[ $order_item_id ] = $item;
512
- }
513
- }
514
-
515
- $products = '';
516
-
517
- foreach ( $valid as $order_item_id => $item ) {
518
-
519
- $wc_product = new WC_Product( $item['product_id'] );
520
- $products .= '<strong>'. $item['qty'] . ' x ' . $item['name'] . '</strong><br />';
521
- $_item = $order->get_item( $order_item_id );
522
- $meta_data = $_item->get_meta_data();
523
-
524
- if ( !empty( $metadata ) ) {
525
-
526
- $products .= '<table cellspacing="0" class="wcv_display_meta">';
527
-
528
- foreach ( $metadata as $meta ) {
529
-
530
- // Skip hidden core fields
531
- if ( in_array( $meta['meta_key'], apply_filters( 'woocommerce_hidden_order_itemmeta', array(
532
- '_qty',
533
- '_tax_class',
534
- '_product_id',
535
- '_variation_id',
536
- '_line_subtotal',
537
- '_line_subtotal_tax',
538
- '_line_total',
539
- '_line_tax',
540
- '_vendor_order_item_id',
541
- '_vendor_commission',
542
- get_option( 'wcvendors_label_sold_by' ),
543
- ) ) ) ) {
544
- continue;
545
- }
546
-
547
- // Skip serialised meta
548
- if ( is_serialized( $meta['meta_value'] ) ) {
549
- continue;
550
- }
551
-
552
- // Get attribute data
553
- if ( taxonomy_exists( wc_sanitize_taxonomy_name( $meta['meta_key'] ) ) ) {
554
- $term = get_term_by( 'slug', $meta['meta_value'], wc_sanitize_taxonomy_name( $meta['meta_key'] ) );
555
- $meta['meta_key'] = wc_attribute_label( wc_sanitize_taxonomy_name( $meta['meta_key'] ) );
556
- $meta['meta_value'] = isset( $term->name ) ? $term->name : $meta['meta_value'];
557
- } else {
558
- $meta['meta_key'] = apply_filters( 'woocommerce_attribute_label', wc_attribute_label( $meta['meta_key'], $wc_product ), $meta['meta_key'] );
559
- }
560
-
561
- $products .= '<tr><th>' . wp_kses_post( rawurldecode( $meta['meta_key'] ) ) . ':</th><td>' . rawurldecode( $meta['meta_value'] ) . '</td></tr>';
562
- }
563
- $products .= '</table>';
564
- }
565
-
566
- }
567
-
568
- $order_id = $order->get_id();
569
- $shippers = (array) get_post_meta( $order_id, 'wc_pv_shipped', true );
570
- $shipped = in_array($user_id, $shippers) ? __( 'Yes', 'wc-vendors' ) : __( 'No', 'wc-vendors' ) ;
571
-
572
- $sum = WCV_Queries::sum_for_orders( array( $order_id ), array('vendor_id' =>get_current_user_id() ), false );
573
- $sum = reset( $sum );
574
-
575
- $total = $sum->line_total;
576
-
577
- $comment_output = '';
578
-
579
- $show_name = wc_string_to_bool( get_option( 'wcvendors_capability_order_customer_name', 'no' ) );
580
- $show_billing_address = wc_string_to_bool( get_option( 'wcvendors_capability_order_customer_billing', 'no' ) );
581
- $show_shipping_address = wc_string_to_bool( get_option( 'wcvendors_capability_order_customer_shipping', 'no' ) );
582
- $order_date = $order->get_date_created();
583
-
584
- $address = $order->get_address( 'billing' );
585
- if ( ! $show_name ) {
586
- unset( $address['first_name'] );
587
- unset( $address['last_name'] );
588
- }
589
-
590
- if ( ! $show_billing_address ) {
591
- unset( $address[ 'company' ] );
592
- unset( $address[ 'address_1' ] );
593
- unset( $address[ 'address_2' ] );
594
- unset( $address[ 'city' ] );
595
- unset( $address[ 'state' ] );
596
- unset( $address[ 'postcode' ] );
597
- unset( $address[ 'country' ] );
598
- }
599
-
600
- if ( ( get_option( 'woocommerce_ship_to_billing_address_only' ) === 'no' ) && ( $order->get_formatted_shipping_address() ) ) {
601
-
602
- $address = $order->get_address( 'shipping' );
603
- if ( ! $show_name ) {
604
- unset( $address['first_name'] );
605
- unset( $address['last_name'] );
606
- }
607
-
608
- if ( ! $show_shipping_address ) {
609
- unset( $address[ 'company' ] );
610
- unset( $address[ 'address_1' ] );
611
- unset( $address[ 'address_2' ] );
612
- unset( $address[ 'city' ] );
613
- unset( $address[ 'state' ] );
614
- unset( $address[ 'postcode' ] );
615
- unset( $address[ 'country' ] );
616
- }
617
- }
618
-
619
- $customer = WC()->countries->get_formatted_address( $address );
620
-
621
- $order_items = array();
622
- $order_items[ 'order_id' ] = $order_id;
623
- $order_items[ 'customer' ] = $customer;
624
- $order_items[ 'products' ] = $products;
625
- $order_items[ 'total' ] = wc_price( $total );
626
- $order_items[ 'date' ] = date_i18n( wc_date_format(), strtotime( $order_date ) );
627
- $order_items[ 'status' ] = $shipped;
628
-
629
- $orders[] = (object) $order_items;
630
-
631
- $model_id++;
632
- }
633
- }
634
- return $orders;
635
-
636
- }
637
-
638
-
639
- /**
640
- * Get the vendor products sold
641
- *
642
- * @param $user_id - the user_id to get the products of
643
- *
644
- * @return unknown
645
- */
646
- public function get_vendor_products( $user_id )
647
- {
648
- global $wpdb;
649
-
650
- $vendor_products = array();
651
- $sql = '';
652
-
653
- $sql .= "SELECT product_id FROM {$wpdb->prefix}pv_commission WHERE vendor_id = {$user_id} AND status != 'reversed' GROUP BY product_id";
654
-
655
- $results = $wpdb->get_results( $sql );
656
-
657
- foreach ( $results as $value ) {
658
- $ids[ ] = $value->product_id;
659
- }
660
-
661
- if ( !empty( $ids ) ) {
662
- $vendor_products = get_posts(
663
- array(
664
- 'numberposts' => -1,
665
- 'orderby' => 'post_date',
666
- 'post_type' => array( 'product', 'product_variation' ),
667
- 'order' => 'DESC',
668
- 'include' => $ids
669
- )
670
- );
671
- }
672
-
673
- return $vendor_products;
674
- }
675
-
676
-
677
- /**
678
- * All orders for a specific product
679
- *
680
- * @param array $product_ids
681
- * @param array $args (optional)
682
- *
683
- * @return object
684
- */
685
- public function get_orders_for_vendor_products( array $product_ids, array $args = array() )
686
- {
687
- global $wpdb;
688
-
689
- if ( empty( $product_ids ) ) return false;
690
-
691
- $defaults = array(
692
- 'status' => apply_filters( 'wcvendors_completed_statuses', array( 'completed', 'processing' ) ),
693
- );
694
-
695
- $args = wp_parse_args( $args, $defaults );
696
-
697
-
698
- $sql = "
699
- SELECT order_id
700
- FROM {$wpdb->prefix}pv_commission as order_items
701
- WHERE product_id IN ('" . implode( "','", $product_ids ) . "')
702
- AND status != 'reversed'
703
- ";
704
-
705
- if ( !empty( $args[ 'vendor_id' ] ) ) {
706
- $sql .= "
707
- AND vendor_id = {$args['vendor_id']}
708
- ";
709
- }
710
-
711
- $sql .= "
712
- GROUP BY order_id
713
- ORDER BY time DESC
714
- ";
715
-
716
- $orders = $wpdb->get_results( $sql );
717
-
718
- return $orders;
719
- }
720
-
721
-
722
-
723
- /**
724
- * prepare_items function.
725
- *
726
- * @access public
727
- */
728
- function prepare_items()
729
- {
730
-
731
-
732
- /**
733
- * Init column headers
734
- */
735
- $this->_column_headers = $this->get_column_info();
736
-
737
-
738
- /**
739
- * Process bulk actions
740
- */
741
- $this->process_bulk_action();
742
-
743
- /**
744
- * Get items
745
- */
746
-
747
- $this->items = $this->get_orders();
748
-
749
- /**
750
- * Pagination
751
- */
752
- }
753
-
754
-
755
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-vendor-applicants.php DELETED
@@ -1,104 +0,0 @@
1
- <?php
2
-
3
- /**
4
- *
5
- */
6
- class WCV_Vendor_Applicants
7
- {
8
-
9
- function __construct()
10
- {
11
- add_filter( 'user_row_actions', array( $this, 'user_row_actions' ), 10, 2 );
12
- add_filter( 'load-users.php', array( $this, 'user_row_actions_commit' ) );
13
- }
14
-
15
- /**
16
- *
17
- *
18
- * @param unknown $actions
19
- * @param unknown $user_object
20
- *
21
- * @return unknown
22
- */
23
- function user_row_actions( $actions, $user_object )
24
- {
25
-
26
- if ( in_array( 'pending_vendor', $user_object->roles ) ){
27
- $actions[ 'approve_vendor' ] = "<a href='?role=pending_vendor&action=approve_vendor&user_id=" . $user_object->ID . "'>" . __( 'Approve', 'cgc_ub' ) . "</a>";
28
- $actions[ 'deny_vendor' ] = "<a href='?role=pending_vendor&action=deny_vendor&user_id=" . $user_object->ID . "'>" . __( 'Deny', 'cgc_ub' ) . "</a>";
29
- }
30
-
31
- return $actions;
32
- }
33
-
34
-
35
- /**
36
- *
37
- */
38
- public function user_row_actions_commit()
39
- {
40
- if ( !empty( $_GET[ 'action' ] ) && !empty( $_GET[ 'user_id' ] ) ) {
41
-
42
- $wp_user_object = new WP_User( (int) $_GET[ 'user_id' ] );
43
-
44
- switch ( $_GET[ 'action' ] ) {
45
- case 'approve_vendor':
46
- $role = 'vendor';
47
- add_action( 'admin_notices', array( $this, 'approved' ) );
48
- do_action( 'wcvendors_approve_vendor', $wp_user_object );
49
- break;
50
-
51
- case 'deny_vendor':
52
- $role = apply_filters( 'wcvendors_denied_vendor_role', 'subscriber' );
53
- add_action( 'admin_notices', array( $this, 'denied' ) );
54
- do_action( 'wcvendors_deny_vendor', $wp_user_object );
55
- break;
56
-
57
- default:
58
- // code...
59
- break;
60
- }
61
-
62
- $wp_user_object->set_role( $role );
63
-
64
- }
65
- }
66
-
67
-
68
- /**
69
- *
70
- */
71
- public function denied()
72
- {
73
- echo '<div class="updated">';
74
- echo '<p>' . sprintf( __( '%s has been <b>denied</b>.', 'wc-vendors' ), wcv_get_vendor_name( ) ) . '</p>';
75
- echo '</div>';
76
- }
77
-
78
-
79
- /**
80
- *
81
- */
82
- public function approved()
83
- {
84
- echo '<div class="updated">';
85
- echo '<p>' . sprintf( __( '%s has been <b>approved</b>.', 'wc-vendors' ), wcv_get_vendor_name() ) . '</p>';
86
- echo '</div>';
87
- }
88
-
89
-
90
- /**
91
- *
92
- *
93
- * @param unknown $values
94
- *
95
- * @return unknown
96
- */
97
- public function show_pending_vendors_link( $values )
98
- {
99
- $values[ 'pending_vendors' ] = '<a href="?role=asd">' . __( 'Pending Vendors', 'wc-vendors' ) . ' <span class="count">(3)</span></a>';
100
-
101
- return $values;
102
- }
103
-
104
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-vendor-reports.php DELETED
@@ -1,121 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Report views
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package WCVendors
8
- */
9
-
10
-
11
- class WCV_Vendor_Reports
12
- {
13
-
14
-
15
- /**
16
- * Constructor
17
- */
18
- function __construct()
19
- {
20
- $this->vendor_id = !current_user_can( 'manage_woocommerce' ) ? wp_get_current_user()->ID : '';
21
- if ( !empty ( $this->vendor_id ) ) {
22
- add_filter( 'woocommerce_reports_charts', array( $this, 'filter_tabs' ), 99 );
23
- add_filter( 'woocommerce_json_search_found_products', array( $this, 'filter_products_json' ) );
24
- add_filter( 'woocommerce_reports_product_sales_order_items', array( $this, 'filter_products' ) );
25
- add_filter( 'woocommerce_reports_top_sellers_order_items', array( $this, 'filter_products' ) );
26
- add_filter( 'woocommerce_reports_top_earners_order_items', array( $this, 'filter_products' ) );
27
- }
28
-
29
- }
30
-
31
- /**
32
- * Show only reports that are useful to a vendor
33
- *
34
- * @param array $tabs
35
- *
36
- * @return array
37
- */
38
- public function filter_tabs( $tabs )
39
- {
40
- global $woocommerce;
41
-
42
- $remove = array(
43
- 'woocommerce_sales_overview',
44
- 'woocommerce_daily_sales',
45
- 'woocommerce_monthly_sales',
46
- 'woocommerce_monthly_taxes',
47
- 'woocommerce_category_sales',
48
- 'woocommerce_coupon_sales',
49
- );
50
-
51
- $reports = $tabs[ 'orders' ][ 'reports' ];
52
-
53
- foreach ( $reports as $key => $chart ) {
54
- if ( $key == 'coupon_usage' ) {
55
- unset( $tabs[ 'orders' ][ 'reports' ][ $key ] );
56
- }
57
- }
58
-
59
- // These are admin tabs
60
- $return = array(
61
- 'orders' => $tabs[ 'orders' ]
62
- );
63
-
64
- return $return;
65
- }
66
-
67
-
68
- /**
69
- * Filter products based on current vendor
70
- *
71
- * @param unknown $orders
72
- *
73
- * @return unknown
74
- */
75
- public function filter_products( $orders )
76
- {
77
- $products = WCV_Vendors::get_vendor_products( $this->vendor_id );
78
-
79
- $ids = array();
80
- foreach ( $products as $product ) {
81
- $ids[ ] = ( $product->ID );
82
- }
83
-
84
- foreach ( $orders as $key => $order ) {
85
-
86
- if ( !in_array( $order->product_id, $ids ) ) {
87
- unset( $orders[ $key ] );
88
- continue;
89
- } else {
90
- if ( !empty( $order->line_total ) ) {
91
- $orders[ $key ]->line_total = WCV_Commission::calculate_commission( $order->line_total, $order->product_id, $order, $order->qty );
92
- }
93
- }
94
-
95
- }
96
-
97
- return $orders;
98
- }
99
-
100
-
101
- /**
102
- *
103
- *
104
- * @param unknown $products
105
- *
106
- * @return unknown
107
- */
108
- public function filter_products_json( $products )
109
- {
110
- $vendor_products = WCV_Vendors::get_vendor_products( $this->vendor_id );
111
-
112
- $ids = array();
113
- foreach ( $vendor_products as $vendor_product ) {
114
- $ids[ $vendor_product->ID ] = $vendor_product->post_title;
115
- }
116
-
117
- return array_intersect_key( $products, $ids );
118
- }
119
-
120
-
121
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-wcv-admin-extensions.php DELETED
@@ -1,25 +0,0 @@
1
- <?php
2
- /**
3
- * WC Vendors Extensions Page
4
- *
5
- * @author WooThemes
6
- * @category Admin
7
- * @package WooCommerce/Admin
8
- * @version 2.5.0
9
- */
10
-
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- /**
16
- * WC_Admin_Addons Class.
17
- */
18
- class WCVendors_Admin_Extensions {
19
-
20
- public static function output(){
21
-
22
- include_once dirname( __FILE__ ) . '/views/html-admin-page-extensions.php';
23
- }
24
-
25
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-wcv-admin-help.php DELETED
@@ -1,120 +0,0 @@
1
- <?php
2
- /**
3
- * Add some content to the help tab
4
- *
5
- * @package WC Vendors/Admin
6
- * @version 2.0.0
7
- */
8
-
9
- if ( ! defined( 'ABSPATH' ) ) {
10
- exit;
11
- }
12
-
13
- if ( class_exists( 'WCVendors_Admin_Help', false ) ) {
14
- return new WCVendors_Admin_Help();
15
- }
16
-
17
- /**
18
- * WCVendors_Admin_Help Class.
19
- */
20
- class WCVendors_Admin_Help {
21
-
22
- /**
23
- * Hook in tabs.
24
- */
25
- public function __construct() {
26
- add_action( 'current_screen', array( $this, 'add_tabs' ), 60 );
27
- }
28
-
29
- /**
30
- * Add help tabs.
31
- */
32
- public function add_tabs() {
33
-
34
- $screen = get_current_screen();
35
-
36
- if ( ! $screen || ! in_array( $screen->id, wcv_get_screen_ids() ) ) {
37
- return;
38
- }
39
-
40
- // Rquired to unhook woocommerce tabs on these pages due to adding wc vendors pages into the wc_get_screen_ids to load woocommerce assets
41
- $screen->remove_help_tab( 'woocommerce_support_tab' );
42
- $screen->remove_help_tab( 'woocommerce_bugs_tab' );
43
- $screen->remove_help_tab( 'woocommerce_education_tab' );
44
- $screen->remove_help_tab( 'woocommerce_onboard_tab' );
45
-
46
- $screen->add_help_tab( array(
47
- 'id' => 'wcv_support_tab',
48
- 'title' => __( 'Help &amp; Support', 'wc-vendors' ),
49
- 'content' =>
50
- '<h2>' . __( 'Welcome to WC Vendors Help &amp; Support', 'wc-vendors' ) . '</h2>' .
51
- '<p>' . sprintf(
52
- /* translators: %s: Documentation URL */
53
- __( 'Should you need any help with using or extending WC Vendors, <a href="%s">please read our documentation</a>. You will find all kinds of resources including code snippets, guides and much more.', 'wc-vendors' ),
54
- 'https://docs.wcvendors.com/?utm_source=plugin&utm_medium=help&utm_campaign=settings'
55
- ) . '</p>' .
56
- '<p>' . sprintf(
57
- /* translators: %s: Forum URL */
58
- __( 'Do you have a question about WC Vendors? For assistance please see our <a href="%1$s">community forum</a>. If you need help with premium extensions sold by WC Vendors, please <a href="%2$s">submit a ticket</a>.', 'wc-vendors' ),
59
- 'https://wordpress.org/support/plugin/wc-vendors',
60
- 'https://www.wcvendors.com/submit-ticket/?utm_source=plugin&utm_medium=help&utm_campaign=pluginsettings'
61
- ) . '</p>' .
62
- '<p>' . __( 'Before asking for help we recommend checking the system status page to identify any problems with your configuration. <strong>Anything showing red should be fixed before contacting us.</strong>', 'wc-vendors' ) . '</p>' .
63
- '<p>' . sprintf( __( 'Please follow our <a href="%s">debuggin guide</a> to ensure that you have narrowed down the issue. ', 'wc-vendors' ), 'https://docs.wcvendors.com/knowledge-base/the-debugging-guide/?utm_source=plugin&utm_medium=help&utm_campaign=settings' ) .
64
- '<p><a href="' . admin_url( 'admin.php?page=wc-status' ) . '" class="button button-primary">' . __( 'System status', 'wc-vendors' ) . '</a> <a href="https://wordpress.org/support/plugin/wc-vendors" class="button">' . __( 'Community forum', 'wc-vendors' ) . '</a> <a href="https://www.wcvendors.com/submit-ticket/?utm_source=plugin&utm_medium=help&utm_campaign=pluginsettings" class="button">' . __( 'WC Vendors Premium Support', 'wc-vendors' ) . '</a></p>',
65
- ) );
66
-
67
- $screen->add_help_tab( array(
68
- 'id' => 'wcvendors_getting_started_tab',
69
- 'title' => __( 'Getting Started', 'wc-vendors' ),
70
- 'content' =>
71
- '<h2>' . __( 'Getting Started', 'wc-vendors' ) . '</h2>' .
72
- '<p>' . sprintf( __( 'If you are new to WC Vendors then we highly recommend that you go through our <a href="%s">getting started guides</a>.', 'wc-vendors' ), 'https://docs.wcvendors.com/article-categories/getting-started/' ). '</p>'
73
- ) );
74
-
75
- $screen->add_help_tab( array(
76
- 'id' => 'wcvendors_bugs_tab',
77
- 'title' => __( 'Found a bug?', 'wc-vendors' ),
78
- 'content' =>
79
- '<h2>' . __( 'Found a bug?', 'wc-vendors' ) . '</h2>' .
80
- /* translators: 1: GitHub issues URL 2: System status report URL */
81
- '<p>' . sprintf( __( 'If you think you have found a bug in WC Vendors you can create a ticket via <a href="%1$s">Github issues</a>. To help us solve your issue, please be as descriptive as possible and include your <a href="%2$s">system status report</a>.', 'wc-vendors' ), 'https://github.com/wcvendors/wcvendors/issues?state=open', admin_url( 'admin.php?page=wc-status' ) ) . '</p>' .
82
- '<p><a href="https://github.com/wcvendors/wcvendors/issues?state=open" class="button button-primary">' . __( 'Report a bug', 'wc-vendors' ) . '</a> <a href="' . admin_url( 'admin.php?page=wc-status' ) . '" class="button">' . __( 'System status', 'wc-vendors' ) . '</a></p>',
83
-
84
- ) );
85
-
86
-
87
-
88
- $screen->add_help_tab( array(
89
- 'id' => 'wcvendors_onboard_tab',
90
- 'title' => __( 'Setup wizard', 'wc-vendors' ),
91
- 'content' =>
92
- '<h2>' . __( 'Setup wizard', 'wc-vendors' ) . '</h2>' .
93
- '<p>' . __( 'If you need to access the setup wizard again, please click on the button below.', 'wc-vendors' ) . '</p>' .
94
- '<p><a href="' . admin_url( 'index.php?page=wcv-setup' ) . '" class="button button-primary">' . __( 'Setup wizard', 'wc-vendors' ) . '</a></p>',
95
-
96
- ) );
97
-
98
- $screen->add_help_tab( array(
99
- 'id' => 'wcvendors_upgrade_tab',
100
- 'title' => __( 'Update', 'wc-vendors' ),
101
- 'content' =>
102
- '<h2>' . __( 'Upgrade', 'wc-vendors' ) . '</h2>' .
103
- '<p>' . __( 'If you need to manually run the updates, please click on the button below.', 'wc-vendors' ) . '</p>' .
104
- '<p><a href="' . esc_url( add_query_arg( 'do_update_wcvendors', 'true', admin_url( 'admin.php?page=wcv-settings' ) ) ). '" class="button button-primary">' . __( 'Run the updater', 'wc-vendors' ) . '</a></p>',
105
-
106
- ) );
107
-
108
- $screen->set_help_sidebar(
109
- '<p><strong>' . __( 'For more information:', 'wc-vendors' ) . '</strong></p>' .
110
- '<p><a href="https://www.wcvendors.com/product/wc-vendors-pro/?utm_source=plugin&utm_medium=help&utm_campaign=settings" target="_blank">' . __( 'Upgrade to Pro', 'wc-vendors' ) . '</a></p>' .
111
- '<p><a href="https://www.wcvendors.com/extensions/?utm_source=plugin&utm_medium=help&utm_campaign=settings" target="_blank">' . __( 'Buy extensions', 'wc-vendors' ) . '</a></p>' .
112
- '<p><a href="https://woocommerce.com/?utm_source=helptab&utm_medium=product&utm_content=about&utm_campaign=woocommerceplugin" target="_blank">' . __( 'About WC Vendors', 'wc-vendors' ) . '</a></p>' .
113
- '<p><a href="https://wordpress.org/plugins/wc-vendors/" target="_blank">' . __( 'WC Vendors on WordPress.org', 'wc-vendors' ) . '</a></p>' .
114
- '<p><a href="https://github.com/wcvendors/wcvendors" target="_blank">' . __( 'WC Vendors Github', 'wc-vendors' ) . '</a></p>'
115
-
116
- );
117
- }
118
- }
119
-
120
- return new WCVendors_Admin_Help();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-wcv-admin-notices.php DELETED
@@ -1,249 +0,0 @@
1
- <?php
2
- /**
3
- * Display notices in admin
4
- *
5
- * @author Jamie Madden, WC Vendors
6
- * @category Admin
7
- * @package WCVendors/Admin
8
- * @version 2.0.0
9
- */
10
-
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- /**
16
- * WC_Admin_Notices Class.
17
- */
18
- class WCVendors_Admin_Notices {
19
-
20
- /**
21
- * Stores notices.
22
- * @var array
23
- */
24
- private static $notices = array();
25
-
26
- /**
27
- * Array of notices - name => callback.
28
- * @var array
29
- */
30
- private static $core_notices = array(
31
- 'install' => 'install_notice',
32
- 'update' => 'update_notice',
33
- 'template_files' => 'template_file_check_notice',
34
- 'theme_support' => 'theme_check_notice',
35
- );
36
-
37
- /**
38
- * Constructor.
39
- */
40
- public static function init() {
41
- self::$notices = get_option( 'wcvendors_admin_notices', array() );
42
-
43
- add_action( 'switch_theme', array( __CLASS__, 'reset_admin_notices' ) );
44
- add_action( 'wcvendors_installed', array( __CLASS__, 'reset_admin_notices' ) );
45
- add_action( 'wp_loaded', array( __CLASS__, 'hide_notices' ) );
46
- add_action( 'shutdown', array( __CLASS__, 'store_notices' ) );
47
-
48
- if ( current_user_can( 'manage_woocommerce' ) ) {
49
- add_action( 'admin_print_styles', array( __CLASS__, 'add_notices' ) );
50
- }
51
- }
52
-
53
- /**
54
- * Store notices to DB
55
- */
56
- public static function store_notices() {
57
- update_option( 'wcvendors_admin_notices', self::get_notices() );
58
- }
59
-
60
- /**
61
- * Get notices
62
- * @return array
63
- */
64
- public static function get_notices() {
65
- return self::$notices;
66
- }
67
-
68
- /**
69
- * Remove all notices.
70
- */
71
- public static function remove_all_notices() {
72
- self::$notices = array();
73
- }
74
-
75
- /**
76
- * Reset notices for themes when switched or a new version of WC is installed.
77
- */
78
- public static function reset_admin_notices() {
79
- self::add_notice( 'template_files' );
80
- }
81
-
82
- /**
83
- * Show a notice.
84
- * @param string $name
85
- */
86
- public static function add_notice( $name ) {
87
- self::$notices = array_unique( array_merge( self::get_notices(), array( $name ) ) );
88
- }
89
-
90
- /**
91
- * Remove a notice from being displayed.
92
- * @param string $name
93
- */
94
- public static function remove_notice( $name ) {
95
- self::$notices = array_diff( self::get_notices(), array( $name ) );
96
- delete_option( 'wcvendors_admin_notice_' . $name );
97
- }
98
-
99
- /**
100
- * See if a notice is being shown.
101
- * @param string $name
102
- * @return boolean
103
- */
104
- public static function has_notice( $name ) {
105
- return in_array( $name, self::get_notices() );
106
- }
107
-
108
- /**
109
- * Hide a notice if the GET variable is set.
110
- */
111
- public static function hide_notices() {
112
- if ( isset( $_GET['wcv-hide-notice'] ) && isset( $_GET['_wcv_notice_nonce'] ) ) {
113
- if ( ! wp_verify_nonce( $_GET['_wcv_notice_nonce'], 'wcvendors_hide_notices_nonce' ) ) {
114
- wp_die( __( 'Action failed. Please refresh the page and retry.', 'wc-vendors' ) );
115
- }
116
-
117
- if ( ! current_user_can( 'manage_woocommerce' ) ) {
118
- wp_die( __( 'Cheatin&#8217; huh?', 'wc-vendors' ) );
119
- }
120
-
121
- $hide_notice = sanitize_text_field( $_GET['wcv-hide-notice'] );
122
- self::remove_notice( $hide_notice );
123
- do_action( 'wcvendors_hide_' . $hide_notice . '_notice' );
124
- }
125
- }
126
-
127
- /**
128
- * Add notices + styles if needed.
129
- */
130
- public static function add_notices() {
131
- $notices = self::get_notices();
132
-
133
- if ( ! empty( $notices ) ) {
134
- $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
135
- wp_enqueue_style( 'wcv-setup', wcv_assets_url . 'css/wcv-activation' . $suffix .'.css', WCV_VERSION );
136
- foreach ( $notices as $notice ) {
137
- if ( ! empty( self::$core_notices[ $notice ] ) && apply_filters( 'wcvendors_show_admin_notice', true, $notice ) ) {
138
- add_action( 'admin_notices', array( __CLASS__, self::$core_notices[ $notice ] ) );
139
- } else {
140
- add_action( 'admin_notices', array( __CLASS__, 'output_custom_notices' ) );
141
- }
142
- }
143
- }
144
- }
145
-
146
- /**
147
- * Add a custom notice.
148
- * @param string $name
149
- * @param string $notice_html
150
- */
151
- public static function add_custom_notice( $name, $notice_html ) {
152
- self::add_notice( $name );
153
- update_option( 'wcvendors_admin_notice_' . $name, wp_kses_post( $notice_html ) );
154
- }
155
-
156
- /**
157
- * Output any stored custom notices.
158
- */
159
- public static function output_custom_notices() {
160
- $notices = self::get_notices();
161
-
162
- if ( ! empty( $notices ) ) {
163
- foreach ( $notices as $notice ) {
164
- if ( empty( self::$core_notices[ $notice ] ) ) {
165
- $notice_html = get_option( 'wcvendors_admin_notice_' . $notice );
166
-
167
- if ( $notice_html ) {
168
- include( 'views/notices/html-notice-custom.php' );
169
- }
170
- }
171
- }
172
- }
173
- }
174
-
175
- /**
176
- * If we need to update, include a message with the update button.
177
- */
178
- public static function update_notice() {
179
- if ( version_compare( get_option( 'wcvendors_db_version' ), WCV_VERSION, '<' ) ) {
180
- $updater = new WCVendors_Background_Updater();
181
- if ( $updater->is_updating() || ! empty( $_GET['do_update_wcvendors'] ) ) {
182
- include( 'views/notices/html-notice-updating.php' );
183
- } else {
184
- include( 'views/notices/html-notice-update.php' );
185
- }
186
- } else {
187
- include( 'views/notices/html-notice-updated.php' );
188
- }
189
- }
190
-
191
- /**
192
- * If we have just installed, show a message with the install pages button.
193
- */
194
- public static function install_notice() {
195
- include( 'views/notices/html-notice-install.php' );
196
- }
197
-
198
- /**
199
- * Show the Theme Check notice.
200
- */
201
- public static function theme_check_notice() {
202
- if ( ! current_theme_supports( 'wcvendors' ) && ! in_array( get_option( 'template' ), wc_get_core_supported_themes() ) ) {
203
- include( 'views/notices/html-notice-theme-support.php' );
204
- } else {
205
- self::remove_notice( 'theme_support' );
206
- }
207
- }
208
-
209
- /**
210
- * Show a notice highlighting bad template files.
211
- */
212
- public static function template_file_check_notice() {
213
-
214
- $core_templates = WC_Admin_Status::scan_template_files( wcv_plugin_dir_path . '/templates' );
215
- $outdated = false;
216
-
217
- foreach ( $core_templates as $file ) {
218
-
219
- $theme_file = false;
220
- if ( file_exists( get_stylesheet_directory() . '/' . $file ) ) {
221
- $theme_file = get_stylesheet_directory() . '/' . $file;
222
- } elseif ( file_exists( get_stylesheet_directory() . '/wc-vendors/' . $file ) ) {
223
- $theme_file = get_stylesheet_directory() . '/wc-vendors/' . $file;
224
- } elseif ( file_exists( get_template_directory() . '/' . $file ) ) {
225
- $theme_file = get_template_directory() . '/' . $file;
226
- } elseif ( file_exists( get_template_directory() . '/wc-vendors/' . $file ) ) {
227
- $theme_file = get_template_directory() . '/wc-vendors/' . $file;
228
- }
229
-
230
- if ( false !== $theme_file ) {
231
- $core_version = WC_Admin_Status::get_file_version( wcv_plugin_dir_path . '/templates/' . $file );
232
- $theme_version = WC_Admin_Status::get_file_version( $theme_file );
233
-
234
- if ( $core_version && $theme_version && version_compare( $theme_version, $core_version, '<' ) ) {
235
- $outdated = true;
236
- break;
237
- }
238
- }
239
- }
240
-
241
- if ( $outdated ) {
242
- include( 'views/notices/html-notice-template-check.php' );
243
- } else {
244
- self::remove_notice( 'template_files' );
245
- }
246
- }
247
- }
248
-
249
- WCVendors_Admin_Notices::init();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-wcv-admin-settings.php DELETED
@@ -1,703 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) {
3
- exit;
4
- }
5
-
6
- /**
7
- * The admin settings class handles all settings in the admin area. This is a modified version of the WooCommerce Admin Settings class
8
- *
9
- * @author WooCommerce, Jamie Madden, WC Vendors
10
- * @category Admin
11
- * @package WCVendors/Admin
12
- * @version 2.0.0
13
- */
14
-
15
- class WCVendors_Admin_Settings extends WC_Admin_Settings {
16
-
17
- /**
18
- * Setting pages.
19
- *
20
- * @var array
21
- */
22
- private static $settings = array();
23
-
24
- /**
25
- * Error messages.
26
- *
27
- * @var array
28
- */
29
- private static $errors = array();
30
-
31
- /**
32
- * Update messages.
33
- *
34
- * @var array
35
- */
36
- private static $messages = array();
37
-
38
- /**
39
- * Include the settings page classes.
40
- */
41
- public static function get_settings_pages() {
42
-
43
- if ( empty( self::$settings ) ) {
44
- $settings = array();
45
-
46
- // Include the setings page.
47
- include_once( WCV_ABSPATH_ADMIN . 'settings/class-wcv-settings-page.php' );
48
-
49
- $settings[] = include( WCV_ABSPATH_ADMIN . 'settings/class-wcv-settings-general.php' );
50
- $settings[] = include( WCV_ABSPATH_ADMIN . 'settings/class-wcv-settings-commission.php' );
51
- $settings[] = include( WCV_ABSPATH_ADMIN . 'settings/class-wcv-settings-capabilities.php' );
52
- $settings[] = include( WCV_ABSPATH_ADMIN . 'settings/class-wcv-settings-display.php' );
53
- $settings[] = include( WCV_ABSPATH_ADMIN . 'settings/class-wcv-settings-payments.php' );
54
- $settings[] = include( WCV_ABSPATH_ADMIN . 'settings/class-wcv-settings-advanced.php' );
55
-
56
- self::$settings = apply_filters( 'wcvendors_get_settings_pages', $settings );
57
- }
58
-
59
- return self::$settings;
60
- }
61
-
62
- /**
63
- * Save the settings.
64
- */
65
- public static function save() {
66
- global $current_tab;
67
-
68
- if ( empty( $_REQUEST['_wpnonce'] ) || ! wp_verify_nonce( $_REQUEST['_wpnonce'], 'wcvendors-settings' ) ) {
69
- die( __( 'Action failed. Please refresh the page and retry.', 'wc-vendors' ) );
70
- }
71
-
72
- // Trigger actions
73
- do_action( 'wcvendors_settings_save_' . $current_tab );
74
- do_action( 'wcvendors_update_options_' . $current_tab );
75
- do_action( 'wcvendors_update_options' );
76
-
77
- self::add_message( __( 'Your settings have been saved.', 'wc-vendors' ) );
78
-
79
- update_option( 'wcvendors_queue_flush_rewrite_rules', 'yes' );
80
- do_action( 'wcvendors_settings_saved' );
81
- }
82
-
83
- /**
84
- * Settings page.
85
- *
86
- * Handles the display of the main wcvendors settings page in admin.
87
- */
88
- public static function output() {
89
- global $current_section, $current_tab;
90
-
91
- // $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
92
- $suffix = '';
93
-
94
- do_action( 'wcvendors_settings_start' );
95
- wp_enqueue_script( 'wcvendors_settings', wcv_assets_url . '/js/admin/settings' . $suffix . '.js', array( 'jquery', 'jquery-ui-datepicker', 'jquery-ui-sortable', 'iris', 'selectWoo' ), WCV_VERSION, true );
96
- wp_localize_script( 'wcvendors_settings', 'wcvendors_settings_params', array(
97
- 'i18n_nav_warning' => __( 'The changes you made will be lost if you navigate away from this page.', 'wc-vendors' ),
98
- ) );
99
-
100
- wp_enqueue_script( 'wcvendors-media', wcv_assets_url . 'js/admin/wcvendors-media.js', array( 'jquery' ), WCV_VERSION, true );
101
-
102
- // Get tabs for the settings page
103
- $tabs = apply_filters( 'wcvendors_settings_tabs_array', array() );
104
-
105
- include( WCV_ABSPATH_ADMIN . 'views/html-admin-settings.php' );
106
- }
107
-
108
- /**
109
- * Output admin fields.
110
- *
111
- * Loops though the wcvendors options array and outputs each field.
112
- *
113
- * @param array[] $options Opens array to output
114
- */
115
- public static function output_fields( $options ) {
116
-
117
- include( WCV_ABSPATH_ADMIN . 'includes/class-wcv-walker-pagedropdown-multiple.php' );
118
-
119
- foreach ( $options as $value ) {
120
- if ( ! isset( $value['type'] ) ) {
121
- continue;
122
- }
123
- if ( ! isset( $value['id'] ) ) {
124
- $value['id'] = '';
125
- }
126
- if ( ! isset( $value['title'] ) ) {
127
- $value['title'] = isset( $value['name'] ) ? $value['name'] : '';
128
- }
129
- if ( ! isset( $value['class'] ) ) {
130
- $value['class'] = '';
131
- }
132
- if ( ! isset( $value['css'] ) ) {
133
- $value['css'] = '';
134
- }
135
- if ( ! isset( $value['default'] ) ) {
136
- $value['default'] = '';
137
- }
138
- if ( ! isset( $value['desc'] ) ) {
139
- $value['desc'] = '';
140
- }
141
- if ( ! isset( $value['desc_tip'] ) ) {
142
- $value['desc_tip'] = false;
143
- }
144
- if ( ! isset( $value['placeholder'] ) ) {
145
- $value['placeholder'] = '';
146
- }
147
- if ( ! isset( $value['suffix'] ) ) {
148
- $value['suffix'] = '';
149
- }
150
-
151
- // Custom attribute handling
152
- $custom_attributes = array();
153
-
154
- if ( ! empty( $value['custom_attributes'] ) && is_array( $value['custom_attributes'] ) ) {
155
- foreach ( $value['custom_attributes'] as $attribute => $attribute_value ) {
156
- $custom_attributes[] = esc_attr( $attribute ) . '="' . esc_attr( $attribute_value ) . '"';
157
- }
158
- }
159
-
160
- // Description handling
161
- $field_description = self::get_field_description( $value );
162
- extract( $field_description );
163
-
164
- // Switch based on type
165
- switch ( $value['type'] ) {
166
-
167
- // Section Titles
168
- case 'title':
169
- if ( ! empty( $value['title'] ) ) {
170
- echo '<h2>' . esc_html( $value['title'] ) . '</h2>';
171
- }
172
- if ( ! empty( $value['desc'] ) ) {
173
- echo wpautop( wptexturize( wp_kses_post( $value['desc'] ) ) );
174
- }
175
- echo '<table class="form-table">' . "\n\n";
176
- if ( ! empty( $value['id'] ) ) {
177
- do_action( 'wcvendors_settings_' . sanitize_title( $value['id'] ) );
178
- }
179
- break;
180
-
181
- // Section Ends
182
- case 'sectionend':
183
- if ( ! empty( $value['id'] ) ) {
184
- do_action( 'wcvendors_settings_' . sanitize_title( $value['id'] ) . '_end' );
185
- }
186
- echo '</table>';
187
- if ( ! empty( $value['id'] ) ) {
188
- do_action( 'wcvendors_settings_' . sanitize_title( $value['id'] ) . '_after' );
189
- }
190
- break;
191
-
192
- // Standard text inputs and subtypes like 'number'
193
- case 'text':
194
- case 'email':
195
- case 'number':
196
- case 'password' :
197
- $option_value = self::get_option( $value['id'], $value['default'] );
198
-
199
- ?><tr valign="top">
200
- <th scope="row" class="titledesc">
201
- <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
202
- <?php echo $tooltip_html; ?>
203
- </th>
204
- <td class="forminp forminp-<?php echo sanitize_title( $value['type'] ) ?>">
205
- <input
206
- name="<?php echo esc_attr( $value['id'] ); ?>"
207
- id="<?php echo esc_attr( $value['id'] ); ?>"
208
- type="<?php echo esc_attr( $value['type'] ); ?>"
209
- style="<?php echo esc_attr( $value['css'] ); ?>"
210
- value="<?php echo esc_attr( $option_value ); ?>"
211
- class="<?php echo esc_attr( $value['class'] ); ?>"
212
- placeholder="<?php echo esc_attr( $value['placeholder'] ); ?>"
213
- <?php echo implode( ' ', $custom_attributes ); ?>
214
- /><?php echo esc_html( $value['suffix'] ); ?> <?php echo $description; ?>
215
- </td>
216
- </tr><?php
217
- break;
218
-
219
- // Color picker.
220
- case 'color' :
221
- $option_value = self::get_option( $value['id'], $value['default'] );
222
-
223
- ?><tr valign="top">
224
- <th scope="row" class="titledesc">
225
- <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
226
- <?php echo $tooltip_html; ?>
227
- </th>
228
- <td class="forminp forminp-<?php echo sanitize_title( $value['type'] ) ?>">&lrm;
229
- <span class="colorpickpreview" style="background: <?php echo esc_attr( $option_value ); ?>"></span>
230
- <input
231
- name="<?php echo esc_attr( $value['id'] ); ?>"
232
- id="<?php echo esc_attr( $value['id'] ); ?>"
233
- type="text"
234
- dir="ltr"
235
- style="<?php echo esc_attr( $value['css'] ); ?>"
236
- value="<?php echo esc_attr( $option_value ); ?>"
237
- class="<?php echo esc_attr( $value['class'] ); ?> colorpick"
238
- placeholder="<?php echo esc_attr( $value['placeholder'] ); ?>"
239
- <?php echo implode( ' ', $custom_attributes ); ?>
240
- />&lrm; <?php echo $description; ?>
241
- <div id="colorPickerDiv_<?php echo esc_attr( $value['id'] ); ?>" class="colorpickdiv" style="z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;display:none;"></div>
242
- </td>
243
- </tr><?php
244
- break;
245
-
246
- // Textarea
247
- case 'textarea':
248
-
249
- $option_value = self::get_option( $value['id'], $value['default'] );
250
-
251
- ?><tr valign="top">
252
- <th scope="row" class="titledesc">
253
- <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
254
- <?php echo $tooltip_html; ?>
255
- </th>
256
- <td class="forminp forminp-<?php echo sanitize_title( $value['type'] ) ?>">
257
- <?php echo $description; ?>
258
-
259
- <textarea
260
- name="<?php echo esc_attr( $value['id'] ); ?>"
261
- id="<?php echo esc_attr( $value['id'] ); ?>"
262
- style="<?php echo esc_attr( $value['css'] ); ?>"
263
- class="<?php echo esc_attr( $value['class'] ); ?>"
264
- placeholder="<?php echo esc_attr( $value['placeholder'] ); ?>"
265
- <?php echo implode( ' ', $custom_attributes ); ?>
266
- ><?php echo esc_textarea( $option_value ); ?></textarea>
267
- </td>
268
- </tr><?php
269
- break;
270
-
271
- // Select boxes
272
- case 'select' :
273
- case 'multiselect' :
274
-
275
- $option_value = self::get_option( $value['id'], $value['default'] );
276
-
277
- ?><tr valign="top">
278
- <th scope="row" class="titledesc">
279
- <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
280
- <?php echo $tooltip_html; ?>
281
- </th>
282
- <td class="forminp forminp-<?php echo sanitize_title( $value['type'] ) ?>">
283
- <select
284
- name="<?php echo esc_attr( $value['id'] ); ?><?php echo ( 'multiselect' === $value['type'] ) ? '[]' : ''; ?>"
285
- id="<?php echo esc_attr( $value['id'] ); ?>"
286
- style="<?php echo esc_attr( $value['css'] ); ?>"
287
- class="<?php echo esc_attr( $value['class'] ); ?>"
288
- <?php echo implode( ' ', $custom_attributes ); ?>
289
- <?php echo ( 'multiselect' == $value['type'] ) ? 'multiple="multiple"' : ''; ?>
290
- >
291
- <?php
292
- foreach ( $value['options'] as $key => $val ) {
293
- ?>
294
- <option value="<?php echo esc_attr( $key ); ?>" <?php
295
-
296
- if ( is_array( $option_value ) ) {
297
- selected( in_array( $key, $option_value ), true );
298
- } else {
299
- selected( $option_value, $key );
300
- }
301
-
302
- ?>><?php echo $val ?></option>
303
- <?php
304
- }
305
- ?>
306
- </select> <?php echo $description; ?>
307
- </td>
308
- </tr><?php
309
- break;
310
-
311
- // Radio inputs
312
- case 'radio' :
313
-
314
- $option_value = self::get_option( $value['id'], $value['default'] );
315
-
316
- ?><tr valign="top">
317
- <th scope="row" class="titledesc">
318
- <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
319
- <?php echo $tooltip_html; ?>
320
- </th>
321
- <td class="forminp forminp-<?php echo sanitize_title( $value['type'] ) ?>">
322
- <fieldset>
323
- <?php echo $description; ?>
324
- <ul>
325
- <?php
326
- foreach ( $value['options'] as $key => $val ) {
327
- ?>
328
- <li>
329
- <label><input
330
- name="<?php echo esc_attr( $value['id'] ); ?>"
331
- value="<?php echo $key; ?>"
332
- type="radio"
333
- style="<?php echo esc_attr( $value['css'] ); ?>"
334
- class="<?php echo esc_attr( $value['class'] ); ?>"
335
- <?php echo implode( ' ', $custom_attributes ); ?>
336
- <?php checked( $key, $option_value ); ?>
337
- /> <?php echo $val ?></label>
338
- </li>
339
- <?php
340
- }
341
- ?>
342
- </ul>
343
- </fieldset>
344
- </td>
345
- </tr><?php
346
- break;
347
-
348
- // Checkbox input
349
- case 'checkbox' :
350
-
351
- $option_value = self::get_option( $value['id'], $value['default'] );
352
- $visibility_class = array();
353
-
354
- if ( ! isset( $value['hide_if_checked'] ) ) {
355
- $value['hide_if_checked'] = false;
356
- }
357
- if ( ! isset( $value['show_if_checked'] ) ) {
358
- $value['show_if_checked'] = false;
359
- }
360
- if ( 'yes' == $value['hide_if_checked'] || 'yes' == $value['show_if_checked'] ) {
361
- $visibility_class[] = 'hidden_option';
362
- }
363
- if ( 'option' == $value['hide_if_checked'] ) {
364
- $visibility_class[] = 'hide_options_if_checked';
365
- }
366
- if ( 'option' == $value['show_if_checked'] ) {
367
- $visibility_class[] = 'show_options_if_checked';
368
- }
369
-
370
- if ( ! isset( $value['checkboxgroup'] ) || 'start' == $value['checkboxgroup'] ) {
371
- ?>
372
- <tr valign="top" class="<?php echo esc_attr( implode( ' ', $visibility_class ) ); ?>">
373
- <th scope="row" class="titledesc"><?php echo esc_html( $value['title'] ) ?></th>
374
- <td class="forminp forminp-checkbox">
375
- <fieldset>
376
- <?php
377
- } else {
378
- ?>
379
- <fieldset class="<?php echo esc_attr( implode( ' ', $visibility_class ) ); ?>">
380
- <?php
381
- }
382
-
383
- if ( ! empty( $value['title'] ) ) {
384
- ?>
385
- <legend class="screen-reader-text"><span><?php echo esc_html( $value['title'] ) ?></span></legend>
386
- <?php
387
- }
388
-
389
- ?>
390
- <label for="<?php echo $value['id'] ?>">
391
- <input
392
- name="<?php echo esc_attr( $value['id'] ); ?>"
393
- id="<?php echo esc_attr( $value['id'] ); ?>"
394
- type="checkbox"
395
- class="<?php echo esc_attr( isset( $value['class'] ) ? $value['class'] : '' ); ?>"
396
- value="1"
397
- <?php checked( $option_value, 'yes' ); ?>
398
- <?php echo implode( ' ', $custom_attributes ); ?>
399
- /> <?php echo $description ?>
400
- </label> <?php echo $tooltip_html; ?>
401
- <?php
402
-
403
- if ( ! isset( $value['checkboxgroup'] ) || 'end' == $value['checkboxgroup'] ) {
404
- ?>
405
- </fieldset>
406
- </td>
407
- </tr>
408
- <?php
409
- } else {
410
- ?>
411
- </fieldset>
412
- <?php
413
- }
414
- break;
415
-
416
- // Single page selects
417
- case 'single_select_page' :
418
-
419
- $args = array(
420
- 'name' => $value['id'],
421
- 'id' => $value['id'],
422
- 'sort_column' => 'menu_order',
423
- 'sort_order' => 'ASC',
424
- 'show_option_none' => ' ',
425
- 'class' => $value['class'],
426
- 'echo' => false,
427
- 'selected' => absint( self::get_option( $value['id'] ) ),
428
- );
429
-
430
- if ( isset( $value['args'] ) ) {
431
- $args = wp_parse_args( $value['args'], $args );
432
- }
433
-
434
- ?><tr valign="top" class="single_select_page">
435
- <th scope="row" class="titledesc"><?php echo esc_html( $value['title'] ) ?> <?php echo $tooltip_html; ?></th>
436
- <td class="forminp">
437
- <?php echo str_replace( ' id=', " data-placeholder='" . esc_attr__( 'Select a page&hellip;', 'wc-vendors' ) . "' style='" . $value['css'] . "' class='" . $value['class'] . "' id=", wp_dropdown_pages( $args ) ); ?> <?php echo $description; ?>
438
- </td>
439
- </tr><?php
440
- break;
441
-
442
- // Multi page selects
443
- case 'multi_select_page' :
444
-
445
- $args = array(
446
- 'name' => $value['id']. '[]',
447
- 'walker' => new WCV_Walker_PageDropdown_Multiple(),
448
- 'id' => $value['id'],
449
- 'sort_column' => 'menu_order',
450
- 'sort_order' => 'ASC',
451
- 'show_option_none' => ' ',
452
- 'class' => $value['class'],
453
- 'echo' => false,
454
- 'selected' => self::get_option( $value['id'] ),
455
- );
456
-
457
- if ( isset( $value['args'] ) ) {
458
- $args = wp_parse_args( $value['args'], $args );
459
- }
460
-
461
- ?><tr valign="top" class="single_select_page">
462
- <th scope="row" class="titledesc"><?php echo esc_html( $value['title'] ) ?> <?php echo $tooltip_html; ?></th>
463
- <td class="forminp">
464
- <?php echo str_replace( ' id=', " data-placeholder='" . esc_attr__( 'Select a page&hellip;', 'wc-vendors' ) . "' style='" . $value['css'] . "' class='" . $value['class'] . "' multiple=\"multiple\" id=", wp_dropdown_pages( $args ) ); ?> <?php echo $description; ?>
465
- </td>
466
- </tr><?php
467
- break;
468
-
469
- // Single country selects
470
- case 'single_select_country' :
471
- $country_setting = (string) self::get_option( $value['id'] );
472
-
473
- if ( strstr( $country_setting, ':' ) ) {
474
- $country_setting = explode( ':', $country_setting );
475
- $country = current( $country_setting );
476
- $state = end( $country_setting );
477
- } else {
478
- $country = $country_setting;
479
- $state = '*';
480
- }
481
- ?><tr valign="top">
482
- <th scope="row" class="titledesc">
483
- <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
484
- <?php echo $tooltip_html; ?>
485
- </th>
486
- <td class="forminp"><select name="<?php echo esc_attr( $value['id'] ); ?>" style="<?php echo esc_attr( $value['css'] ); ?>" data-placeholder="<?php esc_attr_e( 'Choose a country&hellip;', 'wc-vendors' ); ?>" aria-label="<?php esc_attr_e( 'Country', 'wc-vendors' ) ?>" class="wc-enhanced-select">
487
- <?php WC()->countries->country_dropdown_options( $country, $state ); ?>
488
- </select> <?php echo $description; ?>
489
- </td>
490
- </tr><?php
491
- break;
492
-
493
- // Country multiselects
494
- case 'multi_select_countries' :
495
-
496
- $selections = (array) self::get_option( $value['id'] );
497
-
498
- if ( ! empty( $value['options'] ) ) {
499
- $countries = $value['options'];
500
- } else {
501
- $countries = WC()->countries->countries;
502
- }
503
-
504
- asort( $countries );
505
- ?><tr valign="top">
506
- <th scope="row" class="titledesc">
507
- <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
508
- <?php echo $tooltip_html; ?>
509
- </th>
510
- <td class="forminp">
511
- <select multiple="multiple" name="<?php echo esc_attr( $value['id'] ); ?>[]" style="width:350px" data-placeholder="<?php esc_attr_e( 'Choose countries&hellip;', 'wc-vendors' ); ?>" aria-label="<?php esc_attr_e( 'Country', 'wc-vendors' ) ?>" class="wc-enhanced-select">
512
- <?php
513
- if ( ! empty( $countries ) ) {
514
- foreach ( $countries as $key => $val ) {
515
- echo '<option value="' . esc_attr( $key ) . '" ' . selected( in_array( $key, $selections ), true, false ) . '>' . $val . '</option>';
516
- }
517
- }
518
- ?>
519
- </select> <?php echo ( $description ) ? $description : ''; ?> <br /><a class="select_all button" href="#"><?php _e( 'Select all', 'wc-vendors' ); ?></a> <a class="select_none button" href="#"><?php _e( 'Select none', 'wc-vendors' ); ?></a>
520
- </td>
521
- </tr><?php
522
- break;
523
-
524
- case 'image':
525
-
526
- $option_value = self::get_option( $value['id'], $value['default'] );
527
-
528
- ?><tr valign="top">
529
- <th scope="row" class="titledesc">
530
- <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
531
- <?php echo $tooltip_html; ?>
532
- </th>
533
- <td class="forminp">
534
- <img class="wcv-image-container-<?php echo $value['id']; ?>" src="<?php echo $option_value; ?>" alt="" style="max-width:100%;" />
535
- <br />
536
- <input id="wcv-add-<?php echo $value['id']; ?>" type="button" class="<?php echo $value['css']; ?>" value="<?php echo sprintf( __( 'Update %s', 'wc-vendors' ), strtolower( $value['title'] ) ); ?>" data-id="<?php echo $value['id']; ?>" data-save_button="<?php echo sprintf( __( 'Add %s', 'wc-vendors' ), $value['title'] ); ?>" data-window_title="<?php echo sprintf( __( 'Add %s', 'wc-vendors' ), strtolower( $value['title'] ) ); ?>" data-upload_notice="<?php echo sprintf( __( 'Upload an image for the %s', 'wc-vendors' ), strtolower( $value['title'] ) ); ?>" />
537
- <input type="hidden" name="<?php echo $value['id']; ?>" id="<?php echo $value['id']; ?>" value="<?php echo $option_value; ?>">
538
- </td>
539
- </tr><?php
540
-
541
- break;
542
-
543
- case 'wysiwyg':
544
-
545
- $option_value = self::get_option( $value['id'], $value['default'] );
546
-
547
- ?>
548
- <tr valign="top">
549
- <th scope="row" class="titledesc">
550
- <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
551
- <?php echo $tooltip_html; ?>
552
- </th>
553
- <td class="forminp">
554
- <?php wp_editor( $option_value, $value[ 'id' ], array( 'textarea_name' => $value['id'] ) ); ?>
555
- <?php echo $description;?>
556
- </td>
557
- </tr>
558
- <?php
559
-
560
-
561
- break;
562
-
563
- // Default: run an action
564
- default:
565
- do_action( 'wcvendors_admin_field_' . $value['type'], $value );
566
- break;
567
- }
568
- }
569
- }
570
-
571
- /**
572
- * Save admin fields.
573
- *
574
- * Loops though the options array and saves each field.
575
- *
576
- * @param array $options Options array to output
577
- * @param array $data Optional. Data to use for saving. Defaults to $_POST.
578
- * @return bool
579
- */
580
- public static function save_fields( $options, $data = null ) {
581
- if ( is_null( $data ) ) {
582
- $data = $_POST;
583
- }
584
- if ( empty( $data ) ) {
585
- return false;
586
- }
587
-
588
- // Options to update will be stored here and saved later.
589
- $update_options = array();
590
-
591
- // Loop options and get values to save.
592
- foreach ( $options as $option ) {
593
- if ( ! isset( $option['id'] ) || ! isset( $option['type'] ) ) {
594
- continue;
595
- }
596
-
597
- // Get posted value.
598
- if ( strstr( $option['id'], '[' ) ) {
599
- parse_str( $option['id'], $option_name_array );
600
- $option_name = current( array_keys( $option_name_array ) );
601
- $setting_name = key( $option_name_array[ $option_name ] );
602
- $raw_value = isset( $data[ $option_name ][ $setting_name ] ) ? wp_unslash( $data[ $option_name ][ $setting_name ] ) : null;
603
- } else {
604
- $option_name = $option['id'];
605
- $setting_name = '';
606
- $raw_value = isset( $data[ $option['id'] ] ) ? wp_unslash( $data[ $option['id'] ] ) : null;
607
- }
608
-
609
- // Format the value based on option type.
610
- switch ( $option['type'] ) {
611
- case 'checkbox' :
612
- $value = '1' === $raw_value || 'yes' === $raw_value ? 'yes' : 'no';
613
- break;
614
- case 'textarea' :
615
- $value = wp_kses_post( trim( $raw_value ) );
616
- break;
617
- case 'multiselect' :
618
- case 'multi_select_countries' :
619
- $value = array_filter( array_map( 'wc_clean', (array) $raw_value ) );
620
- break;
621
- case 'image_width' :
622
- $value = array();
623
- if ( isset( $raw_value['width'] ) ) {
624
- $value['width'] = wc_clean( $raw_value['width'] );
625
- $value['height'] = wc_clean( $raw_value['height'] );
626
- $value['crop'] = isset( $raw_value['crop'] ) ? 1 : 0;
627
- } else {
628
- $value['width'] = $option['default']['width'];
629
- $value['height'] = $option['default']['height'];
630
- $value['crop'] = $option['default']['crop'];
631
- }
632
- break;
633
- case 'thumbnail_cropping' :
634
- $value = wc_clean( $raw_value );
635
-
636
- if ( 'custom' === $value ) {
637
- $width_ratio = wc_clean( wp_unslash( $_POST['thumbnail_cropping_aspect_ratio_width'] ) );
638
- $height_ratio = wc_clean( wp_unslash( $_POST['thumbnail_cropping_aspect_ratio_height'] ) );
639
- $value = $width_ratio . ':' . $height_ratio;
640
- }
641
- break;
642
- case 'select':
643
- $allowed_values = empty( $option['options'] ) ? array() : array_keys( $option['options'] );
644
- if ( empty( $option['default'] ) && empty( $allowed_values ) ) {
645
- $value = null;
646
- break;
647
- }
648
- $default = ( empty( $option['default'] ) ? $allowed_values[0] : $option['default'] );
649
- $value = in_array( $raw_value, $allowed_values ) ? $raw_value : $default;
650
- break;
651
- case 'wysiwyg':
652
- $value = $raw_value;
653
- break;
654
- default :
655
- $value = wc_clean( $raw_value );
656
- break;
657
- }
658
-
659
- /**
660
- * Sanitize the value of an option.
661
- * @since 2.4.0
662
- */
663
- $value = apply_filters( 'wcvendors_admin_settings_sanitize_option', $value, $option, $raw_value );
664
-
665
- /**
666
- * Sanitize the value of an option by option name.
667
- * @since 2.4.0
668
- */
669
- $value = apply_filters( "wcvendors_admin_settings_sanitize_option_$option_name", $value, $option, $raw_value );
670
-
671
- if ( is_null( $value ) ) {
672
- continue;
673
- }
674
-
675
- // Check if option is an array and handle that differently to single values.
676
- if ( $option_name && $setting_name ) {
677
- if ( ! isset( $update_options[ $option_name ] ) ) {
678
- $update_options[ $option_name ] = get_option( $option_name, array() );
679
- }
680
- if ( ! is_array( $update_options[ $option_name ] ) ) {
681
- $update_options[ $option_name ] = array();
682
- }
683
- $update_options[ $option_name ][ $setting_name ] = $value;
684
- } else {
685
- $update_options[ $option_name ] = $value;
686
- }
687
-
688
- /**
689
- * Fire an action before saved.
690
- * @deprecated 2.4.0 - doesn't allow manipulation of values!
691
- */
692
- do_action( 'wcvendors_update_option', $option );
693
- }
694
-
695
- // Save all options in our array.
696
- foreach ( $update_options as $name => $value ) {
697
- update_option( $name, $value );
698
- }
699
-
700
- return true;
701
- }
702
-
703
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-wcv-admin-setup.php DELETED
@@ -1,309 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Admin setup
5
- *
6
- * @author Jamie Madden, WC Vendors
7
- * @category Admin
8
- * @package WCVendors/Admin
9
- * @version 2.0.0
10
- */
11
-
12
- if ( ! defined( 'ABSPATH' ) ) {
13
- exit;
14
- }
15
-
16
-
17
- class WCV_Admin_Setup {
18
-
19
- public function __construct() {
20
-
21
-
22
- // add_action( 'admin_menu', array( 'WCV_Admin_Setup', 'menu' ), 10 );
23
- add_action( 'woocommerce_admin_order_data_after_shipping_address', array( $this, 'add_vendor_details' ), 10, 2 );
24
- add_action( 'woocommerce_admin_order_actions_end', array( $this, 'append_actions' ), 10, 1 );
25
- add_filter( 'woocommerce_debug_tools', array( $this, 'wcvendors_tools' ) );
26
-
27
- add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ), 1 );
28
- add_action( 'admin_init', array( $this, 'export_commissions' ) );
29
- add_action( 'admin_init', array( $this, 'export_sum_commissions' ) );
30
- add_filter( 'woocommerce_screen_ids', array( $this, 'wcv_screen_ids' ) );
31
- add_action( 'wcvendors_update_options_capabilities', array( $this, 'update_vendor_role' ) );
32
-
33
- }
34
-
35
- public function add_vendor_details( $order )
36
- {
37
- $actions = $this->append_actions( $order, true );
38
-
39
- if (empty( $actions['wc_pv_shipped']['name'] )) {
40
- return;
41
- }
42
-
43
- echo '<h4>' . __('Vendors shipped', 'wc-vendors') . '</h4><br/>';
44
- echo $actions['wc_pv_shipped']['name'];
45
- }
46
-
47
- public function append_actions( $order, $order_page = false )
48
- {
49
- global $woocommerce;
50
-
51
- $order_id = $order->get_id();
52
-
53
- $authors = WCV_Vendors::get_vendors_from_order( $order );
54
- $authors = $authors ? array_keys( $authors ) : array();
55
- if ( empty( $authors ) ) return false;
56
-
57
- $shipped = (array) get_post_meta( $order_id, 'wc_pv_shipped', true );
58
- $string = '</br></br>';
59
-
60
- foreach ($authors as $author ) {
61
- $string .= in_array( $author, $shipped ) ? '&#10004; ' : '&#10005; ';
62
- $string .= WCV_Vendors::get_vendor_shop_name( $author );
63
- $string .= '</br>';
64
- }
65
-
66
- $response = array(
67
- 'url' => '#',
68
- 'name' => __('Vendors Shipped', 'wc-vendors') . $string,
69
- 'action' => 'wc_pv_shipped',
70
- 'image_url' => wcv_assets_url . '/images/icons/truck.png',
71
- );
72
-
73
- if ( ! $order_page ) {
74
- printf( '<a class="button tips %s" href="%s" data-tip="%s"><img style="width:16px;height:16px;" src="%s"></a>', $response['action'], $response['url'], $response['name'], $response['image_url'] );
75
- } else {
76
- echo $response['name'];
77
- }
78
-
79
- return $response;
80
- }
81
-
82
-
83
-
84
-
85
- /**
86
- * Add tools to the woocommerce status tools page
87
- *
88
- * @since 1.9.2
89
- * @access public
90
- */
91
- public function wcvendors_tools( $tools ){
92
-
93
- $tools[ 'reset_wcvendor_roles' ] = array(
94
- 'name' => __( 'Reset WC Vendors roles ', 'wc-vendors' ),
95
- 'button' => __( 'Reset WC Vendor Roles', 'wc-vendors' ),
96
- 'desc' => __( 'This will reset the wcvendors roles ( vendor & pending_vendor ), back to the default capabilities.', 'wc-vendors' ),
97
- 'callback' => array( 'WCV_Admin_Setup', 'reset_vendor_roles' )
98
- );
99
-
100
- $tools[ 'reset_wcvendors' ] = array(
101
- 'name' => __( 'Reset WC Vendors ', 'wc-vendors' ),
102
- 'button' => __( 'Reset WC Vendors Settings', 'wc-vendors' ),
103
- 'desc' => __( 'This will reset wcvendors back to defaults. This DELETES ALL YOUR Settings.', 'wc-vendors' ),
104
- 'callback' => array( 'WCV_Admin_Setup', 'reset_wcvendors' )
105
- );
106
-
107
- return $tools;
108
-
109
- } // wcvendors_tools()
110
-
111
- /**
112
- * Reset the vendor roles
113
- *
114
- * @since 1.9.2
115
- * @access public
116
- */
117
- public static function reset_vendor_roles(){
118
-
119
- $can_add = wc_string_to_bool( get_option( 'wcvendors_capability_products_enabled', 'no' ) );
120
- $can_edit = wc_string_to_bool( get_option( 'wcvendors_capability_products_edit', 'no' ) );
121
- $can_submit_live = wc_string_to_bool( get_option( 'wcvendors_capability_products_live', 'no' ) );
122
-
123
- $args = array(
124
- 'assign_product_terms' => $can_add,
125
- 'edit_products' => $can_add || $can_edit,
126
- 'edit_product' => $can_add || $can_edit,
127
- 'edit_published_products' => $can_edit,
128
- 'delete_published_products' => $can_edit,
129
- 'delete_products' => $can_edit,
130
- 'manage_product' => $can_add,
131
- 'publish_products' => $can_submit_live,
132
- 'delete_posts' => true,
133
- 'read' => true,
134
- 'read_products' => $can_edit || $can_add,
135
- 'upload_files' => true,
136
- 'import' => true,
137
- 'view_woocommerce_reports' => false,
138
- );
139
-
140
- remove_role( 'vendor' );
141
- add_role( 'vendor', sprintf( __('%s', 'wc-vendors'), wcv_get_vendor_name() ), $args );
142
-
143
- remove_role( 'pending_vendor');
144
- add_role(
145
- 'pending_vendor',
146
- sprintf( __( 'Pending %s', 'wc-vendors' ), wcv_get_vendor_name() ),
147
- array(
148
- 'read' => true,
149
- 'edit_posts' => false,
150
- 'delete_posts' => false
151
- ) );
152
-
153
- echo '<div class="updated inline"><p>' . __( 'WC Vendor roles successfully reset.', 'wc-vendors' ) . '</p></div>';
154
-
155
- } // reset_vendor_roles()
156
-
157
-
158
- /**
159
- * Reset wcvendors
160
- *
161
- * @since 1.9.2
162
- * @access public
163
- */
164
- public static function reset_wcvendors(){
165
-
166
- delete_option( WC_Vendors::$id . '_options' );
167
- echo '<div class="updated inline"><p>' . __( 'WC Vendors was successfully reset. All settings have been reset.', 'wc-vendors' ) . '</p></div>';
168
-
169
- } // reset_wcvendors()
170
-
171
-
172
-
173
- /*
174
- * Export commissions via csv
175
- */
176
- public function export_commissions(){
177
-
178
- // prepare the items to export
179
-
180
-
181
- if ( isset( $_GET['action'], $_GET['nonce'] ) && wp_verify_nonce( wp_unslash( $_GET['nonce'] ), 'export_commissions' ) && 'export_commissions' === wp_unslash( $_GET['action'] ) ) {
182
-
183
- include_once( 'class-wcv-commissions-csv-exporter.php' );
184
-
185
- $exporter = new WCV_Commissions_CSV_Export();
186
-
187
- $date = date( 'Y-M-d' );
188
-
189
- if ( ! empty( $_GET['com_status'] ) ) { // WPCS: input var ok.
190
- $exporter->set_filename( 'wcv_commissions_'. wp_unslash( $_GET['com_status'] ) . '-' . $date . '.csv' ); // WPCS: input var ok, sanitization ok.
191
- } else {
192
- $exporter->set_filename( 'wcv_commissions-' . $date . '.csv' ); // WPCS: input var ok, sanitization ok.
193
- }
194
-
195
- $exporter->export();
196
- }
197
-
198
- }
199
-
200
- /*
201
- * Export sum commissions via csv
202
- */
203
- public function export_sum_commissions(){
204
-
205
- // prepare the items to export
206
-
207
-
208
- if ( isset( $_GET['action'], $_GET['nonce'] ) && wp_verify_nonce( wp_unslash( $_GET['nonce'] ), 'export_commission_totals' ) && 'export_commission_totals' === wp_unslash( $_GET['action'] ) ) {
209
-
210
- include_once( 'class-wcv-commissions-sum-csv-exporter.php' );
211
-
212
- $exporter = new WCV_Commissions_Sum_CSV_Export();
213
-
214
- $date = date( 'Y-M-d' );
215
-
216
- if ( ! empty( $_GET['com_status'] ) ) { // WPCS: input var ok.
217
- $exporter->set_filename( 'wcv_commissions_sum_'. wp_unslash( $_GET['com_status'] ) . '-' . $date . '.csv' ); // WPCS: input var ok, sanitization ok.
218
- } else {
219
- $exporter->set_filename( 'wcv_commissions_sum-' . $date . '.csv' ); // WPCS: input var ok, sanitization ok.
220
- }
221
-
222
- $exporter->export();
223
- }
224
-
225
- }
226
-
227
-
228
- /**
229
- * Add wc vendors screens to woocommerce screen ids to utilise js and css assets from woocommerce.
230
- *
231
- * @since 2.0.0
232
- */
233
- public function wcv_screen_ids( $screen_ids ) {
234
-
235
- $screen = get_current_screen();
236
-
237
- $wcv_screen_ids = wcv_get_screen_ids();
238
- $screen_ids = array_merge( $wcv_screen_ids, $screen_ids );
239
-
240
- return $screen_ids;
241
- }
242
-
243
-
244
- /**
245
- * Change the admin footer text on WooCommerce admin pages.
246
- *
247
- * @since 2.0.0
248
- * @param string $footer_text
249
- * @return string
250
- */
251
- public function admin_footer_text( $footer_text ) {
252
-
253
- if ( ! current_user_can( 'manage_woocommerce' ) || ! function_exists( 'wcv_get_screen_ids' ) ) {
254
- return $footer_text;
255
- }
256
- $current_screen = get_current_screen();
257
- $wcv_pages = wcv_get_screen_ids();
258
-
259
- // Set only WC pages.
260
- // $wcv_pages = array_diff( $wcv_pages, array( 'profile', 'user-edit' ) );
261
-
262
- // Check to make sure we're on a WooCommerce admin page.
263
- if ( isset( $current_screen->id ) && apply_filters( 'wcvendors_display_admin_footer_text', in_array( $current_screen->id, $wcv_pages ) ) ) {
264
- // Change the footer text
265
- $footer_text = sprintf(
266
- /* translators: 1: WooCommerce 2:: five stars */
267
- __( 'If you like %1$s please leave us a %2$s rating. A huge thanks in advance!', 'wc-vendors' ),
268
- sprintf( '<strong>%s</strong>', esc_html__( 'WC Vendors', 'wc-vendors' ) ),
269
- '<a href="https://wordpress.org/support/plugin/wc-vendors/reviews?rate=5#new-post" target="_blank" class="wcv-rating-link" data-rated="' . esc_attr__( 'Thanks :)', 'wc-vendors' ) . '">&#9733;&#9733;&#9733;&#9733;&#9733;</a>'
270
- );
271
- }
272
-
273
- return $footer_text;
274
- }
275
-
276
- /**
277
- * Update the vendor role based on the capabilities saved.
278
- *
279
- */
280
- public function update_vendor_role( ){
281
-
282
- $can_add = wc_string_to_bool( get_option( 'wcvendors_capability_products_enabled', 'no' ) );
283
- $can_edit = wc_string_to_bool( get_option( 'wcvendors_capability_products_edit', 'no' ) );
284
- $can_submit_live = wc_string_to_bool( get_option( 'wcvendors_capability_products_live', 'no' ) );
285
-
286
- $args = array(
287
- 'assign_product_terms' => $can_add,
288
- 'edit_products' => $can_add || $can_edit,
289
- 'edit_product' => $can_add || $can_edit,
290
- 'edit_published_products' => $can_edit,
291
- 'delete_published_products' => $can_edit,
292
- 'delete_products' => $can_edit,
293
- 'delete_posts' => true,
294
- 'manage_product' => $can_add,
295
- 'publish_products' => $can_submit_live,
296
- 'read' => true,
297
- 'read_products' => $can_edit || $can_add,
298
- 'upload_files' => true,
299
- 'import' => true,
300
- 'view_woocommerce_reports' => false,
301
- );
302
-
303
- remove_role( 'vendor' );
304
- add_role( 'vendor', sprintf( __('%s', 'wc-vendors'), wcv_get_vendor_name() ), $args );
305
-
306
- }
307
-
308
-
309
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-wcv-commissions-csv-exporter.php DELETED
@@ -1,175 +0,0 @@
1
- <?php
2
- /**
3
- * Handles commission CSV export.
4
- *
5
- * @version 1.9.14
6
- */
7
-
8
- if ( ! defined( 'ABSPATH' ) ) {
9
- exit;
10
- }
11
-
12
- /**
13
- * Include dependencies.
14
- */
15
- if ( ! class_exists( 'WC_CSV_Exporter', false ) ) {
16
- include_once WC_ABSPATH . 'includes/export/abstract-wc-csv-exporter.php';
17
- }
18
-
19
- /**
20
- * WCV_Commissions_CSV_Export Class.
21
- */
22
- class WCV_Commissions_CSV_Export extends WC_CSV_Exporter {
23
-
24
- /**
25
- * Constructor.
26
- */
27
- public function __construct() {
28
- $this->column_names = $this->get_default_column_names();
29
- }
30
-
31
-
32
- /**
33
- * Return an array of columns to export.
34
- *
35
- * @since 1.9.14
36
- * @return array
37
- */
38
- public function get_default_column_names() {
39
-
40
- return apply_filters( 'wcv_commissions_export_columns', array(
41
- 'product_id' => __( 'Product', 'wc-vendors' ),
42
- 'order_id' => __( 'Order ID', 'wc-vendors' ),
43
- 'vendor_id' => sprintf( __( '%s', 'wc-vendors' ), wcv_get_vendor_name() ),
44
- 'total_due' => __( 'Commission', 'wc-vendors' ),
45
- 'total_shipping' => __( 'Shipping', 'wc-vendors' ),
46
- 'tax' => __( 'Tax', 'wc-vendors' ),
47
- 'totals' => __( 'Total', 'wc-vendors' ),
48
- 'status' => __( 'Status', 'wc-vendors' ),
49
- 'time' => __( 'Date', 'wc-vendors' ),
50
- ) );
51
- }
52
-
53
- /**
54
- * Prepare data for export.
55
- *
56
- * @since 1.9.14
57
- */
58
- public function prepare_data_to_export() {
59
-
60
- global $wpdb;
61
-
62
- $columns = $this->get_column_names();
63
-
64
- if ( ! current_user_can( 'manage_options' ) ) return;
65
-
66
- $orderby = !empty( $_REQUEST[ 'orderby' ] ) ? esc_attr( $_REQUEST[ 'orderby' ] ) : 'time';
67
- $order = ( !empty( $_REQUEST[ 'order' ] ) && $_REQUEST[ 'order' ] == 'asc' ) ? 'ASC' : 'DESC';
68
- $com_status = !empty( $_REQUEST[ 'com_status' ] ) ? esc_attr( $_REQUEST[ 'com_status' ] ) : '';
69
- $vendor_id = !empty( $_REQUEST[ 'vendor_id' ] ) ? esc_attr( $_REQUEST[ 'vendor_id' ] ) : '';
70
- $status_sql = '';
71
- $time_sql = '';
72
-
73
- /**
74
- * Get items
75
- */
76
- $sql = "SELECT COUNT(id) FROM {$wpdb->prefix}pv_commission";
77
-
78
- if ( !empty( $_GET[ 'm' ] ) ) {
79
-
80
- $year = substr( $_GET[ 'm' ], 0, 4 );
81
- $month = substr( $_GET[ 'm' ], 4, 2 );
82
-
83
- $time_sql = "
84
- WHERE MONTH(`time`) = '$month'
85
- AND YEAR(`time`) = '$year'
86
- ";
87
-
88
- $sql .= $time_sql;
89
- }
90
-
91
- if ( !empty( $_GET[ 'com_status' ] ) ) {
92
-
93
- if ( $time_sql == '' ) {
94
- $status_sql = "
95
- WHERE status = '$com_status'
96
- ";
97
- } else {
98
- $status_sql = "
99
- AND status = '$com_status'
100
- ";
101
- }
102
-
103
- $sql .= $status_sql;
104
- }
105
-
106
-
107
- if ( !empty( $_GET[ 'vendor_id' ] ) ) {
108
-
109
- if ( $time_sql == '' && $status_sql == '' ) {
110
- $vendor_sql = "
111
- WHERE vendor_id = '$vendor_id'
112
- ";
113
- } else {
114
- $vendor_sql = "
115
- AND vendor_id = '$vendor_id'
116
- ";
117
- }
118
-
119
- $sql .= $vendor_sql;
120
- }
121
-
122
- $max = $wpdb->get_var( $sql );
123
-
124
- $sql = "
125
- SELECT * FROM {$wpdb->prefix}pv_commission
126
- ";
127
-
128
- if ( !empty( $_GET[ 'm' ] ) ) {
129
- $sql .= $time_sql;
130
- }
131
-
132
- if ( !empty( $_GET['com_status'] ) ) {
133
- $sql .= $status_sql;
134
- }
135
-
136
- if ( !empty( $_GET['vendor_id'] ) ) {
137
- $sql .= $vendor_sql;
138
- }
139
-
140
- // $offset = ( $current_page - 1 ) * $per_page;
141
-
142
- $sql .= "
143
- ORDER BY `{$orderby}` {$order}
144
- ";
145
-
146
- $commissions = $wpdb->get_results( $sql );
147
-
148
- $this->total_rows = count( $commissions );
149
- $this->row_data = array();
150
-
151
- foreach ( $commissions as $commission ) {
152
-
153
- $row = array();
154
-
155
- foreach ( $columns as $column_id => $column_name ) {
156
-
157
- if ( $column_id == 'vendor_id' ) {
158
- $value = WCV_Vendors::get_vendor_shop_name( $commission->vendor_id );
159
- } elseif ( $column_id == 'totals' ){
160
- $totals = ( wc_tax_enabled() ) ? $commission->total_due + $commission->total_shipping + $commission->tax : $commission->total_due + $commission->total_shipping;
161
- $value = wc_format_localized_price( $totals );
162
- } else {
163
- $value = $commission->$column_id;
164
- }
165
-
166
-
167
-
168
- $row[ $column_id ] = $value;
169
- }
170
-
171
- $this->row_data[] = apply_filters( 'wcv_commissions_export_row_data', $row, $commission );
172
- }
173
-
174
- }
175
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-wcv-commissions-page.php DELETED
@@ -1,554 +0,0 @@
1
- <?php
2
-
3
- if ( !class_exists( 'WP_List_Table' ) ) require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php';
4
-
5
- /**
6
- * WCVendors_Commissions_Page class.
7
- *
8
- * @category Admin
9
- * @package WCVendors/Admin
10
- * @version 2.0.0
11
- * @extends WP_List_Table
12
- */
13
- class WCVendors_Commissions_Page extends WP_List_Table {
14
-
15
- public $index;
16
-
17
- /**
18
- * __construct function.
19
- *
20
- * @access public
21
- */
22
- public function __construct() {
23
- global $status, $page;
24
-
25
- $this->index = 0;
26
-
27
- //Set parent defaults
28
- parent::__construct( array(
29
- 'singular' => 'commission',
30
- 'plural' => 'commissions',
31
- 'ajax' => false
32
- ) );
33
- }
34
-
35
-
36
- /**
37
- * column_default function.
38
- *
39
- * @access public
40
- *
41
- * @param unknown $item
42
- * @param mixed $column_name
43
- *
44
- * @return unknown
45
- */
46
- public function column_default( $item, $column_name ) {
47
- global $wpdb;
48
-
49
- switch ( $column_name ) {
50
- case 'id' :
51
- return $item->id;
52
- case 'vendor_id' :
53
- $user = get_userdata( $item->vendor_id );
54
- return '<a href="' . admin_url( 'user-edit.php?user_id=' . $item->vendor_id ) . '">' . WCV_Vendors::get_vendor_shop_name( $item->vendor_id ) . '</a>';
55
- case 'total_due' :
56
- return wc_price( $item->total_due );
57
- case 'total_shipping':
58
- return wc_price($item->total_shipping );
59
- case 'tax':
60
- return wc_price( $item->tax );
61
- case 'totals' :
62
- $totals = ( wc_tax_enabled() ) ? $item->total_due + $item->total_shipping + $item->tax : $item->total_due + $item->total_shipping;
63
- return wc_price( $totals );
64
- case 'product_id' :
65
- $parent = get_post_ancestors( $item->product_id );
66
- $product_id = $parent ? $parent[ 0 ] : $item->product_id;
67
- $wcv_total_sales = get_post_meta( $product_id, 'total_sales', true );
68
- if ( ! get_post_status( $product_id ) ) {
69
- $product_id = WCV_Vendors::find_parent_id_from_order( $item->order_id, $product_id );
70
- }
71
- return '<a href="' . admin_url( 'post.php?post=' . $product_id . '&action=edit' ) . '">' . get_the_title( $product_id ) . '</a> (<span title="' . get_the_title( $product_id ) .' has sold ' . $wcv_total_sales . ' times total.">' . $wcv_total_sales . '</span>)';
72
- case 'order_id' :
73
- $order = wc_get_order( $item->order_id );
74
- if ( $order ) {
75
- return '<a href="' . admin_url( 'post.php?post=' . $item->order_id . '&action=edit' ) . '">' . $order->get_order_number() . '</a>';
76
- } else {
77
- return $item->order_id;
78
- }
79
- case 'status' :
80
- return $item->status;
81
- case 'time' :
82
- return date_i18n( get_option( 'date_format' ), strtotime( $item->time ) );
83
- }
84
- }
85
-
86
-
87
- /**
88
- * column_cb function.
89
- *
90
- * @access public
91
- *
92
- * @param mixed $item
93
- *
94
- * @return unknown
95
- */
96
- public function column_cb( $item ) {
97
- return sprintf(
98
- '<input type="checkbox" name="%1$s[]" value="%2$s" />',
99
- /*$1%s*/
100
- 'id',
101
- /*$2%s*/
102
- $item->id
103
- );
104
- }
105
-
106
-
107
- /**
108
- * get_columns function.
109
- *
110
- * @access public
111
- * @return unknown
112
- */
113
- public function get_columns() {
114
- $columns = array(
115
- 'cb' => '<input type="checkbox" />',
116
- 'product_id' => __( 'Product', 'wc-vendors' ),
117
- 'order_id' => __( 'Order ID', 'wc-vendors' ),
118
- 'vendor_id' => sprintf( __( '%s', 'wc-vendors' ), wcv_get_vendor_name() ),
119
- 'total_due' => __( 'Commission', 'wc-vendors' ),
120
- 'total_shipping' => __( 'Shipping', 'wc-vendors' ),
121
- 'tax' => __( 'Tax', 'wc-vendors' ),
122
- 'totals' => __( 'Total', 'wc-vendors' ),
123
- 'status' => __( 'Status', 'wc-vendors' ),
124
- 'time' => __( 'Date', 'wc-vendors' ),
125
- );
126
-
127
- if ( ! wc_tax_enabled() ) unset( $columns[ 'tax'] );
128
-
129
- return $columns;
130
- }
131
-
132
-
133
- /**
134
- * get_sortable_columns function.
135
- *
136
- * @access public
137
- * @return unknown
138
- */
139
- public function get_sortable_columns() {
140
- $sortable_columns = array(
141
- 'time' => array( 'time', true ),
142
- 'product_id' => array( 'product_id', false ),
143
- 'order_id' => array( 'order_id', false ),
144
- 'total_due' => array( 'total_due', false ),
145
- 'total_shipping' => array( 'total_shipping', false ),
146
- 'tax' => array( 'tax', false ),
147
- 'totals' => array( 'totals', false ),
148
- 'status' => array( 'status', false ),
149
- 'vendor_id' => array( 'vendor_id', false ),
150
- 'status' => array( 'status', false ),
151
- );
152
-
153
- if ( ! wc_tax_enabled() ) unset( $sortable_columns[ 'tax'] );
154
-
155
- return $sortable_columns;
156
- }
157
-
158
-
159
- /**
160
- * Get bulk actions
161
- *
162
- * @return unknown
163
- */
164
- public function get_bulk_actions() {
165
- $actions = array(
166
- 'mark_paid' => __( 'Mark paid', 'wc-vendors' ),
167
- 'mark_due' => __( 'Mark due', 'wc-vendors' ),
168
- 'mark_reversed' => __( 'Mark reversed', 'wc-vendors' ),
169
- // 'delete' => __('Delete', 'wc-vendors'),
170
- );
171
-
172
- $actions = apply_filters('wcv_edit_bulk_actions', $actions);
173
-
174
- return $actions;
175
- }
176
-
177
-
178
- /**
179
- *
180
- */
181
- public function extra_tablenav( $which ) {
182
- $m = isset( $_GET[ 'm' ] ) ? (int) $_GET[ 'm' ] : 0;
183
- $com_status = isset( $_GET[ 'com_status' ] ) ? $_GET[ 'com_status' ] : '';
184
- $vendor_id = isset( $_GET[ 'vendor_id' ] ) ? $_GET[ 'vendor_id' ] : '';
185
- $args_url = '';
186
-
187
- if ( $m ) $args_url .= '&m='. $m;
188
- if ( $com_status ) $args_url .= '&com_status='. $com_status;
189
- if ( $vendor_id ) $args_url .= '&vendor_id='. $vendor_id;
190
-
191
- if ( $which == 'top' ) {
192
- echo '<div class="alignleft actions" style="width: 70%;">';
193
-
194
- // Months drop down
195
- $this->months_dropdown( 'commission' );
196
-
197
- // commission status drop down
198
- $this->status_dropdown( 'commission' );
199
-
200
- // Vendor drop down
201
- $this->vendor_dropdown( 'commission' );
202
-
203
- submit_button( __( 'Filter', 'wc-vendors' ), false, false, false, array( 'id' => "post-query-submit", 'name' => 'do-filter' ) );
204
- submit_button( __( 'Clear', 'wc-vendors' ), 'secondary', 'reset', false, array( 'type' => 'reset' ) );
205
-
206
- echo '<a class="button" style="width: 110px; float: left;" href="' . wp_nonce_url( admin_url( 'admin.php?page=wcv-commissions&action=export_commissions'. $args_url ), 'export_commissions', 'nonce' ) . '">' . __('Export to CSV', 'wc-vendors' ) . '</a>';
207
- echo '<a class="button" style="width: 150px; float: left;" href="' . wp_nonce_url( admin_url( 'admin.php?page=wcv-commissions&action=export_commission_totals'. $args_url ), 'export_commission_totals', 'nonce' ) . '">' . __('Export Totals to CSV', 'wc-vendors' ) . '</a>';
208
- echo '</div>';
209
-
210
- }
211
- }
212
-
213
-
214
- /**
215
- * Display a monthly dropdown for filtering items
216
- *
217
- * @since 3.1.0
218
- * @access protected
219
- *
220
- * @param unknown $post_type
221
- */
222
- public function months_dropdown( $post_type )
223
- {
224
- global $wpdb, $wp_locale;
225
-
226
- $table_name = $wpdb->prefix . "pv_commission";
227
-
228
- $months = $wpdb->get_results( "
229
- SELECT DISTINCT YEAR( time ) AS year, MONTH( time ) AS month
230
- FROM $table_name
231
- ORDER BY time DESC
232
- " );
233
-
234
- $month_count = count( $months );
235
-
236
- if ( !$month_count || ( 1 == $month_count && 0 == $months[ 0 ]->month ) )
237
- return;
238
-
239
- $m = isset( $_GET[ 'm' ] ) ? (int) $_GET[ 'm' ] : 0;
240
- ?>
241
- <select name="m" id="filter-by-date" class="wc-enhanced-select-nostd" style="min-width:150px;">
242
- <option<?php selected( $m, 0 ); ?> value='0'><?php _e( 'Show all dates', 'wc-vendors' ); ?></option>
243
- <?php
244
- foreach ( $months as $arc_row ) {
245
- if ( 0 == $arc_row->year )
246
- continue;
247
-
248
- $month = zeroise( $arc_row->month, 2 );
249
- $year = $arc_row->year;
250
-
251
- printf( "<option %s value='%s'>%s</option>\n",
252
- selected( $m, $year . $month, false ),
253
- esc_attr( $arc_row->year . $month ),
254
- /* translators: 1: month name, 2: 4-digit year */
255
- sprintf( __( '%1$s %2$d' ), $wp_locale->get_month( $month ), $year )
256
- );
257
- }
258
- ?>
259
- </select>
260
-
261
- <?php
262
- }
263
-
264
- /**
265
- * Display a status dropdown for filtering items
266
- *
267
- * @since 3.1.0
268
- * @access protected
269
- *
270
- * @param unknown $post_type
271
- */
272
- public function status_dropdown( $post_type )
273
- {
274
- $com_status = isset( $_GET[ 'com_status' ] ) ? $_GET[ 'com_status' ] : '';
275
- ?>
276
- <select name="com_status" class="wc-enhanced-select">
277
- <option<?php selected( $com_status, '' ); ?> value=''><?php _e( 'Show all Statuses', 'wc-vendors' ); ?></option>
278
- <option<?php selected( $com_status, 'due' ); ?> value="due"><?php _e( 'Due', 'wc-vendors' ); ?></option>
279
- <option<?php selected( $com_status, 'paid' ); ?> value="paid"><?php _e( 'Paid', 'wc-vendors' ); ?></option>
280
- <option<?php selected( $com_status, 'reversed' ); ?> value="reversed"><?php _e( 'Reversed', 'wc-vendors' ); ?></option>
281
- </select>
282
- <?php
283
- }
284
-
285
- /**
286
- * Display a vendor dropdown for filtering commissions
287
- *
288
- * @since 1.9.2
289
- * @access public
290
- *
291
- * @param unknown $post_type
292
- */
293
- public function vendor_dropdown( $post_type ){
294
-
295
- $user_args = array( 'fields' => array( 'ID', 'display_name' ) );
296
- $vendor_id = isset( $_GET[ 'vendor_id' ] ) ? $_GET[ 'vendor_id' ] : '';
297
- $new_args = $user_args;
298
- $new_args[ 'role' ] = 'vendor';
299
- $users = get_users( $new_args );
300
-
301
- // Generate the drop down
302
- $output = '<select style="width:250px;" name="vendor_id" id="vendor_id" class="wc-enhanced-select">';
303
- $output .= "<option></option>";
304
- foreach ( (array) $users as $user ) {
305
- $select = selected( $user->ID, $vendor_id, false );
306
- $output .= "<option value='$user->ID' $select>$user->display_name</option>";
307
- }
308
- $output .= '</select>';
309
-
310
- echo $output;
311
-
312
- } // vendor_dropdown()
313
-
314
-
315
-
316
- /**
317
- * Process bulk actions
318
- *
319
- * @return unknown
320
- */
321
- public function process_bulk_action()
322
- {
323
- if ( !isset( $_GET[ 'id' ] ) ) return;
324
-
325
- $items = array_map( 'intval', $_GET[ 'id' ] );
326
- $ids = implode( ',', $items );
327
-
328
- switch ( $this->current_action() ) {
329
- case 'mark_paid':
330
- $result = $this->mark_paid( $ids );
331
-
332
- if ( $result )
333
- echo '<div class="updated"><p>' . __( 'Commission marked paid.', 'wc-vendors' ) . '</p></div>';
334
- break;
335
-
336
- case 'mark_due':
337
- $result = $this->mark_due( $ids );
338
-
339
- if ( $result )
340
- echo '<div class="updated"><p>' . __( 'Commission marked due.', 'wc-vendors' ) . '</p></div>';
341
- break;
342
-
343
- case 'mark_reversed':
344
- $result = $this->mark_reversed( $ids );
345
-
346
- if ( $result )
347
- echo '<div class="updated"><p>' . __( 'Commission marked reversed.', 'wc-vendors' ) . '</p></div>';
348
- break;
349
-
350
- default:
351
- // code...
352
- do_action('wcv_edit_process_bulk_actions', $this->current_action(), $ids);
353
- break;
354
- }
355
-
356
- }
357
-
358
-
359
- /**
360
- *
361
- *
362
- * @param unknown $ids (optional)
363
- *
364
- * @return unknown
365
- */
366
- public function mark_paid( $ids = array() )
367
- {
368
- global $wpdb;
369
-
370
- $table_name = $wpdb->prefix . "pv_commission";
371
-
372
- $query = "UPDATE `{$table_name}` SET `status` = 'paid' WHERE id IN ($ids) AND `status` = 'due'";
373
- $result = $wpdb->query( $query );
374
-
375
- return $result;
376
- }
377
-
378
-
379
- /**
380
- *
381
- *
382
- * @param unknown $ids (optional)
383
- *
384
- * @return unknown
385
- */
386
- public function mark_reversed( $ids = array() )
387
- {
388
- global $wpdb;
389
-
390
- $table_name = $wpdb->prefix . "pv_commission";
391
- $query = "UPDATE `{$table_name}` SET `status` = 'reversed' WHERE id IN ($ids)";
392
- $result = $wpdb->query( $query );
393
-
394
- return $result;
395
-
396
- }
397
-
398
-
399
- /**
400
- *
401
- *
402
- * @param unknown $ids (optional)
403
- *
404
- * @return unknown
405
- */
406
- public function mark_due( $ids = array() )
407
- {
408
- global $wpdb;
409
-
410
- $table_name = $wpdb->prefix . "pv_commission";
411
-
412
- $query = "UPDATE `{$table_name}` SET `status` = 'due' WHERE id IN ($ids)";
413
- $result = $wpdb->query( $query );
414
-
415
- return $result;
416
- }
417
-
418
-
419
- /**
420
- * cubrid_prepare(conn_identifier, prepare_stmt)_items function.
421
- *
422
- * @access public
423
- */
424
- public function prepare_items() {
425
- global $wpdb;
426
-
427
-
428
- $_SERVER['REQUEST_URI'] = remove_query_arg( '_wp_http_referer', $_SERVER['REQUEST_URI'] );
429
-
430
- $per_page = $this->get_items_per_page( 'commissions_per_page', 10 );
431
- $current_page = $this->get_pagenum();
432
-
433
- $orderby = !empty( $_REQUEST[ 'orderby' ] ) ? esc_attr( $_REQUEST[ 'orderby' ] ) : 'time';
434
- $order = ( !empty( $_REQUEST[ 'order' ] ) && $_REQUEST[ 'order' ] == 'asc' ) ? 'ASC' : 'DESC';
435
- $com_status = !empty( $_REQUEST[ 'com_status' ] ) ? esc_attr( $_REQUEST[ 'com_status' ] ) : '';
436
- $vendor_id = !empty( $_REQUEST[ 'vendor_id' ] ) ? esc_attr( $_REQUEST[ 'vendor_id' ] ) : '';
437
- $status_sql = '';
438
- $time_sql = '';
439
-
440
- /**
441
- * Init column headers
442
- */
443
- $this->_column_headers = $this->get_column_info();
444
-
445
- /**
446
- * Process bulk actions
447
- */
448
- $this->process_bulk_action();
449
-
450
- /**
451
- * Get items
452
- */
453
- $sql = "SELECT COUNT(id) FROM {$wpdb->prefix}pv_commission";
454
-
455
- if ( !empty( $_GET[ 'm' ] ) ) {
456
-
457
- $year = substr( $_GET[ 'm' ], 0, 4 );
458
- $month = substr( $_GET[ 'm' ], 4, 2 );
459
-
460
- $time_sql = "
461
- WHERE MONTH(`time`) = '$month'
462
- AND YEAR(`time`) = '$year'
463
- ";
464
-
465
- $sql .= $time_sql;
466
- }
467
-
468
- if ( !empty( $_GET[ 'com_status' ] ) ) {
469
-
470
- if ( $time_sql == '' ) {
471
- $status_sql = "
472
- WHERE status = '$com_status'
473
- ";
474
- } else {
475
- $status_sql = "
476
- AND status = '$com_status'
477
- ";
478
- }
479
-
480
- $sql .= $status_sql;
481
- }
482
-
483
-
484
- if ( !empty( $_GET[ 'vendor_id' ] ) ) {
485
-
486
- if ( $time_sql == '' && $status_sql == '' ) {
487
- $vendor_sql = "
488
- WHERE vendor_id = '$vendor_id'
489
- ";
490
- } else {
491
- $vendor_sql = "
492
- AND vendor_id = '$vendor_id'
493
- ";
494
- }
495
-
496
- $sql .= $vendor_sql;
497
- }
498
-
499
- $max = $wpdb->get_var( $sql );
500
-
501
- $sql = "
502
- SELECT * FROM {$wpdb->prefix}pv_commission
503
- ";
504
-
505
- if ( !empty( $_GET[ 'm' ] ) ) {
506
- $sql .= $time_sql;
507
- }
508
-
509
- if ( !empty( $_GET['com_status'] ) ) {
510
- $sql .= $status_sql;
511
- }
512
-
513
- if ( !empty( $_GET['vendor_id'] ) ) {
514
- $sql .= $vendor_sql;
515
- }
516
-
517
- $offset = ( $current_page - 1 ) * $per_page;
518
-
519
- $sql .= "
520
- ORDER BY `{$orderby}` {$order}
521
- LIMIT {$offset}, {$per_page}
522
- ";
523
-
524
- // $this->items = $wpdb->get_results( $wpdb->prepare( $sql, ( $current_page - 1 ) * $per_page, $per_page ) );
525
- $this->items = $wpdb->get_results( $sql );
526
-
527
- /**
528
- * Pagination
529
- */
530
- $this->set_pagination_args( array(
531
- 'total_items' => $max,
532
- 'per_page' => $per_page,
533
- 'total_pages' => ceil( $max / $per_page )
534
- ) );
535
- }
536
-
537
- /**
538
- * Get Views for commissions page
539
- *
540
- */
541
- public function get_views() {
542
- $views = array(
543
- 'all' => '<li class="all"><a href="' . admin_url( 'admin.php?page=wcv-commissions' ) . '">' . __( 'All', 'wc-vendors' ) . '</a></li>',
544
- 'due' => '<li class="all"><a href="' . admin_url( 'admin.php?page=wcv-commissions&com_status=due' ) . '">' . __( 'Due', 'wc-vendors' ) . '</a></li>',
545
- 'paid' => '<li class="all"><a href="' . admin_url( 'admin.php?page=wcv-commissions&com_status=paid' ) . '">' . __( 'Paid', 'wc-vendors' ) . '</a></li>',
546
- 'void' => '<li class="all"><a href="' . admin_url( 'admin.php?page=wcv-commissions&com_status=reversed' ) . '">' . __( 'Reversed', 'wc-vendors' ) . '</a></li>',
547
- );
548
-
549
- return $views;
550
- }
551
-
552
-
553
-
554
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/class-wcv-commissions-sum-csv-exporter.php DELETED
@@ -1,118 +0,0 @@
1
- <?php
2
- /**
3
- * Handles commission CSV export.
4
- *
5
- * @version 1.9.14
6
- */
7
-
8
- if ( ! defined( 'ABSPATH' ) ) {
9
- exit;
10
- }
11
-
12
- /**
13
- * Include dependencies.
14
- */
15
- if ( ! class_exists( 'WC_CSV_Exporter', false ) ) {
16
- include_once WC_ABSPATH . 'includes/export/abstract-wc-csv-exporter.php';
17
- }
18
-
19
- /**
20
- * WCV_Commissions_CSV_Export Class.
21
- */
22
- class WCV_Commissions_Sum_CSV_Export extends WC_CSV_Exporter {
23
-
24
- /**
25
- * Constructor.
26
- */
27
- public function __construct() {
28
- $this->column_names = $this->get_default_column_names();
29
- }
30
-
31
-
32
- /**
33
- * Return an array of columns to export.
34
- *
35
- * @since 1.9.14
36
- * @return array
37
- */
38
- public function get_default_column_names() {
39
-
40
- return apply_filters( 'wcv_commissions_sum_export_columns', array(
41
- 'vendor_id' => sprintf( __( '%s', 'wc-vendors' ), wcv_get_vendor_name() ),
42
- 'total_due' => __( 'Total', 'wc-vendors' ),
43
- 'paypal_email' => __( 'PayPal Email', 'wc-vendors' ),
44
- 'bank_account_name' => __( 'Bank Account Name', 'wc-vendors' ),
45
- 'bank_account_number' => __( 'Bank Account Number', 'wc-vendors' ),
46
- 'bank_name' => __( 'Bank Name', 'wc-vendors' ),
47
- 'bank_routing' => __( 'Routing Number', 'wc-vendors' ),
48
- 'bank_iban' => __( 'IBAN', 'wc-vendors' ),
49
- 'bank_swift' => __( 'BIC/SWIFT', 'wc-vendors' ),
50
- 'status' => __( 'Commission Status', 'wc-vendors' ),
51
- ) );
52
- }
53
-
54
- /**
55
- * Prepare data for export.
56
- *
57
- * @since 1.9.14
58
- */
59
- public function prepare_data_to_export() {
60
-
61
- global $wpdb;
62
-
63
- $columns = $this->get_column_names();
64
-
65
- if ( ! current_user_can( 'manage_options' ) ) return;
66
-
67
- $sum_totals = WCV_Commission::get_sum_vendor_totals();
68
- $this->total_rows = count( $sum_totals );
69
- $this->row_data = array();
70
-
71
- foreach ( $sum_totals as $status => $totals ) {
72
- $row = array();
73
- foreach ( $totals as $vendor_id => $total ) {
74
-
75
- foreach ( $columns as $column_id => $column_name ) {
76
-
77
- switch ( $column_id ) {
78
- case 'vendor_id':
79
- $value = WCV_Vendors::get_vendor_shop_name( $vendor_id );
80
- break;
81
- case 'paypal_email':
82
- $value = get_user_meta( $vendor_id, 'pv_paypal', 'true' );
83
- break;
84
- case 'bank_account_name':
85
- $value = get_user_meta( $vendor_id, 'wcv_bank_account_name', 'true' );
86
- break;
87
- case 'bank_account_number':
88
- $value = get_user_meta( $vendor_id, 'wcv_bank_account_number', 'true' );
89
- break;
90
- case 'bank_name':
91
- $value = get_user_meta( $vendor_id, 'wcv_bank_name', 'true' );
92
- break;
93
- case 'bank_routing':
94
- $value = get_user_meta( $vendor_id, 'wcv_bank_routing_number', 'true' );
95
- break;
96
- case 'bank_iban':
97
- $value = get_user_meta( $vendor_id, 'wcv_bank_iban', 'true' );
98
- break;
99
- case 'bank_swift':
100
- $value = get_user_meta( $vendor_id, 'wcv_bank_bic_swift', 'true' );
101
- break;
102
- case 'total_due':
103
- $value = wc_format_localized_price( $total );
104
- break;
105
- default:
106
- $value = $status;
107
- break;
108
- }
109
-
110
- $row[ $column_id ] = $value;
111
- }
112
-
113
- $this->row_data[] = apply_filters( 'wcv_sum_commissions_export_row_data', $row, $vendor_id, $total, $status );
114
- }
115
- }
116
-
117
- }
118
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-emails.php DELETED
@@ -1,316 +0,0 @@
1
- <?php
2
-
3
- if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
4
-
5
- /**
6
- *
7
- *
8
- * @author Matt Gates <http://mgates.me>
9
- * @package
10
- */
11
-
12
-
13
- class WCV_Emails
14
- {
15
-
16
-
17
- /**
18
- *
19
- */
20
- public function __construct() {
21
-
22
- add_filter( 'woocommerce_email_classes', array( $this, 'email_classes' ) );
23
- add_filter( 'woocommerce_order_actions', array( $this, 'order_actions' ) );
24
- add_action( 'woocommerce_order_action_send_vendor_new_order', array( $this, 'order_actions_save') );
25
- // Deprecaited
26
-
27
- add_action( 'set_user_role', array( $this, 'application_status_email' ), 10, 2 );
28
- add_action( 'transition_post_status', array( $this, 'trigger_new_product' ), 10, 3 );
29
-
30
- // Low stock
31
- // These fatal error in WC3.3.3 @todo fix !
32
- add_filter( 'woocommerce_email_recipient_low_stock', array( $this, 'vendor_stock_email'), 10, 2 );
33
- add_filter( 'woocommerce_email_recipient_no_stock', array( $this, 'vendor_stock_email'), 10, 2 );
34
- add_filter( 'woocommerce_email_recipient_backorder', array( $this, 'vendor_stock_email'), 10, 2 );
35
-
36
- // New emails
37
- // Triggers
38
- add_action( 'wcvendors_vendor_ship', array( $this, 'vendor_shipped' ), 10, 3 );
39
- add_action( 'wcvendors_email_order_details', array( $this, 'vendor_order_details'), 10, 8 );
40
- add_action( 'wcvendors_email_customer_details', array( $this, 'vendor_customer_details'), 10, 4 );
41
- add_action( 'set_user_role', array( $this, 'vendor_application' ), 10, 2 );
42
-
43
- // WooCommerce Product Enquiry Compatibility
44
- add_filter( 'product_enquiry_send_to', array( $this, 'product_enquiry_compatibility' ), 10, 2 );
45
-
46
- }
47
-
48
-
49
- // deprecated
50
- public function trigger_new_product( $from, $to, $post )
51
- {
52
- global $woocommerce;
53
-
54
- if ( $from != $to && $post->post_status == 'pending' && WCV_Vendors::is_vendor( $post->post_author ) && $post->post_type == 'product' ) {
55
- $mails = $woocommerce->mailer()->get_emails();
56
- if ( !empty( $mails ) ) {
57
- $mails[ 'WC_Email_Notify_Admin' ]->trigger( $post->post_id, $post );
58
- }
59
- }
60
- }
61
-
62
-
63
- /**
64
- * @deprecated
65
- *
66
- * @param unknown $user_id
67
- * @param unknown $role
68
- */
69
- public function application_status_email( $user_id, $role ) {
70
-
71
- global $woocommerce;
72
-
73
- if ( !empty( $_POST[ 'apply_for_vendor' ] ) || ( !empty( $_GET[ 'action' ] ) && ( $_GET[ 'action' ] == 'approve_vendor' || $_GET[ 'action' ] == 'deny_vendor' ) ) ) {
74
-
75
- if ( $role == 'pending_vendor' ) {
76
- $status = __( 'pending', 'wc-vendors' );
77
- } else if ( $role == 'vendor' ) {
78
- $status = __( 'approved', 'wc-vendors' );
79
- } else if ( !empty( $_GET[ 'action' ] ) && $_GET[ 'action' ] == 'deny_vendor' ) {
80
- $status = __( 'denied', 'wc-vendors' );
81
- }
82
-
83
- $mails = $woocommerce->mailer()->get_emails();
84
-
85
- if ( isset( $status ) && !empty( $mails ) ) {
86
- $mails[ 'WC_Email_Approve_Vendor' ]->trigger( $user_id, $status );
87
- }
88
- }
89
- }
90
-
91
- /**
92
- *
93
- *
94
- * @param unknown $emails
95
- *
96
- * @return unknown
97
- */
98
- public function email_classes( $emails ){
99
-
100
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wc-notify-admin.php';
101
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wc-notify-vendor.php';
102
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wc-approve-vendor.php';
103
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wc-notify-shipped.php';
104
-
105
- // Emails to depreciate
106
- $emails[ 'WC_Email_Notify_Vendor' ] = new WC_Email_Notify_Vendor();
107
- $emails[ 'WC_Email_Approve_Vendor' ] = new WC_Email_Approve_Vendor();
108
- $emails[ 'WC_Email_Notify_Admin' ] = new WC_Email_Notify_Admin();
109
- $emails[ 'WC_Email_Notify_Shipped' ] = new WC_Email_Notify_Shipped();
110
-
111
- // New emails introduced in @since 2.0.0
112
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wcv-customer-notify-shipped.php';
113
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wcv-admin-notify-shipped.php';
114
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wcv-admin-notify-product.php';
115
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wcv-admin-notify-application.php';
116
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wcv-vendor-notify-application.php';
117
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wcv-vendor-notify-approved.php';
118
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wcv-vendor-notify-denied.php';
119
- require_once wcv_plugin_dir . 'classes/admin/emails/class-wcv-vendor-notify-order.php';
120
-
121
- $emails[ 'WCVendors_Customer_Notify_Shipped'] = new WCVendors_Customer_Notify_Shipped();
122
- $emails[ 'WCVendors_Admin_Notify_Shipped'] = new WCVendors_Admin_Notify_Shipped();
123
- $emails[ 'WCVendors_Admin_Notify_Product'] = new WCVendors_Admin_Notify_Product();
124
- $emails[ 'WCVendors_Admin_Notify_Application'] = new WCVendors_Admin_Notify_Application();
125
- $emails[ 'WCVendors_Vendor_Notify_Application'] = new WCVendors_Vendor_Notify_Application();
126
- $emails[ 'WCVendors_Vendor_Notify_Approved'] = new WCVendors_Vendor_Notify_Approved();
127
- $emails[ 'WCVendors_Vendor_Notify_Denied'] = new WCVendors_Vendor_Notify_Denied();
128
- $emails[ 'WCVendors_Vendor_Notify_Order'] = new WCVendors_Vendor_Notify_Order();
129
-
130
- return $emails;
131
-
132
- } // email_classes()
133
-
134
- /**
135
- * Add the vendor email to the low stock emails.
136
- *
137
- */
138
- public function vendor_stock_email( $emails, $product ) {
139
-
140
- if ( ! is_a( $product, 'WC_Product' ) ) return;
141
-
142
- $post = get_post( $product->get_id() );
143
-
144
- if ( WCV_Vendors::is_vendor( $post->post_author ) ) {
145
- $vendor_data = get_userdata( $post->post_author );
146
- $vendor_email = $vendor_data->user_email;
147
- $emails .= ','.$vendor_email;
148
- }
149
-
150
- return $emails;
151
-
152
- }
153
-
154
- /**
155
- * Filter hook for order actions meta box
156
- *
157
- */
158
- public function order_actions( $order_actions ){
159
- $order_actions[ 'send_vendor_new_order' ] = sprintf( __( 'Resend %s new order notification', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
160
- return $order_actions;
161
- }
162
-
163
- /**
164
- * Action hook : trigger the notify vendor email
165
- *
166
- */
167
- public function order_actions_save( $order ){
168
- if ( ! is_a( $order, 'WC_Order' ) ) {
169
- $order = wc_get_order( $order );
170
- }
171
- WC()->mailer()->emails[ 'WC_Email_Notify_Vendor' ]->trigger( $order->get_id(), $order );
172
- WC()->mailer()->emails[ 'WCVendors_Vendor_Notify_Order' ]->trigger( $order->get_id(), $order );
173
- }
174
-
175
- /**
176
- * Trigger the notify vendor shipped emails
177
- *
178
- * @since 2.0.0
179
- */
180
- public function vendor_shipped( $order_id, $user_id, $order ){
181
- if ( ! is_a( $order, 'WC_Order' ) ) {
182
- $order = wc_get_order( $order_id );
183
- }
184
- // Notify the admin
185
- WC()->mailer()->emails[ 'WCVendors_Admin_Notify_Shipped' ]->trigger( $order->get_id(), $user_id, $order );
186
- // Notify the customer
187
- WC()->mailer()->emails[ 'WCVendors_Customer_Notify_Shipped' ]->trigger( $order->get_id(), $user_id, $order );
188
- }
189
-
190
-
191
- /**
192
- * Trigger the vendor application emails
193
- *
194
- * @since 2.0.0
195
- */
196
- public function vendor_application( $user_id, $role = "" ){
197
- /**
198
- * If the role is not given, set it according to the vendor approval option in admin
199
- */
200
- if ( $role == "" ) {
201
- $manual = wc_string_to_bool( get_option( 'wcvendors_vendor_approve_registration', 'no' ) );
202
- $role = apply_filters( 'wcvendors_pending_role', ( $manual ? 'pending_vendor' : 'vendor' ) );
203
- }
204
-
205
- if ( !empty( $_POST[ 'apply_for_vendor' ] ) || ( !empty( $_GET[ 'action' ] ) && ( $_GET[ 'action' ] == 'approve_vendor' || $_GET[ 'action' ] == 'deny_vendor' ) ) ) {
206
-
207
- $role = ( $role != 'pending_vendor' && $role != 'vendor' ) ? 'pending_vendor' : $role ;
208
-
209
- if ( $role == 'pending_vendor' ) {
210
- WC()->mailer()->emails[ 'WCVendors_Vendor_Notify_Application' ]->trigger( $user_id, __( 'pending', 'wc-vendors' ) );
211
- $status = __( 'pending', 'wc-vendors' );
212
- } else if ( $role == 'vendor' ) {
213
- WC()->mailer()->emails[ 'WCVendors_Vendor_Notify_Approved' ]->trigger( $user_id );
214
- $status = __( 'approved', 'wc-vendors' );
215
- } else if ( !empty( $_GET[ 'action' ] ) && $_GET[ 'action' ] == 'deny_vendor' ) {
216
- $reason = isset( $_GET[ 'reason' ] ) ? $_GET[ 'reason' ] : '';
217
- WC()->mailer()->emails[ 'WCVendors_Vendor_Notify_Denied' ]->trigger( $user_id, $reason );
218
- $status = __( 'denied', 'wc-vendors' );
219
- }
220
-
221
- WC()->mailer()->emails[ 'WCVendors_Admin_Notify_Application' ]->trigger( $user_id, $status );
222
-
223
- }
224
- }
225
-
226
-
227
- /*
228
- * Show the order details table filtered for each vendor
229
- */
230
- public function vendor_order_details( $order, $vendor_items, $totals_display, $vendor_id, $sent_to_vendor = false, $sent_to_admin = false, $plain_text = false, $email = '' ) {
231
-
232
-
233
- if ( $plain_text ) {
234
-
235
- wc_get_template( 'emails/plain/vendor-order-details.php', array(
236
- 'order' => $order,
237
- 'vendor_id' => $vendor_id,
238
- 'vendor_items' => $vendor_items,
239
- 'sent_to_admin' => $sent_to_admin,
240
- 'sent_to_vendor' => $sent_to_vendor,
241
- 'totals_display' => $totals_display,
242
- 'plain_text' => $plain_text,
243
- 'email' => $email ),
244
- 'woocommerce', WCV_TEMPLATE_BASE );
245
-
246
- } else {
247
-
248
- wc_get_template( 'emails/vendor-order-details.php', array(
249
- 'order' => $order,
250
- 'vendor_id' => $vendor_id,
251
- 'vendor_items' => $vendor_items,
252
- 'sent_to_admin' => $sent_to_admin,
253
- 'sent_to_vendor' => $sent_to_vendor,
254
- 'totals_display' => $totals_display,
255
- 'plain_text' => $plain_text,
256
- 'email' => $email ),
257
- 'woocommerce', WCV_TEMPLATE_BASE );
258
- }
259
- }
260
-
261
- /**
262
- * Show the customer address details based on the capabilities for the vendor
263
- */
264
- public function vendor_customer_details( $order, $sent_to_admin, $plain_text, $email ){
265
-
266
- $show_customer_name = wc_string_to_bool( get_option( 'wcvendors_capability_order_customer_name', 'no' ) );
267
- $show_customer_email = wc_string_to_bool( get_option( 'wcvendors_capability_order_customer_email', 'no' ) );
268
- $show_customer_phone = wc_string_to_bool( get_option( 'wcvendors_capability_order_customer_phone', 'no' ) );
269
- $show_billing_address = wc_string_to_bool( get_option( 'wcvendors_capability_order_customer_shipping', 'no' ) );
270
- $show_shipping_address = wc_string_to_bool( get_option( 'wcvendors_capability_order_customer_shipping', 'no' ) );
271
- $customer_name = $show_customer_name ? $order->get_formatted_billing_full_name() : '';
272
-
273
- if ( $plain_text ) {
274
- wc_get_template(
275
- 'emails/plain/vendor-order-addresses.php', array(
276
- 'show_customer_email' => $show_customer_email,
277
- 'show_customer_phone' => $show_customer_phone,
278
- 'show_billing_address' => $show_billing_address,
279
- 'show_shipping_address' => $show_shipping_address,
280
- 'show_customer_name' => $show_customer_name,
281
- 'customer_name' => $customer_name,
282
- 'order' => $order,
283
- 'sent_to_admin' => $sent_to_admin,
284
- ),
285
- 'woocommerce', WCV_TEMPLATE_BASE );
286
- } else {
287
- wc_get_template(
288
- 'emails/vendor-order-addresses.php', array(
289
- 'show_customer_email' => $show_customer_email,
290
- 'show_customer_phone' => $show_customer_phone,
291
- 'show_billing_address' => $show_billing_address,
292
- 'show_shipping_address' => $show_shipping_address,
293
- 'show_customer_name' => $show_customer_name,
294
- 'customer_name' => $customer_name,
295
- 'order' => $order,
296
- 'sent_to_admin' => $sent_to_admin,
297
- ),
298
- 'woocommerce', WCV_TEMPLATE_BASE );
299
- }
300
- }
301
-
302
-
303
- /**
304
- * WooCommerce Product Enquiry hook - Send email to vendor instead of admin
305
- */
306
- public function product_enquiry_compatibility( $send_to, $product_id ) {
307
- $author_id = get_post( $product_id )->post_author;
308
- if ( WCV_Vendors::is_vendor( $author_id ) ) {
309
- $send_to = get_userdata( $author_id )->user_email;
310
- }
311
-
312
- return $send_to;
313
- }
314
-
315
-
316
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wc-approve-vendor.php DELETED
@@ -1,165 +0,0 @@
1
- <?php
2
-
3
- if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
4
-
5
- /**
6
- * New Order Email
7
- *
8
- * An email sent to the admin when a new order is received/paid for.
9
- *
10
- * @class WC_Email_Approve_Vendor
11
- * @version 2.0.0
12
- * @extends WC_Email
13
- * @author WooThemes
14
- * @package WooCommerce/Classes/Emails
15
- */
16
-
17
-
18
- class WC_Email_Approve_Vendor extends WC_Email
19
- {
20
-
21
-
22
- /**
23
- * Constructor
24
- */
25
- function __construct()
26
- {
27
- $this->id = 'vendor_application';
28
- $this->title = sprintf( __( '%s Application - deprecated', 'wc-vendors' ), wcv_get_vendor_name() );
29
- $this->description = sprintf( __( '%s application will either be approved, denied, or pending. <strong>This email has been deprecated.</strong>', 'wc-vendors' ), wcv_get_vendor_name() );
30
-
31
- $this->heading = __( 'Application {status}', 'wc-vendors' );
32
- $this->subject = sprintf( __( '[{blogname}] Your %s application has been {status}', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
33
-
34
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/emails/';
35
- $this->template_html = 'application-status.php';
36
- $this->template_plain = 'application-status.php';
37
-
38
- // Call parent constuctor
39
- parent::__construct();
40
-
41
- // Other settings
42
- $this->recipient = $this->get_option( 'recipient' );
43
-
44
- if ( !$this->recipient )
45
- $this->recipient = get_option( 'admin_email' );
46
- }
47
-
48
- /**
49
- * trigger function.
50
- *
51
- * @access public
52
- * @return void
53
- *
54
- * @param unknown $order_id
55
- */
56
- function trigger( $user_id, $status )
57
- {
58
- if ( !$this->is_enabled() ) return;
59
-
60
- $this->find[ ] = '{status}';
61
- $this->replace[ ] = $status;
62
-
63
- $this->status = $status;
64
-
65
- $this->user = get_userdata( $user_id );
66
- $user_email = $this->user->user_email;
67
-
68
- $this->send( $user_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
69
-
70
- if ( $status == __( 'pending', 'wc-vendors' ) ) {
71
- $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
72
- }
73
- }
74
-
75
- /**
76
- * get_content_html function.
77
- *
78
- * @access public
79
- * @return string
80
- */
81
- function get_content_html()
82
- {
83
- ob_start();
84
- wc_get_template( $this->template_html, array(
85
- 'status' => $this->status,
86
- 'user' => $this->user,
87
- 'email_heading' => $this->get_heading()
88
- ), 'woocommerce', $this->template_base );
89
-
90
- return ob_get_clean();
91
- }
92
-
93
-
94
- /**
95
- * get_content_plain function.
96
- *
97
- * @access public
98
- * @return string
99
- */
100
- function get_content_plain()
101
- {
102
- ob_start();
103
- wc_get_template( $this->template_plain, array(
104
- 'status' => $this->status,
105
- 'user' => $this->user,
106
- 'email_heading' => $this->get_heading()
107
- ), 'woocommerce', $this->template_base );
108
-
109
- return ob_get_clean();
110
- }
111
-
112
-
113
- /**
114
- * Initialise Settings Form Fields
115
- *
116
- * @access public
117
- * @return void
118
- */
119
- function init_form_fields()
120
- {
121
- $this->form_fields = array(
122
- 'enabled' => array(
123
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
124
- 'type' => 'checkbox',
125
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
126
- 'default' => 'no'
127
- ),
128
- 'recipient' => array(
129
- 'title' => __( 'Recipient(s)', 'woocommerce' ),
130
- 'type' => 'text',
131
- 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to <code>%s</code>.', 'wc-vendors' ), esc_attr( get_option( 'admin_email' ) ) ),
132
- 'placeholder' => '',
133
- 'default' => ''
134
- ),
135
- 'subject' => array(
136
- 'title' => __( 'Subject', 'wc-vendors' ),
137
- 'type' => 'text',
138
- 'description' => sprintf( __( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', 'wc-vendors' ), $this->subject ),
139
- 'placeholder' => '',
140
- 'default' => ''
141
- ),
142
- 'heading' => array(
143
- 'title' => __( 'Email Heading', 'wc-vendors' ),
144
- 'type' => 'text',
145
- 'description' => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.', 'wc-vendors' ), $this->heading ),
146
- 'placeholder' => '',
147
- 'default' => ''
148
- ),
149
- 'email_type' => array(
150
- 'title' => __( 'Email type', 'wc-vendors' ),
151
- 'type' => 'select',
152
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
153
- 'default' => 'html',
154
- 'class' => 'email_type',
155
- 'options' => array(
156
- 'plain' => __( 'Plain text', 'wc-vendors' ),
157
- 'html' => __( 'HTML', 'wc-vendors' ),
158
- 'multipart' => __( 'Multipart', 'wc-vendors' ),
159
- )
160
- )
161
- );
162
- }
163
-
164
-
165
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wc-notify-admin.php DELETED
@@ -1,176 +0,0 @@
1
- <?php
2
-
3
- if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
4
-
5
- /**
6
- * New Order Email
7
- *
8
- * An email sent to the admin when a new product is created.
9
- *
10
- * @class WC_Email_Notify_Admin
11
- * @version 2.0.0
12
- * @extends WC_Email
13
- * @author WooThemes
14
- * @package WooCommerce/Classes/Emails
15
- */
16
-
17
-
18
- class WC_Email_Notify_Admin extends WC_Email
19
- {
20
-
21
-
22
- /**
23
- * Constructor
24
- */
25
- function __construct()
26
- {
27
- $this->id = 'admin_new_vendor_product';
28
- $this->title = sprintf( __( 'New %s Product - deprecated', 'wc-vendors' ), wcv_get_vendor_name() );
29
- $this->description = sprintf( __( 'New order emails are sent when a new product is submitted by a %s. <strong>This email has been depreciated.</strong>', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
30
-
31
- $this->heading = __( 'New product submitted: {product_name}', 'wc-vendors' );
32
- $this->subject = __( '[{blogname}] New product submitted by {vendor_name} - {product_name}', 'wc-vendors' );
33
-
34
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/emails/';
35
- $this->template_html = 'new-product.php';
36
- $this->template_plain = 'new-product.php';
37
-
38
- // Triggers for this email
39
- add_action( 'pending_product', array( $this, 'trigger' ), 10, 2 );
40
- add_action( 'pending_product_variation', array( $this, 'trigger' ), 10, 2 );
41
-
42
- // Call parent constuctor
43
- parent::__construct();
44
-
45
- // Other settings
46
- $this->recipient = $this->get_option( 'recipient' );
47
-
48
- if ( !$this->recipient )
49
- $this->recipient = get_option( 'admin_email' );
50
- }
51
-
52
-
53
- /**
54
- * trigger function.
55
- *
56
- * @access public
57
- * @return void
58
- *
59
- * @param unknown $order_id
60
- */
61
- function trigger( $id, $post )
62
- {
63
-
64
- // Ensure that the post author is a vendor
65
- if ( !WCV_Vendors::is_vendor( $post->post_author ) ) {
66
- return;
67
- }
68
-
69
- if ( !$this->is_enabled() ) return;
70
-
71
- $this->find[ ] = '{product_name}';
72
- $this->product_name = $post->post_title;
73
- $this->replace[ ] = $this->product_name;
74
-
75
- $this->find[ ] = '{vendor_name}';
76
- $this->vendor_name = WCV_Vendors::get_vendor_shop_name( $post->post_author );
77
- $this->replace[ ] = $this->vendor_name;
78
-
79
- $this->post_id = $post->ID;
80
-
81
- $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
82
- }
83
-
84
- /**
85
- * get_content_html function.
86
- *
87
- * @access public
88
- * @return string
89
- */
90
- function get_content_html()
91
- {
92
- ob_start();
93
- wc_get_template( $this->template_html, array(
94
- 'product_name' => $this->product_name,
95
- 'vendor_name' => $this->vendor_name,
96
- 'post_id' => $this->post_id,
97
- 'email_heading' => $this->get_heading()
98
- ), 'woocommerce', $this->template_base );
99
-
100
- return ob_get_clean();
101
- }
102
-
103
-
104
- /**
105
- * get_content_plain function.
106
- *
107
- * @access public
108
- * @return string
109
- */
110
- function get_content_plain()
111
- {
112
- ob_start();
113
- wc_get_template( $this->template_plain, array(
114
- 'product_name' => $this->product_name,
115
- 'vendor_name' => $this->vendor_name,
116
- 'post_id' => $this->post_id,
117
- 'email_heading' => $this->get_heading()
118
- ), 'woocommerce', $this->template_base );
119
-
120
- return ob_get_clean();
121
- }
122
-
123
-
124
- /**
125
- * Initialise Settings Form Fields
126
- *
127
- * @access public
128
- * @return void
129
- */
130
- function init_form_fields()
131
- {
132
- $this->form_fields = array(
133
- 'enabled' => array(
134
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
135
- 'type' => 'checkbox',
136
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
137
- 'default' => 'no'
138
- ),
139
- 'recipient' => array(
140
- 'title' => __( 'Recipient(s)', 'woocommerce' ),
141
- 'type' => 'text',
142
- 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to <code>%s</code>.', 'wc-vendors' ), esc_attr( get_option( 'admin_email' ) ) ),
143
- 'placeholder' => '',
144
- 'default' => ''
145
- ),
146
- 'subject' => array(
147
- 'title' => __( 'Subject', 'wc-vendors' ),
148
- 'type' => 'text',
149
- 'description' => sprintf( __( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', 'wc-vendors' ), $this->subject ),
150
- 'placeholder' => '',
151
- 'default' => ''
152
- ),
153
- 'heading' => array(
154
- 'title' => __( 'Email Heading', 'wc-vendors' ),
155
- 'type' => 'text',
156
- 'description' => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.', 'wc-vendors' ), $this->heading ),
157
- 'placeholder' => '',
158
- 'default' => ''
159
- ),
160
- 'email_type' => array(
161
- 'title' => __( 'Email type', 'wc-vendors' ),
162
- 'type' => 'select',
163
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
164
- 'default' => 'html',
165
- 'class' => 'email_type',
166
- 'options' => array(
167
- 'plain' => __( 'Plain text', 'wc-vendors' ),
168
- 'html' => __( 'HTML', 'wc-vendors' ),
169
- 'multipart' => __( 'Multipart', 'wc-vendors' ),
170
- )
171
- )
172
- );
173
- }
174
-
175
-
176
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wc-notify-shipped.php DELETED
@@ -1,201 +0,0 @@
1
- <?php
2
-
3
- if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
4
-
5
- /**
6
- * New Order Email
7
- *
8
- * An email sent to the admin when a new product is created.
9
- *
10
- * @class WC_Email_Notify_Shipped
11
- * @version 2.0.0
12
- * @extends WC_Email
13
- * @author WooThemes
14
- * @package WooCommerce/Classes/Emails
15
- */
16
-
17
-
18
- class WC_Email_Notify_Shipped extends WC_Email
19
- {
20
-
21
-
22
- /**
23
- * Constructor
24
- */
25
- function __construct()
26
- {
27
- $this->id = 'vendor_notify_shipped';
28
- $this->title = sprintf( __( '%s has shipped - deprecated', 'wc-vendors' ), wcv_get_vendor_name() );
29
- $this->description = sprintf( __( 'An email is sent when a %s has marked one of their orders as shipped. <strong>This email has been deprecated.</strong>', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
30
-
31
- $this->heading = __( 'Your order has been shipped', 'wc-vendors' );
32
- $this->subject = __( '[{blogname}] Your order has been shipped ({order_number}) - {order_date}', 'wc-vendors' );
33
-
34
- $this->template_html = 'notify-vendor-shipped.php';
35
- $this->template_plain = 'notify-vendor-shipped.php';
36
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/emails/';
37
-
38
- // Call parent constuctor
39
- parent::__construct();
40
- }
41
-
42
-
43
- /**
44
- * trigger function.
45
- *
46
- * @access public
47
- * @return void
48
- *
49
- * @param unknown $order_id
50
- */
51
- function trigger( $order_id, $vendor_id )
52
- {
53
- $this->object = wc_get_order( $order_id );
54
- $this->current_vendor = $vendor_id;
55
- $order_date = $this->object->get_date_created();
56
-
57
- $this->find[ ] = '{order_date}';
58
- $this->replace[ ] = date_i18n( wc_date_format(), strtotime( $order_date ) );
59
-
60
- $this->find[ ] = '{order_number}';
61
- $this->replace[ ] = $this->object->get_order_number();
62
-
63
- $billing_email = $this->object->get_billing_email();
64
-
65
- if ( !$this->is_enabled() ) return;
66
-
67
- add_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );
68
- add_filter( 'woocommerce_get_order_item_totals', array( $this, 'check_order_totals' ), 10, 2 );
69
- $this->send( $billing_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
70
- remove_filter( 'woocommerce_get_order_item_totals', array( $this, 'check_order_totals' ), 10, 2 );
71
- remove_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );
72
- }
73
-
74
-
75
- /**
76
- *
77
- *
78
- * @param unknown $items
79
- * @param unknown $order
80
- *
81
- * @return unknown
82
- */
83
- public function check_items( $items, $order )
84
- {
85
- foreach ( $items as $key => $product ) {
86
-
87
- if ( empty( $product[ 'product_id' ] ) ) {
88
- unset( $items[ $key ] );
89
- continue;
90
- }
91
-
92
- $author = WCV_Vendors::get_vendor_from_product( $product[ 'product_id' ] );
93
-
94
- if ( $this->current_vendor != $author ) {
95
- unset( $items[ $key ] );
96
- continue;
97
- }
98
-
99
- }
100
-
101
- return $items;
102
- }
103
-
104
- /**
105
- *
106
- *
107
- * @param unknown $total_rows
108
- * @param unknown $order
109
- *
110
- * @return unknown
111
- */
112
- public function check_order_totals( $total_rows, $order )
113
- {
114
- $return[ 'cart_subtotal' ] = $total_rows[ 'cart_subtotal' ];
115
- $return[ 'cart_subtotal' ][ 'label' ] = __( 'Subtotal:', 'wc-vendors' );
116
-
117
- return $return;
118
- }
119
-
120
- /**
121
- * get_content_html function.
122
- *
123
- * @access public
124
- * @return string
125
- */
126
- function get_content_html()
127
- {
128
- ob_start();
129
- wc_get_template( $this->template_html, array(
130
- 'order' => $this->object,
131
- 'email_heading' => $this->get_heading()
132
- ), 'woocommerce/emails', $this->template_base );
133
-
134
- return ob_get_clean();
135
- }
136
-
137
-
138
- /**
139
- * get_content_plain function.
140
- *
141
- * @access public
142
- * @return string
143
- */
144
- function get_content_plain()
145
- {
146
- ob_start();
147
- wc_get_template( $this->template_plain, array(
148
- 'order' => $this->object,
149
- 'email_heading' => $this->get_heading()
150
- ), 'woocommerce/emails', $this->template_base );
151
-
152
- return ob_get_clean();
153
- }
154
-
155
-
156
- /**
157
- * Initialise Settings Form Fields
158
- *
159
- * @access public
160
- * @return void
161
- */
162
- function init_form_fields()
163
- {
164
- $this->form_fields = array(
165
- 'enabled' => array(
166
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
167
- 'type' => 'checkbox',
168
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
169
- 'default' => 'no'
170
- ),
171
- 'subject' => array(
172
- 'title' => __( 'Subject', 'wc-vendors' ),
173
- 'type' => 'text',
174
- 'description' => sprintf( __( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', 'wc-vendors' ), $this->subject ),
175
- 'placeholder' => '',
176
- 'default' => ''
177
- ),
178
- 'heading' => array(
179
- 'title' => __( 'Email Heading', 'wc-vendors' ),
180
- 'type' => 'text',
181
- 'description' => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.', 'wc-vendors' ), $this->heading ),
182
- 'placeholder' => '',
183
- 'default' => ''
184
- ),
185
- 'email_type' => array(
186
- 'title' => __( 'Email type', 'wc-vendors' ),
187
- 'type' => 'select',
188
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
189
- 'default' => 'html',
190
- 'class' => 'email_type',
191
- 'options' => array(
192
- 'plain' => __( 'Plain text', 'wc-vendors' ),
193
- 'html' => __( 'HTML', 'wc-vendors' ),
194
- 'multipart' => __( 'Multipart', 'wc-vendors' ),
195
- )
196
- )
197
- );
198
- }
199
-
200
-
201
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wc-notify-vendor.php DELETED
@@ -1,355 +0,0 @@
1
- <?php
2
-
3
- if ( !defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
4
-
5
- /**
6
- * New Order Email
7
- *
8
- * An email sent to the vendor when a new order is received/paid for.
9
- *
10
- * @class WC_Email_Notify_Vendor
11
- * @version 2.0.0
12
- * @extends WC_Email
13
- * @author WooThemes
14
- * @package WooCommerce/Classes/Emails
15
- */
16
-
17
-
18
- class WC_Email_Notify_Vendor extends WC_Email
19
- {
20
-
21
- /**
22
- * Constructor
23
- */
24
- function __construct()
25
- {
26
- $this->id = 'vendor_new_order';
27
- $this->title = __( 'Notify vendors - deprecated', 'wc-vendors' );
28
- $this->description = __( 'New order emails are sent when an order is received/paid by a customer. <strong>This email has been deprecated.</strong>', 'wc-vendors' );
29
-
30
- $this->heading = __( 'New customer order', 'wc-vendors' );
31
- $this->subject = __( '[{blogname}] New customer order ({order_number}) - {order_date}', 'wc-vendors' );
32
-
33
- $this->template_html = 'vendor-new-order.php';
34
- $this->template_plain = 'vendor-new-order.php';
35
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/emails/';
36
-
37
- // Triggers for this email
38
- add_action( 'woocommerce_order_status_pending_to_processing_notification', array( $this, 'trigger' ) );
39
- add_action( 'woocommerce_order_status_pending_to_completed_notification', array( $this, 'trigger' ) );
40
- add_action( 'woocommerce_order_status_failed_to_processing_notification', array( $this, 'trigger' ) );
41
- add_action( 'woocommerce_order_status_failed_to_completed_notification', array( $this, 'trigger' ) );
42
- add_action( 'woocommerce_order_status_on-hold_to_processing_notification', array( $this, 'trigger' ) ); // Added in 1.8.4
43
- add_action( 'woocommerce_order_status_on-hold_to_completed_notification', array( $this, 'trigger' ) ); // Added in 1.8.4
44
-
45
- // Call parent constuctor
46
- parent::__construct();
47
- }
48
-
49
-
50
- /**
51
- * trigger function.
52
- *
53
- * @access public
54
- * @return void
55
- *
56
- * @param unknown $order_id
57
- */
58
- function trigger( $order_id )
59
- {
60
- global $woocommerce;
61
-
62
- if ( $order_id ) {
63
- $this->object = wc_get_order( $order_id );
64
-
65
- $order_date = $this->object->get_date_created();
66
-
67
- $this->find[ ] = '{order_date}';
68
- $this->replace[ ] = date_i18n( wc_date_format(), strtotime( $order_date ) );
69
-
70
- $this->find[ ] = '{order_number}';
71
- $this->replace[ ] = $this->object->get_order_number();
72
-
73
- }
74
-
75
- if ( !$this->is_enabled() ) return;
76
-
77
- $vendors = $this->get_vendors( $this->object );
78
-
79
- if ( empty( $vendors ) ) return;
80
-
81
- add_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );
82
- add_filter( 'woocommerce_get_order_item_totals', array( $this, 'check_order_totals' ), 10, 2 );
83
- add_filter( 'woocommerce_order_formatted_line_subtotal', array( $this, 'check_order_formatted_line_subtotal' ), 10, 3 );
84
- add_filter( 'woocommerce_order_subtotal_to_display', array( $this, 'check_order_subtotal_to_display'), 10, 3 );
85
- foreach ( $vendors as $user_id => $user_email ) {
86
- $this->current_vendor = $user_id;
87
- $this->send( $user_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
88
- }
89
- remove_filter( 'woocommerce_get_order_item_totals', array( $this, 'check_order_totals' ), 10, 2 );
90
- remove_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );
91
- remove_filter( 'woocommerce_order_formatted_line_subtotal', array( $this, 'check_order_formatted_line_subtotal' ), 10, 3 );
92
- remove_filter( 'woocommerce_order_subtotal_to_display', array( $this, 'check_order_subtotal_to_display'), 10, 3 );
93
- }
94
-
95
-
96
- /**
97
- *
98
- *
99
- * @param unknown $total_rows
100
- * @param unknown $order
101
- *
102
- * @return unknown
103
- */
104
- function check_order_totals( $total_rows, $order )
105
- {
106
-
107
- $commission_label = apply_filters('wcv_notify_vendor_commission_label', __( 'Commission Subtotal:', 'wc-vendors' ) ) ;
108
- $return[ 'cart_subtotal' ] = $total_rows[ 'cart_subtotal' ];
109
- $return[ 'cart_subtotal' ][ 'label' ] = $commission_label;
110
-
111
- if ( wc_string_to_bool( get_option( 'wcvendors_vendor_give_taxes', 'no' ) ) ) {
112
- $return[ 'tax_subtotal'] = array( 'label' => '', 'value' => '');
113
- $return[ 'tax_subtotal']['label'] = apply_filters('wcv_notify_vendor_tax_label', __( 'Tax Subtotal:', 'wc-vendors' ) ) ;
114
- }
115
-
116
- $dues = WCV_Vendors::get_vendor_dues_from_order( $order );
117
-
118
- foreach ( $dues as $due ) {
119
- if ( $this->current_vendor == $due['vendor_id'] ) {
120
- if (!empty($return[ 'shipping' ])) $return[ 'shipping' ] = $total_rows[ 'shipping' ];
121
- $return[ 'shipping' ]['label'] = __( 'Shipping Subtotal:', 'wc-vendors' );
122
- $return[ 'shipping' ][ 'value' ] = wc_price( $due['shipping'] );
123
- if ( get_option( 'wcvendors_vendor_give_taxes' ) ) {
124
- $return[ 'tax_subtotal']['value'] += (float) $due['tax'];
125
- }
126
- break;
127
- }
128
- }
129
- // Format tax price
130
- if ( wc_string_to_bool( get_option( 'wcvendors_vendor_give_taxes', 'no' ) ) ){
131
- $return[ 'tax_subtotal']['value'] = wc_price( $return[ 'tax_subtotal'] ['value'] );
132
- }
133
-
134
- return $return;
135
- }
136
-
137
-
138
- /**
139
- *
140
- *
141
- * @param unknown $order
142
- *
143
- * @return unknown
144
- */
145
- public function get_vendors( $order )
146
- {
147
- $items = $order->get_items();
148
- $vendors = array();
149
-
150
- foreach ( $items as $key => $product ) {
151
-
152
- if ( empty( $product[ 'product_id' ] ) ) continue;
153
- $author = WCV_Vendors::get_vendor_from_product( $product[ 'product_id' ] );
154
-
155
- // Only store the vendor authors
156
- if ( !WCV_Vendors::is_vendor( $author ) ) {
157
- unset( $items[ $key ] );
158
- continue;
159
- }
160
-
161
- $vendors[ $author ] = get_userdata( $author )->user_email;
162
- }
163
-
164
- return $vendors;
165
- }
166
-
167
- /**
168
- *
169
- *
170
- * @param unknown $items
171
- * @param unknown $order
172
- *
173
- * @return unknown
174
- */
175
- function check_items( $items, $order )
176
- {
177
-
178
- $settings = get_option( 'woocommerce_vendor_new_order_settings' );
179
-
180
- if ( empty( $settings ) ) $settings = $this->get_default_settings();
181
-
182
- foreach ( $items as $key => $product ) {
183
-
184
- // If this is a line item
185
- if ( $product['type'] == 'line_item' ) {
186
-
187
- $author = WCV_Vendors::get_vendor_from_product( $product[ 'product_id' ] );
188
-
189
- if ( $this->current_vendor != $author) {
190
- unset( $items[ $key ] );
191
- continue;
192
- } else {
193
-
194
- // If display commission is ticked show this otherwise show the full price.
195
- if ( 'yes' == $settings[ 'commission_display' ] ){
196
-
197
- $order_id = $order->get_id();
198
-
199
- // Get correct product_id depending on which product type
200
- $product_id = !empty( $product['variation_id'] ) ? $product['variation_id'] : $product['product_id'];
201
-
202
- $commission_due = WCV_Commission::get_commission_due( $order_id, $product_id, $author );
203
-
204
- $items[ $key ][ 'line_subtotal' ] = $commission_due;
205
- $items[ $key ][ 'line_total' ] = $commission_due;
206
-
207
- // Don't display tax if give tax is not enabled.
208
- if ( !get_option( 'wcvendors_vendor_give_taxes' ) ) {
209
- unset($items[ $key ][ 'line_tax' ]) ;
210
- }
211
- }
212
- }
213
- }
214
-
215
- }
216
-
217
- return $items;
218
-
219
- } // check_items()
220
-
221
-
222
- /**
223
- * get_content_html function.
224
- *
225
- * @access public
226
- * @return string
227
- */
228
- function get_content_html()
229
- {
230
- ob_start();
231
- wc_get_template( $this->template_html, array(
232
- 'order' => $this->object,
233
- 'email_heading' => $this->get_heading()
234
- ), 'woocommerce', $this->template_base );
235
-
236
- return ob_get_clean();
237
- }
238
-
239
-
240
- /**
241
- * get_content_plain function.
242
- *
243
- * @access public
244
- * @return string
245
- */
246
- function get_content_plain()
247
- {
248
- ob_start();
249
- wc_get_template( $this->template_plain, array(
250
- 'order' => $this->object,
251
- 'email_heading' => $this->get_heading()
252
- ), 'woocommerce', $this->template_base );
253
-
254
- return ob_get_clean();
255
- }
256
-
257
-
258
- /**
259
- * Initialise Settings Form Fields
260
- *
261
- * @access public
262
- * @return void
263
- */
264
- function init_form_fields()
265
- {
266
- $this->form_fields = array(
267
- 'enabled' => array(
268
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
269
- 'type' => 'checkbox',
270
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
271
- 'default' => 'no'
272
- ),
273
- 'subject' => array(
274
- 'title' => __( 'Subject', 'wc-vendors' ),
275
- 'type' => 'text',
276
- 'description' => sprintf( __( 'This controls the email subject line. Leave blank to use the default subject: <code>%s</code>.', 'wc-vendors' ), $this->subject ),
277
- 'placeholder' => '',
278
- 'default' => ''
279
- ),
280
- 'heading' => array(
281
- 'title' => __( 'Email Heading', 'wc-vendors' ),
282
- 'type' => 'text',
283
- 'description' => sprintf( __( 'This controls the main heading contained within the email notification. Leave blank to use the default heading: <code>%s</code>.', 'wc-vendors' ), $this->heading ),
284
- 'placeholder' => '',
285
- 'default' => ''
286
- ),
287
- 'commission_display' => array(
288
- 'title' => __( 'Product Totals', 'wc-vendors' ),
289
- 'type' => 'checkbox',
290
- 'label' => __( 'Show the commission due/paid as the product totals instead of the product prices.', 'wc-vendors' ),
291
- 'default' => 'yes'
292
- ),
293
- 'email_type' => array(
294
- 'title' => __( 'Email type', 'wc-vendors' ),
295
- 'type' => 'select',
296
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
297
- 'default' => 'html',
298
- 'class' => 'email_type',
299
- 'options' => array(
300
- 'plain' => __( 'Plain text', 'wc-vendors' ),
301
- 'html' => __( 'HTML', 'wc-vendors' ),
302
- 'multipart' => __( 'Multipart', 'wc-vendors' ),
303
- )
304
- )
305
- );
306
- }
307
-
308
-
309
- /**
310
- * check the order line item sub total to ensure that the tax is shown correctly on the vendor emails
311
- */
312
- function check_order_formatted_line_subtotal( $subtotal, $item, $order ){
313
-
314
- $order_currency = $order->get_currency();
315
-
316
- $subtotal = wc_price( $order->get_line_subtotal( $item ), array( 'currency' => $order_currency ) );
317
-
318
- return $subtotal;
319
-
320
- } // check_order_formatted_line_subtotal()
321
-
322
-
323
- function check_order_subtotal_to_display( $subtotal, $compound, $order ){
324
-
325
- $new_subtotal = 0;
326
-
327
- foreach ( $order->get_items() as $key => $product ) {
328
- $new_subtotal += $product[ 'line_subtotal' ];
329
- }
330
-
331
- return wc_price( $new_subtotal );
332
-
333
-
334
- } // check_order_subtotal_to_display()
335
-
336
- /**
337
- * Get the default settings for this email if not already set.
338
- *
339
- * @since 1.9.9
340
- *
341
- */
342
- public function get_default_settings(){
343
-
344
- $settings = array();
345
-
346
- foreach ( $this->form_fields as $key => $field ) {
347
- $settings[ $key ] = $field[ 'default' ];
348
- }
349
-
350
- return $settings;
351
-
352
- } // get_default_settings()
353
-
354
-
355
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wcv-admin-notify-application.php DELETED
@@ -1,187 +0,0 @@
1
- <?php
2
-
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- if ( ! class_exists( 'WCVendors_Admin_Notify_Application' ) ) :
8
-
9
- /**
10
- * Notify Admin Application
11
- *
12
- * An email sent to the admin when a user applies to be a vendor
13
- *
14
- * @class WCVendors_Admin_Notify_Shipped
15
- * @version 2.0.0
16
- * @package Classes/Admin/Emails
17
- * @author WC Vendors
18
- * @extends WC_Email
19
- */
20
- class WCVendors_Admin_Notify_Application extends WC_Email {
21
-
22
- /**
23
- * Constructor.
24
- */
25
- public function __construct() {
26
- $this->id = 'admin_notify_application';
27
- $this->title = sprintf( __( 'Admin notify %s application', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
28
- $this->description = sprintf( __( 'Notification is sent to chosen recipient(s) when a user applies to be a %s', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
29
- $this->template_html = 'emails/admin-notify-application.php';
30
- $this->template_plain = 'emails/plain/admin-notify-application.php';
31
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/';
32
- $this->placeholders = array(
33
- '{site_title}' => $this->get_blogname(),
34
- '{user_name}' => '',
35
- );
36
-
37
- // Call parent constructor
38
- parent::__construct();
39
-
40
- // Other settings
41
- $this->recipient = $this->get_option( 'recipient', get_option( 'admin_email' ) );
42
- }
43
-
44
- /**
45
- * Get email subject.
46
- *
47
- * @since 2.0.0
48
- * @return string
49
- */
50
- public function get_default_subject() {
51
- return sprintf( __( '[{site_title}] {user_name} has applied to be a %s', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
52
- }
53
-
54
- /**
55
- * Get email heading.
56
- *
57
- * @since 2.0.0
58
- * @return string
59
- */
60
- public function get_default_heading() {
61
- return sprintf( __( '%s application received', 'wc-vendors' ), wcv_get_vendor_name( ) );
62
- }
63
-
64
- /**
65
- * Trigger the sending of this email.
66
- *
67
- * @param int $vendor_id The order ID.
68
- * @param string $status vendor role.
69
- */
70
- public function trigger( $vendor_id, $status ) {
71
-
72
- $this->setup_locale();
73
-
74
- $this->user = get_userdata( $vendor_id );
75
- $this->status = $status;
76
- $this->placeholders['{user_name}'] = $this->user->user_login;
77
-
78
- $send_if = $this->get_option( 'notification' );
79
- $should_send = $send_if == 'vendor' ? true : ( $send_if == 'pending_vendor' && $status == 'pending' ? true: false );
80
-
81
- if ( $this->is_enabled() && $this->get_recipient() && $should_send ) {
82
- $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
83
- }
84
-
85
- $this->restore_locale();
86
- }
87
-
88
- /**
89
- * Get content html.
90
- *
91
- * @access public
92
- * @return string
93
- */
94
- public function get_content_html() {
95
-
96
- return wc_get_template_html( $this->template_html, array(
97
- 'order' => $this->object,
98
- 'email_heading' => $this->get_heading(),
99
- 'sent_to_admin' => true,
100
- 'plain_text' => false,
101
- 'email' => $this,
102
- 'user' => $this->user,
103
- 'status' => $this->status,
104
- ), 'woocommerce', $this->template_base );
105
- }
106
-
107
- /**
108
- * Get content plain.
109
- *
110
- * @access public
111
- * @return string
112
- */
113
- public function get_content_plain() {
114
- return wc_get_template_html( $this->template_plain, array(
115
- 'order' => $this->object,
116
- 'email_heading' => $this->get_heading(),
117
- 'sent_to_admin' => true,
118
- 'plain_text' => true,
119
- 'email' => $this,
120
- 'user' => $this->user,
121
- 'status' => $this->status,
122
- ), 'woocommerce', $this->template_base );
123
- }
124
-
125
- /**
126
- * Initialise settings form fields.
127
- */
128
- public function init_form_fields() {
129
- $this->form_fields = array(
130
- 'enabled' => array(
131
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
132
- 'type' => 'checkbox',
133
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
134
- 'default' => 'no',
135
- ),
136
- 'recipient' => array(
137
- 'title' => __( 'Recipient(s)', 'wc-vendors' ),
138
- 'type' => 'text',
139
- 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to %s.', 'wc-vendors' ), '<code>' . esc_attr( get_option( 'admin_email' ) ) . '</code>' ),
140
- 'placeholder' => '',
141
- 'default' => '',
142
- 'desc_tip' => true,
143
- ),
144
- 'subject' => array(
145
- 'title' => __( 'Subject', 'wc-vendors' ),
146
- 'type' => 'text',
147
- 'desc_tip' => true,
148
- /* translators: %s: list of placeholders */
149
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{user_name}</code>' ),
150
- 'placeholder' => $this->get_default_subject(),
151
- 'default' => '',
152
- ),
153
- 'heading' => array(
154
- 'title' => __( 'Email heading', 'wc-vendors' ),
155
- 'type' => 'text',
156
- 'desc_tip' => true,
157
- /* translators: %s: list of placeholders */
158
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{user_name}</code>' ),
159
- 'placeholder' => $this->get_default_heading(),
160
- 'default' => '',
161
- ),
162
- 'notification' => array(
163
- 'title' => __( 'Notification', 'wc-vendors' ),
164
- 'type' => 'select',
165
- 'description' => __( 'Choose when to be notified of an application.', 'wc-vendors' ),
166
- 'default' => 'pending_vendor',
167
- 'class' => 'wc-enhanced-select',
168
- 'options' => array(
169
- 'vendor' => __( 'All Applications', 'wc-vendors'),
170
- 'pending_vendor' => __( 'Pending Applications', 'wc-vendors' ),
171
- ),
172
- 'desc_tip' => true,
173
- ),
174
- 'email_type' => array(
175
- 'title' => __( 'Email type', 'wc-vendors' ),
176
- 'type' => 'select',
177
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
178
- 'default' => 'html',
179
- 'class' => 'email_type wc-enhanced-select',
180
- 'options' => $this->get_email_type_options(),
181
- 'desc_tip' => true,
182
- ),
183
- );
184
- }
185
- }
186
-
187
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wcv-admin-notify-product.php DELETED
@@ -1,190 +0,0 @@
1
- <?php
2
-
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- if ( ! class_exists( 'WCVendors_Admin_Notify_Product' ) ) :
8
-
9
- /**
10
- * Notify Admin of new vendor product
11
- *
12
- * An email sent to the admin when a vendor adds a new product for approval
13
- *
14
- * @class WCVendors_Admin_Notify_Product
15
- * @version 2.0.0
16
- * @package Classes/Admin/Emails
17
- * @author WC Vendors
18
- * @extends WC_Email
19
- */
20
- class WCVendors_Admin_Notify_Product extends WC_Email {
21
-
22
- /**
23
- * Constructor.
24
- */
25
- public function __construct() {
26
- $this->id = 'admin_notify_product';
27
- $this->title = sprintf( __( 'Admin new %s product', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
28
- $this->description = sprintf( __( 'Notification is sent to chosen recipient(s) when a %s submits a product for approval.', 'wc-vendors' ), wcv_get_vendor_name() );
29
- $this->template_html = 'emails/admin-notify-product.php';
30
- $this->template_plain = 'emails/plain/admin-notify-product.php';
31
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/';
32
- $this->placeholders = array(
33
- '{site_title}' => $this->get_blogname(),
34
- '{product_name}' => '',
35
- '{vendor_name}' => '',
36
- );
37
-
38
-
39
- // Triggers for this email
40
- add_action( 'pending_product', array( $this, 'trigger' ), 10, 2 );
41
- add_action( 'pending_product_variation', array( $this, 'trigger' ), 10, 2 );
42
-
43
- // Call parent constructor
44
- parent::__construct();
45
-
46
- // Other settings
47
- $this->recipient = $this->get_option( 'recipient', get_option( 'admin_email' ) );
48
- }
49
-
50
- /**
51
- * Get email subject.
52
- *
53
- * @since 2.0.0
54
- * @return string
55
- */
56
- public function get_default_subject() {
57
- return sprintf( __( '[{site_title}] New %s product submitted by {vendor_name} - {product_name}', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
58
- }
59
-
60
- /**
61
- * Get email heading.
62
- *
63
- * @since 2.0.0
64
- * @return string
65
- */
66
- public function get_default_heading() {
67
- return sprintf( __( 'New %s product submitted: {product_name}', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
68
- }
69
-
70
- /**
71
- * Trigger the sending of this email.
72
- *
73
- * @param int $order_id The order ID.
74
- * @param WC_Order $order Order object.
75
- */
76
- public function trigger( $post_id, $post ) {
77
-
78
- $this->setup_locale();
79
-
80
- if ( ! WCV_Vendors::is_vendor( $post->post_author ) ) return;
81
-
82
- $this->post_id = $post_id;
83
- $this->vendor_id = $post->post_author;
84
- $this->product = wc_get_product( $post_id );
85
- $this->vendor_name = WCV_Vendors::get_vendor_shop_name( $post->post_author );
86
-
87
- if ( is_object( $this->product ) ){
88
- $this->placeholders['{product_name}'] = $this->product->get_title();
89
- $this->placeholders['{vendor_name}'] = $this->vendor_name;
90
-
91
- if ( $this->is_enabled() && $this->get_recipient() ) {
92
- $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
93
- }
94
-
95
- $this->restore_locale();
96
- }
97
- }
98
-
99
- /**
100
- * Get content html.
101
- *
102
- * @access public
103
- * @return string
104
- */
105
- public function get_content_html() {
106
-
107
- return wc_get_template_html( $this->template_html, array(
108
- 'order' => $this->object,
109
- 'email_heading' => $this->get_heading(),
110
- 'sent_to_admin' => true,
111
- 'plain_text' => false,
112
- 'email' => $this,
113
- 'post_id' => $this->post_id,
114
- 'vendor_id' => $this->vendor_id,
115
- 'vendor_name' => $this->vendor_name,
116
- 'product' => $this->product,
117
- ), 'woocommerce', $this->template_base );
118
- }
119
-
120
- /**
121
- * Get content plain.
122
- *
123
- * @access public
124
- * @return string
125
- */
126
- public function get_content_plain() {
127
- return wc_get_template_html( $this->template_plain, array(
128
- 'order' => $this->object,
129
- 'email_heading' => $this->get_heading(),
130
- 'sent_to_admin' => true,
131
- 'plain_text' => true,
132
- 'email' => $this,
133
- 'post_id' => $this->post_id,
134
- 'vendor_id' => $this->vendor_id,
135
- 'vendor_name' => $this->vendor_name,
136
- 'product' => $this->product,
137
- ), 'woocommerce', $this->template_base );
138
- }
139
-
140
- /**
141
- * Initialise settings form fields.
142
- */
143
- public function init_form_fields() {
144
- $this->form_fields = array(
145
- 'enabled' => array(
146
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
147
- 'type' => 'checkbox',
148
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
149
- 'default' => 'yes',
150
- ),
151
- 'recipient' => array(
152
- 'title' => __( 'Recipient(s)', 'wc-vendors' ),
153
- 'type' => 'text',
154
- 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to %s.', 'wc-vendors' ), '<code>' . esc_attr( get_option( 'admin_email' ) ) . '</code>' ),
155
- 'placeholder' => '',
156
- 'default' => '',
157
- 'desc_tip' => true,
158
- ),
159
- 'subject' => array(
160
- 'title' => __( 'Subject', 'wc-vendors' ),
161
- 'type' => 'text',
162
- 'desc_tip' => true,
163
- /* translators: %s: list of placeholders */
164
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
165
- 'placeholder' => $this->get_default_subject(),
166
- 'default' => '',
167
- ),
168
- 'heading' => array(
169
- 'title' => __( 'Email heading', 'wc-vendors' ),
170
- 'type' => 'text',
171
- 'desc_tip' => true,
172
- /* translators: %s: list of placeholders */
173
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
174
- 'placeholder' => $this->get_default_heading(),
175
- 'default' => '',
176
- ),
177
- 'email_type' => array(
178
- 'title' => __( 'Email type', 'wc-vendors' ),
179
- 'type' => 'select',
180
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
181
- 'default' => 'html',
182
- 'class' => 'email_type wc-enhanced-select',
183
- 'options' => $this->get_email_type_options(),
184
- 'desc_tip' => true,
185
- ),
186
- );
187
- }
188
- }
189
-
190
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wcv-admin-notify-shipped.php DELETED
@@ -1,179 +0,0 @@
1
- <?php
2
-
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- if ( ! class_exists( 'WCVendors_Admin_Notify_Shipped' ) ) :
8
-
9
- /**
10
- * Notify Admin Shipped
11
- *
12
- * An email sent to the admin when the vendor marks the order shipped.
13
- *
14
- * @class WCVendors_Admin_Notify_Shipped
15
- * @version 2.0.0
16
- * @package Classes/Admin/Emails
17
- * @author WC Vendors
18
- * @extends WC_Email
19
- */
20
- class WCVendors_Admin_Notify_Shipped extends WC_Email {
21
-
22
- /**
23
- * Constructor.
24
- */
25
- public function __construct() {
26
- $this->id = 'admin_notify_shipped';
27
- $this->title = sprintf( __( 'Admin notify %s shipped', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
28
- $this->description = sprintf( __( 'Notification is sent to chosen recipient(s) when a %s marks an order shipped.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
29
- $this->template_html = 'emails/admin-notify-shipped.php';
30
- $this->template_plain = 'emails/plain/admin-notify-shipped.php';
31
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/';
32
- $this->placeholders = array(
33
- '{site_title}' => $this->get_blogname(),
34
- '{order_date}' => '',
35
- '{order_number}' => '',
36
- );
37
-
38
- // Call parent constructor
39
- parent::__construct();
40
-
41
- // Other settings
42
- $this->recipient = $this->get_option( 'recipient', get_option( 'admin_email' ) );
43
- }
44
-
45
- /**
46
- * Get email subject.
47
- *
48
- * @since 2.0.0
49
- * @return string
50
- */
51
- public function get_default_subject() {
52
- return sprintf( __( '[{site_title}] %s has marked shipped ({order_number}) - {order_date}', 'wc-vendors' ), wcv_get_vendor_name( ) );
53
- }
54
-
55
- /**
56
- * Get email heading.
57
- *
58
- * @since 2.0.0
59
- * @return string
60
- */
61
- public function get_default_heading() {
62
- return sprintf( __( '%s has shipped', 'wc-vendors' ), wcv_get_vendor_name( ) );
63
- }
64
-
65
- /**
66
- * Trigger the sending of this email.
67
- *
68
- * @param int $order_id The order ID.
69
- * @param WC_Order $order Order object.
70
- */
71
- public function trigger( $order_id, $user_id, $order = false ) {
72
-
73
- $this->setup_locale();
74
-
75
- $this->vendor_id = $user_id;
76
-
77
- if ( $order_id && ! is_a( $order, 'WC_Order' ) ) {
78
- $order = wc_get_order( $order_id );
79
- }
80
-
81
- if ( is_a( $order, 'WC_Order' ) ) {
82
- $this->object = $order;
83
- $this->placeholders['{order_date}'] = wc_format_datetime( $this->object->get_date_created() );
84
- $this->placeholders['{order_number}'] = $this->object->get_order_number();
85
- }
86
-
87
- if ( $this->is_enabled() && $this->get_recipient() ) {
88
- $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
89
- }
90
-
91
- $this->restore_locale();
92
- }
93
-
94
- /**
95
- * Get content html.
96
- *
97
- * @access public
98
- * @return string
99
- */
100
- public function get_content_html() {
101
-
102
- return wc_get_template_html( $this->template_html, array(
103
- 'order' => $this->object,
104
- 'email_heading' => $this->get_heading(),
105
- 'sent_to_admin' => true,
106
- 'plain_text' => false,
107
- 'email' => $this,
108
- 'vendor_id' => $this->vendor_id,
109
- ), 'woocommerce', $this->template_base );
110
- }
111
-
112
- /**
113
- * Get content plain.
114
- *
115
- * @access public
116
- * @return string
117
- */
118
- public function get_content_plain() {
119
- return wc_get_template_html( $this->template_plain, array(
120
- 'order' => $this->object,
121
- 'email_heading' => $this->get_heading(),
122
- 'sent_to_admin' => true,
123
- 'plain_text' => true,
124
- 'email' => $this,
125
- 'vendor_id' => $this->vendor_id,
126
- ), 'woocommerce', $this->template_base );
127
- }
128
-
129
- /**
130
- * Initialise settings form fields.
131
- */
132
- public function init_form_fields() {
133
- $this->form_fields = array(
134
- 'enabled' => array(
135
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
136
- 'type' => 'checkbox',
137
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
138
- 'default' => 'yes',
139
- ),
140
- 'recipient' => array(
141
- 'title' => __( 'Recipient(s)', 'wc-vendors' ),
142
- 'type' => 'text',
143
- 'description' => sprintf( __( 'Enter recipients (comma separated) for this email. Defaults to %s.', 'wc-vendors' ), '<code>' . esc_attr( get_option( 'admin_email' ) ) . '</code>' ),
144
- 'placeholder' => '',
145
- 'default' => '',
146
- 'desc_tip' => true,
147
- ),
148
- 'subject' => array(
149
- 'title' => __( 'Subject', 'wc-vendors' ),
150
- 'type' => 'text',
151
- 'desc_tip' => true,
152
- /* translators: %s: list of placeholders */
153
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
154
- 'placeholder' => $this->get_default_subject(),
155
- 'default' => '',
156
- ),
157
- 'heading' => array(
158
- 'title' => __( 'Email heading', 'wc-vendors' ),
159
- 'type' => 'text',
160
- 'desc_tip' => true,
161
- /* translators: %s: list of placeholders */
162
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
163
- 'placeholder' => $this->get_default_heading(),
164
- 'default' => '',
165
- ),
166
- 'email_type' => array(
167
- 'title' => __( 'Email type', 'wc-vendors' ),
168
- 'type' => 'select',
169
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
170
- 'default' => 'html',
171
- 'class' => 'email_type wc-enhanced-select',
172
- 'options' => $this->get_email_type_options(),
173
- 'desc_tip' => true,
174
- ),
175
- );
176
- }
177
- }
178
-
179
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wcv-customer-notify-shipped.php DELETED
@@ -1,233 +0,0 @@
1
- <?php
2
-
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- if ( ! class_exists( 'WCVendors_Customer_Notify_Shipped' ) ) :
8
-
9
- /**
10
- * Notify Admin Shipped
11
- *
12
- * An email sent to the admin when the vendor marks the order shipped.
13
- *
14
- * @class WCVendors_Customer_Notify_Shipped
15
- * @version 2.0.0
16
- * @package Classes/Admin/Emails
17
- * @author WC Vendors
18
- * @extends WC_Email
19
- */
20
- class WCVendors_Customer_Notify_Shipped extends WC_Email {
21
-
22
- /**
23
- * Constructor.
24
- */
25
- public function __construct() {
26
- $this->id = 'customer_notify_shipped';
27
- $this->customer_email = true;
28
- $this->title = sprintf( __( 'Customer %s shipped', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
29
- $this->description = sprintf( __( 'Email is sent to the customer when a %s marks an order received/paid by a customer.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
30
- $this->template_html = 'emails/customer-notify-shipped.php';
31
- $this->template_plain = 'emails/plain/customer-notify-shipped.php';
32
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/';
33
- $this->placeholders = array(
34
- '{site_title}' => $this->get_blogname(),
35
- '{order_date}' => '',
36
- '{order_number}' => '',
37
- );
38
-
39
- // Call parent constructor
40
- parent::__construct();
41
-
42
- }
43
-
44
- /**
45
- * Get email subject.
46
- *
47
- * @since 2.0.0
48
- * @return string
49
- */
50
- public function get_default_subject() {
51
- return sprintf( __( '[{site_title}] %s has marked shipped ({order_number}) - {order_date}', 'wc-vendors' ), wcv_get_vendor_name( ) );
52
- }
53
-
54
- /**
55
- * Get email heading.
56
- *
57
- * @since 2.0.0
58
- * @return string
59
- */
60
- public function get_default_heading() {
61
- return sprintf( __( '%s has shipped', 'wc-vendors' ), wcv_get_vendor_name( ) );
62
- }
63
-
64
- /**
65
- * Trigger the sending of this email.
66
- *
67
- * @param int $order_id The order ID.
68
- * @param WC_Order $order Order object.
69
- */
70
- public function trigger( $order_id, $user_id, $order = false ) {
71
-
72
- $this->setup_locale();
73
- $this->vendor_id = $user_id;
74
-
75
- if ( $order_id && ! is_a( $order, 'WC_Order' ) ) {
76
- $order = wc_get_order( $order_id );
77
- }
78
-
79
- if ( is_a( $order, 'WC_Order' ) ) {
80
- $this->object = $order;
81
- $this->recipient = $this->object->get_billing_email();
82
- $this->placeholders['{order_date}'] = wc_format_datetime( $this->object->get_date_created() );
83
- $this->placeholders['{order_number}'] = $this->object->get_order_number();
84
- }
85
-
86
- if ( $this->is_enabled() && $this->get_recipient() ) {
87
- // Filter the order items to only show the products owned by the vendor that marked shipped.
88
- add_filter( 'woocommerce_order_get_items', array( $this, 'filter_vendor_items' ), 10, 3 );
89
- add_filter( 'woocommerce_get_order_item_totals', array( $this, 'udpate_order_totals' ), 10, 3 );
90
-
91
- $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
92
-
93
- // Remove filters
94
- remove_filter( 'woocommerce_get_order_item_totals', array( $this, 'udpate_order_totals' ), 10, 3 );
95
- remove_filter( 'woocommerce_order_get_items', array( $this, 'filter_vendor_items' ), 10, 3 );
96
- }
97
-
98
- $this->restore_locale();
99
- }
100
-
101
- /**
102
- * Get content html.
103
- *
104
- * @access public
105
- * @return string
106
- */
107
- public function get_content_html() {
108
-
109
- return wc_get_template_html( $this->template_html, array(
110
- 'order' => $this->object,
111
- 'email_heading' => $this->get_heading(),
112
- 'sent_to_admin' => true,
113
- 'plain_text' => false,
114
- 'email' => $this,
115
- 'vendor_id' => $this->vendor_id,
116
- ), 'woocommerce', $this->template_base );
117
- }
118
-
119
- /**
120
- * Get content plain.
121
- *
122
- * @access public
123
- * @return string
124
- */
125
- public function get_content_plain() {
126
- return wc_get_template_html( $this->template_plain, array(
127
- 'order' => $this->object,
128
- 'email_heading' => $this->get_heading(),
129
- 'sent_to_admin' => true,
130
- 'plain_text' => true,
131
- 'email' => $this,
132
- 'vendor_id' => $this->vendor_id,
133
- ), 'woocommerce', $this->template_base );
134
- }
135
-
136
- /**
137
- * Initialise settings form fields.
138
- */
139
- public function init_form_fields() {
140
- $this->form_fields = array(
141
- 'enabled' => array(
142
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
143
- 'type' => 'checkbox',
144
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
145
- 'default' => 'yes',
146
- ),
147
- 'subject' => array(
148
- 'title' => __( 'Subject', 'wc-vendors' ),
149
- 'type' => 'text',
150
- 'desc_tip' => true,
151
- /* translators: %s: list of placeholders */
152
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
153
- 'placeholder' => $this->get_default_subject(),
154
- 'default' => '',
155
- ),
156
- 'heading' => array(
157
- 'title' => __( 'Email heading', 'wc-vendors' ),
158
- 'type' => 'text',
159
- 'desc_tip' => true,
160
- /* translators: %s: list of placeholders */
161
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
162
- 'placeholder' => $this->get_default_heading(),
163
- 'default' => '',
164
- ),
165
- 'email_type' => array(
166
- 'title' => __( 'Email type', 'wc-vendors' ),
167
- 'type' => 'select',
168
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
169
- 'default' => 'html',
170
- 'class' => 'email_type wc-enhanced-select',
171
- 'options' => $this->get_email_type_options(),
172
- 'desc_tip' => true,
173
- ),
174
- );
175
- }
176
-
177
-
178
- /**
179
- * Filter the order to only show vendor products
180
- *
181
- * @param array $items
182
- * @param WC_Order $order
183
- * @param array $types
184
- *
185
- * @return array
186
- */
187
- public function filter_vendor_items( $items, $order, $types ) {
188
-
189
- foreach ( $items as $item_id => $order_item ) {
190
-
191
- if ( 'line_item' === $order_item->get_type() ){
192
-
193
- $product_id = ( $order_item->get_variation_id() ) ? $order_item->get_variation_id() : $order_item->get_product_id();
194
-
195
- if ( empty( $product_id ) ) {
196
- unset( $items[ $item_id ] );
197
- continue;
198
- }
199
-
200
- $product_vendor = WCV_Vendors::get_vendor_from_product( $product_id );
201
-
202
- if ( $this->vendor_id != $product_vendor ) {
203
- unset( $items[ $item_id ] );
204
- continue;
205
- }
206
-
207
- }
208
-
209
- }
210
-
211
- return $items;
212
-
213
- } // filter_vendor_items
214
-
215
- /**
216
- * Update the order totals to only show the items for the product(s)
217
- *
218
- * @param array $total_rows
219
- * @param WC_Order $order
220
- * @param string $tax_display
221
- *
222
- * @return array
223
- */
224
- public function udpate_order_totals( $total_rows, $order, $tax_display ) {
225
-
226
- $new_total_rows = array();
227
- $new_total_rows[ 'cart_subtotal' ] = $total_rows[ 'cart_subtotal' ];
228
-
229
- return $new_total_rows;
230
- }
231
- }
232
-
233
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wcv-vendor-notify-application.php DELETED
@@ -1,165 +0,0 @@
1
- <?php
2
-
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- if ( ! class_exists( 'WCVendors_Vendor_Notify_Application' ) ) :
8
-
9
- /**
10
- * Notify vendor application has started
11
- *
12
- * An email sent to the admin when the vendor marks the order shipped.
13
- *
14
- * @class WCVendors_Vendor_Notify_Application
15
- * @version 2.0.0
16
- * @package Classes/Admin/Emails
17
- * @author WC Vendors
18
- * @extends WC_Email
19
- */
20
- class WCVendors_Vendor_Notify_Application extends WC_Email {
21
-
22
- /**
23
- * Constructor.
24
- */
25
- public function __construct() {
26
- $this->id = 'vendor_notify_application';
27
- $this->title = sprintf( __( '%s notify application', 'wc-vendors' ), wcv_get_vendor_name( ) );
28
- $this->description = sprintf( __( 'Notification is sent to the %s that their application has been received', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
29
- $this->template_html = 'emails/vendor-notify-application.php';
30
- $this->template_plain = 'emails/plain/vendor-notify-application.php';
31
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/';
32
- $this->placeholders = array(
33
- '{site_title}' => $this->get_blogname()
34
- );
35
-
36
- // Call parent constructor
37
- parent::__construct();
38
-
39
- }
40
-
41
- /**
42
- * Get email subject.
43
- *
44
- * @since 2.0.0
45
- * @return string
46
- */
47
- public function get_default_subject() {
48
- return sprintf( __( '[{site_title}] Your %s application has been received', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
49
- }
50
-
51
- /**
52
- * Get email heading.
53
- *
54
- * @since 2.0.0
55
- * @return string
56
- */
57
- public function get_default_heading() {
58
- return sprintf( __( '%s application received', 'wc-vendors' ), wcv_get_vendor_name( ) );
59
- }
60
-
61
- public function get_default_content() {
62
- return sprintf( __( 'Hi there. This is a notification about a %s application on %s.', 'wc-vendors' ), wcv_get_vendor_name( true, false ), get_option( 'blogname' ) );
63
- }
64
-
65
- /**
66
- * Trigger the sending of this email.
67
- *
68
- * @param int $order_id The order ID.
69
- * @param WC_Order $order Order object.
70
- */
71
- public function trigger( $vendor_id, $status = '' ) {
72
-
73
- $this->setup_locale();
74
-
75
- $this->user = get_userdata( $vendor_id );
76
- $this->user_email = $this->user->user_email;
77
- $this->status = $status;
78
-
79
- if ( $this->is_enabled() ) {
80
- $this->send( $this->user_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
81
- }
82
-
83
- $this->restore_locale();
84
- }
85
-
86
- /**
87
- * Get content html.
88
- *
89
- * @access public
90
- * @return string
91
- */
92
- public function get_content_html() {
93
-
94
- return wc_get_template_html( $this->template_html, array(
95
- 'order' => $this->object,
96
- 'email_heading' => $this->get_heading(),
97
- 'sent_to_admin' => true,
98
- 'plain_text' => false,
99
- 'email' => $this,
100
- 'user' => $this->user,
101
- 'status' => $this->status,
102
- ), 'woocommerce', $this->template_base );
103
- }
104
-
105
- /**
106
- * Get content plain.
107
- *
108
- * @access public
109
- * @return string
110
- */
111
- public function get_content_plain() {
112
- return wc_get_template_html( $this->template_plain, array(
113
- 'order' => $this->object,
114
- 'email_heading' => $this->get_heading(),
115
- 'sent_to_admin' => true,
116
- 'plain_text' => true,
117
- 'email' => $this,
118
- 'user' => $this->user,
119
- 'status' => $this->status,
120
- ), 'woocommerce', $this->template_base );
121
- }
122
-
123
- /**
124
- * Initialise settings form fields.
125
- */
126
- public function init_form_fields() {
127
- $this->form_fields = array(
128
- 'enabled' => array(
129
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
130
- 'type' => 'checkbox',
131
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
132
- 'default' => 'yes',
133
- ),
134
- 'subject' => array(
135
- 'title' => __( 'Subject', 'wc-vendors' ),
136
- 'type' => 'text',
137
- 'desc_tip' => true,
138
- /* translators: %s: list of placeholders */
139
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}</code>' ),
140
- 'placeholder' => $this->get_default_subject(),
141
- 'default' => '',
142
- ),
143
- 'heading' => array(
144
- 'title' => __( 'Email heading', 'wc-vendors' ),
145
- 'type' => 'text',
146
- 'desc_tip' => true,
147
- /* translators: %s: list of placeholders */
148
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}</code>' ),
149
- 'placeholder' => $this->get_default_heading(),
150
- 'default' => '',
151
- ),
152
- 'email_type' => array(
153
- 'title' => __( 'Email type', 'wc-vendors' ),
154
- 'type' => 'select',
155
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
156
- 'default' => 'html',
157
- 'class' => 'email_type wc-enhanced-select',
158
- 'options' => $this->get_email_type_options(),
159
- 'desc_tip' => true,
160
- ),
161
- );
162
- }
163
- }
164
-
165
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wcv-vendor-notify-approved.php DELETED
@@ -1,183 +0,0 @@
1
- <?php
2
-
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- if ( ! class_exists( 'WCVendors_Vendor_Notify_Approved' ) ) :
8
-
9
- /**
10
- * Notify vendor application has started
11
- *
12
- * An email sent to the admin when the vendor marks the order shipped.
13
- *
14
- * @class WCV_Notify_Vendor_Application
15
- * @version 2.0.0
16
- * @package Classes/Admin/Emails
17
- * @author WC Vendors
18
- * @extends WC_Email
19
- */
20
- class WCVendors_Vendor_Notify_Approved extends WC_Email {
21
-
22
- /**
23
- * Constructor.
24
- */
25
- public function __construct() {
26
- $this->id = 'vendor_notify_approved';
27
- $this->title = sprintf( __( '%s notify approved', 'wc-vendors' ), wcv_get_vendor_name( ) );
28
- $this->description = sprintf( __( 'Notification is sent to the %s that their application has been approved', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
29
- $this->template_html = 'emails/vendor-notify-approved.php';
30
- $this->template_plain = 'emails/plain/vendor-notify-approved.php';
31
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/';
32
- $this->placeholders = array(
33
- '{site_title}' => $this->get_blogname(),
34
- );
35
-
36
- // Call parent constructor
37
- parent::__construct();
38
-
39
- }
40
-
41
- /**
42
- * Get email subject.
43
- *
44
- * @since 2.0.0
45
- * @return string
46
- */
47
- public function get_default_subject() {
48
- return __( '[{site_title}] Your vendor application has been approved', 'wc-vendors' );
49
- }
50
-
51
- /**
52
- * Get email heading.
53
- *
54
- * @since 2.0.0
55
- * @return string
56
- */
57
- public function get_default_heading() {
58
- return sprintf( __( '%s Application Approved', 'wc-vendors' ), wcv_get_vendor_name( ) );
59
- }
60
-
61
- /**
62
- * Get email content
63
- *
64
- * @since 2.0.0
65
- * @return string
66
- */
67
- public function get_default_content(){
68
- return sprintf( __( 'Your application to become a %s has been approved.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
69
- }
70
-
71
- /**
72
- * Trigger the sending of this email.
73
- *
74
- * @param int $order_id The order ID.
75
- * @param WC_Order $order Order object.
76
- */
77
- public function trigger( $vendor_id, $status = '' ) {
78
-
79
- $this->setup_locale();
80
-
81
- $this->user = get_userdata( $vendor_id );
82
- $this->user_email = $this->user->user_email;
83
- $this->content = $this->get_option( 'content', $this->get_default_content() );
84
- $this->status = $status;
85
-
86
- if ( $this->is_enabled() ) {
87
- $this->send( $this->user_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
88
- }
89
-
90
- $this->restore_locale();
91
- }
92
-
93
- /**
94
- * Get content html.
95
- *
96
- * @access public
97
- * @return string
98
- */
99
- public function get_content_html() {
100
-
101
- return wc_get_template_html( $this->template_html, array(
102
- 'order' => $this->object,
103
- 'email_heading' => $this->get_heading(),
104
- 'sent_to_admin' => true,
105
- 'plain_text' => false,
106
- 'email' => $this,
107
- 'user' => $this->user,
108
- 'content' => $this->content,
109
- 'status' => $this->status,
110
- ), 'woocommerce', $this->template_base );
111
- }
112
-
113
- /**
114
- * Get content plain.
115
- *
116
- * @access public
117
- * @return string
118
- */
119
- public function get_content_plain() {
120
- return wc_get_template_html( $this->template_plain, array(
121
- 'order' => $this->object,
122
- 'email_heading' => $this->get_heading(),
123
- 'sent_to_admin' => true,
124
- 'plain_text' => true,
125
- 'email' => $this,
126
- 'user' => $this->user,
127
- 'content' => $this->content,
128
- 'status' => $this->status,
129
- ) );
130
- }
131
-
132
- /**
133
- * Initialise settings form fields.
134
- */
135
- public function init_form_fields() {
136
- $this->form_fields = array(
137
- 'enabled' => array(
138
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
139
- 'type' => 'checkbox',
140
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
141
- 'default' => 'yes',
142
- ),
143
- 'subject' => array(
144
- 'title' => __( 'Subject', 'wc-vendors' ),
145
- 'type' => 'text',
146
- 'desc_tip' => true,
147
- /* translators: %s: list of placeholders */
148
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}</code>' ),
149
- 'placeholder' => $this->get_default_subject(),
150
- 'default' => '',
151
- ),
152
- 'content' => array(
153
- 'title' => __( 'Content', 'wc-vendors' ),
154
- 'type' => 'textarea',
155
- 'desc_tip' => true,
156
- /* translators: %s: list of placeholders */
157
- 'description' => sprintf( __( 'Email body to be included when sent to the %s.', '' ), wcv_get_vendor_name( true, false ) ),
158
- 'placeholder' => $this->get_default_content(),
159
- 'default' => '',
160
- ),
161
- 'heading' => array(
162
- 'title' => __( 'Email heading', 'wc-vendors' ),
163
- 'type' => 'text',
164
- 'desc_tip' => true,
165
- /* translators: %s: list of placeholders */
166
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}</code>' ),
167
- 'placeholder' => $this->get_default_heading(),
168
- 'default' => '',
169
- ),
170
- 'email_type' => array(
171
- 'title' => __( 'Email type', 'wc-vendors' ),
172
- 'type' => 'select',
173
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
174
- 'default' => 'html',
175
- 'class' => 'email_type wc-enhanced-select',
176
- 'options' => $this->get_email_type_options(),
177
- 'desc_tip' => true,
178
- ),
179
- );
180
- }
181
- }
182
-
183
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wcv-vendor-notify-denied.php DELETED
@@ -1,201 +0,0 @@
1
- <?php
2
-
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- if ( ! class_exists( 'WCVendors_Vendor_Notify_Denied' ) ) :
8
-
9
- /**
10
- * Notify vendor application has been denied
11
- *
12
- * An email sent to the vendor when the admin denies their application
13
- *
14
- * @class WCVendors_Vendor_Notify_Denied
15
- * @version 2.0.0
16
- * @package Classes/Admin/Emails
17
- * @author WC Vendors
18
- * @extends WC_Email
19
- */
20
- class WCVendors_Vendor_Notify_Denied extends WC_Email {
21
-
22
- /**
23
- * Constructor.
24
- */
25
- public function __construct() {
26
- $this->id = 'vendor_notify_denied';
27
- $this->title = sprintf( __( '%s notify denied', 'wc-vendors' ), wcv_get_vendor_name( ) );
28
- $this->description = sprintf( __( 'Notification is sent to the %s that their application has been denied', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
29
- $this->template_html = 'emails/vendor-notify-denied.php';
30
- $this->template_plain = 'emails/plain/vendor-notify-denied.php';
31
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/';
32
- $this->placeholders = array(
33
- '{site_title}' => $this->get_blogname(),
34
- );
35
-
36
- // Call parent constructor
37
- parent::__construct();
38
-
39
- }
40
-
41
- /**
42
- * Get email subject.
43
- *
44
- * @since 2.0.0
45
- * @return string
46
- */
47
- public function get_default_subject() {
48
- return sprintf( __( '[{site_title}] Your %s application has been denied', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
49
- }
50
-
51
- /**
52
- * Get email heading.
53
- *
54
- * @since 2.0.0
55
- * @return string
56
- */
57
- public function get_default_heading() {
58
- return sprintf( __( '%s Application Denied', 'wc-vendors' ), wcv_get_vendor_name( ) );
59
- }
60
-
61
- /**
62
- * Get email content
63
- *
64
- * @since 2.0.0
65
- * @return string
66
- */
67
- public function get_default_content(){
68
- return sprintf( __( 'Your application to become a %s has been denied.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
69
- }
70
-
71
- /**
72
- * Get email reason
73
- *
74
- * @since 2.0.0
75
- * @return string
76
- */
77
- public function get_default_reason(){
78
- return __( 'We are not taking any new applications at this time.', 'wc-vendors' );
79
- }
80
-
81
- /**
82
- * Trigger the sending of this email.
83
- *
84
- * @param int $order_id The order ID.
85
- * @param WC_Order $order Order object.
86
- */
87
- public function trigger( $vendor_id, $reason = '' ) {
88
-
89
- $this->setup_locale();
90
-
91
- $this->user = get_userdata( $vendor_id );
92
- $this->user_email = $this->user->user_email;
93
- $this->content = $this->get_option( 'content', $this->get_default_content() );
94
- $this->reason = ( $reason ) ? $reason : $this->get_option( 'reason', $this->get_default_reason() );
95
-
96
- if ( $this->is_enabled() ) {
97
- $this->send( $this->user_email, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
98
- }
99
-
100
- $this->restore_locale();
101
- }
102
-
103
- /**
104
- * Get content html.
105
- *
106
- * @access public
107
- * @return string
108
- */
109
- public function get_content_html() {
110
-
111
- return wc_get_template_html( $this->template_html, array(
112
- 'order' => $this->object,
113
- 'email_heading' => $this->get_heading(),
114
- 'sent_to_admin' => true,
115
- 'plain_text' => false,
116
- 'email' => $this,
117
- 'user' => $this->user,
118
- 'reason' => $this->reason,
119
- 'content' => $this->content,
120
- ), 'woocommerce', $this->template_base );
121
- }
122
-
123
- /**
124
- * Get content plain.
125
- *
126
- * @access public
127
- * @return string
128
- */
129
- public function get_content_plain() {
130
- return wc_get_template_html( $this->template_plain, array(
131
- 'order' => $this->object,
132
- 'email_heading' => $this->get_heading(),
133
- 'sent_to_admin' => true,
134
- 'plain_text' => true,
135
- 'email' => $this,
136
- 'reason' => $this->reason,
137
- 'content' => $this->content,
138
- 'user' => $this->user,
139
- ) );
140
- }
141
-
142
- /**
143
- * Initialise settings form fields.
144
- */
145
- public function init_form_fields() {
146
- $this->form_fields = array(
147
- 'enabled' => array(
148
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
149
- 'type' => 'checkbox',
150
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
151
- 'default' => 'yes',
152
- ),
153
- 'subject' => array(
154
- 'title' => __( 'Subject', 'wc-vendors' ),
155
- 'type' => 'text',
156
- 'desc_tip' => true,
157
- /* translators: %s: list of placeholders */
158
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}</code>' ),
159
- 'placeholder' => $this->get_default_subject(),
160
- 'default' => '',
161
- ),
162
- 'content' => array(
163
- 'title' => __( 'Content', 'wc-vendors' ),
164
- 'type' => 'textarea',
165
- 'desc_tip' => true,
166
- /* translators: %s: list of placeholders */
167
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}</code>' ),
168
- 'placeholder' => $this->get_default_content(),
169
- 'default' => $this->get_default_content(),
170
- ),
171
- 'reason' => array(
172
- 'title' => __( 'Reason', 'wc-vendors' ),
173
- 'type' => 'textarea',
174
- 'desc_tip' => true,
175
- 'description' => sprintf( __( 'Provide a reason for denying the %s application', 'wc-vendors'), wcv_get_vendor_name( true, false ) ),
176
- 'placeholder' => $this->get_default_reason(),
177
- 'default' => $this->get_default_reason(),
178
- ),
179
- 'heading' => array(
180
- 'title' => __( 'Email heading', 'wc-vendors' ),
181
- 'type' => 'text',
182
- 'desc_tip' => true,
183
- /* translators: %s: list of placeholders */
184
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}</code>' ),
185
- 'placeholder' => $this->get_default_heading(),
186
- 'default' => '',
187
- ),
188
- 'email_type' => array(
189
- 'title' => __( 'Email type', 'wc-vendors' ),
190
- 'type' => 'select',
191
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
192
- 'default' => 'html',
193
- 'class' => 'email_type wc-enhanced-select',
194
- 'options' => $this->get_email_type_options(),
195
- 'desc_tip' => true,
196
- ),
197
- );
198
- }
199
- }
200
-
201
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/emails/class-wcv-vendor-notify-order.php DELETED
@@ -1,225 +0,0 @@
1
- <?php
2
-
3
- if ( ! defined( 'ABSPATH' ) ) {
4
- exit;
5
- }
6
-
7
- if ( ! class_exists( 'WCVendors_Vendor_Notify_Order' ) ) :
8
-
9
- /**
10
- * Notify Admin Shipped
11
- *
12
- * An email sent to the admin when the vendor marks the order shipped.
13
- *
14
- * @class WCVendors_Vendor_Notify_Order
15
- * @version 2.0.0
16
- * @package Classes/Admin/Emails
17
- * @author WC Vendors
18
- * @extends WC_Email
19
- */
20
- class WCVendors_Vendor_Notify_Order extends WC_Email {
21
-
22
- /**
23
- * Constructor.
24
- */
25
- public function __construct() {
26
- $this->id = 'vendor_notify_order';
27
- $this->title = sprintf( __( '%s notify order', 'wc-vendors' ), wcv_get_vendor_name( ) );
28
- $this->description = sprintf( __( 'Notification is sent to %s when an order is paid.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) );
29
- $this->template_html = 'emails/vendor-notify-order.php';
30
- $this->template_plain = 'emails/plain/vendor-notify-order.php';
31
- $this->template_base = dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) . '/templates/';
32
- $this->placeholders = array(
33
- '{site_title}' => $this->get_blogname(),
34
- '{order_date}' => '',
35
- '{order_number}' => '',
36
- );
37
-
38
- // Triggers
39
- add_action( 'woocommerce_order_status_pending_to_processing_notification', array( $this, 'trigger' ), 10, 2 );
40
- add_action( 'woocommerce_order_status_pending_to_completed_notification', array( $this, 'trigger' ), 10, 2 );
41
- add_action( 'woocommerce_order_status_failed_to_processing_notification', array( $this, 'trigger' ), 10, 2 );
42
- add_action( 'woocommerce_order_status_failed_to_completed_notification', array( $this, 'trigger' ), 10, 2 );
43
- add_action( 'woocommerce_order_status_on-hold_to_processing_notification', array( $this, 'trigger' ), 10, 2 );
44
- add_action( 'woocommerce_order_status_on-hold_to_completed_notification', array( $this, 'trigger' ), 10, 2 );
45
-
46
- // Call parent constructor
47
- parent::__construct();
48
- }
49
-
50
- /**
51
- * Get email subject.
52
- *
53
- * @since 2.0.0
54
- * @return string
55
- */
56
- public function get_default_subject() {
57
- return __( '[{site_title}] New Customer Order ({order_number}) - {order_date}', 'wc-vendors' );
58
- }
59
-
60
- /**
61
- * Get email heading.
62
- *
63
- * @since 2.0.0
64
- * @return string
65
- */
66
- public function get_default_heading() {
67
- return __( 'New Customer Order', 'wc-vendors' );
68
- }
69
-
70
- /**
71
- * Trigger the sending of this email.
72
- *
73
- * @param int $order_id The order ID.
74
- * @param WC_Order $order Order object.
75
- */
76
- public function trigger( $order_id, $order = false ) {
77
-
78
- $this->setup_locale();
79
-
80
- if ( $order_id && ! is_a( $order, 'WC_Order' ) ) {
81
- $order = wc_get_order( $order_id );
82
- }
83
-
84
- $this->vendors = WCV_Vendors::get_vendors_from_order( $order );
85
-
86
- if ( is_a( $order, 'WC_Order' ) ) {
87
- $this->object = $order;
88
- $this->placeholders['{order_date}'] = wc_format_datetime( $this->object->get_date_created() );
89
- $this->placeholders['{order_number}'] = $this->object->get_order_number();
90
- }
91
-
92
- if ( $this->is_enabled() && !empty( $this->vendors )) {
93
-
94
- foreach ( $this->vendors as $vendor_id => $vendor_details ) {
95
-
96
- $this->recipient = $vendor_details[ 'vendor' ]->user_email;
97
- $this->order_items = $vendor_details[ 'line_items' ];
98
- $this->vendor_id = $vendor_id;
99
- $this->totals_display = $this->get_option( 'totals_display' );
100
-
101
- // Remove the customer name from the addresses
102
- add_filter( 'woocommerce_order_formatted_billing_address', array( $this, 'filter_customer_name' ) );
103
- add_filter( 'woocommerce_order_formatted_shipping_address', array( $this, 'filter_customer_name' ) );
104
- $this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
105
- remove_filter( 'woocommerce_order_formatted_billing_address', array( $this, 'filter_customer_name' ) );
106
- remove_filter( 'woocommerce_order_formatted_shipping_address', array( $this, 'filter_customer_name' ) );
107
- }
108
- }
109
-
110
- $this->restore_locale();
111
- }
112
-
113
- /**
114
- * Get content html.
115
- *
116
- * @access public
117
- * @return string
118
- */
119
- public function get_content_html() {
120
-
121
- return wc_get_template_html( $this->template_html, array(
122
- 'order' => $this->object,
123
- 'vendor_id' => $this->vendor_id,
124
- 'vendor_items' => $this->order_items,
125
- 'email_heading' => $this->get_heading(),
126
- 'totals_display' => $this->totals_display,
127
- 'sent_to_admin' => false,
128
- 'sent_to_vendor' => true,
129
- 'plain_text' => false,
130
- 'email' => $this,
131
- ), 'woocommerce', $this->template_base );
132
- }
133
-
134
- /**
135
- * Get content plain.
136
- *
137
- * @access public
138
- * @return string
139
- */
140
- public function get_content_plain() {
141
- return wc_get_template_html( $this->template_plain, array(
142
- 'order' => $this->object,
143
- 'vendor_id' => $this->vendor_id,
144
- 'vendor_items' => $this->order_items,
145
- 'email_heading' => $this->get_heading(),
146
- 'sent_to_admin' => false,
147
- 'sent_to_vendor' => true,
148
- 'totals_display' => $this->totals_display,
149
- 'plain_text' => true,
150
- 'email' => $this,
151
- ), 'woocommerce', $this->template_base );
152
- }
153
-
154
- /**
155
- * Initialise settings form fields.
156
- */
157
- public function init_form_fields() {
158
- $this->form_fields = array(
159
- 'enabled' => array(
160
- 'title' => __( 'Enable/Disable', 'wc-vendors' ),
161
- 'type' => 'checkbox',
162
- 'label' => __( 'Enable this email notification', 'wc-vendors' ),
163
- 'default' => 'yes',
164
- ),
165
- 'subject' => array(
166
- 'title' => __( 'Subject', 'wc-vendors' ),
167
- 'type' => 'text',
168
- 'desc_tip' => true,
169
- /* translators: %s: list of placeholders */
170
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
171
- 'placeholder' => $this->get_default_subject(),
172
- 'default' => '',
173
- ),
174
- 'heading' => array(
175
- 'title' => __( 'Email heading', 'wc-vendors' ),
176
- 'type' => 'text',
177
- 'desc_tip' => true,
178
- /* translators: %s: list of placeholders */
179
- 'description' => sprintf( __( 'Available placeholders: %s', 'wc-vendors' ), '<code>{site_title}, {order_date}, {order_number}</code>' ),
180
- 'placeholder' => $this->get_default_heading(),
181
- 'default' => '',
182
- ),
183
- 'totals_display' => array(
184
- 'title' => __( 'Totals Display', 'wc-vendors' ),
185
- 'type' => 'select',
186
- 'description' => __( 'Choose how to display the product totals. Including commission or without or no totals at all.', 'wc-vendors' ),
187
- 'default' => 'both',
188
- 'class' => 'wc-enhanced-select',
189
- 'options' => array(
190
- 'both' => __( 'Both', 'wc-vendors'),
191
- 'commission'=> __( 'Commission', 'wc-vendors' ),
192
- 'product' => __( 'Product', 'wc-vendors' ),
193
- 'none' => __( 'None', 'wc-vendors' ),
194
- ),
195
- 'desc_tip' => true,
196
- ),
197
- 'payment_method' => array(
198
- 'title' => __( 'Payment method', 'wc-vendors' ),
199
- 'type' => 'checkbox',
200
- 'label' => __( 'Include the payment method in the email', 'wc-vendors' ),
201
- 'default' => 'no',
202
- ),
203
- 'email_type' => array(
204
- 'title' => __( 'Email type', 'wc-vendors' ),
205
- 'type' => 'select',
206
- 'description' => __( 'Choose which format of email to send.', 'wc-vendors' ),
207
- 'default' => 'html',
208
- 'class' => 'email_type wc-enhanced-select',
209
- 'options' => $this->get_email_type_options(),
210
- 'desc_tip' => true,
211
- ),
212
- );
213
- }
214
-
215
- public function filter_customer_name( $address ){
216
-
217
- unset( $address['first_name'] );
218
- unset( $address['last_name'] );
219
-
220
- return $address;
221
- }
222
-
223
- }
224
-
225
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/includes/class-wcv-walker-pagedropdown-multiple.php DELETED
@@ -1,60 +0,0 @@
1
- <?php
2
- if ( !class_exists( 'WCV_Walker_PageDropdown_Multiple' ) ) {
3
-
4
- /**
5
- * Create HTML dropdown list of pages.
6
- *
7
- * @package WCVendors
8
- * @since 2.0.8
9
- * @uses Walker_PageDropdown
10
- * @source http://wordpress.kjetil-hartveit.com/2013/03/08/how-to-use-the-multiple-attribute-with-wp_dropdown_pages/
11
- */
12
- class WCV_Walker_PageDropdown_Multiple extends Walker_PageDropdown {
13
- /**
14
- * @see Walker::start_el()
15
- * @since 2.1.0
16
- *
17
- * @param string $output Passed by reference. Used to append additional content.
18
- * @param object $page Page data object.
19
- * @param int $depth Depth of page in reference to parent pages. Used for padding.
20
- * @param array $args Uses 'selected' argument for selected page to set selected HTML attribute for option element.
21
- * @param int $id
22
- */
23
- public function start_el( &$output, $page, $depth = 0, $args = array(), $id = 0 ) {
24
-
25
- $pad = str_repeat('&nbsp;', $depth * 3);
26
-
27
- if ( ! isset( $args['value_field'] ) || ! isset( $page->{$args['value_field']} ) ) {
28
- $args['value_field'] = 'ID';
29
- }
30
-
31
- $output .= "\t<option class=\"level-$depth\" value=\"" . esc_attr( $page->{$args['value_field']} ) . "\"";
32
- if ( in_array( $page->ID, (array) $args['selected'] ) )
33
- $output .= ' selected="selected"';
34
- $output .= '>';
35
-
36
- $title = $page->post_title;
37
- if ( '' === $title ) {
38
- /* translators: %d: ID of a post */
39
- $title = sprintf( __( '#%d (no title)' ), $page->ID );
40
- }
41
-
42
- /**
43
- * Filters the page title when creating an HTML drop-down list of pages.
44
- *
45
- * @since 3.1.0
46
- *
47
- * @param string $title Page title.
48
- * @param object $page Page data object.
49
- */
50
- $title = apply_filters( 'list_pages', $title, $page );
51
- $title = apply_filters( 'pagedropdown_multiple_title', $title, $page, $args );
52
-
53
- $output .= $pad . esc_html( $title );
54
- $output .= "</option>\n";
55
-
56
- }
57
-
58
- }
59
-
60
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/README.md DELETED
@@ -1,126 +0,0 @@
1
- WP Simple Settings Framework
2
- ================================
3
-
4
- A minimalistic framework for Wordpress Settings API.
5
-
6
- Quick start
7
- ------------
8
-
9
- * [Download the latest release](https://github.com/Geczy/WP-Simple-Settings-Framework/zipball/master) (zip)
10
-
11
- * Or, clone the repo, `git clone git://github.com/Geczy/WP-Simple-Settings-Framework.git`
12
-
13
- Installation
14
- ------------
15
- 1. Include the framework in your Wordpress plugin by using:
16
-
17
- ```php
18
- <?php
19
- add_action( 'init', 'sf_load_settings' );
20
- function sf_load_settings() {
21
- require 'classes/sf-class-settings.php';
22
- $settings_framework = new SF_Settings_API($id = 'my_plugin_name', $title = 'My Plugin Title', $menu = 'plugins.php', __FILE__);
23
- }
24
- ```
25
-
26
- Optionally, you might want to make `$settings_framework` a global variable so that you can use the [helper functions](#helpers).
27
-
28
- 2. Open `sf-options.php` to begin configuring your options.
29
-
30
- Features
31
- ------------
32
-
33
- ### Automatic settings page
34
- Don't want it under the Plugins tab like in the screenshot? No problem, you can choose where you want it!
35
-
36
- You can also change "Simple Settings" submenu to be anything you'd like.
37
-
38
- ![settings page example](http://i.imgur.com/aEGUD.png)
39
-
40
- ---
41
-
42
- ### Tooltips
43
- ![tooltips example](http://i.imgur.com/Z3Pnk.png)
44
-
45
- Optional tooltips using [Twitter Bootstrap](http://twitter.github.com/bootstrap/javascript.html#tooltips)!
46
-
47
- ---
48
-
49
- ### Select box replacement
50
- ![select box replacement](http://i.imgur.com/ikOXH.png)
51
-
52
- Utilizing [Select2](http://ivaynberg.github.com/select2/) to display select boxes. It's pretty cool!
53
-
54
- ---
55
-
56
- ### Multiple tabs
57
- ![multiple tabs example](http://i.imgur.com/OUM4i.png)
58
-
59
- Create multiple tabs for your options.
60
-
61
- ---
62
-
63
- ### Input types
64
-
65
- * Text
66
- * Number
67
- * Textarea
68
- * Checkbox
69
- * Radio
70
- * Select
71
- * WP Pages
72
-
73
- Helpers
74
- ------------
75
-
76
- Update or add a new option
77
-
78
- ```php
79
- <?php
80
- $settings_framework->update_option('your_option', 'new_value');
81
- ```
82
-
83
- Get an existing option's value
84
-
85
- ```php
86
- <?php
87
- $settings_framework->get_option('your_option');
88
- ```
89
-
90
- Example configuration
91
- ------------
92
-
93
- Check out the [example config](https://github.com/Geczy/WP-Simple-Settings-Framework/blob/master/sf-options.php) for an idea of how to use every input type.
94
-
95
- Here's an example of one type, though:
96
-
97
- ```php
98
- <?php
99
- $options[] = array(
100
- 'name' => __( 'Name', 'geczy' ),
101
- 'desc' => __( 'Please tell me who you are.', 'geczy' ),
102
- 'id' => 'text_sample',
103
- 'type' => 'text',
104
- );
105
- ```
106
-
107
-
108
- Bug tracker
109
- -----------
110
-
111
- Have a bug? Please create an issue here on GitHub!
112
-
113
- https://github.com/Geczy/WP-Simple-Settings-Framework/issues/
114
-
115
- Copyright and License
116
- ---------------------
117
-
118
- Copyright 2012 Matthew Gates
119
-
120
- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
121
-
122
- * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
123
- * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
124
- * Neither the names of the copyright holders nor the names of the contributors may be used to endorse or promote products derived from this software without specific prior written permission.
125
-
126
- http://www.opensource.org/licenses/bsd-license.php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/css/sf-styles.css DELETED
@@ -1,167 +0,0 @@
1
- a.sf-tips {
2
- height: 16px;
3
- width: 16px;
4
- margin-top: 0.2em;
5
- float: right;
6
- background: url(../img/tip.png) no-repeat top left;
7
- }
8
-
9
- /*!
10
- * Bootstrap v2.3.1 [Styles for Tooltips]
11
- *
12
- * Copyright 2012 Twitter, Inc
13
- * Licensed under the Apache License v2.0
14
- * http://www.apache.org/licenses/LICENSE-2.0
15
- *
16
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
17
- */
18
- .clearfix {
19
- *zoom: 1;
20
- }
21
-
22
- .clearfix:before, .clearfix:after {
23
- display: table;
24
- content: "";
25
- line-height: 0;
26
- }
27
-
28
- .clearfix:after {
29
- clear: both;
30
- }
31
-
32
- .hide-text {
33
- font: 0/0 a;
34
- color: transparent;
35
- text-shadow: none;
36
- background-color: transparent;
37
- border: 0;
38
- }
39
-
40
- .input-block-level {
41
- display: block;
42
- width: 100%;
43
- min-height: 30px;
44
- -webkit-box-sizing: border-box;
45
- -moz-box-sizing: border-box;
46
- box-sizing: border-box;
47
- }
48
-
49
- /* Tooltips */
50
- .tooltip {
51
- text-shadow: none;
52
- }
53
-
54
- .tooltip {
55
- position: absolute;
56
- z-index: 1030;
57
- display: block;
58
- visibility: visible;
59
- font-size: 11px;
60
- line-height: 1.4;
61
- opacity: 0;
62
- filter: alpha(opacity=0);
63
- }
64
-
65
- .tooltip.in {
66
- opacity: 0.8;
67
- filter: alpha(opacity=80);
68
- }
69
-
70
- .tooltip.top {
71
- margin-top: -3px;
72
- padding: 5px 0;
73
- }
74
-
75
- .tooltip.right {
76
- margin-left: 3px;
77
- padding: 0 5px;
78
- }
79
-
80
- .tooltip.bottom {
81
- margin-top: 3px;
82
- padding: 5px 0;
83
- }
84
-
85
- .tooltip.left {
86
- margin-left: -3px;
87
- padding: 0 5px;
88
- }
89
-
90
- .tooltip-inner {
91
- max-width: 200px;
92
- padding: 8px;
93
- color: #ffffff;
94
- text-align: center;
95
- text-decoration: none;
96
- background-color: #000000;
97
- -webkit-border-radius: 4px;
98
- -moz-border-radius: 4px;
99
- border-radius: 4px;
100
- }
101
-
102
- .tooltip-arrow {
103
- position: absolute;
104
- width: 0;
105
- height: 0;
106
- border-color: transparent;
107
- border-style: solid;
108
- }
109
-
110
- .tooltip.top .tooltip-arrow {
111
- bottom: 0;
112
- left: 50%;
113
- margin-left: -5px;
114
- border-width: 5px 5px 0;
115
- border-top-color: #000000;
116
- }
117
-
118
- .tooltip.right .tooltip-arrow {
119
- top: 50%;
120
- left: 0;
121
- margin-top: -5px;
122
- border-width: 5px 5px 5px 0;
123
- border-right-color: #000000;
124
- }
125
-
126
- .tooltip.left .tooltip-arrow {
127
- top: 50%;
128
- right: 0;
129
- margin-top: -5px;
130
- border-width: 5px 0 5px 5px;
131
- border-left-color: #000000;
132
- }
133
-
134
- .tooltip.bottom .tooltip-arrow {
135
- top: 0;
136
- left: 50%;
137
- margin-left: -5px;
138
- border-width: 0 5px 5px;
139
- border-bottom-color: #000000;
140
- }
141
-
142
- /* Animation */
143
- .fade {
144
- opacity: 0;
145
- -webkit-transition: opacity 0.15s linear;
146
- -moz-transition: opacity 0.15s linear;
147
- -o-transition: opacity 0.15s linear;
148
- transition: opacity 0.15s linear;
149
- }
150
-
151
- .fade.in {
152
- opacity: 1;
153
- }
154
-
155
- .collapse {
156
- position: relative;
157
- height: 0;
158
- overflow: hidden;
159
- -webkit-transition: height 0.35s ease;
160
- -moz-transition: height 0.35s ease;
161
- -o-transition: height 0.35s ease;
162
- transition: height 0.35s ease;
163
- }
164
-
165
- .collapse.in {
166
- height: auto;
167
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/img/tip.png DELETED
Binary file
trunk/classes/admin/settings/assets/js/bootstrap-tooltip.js DELETED
@@ -1,126 +0,0 @@
1
- /**
2
- * Bootstrap.js by @fat & @mdo
3
- * plugins: bootstrap-transition.js, bootstrap-tooltip.js
4
- * 2.3.1
5
- * Copyright 2012 Twitter, Inc.
6
- * http://www.apache.org/licenses/LICENSE-2.0.txt
7
- */
8
- !function (a) {
9
- a(function () {
10
- a.support.transition = function () {
11
- var a = function () {
12
- var a = document.createElement("bootstrap"), b = {WebkitTransition: "webkitTransitionEnd", MozTransition: "transitionend", OTransition: "oTransitionEnd otransitionend", transition: "transitionend"}, c;
13
- for (c in b)if (a.style[c] !== undefined)return b[c]
14
- }();
15
- return a && {end: a}
16
- }()
17
- })
18
- }(window.jQuery), !function (a) {
19
- var b = function (a, b) {
20
- this.init("tooltip", a, b)
21
- };
22
- b.prototype = {constructor: b, init: function (b, c, d) {
23
- var e, f, g, h, i;
24
- this.type = b, this.$element = a(c), this.options = this.getOptions(d), this.enabled = !0, g = this.options.trigger.split(" ");
25
- for (i = g.length; i--;)h = g[i], h == "click" ? this.$element.on("click." + this.type, this.options.selector, a.proxy(this.toggle, this)) : h != "manual" && (e = h == "hover" ? "mouseenter" : "focus", f = h == "hover" ? "mouseleave" : "blur", this.$element.on(e + "." + this.type, this.options.selector, a.proxy(this.enter, this)), this.$element.on(f + "." + this.type, this.options.selector, a.proxy(this.leave, this)));
26
- this.options.selector ? this._options = a.extend({}, this.options, {trigger: "manual", selector: ""}) : this.fixTitle()
27
- }, getOptions: function (b) {
28
- return b = a.extend({}, a.fn[this.type].defaults, this.$element.data(), b), b.delay && typeof b.delay == "number" && (b.delay = {show: b.delay, hide: b.delay}), b
29
- }, enter: function (b) {
30
- var c = a.fn[this.type].defaults, d = {}, e;
31
- this._options && a.each(this._options, function (a, b) {
32
- c[a] != b && (d[a] = b)
33
- }, this), e = a(b.currentTarget)[this.type](d).data(this.type);
34
- if (!e.options.delay || !e.options.delay.show)return e.show();
35
- clearTimeout(this.timeout), e.hoverState = "in", this.timeout = setTimeout(function () {
36
- e.hoverState == "in" && e.show()
37
- }, e.options.delay.show)
38
- }, leave: function (b) {
39
- var c = a(b.currentTarget)[this.type](this._options).data(this.type);
40
- this.timeout && clearTimeout(this.timeout);
41
- if (!c.options.delay || !c.options.delay.hide)return c.hide();
42
- c.hoverState = "out", this.timeout = setTimeout(function () {
43
- c.hoverState == "out" && c.hide()
44
- }, c.options.delay.hide)
45
- }, show: function () {
46
- var b, c, d, e, f, g, h = a.Event("show");
47
- if (this.hasContent() && this.enabled) {
48
- this.$element.trigger(h);
49
- if (h.isDefaultPrevented())return;
50
- b = this.tip(), this.setContent(), this.options.animation && b.addClass("fade"), f = typeof this.options.placement == "function" ? this.options.placement.call(this, b[0], this.$element[0]) : this.options.placement, b.detach().css({top: 0, left: 0, display: "block"}), this.options.container ? b.appendTo(this.options.container) : b.insertAfter(this.$element), c = this.getPosition(), d = b[0].offsetWidth, e = b[0].offsetHeight;
51
- switch (f) {
52
- case"bottom":
53
- g = {top: c.top + c.height, left: c.left + c.width / 2 - d / 2};
54
- break;
55
- case"top":
56
- g = {top: c.top - e, left: c.left + c.width / 2 - d / 2};
57
- break;
58
- case"left":
59
- g = {top: c.top + c.height / 2 - e / 2, left: c.left - d};
60
- break;
61
- case"right":
62
- g = {top: c.top + c.height / 2 - e / 2, left: c.left + c.width}
63
- }
64
- this.applyPlacement(g, f), this.$element.trigger("shown")
65
- }
66
- }, applyPlacement: function (a, b) {
67
- var c = this.tip(), d = c[0].offsetWidth, e = c[0].offsetHeight, f, g, h, i;
68
- c.offset(a).addClass(b).addClass("in"), f = c[0].offsetWidth, g = c[0].offsetHeight, b == "top" && g != e && (a.top = a.top + e - g, i = !0), b == "bottom" || b == "top" ? (h = 0, a.left < 0 && (h = a.left * -2, a.left = 0, c.offset(a), f = c[0].offsetWidth, g = c[0].offsetHeight), this.replaceArrow(h - d + f, f, "left")) : this.replaceArrow(g - e, g, "top"), i && c.offset(a)
69
- }, replaceArrow: function (a, b, c) {
70
- this.arrow().css(c, a ? 50 * (1 - a / b) + "%" : "")
71
- }, setContent: function () {
72
- var a = this.tip(), b = this.getTitle();
73
- a.find(".tooltip-inner")[this.options.html ? "html" : "text"](b), a.removeClass("fade in top bottom left right")
74
- }, hide: function () {
75
- function e() {
76
- var b = setTimeout(function () {
77
- c.off(a.support.transition.end).detach()
78
- }, 500);
79
- c.one(a.support.transition.end, function () {
80
- clearTimeout(b), c.detach()
81
- })
82
- }
83
-
84
- var b = this, c = this.tip(), d = a.Event("hide");
85
- this.$element.trigger(d);
86
- if (d.isDefaultPrevented())return;
87
- return c.removeClass("in"), a.support.transition && this.$tip.hasClass("fade") ? e() : c.detach(), this.$element.trigger("hidden"), this
88
- }, fixTitle: function () {
89
- var a = this.$element;
90
- (a.attr("title") || typeof a.attr("data-original-title") != "string") && a.attr("data-original-title", a.attr("title") || "").attr("title", "")
91
- }, hasContent: function () {
92
- return this.getTitle()
93
- }, getPosition: function () {
94
- var b = this.$element[0];
95
- return a.extend({}, typeof b.getBoundingClientRect == "function" ? b.getBoundingClientRect() : {width: b.offsetWidth, height: b.offsetHeight}, this.$element.offset())
96
- }, getTitle: function () {
97
- var a, b = this.$element, c = this.options;
98
- return a = b.attr("data-original-title") || (typeof c.title == "function" ? c.title.call(b[0]) : c.title), a
99
- }, tip: function () {
100
- return this.$tip = this.$tip || a(this.options.template)
101
- }, arrow: function () {
102
- return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow")
103
- }, validate: function () {
104
- this.$element[0].parentNode || (this.hide(), this.$element = null, this.options = null)
105
- }, enable: function () {
106
- this.enabled = !0
107
- }, disable: function () {
108
- this.enabled = !1
109
- }, toggleEnabled: function () {
110
- this.enabled = !this.enabled
111
- }, toggle: function (b) {
112
- var c = b ? a(b.currentTarget)[this.type](this._options).data(this.type) : this;
113
- c.tip().hasClass("in") ? c.hide() : c.show()
114
- }, destroy: function () {
115
- this.hide().$element.off("." + this.type).removeData(this.type)
116
- }};
117
- var c = a.fn.tooltip;
118
- a.fn.tooltip = function (c) {
119
- return this.each(function () {
120
- var d = a(this), e = d.data("tooltip"), f = typeof c == "object" && c;
121
- e || d.data("tooltip", e = new b(this, f)), typeof c == "string" && e[c]()
122
- })
123
- }, a.fn.tooltip.Constructor = b, a.fn.tooltip.defaults = {animation: !0, placement: "top", selector: !1, template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>', trigger: "hover focus", title: "", delay: 0, html: !1, container: !1}, a.fn.tooltip.noConflict = function () {
124
- return a.fn.tooltip = c, this
125
- }
126
- }(window.jQuery)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/js.iml DELETED
@@ -1,10 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <module type="WEB_MODULE" version="4">
3
- <component name="NewModuleRootManager" inherit-compiler-output="true">
4
- <exclude-output />
5
- <content url="file://$MODULE_DIR$" />
6
- <orderEntry type="inheritedJdk" />
7
- <orderEntry type="sourceFolder" forTests="false" />
8
- </component>
9
- </module>
10
-
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/select2/select2-bootstrap.css DELETED
@@ -1,87 +0,0 @@
1
- .form-control .select2-choice {
2
- border: 0;
3
- border-radius: 2px;
4
- }
5
-
6
- .form-control .select2-choice .select2-arrow {
7
- border-radius: 0 2px 2px 0;
8
- }
9
-
10
- .form-control.select2-container {
11
- height: auto !important;
12
- padding: 0;
13
- }
14
-
15
- .form-control.select2-container.select2-dropdown-open {
16
- border-color: #5897FB;
17
- border-radius: 3px 3px 0 0;
18
- }
19
-
20
- .form-control .select2-container.select2-dropdown-open .select2-choices {
21
- border-radius: 3px 3px 0 0;
22
- }
23
-
24
- .form-control.select2-container .select2-choices {
25
- border: 0 !important;
26
- border-radius: 3px;
27
- }
28
-
29
- .control-group.warning .select2-container .select2-choice,
30
- .control-group.warning .select2-container .select2-choices,
31
- .control-group.warning .select2-container-active .select2-choice,
32
- .control-group.warning .select2-container-active .select2-choices,
33
- .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choice,
34
- .control-group.warning .select2-dropdown-open.select2-drop-above .select2-choices,
35
- .control-group.warning .select2-container-multi.select2-container-active .select2-choices {
36
- border: 1px solid #C09853 !important;
37
- }
38
-
39
- .control-group.warning .select2-container .select2-choice div {
40
- border-left: 1px solid #C09853 !important;
41
- background: #FCF8E3 !important;
42
- }
43
-
44
- .control-group.error .select2-container .select2-choice,
45
- .control-group.error .select2-container .select2-choices,
46
- .control-group.error .select2-container-active .select2-choice,
47
- .control-group.error .select2-container-active .select2-choices,
48
- .control-group.error .select2-dropdown-open.select2-drop-above .select2-choice,
49
- .control-group.error .select2-dropdown-open.select2-drop-above .select2-choices,
50
- .control-group.error .select2-container-multi.select2-container-active .select2-choices {
51
- border: 1px solid #B94A48 !important;
52
- }
53
-
54
- .control-group.error .select2-container .select2-choice div {
55
- border-left: 1px solid #B94A48 !important;
56
- background: #F2DEDE !important;
57
- }
58
-
59
- .control-group.info .select2-container .select2-choice,
60
- .control-group.info .select2-container .select2-choices,
61
- .control-group.info .select2-container-active .select2-choice,
62
- .control-group.info .select2-container-active .select2-choices,
63
- .control-group.info .select2-dropdown-open.select2-drop-above .select2-choice,
64
- .control-group.info .select2-dropdown-open.select2-drop-above .select2-choices,
65
- .control-group.info .select2-container-multi.select2-container-active .select2-choices {
66
- border: 1px solid #3A87AD !important;
67
- }
68
-
69
- .control-group.info .select2-container .select2-choice div {
70
- border-left: 1px solid #3A87AD !important;
71
- background: #D9EDF7 !important;
72
- }
73
-
74
- .control-group.success .select2-container .select2-choice,
75
- .control-group.success .select2-container .select2-choices,
76
- .control-group.success .select2-container-active .select2-choice,
77
- .control-group.success .select2-container-active .select2-choices,
78
- .control-group.success .select2-dropdown-open.select2-drop-above .select2-choice,
79
- .control-group.success .select2-dropdown-open.select2-drop-above .select2-choices,
80
- .control-group.success .select2-container-multi.select2-container-active .select2-choices {
81
- border: 1px solid #468847 !important;
82
- }
83
-
84
- .control-group.success .select2-container .select2-choice div {
85
- border-left: 1px solid #468847 !important;
86
- background: #DFF0D8 !important;
87
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/select2/select2-spinner.gif DELETED
Binary file
trunk/classes/admin/settings/assets/js/select2/select2.css DELETED
@@ -1,704 +0,0 @@
1
- /*
2
- Version: 3.5.2 Timestamp: Sat Nov 1 14:43:36 EDT 2014
3
- */
4
- .select2-container {
5
- margin: 0;
6
- position: relative;
7
- display: inline-block;
8
- /* inline-block for ie7 */
9
- zoom: 1;
10
- *display: inline;
11
- vertical-align: middle;
12
- }
13
-
14
- .select2-container,
15
- .select2-drop,
16
- .select2-search,
17
- .select2-search input {
18
- /*
19
- Force border-box so that % widths fit the parent
20
- container without overlap because of margin/padding.
21
- More Info : http://www.quirksmode.org/css/box.html
22
- */
23
- -webkit-box-sizing: border-box; /* webkit */
24
- -moz-box-sizing: border-box; /* firefox */
25
- box-sizing: border-box; /* css3 */
26
- }
27
-
28
- .select2-container .select2-choice {
29
- display: block;
30
- height: 26px;
31
- padding: 0 0 0 8px;
32
- overflow: hidden;
33
- position: relative;
34
-
35
- border: 1px solid #aaa;
36
- white-space: nowrap;
37
- line-height: 26px;
38
- color: #444;
39
- text-decoration: none;
40
-
41
- border-radius: 4px;
42
-
43
- background-clip: padding-box;
44
-
45
- -webkit-touch-callout: none;
46
- -webkit-user-select: none;
47
- -moz-user-select: none;
48
- -ms-user-select: none;
49
- user-select: none;
50
-
51
- background-color: #fff;
52
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff));
53
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%);
54
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%);
55
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0);
56
- background-image: linear-gradient(to top, #eee 0%, #fff 50%);
57
- }
58
-
59
- html[dir="rtl"] .select2-container .select2-choice {
60
- padding: 0 8px 0 0;
61
- }
62
-
63
- .select2-container.select2-drop-above .select2-choice {
64
- border-bottom-color: #aaa;
65
-
66
- border-radius: 0 0 4px 4px;
67
-
68
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff));
69
- background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%);
70
- background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%);
71
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);
72
- background-image: linear-gradient(to bottom, #eee 0%, #fff 90%);
73
- }
74
-
75
- .select2-container.select2-allowclear .select2-choice .select2-chosen {
76
- margin-right: 42px;
77
- }
78
-
79
- .select2-container .select2-choice > .select2-chosen {
80
- margin-right: 26px;
81
- display: block;
82
- overflow: hidden;
83
-
84
- white-space: nowrap;
85
-
86
- text-overflow: ellipsis;
87
- float: none;
88
- width: auto;
89
- }
90
-
91
- html[dir="rtl"] .select2-container .select2-choice > .select2-chosen {
92
- margin-left: 26px;
93
- margin-right: 0;
94
- }
95
-
96
- .select2-container .select2-choice abbr {
97
- display: none;
98
- width: 12px;
99
- height: 12px;
100
- position: absolute;
101
- right: 24px;
102
- top: 8px;
103
-
104
- font-size: 1px;
105
- text-decoration: none;
106
-
107
- border: 0;
108
- background: url('select2.png') right top no-repeat;
109
- cursor: pointer;
110
- outline: 0;
111
- }
112
-
113
- .select2-container.select2-allowclear .select2-choice abbr {
114
- display: inline-block;
115
- }
116
-
117
- .select2-container .select2-choice abbr:hover {
118
- background-position: right -11px;
119
- cursor: pointer;
120
- }
121
-
122
- .select2-drop-mask {
123
- border: 0;
124
- margin: 0;
125
- padding: 0;
126
- position: fixed;
127
- left: 0;
128
- top: 0;
129
- min-height: 100%;
130
- min-width: 100%;
131
- height: auto;
132
- width: auto;
133
- opacity: 0;
134
- z-index: 9998;
135
- /* styles required for IE to work */
136
- background-color: #fff;
137
- filter: alpha(opacity=0);
138
- }
139
-
140
- .select2-drop {
141
- width: 100%;
142
- margin-top: -1px;
143
- position: absolute;
144
- z-index: 9999;
145
- top: 100%;
146
-
147
- background: #fff;
148
- color: #000;
149
- border: 1px solid #aaa;
150
- border-top: 0;
151
-
152
- border-radius: 0 0 4px 4px;
153
-
154
- -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
155
- box-shadow: 0 4px 5px rgba(0, 0, 0, .15);
156
- }
157
-
158
- .select2-drop.select2-drop-above {
159
- margin-top: 1px;
160
- border-top: 1px solid #aaa;
161
- border-bottom: 0;
162
-
163
- border-radius: 4px 4px 0 0;
164
-
165
- -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
166
- box-shadow: 0 -4px 5px rgba(0, 0, 0, .15);
167
- }
168
-
169
- .select2-drop-active {
170
- border: 1px solid #5897fb;
171
- border-top: none;
172
- }
173
-
174
- .select2-drop.select2-drop-above.select2-drop-active {
175
- border-top: 1px solid #5897fb;
176
- }
177
-
178
- .select2-drop-auto-width {
179
- border-top: 1px solid #aaa;
180
- width: auto;
181
- }
182
-
183
- .select2-drop-auto-width .select2-search {
184
- padding-top: 4px;
185
- }
186
-
187
- .select2-container .select2-choice .select2-arrow {
188
- display: inline-block;
189
- width: 18px;
190
- height: 100%;
191
- position: absolute;
192
- right: 0;
193
- top: 0;
194
-
195
- border-left: 1px solid #aaa;
196
- border-radius: 0 4px 4px 0;
197
-
198
- background-clip: padding-box;
199
-
200
- background: #ccc;
201
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee));
202
- background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%);
203
- background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%);
204
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0);
205
- background-image: linear-gradient(to top, #ccc 0%, #eee 60%);
206
- }
207
-
208
- html[dir="rtl"] .select2-container .select2-choice .select2-arrow {
209
- left: 0;
210
- right: auto;
211
-
212
- border-left: none;
213
- border-right: 1px solid #aaa;
214
- border-radius: 4px 0 0 4px;
215
- }
216
-
217
- .select2-container .select2-choice .select2-arrow b {
218
- display: block;
219
- width: 100%;
220
- height: 100%;
221
- background: url('select2.png') no-repeat 0 1px;
222
- }
223
-
224
- html[dir="rtl"] .select2-container .select2-choice .select2-arrow b {
225
- background-position: 2px 1px;
226
- }
227
-
228
- .select2-search {
229
- display: inline-block;
230
- width: 100%;
231
- min-height: 26px;
232
- margin: 0;
233
- padding-left: 4px;
234
- padding-right: 4px;
235
-
236
- position: relative;
237
- z-index: 10000;
238
-
239
- white-space: nowrap;
240
- }
241
-
242
- .select2-search input {
243
- width: 100%;
244
- height: auto !important;
245
- min-height: 26px;
246
- padding: 4px 20px 4px 5px;
247
- margin: 0;
248
-
249
- outline: 0;
250
- font-family: sans-serif;
251
- font-size: 1em;
252
-
253
- border: 1px solid #aaa;
254
- border-radius: 0;
255
-
256
- -webkit-box-shadow: none;
257
- box-shadow: none;
258
-
259
- background: #fff url('select2.png') no-repeat 100% -22px;
260
- background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
261
- background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
262
- background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
263
- background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
264
- }
265
-
266
- html[dir="rtl"] .select2-search input {
267
- padding: 4px 5px 4px 20px;
268
-
269
- background: #fff url('select2.png') no-repeat -37px -22px;
270
- background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
271
- background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
272
- background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
273
- background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
274
- }
275
-
276
- .select2-drop.select2-drop-above .select2-search input {
277
- margin-top: 4px;
278
- }
279
-
280
- .select2-search input.select2-active {
281
- background: #fff url('select2-spinner.gif') no-repeat 100%;
282
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee));
283
- background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%);
284
- background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%);
285
- background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0;
286
- }
287
-
288
- .select2-container-active .select2-choice,
289
- .select2-container-active .select2-choices {
290
- border: 1px solid #5897fb;
291
- outline: none;
292
-
293
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
294
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
295
- }
296
-
297
- .select2-dropdown-open .select2-choice {
298
- border-bottom-color: transparent;
299
- -webkit-box-shadow: 0 1px 0 #fff inset;
300
- box-shadow: 0 1px 0 #fff inset;
301
-
302
- border-bottom-left-radius: 0;
303
- border-bottom-right-radius: 0;
304
-
305
- background-color: #eee;
306
- background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee));
307
- background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%);
308
- background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%);
309
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
310
- background-image: linear-gradient(to top, #fff 0%, #eee 50%);
311
- }
312
-
313
- .select2-dropdown-open.select2-drop-above .select2-choice,
314
- .select2-dropdown-open.select2-drop-above .select2-choices {
315
- border: 1px solid #5897fb;
316
- border-top-color: transparent;
317
-
318
- background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee));
319
- background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%);
320
- background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%);
321
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);
322
- background-image: linear-gradient(to bottom, #fff 0%, #eee 50%);
323
- }
324
-
325
- .select2-dropdown-open .select2-choice .select2-arrow {
326
- background: transparent;
327
- border-left: none;
328
- filter: none;
329
- }
330
- html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow {
331
- border-right: none;
332
- }
333
-
334
- .select2-dropdown-open .select2-choice .select2-arrow b {
335
- background-position: -18px 1px;
336
- }
337
-
338
- html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b {
339
- background-position: -16px 1px;
340
- }
341
-
342
- .select2-hidden-accessible {
343
- border: 0;
344
- clip: rect(0 0 0 0);
345
- height: 1px;
346
- margin: -1px;
347
- overflow: hidden;
348
- padding: 0;
349
- position: absolute;
350
- width: 1px;
351
- }
352
-
353
- /* results */
354
- .select2-results {
355
- max-height: 200px;
356
- padding: 0 0 0 4px;
357
- margin: 4px 4px 4px 0;
358
- position: relative;
359
- overflow-x: hidden;
360
- overflow-y: auto;
361
- -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
362
- }
363
-
364
- html[dir="rtl"] .select2-results {
365
- padding: 0 4px 0 0;
366
- margin: 4px 0 4px 4px;
367
- }
368
-
369
- .select2-results ul.select2-result-sub {
370
- margin: 0;
371
- padding-left: 0;
372
- }
373
-
374
- .select2-results li {
375
- list-style: none;
376
- display: list-item;
377
- background-image: none;
378
- }
379
-
380
- .select2-results li.select2-result-with-children > .select2-result-label {
381
- font-weight: bold;
382
- }
383
-
384
- .select2-results .select2-result-label {
385
- padding: 3px 7px 4px;
386
- margin: 0;
387
- cursor: pointer;
388
-
389
- min-height: 1em;
390
-
391
- -webkit-touch-callout: none;
392
- -webkit-user-select: none;
393
- -moz-user-select: none;
394
- -ms-user-select: none;
395
- user-select: none;
396
- }
397
-
398
- .select2-results-dept-1 .select2-result-label { padding-left: 20px }
399
- .select2-results-dept-2 .select2-result-label { padding-left: 40px }
400
- .select2-results-dept-3 .select2-result-label { padding-left: 60px }
401
- .select2-results-dept-4 .select2-result-label { padding-left: 80px }
402
- .select2-results-dept-5 .select2-result-label { padding-left: 100px }
403
- .select2-results-dept-6 .select2-result-label { padding-left: 110px }
404
- .select2-results-dept-7 .select2-result-label { padding-left: 120px }
405
-
406
- .select2-results .select2-highlighted {
407
- background: #3875d7;
408
- color: #fff;
409
- }
410
-
411
- .select2-results li em {
412
- background: #feffde;
413
- font-style: normal;
414
- }
415
-
416
- .select2-results .select2-highlighted em {
417
- background: transparent;
418
- }
419
-
420
- .select2-results .select2-highlighted ul {
421
- background: #fff;
422
- color: #000;
423
- }
424
-
425
- .select2-results .select2-no-results,
426
- .select2-results .select2-searching,
427
- .select2-results .select2-ajax-error,
428
- .select2-results .select2-selection-limit {
429
- background: #f4f4f4;
430
- display: list-item;
431
- padding-left: 5px;
432
- }
433
-
434
- /*
435
- disabled look for disabled choices in the results dropdown
436
- */
437
- .select2-results .select2-disabled.select2-highlighted {
438
- color: #666;
439
- background: #f4f4f4;
440
- display: list-item;
441
- cursor: default;
442
- }
443
- .select2-results .select2-disabled {
444
- background: #f4f4f4;
445
- display: list-item;
446
- cursor: default;
447
- }
448
-
449
- .select2-results .select2-selected {
450
- display: none;
451
- }
452
-
453
- .select2-more-results.select2-active {
454
- background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%;
455
- }
456
-
457
- .select2-results .select2-ajax-error {
458
- background: rgba(255, 50, 50, .2);
459
- }
460
-
461
- .select2-more-results {
462
- background: #f4f4f4;
463
- display: list-item;
464
- }
465
-
466
- /* disabled styles */
467
-
468
- .select2-container.select2-container-disabled .select2-choice {
469
- background-color: #f4f4f4;
470
- background-image: none;
471
- border: 1px solid #ddd;
472
- cursor: default;
473
- }
474
-
475
- .select2-container.select2-container-disabled .select2-choice .select2-arrow {
476
- background-color: #f4f4f4;
477
- background-image: none;
478
- border-left: 0;
479
- }
480
-
481
- .select2-container.select2-container-disabled .select2-choice abbr {
482
- display: none;
483
- }
484
-
485
-
486
- /* multiselect */
487
-
488
- .select2-container-multi .select2-choices {
489
- height: auto !important;
490
- height: 1%;
491
- margin: 0;
492
- padding: 0 5px 0 0;
493
- position: relative;
494
-
495
- border: 1px solid #aaa;
496
- cursor: text;
497
- overflow: hidden;
498
-
499
- background-color: #fff;
500
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff));
501
- background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%);
502
- background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%);
503
- background-image: linear-gradient(to bottom, #eee 1%, #fff 15%);
504
- }
505
-
506
- html[dir="rtl"] .select2-container-multi .select2-choices {
507
- padding: 0 0 0 5px;
508
- }
509
-
510
- .select2-locked {
511
- padding: 3px 5px 3px 5px !important;
512
- }
513
-
514
- .select2-container-multi .select2-choices {
515
- min-height: 26px;
516
- }
517
-
518
- .select2-container-multi.select2-container-active .select2-choices {
519
- border: 1px solid #5897fb;
520
- outline: none;
521
-
522
- -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3);
523
- box-shadow: 0 0 5px rgba(0, 0, 0, .3);
524
- }
525
- .select2-container-multi .select2-choices li {
526
- float: left;
527
- list-style: none;
528
- }
529
- html[dir="rtl"] .select2-container-multi .select2-choices li
530
- {
531
- float: right;
532
- }
533
- .select2-container-multi .select2-choices .select2-search-field {
534
- margin: 0;
535
- padding: 0;
536
- white-space: nowrap;
537
- }
538
-
539
- .select2-container-multi .select2-choices .select2-search-field input {
540
- padding: 5px;
541
- margin: 1px 0;
542
-
543
- font-family: sans-serif;
544
- font-size: 100%;
545
- color: #666;
546
- outline: 0;
547
- border: 0;
548
- -webkit-box-shadow: none;
549
- box-shadow: none;
550
- background: transparent !important;
551
- }
552
-
553
- .select2-container-multi .select2-choices .select2-search-field input.select2-active {
554
- background: #fff url('select2-spinner.gif') no-repeat 100% !important;
555
- }
556
-
557
- .select2-default {
558
- color: #999 !important;
559
- }
560
-
561
- .select2-container-multi .select2-choices .select2-search-choice {
562
- padding: 3px 5px 3px 18px;
563
- margin: 3px 0 3px 5px;
564
- position: relative;
565
-
566
- line-height: 13px;
567
- color: #333;
568
- cursor: default;
569
- border: 1px solid #aaaaaa;
570
-
571
- border-radius: 3px;
572
-
573
- -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
574
- box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05);
575
-
576
- background-clip: padding-box;
577
-
578
- -webkit-touch-callout: none;
579
- -webkit-user-select: none;
580
- -moz-user-select: none;
581
- -ms-user-select: none;
582
- user-select: none;
583
-
584
- background-color: #e4e4e4;
585
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0);
586
- background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee));
587
- background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
588
- background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
589
- background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%);
590
- }
591
- html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice
592
- {
593
- margin: 3px 5px 3px 0;
594
- padding: 3px 18px 3px 5px;
595
- }
596
- .select2-container-multi .select2-choices .select2-search-choice .select2-chosen {
597
- cursor: default;
598
- }
599
- .select2-container-multi .select2-choices .select2-search-choice-focus {
600
- background: #d4d4d4;
601
- }
602
-
603
- .select2-search-choice-close {
604
- display: block;
605
- width: 12px;
606
- height: 13px;
607
- position: absolute;
608
- right: 3px;
609
- top: 4px;
610
-
611
- font-size: 1px;
612
- outline: none;
613
- background: url('select2.png') right top no-repeat;
614
- }
615
- html[dir="rtl"] .select2-search-choice-close {
616
- right: auto;
617
- left: 3px;
618
- }
619
-
620
- .select2-container-multi .select2-search-choice-close {
621
- left: 3px;
622
- }
623
-
624
- html[dir="rtl"] .select2-container-multi .select2-search-choice-close {
625
- left: auto;
626
- right: 2px;
627
- }
628
-
629
- .select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover {
630
- background-position: right -11px;
631
- }
632
- .select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close {
633
- background-position: right -11px;
634
- }
635
-
636
- /* disabled styles */
637
- .select2-container-multi.select2-container-disabled .select2-choices {
638
- background-color: #f4f4f4;
639
- background-image: none;
640
- border: 1px solid #ddd;
641
- cursor: default;
642
- }
643
-
644
- .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice {
645
- padding: 3px 5px 3px 5px;
646
- border: 1px solid #ddd;
647
- background-image: none;
648
- background-color: #f4f4f4;
649
- }
650
-
651
- .select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none;
652
- background: none;
653
- }
654
- /* end multiselect */
655
-
656
-
657
- .select2-result-selectable .select2-match,
658
- .select2-result-unselectable .select2-match {
659
- text-decoration: underline;
660
- }
661
-
662
- .select2-offscreen, .select2-offscreen:focus {
663
- clip: rect(0 0 0 0) !important;
664
- width: 1px !important;
665
- height: 1px !important;
666
- border: 0 !important;
667
- margin: 0 !important;
668
- padding: 0 !important;
669
- overflow: hidden !important;
670
- position: absolute !important;
671
- outline: 0 !important;
672
- left: 0px !important;
673
- top: 0px !important;
674
- }
675
-
676
- .select2-display-none {
677
- display: none;
678
- }
679
-
680
- .select2-measure-scrollbar {
681
- position: absolute;
682
- top: -10000px;
683
- left: -10000px;
684
- width: 100px;
685
- height: 100px;
686
- overflow: scroll;
687
- }
688
-
689
- /* Retina-ize icons */
690
-
691
- @media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) {
692
- .select2-search input,
693
- .select2-search-choice-close,
694
- .select2-container .select2-choice abbr,
695
- .select2-container .select2-choice .select2-arrow b {
696
- background-image: url('select2x2.png') !important;
697
- background-repeat: no-repeat !important;
698
- background-size: 60px 40px !important;
699
- }
700
-
701
- .select2-search input {
702
- background-position: 100% -21px !important;
703
- }
704
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/select2/select2.js DELETED
@@ -1,3541 +0,0 @@
1
- /*
2
- Copyright 2012 Igor Vaynberg
3
-
4
- Version: 3.5.2 Timestamp: Sat Nov 1 14:43:36 EDT 2014
5
-
6
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
7
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
8
- use of this software only upon the condition that you accept all of the terms of either the Apache
9
- License or the GPL License.
10
-
11
- You may obtain a copy of the Apache License and the GPL License at:
12
-
13
- http://www.apache.org/licenses/LICENSE-2.0
14
- http://www.gnu.org/licenses/gpl-2.0.html
15
-
16
- Unless required by applicable law or agreed to in writing, software distributed under the
17
- Apache License or the GPL License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
18
- CONDITIONS OF ANY KIND, either express or implied. See the Apache License and the GPL License for
19
- the specific language governing permissions and limitations under the Apache License and the GPL License.
20
- */
21
- (function ($) {
22
- if(typeof $.fn.each2 == "undefined") {
23
- $.extend($.fn, {
24
- /*
25
- * 4-10 times faster .each replacement
26
- * use it carefully, as it overrides jQuery context of element on each iteration
27
- */
28
- each2 : function (c) {
29
- var j = $([0]), i = -1, l = this.length;
30
- while (
31
- ++i < l
32
- && (j.context = j[0] = this[i])
33
- && c.call(j[0], i, j) !== false //"this"=DOM, i=index, j=jQuery object
34
- );
35
- return this;
36
- }
37
- });
38
- }
39
- })(jQuery);
40
-
41
- (function ($, undefined) {
42
- "use strict";
43
- /*global document, window, jQuery, console */
44
-
45
- if (window.Select2 !== undefined) {
46
- return;
47
- }
48
-
49
- var AbstractSelect2, SingleSelect2, MultiSelect2, nextUid, sizer,
50
- lastMousePosition={x:0,y:0}, $document, scrollBarDimensions,
51
-
52
- KEY = {
53
- TAB: 9,
54
- ENTER: 13,
55
- ESC: 27,
56
- SPACE: 32,
57
- LEFT: 37,
58
- UP: 38,
59
- RIGHT: 39,
60
- DOWN: 40,
61
- SHIFT: 16,
62
- CTRL: 17,
63
- ALT: 18,
64
- PAGE_UP: 33,
65
- PAGE_DOWN: 34,
66
- HOME: 36,
67
- END: 35,
68
- BACKSPACE: 8,
69
- DELETE: 46,
70
- isArrow: function (k) {
71
- k = k.which ? k.which : k;
72
- switch (k) {
73
- case KEY.LEFT:
74
- case KEY.RIGHT:
75
- case KEY.UP:
76
- case KEY.DOWN:
77
- return true;
78
- }
79
- return false;
80
- },
81
- isControl: function (e) {
82
- var k = e.which;
83
- switch (k) {
84
- case KEY.SHIFT:
85
- case KEY.CTRL:
86
- case KEY.ALT:
87
- return true;
88
- }
89
-
90
- if (e.metaKey) return true;
91
-
92
- return false;
93
- },
94
- isFunctionKey: function (k) {
95
- k = k.which ? k.which : k;
96
- return k >= 112 && k <= 123;
97
- }
98
- },
99
- MEASURE_SCROLLBAR_TEMPLATE = "<div class='select2-measure-scrollbar'></div>",
100
-
101
- DIACRITICS = {"\u24B6":"A","\uFF21":"A","\u00C0":"A","\u00C1":"A","\u00C2":"A","\u1EA6":"A","\u1EA4":"A","\u1EAA":"A","\u1EA8":"A","\u00C3":"A","\u0100":"A","\u0102":"A","\u1EB0":"A","\u1EAE":"A","\u1EB4":"A","\u1EB2":"A","\u0226":"A","\u01E0":"A","\u00C4":"A","\u01DE":"A","\u1EA2":"A","\u00C5":"A","\u01FA":"A","\u01CD":"A","\u0200":"A","\u0202":"A","\u1EA0":"A","\u1EAC":"A","\u1EB6":"A","\u1E00":"A","\u0104":"A","\u023A":"A","\u2C6F":"A","\uA732":"AA","\u00C6":"AE","\u01FC":"AE","\u01E2":"AE","\uA734":"AO","\uA736":"AU","\uA738":"AV","\uA73A":"AV","\uA73C":"AY","\u24B7":"B","\uFF22":"B","\u1E02":"B","\u1E04":"B","\u1E06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24B8":"C","\uFF23":"C","\u0106":"C","\u0108":"C","\u010A":"C","\u010C":"C","\u00C7":"C","\u1E08":"C","\u0187":"C","\u023B":"C","\uA73E":"C","\u24B9":"D","\uFF24":"D","\u1E0A":"D","\u010E":"D","\u1E0C":"D","\u1E10":"D","\u1E12":"D","\u1E0E":"D","\u0110":"D","\u018B":"D","\u018A":"D","\u0189":"D","\uA779":"D","\u01F1":"DZ","\u01C4":"DZ","\u01F2":"Dz","\u01C5":"Dz","\u24BA":"E","\uFF25":"E","\u00C8":"E","\u00C9":"E","\u00CA":"E","\u1EC0":"E","\u1EBE":"E","\u1EC4":"E","\u1EC2":"E","\u1EBC":"E","\u0112":"E","\u1E14":"E","\u1E16":"E","\u0114":"E","\u0116":"E","\u00CB":"E","\u1EBA":"E","\u011A":"E","\u0204":"E","\u0206":"E","\u1EB8":"E","\u1EC6":"E","\u0228":"E","\u1E1C":"E","\u0118":"E","\u1E18":"E","\u1E1A":"E","\u0190":"E","\u018E":"E","\u24BB":"F","\uFF26":"F","\u1E1E":"F","\u0191":"F","\uA77B":"F","\u24BC":"G","\uFF27":"G","\u01F4":"G","\u011C":"G","\u1E20":"G","\u011E":"G","\u0120":"G","\u01E6":"G","\u0122":"G","\u01E4":"G","\u0193":"G","\uA7A0":"G","\uA77D":"G","\uA77E":"G","\u24BD":"H","\uFF28":"H","\u0124":"H","\u1E22":"H","\u1E26":"H","\u021E":"H","\u1E24":"H","\u1E28":"H","\u1E2A":"H","\u0126":"H","\u2C67":"H","\u2C75":"H","\uA78D":"H","\u24BE":"I","\uFF29":"I","\u00CC":"I","\u00CD":"I","\u00CE":"I","\u0128":"I","\u012A":"I","\u012C":"I","\u0130":"I","\u00CF":"I","\u1E2E":"I","\u1EC8":"I","\u01CF":"I","\u0208":"I","\u020A":"I","\u1ECA":"I","\u012E":"I","\u1E2C":"I","\u0197":"I","\u24BF":"J","\uFF2A":"J","\u0134":"J","\u0248":"J","\u24C0":"K","\uFF2B":"K","\u1E30":"K","\u01E8":"K","\u1E32":"K","\u0136":"K","\u1E34":"K","\u0198":"K","\u2C69":"K","\uA740":"K","\uA742":"K","\uA744":"K","\uA7A2":"K","\u24C1":"L","\uFF2C":"L","\u013F":"L","\u0139":"L","\u013D":"L","\u1E36":"L","\u1E38":"L","\u013B":"L","\u1E3C":"L","\u1E3A":"L","\u0141":"L","\u023D":"L","\u2C62":"L","\u2C60":"L","\uA748":"L","\uA746":"L","\uA780":"L","\u01C7":"LJ","\u01C8":"Lj","\u24C2":"M","\uFF2D":"M","\u1E3E":"M","\u1E40":"M","\u1E42":"M","\u2C6E":"M","\u019C":"M","\u24C3":"N","\uFF2E":"N","\u01F8":"N","\u0143":"N","\u00D1":"N","\u1E44":"N","\u0147":"N","\u1E46":"N","\u0145":"N","\u1E4A":"N","\u1E48":"N","\u0220":"N","\u019D":"N","\uA790":"N","\uA7A4":"N","\u01CA":"NJ","\u01CB":"Nj","\u24C4":"O","\uFF2F":"O","\u00D2":"O","\u00D3":"O","\u00D4":"O","\u1ED2":"O","\u1ED0":"O","\u1ED6":"O","\u1ED4":"O","\u00D5":"O","\u1E4C":"O","\u022C":"O","\u1E4E":"O","\u014C":"O","\u1E50":"O","\u1E52":"O","\u014E":"O","\u022E":"O","\u0230":"O","\u00D6":"O","\u022A":"O","\u1ECE":"O","\u0150":"O","\u01D1":"O","\u020C":"O","\u020E":"O","\u01A0":"O","\u1EDC":"O","\u1EDA":"O","\u1EE0":"O","\u1EDE":"O","\u1EE2":"O","\u1ECC":"O","\u1ED8":"O","\u01EA":"O","\u01EC":"O","\u00D8":"O","\u01FE":"O","\u0186":"O","\u019F":"O","\uA74A":"O","\uA74C":"O","\u01A2":"OI","\uA74E":"OO","\u0222":"OU","\u24C5":"P","\uFF30":"P","\u1E54":"P","\u1E56":"P","\u01A4":"P","\u2C63":"P","\uA750":"P","\uA752":"P","\uA754":"P","\u24C6":"Q","\uFF31":"Q","\uA756":"Q","\uA758":"Q","\u024A":"Q","\u24C7":"R","\uFF32":"R","\u0154":"R","\u1E58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1E5A":"R","\u1E5C":"R","\u0156":"R","\u1E5E":"R","\u024C":"R","\u2C64":"R","\uA75A":"R","\uA7A6":"R","\uA782":"R","\u24C8":"S","\uFF33":"S","\u1E9E":"S","\u015A":"S","\u1E64":"S","\u015C":"S","\u1E60":"S","\u0160":"S","\u1E66":"S","\u1E62":"S","\u1E68":"S","\u0218":"S","\u015E":"S","\u2C7E":"S","\uA7A8":"S","\uA784":"S","\u24C9":"T","\uFF34":"T","\u1E6A":"T","\u0164":"T","\u1E6C":"T","\u021A":"T","\u0162":"T","\u1E70":"T","\u1E6E":"T","\u0166":"T","\u01AC":"T","\u01AE":"T","\u023E":"T","\uA786":"T","\uA728":"TZ","\u24CA":"U","\uFF35":"U","\u00D9":"U","\u00DA":"U","\u00DB":"U","\u0168":"U","\u1E78":"U","\u016A":"U","\u1E7A":"U","\u016C":"U","\u00DC":"U","\u01DB":"U","\u01D7":"U","\u01D5":"U","\u01D9":"U","\u1EE6":"U","\u016E":"U","\u0170":"U","\u01D3":"U","\u0214":"U","\u0216":"U","\u01AF":"U","\u1EEA":"U","\u1EE8":"U","\u1EEE":"U","\u1EEC":"U","\u1EF0":"U","\u1EE4":"U","\u1E72":"U","\u0172":"U","\u1E76":"U","\u1E74":"U","\u0244":"U","\u24CB":"V","\uFF36":"V","\u1E7C":"V","\u1E7E":"V","\u01B2":"V","\uA75E":"V","\u0245":"V","\uA760":"VY","\u24CC":"W","\uFF37":"W","\u1E80":"W","\u1E82":"W","\u0174":"W","\u1E86":"W","\u1E84":"W","\u1E88":"W","\u2C72":"W","\u24CD":"X","\uFF38":"X","\u1E8A":"X","\u1E8C":"X","\u24CE":"Y","\uFF39":"Y","\u1EF2":"Y","\u00DD":"Y","\u0176":"Y","\u1EF8":"Y","\u0232":"Y","\u1E8E":"Y","\u0178":"Y","\u1EF6":"Y","\u1EF4":"Y","\u01B3":"Y","\u024E":"Y","\u1EFE":"Y","\u24CF":"Z","\uFF3A":"Z","\u0179":"Z","\u1E90":"Z","\u017B":"Z","\u017D":"Z","\u1E92":"Z","\u1E94":"Z","\u01B5":"Z","\u0224":"Z","\u2C7F":"Z","\u2C6B":"Z","\uA762":"Z","\u24D0":"a","\uFF41":"a","\u1E9A":"a","\u00E0":"a","\u00E1":"a","\u00E2":"a","\u1EA7":"a","\u1EA5":"a","\u1EAB":"a","\u1EA9":"a","\u00E3":"a","\u0101":"a","\u0103":"a","\u1EB1":"a","\u1EAF":"a","\u1EB5":"a","\u1EB3":"a","\u0227":"a","\u01E1":"a","\u00E4":"a","\u01DF":"a","\u1EA3":"a","\u00E5":"a","\u01FB":"a","\u01CE":"a","\u0201":"a","\u0203":"a","\u1EA1":"a","\u1EAD":"a","\u1EB7":"a","\u1E01":"a","\u0105":"a","\u2C65":"a","\u0250":"a","\uA733":"aa","\u00E6":"ae","\u01FD":"ae","\u01E3":"ae","\uA735":"ao","\uA737":"au","\uA739":"av","\uA73B":"av","\uA73D":"ay","\u24D1":"b","\uFF42":"b","\u1E03":"b","\u1E05":"b","\u1E07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24D2":"c","\uFF43":"c","\u0107":"c","\u0109":"c","\u010B":"c","\u010D":"c","\u00E7":"c","\u1E09":"c","\u0188":"c","\u023C":"c","\uA73F":"c","\u2184":"c","\u24D3":"d","\uFF44":"d","\u1E0B":"d","\u010F":"d","\u1E0D":"d","\u1E11":"d","\u1E13":"d","\u1E0F":"d","\u0111":"d","\u018C":"d","\u0256":"d","\u0257":"d","\uA77A":"d","\u01F3":"dz","\u01C6":"dz","\u24D4":"e","\uFF45":"e","\u00E8":"e","\u00E9":"e","\u00EA":"e","\u1EC1":"e","\u1EBF":"e","\u1EC5":"e","\u1EC3":"e","\u1EBD":"e","\u0113":"e","\u1E15":"e","\u1E17":"e","\u0115":"e","\u0117":"e","\u00EB":"e","\u1EBB":"e","\u011B":"e","\u0205":"e","\u0207":"e","\u1EB9":"e","\u1EC7":"e","\u0229":"e","\u1E1D":"e","\u0119":"e","\u1E19":"e","\u1E1B":"e","\u0247":"e","\u025B":"e","\u01DD":"e","\u24D5":"f","\uFF46":"f","\u1E1F":"f","\u0192":"f","\uA77C":"f","\u24D6":"g","\uFF47":"g","\u01F5":"g","\u011D":"g","\u1E21":"g","\u011F":"g","\u0121":"g","\u01E7":"g","\u0123":"g","\u01E5":"g","\u0260":"g","\uA7A1":"g","\u1D79":"g","\uA77F":"g","\u24D7":"h","\uFF48":"h","\u0125":"h","\u1E23":"h","\u1E27":"h","\u021F":"h","\u1E25":"h","\u1E29":"h","\u1E2B":"h","\u1E96":"h","\u0127":"h","\u2C68":"h","\u2C76":"h","\u0265":"h","\u0195":"hv","\u24D8":"i","\uFF49":"i","\u00EC":"i","\u00ED":"i","\u00EE":"i","\u0129":"i","\u012B":"i","\u012D":"i","\u00EF":"i","\u1E2F":"i","\u1EC9":"i","\u01D0":"i","\u0209":"i","\u020B":"i","\u1ECB":"i","\u012F":"i","\u1E2D":"i","\u0268":"i","\u0131":"i","\u24D9":"j","\uFF4A":"j","\u0135":"j","\u01F0":"j","\u0249":"j","\u24DA":"k","\uFF4B":"k","\u1E31":"k","\u01E9":"k","\u1E33":"k","\u0137":"k","\u1E35":"k","\u0199":"k","\u2C6A":"k","\uA741":"k","\uA743":"k","\uA745":"k","\uA7A3":"k","\u24DB":"l","\uFF4C":"l","\u0140":"l","\u013A":"l","\u013E":"l","\u1E37":"l","\u1E39":"l","\u013C":"l","\u1E3D":"l","\u1E3B":"l","\u017F":"l","\u0142":"l","\u019A":"l","\u026B":"l","\u2C61":"l","\uA749":"l","\uA781":"l","\uA747":"l","\u01C9":"lj","\u24DC":"m","\uFF4D":"m","\u1E3F":"m","\u1E41":"m","\u1E43":"m","\u0271":"m","\u026F":"m","\u24DD":"n","\uFF4E":"n","\u01F9":"n","\u0144":"n","\u00F1":"n","\u1E45":"n","\u0148":"n","\u1E47":"n","\u0146":"n","\u1E4B":"n","\u1E49":"n","\u019E":"n","\u0272":"n","\u0149":"n","\uA791":"n","\uA7A5":"n","\u01CC":"nj","\u24DE":"o","\uFF4F":"o","\u00F2":"o","\u00F3":"o","\u00F4":"o","\u1ED3":"o","\u1ED1":"o","\u1ED7":"o","\u1ED5":"o","\u00F5":"o","\u1E4D":"o","\u022D":"o","\u1E4F":"o","\u014D":"o","\u1E51":"o","\u1E53":"o","\u014F":"o","\u022F":"o","\u0231":"o","\u00F6":"o","\u022B":"o","\u1ECF":"o","\u0151":"o","\u01D2":"o","\u020D":"o","\u020F":"o","\u01A1":"o","\u1EDD":"o","\u1EDB":"o","\u1EE1":"o","\u1EDF":"o","\u1EE3":"o","\u1ECD":"o","\u1ED9":"o","\u01EB":"o","\u01ED":"o","\u00F8":"o","\u01FF":"o","\u0254":"o","\uA74B":"o","\uA74D":"o","\u0275":"o","\u01A3":"oi","\u0223":"ou","\uA74F":"oo","\u24DF":"p","\uFF50":"p","\u1E55":"p","\u1E57":"p","\u01A5":"p","\u1D7D":"p","\uA751":"p","\uA753":"p","\uA755":"p","\u24E0":"q","\uFF51":"q","\u024B":"q","\uA757":"q","\uA759":"q","\u24E1":"r","\uFF52":"r","\u0155":"r","\u1E59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1E5B":"r","\u1E5D":"r","\u0157":"r","\u1E5F":"r","\u024D":"r","\u027D":"r","\uA75B":"r","\uA7A7":"r","\uA783":"r","\u24E2":"s","\uFF53":"s","\u00DF":"s","\u015B":"s","\u1E65":"s","\u015D":"s","\u1E61":"s","\u0161":"s","\u1E67":"s","\u1E63":"s","\u1E69":"s","\u0219":"s","\u015F":"s","\u023F":"s","\uA7A9":"s","\uA785":"s","\u1E9B":"s","\u24E3":"t","\uFF54":"t","\u1E6B":"t","\u1E97":"t","\u0165":"t","\u1E6D":"t","\u021B":"t","\u0163":"t","\u1E71":"t","\u1E6F":"t","\u0167":"t","\u01AD":"t","\u0288":"t","\u2C66":"t","\uA787":"t","\uA729":"tz","\u24E4":"u","\uFF55":"u","\u00F9":"u","\u00FA":"u","\u00FB":"u","\u0169":"u","\u1E79":"u","\u016B":"u","\u1E7B":"u","\u016D":"u","\u00FC":"u","\u01DC":"u","\u01D8":"u","\u01D6":"u","\u01DA":"u","\u1EE7":"u","\u016F":"u","\u0171":"u","\u01D4":"u","\u0215":"u","\u0217":"u","\u01B0":"u","\u1EEB":"u","\u1EE9":"u","\u1EEF":"u","\u1EED":"u","\u1EF1":"u","\u1EE5":"u","\u1E73":"u","\u0173":"u","\u1E77":"u","\u1E75":"u","\u0289":"u","\u24E5":"v","\uFF56":"v","\u1E7D":"v","\u1E7F":"v","\u028B":"v","\uA75F":"v","\u028C":"v","\uA761":"vy","\u24E6":"w","\uFF57":"w","\u1E81":"w","\u1E83":"w","\u0175":"w","\u1E87":"w","\u1E85":"w","\u1E98":"w","\u1E89":"w","\u2C73":"w","\u24E7":"x","\uFF58":"x","\u1E8B":"x","\u1E8D":"x","\u24E8":"y","\uFF59":"y","\u1EF3":"y","\u00FD":"y","\u0177":"y","\u1EF9":"y","\u0233":"y","\u1E8F":"y","\u00FF":"y","\u1EF7":"y","\u1E99":"y","\u1EF5":"y","\u01B4":"y","\u024F":"y","\u1EFF":"y","\u24E9":"z","\uFF5A":"z","\u017A":"z","\u1E91":"z","\u017C":"z","\u017E":"z","\u1E93":"z","\u1E95":"z","\u01B6":"z","\u0225":"z","\u0240":"z","\u2C6C":"z","\uA763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038A":"\u0399","\u03AA":"\u0399","\u038C":"\u039F","\u038E":"\u03A5","\u03AB":"\u03A5","\u038F":"\u03A9","\u03AC":"\u03B1","\u03AD":"\u03B5","\u03AE":"\u03B7","\u03AF":"\u03B9","\u03CA":"\u03B9","\u0390":"\u03B9","\u03CC":"\u03BF","\u03CD":"\u03C5","\u03CB":"\u03C5","\u03B0":"\u03C5","\u03C9":"\u03C9","\u03C2":"\u03C3"};
102
-
103
- $document = $(document);
104
-
105
- nextUid=(function() { var counter=1; return function() { return counter++; }; }());
106
-
107
-
108
- function reinsertElement(element) {
109
- var placeholder = $(document.createTextNode(''));
110
-
111
- element.before(placeholder);
112
- placeholder.before(element);
113
- placeholder.remove();
114
- }
115
-
116
- function stripDiacritics(str) {
117
- // Used 'uni range + named function' from http://jsperf.com/diacritics/18
118
- function match(a) {
119
- return DIACRITICS[a] || a;
120
- }
121
-
122
- return str.replace(/[^\u0000-\u007E]/g, match);
123
- }
124
-
125
- function indexOf(value, array) {
126
- var i = 0, l = array.length;
127
- for (; i < l; i = i + 1) {
128
- if (equal(value, array[i])) return i;
129
- }
130
- return -1;
131
- }
132
-
133
- function measureScrollbar () {
134
- var $template = $( MEASURE_SCROLLBAR_TEMPLATE );
135
- $template.appendTo(document.body);
136
-
137
- var dim = {
138
- width: $template.width() - $template[0].clientWidth,
139
- height: $template.height() - $template[0].clientHeight
140
- };
141
- $template.remove();
142
-
143
- return dim;
144
- }
145
-
146
- /**
147
- * Compares equality of a and b
148
- * @param a
149
- * @param b
150
- */
151
- function equal(a, b) {
152
- if (a === b) return true;
153
- if (a === undefined || b === undefined) return false;
154
- if (a === null || b === null) return false;
155
- // Check whether 'a' or 'b' is a string (primitive or object).
156
- // The concatenation of an empty string (+'') converts its argument to a string's primitive.
157
- if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object
158
- if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object
159
- return false;
160
- }
161
-
162
- /**
163
- * Splits the string into an array of values, transforming each value. An empty array is returned for nulls or empty
164
- * strings
165
- * @param string
166
- * @param separator
167
- */
168
- function splitVal(string, separator, transform) {
169
- var val, i, l;
170
- if (string === null || string.length < 1) return [];
171
- val = string.split(separator);
172
- for (i = 0, l = val.length; i < l; i = i + 1) val[i] = transform(val[i]);
173
- return val;
174
- }
175
-
176
- function getSideBorderPadding(element) {
177
- return element.outerWidth(false) - element.width();
178
- }
179
-
180
- function installKeyUpChangeEvent(element) {
181
- var key="keyup-change-value";
182
- element.on("keydown", function () {
183
- if ($.data(element, key) === undefined) {
184
- $.data(element, key, element.val());
185
- }
186
- });
187
- element.on("keyup", function () {
188
- var val= $.data(element, key);
189
- if (val !== undefined && element.val() !== val) {
190
- $.removeData(element, key);
191
- element.trigger("keyup-change");
192
- }
193
- });
194
- }
195
-
196
-
197
- /**
198
- * filters mouse events so an event is fired only if the mouse moved.
199
- *
200
- * filters out mouse events that occur when mouse is stationary but
201
- * the elements under the pointer are scrolled.
202
- */
203
- function installFilteredMouseMove(element) {
204
- element.on("mousemove", function (e) {
205
- var lastpos = lastMousePosition;
206
- if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) {
207
- $(e.target).trigger("mousemove-filtered", e);
208
- }
209
- });
210
- }
211
-
212
- /**
213
- * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made
214
- * within the last quietMillis milliseconds.
215
- *
216
- * @param quietMillis number of milliseconds to wait before invoking fn
217
- * @param fn function to be debounced
218
- * @param ctx object to be used as this reference within fn
219
- * @return debounced version of fn
220
- */
221
- function debounce(quietMillis, fn, ctx) {
222
- ctx = ctx || undefined;
223
- var timeout;
224
- return function () {
225
- var args = arguments;
226
- window.clearTimeout(timeout);
227
- timeout = window.setTimeout(function() {
228
- fn.apply(ctx, args);
229
- }, quietMillis);
230
- };
231
- }
232
-
233
- function installDebouncedScroll(threshold, element) {
234
- var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);});
235
- element.on("scroll", function (e) {
236
- if (indexOf(e.target, element.get()) >= 0) notify(e);
237
- });
238
- }
239
-
240
- function focus($el) {
241
- if ($el[0] === document.activeElement) return;
242
-
243
- /* set the focus in a 0 timeout - that way the focus is set after the processing
244
- of the current event has finished - which seems like the only reliable way
245
- to set focus */
246
- window.setTimeout(function() {
247
- var el=$el[0], pos=$el.val().length, range;
248
-
249
- $el.focus();
250
-
251
- /* make sure el received focus so we do not error out when trying to manipulate the caret.
252
- sometimes modals or others listeners may steal it after its set */
253
- var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0);
254
- if (isVisible && el === document.activeElement) {
255
-
256
- /* after the focus is set move the caret to the end, necessary when we val()
257
- just before setting focus */
258
- if(el.setSelectionRange)
259
- {
260
- el.setSelectionRange(pos, pos);
261
- }
262
- else if (el.createTextRange) {
263
- range = el.createTextRange();
264
- range.collapse(false);
265
- range.select();
266
- }
267
- }
268
- }, 0);
269
- }
270
-
271
- function getCursorInfo(el) {
272
- el = $(el)[0];
273
- var offset = 0;
274
- var length = 0;
275
- if ('selectionStart' in el) {
276
- offset = el.selectionStart;
277
- length = el.selectionEnd - offset;
278
- } else if ('selection' in document) {
279
- el.focus();
280
- var sel = document.selection.createRange();
281
- length = document.selection.createRange().text.length;
282
- sel.moveStart('character', -el.value.length);
283
- offset = sel.text.length - length;
284
- }
285
- return { offset: offset, length: length };
286
- }
287
-
288
- function killEvent(event) {
289
- event.preventDefault();
290
- event.stopPropagation();
291
- }
292
- function killEventImmediately(event) {
293
- event.preventDefault();
294
- event.stopImmediatePropagation();
295
- }
296
-
297
- function measureTextWidth(e) {
298
- if (!sizer){
299
- var style = e[0].currentStyle || window.getComputedStyle(e[0], null);
300
- sizer = $(document.createElement("div")).css({
301
- position: "absolute",
302
- left: "-10000px",
303
- top: "-10000px",
304
- display: "none",
305
- fontSize: style.fontSize,
306
- fontFamily: style.fontFamily,
307
- fontStyle: style.fontStyle,
308
- fontWeight: style.fontWeight,
309
- letterSpacing: style.letterSpacing,
310
- textTransform: style.textTransform,
311
- whiteSpace: "nowrap"
312
- });
313
- sizer.attr("class","select2-sizer");
314
- $(document.body).append(sizer);
315
- }
316
- sizer.text(e.val());
317
- return sizer.width();
318
- }
319
-
320
- function syncCssClasses(dest, src, adapter) {
321
- var classes, replacements = [], adapted;
322
-
323
- classes = $.trim(dest.attr("class"));
324
-
325
- if (classes) {
326
- classes = '' + classes; // for IE which returns object
327
-
328
- $(classes.split(/\s+/)).each2(function() {
329
- if (this.indexOf("select2-") === 0) {
330
- replacements.push(this);
331
- }
332
- });
333
- }
334
-
335
- classes = $.trim(src.attr("class"));
336
-
337
- if (classes) {
338
- classes = '' + classes; // for IE which returns object
339
-
340
- $(classes.split(/\s+/)).each2(function() {
341
- if (this.indexOf("select2-") !== 0) {
342
- adapted = adapter(this);
343
-
344
- if (adapted) {
345
- replacements.push(adapted);
346
- }
347
- }
348
- });
349
- }
350
-
351
- dest.attr("class", replacements.join(" "));
352
- }
353
-
354
-
355
- function markMatch(text, term, markup, escapeMarkup) {
356
- var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())),
357
- tl=term.length;
358
-
359
- if (match<0) {
360
- markup.push(escapeMarkup(text));
361
- return;
362
- }
363
-
364
- markup.push(escapeMarkup(text.substring(0, match)));
365
- markup.push("<span class='select2-match'>");
366
- markup.push(escapeMarkup(text.substring(match, match + tl)));
367
- markup.push("</span>");
368
- markup.push(escapeMarkup(text.substring(match + tl, text.length)));
369
- }
370
-
371
- function defaultEscapeMarkup(markup) {
372
- var replace_map = {
373
- '\\': '&#92;',
374
- '&': '&amp;',
375
- '<': '&lt;',
376
- '>': '&gt;',
377
- '"': '&quot;',
378
- "'": '&#39;',
379
- "/": '&#47;'
380
- };
381
-
382
- return String(markup).replace(/[&<>"'\/\\]/g, function (match) {
383
- return replace_map[match];
384
- });
385
- }
386
-
387
- /**
388
- * Produces an ajax-based query function
389
- *
390
- * @param options object containing configuration parameters
391
- * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax
392
- * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax
393
- * @param options.url url for the data
394
- * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url.
395
- * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified
396
- * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often
397
- * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2.
398
- * The expected format is an object containing the following keys:
399
- * results array of objects that will be used as choices
400
- * more (optional) boolean indicating whether there are more results available
401
- * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true}
402
- */
403
- function ajax(options) {
404
- var timeout, // current scheduled but not yet executed request
405
- handler = null,
406
- quietMillis = options.quietMillis || 100,
407
- ajaxUrl = options.url,
408
- self = this;
409
-
410
- return function (query) {
411
- window.clearTimeout(timeout);
412
- timeout = window.setTimeout(function () {
413
- var data = options.data, // ajax data function
414
- url = ajaxUrl, // ajax url string or function
415
- transport = options.transport || $.fn.select2.ajaxDefaults.transport,
416
- // deprecated - to be removed in 4.0 - use params instead
417
- deprecated = {
418
- type: options.type || 'GET', // set type of request (GET or POST)
419
- cache: options.cache || false,
420
- jsonpCallback: options.jsonpCallback||undefined,
421
- dataType: options.dataType||"json"
422
- },
423
- params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated);
424
-
425
- data = data ? data.call(self, query.term, query.page, query.context) : null;
426
- url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url;
427
-
428
- if (handler && typeof handler.abort === "function") { handler.abort(); }
429
-
430
- if (options.params) {
431
- if ($.isFunction(options.params)) {
432
- $.extend(params, options.params.call(self));
433
- } else {
434
- $.extend(params, options.params);
435
- }
436
- }
437
-
438
- $.extend(params, {
439
- url: url,
440
- dataType: options.dataType,
441
- data: data,
442
- success: function (data) {
443
- // TODO - replace query.page with query so users have access to term, page, etc.
444
- // added query as third paramter to keep backwards compatibility
445
- var results = options.results(data, query.page, query);
446
- query.callback(results);
447
- },
448
- error: function(jqXHR, textStatus, errorThrown){
449
- var results = {
450
- hasError: true,
451
- jqXHR: jqXHR,
452
- textStatus: textStatus,
453
- errorThrown: errorThrown
454
- };
455
-
456
- query.callback(results);
457
- }
458
- });
459
- handler = transport.call(self, params);
460
- }, quietMillis);
461
- };
462
- }
463
-
464
- /**
465
- * Produces a query function that works with a local array
466
- *
467
- * @param options object containing configuration parameters. The options parameter can either be an array or an
468
- * object.
469
- *
470
- * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys.
471
- *
472
- * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain
473
- * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text'
474
- * key can either be a String in which case it is expected that each element in the 'data' array has a key with the
475
- * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract
476
- * the text.
477
- */
478
- function local(options) {
479
- var data = options, // data elements
480
- dataText,
481
- tmp,
482
- text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search
483
-
484
- if ($.isArray(data)) {
485
- tmp = data;
486
- data = { results: tmp };
487
- }
488
-
489
- if ($.isFunction(data) === false) {
490
- tmp = data;
491
- data = function() { return tmp; };
492
- }
493
-
494
- var dataItem = data();
495
- if (dataItem.text) {
496
- text = dataItem.text;
497
- // if text is not a function we assume it to be a key name
498
- if (!$.isFunction(text)) {
499
- dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available
500
- text = function (item) { return item[dataText]; };
501
- }
502
- }
503
-
504
- return function (query) {
505
- var t = query.term, filtered = { results: [] }, process;
506
- if (t === "") {
507
- query.callback(data());
508
- return;
509
- }
510
-
511
- process = function(datum, collection) {
512
- var group, attr;
513
- datum = datum[0];
514
- if (datum.children) {
515
- group = {};
516
- for (attr in datum) {
517
- if (datum.hasOwnProperty(attr)) group[attr]=datum[attr];
518
- }
519
- group.children=[];
520
- $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); });
521
- if (group.children.length || query.matcher(t, text(group), datum)) {
522
- collection.push(group);
523
- }
524
- } else {
525
- if (query.matcher(t, text(datum), datum)) {
526
- collection.push(datum);
527
- }
528
- }
529
- };
530
-
531
- $(data().results).each2(function(i, datum) { process(datum, filtered.results); });
532
- query.callback(filtered);
533
- };
534
- }
535
-
536
- // TODO javadoc
537
- function tags(data) {
538
- var isFunc = $.isFunction(data);
539
- return function (query) {
540
- var t = query.term, filtered = {results: []};
541
- var result = isFunc ? data(query) : data;
542
- if ($.isArray(result)) {
543
- $(result).each(function () {
544
- var isObject = this.text !== undefined,
545
- text = isObject ? this.text : this;
546
- if (t === "" || query.matcher(t, text)) {
547
- filtered.results.push(isObject ? this : {id: this, text: this});
548
- }
549
- });
550
- query.callback(filtered);
551
- }
552
- };
553
- }
554
-
555
- /**
556
- * Checks if the formatter function should be used.
557
- *
558
- * Throws an error if it is not a function. Returns true if it should be used,
559
- * false if no formatting should be performed.
560
- *
561
- * @param formatter
562
- */
563
- function checkFormatter(formatter, formatterName) {
564
- if ($.isFunction(formatter)) return true;
565
- if (!formatter) return false;
566
- if (typeof(formatter) === 'string') return true;
567
- throw new Error(formatterName +" must be a string, function, or falsy value");
568
- }
569
-
570
- /**
571
- * Returns a given value
572
- * If given a function, returns its output
573
- *
574
- * @param val string|function
575
- * @param context value of "this" to be passed to function
576
- * @returns {*}
577
- */
578
- function evaluate(val, context) {
579
- if ($.isFunction(val)) {
580
- var args = Array.prototype.slice.call(arguments, 2);
581
- return val.apply(context, args);
582
- }
583
- return val;
584
- }
585
-
586
- function countResults(results) {
587
- var count = 0;
588
- $.each(results, function(i, item) {
589
- if (item.children) {
590
- count += countResults(item.children);
591
- } else {
592
- count++;
593
- }
594
- });
595
- return count;
596
- }
597
-
598
- /**
599
- * Default tokenizer. This function uses breaks the input on substring match of any string from the
600
- * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those
601
- * two options have to be defined in order for the tokenizer to work.
602
- *
603
- * @param input text user has typed so far or pasted into the search field
604
- * @param selection currently selected choices
605
- * @param selectCallback function(choice) callback tho add the choice to selection
606
- * @param opts select2's opts
607
- * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value
608
- */
609
- function defaultTokenizer(input, selection, selectCallback, opts) {
610
- var original = input, // store the original so we can compare and know if we need to tell the search to update its text
611
- dupe = false, // check for whether a token we extracted represents a duplicate selected choice
612
- token, // token
613
- index, // position at which the separator was found
614
- i, l, // looping variables
615
- separator; // the matched separator
616
-
617
- if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined;
618
-
619
- while (true) {
620
- index = -1;
621
-
622
- for (i = 0, l = opts.tokenSeparators.length; i < l; i++) {
623
- separator = opts.tokenSeparators[i];
624
- index = input.indexOf(separator);
625
- if (index >= 0) break;
626
- }
627
-
628
- if (index < 0) break; // did not find any token separator in the input string, bail
629
-
630
- token = input.substring(0, index);
631
- input = input.substring(index + separator.length);
632
-
633
- if (token.length > 0) {
634
- token = opts.createSearchChoice.call(this, token, selection);
635
- if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) {
636
- dupe = false;
637
- for (i = 0, l = selection.length; i < l; i++) {
638
- if (equal(opts.id(token), opts.id(selection[i]))) {
639
- dupe = true; break;
640
- }
641
- }
642
-
643
- if (!dupe) selectCallback(token);
644
- }
645
- }
646
- }
647
-
648
- if (original!==input) return input;
649
- }
650
-
651
- function cleanupJQueryElements() {
652
- var self = this;
653
-
654
- $.each(arguments, function (i, element) {
655
- self[element].remove();
656
- self[element] = null;
657
- });
658
- }
659
-
660
- /**
661
- * Creates a new class
662
- *
663
- * @param superClass
664
- * @param methods
665
- */
666
- function clazz(SuperClass, methods) {
667
- var constructor = function () {};
668
- constructor.prototype = new SuperClass;
669
- constructor.prototype.constructor = constructor;
670
- constructor.prototype.parent = SuperClass.prototype;
671
- constructor.prototype = $.extend(constructor.prototype, methods);
672
- return constructor;
673
- }
674
-
675
- AbstractSelect2 = clazz(Object, {
676
-
677
- // abstract
678
- bind: function (func) {
679
- var self = this;
680
- return function () {
681
- func.apply(self, arguments);
682
- };
683
- },
684
-
685
- // abstract
686
- init: function (opts) {
687
- var results, search, resultsSelector = ".select2-results";
688
-
689
- // prepare options
690
- this.opts = opts = this.prepareOpts(opts);
691
-
692
- this.id=opts.id;
693
-
694
- // destroy if called on an existing component
695
- if (opts.element.data("select2") !== undefined &&
696
- opts.element.data("select2") !== null) {
697
- opts.element.data("select2").destroy();
698
- }
699
-
700
- this.container = this.createContainer();
701
-
702
- this.liveRegion = $('.select2-hidden-accessible');
703
- if (this.liveRegion.length == 0) {
704
- this.liveRegion = $("<span>", {
705
- role: "status",
706
- "aria-live": "polite"
707
- })
708
- .addClass("select2-hidden-accessible")
709
- .appendTo(document.body);
710
- }
711
-
712
- this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid());
713
- this.containerEventName= this.containerId
714
- .replace(/([.])/g, '_')
715
- .replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
716
- this.container.attr("id", this.containerId);
717
-
718
- this.container.attr("title", opts.element.attr("title"));
719
-
720
- this.body = $(document.body);
721
-
722
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
723
-
724
- this.container.attr("style", opts.element.attr("style"));
725
- this.container.css(evaluate(opts.containerCss, this.opts.element));
726
- this.container.addClass(evaluate(opts.containerCssClass, this.opts.element));
727
-
728
- this.elementTabIndex = this.opts.element.attr("tabindex");
729
-
730
- // swap container for the element
731
- this.opts.element
732
- .data("select2", this)
733
- .attr("tabindex", "-1")
734
- .before(this.container)
735
- .on("click.select2", killEvent); // do not leak click events
736
-
737
- this.container.data("select2", this);
738
-
739
- this.dropdown = this.container.find(".select2-drop");
740
-
741
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
742
-
743
- this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element));
744
- this.dropdown.data("select2", this);
745
- this.dropdown.on("click", killEvent);
746
-
747
- this.results = results = this.container.find(resultsSelector);
748
- this.search = search = this.container.find("input.select2-input");
749
-
750
- this.queryCount = 0;
751
- this.resultsPage = 0;
752
- this.context = null;
753
-
754
- // initialize the container
755
- this.initContainer();
756
-
757
- this.container.on("click", killEvent);
758
-
759
- installFilteredMouseMove(this.results);
760
-
761
- this.dropdown.on("mousemove-filtered", resultsSelector, this.bind(this.highlightUnderEvent));
762
- this.dropdown.on("touchstart touchmove touchend", resultsSelector, this.bind(function (event) {
763
- this._touchEvent = true;
764
- this.highlightUnderEvent(event);
765
- }));
766
- this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved));
767
- this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved));
768
-
769
- // Waiting for a click event on touch devices to select option and hide dropdown
770
- // otherwise click will be triggered on an underlying element
771
- this.dropdown.on('click', this.bind(function (event) {
772
- if (this._touchEvent) {
773
- this._touchEvent = false;
774
- this.selectHighlighted();
775
- }
776
- }));
777
-
778
- installDebouncedScroll(80, this.results);
779
- this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded));
780
-
781
- // do not propagate change event from the search field out of the component
782
- $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();});
783
- $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();});
784
-
785
- // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel
786
- if ($.fn.mousewheel) {
787
- results.mousewheel(function (e, delta, deltaX, deltaY) {
788
- var top = results.scrollTop();
789
- if (deltaY > 0 && top - deltaY <= 0) {
790
- results.scrollTop(0);
791
- killEvent(e);
792
- } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) {
793
- results.scrollTop(results.get(0).scrollHeight - results.height());
794
- killEvent(e);
795
- }
796
- });
797
- }
798
-
799
- installKeyUpChangeEvent(search);
800
- search.on("keyup-change input paste", this.bind(this.updateResults));
801
- search.on("focus", function () { search.addClass("select2-focused"); });
802
- search.on("blur", function () { search.removeClass("select2-focused");});
803
-
804
- this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) {
805
- if ($(e.target).closest(".select2-result-selectable").length > 0) {
806
- this.highlightUnderEvent(e);
807
- this.selectHighlighted(e);
808
- }
809
- }));
810
-
811
- // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening
812
- // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's
813
- // dom it will trigger the popup close, which is not what we want
814
- // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal.
815
- this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); });
816
-
817
- this.nextSearchTerm = undefined;
818
-
819
- if ($.isFunction(this.opts.initSelection)) {
820
- // initialize selection based on the current value of the source element
821
- this.initSelection();
822
-
823
- // if the user has provided a function that can set selection based on the value of the source element
824
- // we monitor the change event on the element and trigger it, allowing for two way synchronization
825
- this.monitorSource();
826
- }
827
-
828
- if (opts.maximumInputLength !== null) {
829
- this.search.attr("maxlength", opts.maximumInputLength);
830
- }
831
-
832
- var disabled = opts.element.prop("disabled");
833
- if (disabled === undefined) disabled = false;
834
- this.enable(!disabled);
835
-
836
- var readonly = opts.element.prop("readonly");
837
- if (readonly === undefined) readonly = false;
838
- this.readonly(readonly);
839
-
840
- // Calculate size of scrollbar
841
- scrollBarDimensions = scrollBarDimensions || measureScrollbar();
842
-
843
- this.autofocus = opts.element.prop("autofocus");
844
- opts.element.prop("autofocus", false);
845
- if (this.autofocus) this.focus();
846
-
847
- this.search.attr("placeholder", opts.searchInputPlaceholder);
848
- },
849
-
850
- // abstract
851
- destroy: function () {
852
- var element=this.opts.element, select2 = element.data("select2"), self = this;
853
-
854
- this.close();
855
-
856
- if (element.length && element[0].detachEvent && self._sync) {
857
- element.each(function () {
858
- if (self._sync) {
859
- this.detachEvent("onpropertychange", self._sync);
860
- }
861
- });
862
- }
863
- if (this.propertyObserver) {
864
- this.propertyObserver.disconnect();
865
- this.propertyObserver = null;
866
- }
867
- this._sync = null;
868
-
869
- if (select2 !== undefined) {
870
- select2.container.remove();
871
- select2.liveRegion.remove();
872
- select2.dropdown.remove();
873
- element
874
- .show()
875
- .removeData("select2")
876
- .off(".select2")
877
- .prop("autofocus", this.autofocus || false);
878
- if (this.elementTabIndex) {
879
- element.attr({tabindex: this.elementTabIndex});
880
- } else {
881
- element.removeAttr("tabindex");
882
- }
883
- element.show();
884
- }
885
-
886
- cleanupJQueryElements.call(this,
887
- "container",
888
- "liveRegion",
889
- "dropdown",
890
- "results",
891
- "search"
892
- );
893
- },
894
-
895
- // abstract
896
- optionToData: function(element) {
897
- if (element.is("option")) {
898
- return {
899
- id:element.prop("value"),
900
- text:element.text(),
901
- element: element.get(),
902
- css: element.attr("class"),
903
- disabled: element.prop("disabled"),
904
- locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true)
905
- };
906
- } else if (element.is("optgroup")) {
907
- return {
908
- text:element.attr("label"),
909
- children:[],
910
- element: element.get(),
911
- css: element.attr("class")
912
- };
913
- }
914
- },
915
-
916
- // abstract
917
- prepareOpts: function (opts) {
918
- var element, select, idKey, ajaxUrl, self = this;
919
-
920
- element = opts.element;
921
-
922
- if (element.get(0).tagName.toLowerCase() === "select") {
923
- this.select = select = opts.element;
924
- }
925
-
926
- if (select) {
927
- // these options are not allowed when attached to a select because they are picked up off the element itself
928
- $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () {
929
- if (this in opts) {
930
- throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a <select> element.");
931
- }
932
- });
933
- }
934
-
935
- opts = $.extend({}, {
936
- populateResults: function(container, results, query) {
937
- var populate, id=this.opts.id, liveRegion=this.liveRegion;
938
-
939
- populate=function(results, container, depth) {
940
-
941
- var i, l, result, selectable, disabled, compound, node, label, innerContainer, formatted;
942
-
943
- results = opts.sortResults(results, container, query);
944
-
945
- // collect the created nodes for bulk append
946
- var nodes = [];
947
- for (i = 0, l = results.length; i < l; i = i + 1) {
948
-
949
- result=results[i];
950
-
951
- disabled = (result.disabled === true);
952
- selectable = (!disabled) && (id(result) !== undefined);
953
-
954
- compound=result.children && result.children.length > 0;
955
-
956
- node=$("<li></li>");
957
- node.addClass("select2-results-dept-"+depth);
958
- node.addClass("select2-result");
959
- node.addClass(selectable ? "select2-result-selectable" : "select2-result-unselectable");
960
- if (disabled) { node.addClass("select2-disabled"); }
961
- if (compound) { node.addClass("select2-result-with-children"); }
962
- node.addClass(self.opts.formatResultCssClass(result));
963
- node.attr("role", "presentation");
964
-
965
- label=$(document.createElement("div"));
966
- label.addClass("select2-result-label");
967
- label.attr("id", "select2-result-label-" + nextUid());
968
- label.attr("role", "option");
969
-
970
- formatted=opts.formatResult(result, label, query, self.opts.escapeMarkup);
971
- if (formatted!==undefined) {
972
- label.html(formatted);
973
- node.append(label);
974
- }
975
-
976
-
977
- if (compound) {
978
-
979
- innerContainer=$("<ul></ul>");
980
- innerContainer.addClass("select2-result-sub");
981
- populate(result.children, innerContainer, depth+1);
982
- node.append(innerContainer);
983
- }
984
-
985
- node.data("select2-data", result);
986
- nodes.push(node[0]);
987
- }
988
-
989
- // bulk append the created nodes
990
- container.append(nodes);
991
- liveRegion.text(opts.formatMatches(results.length));
992
- };
993
-
994
- populate(results, container, 0);
995
- }
996
- }, $.fn.select2.defaults, opts);
997
-
998
- if (typeof(opts.id) !== "function") {
999
- idKey = opts.id;
1000
- opts.id = function (e) { return e[idKey]; };
1001
- }
1002
-
1003
- if ($.isArray(opts.element.data("select2Tags"))) {
1004
- if ("tags" in opts) {
1005
- throw "tags specified as both an attribute 'data-select2-tags' and in options of Select2 " + opts.element.attr("id");
1006
- }
1007
- opts.tags=opts.element.data("select2Tags");
1008
- }
1009
-
1010
- if (select) {
1011
- opts.query = this.bind(function (query) {
1012
- var data = { results: [], more: false },
1013
- term = query.term,
1014
- children, placeholderOption, process;
1015
-
1016
- process=function(element, collection) {
1017
- var group;
1018
- if (element.is("option")) {
1019
- if (query.matcher(term, element.text(), element)) {
1020
- collection.push(self.optionToData(element));
1021
- }
1022
- } else if (element.is("optgroup")) {
1023
- group=self.optionToData(element);
1024
- element.children().each2(function(i, elm) { process(elm, group.children); });
1025
- if (group.children.length>0) {
1026
- collection.push(group);
1027
- }
1028
- }
1029
- };
1030
-
1031
- children=element.children();
1032
-
1033
- // ignore the placeholder option if there is one
1034
- if (this.getPlaceholder() !== undefined && children.length > 0) {
1035
- placeholderOption = this.getPlaceholderOption();
1036
- if (placeholderOption) {
1037
- children=children.not(placeholderOption);
1038
- }
1039
- }
1040
-
1041
- children.each2(function(i, elm) { process(elm, data.results); });
1042
-
1043
- query.callback(data);
1044
- });
1045
- // this is needed because inside val() we construct choices from options and their id is hardcoded
1046
- opts.id=function(e) { return e.id; };
1047
- } else {
1048
- if (!("query" in opts)) {
1049
-
1050
- if ("ajax" in opts) {
1051
- ajaxUrl = opts.element.data("ajax-url");
1052
- if (ajaxUrl && ajaxUrl.length > 0) {
1053
- opts.ajax.url = ajaxUrl;
1054
- }
1055
- opts.query = ajax.call(opts.element, opts.ajax);
1056
- } else if ("data" in opts) {
1057
- opts.query = local(opts.data);
1058
- } else if ("tags" in opts) {
1059
- opts.query = tags(opts.tags);
1060
- if (opts.createSearchChoice === undefined) {
1061
- opts.createSearchChoice = function (term) { return {id: $.trim(term), text: $.trim(term)}; };
1062
- }
1063
- if (opts.initSelection === undefined) {
1064
- opts.initSelection = function (element, callback) {
1065
- var data = [];
1066
- $(splitVal(element.val(), opts.separator, opts.transformVal)).each(function () {
1067
- var obj = { id: this, text: this },
1068
- tags = opts.tags;
1069
- if ($.isFunction(tags)) tags=tags();
1070
- $(tags).each(function() { if (equal(this.id, obj.id)) { obj = this; return false; } });
1071
- data.push(obj);
1072
- });
1073
-
1074
- callback(data);
1075
- };
1076
- }
1077
- }
1078
- }
1079
- }
1080
- if (typeof(opts.query) !== "function") {
1081
- throw "query function not defined for Select2 " + opts.element.attr("id");
1082
- }
1083
-
1084
- if (opts.createSearchChoicePosition === 'top') {
1085
- opts.createSearchChoicePosition = function(list, item) { list.unshift(item); };
1086
- }
1087
- else if (opts.createSearchChoicePosition === 'bottom') {
1088
- opts.createSearchChoicePosition = function(list, item) { list.push(item); };
1089
- }
1090
- else if (typeof(opts.createSearchChoicePosition) !== "function") {
1091
- throw "invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";
1092
- }
1093
-
1094
- return opts;
1095
- },
1096
-
1097
- /**
1098
- * Monitor the original element for changes and update select2 accordingly
1099
- */
1100
- // abstract
1101
- monitorSource: function () {
1102
- var el = this.opts.element, observer, self = this;
1103
-
1104
- el.on("change.select2", this.bind(function (e) {
1105
- if (this.opts.element.data("select2-change-triggered") !== true) {
1106
- this.initSelection();
1107
- }
1108
- }));
1109
-
1110
- this._sync = this.bind(function () {
1111
-
1112
- // sync enabled state
1113
- var disabled = el.prop("disabled");
1114
- if (disabled === undefined) disabled = false;
1115
- this.enable(!disabled);
1116
-
1117
- var readonly = el.prop("readonly");
1118
- if (readonly === undefined) readonly = false;
1119
- this.readonly(readonly);
1120
-
1121
- if (this.container) {
1122
- syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass);
1123
- this.container.addClass(evaluate(this.opts.containerCssClass, this.opts.element));
1124
- }
1125
-
1126
- if (this.dropdown) {
1127
- syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass);
1128
- this.dropdown.addClass(evaluate(this.opts.dropdownCssClass, this.opts.element));
1129
- }
1130
-
1131
- });
1132
-
1133
- // IE8-10 (IE9/10 won't fire propertyChange via attachEventListener)
1134
- if (el.length && el[0].attachEvent) {
1135
- el.each(function() {
1136
- this.attachEvent("onpropertychange", self._sync);
1137
- });
1138
- }
1139
-
1140
- // safari, chrome, firefox, IE11
1141
- observer = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;
1142
- if (observer !== undefined) {
1143
- if (this.propertyObserver) { delete this.propertyObserver; this.propertyObserver = null; }
1144
- this.propertyObserver = new observer(function (mutations) {
1145
- $.each(mutations, self._sync);
1146
- });
1147
- this.propertyObserver.observe(el.get(0), { attributes:true, subtree:false });
1148
- }
1149
- },
1150
-
1151
- // abstract
1152
- triggerSelect: function(data) {
1153
- var evt = $.Event("select2-selecting", { val: this.id(data), object: data, choice: data });
1154
- this.opts.element.trigger(evt);
1155
- return !evt.isDefaultPrevented();
1156
- },
1157
-
1158
- /**
1159
- * Triggers the change event on the source element
1160
- */
1161
- // abstract
1162
- triggerChange: function (details) {
1163
-
1164
- details = details || {};
1165
- details= $.extend({}, details, { type: "change", val: this.val() });
1166
- // prevents recursive triggering
1167
- this.opts.element.data("select2-change-triggered", true);
1168
- this.opts.element.trigger(details);
1169
- this.opts.element.data("select2-change-triggered", false);
1170
-
1171
- // some validation frameworks ignore the change event and listen instead to keyup, click for selects
1172
- // so here we trigger the click event manually
1173
- this.opts.element.click();
1174
-
1175
- // ValidationEngine ignores the change event and listens instead to blur
1176
- // so here we trigger the blur event manually if so desired
1177
- if (this.opts.blurOnChange)
1178
- this.opts.element.blur();
1179
- },
1180
-
1181
- //abstract
1182
- isInterfaceEnabled: function()
1183
- {
1184
- return this.enabledInterface === true;
1185
- },
1186
-
1187
- // abstract
1188
- enableInterface: function() {
1189
- var enabled = this._enabled && !this._readonly,
1190
- disabled = !enabled;
1191
-
1192
- if (enabled === this.enabledInterface) return false;
1193
-
1194
- this.container.toggleClass("select2-container-disabled", disabled);
1195
- this.close();
1196
- this.enabledInterface = enabled;
1197
-
1198
- return true;
1199
- },
1200
-
1201
- // abstract
1202
- enable: function(enabled) {
1203
- if (enabled === undefined) enabled = true;
1204
- if (this._enabled === enabled) return;
1205
- this._enabled = enabled;
1206
-
1207
- this.opts.element.prop("disabled", !enabled);
1208
- this.enableInterface();
1209
- },
1210
-
1211
- // abstract
1212
- disable: function() {
1213
- this.enable(false);
1214
- },
1215
-
1216
- // abstract
1217
- readonly: function(enabled) {
1218
- if (enabled === undefined) enabled = false;
1219
- if (this._readonly === enabled) return;
1220
- this._readonly = enabled;
1221
-
1222
- this.opts.element.prop("readonly", enabled);
1223
- this.enableInterface();
1224
- },
1225
-
1226
- // abstract
1227
- opened: function () {
1228
- return (this.container) ? this.container.hasClass("select2-dropdown-open") : false;
1229
- },
1230
-
1231
- // abstract
1232
- positionDropdown: function() {
1233
- var $dropdown = this.dropdown,
1234
- container = this.container,
1235
- offset = container.offset(),
1236
- height = container.outerHeight(false),
1237
- width = container.outerWidth(false),
1238
- dropHeight = $dropdown.outerHeight(false),
1239
- $window = $(window),
1240
- windowWidth = $window.width(),
1241
- windowHeight = $window.height(),
1242
- viewPortRight = $window.scrollLeft() + windowWidth,
1243
- viewportBottom = $window.scrollTop() + windowHeight,
1244
- dropTop = offset.top + height,
1245
- dropLeft = offset.left,
1246
- enoughRoomBelow = dropTop + dropHeight <= viewportBottom,
1247
- enoughRoomAbove = (offset.top - dropHeight) >= $window.scrollTop(),
1248
- dropWidth = $dropdown.outerWidth(false),
1249
- enoughRoomOnRight = function() {
1250
- return dropLeft + dropWidth <= viewPortRight;
1251
- },
1252
- enoughRoomOnLeft = function() {
1253
- return offset.left + viewPortRight + container.outerWidth(false) > dropWidth;
1254
- },
1255
- aboveNow = $dropdown.hasClass("select2-drop-above"),
1256
- bodyOffset,
1257
- above,
1258
- changeDirection,
1259
- css,
1260
- resultsListNode;
1261
-
1262
- // always prefer the current above/below alignment, unless there is not enough room
1263
- if (aboveNow) {
1264
- above = true;
1265
- if (!enoughRoomAbove && enoughRoomBelow) {
1266
- changeDirection = true;
1267
- above = false;
1268
- }
1269
- } else {
1270
- above = false;
1271
- if (!enoughRoomBelow && enoughRoomAbove) {
1272
- changeDirection = true;
1273
- above = true;
1274
- }
1275
- }
1276
-
1277
- //if we are changing direction we need to get positions when dropdown is hidden;
1278
- if (changeDirection) {
1279
- $dropdown.hide();
1280
- offset = this.container.offset();
1281
- height = this.container.outerHeight(false);
1282
- width = this.container.outerWidth(false);
1283
- dropHeight = $dropdown.outerHeight(false);
1284
- viewPortRight = $window.scrollLeft() + windowWidth;
1285
- viewportBottom = $window.scrollTop() + windowHeight;
1286
- dropTop = offset.top + height;
1287
- dropLeft = offset.left;
1288
- dropWidth = $dropdown.outerWidth(false);
1289
- $dropdown.show();
1290
-
1291
- // fix so the cursor does not move to the left within the search-textbox in IE
1292
- this.focusSearch();
1293
- }
1294
-
1295
- if (this.opts.dropdownAutoWidth) {
1296
- resultsListNode = $('.select2-results', $dropdown)[0];
1297
- $dropdown.addClass('select2-drop-auto-width');
1298
- $dropdown.css('width', '');
1299
- // Add scrollbar width to dropdown if vertical scrollbar is present
1300
- dropWidth = $dropdown.outerWidth(false) + (resultsListNode.scrollHeight === resultsListNode.clientHeight ? 0 : scrollBarDimensions.width);
1301
- dropWidth > width ? width = dropWidth : dropWidth = width;
1302
- dropHeight = $dropdown.outerHeight(false);
1303
- }
1304
- else {
1305
- this.container.removeClass('select2-drop-auto-width');
1306
- }
1307
-
1308
- //console.log("below/ droptop:", dropTop, "dropHeight", dropHeight, "sum", (dropTop+dropHeight)+" viewport bottom", viewportBottom, "enough?", enoughRoomBelow);
1309
- //console.log("above/ offset.top", offset.top, "dropHeight", dropHeight, "top", (offset.top-dropHeight), "scrollTop", this.body.scrollTop(), "enough?", enoughRoomAbove);
1310
-
1311
- // fix positioning when body has an offset and is not position: static
1312
- if (this.body.css('position') !== 'static') {
1313
- bodyOffset = this.body.offset();
1314
- dropTop -= bodyOffset.top;
1315
- dropLeft -= bodyOffset.left;
1316
- }
1317
-
1318
- if (!enoughRoomOnRight() && enoughRoomOnLeft()) {
1319
- dropLeft = offset.left + this.container.outerWidth(false) - dropWidth;
1320
- }
1321
-
1322
- css = {
1323
- left: dropLeft,
1324
- width: width
1325
- };
1326
-
1327
- if (above) {
1328
- css.top = offset.top - dropHeight;
1329
- css.bottom = 'auto';
1330
- this.container.addClass("select2-drop-above");
1331
- $dropdown.addClass("select2-drop-above");
1332
- }
1333
- else {
1334
- css.top = dropTop;
1335
- css.bottom = 'auto';
1336
- this.container.removeClass("select2-drop-above");
1337
- $dropdown.removeClass("select2-drop-above");
1338
- }
1339
- css = $.extend(css, evaluate(this.opts.dropdownCss, this.opts.element));
1340
-
1341
- $dropdown.css(css);
1342
- },
1343
-
1344
- // abstract
1345
- shouldOpen: function() {
1346
- var event;
1347
-
1348
- if (this.opened()) return false;
1349
-
1350
- if (this._enabled === false || this._readonly === true) return false;
1351
-
1352
- event = $.Event("select2-opening");
1353
- this.opts.element.trigger(event);
1354
- return !event.isDefaultPrevented();
1355
- },
1356
-
1357
- // abstract
1358
- clearDropdownAlignmentPreference: function() {
1359
- // clear the classes used to figure out the preference of where the dropdown should be opened
1360
- this.container.removeClass("select2-drop-above");
1361
- this.dropdown.removeClass("select2-drop-above");
1362
- },
1363
-
1364
- /**
1365
- * Opens the dropdown
1366
- *
1367
- * @return {Boolean} whether or not dropdown was opened. This method will return false if, for example,
1368
- * the dropdown is already open, or if the 'open' event listener on the element called preventDefault().
1369
- */
1370
- // abstract
1371
- open: function () {
1372
-
1373
- if (!this.shouldOpen()) return false;
1374
-
1375
- this.opening();
1376
-
1377
- // Only bind the document mousemove when the dropdown is visible
1378
- $document.on("mousemove.select2Event", function (e) {
1379
- lastMousePosition.x = e.pageX;
1380
- lastMousePosition.y = e.pageY;
1381
- });
1382
-
1383
- return true;
1384
- },
1385
-
1386
- /**
1387
- * Performs the opening of the dropdown
1388
- */
1389
- // abstract
1390
- opening: function() {
1391
- var cid = this.containerEventName,
1392
- scroll = "scroll." + cid,
1393
- resize = "resize."+cid,
1394
- orient = "orientationchange."+cid,
1395
- mask;
1396
-
1397
- this.container.addClass("select2-dropdown-open").addClass("select2-container-active");
1398
-
1399
- this.clearDropdownAlignmentPreference();
1400
-
1401
- if(this.dropdown[0] !== this.body.children().last()[0]) {
1402
- this.dropdown.detach().appendTo(this.body);
1403
- }
1404
-
1405
- // create the dropdown mask if doesn't already exist
1406
- mask = $("#select2-drop-mask");
1407
- if (mask.length === 0) {
1408
- mask = $(document.createElement("div"));
1409
- mask.attr("id","select2-drop-mask").attr("class","select2-drop-mask");
1410
- mask.hide();
1411
- mask.appendTo(this.body);
1412
- mask.on("mousedown touchstart click", function (e) {
1413
- // Prevent IE from generating a click event on the body
1414
- reinsertElement(mask);
1415
-
1416
- var dropdown = $("#select2-drop"), self;
1417
- if (dropdown.length > 0) {
1418
- self=dropdown.data("select2");
1419
- if (self.opts.selectOnBlur) {
1420
- self.selectHighlighted({noFocus: true});
1421
- }
1422
- self.close();
1423
- e.preventDefault();
1424
- e.stopPropagation();
1425
- }
1426
- });
1427
- }
1428
-
1429
- // ensure the mask is always right before the dropdown
1430
- if (this.dropdown.prev()[0] !== mask[0]) {
1431
- this.dropdown.before(mask);
1432
- }
1433
-
1434
- // move the global id to the correct dropdown
1435
- $("#select2-drop").removeAttr("id");
1436
- this.dropdown.attr("id", "select2-drop");
1437
-
1438
- // show the elements
1439
- mask.show();
1440
-
1441
- this.positionDropdown();
1442
- this.dropdown.show();
1443
- this.positionDropdown();
1444
-
1445
- this.dropdown.addClass("select2-drop-active");
1446
-
1447
- // attach listeners to events that can change the position of the container and thus require
1448
- // the position of the dropdown to be updated as well so it does not come unglued from the container
1449
- var that = this;
1450
- this.container.parents().add(window).each(function () {
1451
- $(this).on(resize+" "+scroll+" "+orient, function (e) {
1452
- if (that.opened()) that.positionDropdown();
1453
- });
1454
- });
1455
-
1456
-
1457
- },
1458
-
1459
- // abstract
1460
- close: function () {
1461
- if (!this.opened()) return;
1462
-
1463
- var cid = this.containerEventName,
1464
- scroll = "scroll." + cid,
1465
- resize = "resize."+cid,
1466
- orient = "orientationchange."+cid;
1467
-
1468
- // unbind event listeners
1469
- this.container.parents().add(window).each(function () { $(this).off(scroll).off(resize).off(orient); });
1470
-
1471
- this.clearDropdownAlignmentPreference();
1472
-
1473
- $("#select2-drop-mask").hide();
1474
- this.dropdown.removeAttr("id"); // only the active dropdown has the select2-drop id
1475
- this.dropdown.hide();
1476
- this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active");
1477
- this.results.empty();
1478
-
1479
- // Now that the dropdown is closed, unbind the global document mousemove event
1480
- $document.off("mousemove.select2Event");
1481
-
1482
- this.clearSearch();
1483
- this.search.removeClass("select2-active");
1484
- this.opts.element.trigger($.Event("select2-close"));
1485
- },
1486
-
1487
- /**
1488
- * Opens control, sets input value, and updates results.
1489
- */
1490
- // abstract
1491
- externalSearch: function (term) {
1492
- this.open();
1493
- this.search.val(term);
1494
- this.updateResults(false);
1495
- },
1496
-
1497
- // abstract
1498
- clearSearch: function () {
1499
-
1500
- },
1501
-
1502
- //abstract
1503
- getMaximumSelectionSize: function() {
1504
- return evaluate(this.opts.maximumSelectionSize, this.opts.element);
1505
- },
1506
-
1507
- // abstract
1508
- ensureHighlightVisible: function () {
1509
- var results = this.results, children, index, child, hb, rb, y, more, topOffset;
1510
-
1511
- index = this.highlight();
1512
-
1513
- if (index < 0) return;
1514
-
1515
- if (index == 0) {
1516
-
1517
- // if the first element is highlighted scroll all the way to the top,
1518
- // that way any unselectable headers above it will also be scrolled
1519
- // into view
1520
-
1521
- results.scrollTop(0);
1522
- return;
1523
- }
1524
-
1525
- children = this.findHighlightableChoices().find('.select2-result-label');
1526
-
1527
- child = $(children[index]);
1528
-
1529
- topOffset = (child.offset() || {}).top || 0;
1530
-
1531
- hb = topOffset + child.outerHeight(true);
1532
-
1533
- // if this is the last child lets also make sure select2-more-results is visible
1534
- if (index === children.length - 1) {
1535
- more = results.find("li.select2-more-results");
1536
- if (more.length > 0) {
1537
- hb = more.offset().top + more.outerHeight(true);
1538
- }
1539
- }
1540
-
1541
- rb = results.offset().top + results.outerHeight(false);
1542
- if (hb > rb) {
1543
- results.scrollTop(results.scrollTop() + (hb - rb));
1544
- }
1545
- y = topOffset - results.offset().top;
1546
-
1547
- // make sure the top of the element is visible
1548
- if (y < 0 && child.css('display') != 'none' ) {
1549
- results.scrollTop(results.scrollTop() + y); // y is negative
1550
- }
1551
- },
1552
-
1553
- // abstract
1554
- findHighlightableChoices: function() {
1555
- return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)");
1556
- },
1557
-
1558
- // abstract
1559
- moveHighlight: function (delta) {
1560
- var choices = this.findHighlightableChoices(),
1561
- index = this.highlight();
1562
-
1563
- while (index > -1 && index < choices.length) {
1564
- index += delta;
1565
- var choice = $(choices[index]);
1566
- if (choice.hasClass("select2-result-selectable") && !choice.hasClass("select2-disabled") && !choice.hasClass("select2-selected")) {
1567
- this.highlight(index);
1568
- break;
1569
- }
1570
- }
1571
- },
1572
-
1573
- // abstract
1574
- highlight: function (index) {
1575
- var choices = this.findHighlightableChoices(),
1576
- choice,
1577
- data;
1578
-
1579
- if (arguments.length === 0) {
1580
- return indexOf(choices.filter(".select2-highlighted")[0], choices.get());
1581
- }
1582
-
1583
- if (index >= choices.length) index = choices.length - 1;
1584
- if (index < 0) index = 0;
1585
-
1586
- this.removeHighlight();
1587
-
1588
- choice = $(choices[index]);
1589
- choice.addClass("select2-highlighted");
1590
-
1591
- // ensure assistive technology can determine the active choice
1592
- this.search.attr("aria-activedescendant", choice.find(".select2-result-label").attr("id"));
1593
-
1594
- this.ensureHighlightVisible();
1595
-
1596
- this.liveRegion.text(choice.text());
1597
-
1598
- data = choice.data("select2-data");
1599
- if (data) {
1600
- this.opts.element.trigger({ type: "select2-highlight", val: this.id(data), choice: data });
1601
- }
1602
- },
1603
-
1604
- removeHighlight: function() {
1605
- this.results.find(".select2-highlighted").removeClass("select2-highlighted");
1606
- },
1607
-
1608
- touchMoved: function() {
1609
- this._touchMoved = true;
1610
- },
1611
-
1612
- clearTouchMoved: function() {
1613
- this._touchMoved = false;
1614
- },
1615
-
1616
- // abstract
1617
- countSelectableResults: function() {
1618
- return this.findHighlightableChoices().length;
1619
- },
1620
-
1621
- // abstract
1622
- highlightUnderEvent: function (event) {
1623
- var el = $(event.target).closest(".select2-result-selectable");
1624
- if (el.length > 0 && !el.is(".select2-highlighted")) {
1625
- var choices = this.findHighlightableChoices();
1626
- this.highlight(choices.index(el));
1627
- } else if (el.length == 0) {
1628
- // if we are over an unselectable item remove all highlights
1629
- this.removeHighlight();
1630
- }
1631
- },
1632
-
1633
- // abstract
1634
- loadMoreIfNeeded: function () {
1635
- var results = this.results,
1636
- more = results.find("li.select2-more-results"),
1637
- below, // pixels the element is below the scroll fold, below==0 is when the element is starting to be visible
1638
- page = this.resultsPage + 1,
1639
- self=this,
1640
- term=this.search.val(),
1641
- context=this.context;
1642
-
1643
- if (more.length === 0) return;
1644
- below = more.offset().top - results.offset().top - results.height();
1645
-
1646
- if (below <= this.opts.loadMorePadding) {
1647
- more.addClass("select2-active");
1648
- this.opts.query({
1649
- element: this.opts.element,
1650
- term: term,
1651
- page: page,
1652
- context: context,
1653
- matcher: this.opts.matcher,
1654
- callback: this.bind(function (data) {
1655
-
1656
- // ignore a response if the select2 has been closed before it was received
1657
- if (!self.opened()) return;
1658
-
1659
-
1660
- self.opts.populateResults.call(this, results, data.results, {term: term, page: page, context:context});
1661
- self.postprocessResults(data, false, false);
1662
-
1663
- if (data.more===true) {
1664
- more.detach().appendTo(results).html(self.opts.escapeMarkup(evaluate(self.opts.formatLoadMore, self.opts.element, page+1)));
1665
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1666
- } else {
1667
- more.remove();
1668
- }
1669
- self.positionDropdown();
1670
- self.resultsPage = page;
1671
- self.context = data.context;
1672
- this.opts.element.trigger({ type: "select2-loaded", items: data });
1673
- })});
1674
- }
1675
- },
1676
-
1677
- /**
1678
- * Default tokenizer function which does nothing
1679
- */
1680
- tokenize: function() {
1681
-
1682
- },
1683
-
1684
- /**
1685
- * @param initial whether or not this is the call to this method right after the dropdown has been opened
1686
- */
1687
- // abstract
1688
- updateResults: function (initial) {
1689
- var search = this.search,
1690
- results = this.results,
1691
- opts = this.opts,
1692
- data,
1693
- self = this,
1694
- input,
1695
- term = search.val(),
1696
- lastTerm = $.data(this.container, "select2-last-term"),
1697
- // sequence number used to drop out-of-order responses
1698
- queryNumber;
1699
-
1700
- // prevent duplicate queries against the same term
1701
- if (initial !== true && lastTerm && equal(term, lastTerm)) return;
1702
-
1703
- $.data(this.container, "select2-last-term", term);
1704
-
1705
- // if the search is currently hidden we do not alter the results
1706
- if (initial !== true && (this.showSearchInput === false || !this.opened())) {
1707
- return;
1708
- }
1709
-
1710
- function postRender() {
1711
- search.removeClass("select2-active");
1712
- self.positionDropdown();
1713
- if (results.find('.select2-no-results,.select2-selection-limit,.select2-searching').length) {
1714
- self.liveRegion.text(results.text());
1715
- }
1716
- else {
1717
- self.liveRegion.text(self.opts.formatMatches(results.find('.select2-result-selectable:not(".select2-selected")').length));
1718
- }
1719
- }
1720
-
1721
- function render(html) {
1722
- results.html(html);
1723
- postRender();
1724
- }
1725
-
1726
- queryNumber = ++this.queryCount;
1727
-
1728
- var maxSelSize = this.getMaximumSelectionSize();
1729
- if (maxSelSize >=1) {
1730
- data = this.data();
1731
- if ($.isArray(data) && data.length >= maxSelSize && checkFormatter(opts.formatSelectionTooBig, "formatSelectionTooBig")) {
1732
- render("<li class='select2-selection-limit'>" + evaluate(opts.formatSelectionTooBig, opts.element, maxSelSize) + "</li>");
1733
- return;
1734
- }
1735
- }
1736
-
1737
- if (search.val().length < opts.minimumInputLength) {
1738
- if (checkFormatter(opts.formatInputTooShort, "formatInputTooShort")) {
1739
- render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooShort, opts.element, search.val(), opts.minimumInputLength) + "</li>");
1740
- } else {
1741
- render("");
1742
- }
1743
- if (initial && this.showSearch) this.showSearch(true);
1744
- return;
1745
- }
1746
-
1747
- if (opts.maximumInputLength && search.val().length > opts.maximumInputLength) {
1748
- if (checkFormatter(opts.formatInputTooLong, "formatInputTooLong")) {
1749
- render("<li class='select2-no-results'>" + evaluate(opts.formatInputTooLong, opts.element, search.val(), opts.maximumInputLength) + "</li>");
1750
- } else {
1751
- render("");
1752
- }
1753
- return;
1754
- }
1755
-
1756
- if (opts.formatSearching && this.findHighlightableChoices().length === 0) {
1757
- render("<li class='select2-searching'>" + evaluate(opts.formatSearching, opts.element) + "</li>");
1758
- }
1759
-
1760
- search.addClass("select2-active");
1761
-
1762
- this.removeHighlight();
1763
-
1764
- // give the tokenizer a chance to pre-process the input
1765
- input = this.tokenize();
1766
- if (input != undefined && input != null) {
1767
- search.val(input);
1768
- }
1769
-
1770
- this.resultsPage = 1;
1771
-
1772
- opts.query({
1773
- element: opts.element,
1774
- term: search.val(),
1775
- page: this.resultsPage,
1776
- context: null,
1777
- matcher: opts.matcher,
1778
- callback: this.bind(function (data) {
1779
- var def; // default choice
1780
-
1781
- // ignore old responses
1782
- if (queryNumber != this.queryCount) {
1783
- return;
1784
- }
1785
-
1786
- // ignore a response if the select2 has been closed before it was received
1787
- if (!this.opened()) {
1788
- this.search.removeClass("select2-active");
1789
- return;
1790
- }
1791
-
1792
- // handle ajax error
1793
- if(data.hasError !== undefined && checkFormatter(opts.formatAjaxError, "formatAjaxError")) {
1794
- render("<li class='select2-ajax-error'>" + evaluate(opts.formatAjaxError, opts.element, data.jqXHR, data.textStatus, data.errorThrown) + "</li>");
1795
- return;
1796
- }
1797
-
1798
- // save context, if any
1799
- this.context = (data.context===undefined) ? null : data.context;
1800
- // create a default choice and prepend it to the list
1801
- if (this.opts.createSearchChoice && search.val() !== "") {
1802
- def = this.opts.createSearchChoice.call(self, search.val(), data.results);
1803
- if (def !== undefined && def !== null && self.id(def) !== undefined && self.id(def) !== null) {
1804
- if ($(data.results).filter(
1805
- function () {
1806
- return equal(self.id(this), self.id(def));
1807
- }).length === 0) {
1808
- this.opts.createSearchChoicePosition(data.results, def);
1809
- }
1810
- }
1811
- }
1812
-
1813
- if (data.results.length === 0 && checkFormatter(opts.formatNoMatches, "formatNoMatches")) {
1814
- render("<li class='select2-no-results'>" + evaluate(opts.formatNoMatches, opts.element, search.val()) + "</li>");
1815
- return;
1816
- }
1817
-
1818
- results.empty();
1819
- self.opts.populateResults.call(this, results, data.results, {term: search.val(), page: this.resultsPage, context:null});
1820
-
1821
- if (data.more === true && checkFormatter(opts.formatLoadMore, "formatLoadMore")) {
1822
- results.append("<li class='select2-more-results'>" + opts.escapeMarkup(evaluate(opts.formatLoadMore, opts.element, this.resultsPage)) + "</li>");
1823
- window.setTimeout(function() { self.loadMoreIfNeeded(); }, 10);
1824
- }
1825
-
1826
- this.postprocessResults(data, initial);
1827
-
1828
- postRender();
1829
-
1830
- this.opts.element.trigger({ type: "select2-loaded", items: data });
1831
- })});
1832
- },
1833
-
1834
- // abstract
1835
- cancel: function () {
1836
- this.close();
1837
- },
1838
-
1839
- // abstract
1840
- blur: function () {
1841
- // if selectOnBlur == true, select the currently highlighted option
1842
- if (this.opts.selectOnBlur)
1843
- this.selectHighlighted({noFocus: true});
1844
-
1845
- this.close();
1846
- this.container.removeClass("select2-container-active");
1847
- // synonymous to .is(':focus'), which is available in jquery >= 1.6
1848
- if (this.search[0] === document.activeElement) { this.search.blur(); }
1849
- this.clearSearch();
1850
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
1851
- },
1852
-
1853
- // abstract
1854
- focusSearch: function () {
1855
- focus(this.search);
1856
- },
1857
-
1858
- // abstract
1859
- selectHighlighted: function (options) {
1860
- if (this._touchMoved) {
1861
- this.clearTouchMoved();
1862
- return;
1863
- }
1864
- var index=this.highlight(),
1865
- highlighted=this.results.find(".select2-highlighted"),
1866
- data = highlighted.closest('.select2-result').data("select2-data");
1867
-
1868
- if (data) {
1869
- this.highlight(index);
1870
- this.onSelect(data, options);
1871
- } else if (options && options.noFocus) {
1872
- this.close();
1873
- }
1874
- },
1875
-
1876
- // abstract
1877
- getPlaceholder: function () {
1878
- var placeholderOption;
1879
- return this.opts.element.attr("placeholder") ||
1880
- this.opts.element.attr("data-placeholder") || // jquery 1.4 compat
1881
- this.opts.element.data("placeholder") ||
1882
- this.opts.placeholder ||
1883
- ((placeholderOption = this.getPlaceholderOption()) !== undefined ? placeholderOption.text() : undefined);
1884
- },
1885
-
1886
- // abstract
1887
- getPlaceholderOption: function() {
1888
- if (this.select) {
1889
- var firstOption = this.select.children('option').first();
1890
- if (this.opts.placeholderOption !== undefined ) {
1891
- //Determine the placeholder option based on the specified placeholderOption setting
1892
- return (this.opts.placeholderOption === "first" && firstOption) ||
1893
- (typeof this.opts.placeholderOption === "function" && this.opts.placeholderOption(this.select));
1894
- } else if ($.trim(firstOption.text()) === "" && firstOption.val() === "") {
1895
- //No explicit placeholder option specified, use the first if it's blank
1896
- return firstOption;
1897
- }
1898
- }
1899
- },
1900
-
1901
- /**
1902
- * Get the desired width for the container element. This is
1903
- * derived first from option `width` passed to select2, then
1904
- * the inline 'style' on the original element, and finally
1905
- * falls back to the jQuery calculated element width.
1906
- */
1907
- // abstract
1908
- initContainerWidth: function () {
1909
- function resolveContainerWidth() {
1910
- var style, attrs, matches, i, l, attr;
1911
-
1912
- if (this.opts.width === "off") {
1913
- return null;
1914
- } else if (this.opts.width === "element"){
1915
- return this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px';
1916
- } else if (this.opts.width === "copy" || this.opts.width === "resolve") {
1917
- // check if there is inline style on the element that contains width
1918
- style = this.opts.element.attr('style');
1919
- if (style !== undefined) {
1920
- attrs = style.split(';');
1921
- for (i = 0, l = attrs.length; i < l; i = i + 1) {
1922
- attr = attrs[i].replace(/\s/g, '');
1923
- matches = attr.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i);
1924
- if (matches !== null && matches.length >= 1)
1925
- return matches[1];
1926
- }
1927
- }
1928
-
1929
- if (this.opts.width === "resolve") {
1930
- // next check if css('width') can resolve a width that is percent based, this is sometimes possible
1931
- // when attached to input type=hidden or elements hidden via css
1932
- style = this.opts.element.css('width');
1933
- if (style.indexOf("%") > 0) return style;
1934
-
1935
- // finally, fallback on the calculated width of the element
1936
- return (this.opts.element.outerWidth(false) === 0 ? 'auto' : this.opts.element.outerWidth(false) + 'px');
1937
- }
1938
-
1939
- return null;
1940
- } else if ($.isFunction(this.opts.width)) {
1941
- return this.opts.width();
1942
- } else {
1943
- return this.opts.width;
1944
- }
1945
- };
1946
-
1947
- var width = resolveContainerWidth.call(this);
1948
- if (width !== null) {
1949
- this.container.css("width", width);
1950
- }
1951
- }
1952
- });
1953
-
1954
- SingleSelect2 = clazz(AbstractSelect2, {
1955
-
1956
- // single
1957
-
1958
- createContainer: function () {
1959
- var container = $(document.createElement("div")).attr({
1960
- "class": "select2-container"
1961
- }).html([
1962
- "<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>",
1963
- " <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>",
1964
- " <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>",
1965
- "</a>",
1966
- "<label for='' class='select2-offscreen'></label>",
1967
- "<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />",
1968
- "<div class='select2-drop select2-display-none'>",
1969
- " <div class='select2-search'>",
1970
- " <label for='' class='select2-offscreen'></label>",
1971
- " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'",
1972
- " aria-autocomplete='list' />",
1973
- " </div>",
1974
- " <ul class='select2-results' role='listbox'>",
1975
- " </ul>",
1976
- "</div>"].join(""));
1977
- return container;
1978
- },
1979
-
1980
- // single
1981
- enableInterface: function() {
1982
- if (this.parent.enableInterface.apply(this, arguments)) {
1983
- this.focusser.prop("disabled", !this.isInterfaceEnabled());
1984
- }
1985
- },
1986
-
1987
- // single
1988
- opening: function () {
1989
- var el, range, len;
1990
-
1991
- if (this.opts.minimumResultsForSearch >= 0) {
1992
- this.showSearch(true);
1993
- }
1994
-
1995
- this.parent.opening.apply(this, arguments);
1996
-
1997
- if (this.showSearchInput !== false) {
1998
- // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range
1999
- // all other browsers handle this just fine
2000
-
2001
- this.search.val(this.focusser.val());
2002
- }
2003
- if (this.opts.shouldFocusInput(this)) {
2004
- this.search.focus();
2005
- // move the cursor to the end after focussing, otherwise it will be at the beginning and
2006
- // new text will appear *before* focusser.val()
2007
- el = this.search.get(0);
2008
- if (el.createTextRange) {
2009
- range = el.createTextRange();
2010
- range.collapse(false);
2011
- range.select();
2012
- } else if (el.setSelectionRange) {
2013
- len = this.search.val().length;
2014
- el.setSelectionRange(len, len);
2015
- }
2016
- }
2017
-
2018
- // initializes search's value with nextSearchTerm (if defined by user)
2019
- // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
2020
- if(this.search.val() === "") {
2021
- if(this.nextSearchTerm != undefined){
2022
- this.search.val(this.nextSearchTerm);
2023
- this.search.select();
2024
- }
2025
- }
2026
-
2027
- this.focusser.prop("disabled", true).val("");
2028
- this.updateResults(true);
2029
- this.opts.element.trigger($.Event("select2-open"));
2030
- },
2031
-
2032
- // single
2033
- close: function () {
2034
- if (!this.opened()) return;
2035
- this.parent.close.apply(this, arguments);
2036
-
2037
- this.focusser.prop("disabled", false);
2038
-
2039
- if (this.opts.shouldFocusInput(this)) {
2040
- this.focusser.focus();
2041
- }
2042
- },
2043
-
2044
- // single
2045
- focus: function () {
2046
- if (this.opened()) {
2047
- this.close();
2048
- } else {
2049
- this.focusser.prop("disabled", false);
2050
- if (this.opts.shouldFocusInput(this)) {
2051
- this.focusser.focus();
2052
- }
2053
- }
2054
- },
2055
-
2056
- // single
2057
- isFocused: function () {
2058
- return this.container.hasClass("select2-container-active");
2059
- },
2060
-
2061
- // single
2062
- cancel: function () {
2063
- this.parent.cancel.apply(this, arguments);
2064
- this.focusser.prop("disabled", false);
2065
-
2066
- if (this.opts.shouldFocusInput(this)) {
2067
- this.focusser.focus();
2068
- }
2069
- },
2070
-
2071
- // single
2072
- destroy: function() {
2073
- $("label[for='" + this.focusser.attr('id') + "']")
2074
- .attr('for', this.opts.element.attr("id"));
2075
- this.parent.destroy.apply(this, arguments);
2076
-
2077
- cleanupJQueryElements.call(this,
2078
- "selection",
2079
- "focusser"
2080
- );
2081
- },
2082
-
2083
- // single
2084
- initContainer: function () {
2085
-
2086
- var selection,
2087
- container = this.container,
2088
- dropdown = this.dropdown,
2089
- idSuffix = nextUid(),
2090
- elementLabel;
2091
-
2092
- if (this.opts.minimumResultsForSearch < 0) {
2093
- this.showSearch(false);
2094
- } else {
2095
- this.showSearch(true);
2096
- }
2097
-
2098
- this.selection = selection = container.find(".select2-choice");
2099
-
2100
- this.focusser = container.find(".select2-focusser");
2101
-
2102
- // add aria associations
2103
- selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix);
2104
- this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix);
2105
- this.results.attr("id", "select2-results-"+idSuffix);
2106
- this.search.attr("aria-owns", "select2-results-"+idSuffix);
2107
-
2108
- // rewrite labels from original element to focusser
2109
- this.focusser.attr("id", "s2id_autogen"+idSuffix);
2110
-
2111
- elementLabel = $("label[for='" + this.opts.element.attr("id") + "']");
2112
- this.opts.element.focus(this.bind(function () { this.focus(); }));
2113
-
2114
- this.focusser.prev()
2115
- .text(elementLabel.text())
2116
- .attr('for', this.focusser.attr('id'));
2117
-
2118
- // Ensure the original element retains an accessible name
2119
- var originalTitle = this.opts.element.attr("title");
2120
- this.opts.element.attr("title", (originalTitle || elementLabel.text()));
2121
-
2122
- this.focusser.attr("tabindex", this.elementTabIndex);
2123
-
2124
- // write label for search field using the label from the focusser element
2125
- this.search.attr("id", this.focusser.attr('id') + '_search');
2126
-
2127
- this.search.prev()
2128
- .text($("label[for='" + this.focusser.attr('id') + "']").text())
2129
- .attr('for', this.search.attr('id'));
2130
-
2131
- this.search.on("keydown", this.bind(function (e) {
2132
- if (!this.isInterfaceEnabled()) return;
2133
-
2134
- // filter 229 keyCodes (input method editor is processing key input)
2135
- if (229 == e.keyCode) return;
2136
-
2137
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2138
- // prevent the page from scrolling
2139
- killEvent(e);
2140
- return;
2141
- }
2142
-
2143
- switch (e.which) {
2144
- case KEY.UP:
2145
- case KEY.DOWN:
2146
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2147
- killEvent(e);
2148
- return;
2149
- case KEY.ENTER:
2150
- this.selectHighlighted();
2151
- killEvent(e);
2152
- return;
2153
- case KEY.TAB:
2154
- this.selectHighlighted({noFocus: true});
2155
- return;
2156
- case KEY.ESC:
2157
- this.cancel(e);
2158
- killEvent(e);
2159
- return;
2160
- }
2161
- }));
2162
-
2163
- this.search.on("blur", this.bind(function(e) {
2164
- // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown.
2165
- // without this the search field loses focus which is annoying
2166
- if (document.activeElement === this.body.get(0)) {
2167
- window.setTimeout(this.bind(function() {
2168
- if (this.opened()) {
2169
- this.search.focus();
2170
- }
2171
- }), 0);
2172
- }
2173
- }));
2174
-
2175
- this.focusser.on("keydown", this.bind(function (e) {
2176
- if (!this.isInterfaceEnabled()) return;
2177
-
2178
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) {
2179
- return;
2180
- }
2181
-
2182
- if (this.opts.openOnEnter === false && e.which === KEY.ENTER) {
2183
- killEvent(e);
2184
- return;
2185
- }
2186
-
2187
- if (e.which == KEY.DOWN || e.which == KEY.UP
2188
- || (e.which == KEY.ENTER && this.opts.openOnEnter)) {
2189
-
2190
- if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return;
2191
-
2192
- this.open();
2193
- killEvent(e);
2194
- return;
2195
- }
2196
-
2197
- if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) {
2198
- if (this.opts.allowClear) {
2199
- this.clear();
2200
- }
2201
- killEvent(e);
2202
- return;
2203
- }
2204
- }));
2205
-
2206
-
2207
- installKeyUpChangeEvent(this.focusser);
2208
- this.focusser.on("keyup-change input", this.bind(function(e) {
2209
- if (this.opts.minimumResultsForSearch >= 0) {
2210
- e.stopPropagation();
2211
- if (this.opened()) return;
2212
- this.open();
2213
- }
2214
- }));
2215
-
2216
- selection.on("mousedown touchstart", "abbr", this.bind(function (e) {
2217
- if (!this.isInterfaceEnabled()) {
2218
- return;
2219
- }
2220
-
2221
- this.clear();
2222
- killEventImmediately(e);
2223
- this.close();
2224
-
2225
- if (this.selection) {
2226
- this.selection.focus();
2227
- }
2228
- }));
2229
-
2230
- selection.on("mousedown touchstart", this.bind(function (e) {
2231
- // Prevent IE from generating a click event on the body
2232
- reinsertElement(selection);
2233
-
2234
- if (!this.container.hasClass("select2-container-active")) {
2235
- this.opts.element.trigger($.Event("select2-focus"));
2236
- }
2237
-
2238
- if (this.opened()) {
2239
- this.close();
2240
- } else if (this.isInterfaceEnabled()) {
2241
- this.open();
2242
- }
2243
-
2244
- killEvent(e);
2245
- }));
2246
-
2247
- dropdown.on("mousedown touchstart", this.bind(function() {
2248
- if (this.opts.shouldFocusInput(this)) {
2249
- this.search.focus();
2250
- }
2251
- }));
2252
-
2253
- selection.on("focus", this.bind(function(e) {
2254
- killEvent(e);
2255
- }));
2256
-
2257
- this.focusser.on("focus", this.bind(function(){
2258
- if (!this.container.hasClass("select2-container-active")) {
2259
- this.opts.element.trigger($.Event("select2-focus"));
2260
- }
2261
- this.container.addClass("select2-container-active");
2262
- })).on("blur", this.bind(function() {
2263
- if (!this.opened()) {
2264
- this.container.removeClass("select2-container-active");
2265
- this.opts.element.trigger($.Event("select2-blur"));
2266
- }
2267
- }));
2268
- this.search.on("focus", this.bind(function(){
2269
- if (!this.container.hasClass("select2-container-active")) {
2270
- this.opts.element.trigger($.Event("select2-focus"));
2271
- }
2272
- this.container.addClass("select2-container-active");
2273
- }));
2274
-
2275
- this.initContainerWidth();
2276
- this.opts.element.hide();
2277
- this.setPlaceholder();
2278
-
2279
- },
2280
-
2281
- // single
2282
- clear: function(triggerChange) {
2283
- var data=this.selection.data("select2-data");
2284
- if (data) { // guard against queued quick consecutive clicks
2285
- var evt = $.Event("select2-clearing");
2286
- this.opts.element.trigger(evt);
2287
- if (evt.isDefaultPrevented()) {
2288
- return;
2289
- }
2290
- var placeholderOption = this.getPlaceholderOption();
2291
- this.opts.element.val(placeholderOption ? placeholderOption.val() : "");
2292
- this.selection.find(".select2-chosen").empty();
2293
- this.selection.removeData("select2-data");
2294
- this.setPlaceholder();
2295
-
2296
- if (triggerChange !== false){
2297
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
2298
- this.triggerChange({removed:data});
2299
- }
2300
- }
2301
- },
2302
-
2303
- /**
2304
- * Sets selection based on source element's value
2305
- */
2306
- // single
2307
- initSelection: function () {
2308
- var selected;
2309
- if (this.isPlaceholderOptionSelected()) {
2310
- this.updateSelection(null);
2311
- this.close();
2312
- this.setPlaceholder();
2313
- } else {
2314
- var self = this;
2315
- this.opts.initSelection.call(null, this.opts.element, function(selected){
2316
- if (selected !== undefined && selected !== null) {
2317
- self.updateSelection(selected);
2318
- self.close();
2319
- self.setPlaceholder();
2320
- self.nextSearchTerm = self.opts.nextSearchTerm(selected, self.search.val());
2321
- }
2322
- });
2323
- }
2324
- },
2325
-
2326
- isPlaceholderOptionSelected: function() {
2327
- var placeholderOption;
2328
- if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered
2329
- return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected"))
2330
- || (this.opts.element.val() === "")
2331
- || (this.opts.element.val() === undefined)
2332
- || (this.opts.element.val() === null);
2333
- },
2334
-
2335
- // single
2336
- prepareOpts: function () {
2337
- var opts = this.parent.prepareOpts.apply(this, arguments),
2338
- self=this;
2339
-
2340
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
2341
- // install the selection initializer
2342
- opts.initSelection = function (element, callback) {
2343
- var selected = element.find("option").filter(function() { return this.selected && !this.disabled });
2344
- // a single select box always has a value, no need to null check 'selected'
2345
- callback(self.optionToData(selected));
2346
- };
2347
- } else if ("data" in opts) {
2348
- // install default initSelection when applied to hidden input and data is local
2349
- opts.initSelection = opts.initSelection || function (element, callback) {
2350
- var id = element.val();
2351
- //search in data by id, storing the actual matching item
2352
- var match = null;
2353
- opts.query({
2354
- matcher: function(term, text, el){
2355
- var is_match = equal(id, opts.id(el));
2356
- if (is_match) {
2357
- match = el;
2358
- }
2359
- return is_match;
2360
- },
2361
- callback: !$.isFunction(callback) ? $.noop : function() {
2362
- callback(match);
2363
- }
2364
- });
2365
- };
2366
- }
2367
-
2368
- return opts;
2369
- },
2370
-
2371
- // single
2372
- getPlaceholder: function() {
2373
- // if a placeholder is specified on a single select without a valid placeholder option ignore it
2374
- if (this.select) {
2375
- if (this.getPlaceholderOption() === undefined) {
2376
- return undefined;
2377
- }
2378
- }
2379
-
2380
- return this.parent.getPlaceholder.apply(this, arguments);
2381
- },
2382
-
2383
- // single
2384
- setPlaceholder: function () {
2385
- var placeholder = this.getPlaceholder();
2386
-
2387
- if (this.isPlaceholderOptionSelected() && placeholder !== undefined) {
2388
-
2389
- // check for a placeholder option if attached to a select
2390
- if (this.select && this.getPlaceholderOption() === undefined) return;
2391
-
2392
- this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder));
2393
-
2394
- this.selection.addClass("select2-default");
2395
-
2396
- this.container.removeClass("select2-allowclear");
2397
- }
2398
- },
2399
-
2400
- // single
2401
- postprocessResults: function (data, initial, noHighlightUpdate) {
2402
- var selected = 0, self = this, showSearchInput = true;
2403
-
2404
- // find the selected element in the result list
2405
-
2406
- this.findHighlightableChoices().each2(function (i, elm) {
2407
- if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) {
2408
- selected = i;
2409
- return false;
2410
- }
2411
- });
2412
-
2413
- // and highlight it
2414
- if (noHighlightUpdate !== false) {
2415
- if (initial === true && selected >= 0) {
2416
- this.highlight(selected);
2417
- } else {
2418
- this.highlight(0);
2419
- }
2420
- }
2421
-
2422
- // hide the search box if this is the first we got the results and there are enough of them for search
2423
-
2424
- if (initial === true) {
2425
- var min = this.opts.minimumResultsForSearch;
2426
- if (min >= 0) {
2427
- this.showSearch(countResults(data.results) >= min);
2428
- }
2429
- }
2430
- },
2431
-
2432
- // single
2433
- showSearch: function(showSearchInput) {
2434
- if (this.showSearchInput === showSearchInput) return;
2435
-
2436
- this.showSearchInput = showSearchInput;
2437
-
2438
- this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput);
2439
- this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput);
2440
- //add "select2-with-searchbox" to the container if search box is shown
2441
- $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput);
2442
- },
2443
-
2444
- // single
2445
- onSelect: function (data, options) {
2446
-
2447
- if (!this.triggerSelect(data)) { return; }
2448
-
2449
- var old = this.opts.element.val(),
2450
- oldData = this.data();
2451
-
2452
- this.opts.element.val(this.id(data));
2453
- this.updateSelection(data);
2454
-
2455
- this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data });
2456
-
2457
- this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
2458
- this.close();
2459
-
2460
- if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) {
2461
- this.focusser.focus();
2462
- }
2463
-
2464
- if (!equal(old, this.id(data))) {
2465
- this.triggerChange({ added: data, removed: oldData });
2466
- }
2467
- },
2468
-
2469
- // single
2470
- updateSelection: function (data) {
2471
-
2472
- var container=this.selection.find(".select2-chosen"), formatted, cssClass;
2473
-
2474
- this.selection.data("select2-data", data);
2475
-
2476
- container.empty();
2477
- if (data !== null) {
2478
- formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup);
2479
- }
2480
- if (formatted !== undefined) {
2481
- container.append(formatted);
2482
- }
2483
- cssClass=this.opts.formatSelectionCssClass(data, container);
2484
- if (cssClass !== undefined) {
2485
- container.addClass(cssClass);
2486
- }
2487
-
2488
- this.selection.removeClass("select2-default");
2489
-
2490
- if (this.opts.allowClear && this.getPlaceholder() !== undefined) {
2491
- this.container.addClass("select2-allowclear");
2492
- }
2493
- },
2494
-
2495
- // single
2496
- val: function () {
2497
- var val,
2498
- triggerChange = false,
2499
- data = null,
2500
- self = this,
2501
- oldData = this.data();
2502
-
2503
- if (arguments.length === 0) {
2504
- return this.opts.element.val();
2505
- }
2506
-
2507
- val = arguments[0];
2508
-
2509
- if (arguments.length > 1) {
2510
- triggerChange = arguments[1];
2511
- }
2512
-
2513
- if (this.select) {
2514
- this.select
2515
- .val(val)
2516
- .find("option").filter(function() { return this.selected }).each2(function (i, elm) {
2517
- data = self.optionToData(elm);
2518
- return false;
2519
- });
2520
- this.updateSelection(data);
2521
- this.setPlaceholder();
2522
- if (triggerChange) {
2523
- this.triggerChange({added: data, removed:oldData});
2524
- }
2525
- } else {
2526
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
2527
- if (!val && val !== 0) {
2528
- this.clear(triggerChange);
2529
- return;
2530
- }
2531
- if (this.opts.initSelection === undefined) {
2532
- throw new Error("cannot call val() if initSelection() is not defined");
2533
- }
2534
- this.opts.element.val(val);
2535
- this.opts.initSelection(this.opts.element, function(data){
2536
- self.opts.element.val(!data ? "" : self.id(data));
2537
- self.updateSelection(data);
2538
- self.setPlaceholder();
2539
- if (triggerChange) {
2540
- self.triggerChange({added: data, removed:oldData});
2541
- }
2542
- });
2543
- }
2544
- },
2545
-
2546
- // single
2547
- clearSearch: function () {
2548
- this.search.val("");
2549
- this.focusser.val("");
2550
- },
2551
-
2552
- // single
2553
- data: function(value) {
2554
- var data,
2555
- triggerChange = false;
2556
-
2557
- if (arguments.length === 0) {
2558
- data = this.selection.data("select2-data");
2559
- if (data == undefined) data = null;
2560
- return data;
2561
- } else {
2562
- if (arguments.length > 1) {
2563
- triggerChange = arguments[1];
2564
- }
2565
- if (!value) {
2566
- this.clear(triggerChange);
2567
- } else {
2568
- data = this.data();
2569
- this.opts.element.val(!value ? "" : this.id(value));
2570
- this.updateSelection(value);
2571
- if (triggerChange) {
2572
- this.triggerChange({added: value, removed:data});
2573
- }
2574
- }
2575
- }
2576
- }
2577
- });
2578
-
2579
- MultiSelect2 = clazz(AbstractSelect2, {
2580
-
2581
- // multi
2582
- createContainer: function () {
2583
- var container = $(document.createElement("div")).attr({
2584
- "class": "select2-container select2-container-multi"
2585
- }).html([
2586
- "<ul class='select2-choices'>",
2587
- " <li class='select2-search-field'>",
2588
- " <label for='' class='select2-offscreen'></label>",
2589
- " <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>",
2590
- " </li>",
2591
- "</ul>",
2592
- "<div class='select2-drop select2-drop-multi select2-display-none'>",
2593
- " <ul class='select2-results'>",
2594
- " </ul>",
2595
- "</div>"].join(""));
2596
- return container;
2597
- },
2598
-
2599
- // multi
2600
- prepareOpts: function () {
2601
- var opts = this.parent.prepareOpts.apply(this, arguments),
2602
- self=this;
2603
-
2604
- // TODO validate placeholder is a string if specified
2605
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
2606
- // install the selection initializer
2607
- opts.initSelection = function (element, callback) {
2608
-
2609
- var data = [];
2610
-
2611
- element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) {
2612
- data.push(self.optionToData(elm));
2613
- });
2614
- callback(data);
2615
- };
2616
- } else if ("data" in opts) {
2617
- // install default initSelection when applied to hidden input and data is local
2618
- opts.initSelection = opts.initSelection || function (element, callback) {
2619
- var ids = splitVal(element.val(), opts.separator, opts.transformVal);
2620
- //search in data by array of ids, storing matching items in a list
2621
- var matches = [];
2622
- opts.query({
2623
- matcher: function(term, text, el){
2624
- var is_match = $.grep(ids, function(id) {
2625
- return equal(id, opts.id(el));
2626
- }).length;
2627
- if (is_match) {
2628
- matches.push(el);
2629
- }
2630
- return is_match;
2631
- },
2632
- callback: !$.isFunction(callback) ? $.noop : function() {
2633
- // reorder matches based on the order they appear in the ids array because right now
2634
- // they are in the order in which they appear in data array
2635
- var ordered = [];
2636
- for (var i = 0; i < ids.length; i++) {
2637
- var id = ids[i];
2638
- for (var j = 0; j < matches.length; j++) {
2639
- var match = matches[j];
2640
- if (equal(id, opts.id(match))) {
2641
- ordered.push(match);
2642
- matches.splice(j, 1);
2643
- break;
2644
- }
2645
- }
2646
- }
2647
- callback(ordered);
2648
- }
2649
- });
2650
- };
2651
- }
2652
-
2653
- return opts;
2654
- },
2655
-
2656
- // multi
2657
- selectChoice: function (choice) {
2658
-
2659
- var selected = this.container.find(".select2-search-choice-focus");
2660
- if (selected.length && choice && choice[0] == selected[0]) {
2661
-
2662
- } else {
2663
- if (selected.length) {
2664
- this.opts.element.trigger("choice-deselected", selected);
2665
- }
2666
- selected.removeClass("select2-search-choice-focus");
2667
- if (choice && choice.length) {
2668
- this.close();
2669
- choice.addClass("select2-search-choice-focus");
2670
- this.opts.element.trigger("choice-selected", choice);
2671
- }
2672
- }
2673
- },
2674
-
2675
- // multi
2676
- destroy: function() {
2677
- $("label[for='" + this.search.attr('id') + "']")
2678
- .attr('for', this.opts.element.attr("id"));
2679
- this.parent.destroy.apply(this, arguments);
2680
-
2681
- cleanupJQueryElements.call(this,
2682
- "searchContainer",
2683
- "selection"
2684
- );
2685
- },
2686
-
2687
- // multi
2688
- initContainer: function () {
2689
-
2690
- var selector = ".select2-choices", selection;
2691
-
2692
- this.searchContainer = this.container.find(".select2-search-field");
2693
- this.selection = selection = this.container.find(selector);
2694
-
2695
- var _this = this;
2696
- this.selection.on("click", ".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)", function (e) {
2697
- _this.search[0].focus();
2698
- _this.selectChoice($(this));
2699
- });
2700
-
2701
- // rewrite labels from original element to focusser
2702
- this.search.attr("id", "s2id_autogen"+nextUid());
2703
-
2704
- this.search.prev()
2705
- .text($("label[for='" + this.opts.element.attr("id") + "']").text())
2706
- .attr('for', this.search.attr('id'));
2707
- this.opts.element.focus(this.bind(function () { this.focus(); }));
2708
-
2709
- this.search.on("input paste", this.bind(function() {
2710
- if (this.search.attr('placeholder') && this.search.val().length == 0) return;
2711
- if (!this.isInterfaceEnabled()) return;
2712
- if (!this.opened()) {
2713
- this.open();
2714
- }
2715
- }));
2716
-
2717
- this.search.attr("tabindex", this.elementTabIndex);
2718
-
2719
- this.keydowns = 0;
2720
- this.search.on("keydown", this.bind(function (e) {
2721
- if (!this.isInterfaceEnabled()) return;
2722
-
2723
- ++this.keydowns;
2724
- var selected = selection.find(".select2-search-choice-focus");
2725
- var prev = selected.prev(".select2-search-choice:not(.select2-locked)");
2726
- var next = selected.next(".select2-search-choice:not(.select2-locked)");
2727
- var pos = getCursorInfo(this.search);
2728
-
2729
- if (selected.length &&
2730
- (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) {
2731
- var selectedChoice = selected;
2732
- if (e.which == KEY.LEFT && prev.length) {
2733
- selectedChoice = prev;
2734
- }
2735
- else if (e.which == KEY.RIGHT) {
2736
- selectedChoice = next.length ? next : null;
2737
- }
2738
- else if (e.which === KEY.BACKSPACE) {
2739
- if (this.unselect(selected.first())) {
2740
- this.search.width(10);
2741
- selectedChoice = prev.length ? prev : next;
2742
- }
2743
- } else if (e.which == KEY.DELETE) {
2744
- if (this.unselect(selected.first())) {
2745
- this.search.width(10);
2746
- selectedChoice = next.length ? next : null;
2747
- }
2748
- } else if (e.which == KEY.ENTER) {
2749
- selectedChoice = null;
2750
- }
2751
-
2752
- this.selectChoice(selectedChoice);
2753
- killEvent(e);
2754
- if (!selectedChoice || !selectedChoice.length) {
2755
- this.open();
2756
- }
2757
- return;
2758
- } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1)
2759
- || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) {
2760
-
2761
- this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last());
2762
- killEvent(e);
2763
- return;
2764
- } else {
2765
- this.selectChoice(null);
2766
- }
2767
-
2768
- if (this.opened()) {
2769
- switch (e.which) {
2770
- case KEY.UP:
2771
- case KEY.DOWN:
2772
- this.moveHighlight((e.which === KEY.UP) ? -1 : 1);
2773
- killEvent(e);
2774
- return;
2775
- case KEY.ENTER:
2776
- this.selectHighlighted();
2777
- killEvent(e);
2778
- return;
2779
- case KEY.TAB:
2780
- this.selectHighlighted({noFocus:true});
2781
- this.close();
2782
- return;
2783
- case KEY.ESC:
2784
- this.cancel(e);
2785
- killEvent(e);
2786
- return;
2787
- }
2788
- }
2789
-
2790
- if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e)
2791
- || e.which === KEY.BACKSPACE || e.which === KEY.ESC) {
2792
- return;
2793
- }
2794
-
2795
- if (e.which === KEY.ENTER) {
2796
- if (this.opts.openOnEnter === false) {
2797
- return;
2798
- } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) {
2799
- return;
2800
- }
2801
- }
2802
-
2803
- this.open();
2804
-
2805
- if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) {
2806
- // prevent the page from scrolling
2807
- killEvent(e);
2808
- }
2809
-
2810
- if (e.which === KEY.ENTER) {
2811
- // prevent form from being submitted
2812
- killEvent(e);
2813
- }
2814
-
2815
- }));
2816
-
2817
- this.search.on("keyup", this.bind(function (e) {
2818
- this.keydowns = 0;
2819
- this.resizeSearch();
2820
- })
2821
- );
2822
-
2823
- this.search.on("blur", this.bind(function(e) {
2824
- this.container.removeClass("select2-container-active");
2825
- this.search.removeClass("select2-focused");
2826
- this.selectChoice(null);
2827
- if (!this.opened()) this.clearSearch();
2828
- e.stopImmediatePropagation();
2829
- this.opts.element.trigger($.Event("select2-blur"));
2830
- }));
2831
-
2832
- this.container.on("click", selector, this.bind(function (e) {
2833
- if (!this.isInterfaceEnabled()) return;
2834
- if ($(e.target).closest(".select2-search-choice").length > 0) {
2835
- // clicked inside a select2 search choice, do not open
2836
- return;
2837
- }
2838
- this.selectChoice(null);
2839
- this.clearPlaceholder();
2840
- if (!this.container.hasClass("select2-container-active")) {
2841
- this.opts.element.trigger($.Event("select2-focus"));
2842
- }
2843
- this.open();
2844
- this.focusSearch();
2845
- e.preventDefault();
2846
- }));
2847
-
2848
- this.container.on("focus", selector, this.bind(function () {
2849
- if (!this.isInterfaceEnabled()) return;
2850
- if (!this.container.hasClass("select2-container-active")) {
2851
- this.opts.element.trigger($.Event("select2-focus"));
2852
- }
2853
- this.container.addClass("select2-container-active");
2854
- this.dropdown.addClass("select2-drop-active");
2855
- this.clearPlaceholder();
2856
- }));
2857
-
2858
- this.initContainerWidth();
2859
- this.opts.element.hide();
2860
-
2861
- // set the placeholder if necessary
2862
- this.clearSearch();
2863
- },
2864
-
2865
- // multi
2866
- enableInterface: function() {
2867
- if (this.parent.enableInterface.apply(this, arguments)) {
2868
- this.search.prop("disabled", !this.isInterfaceEnabled());
2869
- }
2870
- },
2871
-
2872
- // multi
2873
- initSelection: function () {
2874
- var data;
2875
- if (this.opts.element.val() === "" && this.opts.element.text() === "") {
2876
- this.updateSelection([]);
2877
- this.close();
2878
- // set the placeholder if necessary
2879
- this.clearSearch();
2880
- }
2881
- if (this.select || this.opts.element.val() !== "") {
2882
- var self = this;
2883
- this.opts.initSelection.call(null, this.opts.element, function(data){
2884
- if (data !== undefined && data !== null) {
2885
- self.updateSelection(data);
2886
- self.close();
2887
- // set the placeholder if necessary
2888
- self.clearSearch();
2889
- }
2890
- });
2891
- }
2892
- },
2893
-
2894
- // multi
2895
- clearSearch: function () {
2896
- var placeholder = this.getPlaceholder(),
2897
- maxWidth = this.getMaxSearchWidth();
2898
-
2899
- if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) {
2900
- this.search.val(placeholder).addClass("select2-default");
2901
- // stretch the search box to full width of the container so as much of the placeholder is visible as possible
2902
- // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944
2903
- this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width"));
2904
- } else {
2905
- this.search.val("").width(10);
2906
- }
2907
- },
2908
-
2909
- // multi
2910
- clearPlaceholder: function () {
2911
- if (this.search.hasClass("select2-default")) {
2912
- this.search.val("").removeClass("select2-default");
2913
- }
2914
- },
2915
-
2916
- // multi
2917
- opening: function () {
2918
- this.clearPlaceholder(); // should be done before super so placeholder is not used to search
2919
- this.resizeSearch();
2920
-
2921
- this.parent.opening.apply(this, arguments);
2922
-
2923
- this.focusSearch();
2924
-
2925
- // initializes search's value with nextSearchTerm (if defined by user)
2926
- // ignore nextSearchTerm if the dropdown is opened by the user pressing a letter
2927
- if(this.search.val() === "") {
2928
- if(this.nextSearchTerm != undefined){
2929
- this.search.val(this.nextSearchTerm);
2930
- this.search.select();
2931
- }
2932
- }
2933
-
2934
- this.updateResults(true);
2935
- if (this.opts.shouldFocusInput(this)) {
2936
- this.search.focus();
2937
- }
2938
- this.opts.element.trigger($.Event("select2-open"));
2939
- },
2940
-
2941
- // multi
2942
- close: function () {
2943
- if (!this.opened()) return;
2944
- this.parent.close.apply(this, arguments);
2945
- },
2946
-
2947
- // multi
2948
- focus: function () {
2949
- this.close();
2950
- this.search.focus();
2951
- },
2952
-
2953
- // multi
2954
- isFocused: function () {
2955
- return this.search.hasClass("select2-focused");
2956
- },
2957
-
2958
- // multi
2959
- updateSelection: function (data) {
2960
- var ids = [], filtered = [], self = this;
2961
-
2962
- // filter out duplicates
2963
- $(data).each(function () {
2964
- if (indexOf(self.id(this), ids) < 0) {
2965
- ids.push(self.id(this));
2966
- filtered.push(this);
2967
- }
2968
- });
2969
- data = filtered;
2970
-
2971
- this.selection.find(".select2-search-choice").remove();
2972
- $(data).each(function () {
2973
- self.addSelectedChoice(this);
2974
- });
2975
- self.postprocessResults();
2976
- },
2977
-
2978
- // multi
2979
- tokenize: function() {
2980
- var input = this.search.val();
2981
- input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts);
2982
- if (input != null && input != undefined) {
2983
- this.search.val(input);
2984
- if (input.length > 0) {
2985
- this.open();
2986
- }
2987
- }
2988
-
2989
- },
2990
-
2991
- // multi
2992
- onSelect: function (data, options) {
2993
-
2994
- if (!this.triggerSelect(data) || data.text === "") { return; }
2995
-
2996
- this.addSelectedChoice(data);
2997
-
2998
- this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data });
2999
-
3000
- // keep track of the search's value before it gets cleared
3001
- this.nextSearchTerm = this.opts.nextSearchTerm(data, this.search.val());
3002
-
3003
- this.clearSearch();
3004
- this.updateResults();
3005
-
3006
- if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true);
3007
-
3008
- if (this.opts.closeOnSelect) {
3009
- this.close();
3010
- this.search.width(10);
3011
- } else {
3012
- if (this.countSelectableResults()>0) {
3013
- this.search.width(10);
3014
- this.resizeSearch();
3015
- if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) {
3016
- // if we reached max selection size repaint the results so choices
3017
- // are replaced with the max selection reached message
3018
- this.updateResults(true);
3019
- } else {
3020
- // initializes search's value with nextSearchTerm and update search result
3021
- if(this.nextSearchTerm != undefined){
3022
- this.search.val(this.nextSearchTerm);
3023
- this.updateResults();
3024
- this.search.select();
3025
- }
3026
- }
3027
- this.positionDropdown();
3028
- } else {
3029
- // if nothing left to select close
3030
- this.close();
3031
- this.search.width(10);
3032
- }
3033
- }
3034
-
3035
- // since its not possible to select an element that has already been
3036
- // added we do not need to check if this is a new element before firing change
3037
- this.triggerChange({ added: data });
3038
-
3039
- if (!options || !options.noFocus)
3040
- this.focusSearch();
3041
- },
3042
-
3043
- // multi
3044
- cancel: function () {
3045
- this.close();
3046
- this.focusSearch();
3047
- },
3048
-
3049
- addSelectedChoice: function (data) {
3050
- var enableChoice = !data.locked,
3051
- enabledItem = $(
3052
- "<li class='select2-search-choice'>" +
3053
- " <div></div>" +
3054
- " <a href='#' class='select2-search-choice-close' tabindex='-1'></a>" +
3055
- "</li>"),
3056
- disabledItem = $(
3057
- "<li class='select2-search-choice select2-locked'>" +
3058
- "<div></div>" +
3059
- "</li>");
3060
- var choice = enableChoice ? enabledItem : disabledItem,
3061
- id = this.id(data),
3062
- val = this.getVal(),
3063
- formatted,
3064
- cssClass;
3065
-
3066
- formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup);
3067
- if (formatted != undefined) {
3068
- choice.find("div").replaceWith($("<div></div>").html(formatted));
3069
- }
3070
- cssClass=this.opts.formatSelectionCssClass(data, choice.find("div"));
3071
- if (cssClass != undefined) {
3072
- choice.addClass(cssClass);
3073
- }
3074
-
3075
- if(enableChoice){
3076
- choice.find(".select2-search-choice-close")
3077
- .on("mousedown", killEvent)
3078
- .on("click dblclick", this.bind(function (e) {
3079
- if (!this.isInterfaceEnabled()) return;
3080
-
3081
- this.unselect($(e.target));
3082
- this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus");
3083
- killEvent(e);
3084
- this.close();
3085
- this.focusSearch();
3086
- })).on("focus", this.bind(function () {
3087
- if (!this.isInterfaceEnabled()) return;
3088
- this.container.addClass("select2-container-active");
3089
- this.dropdown.addClass("select2-drop-active");
3090
- }));
3091
- }
3092
-
3093
- choice.data("select2-data", data);
3094
- choice.insertBefore(this.searchContainer);
3095
-
3096
- val.push(id);
3097
- this.setVal(val);
3098
- },
3099
-
3100
- // multi
3101
- unselect: function (selected) {
3102
- var val = this.getVal(),
3103
- data,
3104
- index;
3105
- selected = selected.closest(".select2-search-choice");
3106
-
3107
- if (selected.length === 0) {
3108
- throw "Invalid argument: " + selected + ". Must be .select2-search-choice";
3109
- }
3110
-
3111
- data = selected.data("select2-data");
3112
-
3113
- if (!data) {
3114
- // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued
3115
- // and invoked on an element already removed
3116
- return;
3117
- }
3118
-
3119
- var evt = $.Event("select2-removing");
3120
- evt.val = this.id(data);
3121
- evt.choice = data;
3122
- this.opts.element.trigger(evt);
3123
-
3124
- if (evt.isDefaultPrevented()) {
3125
- return false;
3126
- }
3127
-
3128
- while((index = indexOf(this.id(data), val)) >= 0) {
3129
- val.splice(index, 1);
3130
- this.setVal(val);
3131
- if (this.select) this.postprocessResults();
3132
- }
3133
-
3134
- selected.remove();
3135
-
3136
- this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data });
3137
- this.triggerChange({ removed: data });
3138
-
3139
- return true;
3140
- },
3141
-
3142
- // multi
3143
- postprocessResults: function (data, initial, noHighlightUpdate) {
3144
- var val = this.getVal(),
3145
- choices = this.results.find(".select2-result"),
3146
- compound = this.results.find(".select2-result-with-children"),
3147
- self = this;
3148
-
3149
- choices.each2(function (i, choice) {
3150
- var id = self.id(choice.data("select2-data"));
3151
- if (indexOf(id, val) >= 0) {
3152
- choice.addClass("select2-selected");
3153
- // mark all children of the selected parent as selected
3154
- choice.find(".select2-result-selectable").addClass("select2-selected");
3155
- }
3156
- });
3157
-
3158
- compound.each2(function(i, choice) {
3159
- // hide an optgroup if it doesn't have any selectable children
3160
- if (!choice.is('.select2-result-selectable')
3161
- && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) {
3162
- choice.addClass("select2-selected");
3163
- }
3164
- });
3165
-
3166
- if (this.highlight() == -1 && noHighlightUpdate !== false && this.opts.closeOnSelect === true){
3167
- self.highlight(0);
3168
- }
3169
-
3170
- //If all results are chosen render formatNoMatches
3171
- if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){
3172
- if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) {
3173
- if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) {
3174
- this.results.append("<li class='select2-no-results'>" + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + "</li>");
3175
- }
3176
- }
3177
- }
3178
-
3179
- },
3180
-
3181
- // multi
3182
- getMaxSearchWidth: function() {
3183
- return this.selection.width() - getSideBorderPadding(this.search);
3184
- },
3185
-
3186
- // multi
3187
- resizeSearch: function () {
3188
- var minimumWidth, left, maxWidth, containerLeft, searchWidth,
3189
- sideBorderPadding = getSideBorderPadding(this.search);
3190
-
3191
- minimumWidth = measureTextWidth(this.search) + 10;
3192
-
3193
- left = this.search.offset().left;
3194
-
3195
- maxWidth = this.selection.width();
3196
- containerLeft = this.selection.offset().left;
3197
-
3198
- searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding;
3199
-
3200
- if (searchWidth < minimumWidth) {
3201
- searchWidth = maxWidth - sideBorderPadding;
3202
- }
3203
-
3204
- if (searchWidth < 40) {
3205
- searchWidth = maxWidth - sideBorderPadding;
3206
- }
3207
-
3208
- if (searchWidth <= 0) {
3209
- searchWidth = minimumWidth;
3210
- }
3211
-
3212
- this.search.width(Math.floor(searchWidth));
3213
- },
3214
-
3215
- // multi
3216
- getVal: function () {
3217
- var val;
3218
- if (this.select) {
3219
- val = this.select.val();
3220
- return val === null ? [] : val;
3221
- } else {
3222
- val = this.opts.element.val();
3223
- return splitVal(val, this.opts.separator, this.opts.transformVal);
3224
- }
3225
- },
3226
-
3227
- // multi
3228
- setVal: function (val) {
3229
- var unique;
3230
- if (this.select) {
3231
- this.select.val(val);
3232
- } else {
3233
- unique = [];
3234
- // filter out duplicates
3235
- $(val).each(function () {
3236
- if (indexOf(this, unique) < 0) unique.push(this);
3237
- });
3238
- this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator));
3239
- }
3240
- },
3241
-
3242
- // multi
3243
- buildChangeDetails: function (old, current) {
3244
- var current = current.slice(0),
3245
- old = old.slice(0);
3246
-
3247
- // remove intersection from each array
3248
- for (var i = 0; i < current.length; i++) {
3249
- for (var j = 0; j < old.length; j++) {
3250
- if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) {
3251
- current.splice(i, 1);
3252
- if(i>0){
3253
- i--;
3254
- }
3255
- old.splice(j, 1);
3256
- j--;
3257
- }
3258
- }
3259
- }
3260
-
3261
- return {added: current, removed: old};
3262
- },
3263
-
3264
-
3265
- // multi
3266
- val: function (val, triggerChange) {
3267
- var oldData, self=this;
3268
-
3269
- if (arguments.length === 0) {
3270
- return this.getVal();
3271
- }
3272
-
3273
- oldData=this.data();
3274
- if (!oldData.length) oldData=[];
3275
-
3276
- // val is an id. !val is true for [undefined,null,'',0] - 0 is legal
3277
- if (!val && val !== 0) {
3278
- this.opts.element.val("");
3279
- this.updateSelection([]);
3280
- this.clearSearch();
3281
- if (triggerChange) {
3282
- this.triggerChange({added: this.data(), removed: oldData});
3283
- }
3284
- return;
3285
- }
3286
-
3287
- // val is a list of ids
3288
- this.setVal(val);
3289
-
3290
- if (this.select) {
3291
- this.opts.initSelection(this.select, this.bind(this.updateSelection));
3292
- if (triggerChange) {
3293
- this.triggerChange(this.buildChangeDetails(oldData, this.data()));
3294
- }
3295
- } else {
3296
- if (this.opts.initSelection === undefined) {
3297
- throw new Error("val() cannot be called if initSelection() is not defined");
3298
- }
3299
-
3300
- this.opts.initSelection(this.opts.element, function(data){
3301
- var ids=$.map(data, self.id);
3302
- self.setVal(ids);
3303
- self.updateSelection(data);
3304
- self.clearSearch();
3305
- if (triggerChange) {
3306
- self.triggerChange(self.buildChangeDetails(oldData, self.data()));
3307
- }
3308
- });
3309
- }
3310
- this.clearSearch();
3311
- },
3312
-
3313
- // multi
3314
- onSortStart: function() {
3315
- if (this.select) {
3316
- throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");
3317
- }
3318
-
3319
- // collapse search field into 0 width so its container can be collapsed as well
3320
- this.search.width(0);
3321
- // hide the container
3322
- this.searchContainer.hide();
3323
- },
3324
-
3325
- // multi
3326
- onSortEnd:function() {
3327
-
3328
- var val=[], self=this;
3329
-
3330
- // show search and move it to the end of the list
3331
- this.searchContainer.show();
3332
- // make sure the search container is the last item in the list
3333
- this.searchContainer.appendTo(this.searchContainer.parent());
3334
- // since we collapsed the width in dragStarted, we resize it here
3335
- this.resizeSearch();
3336
-
3337
- // update selection
3338
- this.selection.find(".select2-search-choice").each(function() {
3339
- val.push(self.opts.id($(this).data("select2-data")));
3340
- });
3341
- this.setVal(val);
3342
- this.triggerChange();
3343
- },
3344
-
3345
- // multi
3346
- data: function(values, triggerChange) {
3347
- var self=this, ids, old;
3348
- if (arguments.length === 0) {
3349
- return this.selection
3350
- .children(".select2-search-choice")
3351
- .map(function() { return $(this).data("select2-data"); })
3352
- .get();
3353
- } else {
3354
- old = this.data();
3355
- if (!values) { values = []; }
3356
- ids = $.map(values, function(e) { return self.opts.id(e); });
3357
- this.setVal(ids);
3358
- this.updateSelection(values);
3359
- this.clearSearch();
3360
- if (triggerChange) {
3361
- this.triggerChange(this.buildChangeDetails(old, this.data()));
3362
- }
3363
- }
3364
- }
3365
- });
3366
-
3367
- $.fn.select2 = function () {
3368
-
3369
- var args = Array.prototype.slice.call(arguments, 0),
3370
- opts,
3371
- select2,
3372
- method, value, multiple,
3373
- allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"],
3374
- valueMethods = ["opened", "isFocused", "container", "dropdown"],
3375
- propertyMethods = ["val", "data"],
3376
- methodsMap = { search: "externalSearch" };
3377
-
3378
- this.each(function () {
3379
- if (args.length === 0 || typeof(args[0]) === "object") {
3380
- opts = args.length === 0 ? {} : $.extend({}, args[0]);
3381
- opts.element = $(this);
3382
-
3383
- if (opts.element.get(0).tagName.toLowerCase() === "select") {
3384
- multiple = opts.element.prop("multiple");
3385
- } else {
3386
- multiple = opts.multiple || false;
3387
- if ("tags" in opts) {opts.multiple = multiple = true;}
3388
- }
3389
-
3390
- select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single();
3391
- select2.init(opts);
3392
- } else if (typeof(args[0]) === "string") {
3393
-
3394
- if (indexOf(args[0], allowedMethods) < 0) {
3395
- throw "Unknown method: " + args[0];
3396
- }
3397
-
3398
- value = undefined;
3399
- select2 = $(this).data("select2");
3400
- if (select2 === undefined) return;
3401
-
3402
- method=args[0];
3403
-
3404
- if (method === "container") {
3405
- value = select2.container;
3406
- } else if (method === "dropdown") {
3407
- value = select2.dropdown;
3408
- } else {
3409
- if (methodsMap[method]) method = methodsMap[method];
3410
-
3411
- value = select2[method].apply(select2, args.slice(1));
3412
- }
3413
- if (indexOf(args[0], valueMethods) >= 0
3414
- || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) {
3415
- return false; // abort the iteration, ready to return first matched value
3416
- }
3417
- } else {
3418
- throw "Invalid arguments to select2 plugin: " + args;
3419
- }
3420
- });
3421
- return (value === undefined) ? this : value;
3422
- };
3423
-
3424
- // plugin defaults, accessible to users
3425
- $.fn.select2.defaults = {
3426
- width: "copy",
3427
- loadMorePadding: 0,
3428
- closeOnSelect: true,
3429
- openOnEnter: true,
3430
- containerCss: {},
3431
- dropdownCss: {},
3432
- containerCssClass: "",
3433
- dropdownCssClass: "",
3434
- formatResult: function(result, container, query, escapeMarkup) {
3435
- var markup=[];
3436
- markMatch(this.text(result), query.term, markup, escapeMarkup);
3437
- return markup.join("");
3438
- },
3439
- transformVal: function(val) {
3440
- return $.trim(val);
3441
- },
3442
- formatSelection: function (data, container, escapeMarkup) {
3443
- return data ? escapeMarkup(this.text(data)) : undefined;
3444
- },
3445
- sortResults: function (results, container, query) {
3446
- return results;
3447
- },
3448
- formatResultCssClass: function(data) {return data.css;},
3449
- formatSelectionCssClass: function(data, container) {return undefined;},
3450
- minimumResultsForSearch: 0,
3451
- minimumInputLength: 0,
3452
- maximumInputLength: null,
3453
- maximumSelectionSize: 0,
3454
- id: function (e) { return e == undefined ? null : e.id; },
3455
- text: function (e) {
3456
- if (e && this.data && this.data.text) {
3457
- if ($.isFunction(this.data.text)) {
3458
- return this.data.text(e);
3459
- } else {
3460
- return e[this.data.text];
3461
- }
3462
- } else {
3463
- return e.text;
3464
- }
3465
- },
3466
- matcher: function(term, text) {
3467
- return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0;
3468
- },
3469
- separator: ",",
3470
- tokenSeparators: [],
3471
- tokenizer: defaultTokenizer,
3472
- escapeMarkup: defaultEscapeMarkup,
3473
- blurOnChange: false,
3474
- selectOnBlur: false,
3475
- adaptContainerCssClass: function(c) { return c; },
3476
- adaptDropdownCssClass: function(c) { return null; },
3477
- nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; },
3478
- searchInputPlaceholder: '',
3479
- createSearchChoicePosition: 'top',
3480
- shouldFocusInput: function (instance) {
3481
- // Attempt to detect touch devices
3482
- var supportsTouchEvents = (('ontouchstart' in window) ||
3483
- (navigator.msMaxTouchPoints > 0));
3484
-
3485
- // Only devices which support touch events should be special cased
3486
- if (!supportsTouchEvents) {
3487
- return true;
3488
- }
3489
-
3490
- // Never focus the input if search is disabled
3491
- if (instance.opts.minimumResultsForSearch < 0) {
3492
- return false;
3493
- }
3494
-
3495
- return true;
3496
- }
3497
- };
3498
-
3499
- $.fn.select2.locales = [];
3500
-
3501
- $.fn.select2.locales['en'] = {
3502
- formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; },
3503
- formatNoMatches: function () { return "No matches found"; },
3504
- formatAjaxError: function (jqXHR, textStatus, errorThrown) { return "Loading failed"; },
3505
- formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); },
3506
- formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); },
3507
- formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); },
3508
- formatLoadMore: function (pageNumber) { return "Loading more results…"; },
3509
- formatSearching: function () { return "Searching…"; }
3510
- };
3511
-
3512
- $.extend($.fn.select2.defaults, $.fn.select2.locales['en']);
3513
-
3514
- $.fn.select2.ajaxDefaults = {
3515
- transport: $.ajax,
3516
- params: {
3517
- type: "GET",
3518
- cache: false,
3519
- dataType: "json"
3520
- }
3521
- };
3522
-
3523
- // exports
3524
- window.Select2 = {
3525
- query: {
3526
- ajax: ajax,
3527
- local: local,
3528
- tags: tags
3529
- }, util: {
3530
- debounce: debounce,
3531
- markMatch: markMatch,
3532
- escapeMarkup: defaultEscapeMarkup,
3533
- stripDiacritics: stripDiacritics
3534
- }, "class": {
3535
- "abstract": AbstractSelect2,
3536
- "single": SingleSelect2,
3537
- "multi": MultiSelect2
3538
- }
3539
- };
3540
-
3541
- }(jQuery));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/select2/select2.min.js DELETED
@@ -1,23 +0,0 @@
1
- /*
2
- Copyright 2014 Igor Vaynberg
3
-
4
- Version: 3.5.2 Timestamp: Sat Nov 1 14:43:36 EDT 2014
5
-
6
- This software is licensed under the Apache License, Version 2.0 (the "Apache License") or the GNU
7
- General Public License version 2 (the "GPL License"). You may choose either license to govern your
8
- use of this software only upon the condition that you accept all of the terms of either the Apache
9
- License or the GPL License.
10
-
11
- You may obtain a copy of the Apache License and the GPL License at:
12
-
13
- http://www.apache.org/licenses/LICENSE-2.0
14
- http://www.gnu.org/licenses/gpl-2.0.html
15
-
16
- Unless required by applicable law or agreed to in writing, software distributed under the Apache License
17
- or the GPL Licesnse is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
18
- either express or implied. See the Apache License and the GPL License for the specific language governing
19
- permissions and limitations under the Apache License and the GPL License.
20
- */
21
- !function(a){"undefined"==typeof a.fn.each2&&a.extend(a.fn,{each2:function(b){for(var c=a([0]),d=-1,e=this.length;++d<e&&(c.context=c[0]=this[d])&&b.call(c[0],d,c)!==!1;);return this}})}(jQuery),function(a,b){"use strict";function n(b){var c=a(document.createTextNode(""));b.before(c),c.before(b),c.remove()}function o(a){function b(a){return m[a]||a}return a.replace(/[^\u0000-\u007E]/g,b)}function p(a,b){for(var c=0,d=b.length;d>c;c+=1)if(r(a,b[c]))return c;return-1}function q(){var b=a(l);b.appendTo(document.body);var c={width:b.width()-b[0].clientWidth,height:b.height()-b[0].clientHeight};return b.remove(),c}function r(a,c){return a===c?!0:a===b||c===b?!1:null===a||null===c?!1:a.constructor===String?a+""==c+"":c.constructor===String?c+""==a+"":!1}function s(a,b,c){var d,e,f;if(null===a||a.length<1)return[];for(d=a.split(b),e=0,f=d.length;f>e;e+=1)d[e]=c(d[e]);return d}function t(a){return a.outerWidth(!1)-a.width()}function u(c){var d="keyup-change-value";c.on("keydown",function(){a.data(c,d)===b&&a.data(c,d,c.val())}),c.on("keyup",function(){var e=a.data(c,d);e!==b&&c.val()!==e&&(a.removeData(c,d),c.trigger("keyup-change"))})}function v(c){c.on("mousemove",function(c){var d=h;(d===b||d.x!==c.pageX||d.y!==c.pageY)&&a(c.target).trigger("mousemove-filtered",c)})}function w(a,c,d){d=d||b;var e;return function(){var b=arguments;window.clearTimeout(e),e=window.setTimeout(function(){c.apply(d,b)},a)}}function x(a,b){var c=w(a,function(a){b.trigger("scroll-debounced",a)});b.on("scroll",function(a){p(a.target,b.get())>=0&&c(a)})}function y(a){a[0]!==document.activeElement&&window.setTimeout(function(){var d,b=a[0],c=a.val().length;a.focus();var e=b.offsetWidth>0||b.offsetHeight>0;e&&b===document.activeElement&&(b.setSelectionRange?b.setSelectionRange(c,c):b.createTextRange&&(d=b.createTextRange(),d.collapse(!1),d.select()))},0)}function z(b){b=a(b)[0];var c=0,d=0;if("selectionStart"in b)c=b.selectionStart,d=b.selectionEnd-c;else if("selection"in document){b.focus();var e=document.selection.createRange();d=document.selection.createRange().text.length,e.moveStart("character",-b.value.length),c=e.text.length-d}return{offset:c,length:d}}function A(a){a.preventDefault(),a.stopPropagation()}function B(a){a.preventDefault(),a.stopImmediatePropagation()}function C(b){if(!g){var c=b[0].currentStyle||window.getComputedStyle(b[0],null);g=a(document.createElement("div")).css({position:"absolute",left:"-10000px",top:"-10000px",display:"none",fontSize:c.fontSize,fontFamily:c.fontFamily,fontStyle:c.fontStyle,fontWeight:c.fontWeight,letterSpacing:c.letterSpacing,textTransform:c.textTransform,whiteSpace:"nowrap"}),g.attr("class","select2-sizer"),a(document.body).append(g)}return g.text(b.val()),g.width()}function D(b,c,d){var e,g,f=[];e=a.trim(b.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0===this.indexOf("select2-")&&f.push(this)})),e=a.trim(c.attr("class")),e&&(e=""+e,a(e.split(/\s+/)).each2(function(){0!==this.indexOf("select2-")&&(g=d(this),g&&f.push(g))})),b.attr("class",f.join(" "))}function E(a,b,c,d){var e=o(a.toUpperCase()).indexOf(o(b.toUpperCase())),f=b.length;return 0>e?(c.push(d(a)),void 0):(c.push(d(a.substring(0,e))),c.push("<span class='select2-match'>"),c.push(d(a.substring(e,e+f))),c.push("</span>"),c.push(d(a.substring(e+f,a.length))),void 0)}function F(a){var b={"\\":"&#92;","&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;","/":"&#47;"};return String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})}function G(c){var d,e=null,f=c.quietMillis||100,g=c.url,h=this;return function(i){window.clearTimeout(d),d=window.setTimeout(function(){var d=c.data,f=g,j=c.transport||a.fn.select2.ajaxDefaults.transport,k={type:c.type||"GET",cache:c.cache||!1,jsonpCallback:c.jsonpCallback||b,dataType:c.dataType||"json"},l=a.extend({},a.fn.select2.ajaxDefaults.params,k);d=d?d.call(h,i.term,i.page,i.context):null,f="function"==typeof f?f.call(h,i.term,i.page,i.context):f,e&&"function"==typeof e.abort&&e.abort(),c.params&&(a.isFunction(c.params)?a.extend(l,c.params.call(h)):a.extend(l,c.params)),a.extend(l,{url:f,dataType:c.dataType,data:d,success:function(a){var b=c.results(a,i.page,i);i.callback(b)},error:function(a,b,c){var d={hasError:!0,jqXHR:a,textStatus:b,errorThrown:c};i.callback(d)}}),e=j.call(h,l)},f)}}function H(b){var d,e,c=b,f=function(a){return""+a.text};a.isArray(c)&&(e=c,c={results:e}),a.isFunction(c)===!1&&(e=c,c=function(){return e});var g=c();return g.text&&(f=g.text,a.isFunction(f)||(d=g.text,f=function(a){return a[d]})),function(b){var g,d=b.term,e={results:[]};return""===d?(b.callback(c()),void 0):(g=function(c,e){var h,i;if(c=c[0],c.children){h={};for(i in c)c.hasOwnProperty(i)&&(h[i]=c[i]);h.children=[],a(c.children).each2(function(a,b){g(b,h.children)}),(h.children.length||b.matcher(d,f(h),c))&&e.push(h)}else b.matcher(d,f(c),c)&&e.push(c)},a(c().results).each2(function(a,b){g(b,e.results)}),b.callback(e),void 0)}}function I(c){var d=a.isFunction(c);return function(e){var f=e.term,g={results:[]},h=d?c(e):c;a.isArray(h)&&(a(h).each(function(){var a=this.text!==b,c=a?this.text:this;(""===f||e.matcher(f,c))&&g.results.push(a?this:{id:this,text:this})}),e.callback(g))}}function J(b,c){if(a.isFunction(b))return!0;if(!b)return!1;if("string"==typeof b)return!0;throw new Error(c+" must be a string, function, or falsy value")}function K(b,c){if(a.isFunction(b)){var d=Array.prototype.slice.call(arguments,2);return b.apply(c,d)}return b}function L(b){var c=0;return a.each(b,function(a,b){b.children?c+=L(b.children):c++}),c}function M(a,c,d,e){var h,i,j,k,l,f=a,g=!1;if(!e.createSearchChoice||!e.tokenSeparators||e.tokenSeparators.length<1)return b;for(;;){for(i=-1,j=0,k=e.tokenSeparators.length;k>j&&(l=e.tokenSeparators[j],i=a.indexOf(l),!(i>=0));j++);if(0>i)break;if(h=a.substring(0,i),a=a.substring(i+l.length),h.length>0&&(h=e.createSearchChoice.call(this,h,c),h!==b&&null!==h&&e.id(h)!==b&&null!==e.id(h))){for(g=!1,j=0,k=c.length;k>j;j++)if(r(e.id(h),e.id(c[j]))){g=!0;break}g||d(h)}}return f!==a?a:void 0}function N(){var b=this;a.each(arguments,function(a,c){b[c].remove(),b[c]=null})}function O(b,c){var d=function(){};return d.prototype=new b,d.prototype.constructor=d,d.prototype.parent=b.prototype,d.prototype=a.extend(d.prototype,c),d}if(window.Select2===b){var c,d,e,f,g,i,j,h={x:0,y:0},k={TAB:9,ENTER:13,ESC:27,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40,SHIFT:16,CTRL:17,ALT:18,PAGE_UP:33,PAGE_DOWN:34,HOME:36,END:35,BACKSPACE:8,DELETE:46,isArrow:function(a){switch(a=a.which?a.which:a){case k.LEFT:case k.RIGHT:case k.UP:case k.DOWN:return!0}return!1},isControl:function(a){var b=a.which;switch(b){case k.SHIFT:case k.CTRL:case k.ALT:return!0}return a.metaKey?!0:!1},isFunctionKey:function(a){return a=a.which?a.which:a,a>=112&&123>=a}},l="<div class='select2-measure-scrollbar'></div>",m={"\u24b6":"A","\uff21":"A","\xc0":"A","\xc1":"A","\xc2":"A","\u1ea6":"A","\u1ea4":"A","\u1eaa":"A","\u1ea8":"A","\xc3":"A","\u0100":"A","\u0102":"A","\u1eb0":"A","\u1eae":"A","\u1eb4":"A","\u1eb2":"A","\u0226":"A","\u01e0":"A","\xc4":"A","\u01de":"A","\u1ea2":"A","\xc5":"A","\u01fa":"A","\u01cd":"A","\u0200":"A","\u0202":"A","\u1ea0":"A","\u1eac":"A","\u1eb6":"A","\u1e00":"A","\u0104":"A","\u023a":"A","\u2c6f":"A","\ua732":"AA","\xc6":"AE","\u01fc":"AE","\u01e2":"AE","\ua734":"AO","\ua736":"AU","\ua738":"AV","\ua73a":"AV","\ua73c":"AY","\u24b7":"B","\uff22":"B","\u1e02":"B","\u1e04":"B","\u1e06":"B","\u0243":"B","\u0182":"B","\u0181":"B","\u24b8":"C","\uff23":"C","\u0106":"C","\u0108":"C","\u010a":"C","\u010c":"C","\xc7":"C","\u1e08":"C","\u0187":"C","\u023b":"C","\ua73e":"C","\u24b9":"D","\uff24":"D","\u1e0a":"D","\u010e":"D","\u1e0c":"D","\u1e10":"D","\u1e12":"D","\u1e0e":"D","\u0110":"D","\u018b":"D","\u018a":"D","\u0189":"D","\ua779":"D","\u01f1":"DZ","\u01c4":"DZ","\u01f2":"Dz","\u01c5":"Dz","\u24ba":"E","\uff25":"E","\xc8":"E","\xc9":"E","\xca":"E","\u1ec0":"E","\u1ebe":"E","\u1ec4":"E","\u1ec2":"E","\u1ebc":"E","\u0112":"E","\u1e14":"E","\u1e16":"E","\u0114":"E","\u0116":"E","\xcb":"E","\u1eba":"E","\u011a":"E","\u0204":"E","\u0206":"E","\u1eb8":"E","\u1ec6":"E","\u0228":"E","\u1e1c":"E","\u0118":"E","\u1e18":"E","\u1e1a":"E","\u0190":"E","\u018e":"E","\u24bb":"F","\uff26":"F","\u1e1e":"F","\u0191":"F","\ua77b":"F","\u24bc":"G","\uff27":"G","\u01f4":"G","\u011c":"G","\u1e20":"G","\u011e":"G","\u0120":"G","\u01e6":"G","\u0122":"G","\u01e4":"G","\u0193":"G","\ua7a0":"G","\ua77d":"G","\ua77e":"G","\u24bd":"H","\uff28":"H","\u0124":"H","\u1e22":"H","\u1e26":"H","\u021e":"H","\u1e24":"H","\u1e28":"H","\u1e2a":"H","\u0126":"H","\u2c67":"H","\u2c75":"H","\ua78d":"H","\u24be":"I","\uff29":"I","\xcc":"I","\xcd":"I","\xce":"I","\u0128":"I","\u012a":"I","\u012c":"I","\u0130":"I","\xcf":"I","\u1e2e":"I","\u1ec8":"I","\u01cf":"I","\u0208":"I","\u020a":"I","\u1eca":"I","\u012e":"I","\u1e2c":"I","\u0197":"I","\u24bf":"J","\uff2a":"J","\u0134":"J","\u0248":"J","\u24c0":"K","\uff2b":"K","\u1e30":"K","\u01e8":"K","\u1e32":"K","\u0136":"K","\u1e34":"K","\u0198":"K","\u2c69":"K","\ua740":"K","\ua742":"K","\ua744":"K","\ua7a2":"K","\u24c1":"L","\uff2c":"L","\u013f":"L","\u0139":"L","\u013d":"L","\u1e36":"L","\u1e38":"L","\u013b":"L","\u1e3c":"L","\u1e3a":"L","\u0141":"L","\u023d":"L","\u2c62":"L","\u2c60":"L","\ua748":"L","\ua746":"L","\ua780":"L","\u01c7":"LJ","\u01c8":"Lj","\u24c2":"M","\uff2d":"M","\u1e3e":"M","\u1e40":"M","\u1e42":"M","\u2c6e":"M","\u019c":"M","\u24c3":"N","\uff2e":"N","\u01f8":"N","\u0143":"N","\xd1":"N","\u1e44":"N","\u0147":"N","\u1e46":"N","\u0145":"N","\u1e4a":"N","\u1e48":"N","\u0220":"N","\u019d":"N","\ua790":"N","\ua7a4":"N","\u01ca":"NJ","\u01cb":"Nj","\u24c4":"O","\uff2f":"O","\xd2":"O","\xd3":"O","\xd4":"O","\u1ed2":"O","\u1ed0":"O","\u1ed6":"O","\u1ed4":"O","\xd5":"O","\u1e4c":"O","\u022c":"O","\u1e4e":"O","\u014c":"O","\u1e50":"O","\u1e52":"O","\u014e":"O","\u022e":"O","\u0230":"O","\xd6":"O","\u022a":"O","\u1ece":"O","\u0150":"O","\u01d1":"O","\u020c":"O","\u020e":"O","\u01a0":"O","\u1edc":"O","\u1eda":"O","\u1ee0":"O","\u1ede":"O","\u1ee2":"O","\u1ecc":"O","\u1ed8":"O","\u01ea":"O","\u01ec":"O","\xd8":"O","\u01fe":"O","\u0186":"O","\u019f":"O","\ua74a":"O","\ua74c":"O","\u01a2":"OI","\ua74e":"OO","\u0222":"OU","\u24c5":"P","\uff30":"P","\u1e54":"P","\u1e56":"P","\u01a4":"P","\u2c63":"P","\ua750":"P","\ua752":"P","\ua754":"P","\u24c6":"Q","\uff31":"Q","\ua756":"Q","\ua758":"Q","\u024a":"Q","\u24c7":"R","\uff32":"R","\u0154":"R","\u1e58":"R","\u0158":"R","\u0210":"R","\u0212":"R","\u1e5a":"R","\u1e5c":"R","\u0156":"R","\u1e5e":"R","\u024c":"R","\u2c64":"R","\ua75a":"R","\ua7a6":"R","\ua782":"R","\u24c8":"S","\uff33":"S","\u1e9e":"S","\u015a":"S","\u1e64":"S","\u015c":"S","\u1e60":"S","\u0160":"S","\u1e66":"S","\u1e62":"S","\u1e68":"S","\u0218":"S","\u015e":"S","\u2c7e":"S","\ua7a8":"S","\ua784":"S","\u24c9":"T","\uff34":"T","\u1e6a":"T","\u0164":"T","\u1e6c":"T","\u021a":"T","\u0162":"T","\u1e70":"T","\u1e6e":"T","\u0166":"T","\u01ac":"T","\u01ae":"T","\u023e":"T","\ua786":"T","\ua728":"TZ","\u24ca":"U","\uff35":"U","\xd9":"U","\xda":"U","\xdb":"U","\u0168":"U","\u1e78":"U","\u016a":"U","\u1e7a":"U","\u016c":"U","\xdc":"U","\u01db":"U","\u01d7":"U","\u01d5":"U","\u01d9":"U","\u1ee6":"U","\u016e":"U","\u0170":"U","\u01d3":"U","\u0214":"U","\u0216":"U","\u01af":"U","\u1eea":"U","\u1ee8":"U","\u1eee":"U","\u1eec":"U","\u1ef0":"U","\u1ee4":"U","\u1e72":"U","\u0172":"U","\u1e76":"U","\u1e74":"U","\u0244":"U","\u24cb":"V","\uff36":"V","\u1e7c":"V","\u1e7e":"V","\u01b2":"V","\ua75e":"V","\u0245":"V","\ua760":"VY","\u24cc":"W","\uff37":"W","\u1e80":"W","\u1e82":"W","\u0174":"W","\u1e86":"W","\u1e84":"W","\u1e88":"W","\u2c72":"W","\u24cd":"X","\uff38":"X","\u1e8a":"X","\u1e8c":"X","\u24ce":"Y","\uff39":"Y","\u1ef2":"Y","\xdd":"Y","\u0176":"Y","\u1ef8":"Y","\u0232":"Y","\u1e8e":"Y","\u0178":"Y","\u1ef6":"Y","\u1ef4":"Y","\u01b3":"Y","\u024e":"Y","\u1efe":"Y","\u24cf":"Z","\uff3a":"Z","\u0179":"Z","\u1e90":"Z","\u017b":"Z","\u017d":"Z","\u1e92":"Z","\u1e94":"Z","\u01b5":"Z","\u0224":"Z","\u2c7f":"Z","\u2c6b":"Z","\ua762":"Z","\u24d0":"a","\uff41":"a","\u1e9a":"a","\xe0":"a","\xe1":"a","\xe2":"a","\u1ea7":"a","\u1ea5":"a","\u1eab":"a","\u1ea9":"a","\xe3":"a","\u0101":"a","\u0103":"a","\u1eb1":"a","\u1eaf":"a","\u1eb5":"a","\u1eb3":"a","\u0227":"a","\u01e1":"a","\xe4":"a","\u01df":"a","\u1ea3":"a","\xe5":"a","\u01fb":"a","\u01ce":"a","\u0201":"a","\u0203":"a","\u1ea1":"a","\u1ead":"a","\u1eb7":"a","\u1e01":"a","\u0105":"a","\u2c65":"a","\u0250":"a","\ua733":"aa","\xe6":"ae","\u01fd":"ae","\u01e3":"ae","\ua735":"ao","\ua737":"au","\ua739":"av","\ua73b":"av","\ua73d":"ay","\u24d1":"b","\uff42":"b","\u1e03":"b","\u1e05":"b","\u1e07":"b","\u0180":"b","\u0183":"b","\u0253":"b","\u24d2":"c","\uff43":"c","\u0107":"c","\u0109":"c","\u010b":"c","\u010d":"c","\xe7":"c","\u1e09":"c","\u0188":"c","\u023c":"c","\ua73f":"c","\u2184":"c","\u24d3":"d","\uff44":"d","\u1e0b":"d","\u010f":"d","\u1e0d":"d","\u1e11":"d","\u1e13":"d","\u1e0f":"d","\u0111":"d","\u018c":"d","\u0256":"d","\u0257":"d","\ua77a":"d","\u01f3":"dz","\u01c6":"dz","\u24d4":"e","\uff45":"e","\xe8":"e","\xe9":"e","\xea":"e","\u1ec1":"e","\u1ebf":"e","\u1ec5":"e","\u1ec3":"e","\u1ebd":"e","\u0113":"e","\u1e15":"e","\u1e17":"e","\u0115":"e","\u0117":"e","\xeb":"e","\u1ebb":"e","\u011b":"e","\u0205":"e","\u0207":"e","\u1eb9":"e","\u1ec7":"e","\u0229":"e","\u1e1d":"e","\u0119":"e","\u1e19":"e","\u1e1b":"e","\u0247":"e","\u025b":"e","\u01dd":"e","\u24d5":"f","\uff46":"f","\u1e1f":"f","\u0192":"f","\ua77c":"f","\u24d6":"g","\uff47":"g","\u01f5":"g","\u011d":"g","\u1e21":"g","\u011f":"g","\u0121":"g","\u01e7":"g","\u0123":"g","\u01e5":"g","\u0260":"g","\ua7a1":"g","\u1d79":"g","\ua77f":"g","\u24d7":"h","\uff48":"h","\u0125":"h","\u1e23":"h","\u1e27":"h","\u021f":"h","\u1e25":"h","\u1e29":"h","\u1e2b":"h","\u1e96":"h","\u0127":"h","\u2c68":"h","\u2c76":"h","\u0265":"h","\u0195":"hv","\u24d8":"i","\uff49":"i","\xec":"i","\xed":"i","\xee":"i","\u0129":"i","\u012b":"i","\u012d":"i","\xef":"i","\u1e2f":"i","\u1ec9":"i","\u01d0":"i","\u0209":"i","\u020b":"i","\u1ecb":"i","\u012f":"i","\u1e2d":"i","\u0268":"i","\u0131":"i","\u24d9":"j","\uff4a":"j","\u0135":"j","\u01f0":"j","\u0249":"j","\u24da":"k","\uff4b":"k","\u1e31":"k","\u01e9":"k","\u1e33":"k","\u0137":"k","\u1e35":"k","\u0199":"k","\u2c6a":"k","\ua741":"k","\ua743":"k","\ua745":"k","\ua7a3":"k","\u24db":"l","\uff4c":"l","\u0140":"l","\u013a":"l","\u013e":"l","\u1e37":"l","\u1e39":"l","\u013c":"l","\u1e3d":"l","\u1e3b":"l","\u017f":"l","\u0142":"l","\u019a":"l","\u026b":"l","\u2c61":"l","\ua749":"l","\ua781":"l","\ua747":"l","\u01c9":"lj","\u24dc":"m","\uff4d":"m","\u1e3f":"m","\u1e41":"m","\u1e43":"m","\u0271":"m","\u026f":"m","\u24dd":"n","\uff4e":"n","\u01f9":"n","\u0144":"n","\xf1":"n","\u1e45":"n","\u0148":"n","\u1e47":"n","\u0146":"n","\u1e4b":"n","\u1e49":"n","\u019e":"n","\u0272":"n","\u0149":"n","\ua791":"n","\ua7a5":"n","\u01cc":"nj","\u24de":"o","\uff4f":"o","\xf2":"o","\xf3":"o","\xf4":"o","\u1ed3":"o","\u1ed1":"o","\u1ed7":"o","\u1ed5":"o","\xf5":"o","\u1e4d":"o","\u022d":"o","\u1e4f":"o","\u014d":"o","\u1e51":"o","\u1e53":"o","\u014f":"o","\u022f":"o","\u0231":"o","\xf6":"o","\u022b":"o","\u1ecf":"o","\u0151":"o","\u01d2":"o","\u020d":"o","\u020f":"o","\u01a1":"o","\u1edd":"o","\u1edb":"o","\u1ee1":"o","\u1edf":"o","\u1ee3":"o","\u1ecd":"o","\u1ed9":"o","\u01eb":"o","\u01ed":"o","\xf8":"o","\u01ff":"o","\u0254":"o","\ua74b":"o","\ua74d":"o","\u0275":"o","\u01a3":"oi","\u0223":"ou","\ua74f":"oo","\u24df":"p","\uff50":"p","\u1e55":"p","\u1e57":"p","\u01a5":"p","\u1d7d":"p","\ua751":"p","\ua753":"p","\ua755":"p","\u24e0":"q","\uff51":"q","\u024b":"q","\ua757":"q","\ua759":"q","\u24e1":"r","\uff52":"r","\u0155":"r","\u1e59":"r","\u0159":"r","\u0211":"r","\u0213":"r","\u1e5b":"r","\u1e5d":"r","\u0157":"r","\u1e5f":"r","\u024d":"r","\u027d":"r","\ua75b":"r","\ua7a7":"r","\ua783":"r","\u24e2":"s","\uff53":"s","\xdf":"s","\u015b":"s","\u1e65":"s","\u015d":"s","\u1e61":"s","\u0161":"s","\u1e67":"s","\u1e63":"s","\u1e69":"s","\u0219":"s","\u015f":"s","\u023f":"s","\ua7a9":"s","\ua785":"s","\u1e9b":"s","\u24e3":"t","\uff54":"t","\u1e6b":"t","\u1e97":"t","\u0165":"t","\u1e6d":"t","\u021b":"t","\u0163":"t","\u1e71":"t","\u1e6f":"t","\u0167":"t","\u01ad":"t","\u0288":"t","\u2c66":"t","\ua787":"t","\ua729":"tz","\u24e4":"u","\uff55":"u","\xf9":"u","\xfa":"u","\xfb":"u","\u0169":"u","\u1e79":"u","\u016b":"u","\u1e7b":"u","\u016d":"u","\xfc":"u","\u01dc":"u","\u01d8":"u","\u01d6":"u","\u01da":"u","\u1ee7":"u","\u016f":"u","\u0171":"u","\u01d4":"u","\u0215":"u","\u0217":"u","\u01b0":"u","\u1eeb":"u","\u1ee9":"u","\u1eef":"u","\u1eed":"u","\u1ef1":"u","\u1ee5":"u","\u1e73":"u","\u0173":"u","\u1e77":"u","\u1e75":"u","\u0289":"u","\u24e5":"v","\uff56":"v","\u1e7d":"v","\u1e7f":"v","\u028b":"v","\ua75f":"v","\u028c":"v","\ua761":"vy","\u24e6":"w","\uff57":"w","\u1e81":"w","\u1e83":"w","\u0175":"w","\u1e87":"w","\u1e85":"w","\u1e98":"w","\u1e89":"w","\u2c73":"w","\u24e7":"x","\uff58":"x","\u1e8b":"x","\u1e8d":"x","\u24e8":"y","\uff59":"y","\u1ef3":"y","\xfd":"y","\u0177":"y","\u1ef9":"y","\u0233":"y","\u1e8f":"y","\xff":"y","\u1ef7":"y","\u1e99":"y","\u1ef5":"y","\u01b4":"y","\u024f":"y","\u1eff":"y","\u24e9":"z","\uff5a":"z","\u017a":"z","\u1e91":"z","\u017c":"z","\u017e":"z","\u1e93":"z","\u1e95":"z","\u01b6":"z","\u0225":"z","\u0240":"z","\u2c6c":"z","\ua763":"z","\u0386":"\u0391","\u0388":"\u0395","\u0389":"\u0397","\u038a":"\u0399","\u03aa":"\u0399","\u038c":"\u039f","\u038e":"\u03a5","\u03ab":"\u03a5","\u038f":"\u03a9","\u03ac":"\u03b1","\u03ad":"\u03b5","\u03ae":"\u03b7","\u03af":"\u03b9","\u03ca":"\u03b9","\u0390":"\u03b9","\u03cc":"\u03bf","\u03cd":"\u03c5","\u03cb":"\u03c5","\u03b0":"\u03c5","\u03c9":"\u03c9","\u03c2":"\u03c3"};i=a(document),f=function(){var a=1;return function(){return a++}}(),c=O(Object,{bind:function(a){var b=this;return function(){a.apply(b,arguments)}},init:function(c){var d,e,g=".select2-results";this.opts=c=this.prepareOpts(c),this.id=c.id,c.element.data("select2")!==b&&null!==c.element.data("select2")&&c.element.data("select2").destroy(),this.container=this.createContainer(),this.liveRegion=a(".select2-hidden-accessible"),0==this.liveRegion.length&&(this.liveRegion=a("<span>",{role:"status","aria-live":"polite"}).addClass("select2-hidden-accessible").appendTo(document.body)),this.containerId="s2id_"+(c.element.attr("id")||"autogen"+f()),this.containerEventName=this.containerId.replace(/([.])/g,"_").replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g,"\\$1"),this.container.attr("id",this.containerId),this.container.attr("title",c.element.attr("title")),this.body=a(document.body),D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.attr("style",c.element.attr("style")),this.container.css(K(c.containerCss,this.opts.element)),this.container.addClass(K(c.containerCssClass,this.opts.element)),this.elementTabIndex=this.opts.element.attr("tabindex"),this.opts.element.data("select2",this).attr("tabindex","-1").before(this.container).on("click.select2",A),this.container.data("select2",this),this.dropdown=this.container.find(".select2-drop"),D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(c.dropdownCssClass,this.opts.element)),this.dropdown.data("select2",this),this.dropdown.on("click",A),this.results=d=this.container.find(g),this.search=e=this.container.find("input.select2-input"),this.queryCount=0,this.resultsPage=0,this.context=null,this.initContainer(),this.container.on("click",A),v(this.results),this.dropdown.on("mousemove-filtered",g,this.bind(this.highlightUnderEvent)),this.dropdown.on("touchstart touchmove touchend",g,this.bind(function(a){this._touchEvent=!0,this.highlightUnderEvent(a)})),this.dropdown.on("touchmove",g,this.bind(this.touchMoved)),this.dropdown.on("touchstart touchend",g,this.bind(this.clearTouchMoved)),this.dropdown.on("click",this.bind(function(){this._touchEvent&&(this._touchEvent=!1,this.selectHighlighted())})),x(80,this.results),this.dropdown.on("scroll-debounced",g,this.bind(this.loadMoreIfNeeded)),a(this.container).on("change",".select2-input",function(a){a.stopPropagation()}),a(this.dropdown).on("change",".select2-input",function(a){a.stopPropagation()}),a.fn.mousewheel&&d.mousewheel(function(a,b,c,e){var f=d.scrollTop();e>0&&0>=f-e?(d.scrollTop(0),A(a)):0>e&&d.get(0).scrollHeight-d.scrollTop()+e<=d.height()&&(d.scrollTop(d.get(0).scrollHeight-d.height()),A(a))}),u(e),e.on("keyup-change input paste",this.bind(this.updateResults)),e.on("focus",function(){e.addClass("select2-focused")}),e.on("blur",function(){e.removeClass("select2-focused")}),this.dropdown.on("mouseup",g,this.bind(function(b){a(b.target).closest(".select2-result-selectable").length>0&&(this.highlightUnderEvent(b),this.selectHighlighted(b))})),this.dropdown.on("click mouseup mousedown touchstart touchend focusin",function(a){a.stopPropagation()}),this.nextSearchTerm=b,a.isFunction(this.opts.initSelection)&&(this.initSelection(),this.monitorSource()),null!==c.maximumInputLength&&this.search.attr("maxlength",c.maximumInputLength);var h=c.element.prop("disabled");h===b&&(h=!1),this.enable(!h);var i=c.element.prop("readonly");i===b&&(i=!1),this.readonly(i),j=j||q(),this.autofocus=c.element.prop("autofocus"),c.element.prop("autofocus",!1),this.autofocus&&this.focus(),this.search.attr("placeholder",c.searchInputPlaceholder)},destroy:function(){var a=this.opts.element,c=a.data("select2"),d=this;this.close(),a.length&&a[0].detachEvent&&d._sync&&a.each(function(){d._sync&&this.detachEvent("onpropertychange",d._sync)}),this.propertyObserver&&(this.propertyObserver.disconnect(),this.propertyObserver=null),this._sync=null,c!==b&&(c.container.remove(),c.liveRegion.remove(),c.dropdown.remove(),a.show().removeData("select2").off(".select2").prop("autofocus",this.autofocus||!1),this.elementTabIndex?a.attr({tabindex:this.elementTabIndex}):a.removeAttr("tabindex"),a.show()),N.call(this,"container","liveRegion","dropdown","results","search")},optionToData:function(a){return a.is("option")?{id:a.prop("value"),text:a.text(),element:a.get(),css:a.attr("class"),disabled:a.prop("disabled"),locked:r(a.attr("locked"),"locked")||r(a.data("locked"),!0)}:a.is("optgroup")?{text:a.attr("label"),children:[],element:a.get(),css:a.attr("class")}:void 0},prepareOpts:function(c){var d,e,g,h,i=this;if(d=c.element,"select"===d.get(0).tagName.toLowerCase()&&(this.select=e=c.element),e&&a.each(["id","multiple","ajax","query","createSearchChoice","initSelection","data","tags"],function(){if(this in c)throw new Error("Option '"+this+"' is not allowed for Select2 when attached to a <select> element.")}),c=a.extend({},{populateResults:function(d,e,g){var h,j=this.opts.id,k=this.liveRegion;h=function(d,e,l){var m,n,o,p,q,r,s,t,u,v;d=c.sortResults(d,e,g);var w=[];for(m=0,n=d.length;n>m;m+=1)o=d[m],q=o.disabled===!0,p=!q&&j(o)!==b,r=o.children&&o.children.length>0,s=a("<li></li>"),s.addClass("select2-results-dept-"+l),s.addClass("select2-result"),s.addClass(p?"select2-result-selectable":"select2-result-unselectable"),q&&s.addClass("select2-disabled"),r&&s.addClass("select2-result-with-children"),s.addClass(i.opts.formatResultCssClass(o)),s.attr("role","presentation"),t=a(document.createElement("div")),t.addClass("select2-result-label"),t.attr("id","select2-result-label-"+f()),t.attr("role","option"),v=c.formatResult(o,t,g,i.opts.escapeMarkup),v!==b&&(t.html(v),s.append(t)),r&&(u=a("<ul></ul>"),u.addClass("select2-result-sub"),h(o.children,u,l+1),s.append(u)),s.data("select2-data",o),w.push(s[0]);e.append(w),k.text(c.formatMatches(d.length))},h(e,d,0)}},a.fn.select2.defaults,c),"function"!=typeof c.id&&(g=c.id,c.id=function(a){return a[g]}),a.isArray(c.element.data("select2Tags"))){if("tags"in c)throw"tags specified as both an attribute 'data-select2-tags' and in options of Select2 "+c.element.attr("id");c.tags=c.element.data("select2Tags")}if(e?(c.query=this.bind(function(a){var f,g,h,c={results:[],more:!1},e=a.term;h=function(b,c){var d;b.is("option")?a.matcher(e,b.text(),b)&&c.push(i.optionToData(b)):b.is("optgroup")&&(d=i.optionToData(b),b.children().each2(function(a,b){h(b,d.children)}),d.children.length>0&&c.push(d))},f=d.children(),this.getPlaceholder()!==b&&f.length>0&&(g=this.getPlaceholderOption(),g&&(f=f.not(g))),f.each2(function(a,b){h(b,c.results)}),a.callback(c)}),c.id=function(a){return a.id}):"query"in c||("ajax"in c?(h=c.element.data("ajax-url"),h&&h.length>0&&(c.ajax.url=h),c.query=G.call(c.element,c.ajax)):"data"in c?c.query=H(c.data):"tags"in c&&(c.query=I(c.tags),c.createSearchChoice===b&&(c.createSearchChoice=function(b){return{id:a.trim(b),text:a.trim(b)}}),c.initSelection===b&&(c.initSelection=function(b,d){var e=[];a(s(b.val(),c.separator,c.transformVal)).each(function(){var b={id:this,text:this},d=c.tags;a.isFunction(d)&&(d=d()),a(d).each(function(){return r(this.id,b.id)?(b=this,!1):void 0}),e.push(b)}),d(e)}))),"function"!=typeof c.query)throw"query function not defined for Select2 "+c.element.attr("id");if("top"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.unshift(b)};else if("bottom"===c.createSearchChoicePosition)c.createSearchChoicePosition=function(a,b){a.push(b)};else if("function"!=typeof c.createSearchChoicePosition)throw"invalid createSearchChoicePosition option must be 'top', 'bottom' or a custom function";return c},monitorSource:function(){var d,c=this.opts.element,e=this;c.on("change.select2",this.bind(function(){this.opts.element.data("select2-change-triggered")!==!0&&this.initSelection()})),this._sync=this.bind(function(){var a=c.prop("disabled");a===b&&(a=!1),this.enable(!a);var d=c.prop("readonly");d===b&&(d=!1),this.readonly(d),this.container&&(D(this.container,this.opts.element,this.opts.adaptContainerCssClass),this.container.addClass(K(this.opts.containerCssClass,this.opts.element))),this.dropdown&&(D(this.dropdown,this.opts.element,this.opts.adaptDropdownCssClass),this.dropdown.addClass(K(this.opts.dropdownCssClass,this.opts.element)))}),c.length&&c[0].attachEvent&&c.each(function(){this.attachEvent("onpropertychange",e._sync)}),d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,d!==b&&(this.propertyObserver&&(delete this.propertyObserver,this.propertyObserver=null),this.propertyObserver=new d(function(b){a.each(b,e._sync)}),this.propertyObserver.observe(c.get(0),{attributes:!0,subtree:!1}))},triggerSelect:function(b){var c=a.Event("select2-selecting",{val:this.id(b),object:b,choice:b});return this.opts.element.trigger(c),!c.isDefaultPrevented()},triggerChange:function(b){b=b||{},b=a.extend({},b,{type:"change",val:this.val()}),this.opts.element.data("select2-change-triggered",!0),this.opts.element.trigger(b),this.opts.element.data("select2-change-triggered",!1),this.opts.element.click(),this.opts.blurOnChange&&this.opts.element.blur()},isInterfaceEnabled:function(){return this.enabledInterface===!0},enableInterface:function(){var a=this._enabled&&!this._readonly,b=!a;return a===this.enabledInterface?!1:(this.container.toggleClass("select2-container-disabled",b),this.close(),this.enabledInterface=a,!0)},enable:function(a){a===b&&(a=!0),this._enabled!==a&&(this._enabled=a,this.opts.element.prop("disabled",!a),this.enableInterface())},disable:function(){this.enable(!1)},readonly:function(a){a===b&&(a=!1),this._readonly!==a&&(this._readonly=a,this.opts.element.prop("readonly",a),this.enableInterface())},opened:function(){return this.container?this.container.hasClass("select2-dropdown-open"):!1},positionDropdown:function(){var v,w,x,y,z,b=this.dropdown,c=this.container,d=c.offset(),e=c.outerHeight(!1),f=c.outerWidth(!1),g=b.outerHeight(!1),h=a(window),i=h.width(),k=h.height(),l=h.scrollLeft()+i,m=h.scrollTop()+k,n=d.top+e,o=d.left,p=m>=n+g,q=d.top-g>=h.scrollTop(),r=b.outerWidth(!1),s=function(){return l>=o+r},t=function(){return d.left+l+c.outerWidth(!1)>r},u=b.hasClass("select2-drop-above");u?(w=!0,!q&&p&&(x=!0,w=!1)):(w=!1,!p&&q&&(x=!0,w=!0)),x&&(b.hide(),d=this.container.offset(),e=this.container.outerHeight(!1),f=this.container.outerWidth(!1),g=b.outerHeight(!1),l=h.scrollLeft()+i,m=h.scrollTop()+k,n=d.top+e,o=d.left,r=b.outerWidth(!1),b.show(),this.focusSearch()),this.opts.dropdownAutoWidth?(z=a(".select2-results",b)[0],b.addClass("select2-drop-auto-width"),b.css("width",""),r=b.outerWidth(!1)+(z.scrollHeight===z.clientHeight?0:j.width),r>f?f=r:r=f,g=b.outerHeight(!1)):this.container.removeClass("select2-drop-auto-width"),"static"!==this.body.css("position")&&(v=this.body.offset(),n-=v.top,o-=v.left),!s()&&t()&&(o=d.left+this.container.outerWidth(!1)-r),y={left:o,width:f},w?(y.top=d.top-g,y.bottom="auto",this.container.addClass("select2-drop-above"),b.addClass("select2-drop-above")):(y.top=n,y.bottom="auto",this.container.removeClass("select2-drop-above"),b.removeClass("select2-drop-above")),y=a.extend(y,K(this.opts.dropdownCss,this.opts.element)),b.css(y)},shouldOpen:function(){var b;return this.opened()?!1:this._enabled===!1||this._readonly===!0?!1:(b=a.Event("select2-opening"),this.opts.element.trigger(b),!b.isDefaultPrevented())},clearDropdownAlignmentPreference:function(){this.container.removeClass("select2-drop-above"),this.dropdown.removeClass("select2-drop-above")},open:function(){return this.shouldOpen()?(this.opening(),i.on("mousemove.select2Event",function(a){h.x=a.pageX,h.y=a.pageY}),!0):!1},opening:function(){var f,b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.addClass("select2-dropdown-open").addClass("select2-container-active"),this.clearDropdownAlignmentPreference(),this.dropdown[0]!==this.body.children().last()[0]&&this.dropdown.detach().appendTo(this.body),f=a("#select2-drop-mask"),0===f.length&&(f=a(document.createElement("div")),f.attr("id","select2-drop-mask").attr("class","select2-drop-mask"),f.hide(),f.appendTo(this.body),f.on("mousedown touchstart click",function(b){n(f);var d,c=a("#select2-drop");c.length>0&&(d=c.data("select2"),d.opts.selectOnBlur&&d.selectHighlighted({noFocus:!0}),d.close(),b.preventDefault(),b.stopPropagation())})),this.dropdown.prev()[0]!==f[0]&&this.dropdown.before(f),a("#select2-drop").removeAttr("id"),this.dropdown.attr("id","select2-drop"),f.show(),this.positionDropdown(),this.dropdown.show(),this.positionDropdown(),this.dropdown.addClass("select2-drop-active");var g=this;this.container.parents().add(window).each(function(){a(this).on(d+" "+c+" "+e,function(){g.opened()&&g.positionDropdown()})})},close:function(){if(this.opened()){var b=this.containerEventName,c="scroll."+b,d="resize."+b,e="orientationchange."+b;this.container.parents().add(window).each(function(){a(this).off(c).off(d).off(e)}),this.clearDropdownAlignmentPreference(),a("#select2-drop-mask").hide(),this.dropdown.removeAttr("id"),this.dropdown.hide(),this.container.removeClass("select2-dropdown-open").removeClass("select2-container-active"),this.results.empty(),i.off("mousemove.select2Event"),this.clearSearch(),this.search.removeClass("select2-active"),this.opts.element.trigger(a.Event("select2-close"))}},externalSearch:function(a){this.open(),this.search.val(a),this.updateResults(!1)},clearSearch:function(){},getMaximumSelectionSize:function(){return K(this.opts.maximumSelectionSize,this.opts.element)},ensureHighlightVisible:function(){var c,d,e,f,g,h,i,j,b=this.results;if(d=this.highlight(),!(0>d)){if(0==d)return b.scrollTop(0),void 0;c=this.findHighlightableChoices().find(".select2-result-label"),e=a(c[d]),j=(e.offset()||{}).top||0,f=j+e.outerHeight(!0),d===c.length-1&&(i=b.find("li.select2-more-results"),i.length>0&&(f=i.offset().top+i.outerHeight(!0))),g=b.offset().top+b.outerHeight(!1),f>g&&b.scrollTop(b.scrollTop()+(f-g)),h=j-b.offset().top,0>h&&"none"!=e.css("display")&&b.scrollTop(b.scrollTop()+h)}},findHighlightableChoices:function(){return this.results.find(".select2-result-selectable:not(.select2-disabled):not(.select2-selected)")},moveHighlight:function(b){for(var c=this.findHighlightableChoices(),d=this.highlight();d>-1&&d<c.length;){d+=b;
22
- var e=a(c[d]);if(e.hasClass("select2-result-selectable")&&!e.hasClass("select2-disabled")&&!e.hasClass("select2-selected")){this.highlight(d);break}}},highlight:function(b){var d,e,c=this.findHighlightableChoices();return 0===arguments.length?p(c.filter(".select2-highlighted")[0],c.get()):(b>=c.length&&(b=c.length-1),0>b&&(b=0),this.removeHighlight(),d=a(c[b]),d.addClass("select2-highlighted"),this.search.attr("aria-activedescendant",d.find(".select2-result-label").attr("id")),this.ensureHighlightVisible(),this.liveRegion.text(d.text()),e=d.data("select2-data"),e&&this.opts.element.trigger({type:"select2-highlight",val:this.id(e),choice:e}),void 0)},removeHighlight:function(){this.results.find(".select2-highlighted").removeClass("select2-highlighted")},touchMoved:function(){this._touchMoved=!0},clearTouchMoved:function(){this._touchMoved=!1},countSelectableResults:function(){return this.findHighlightableChoices().length},highlightUnderEvent:function(b){var c=a(b.target).closest(".select2-result-selectable");if(c.length>0&&!c.is(".select2-highlighted")){var d=this.findHighlightableChoices();this.highlight(d.index(c))}else 0==c.length&&this.removeHighlight()},loadMoreIfNeeded:function(){var c,a=this.results,b=a.find("li.select2-more-results"),d=this.resultsPage+1,e=this,f=this.search.val(),g=this.context;0!==b.length&&(c=b.offset().top-a.offset().top-a.height(),c<=this.opts.loadMorePadding&&(b.addClass("select2-active"),this.opts.query({element:this.opts.element,term:f,page:d,context:g,matcher:this.opts.matcher,callback:this.bind(function(c){e.opened()&&(e.opts.populateResults.call(this,a,c.results,{term:f,page:d,context:g}),e.postprocessResults(c,!1,!1),c.more===!0?(b.detach().appendTo(a).html(e.opts.escapeMarkup(K(e.opts.formatLoadMore,e.opts.element,d+1))),window.setTimeout(function(){e.loadMoreIfNeeded()},10)):b.remove(),e.positionDropdown(),e.resultsPage=d,e.context=c.context,this.opts.element.trigger({type:"select2-loaded",items:c}))})})))},tokenize:function(){},updateResults:function(c){function m(){d.removeClass("select2-active"),h.positionDropdown(),e.find(".select2-no-results,.select2-selection-limit,.select2-searching").length?h.liveRegion.text(e.text()):h.liveRegion.text(h.opts.formatMatches(e.find('.select2-result-selectable:not(".select2-selected")').length))}function n(a){e.html(a),m()}var g,i,l,d=this.search,e=this.results,f=this.opts,h=this,j=d.val(),k=a.data(this.container,"select2-last-term");if((c===!0||!k||!r(j,k))&&(a.data(this.container,"select2-last-term",j),c===!0||this.showSearchInput!==!1&&this.opened())){l=++this.queryCount;var o=this.getMaximumSelectionSize();if(o>=1&&(g=this.data(),a.isArray(g)&&g.length>=o&&J(f.formatSelectionTooBig,"formatSelectionTooBig")))return n("<li class='select2-selection-limit'>"+K(f.formatSelectionTooBig,f.element,o)+"</li>"),void 0;if(d.val().length<f.minimumInputLength)return J(f.formatInputTooShort,"formatInputTooShort")?n("<li class='select2-no-results'>"+K(f.formatInputTooShort,f.element,d.val(),f.minimumInputLength)+"</li>"):n(""),c&&this.showSearch&&this.showSearch(!0),void 0;if(f.maximumInputLength&&d.val().length>f.maximumInputLength)return J(f.formatInputTooLong,"formatInputTooLong")?n("<li class='select2-no-results'>"+K(f.formatInputTooLong,f.element,d.val(),f.maximumInputLength)+"</li>"):n(""),void 0;f.formatSearching&&0===this.findHighlightableChoices().length&&n("<li class='select2-searching'>"+K(f.formatSearching,f.element)+"</li>"),d.addClass("select2-active"),this.removeHighlight(),i=this.tokenize(),i!=b&&null!=i&&d.val(i),this.resultsPage=1,f.query({element:f.element,term:d.val(),page:this.resultsPage,context:null,matcher:f.matcher,callback:this.bind(function(g){var i;if(l==this.queryCount){if(!this.opened())return this.search.removeClass("select2-active"),void 0;if(g.hasError!==b&&J(f.formatAjaxError,"formatAjaxError"))return n("<li class='select2-ajax-error'>"+K(f.formatAjaxError,f.element,g.jqXHR,g.textStatus,g.errorThrown)+"</li>"),void 0;if(this.context=g.context===b?null:g.context,this.opts.createSearchChoice&&""!==d.val()&&(i=this.opts.createSearchChoice.call(h,d.val(),g.results),i!==b&&null!==i&&h.id(i)!==b&&null!==h.id(i)&&0===a(g.results).filter(function(){return r(h.id(this),h.id(i))}).length&&this.opts.createSearchChoicePosition(g.results,i)),0===g.results.length&&J(f.formatNoMatches,"formatNoMatches"))return n("<li class='select2-no-results'>"+K(f.formatNoMatches,f.element,d.val())+"</li>"),void 0;e.empty(),h.opts.populateResults.call(this,e,g.results,{term:d.val(),page:this.resultsPage,context:null}),g.more===!0&&J(f.formatLoadMore,"formatLoadMore")&&(e.append("<li class='select2-more-results'>"+f.escapeMarkup(K(f.formatLoadMore,f.element,this.resultsPage))+"</li>"),window.setTimeout(function(){h.loadMoreIfNeeded()},10)),this.postprocessResults(g,c),m(),this.opts.element.trigger({type:"select2-loaded",items:g})}})})}},cancel:function(){this.close()},blur:function(){this.opts.selectOnBlur&&this.selectHighlighted({noFocus:!0}),this.close(),this.container.removeClass("select2-container-active"),this.search[0]===document.activeElement&&this.search.blur(),this.clearSearch(),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus")},focusSearch:function(){y(this.search)},selectHighlighted:function(a){if(this._touchMoved)return this.clearTouchMoved(),void 0;var b=this.highlight(),c=this.results.find(".select2-highlighted"),d=c.closest(".select2-result").data("select2-data");d?(this.highlight(b),this.onSelect(d,a)):a&&a.noFocus&&this.close()},getPlaceholder:function(){var a;return this.opts.element.attr("placeholder")||this.opts.element.attr("data-placeholder")||this.opts.element.data("placeholder")||this.opts.placeholder||((a=this.getPlaceholderOption())!==b?a.text():b)},getPlaceholderOption:function(){if(this.select){var c=this.select.children("option").first();if(this.opts.placeholderOption!==b)return"first"===this.opts.placeholderOption&&c||"function"==typeof this.opts.placeholderOption&&this.opts.placeholderOption(this.select);if(""===a.trim(c.text())&&""===c.val())return c}},initContainerWidth:function(){function c(){var c,d,e,f,g,h;if("off"===this.opts.width)return null;if("element"===this.opts.width)return 0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px";if("copy"===this.opts.width||"resolve"===this.opts.width){if(c=this.opts.element.attr("style"),c!==b)for(d=c.split(";"),f=0,g=d.length;g>f;f+=1)if(h=d[f].replace(/\s/g,""),e=h.match(/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i),null!==e&&e.length>=1)return e[1];return"resolve"===this.opts.width?(c=this.opts.element.css("width"),c.indexOf("%")>0?c:0===this.opts.element.outerWidth(!1)?"auto":this.opts.element.outerWidth(!1)+"px"):null}return a.isFunction(this.opts.width)?this.opts.width():this.opts.width}var d=c.call(this);null!==d&&this.container.css("width",d)}}),d=O(c,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container"}).html(["<a href='javascript:void(0)' class='select2-choice' tabindex='-1'>"," <span class='select2-chosen'>&#160;</span><abbr class='select2-search-choice-close'></abbr>"," <span class='select2-arrow' role='presentation'><b role='presentation'></b></span>","</a>","<label for='' class='select2-offscreen'></label>","<input class='select2-focusser select2-offscreen' type='text' aria-haspopup='true' role='button' />","<div class='select2-drop select2-display-none'>"," <div class='select2-search'>"," <label for='' class='select2-offscreen'></label>"," <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input' role='combobox' aria-expanded='true'"," aria-autocomplete='list' />"," </div>"," <ul class='select2-results' role='listbox'>"," </ul>","</div>"].join(""));return b},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.focusser.prop("disabled",!this.isInterfaceEnabled())},opening:function(){var c,d,e;this.opts.minimumResultsForSearch>=0&&this.showSearch(!0),this.parent.opening.apply(this,arguments),this.showSearchInput!==!1&&this.search.val(this.focusser.val()),this.opts.shouldFocusInput(this)&&(this.search.focus(),c=this.search.get(0),c.createTextRange?(d=c.createTextRange(),d.collapse(!1),d.select()):c.setSelectionRange&&(e=this.search.val().length,c.setSelectionRange(e,e))),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.focusser.prop("disabled",!0).val(""),this.updateResults(!0),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&(this.parent.close.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},focus:function(){this.opened()?this.close():(this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus())},isFocused:function(){return this.container.hasClass("select2-container-active")},cancel:function(){this.parent.cancel.apply(this,arguments),this.focusser.prop("disabled",!1),this.opts.shouldFocusInput(this)&&this.focusser.focus()},destroy:function(){a("label[for='"+this.focusser.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"selection","focusser")},initContainer:function(){var b,g,c=this.container,d=this.dropdown,e=f();this.opts.minimumResultsForSearch<0?this.showSearch(!1):this.showSearch(!0),this.selection=b=c.find(".select2-choice"),this.focusser=c.find(".select2-focusser"),b.find(".select2-chosen").attr("id","select2-chosen-"+e),this.focusser.attr("aria-labelledby","select2-chosen-"+e),this.results.attr("id","select2-results-"+e),this.search.attr("aria-owns","select2-results-"+e),this.focusser.attr("id","s2id_autogen"+e),g=a("label[for='"+this.opts.element.attr("id")+"']"),this.opts.element.focus(this.bind(function(){this.focus()})),this.focusser.prev().text(g.text()).attr("for",this.focusser.attr("id"));var h=this.opts.element.attr("title");this.opts.element.attr("title",h||g.text()),this.focusser.attr("tabindex",this.elementTabIndex),this.search.attr("id",this.focusser.attr("id")+"_search"),this.search.prev().text(a("label[for='"+this.focusser.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&229!=a.keyCode){if(a.which===k.PAGE_UP||a.which===k.PAGE_DOWN)return A(a),void 0;switch(a.which){case k.UP:case k.DOWN:return this.moveHighlight(a.which===k.UP?-1:1),A(a),void 0;case k.ENTER:return this.selectHighlighted(),A(a),void 0;case k.TAB:return this.selectHighlighted({noFocus:!0}),void 0;case k.ESC:return this.cancel(a),A(a),void 0}}})),this.search.on("blur",this.bind(function(){document.activeElement===this.body.get(0)&&window.setTimeout(this.bind(function(){this.opened()&&this.search.focus()}),0)})),this.focusser.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()&&a.which!==k.TAB&&!k.isControl(a)&&!k.isFunctionKey(a)&&a.which!==k.ESC){if(this.opts.openOnEnter===!1&&a.which===k.ENTER)return A(a),void 0;if(a.which==k.DOWN||a.which==k.UP||a.which==k.ENTER&&this.opts.openOnEnter){if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return;return this.open(),A(a),void 0}return a.which==k.DELETE||a.which==k.BACKSPACE?(this.opts.allowClear&&this.clear(),A(a),void 0):void 0}})),u(this.focusser),this.focusser.on("keyup-change input",this.bind(function(a){if(this.opts.minimumResultsForSearch>=0){if(a.stopPropagation(),this.opened())return;this.open()}})),b.on("mousedown touchstart","abbr",this.bind(function(a){this.isInterfaceEnabled()&&(this.clear(),B(a),this.close(),this.selection&&this.selection.focus())})),b.on("mousedown touchstart",this.bind(function(c){n(b),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.opened()?this.close():this.isInterfaceEnabled()&&this.open(),A(c)})),d.on("mousedown touchstart",this.bind(function(){this.opts.shouldFocusInput(this)&&this.search.focus()})),b.on("focus",this.bind(function(a){A(a)})),this.focusser.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})).on("blur",this.bind(function(){this.opened()||(this.container.removeClass("select2-container-active"),this.opts.element.trigger(a.Event("select2-blur")))})),this.search.on("focus",this.bind(function(){this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active")})),this.initContainerWidth(),this.opts.element.hide(),this.setPlaceholder()},clear:function(b){var c=this.selection.data("select2-data");if(c){var d=a.Event("select2-clearing");if(this.opts.element.trigger(d),d.isDefaultPrevented())return;var e=this.getPlaceholderOption();this.opts.element.val(e?e.val():""),this.selection.find(".select2-chosen").empty(),this.selection.removeData("select2-data"),this.setPlaceholder(),b!==!1&&(this.opts.element.trigger({type:"select2-removed",val:this.id(c),choice:c}),this.triggerChange({removed:c}))}},initSelection:function(){if(this.isPlaceholderOptionSelected())this.updateSelection(null),this.close(),this.setPlaceholder();else{var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.setPlaceholder(),c.nextSearchTerm=c.opts.nextSearchTerm(a,c.search.val()))})}},isPlaceholderOptionSelected:function(){var a;return this.getPlaceholder()===b?!1:(a=this.getPlaceholderOption())!==b&&a.prop("selected")||""===this.opts.element.val()||this.opts.element.val()===b||null===this.opts.element.val()},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=a.find("option").filter(function(){return this.selected&&!this.disabled});b(c.optionToData(d))}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=c.val(),f=null;b.query({matcher:function(a,c,d){var g=r(e,b.id(d));return g&&(f=d),g},callback:a.isFunction(d)?function(){d(f)}:a.noop})}),b},getPlaceholder:function(){return this.select&&this.getPlaceholderOption()===b?b:this.parent.getPlaceholder.apply(this,arguments)},setPlaceholder:function(){var a=this.getPlaceholder();if(this.isPlaceholderOptionSelected()&&a!==b){if(this.select&&this.getPlaceholderOption()===b)return;this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(a)),this.selection.addClass("select2-default"),this.container.removeClass("select2-allowclear")}},postprocessResults:function(a,b,c){var d=0,e=this;if(this.findHighlightableChoices().each2(function(a,b){return r(e.id(b.data("select2-data")),e.opts.element.val())?(d=a,!1):void 0}),c!==!1&&(b===!0&&d>=0?this.highlight(d):this.highlight(0)),b===!0){var g=this.opts.minimumResultsForSearch;g>=0&&this.showSearch(L(a.results)>=g)}},showSearch:function(b){this.showSearchInput!==b&&(this.showSearchInput=b,this.dropdown.find(".select2-search").toggleClass("select2-search-hidden",!b),this.dropdown.find(".select2-search").toggleClass("select2-offscreen",!b),a(this.dropdown,this.container).toggleClass("select2-with-searchbox",b))},onSelect:function(a,b){if(this.triggerSelect(a)){var c=this.opts.element.val(),d=this.data();this.opts.element.val(this.id(a)),this.updateSelection(a),this.opts.element.trigger({type:"select2-selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.close(),b&&b.noFocus||!this.opts.shouldFocusInput(this)||this.focusser.focus(),r(c,this.id(a))||this.triggerChange({added:a,removed:d})}},updateSelection:function(a){var d,e,c=this.selection.find(".select2-chosen");this.selection.data("select2-data",a),c.empty(),null!==a&&(d=this.opts.formatSelection(a,c,this.opts.escapeMarkup)),d!==b&&c.append(d),e=this.opts.formatSelectionCssClass(a,c),e!==b&&c.addClass(e),this.selection.removeClass("select2-default"),this.opts.allowClear&&this.getPlaceholder()!==b&&this.container.addClass("select2-allowclear")},val:function(){var a,c=!1,d=null,e=this,f=this.data();if(0===arguments.length)return this.opts.element.val();if(a=arguments[0],arguments.length>1&&(c=arguments[1]),this.select)this.select.val(a).find("option").filter(function(){return this.selected}).each2(function(a,b){return d=e.optionToData(b),!1}),this.updateSelection(d),this.setPlaceholder(),c&&this.triggerChange({added:d,removed:f});else{if(!a&&0!==a)return this.clear(c),void 0;if(this.opts.initSelection===b)throw new Error("cannot call val() if initSelection() is not defined");this.opts.element.val(a),this.opts.initSelection(this.opts.element,function(a){e.opts.element.val(a?e.id(a):""),e.updateSelection(a),e.setPlaceholder(),c&&e.triggerChange({added:a,removed:f})})}},clearSearch:function(){this.search.val(""),this.focusser.val("")},data:function(a){var c,d=!1;return 0===arguments.length?(c=this.selection.data("select2-data"),c==b&&(c=null),c):(arguments.length>1&&(d=arguments[1]),a?(c=this.data(),this.opts.element.val(a?this.id(a):""),this.updateSelection(a),d&&this.triggerChange({added:a,removed:c})):this.clear(d),void 0)}}),e=O(c,{createContainer:function(){var b=a(document.createElement("div")).attr({"class":"select2-container select2-container-multi"}).html(["<ul class='select2-choices'>"," <li class='select2-search-field'>"," <label for='' class='select2-offscreen'></label>"," <input type='text' autocomplete='off' autocorrect='off' autocapitalize='off' spellcheck='false' class='select2-input'>"," </li>","</ul>","<div class='select2-drop select2-drop-multi select2-display-none'>"," <ul class='select2-results'>"," </ul>","</div>"].join(""));return b},prepareOpts:function(){var b=this.parent.prepareOpts.apply(this,arguments),c=this;return"select"===b.element.get(0).tagName.toLowerCase()?b.initSelection=function(a,b){var d=[];a.find("option").filter(function(){return this.selected&&!this.disabled}).each2(function(a,b){d.push(c.optionToData(b))}),b(d)}:"data"in b&&(b.initSelection=b.initSelection||function(c,d){var e=s(c.val(),b.separator,b.transformVal),f=[];b.query({matcher:function(c,d,g){var h=a.grep(e,function(a){return r(a,b.id(g))}).length;return h&&f.push(g),h},callback:a.isFunction(d)?function(){for(var a=[],c=0;c<e.length;c++)for(var g=e[c],h=0;h<f.length;h++){var i=f[h];if(r(g,b.id(i))){a.push(i),f.splice(h,1);break}}d(a)}:a.noop})}),b},selectChoice:function(a){var b=this.container.find(".select2-search-choice-focus");b.length&&a&&a[0]==b[0]||(b.length&&this.opts.element.trigger("choice-deselected",b),b.removeClass("select2-search-choice-focus"),a&&a.length&&(this.close(),a.addClass("select2-search-choice-focus"),this.opts.element.trigger("choice-selected",a)))},destroy:function(){a("label[for='"+this.search.attr("id")+"']").attr("for",this.opts.element.attr("id")),this.parent.destroy.apply(this,arguments),N.call(this,"searchContainer","selection")},initContainer:function(){var c,b=".select2-choices";this.searchContainer=this.container.find(".select2-search-field"),this.selection=c=this.container.find(b);var d=this;this.selection.on("click",".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)",function(){d.search[0].focus(),d.selectChoice(a(this))}),this.search.attr("id","s2id_autogen"+f()),this.search.prev().text(a("label[for='"+this.opts.element.attr("id")+"']").text()).attr("for",this.search.attr("id")),this.opts.element.focus(this.bind(function(){this.focus()})),this.search.on("input paste",this.bind(function(){this.search.attr("placeholder")&&0==this.search.val().length||this.isInterfaceEnabled()&&(this.opened()||this.open())})),this.search.attr("tabindex",this.elementTabIndex),this.keydowns=0,this.search.on("keydown",this.bind(function(a){if(this.isInterfaceEnabled()){++this.keydowns;var b=c.find(".select2-search-choice-focus"),d=b.prev(".select2-search-choice:not(.select2-locked)"),e=b.next(".select2-search-choice:not(.select2-locked)"),f=z(this.search);if(b.length&&(a.which==k.LEFT||a.which==k.RIGHT||a.which==k.BACKSPACE||a.which==k.DELETE||a.which==k.ENTER)){var g=b;return a.which==k.LEFT&&d.length?g=d:a.which==k.RIGHT?g=e.length?e:null:a.which===k.BACKSPACE?this.unselect(b.first())&&(this.search.width(10),g=d.length?d:e):a.which==k.DELETE?this.unselect(b.first())&&(this.search.width(10),g=e.length?e:null):a.which==k.ENTER&&(g=null),this.selectChoice(g),A(a),g&&g.length||this.open(),void 0}if((a.which===k.BACKSPACE&&1==this.keydowns||a.which==k.LEFT)&&0==f.offset&&!f.length)return this.selectChoice(c.find(".select2-search-choice:not(.select2-locked)").last()),A(a),void 0;if(this.selectChoice(null),this.opened())switch(a.which){case k.UP:case k.DOWN:return this.moveHighlight(a.which===k.UP?-1:1),A(a),void 0;case k.ENTER:return this.selectHighlighted(),A(a),void 0;case k.TAB:return this.selectHighlighted({noFocus:!0}),this.close(),void 0;case k.ESC:return this.cancel(a),A(a),void 0}if(a.which!==k.TAB&&!k.isControl(a)&&!k.isFunctionKey(a)&&a.which!==k.BACKSPACE&&a.which!==k.ESC){if(a.which===k.ENTER){if(this.opts.openOnEnter===!1)return;if(a.altKey||a.ctrlKey||a.shiftKey||a.metaKey)return}this.open(),(a.which===k.PAGE_UP||a.which===k.PAGE_DOWN)&&A(a),a.which===k.ENTER&&A(a)}}})),this.search.on("keyup",this.bind(function(){this.keydowns=0,this.resizeSearch()})),this.search.on("blur",this.bind(function(b){this.container.removeClass("select2-container-active"),this.search.removeClass("select2-focused"),this.selectChoice(null),this.opened()||this.clearSearch(),b.stopImmediatePropagation(),this.opts.element.trigger(a.Event("select2-blur"))})),this.container.on("click",b,this.bind(function(b){this.isInterfaceEnabled()&&(a(b.target).closest(".select2-search-choice").length>0||(this.selectChoice(null),this.clearPlaceholder(),this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.open(),this.focusSearch(),b.preventDefault()))})),this.container.on("focus",b,this.bind(function(){this.isInterfaceEnabled()&&(this.container.hasClass("select2-container-active")||this.opts.element.trigger(a.Event("select2-focus")),this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"),this.clearPlaceholder())})),this.initContainerWidth(),this.opts.element.hide(),this.clearSearch()},enableInterface:function(){this.parent.enableInterface.apply(this,arguments)&&this.search.prop("disabled",!this.isInterfaceEnabled())},initSelection:function(){if(""===this.opts.element.val()&&""===this.opts.element.text()&&(this.updateSelection([]),this.close(),this.clearSearch()),this.select||""!==this.opts.element.val()){var c=this;this.opts.initSelection.call(null,this.opts.element,function(a){a!==b&&null!==a&&(c.updateSelection(a),c.close(),c.clearSearch())})}},clearSearch:function(){var a=this.getPlaceholder(),c=this.getMaxSearchWidth();a!==b&&0===this.getVal().length&&this.search.hasClass("select2-focused")===!1?(this.search.val(a).addClass("select2-default"),this.search.width(c>0?c:this.container.css("width"))):this.search.val("").width(10)},clearPlaceholder:function(){this.search.hasClass("select2-default")&&this.search.val("").removeClass("select2-default")},opening:function(){this.clearPlaceholder(),this.resizeSearch(),this.parent.opening.apply(this,arguments),this.focusSearch(),""===this.search.val()&&this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.search.select()),this.updateResults(!0),this.opts.shouldFocusInput(this)&&this.search.focus(),this.opts.element.trigger(a.Event("select2-open"))},close:function(){this.opened()&&this.parent.close.apply(this,arguments)},focus:function(){this.close(),this.search.focus()},isFocused:function(){return this.search.hasClass("select2-focused")},updateSelection:function(b){var c=[],d=[],e=this;a(b).each(function(){p(e.id(this),c)<0&&(c.push(e.id(this)),d.push(this))}),b=d,this.selection.find(".select2-search-choice").remove(),a(b).each(function(){e.addSelectedChoice(this)}),e.postprocessResults()},tokenize:function(){var a=this.search.val();a=this.opts.tokenizer.call(this,a,this.data(),this.bind(this.onSelect),this.opts),null!=a&&a!=b&&(this.search.val(a),a.length>0&&this.open())},onSelect:function(a,c){this.triggerSelect(a)&&""!==a.text&&(this.addSelectedChoice(a),this.opts.element.trigger({type:"selected",val:this.id(a),choice:a}),this.nextSearchTerm=this.opts.nextSearchTerm(a,this.search.val()),this.clearSearch(),this.updateResults(),(this.select||!this.opts.closeOnSelect)&&this.postprocessResults(a,!1,this.opts.closeOnSelect===!0),this.opts.closeOnSelect?(this.close(),this.search.width(10)):this.countSelectableResults()>0?(this.search.width(10),this.resizeSearch(),this.getMaximumSelectionSize()>0&&this.val().length>=this.getMaximumSelectionSize()?this.updateResults(!0):this.nextSearchTerm!=b&&(this.search.val(this.nextSearchTerm),this.updateResults(),this.search.select()),this.positionDropdown()):(this.close(),this.search.width(10)),this.triggerChange({added:a}),c&&c.noFocus||this.focusSearch())},cancel:function(){this.close(),this.focusSearch()},addSelectedChoice:function(c){var j,k,d=!c.locked,e=a("<li class='select2-search-choice'> <div></div> <a href='#' class='select2-search-choice-close' tabindex='-1'></a></li>"),f=a("<li class='select2-search-choice select2-locked'><div></div></li>"),g=d?e:f,h=this.id(c),i=this.getVal();j=this.opts.formatSelection(c,g.find("div"),this.opts.escapeMarkup),j!=b&&g.find("div").replaceWith(a("<div></div>").html(j)),k=this.opts.formatSelectionCssClass(c,g.find("div")),k!=b&&g.addClass(k),d&&g.find(".select2-search-choice-close").on("mousedown",A).on("click dblclick",this.bind(function(b){this.isInterfaceEnabled()&&(this.unselect(a(b.target)),this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"),A(b),this.close(),this.focusSearch())})).on("focus",this.bind(function(){this.isInterfaceEnabled()&&(this.container.addClass("select2-container-active"),this.dropdown.addClass("select2-drop-active"))})),g.data("select2-data",c),g.insertBefore(this.searchContainer),i.push(h),this.setVal(i)},unselect:function(b){var d,e,c=this.getVal();if(b=b.closest(".select2-search-choice"),0===b.length)throw"Invalid argument: "+b+". Must be .select2-search-choice";if(d=b.data("select2-data")){var f=a.Event("select2-removing");if(f.val=this.id(d),f.choice=d,this.opts.element.trigger(f),f.isDefaultPrevented())return!1;for(;(e=p(this.id(d),c))>=0;)c.splice(e,1),this.setVal(c),this.select&&this.postprocessResults();return b.remove(),this.opts.element.trigger({type:"select2-removed",val:this.id(d),choice:d}),this.triggerChange({removed:d}),!0}},postprocessResults:function(a,b,c){var d=this.getVal(),e=this.results.find(".select2-result"),f=this.results.find(".select2-result-with-children"),g=this;e.each2(function(a,b){var c=g.id(b.data("select2-data"));p(c,d)>=0&&(b.addClass("select2-selected"),b.find(".select2-result-selectable").addClass("select2-selected"))}),f.each2(function(a,b){b.is(".select2-result-selectable")||0!==b.find(".select2-result-selectable:not(.select2-selected)").length||b.addClass("select2-selected")}),-1==this.highlight()&&c!==!1&&this.opts.closeOnSelect===!0&&g.highlight(0),!this.opts.createSearchChoice&&!e.filter(".select2-result:not(.select2-selected)").length>0&&(!a||a&&!a.more&&0===this.results.find(".select2-no-results").length)&&J(g.opts.formatNoMatches,"formatNoMatches")&&this.results.append("<li class='select2-no-results'>"+K(g.opts.formatNoMatches,g.opts.element,g.search.val())+"</li>")},getMaxSearchWidth:function(){return this.selection.width()-t(this.search)},resizeSearch:function(){var a,b,c,d,e,f=t(this.search);a=C(this.search)+10,b=this.search.offset().left,c=this.selection.width(),d=this.selection.offset().left,e=c-(b-d)-f,a>e&&(e=c-f),40>e&&(e=c-f),0>=e&&(e=a),this.search.width(Math.floor(e))},getVal:function(){var a;return this.select?(a=this.select.val(),null===a?[]:a):(a=this.opts.element.val(),s(a,this.opts.separator,this.opts.transformVal))},setVal:function(b){var c;this.select?this.select.val(b):(c=[],a(b).each(function(){p(this,c)<0&&c.push(this)}),this.opts.element.val(0===c.length?"":c.join(this.opts.separator)))},buildChangeDetails:function(a,b){for(var b=b.slice(0),a=a.slice(0),c=0;c<b.length;c++)for(var d=0;d<a.length;d++)r(this.opts.id(b[c]),this.opts.id(a[d]))&&(b.splice(c,1),c>0&&c--,a.splice(d,1),d--);return{added:b,removed:a}},val:function(c,d){var e,f=this;if(0===arguments.length)return this.getVal();if(e=this.data(),e.length||(e=[]),!c&&0!==c)return this.opts.element.val(""),this.updateSelection([]),this.clearSearch(),d&&this.triggerChange({added:this.data(),removed:e}),void 0;if(this.setVal(c),this.select)this.opts.initSelection(this.select,this.bind(this.updateSelection)),d&&this.triggerChange(this.buildChangeDetails(e,this.data()));else{if(this.opts.initSelection===b)throw new Error("val() cannot be called if initSelection() is not defined");this.opts.initSelection(this.opts.element,function(b){var c=a.map(b,f.id);f.setVal(c),f.updateSelection(b),f.clearSearch(),d&&f.triggerChange(f.buildChangeDetails(e,f.data()))})}this.clearSearch()},onSortStart:function(){if(this.select)throw new Error("Sorting of elements is not supported when attached to <select>. Attach to <input type='hidden'/> instead.");this.search.width(0),this.searchContainer.hide()},onSortEnd:function(){var b=[],c=this;this.searchContainer.show(),this.searchContainer.appendTo(this.searchContainer.parent()),this.resizeSearch(),this.selection.find(".select2-search-choice").each(function(){b.push(c.opts.id(a(this).data("select2-data")))}),this.setVal(b),this.triggerChange()},data:function(b,c){var e,f,d=this;return 0===arguments.length?this.selection.children(".select2-search-choice").map(function(){return a(this).data("select2-data")}).get():(f=this.data(),b||(b=[]),e=a.map(b,function(a){return d.opts.id(a)}),this.setVal(e),this.updateSelection(b),this.clearSearch(),c&&this.triggerChange(this.buildChangeDetails(f,this.data())),void 0)}}),a.fn.select2=function(){var d,e,f,g,h,c=Array.prototype.slice.call(arguments,0),i=["val","destroy","opened","open","close","focus","isFocused","container","dropdown","onSortStart","onSortEnd","enable","disable","readonly","positionDropdown","data","search"],j=["opened","isFocused","container","dropdown"],k=["val","data"],l={search:"externalSearch"};return this.each(function(){if(0===c.length||"object"==typeof c[0])d=0===c.length?{}:a.extend({},c[0]),d.element=a(this),"select"===d.element.get(0).tagName.toLowerCase()?h=d.element.prop("multiple"):(h=d.multiple||!1,"tags"in d&&(d.multiple=h=!0)),e=h?new window.Select2["class"].multi:new window.Select2["class"].single,e.init(d);else{if("string"!=typeof c[0])throw"Invalid arguments to select2 plugin: "+c;if(p(c[0],i)<0)throw"Unknown method: "+c[0];if(g=b,e=a(this).data("select2"),e===b)return;if(f=c[0],"container"===f?g=e.container:"dropdown"===f?g=e.dropdown:(l[f]&&(f=l[f]),g=e[f].apply(e,c.slice(1))),p(c[0],j)>=0||p(c[0],k)>=0&&1==c.length)return!1}}),g===b?this:g},a.fn.select2.defaults={width:"copy",loadMorePadding:0,closeOnSelect:!0,openOnEnter:!0,containerCss:{},dropdownCss:{},containerCssClass:"",dropdownCssClass:"",formatResult:function(a,b,c,d){var e=[];return E(this.text(a),c.term,e,d),e.join("")},transformVal:function(b){return a.trim(b)},formatSelection:function(a,c,d){return a?d(this.text(a)):b},sortResults:function(a){return a},formatResultCssClass:function(a){return a.css},formatSelectionCssClass:function(){return b},minimumResultsForSearch:0,minimumInputLength:0,maximumInputLength:null,maximumSelectionSize:0,id:function(a){return a==b?null:a.id},text:function(b){return b&&this.data&&this.data.text?a.isFunction(this.data.text)?this.data.text(b):b[this.data.text]:b.text
23
- },matcher:function(a,b){return o(""+b).toUpperCase().indexOf(o(""+a).toUpperCase())>=0},separator:",",tokenSeparators:[],tokenizer:M,escapeMarkup:F,blurOnChange:!1,selectOnBlur:!1,adaptContainerCssClass:function(a){return a},adaptDropdownCssClass:function(){return null},nextSearchTerm:function(){return b},searchInputPlaceholder:"",createSearchChoicePosition:"top",shouldFocusInput:function(a){var b="ontouchstart"in window||navigator.msMaxTouchPoints>0;return b?a.opts.minimumResultsForSearch<0?!1:!0:!0}},a.fn.select2.locales=[],a.fn.select2.locales.en={formatMatches:function(a){return 1===a?"One result is available, press enter to select it.":a+" results are available, use up and down arrow keys to navigate."},formatNoMatches:function(){return"No matches found"},formatAjaxError:function(){return"Loading failed"},formatInputTooShort:function(a,b){var c=b-a.length;return"Please enter "+c+" or more character"+(1==c?"":"s")},formatInputTooLong:function(a,b){var c=a.length-b;return"Please delete "+c+" character"+(1==c?"":"s")},formatSelectionTooBig:function(a){return"You can only select "+a+" item"+(1==a?"":"s")},formatLoadMore:function(){return"Loading more results\u2026"},formatSearching:function(){return"Searching\u2026"}},a.extend(a.fn.select2.defaults,a.fn.select2.locales.en),a.fn.select2.ajaxDefaults={transport:a.ajax,params:{type:"GET",cache:!1,dataType:"json"}},window.Select2={query:{ajax:G,local:H,tags:I},util:{debounce:w,markMatch:E,escapeMarkup:F,stripDiacritics:o},"class":{"abstract":c,single:d,multi:e}}}}(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/select2/select2.png DELETED
Binary file
trunk/classes/admin/settings/assets/js/select2/select2x2.png DELETED
Binary file
trunk/classes/admin/settings/assets/js/sf-jquery.js DELETED
@@ -1,23 +0,0 @@
1
- jQuery(document).ready(function () {
2
-
3
- jQuery(".sf-tips").tooltip({ animation: true, html: true, delay: { show: 300, hide: 100 } });
4
-
5
-
6
- //This if statement checks if the color picker widget exists within jQuery UI
7
- //If it does exist then we initialize the WordPress color picker on our text input field
8
- if (typeof jQuery.wp === 'object' && typeof jQuery.wp.wpColorPicker === 'function') {
9
- jQuery('.colorpick').wpColorPicker();
10
- } else {
11
- // Color picker
12
- jQuery('.colorpick').each(function () {
13
- jQuery('.colorpickdiv', jQuery(this).parent()).farbtastic(this);
14
- jQuery(this).click(function () {
15
- if (jQuery(this).val() == "") jQuery(this).val('#');
16
- jQuery('.colorpickdiv', jQuery(this).parent()).show();
17
- });
18
- });
19
- jQuery(document).mousedown(function () {
20
- jQuery('.colorpickdiv').hide();
21
- });
22
- }
23
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/assets/js/wcvendors-media.js DELETED
@@ -1,52 +0,0 @@
1
- jQuery( function( $ ){
2
-
3
- var id;
4
-
5
- // Iterate over all instances of the uploader on the page
6
- $('.wcv-img-id').each( function () {
7
-
8
- id = $( this ).data( 'id' );
9
-
10
- // Handle Add banner
11
- $( '#wcv-add-' + id ).on( 'click', function(e) {
12
- e.preventDefault();
13
- file_uploader( id );
14
- return false;
15
- });
16
-
17
- });
18
-
19
- function file_uploader( id )
20
- {
21
-
22
- var media_uploader, json;
23
-
24
- if (undefined !== media_uploader ) {
25
- media_uploader.open();
26
- return;
27
- }
28
-
29
- media_uploader = wp.media({
30
- title: $( '#wcv-add-' + id ).data('window_title'),
31
- button: {
32
- text: $( '#wcv-add-' + id ).data('save_button'),
33
- },
34
- multiple: false // Set to true to allow multiple files to be selected
35
- });
36
-
37
- media_uploader.on( 'select' , function(){
38
-
39
- json = media_uploader.state().get('selection').first().toJSON();
40
-
41
- if ( 0 > $.trim( json.url.length ) ) {
42
- return;
43
- }
44
-
45
- $( '.wcv-image-container-' + id ).prop( 'src', json.sizes.full.url );
46
- $( '#' + id ).val( json.sizes.full.url );
47
-
48
- });
49
-
50
- media_uploader.open();
51
- }
52
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/class-wcv-settings-advanced.php DELETED
@@ -1,115 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) {
3
- exit;
4
- }
5
-
6
- /**
7
- * The advanced admin settings
8
- *
9
- * @author Lindeni Mahlalela, WC Vendors
10
- * @category Settings
11
- * @package WCVendors/Admin/Settings
12
- * @version 2.0.0
13
- */
14
-
15
- if ( ! class_exists( 'WCVendors_Settings_Advanced', false ) ) :
16
-
17
- /**
18
- * WC_Admin_Settings_Advanced.
19
- */
20
- class WCVendors_Settings_Advanced extends WCVendors_Settings_Page {
21
-
22
- /**
23
- * Constructor.
24
- */
25
- public function __construct() {
26
- $this->id = 'advanced';
27
- $this->label = __( 'Advanced', 'wc-vendors' );
28
-
29
- parent::__construct();
30
- }
31
-
32
- /**
33
- * Get sections.
34
- *
35
- * @return array
36
- */
37
- public function get_sections() {
38
- $sections = array(
39
- '' => __( 'Advanced', 'wc-vendors' ),
40
- );
41
-
42
- return apply_filters( 'wcvendors_get_sections_' . $this->id, $sections );
43
- }
44
-
45
- /**
46
- * Uninstall settings
47
- *
48
- * @param string $current_section
49
- * @return array settings
50
- * @since 2.0.8
51
- */
52
- public function get_settings( $current_section = '' ) {
53
-
54
- $settings = array();
55
-
56
- if ( '' === $current_section ) {
57
-
58
- $settings = apply_filters( 'wcvendors_settings', array(
59
-
60
- // Advanced Options
61
- array(
62
- 'title' => __( 'Plugin Uninstall Options', 'wc-vendors' ),
63
- 'type' => 'title',
64
- 'desc' => __( 'These options are effective when uninstalling the plugin. If "Delete All Data" is checked all this plugin\'s data will be removed, uncheck it to choose what to delete when uninstalling the plugin.', 'wc-vendors' ),
65
- 'id' => 'advanced_options',
66
- ),
67
- array(
68
- 'title' => __( 'Delete all data', 'wc-vendors' ),
69
- 'desc' => __( 'Delete all WC Vendors data when deactivating the plugin.', 'wc-vendors' ),
70
- 'id' => 'wcvendors_uninstall_delete_all_data',
71
- 'default' => 'no',
72
- 'type' => 'checkbox',
73
- ),
74
- array(
75
- 'title' => __( 'Delete custom table', 'wc-vendors' ),
76
- 'desc' => __( 'Delete all data included in the custom tables. This will delete all commissions', 'wc-vendors' ),
77
- 'id' => 'wcvendors_uninstall_delete_custom_table',
78
- 'default' => 'no',
79
- 'type' => 'checkbox',
80
- ),
81
- array(
82
- 'title' => __( 'Delete settings options', 'wc-vendors' ),
83
- 'desc' => __( 'Delete all plugin options when uninstalling the plugin.', 'wc-vendors' ),
84
- 'id' => 'wcvendors_uninstall_delete_settings_options',
85
- 'default' => 'no',
86
- 'type' => 'checkbox',
87
- ),
88
- array(
89
- 'title' => __( 'Delete WC Vendors pages', 'wc-vendors' ),
90
- 'desc' => __( 'Delete all pages created by WC Vendors.', 'wc-vendors' ),
91
- 'id' => 'wcvendors_uninstall_delete_custom_pages',
92
- 'default' => 'no',
93
- 'type' => 'checkbox',
94
- ),
95
- array(
96
- 'title' => __( 'Remove custom Roles', 'wc-vendors' ),
97
- 'desc' => __( 'Remove custom roles registered by WC Vendors.', 'wc-vendors' ),
98
- 'id' => 'wcvendors_uninstall_delete_vendor_roles',
99
- 'default' => 'no',
100
- 'type' => 'checkbox',
101
- ),
102
-
103
- array( 'type' => 'sectionend', 'id' => 'advanced_options' ),
104
-
105
- ) );
106
- }
107
-
108
- return apply_filters( 'wcvendors_get_settings_' . $this->id, $settings, $current_section );
109
- }
110
-
111
- }
112
-
113
- endif;
114
-
115
- return new WCVendors_Settings_Advanced();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/class-wcv-settings-capabilities.php DELETED
@@ -1,313 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) {
3
- exit;
4
- }
5
-
6
- /**
7
- * The capabilities settings class
8
- *
9
- * @author Jamie Madden, WC Vendors
10
- * @category Settings
11
- * @package WCVendors/Admin/Settings
12
- * @version 2.0.0
13
- */
14
-
15
- if ( ! defined( 'ABSPATH' ) ) {
16
- exit; // Exit if accessed directly
17
- }
18
-
19
- if ( ! class_exists( 'WCVendors_Settings_Capabilities', false ) ) :
20
-
21
- /**
22
- * WC_Admin_Settings_General.
23
- */
24
- class WCVendors_Settings_Capabilities extends WCVendors_Settings_Page {
25
-
26
- /**
27
- * Constructor.
28
- */
29
- public function __construct() {
30
- $this->id = 'capabilities';
31
- $this->label = __( 'Capabilities', 'wc-vendors' );
32
-
33
- parent::__construct();
34
- }
35
-
36
- /**
37
- * Get sections.
38
- *
39
- * @return array
40
- */
41
- public function get_sections() {
42
- $sections = array(
43
- '' => __( 'General', 'wc-vendors' ),
44
- 'product' => __( 'Products', 'wc-vendors' ),
45
- 'order' => __( 'Orders', 'wc-vendors' ),
46
- );
47
-
48
- return apply_filters( 'wcvendors_get_sections_' . $this->id, $sections );
49
- }
50
-
51
- /**
52
- * Get settings array.
53
- *
54
- * @return array
55
- */
56
- public function get_settings( $current_section = '' ) {
57
-
58
- if ( 'product' === $current_section ){
59
-
60
- $settings = apply_filters( 'wcvendors_settings_capabilities_product', array(
61
-
62
- array(
63
- 'title' => __( 'Add / Edit Product', 'wc-vendors' ),
64
- 'type' => 'title',
65
- 'desc' => sprintf( __( 'Configure what product information to hide from the %s when creating or editing a product', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
66
- 'id' => 'product_add_options',
67
- ),
68
-
69
- array(
70
- 'title' => __( 'Product Types', 'wc-vendors' ),
71
- 'desc' => sprintf( __( 'This controls what product types the %s can create', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
72
- 'id' => 'wcvendors_capability_product_types',
73
- 'class' => 'wc-enhanced-select',
74
- 'css' => 'min-width:300px;',
75
- 'type' => 'multiselect',
76
- 'options' => wc_get_product_types(),
77
- 'desc_tip' => true,
78
- ),
79
-
80
- array(
81
- 'title' => __( 'Product Type Options', 'wc-vendors' ),
82
- 'desc' => sprintf( __( 'This controls what product type options the %s can use', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
83
- 'id' => 'wcvendors_capability_product_type_options',
84
- 'class' => 'wc-enhanced-select',
85
- 'css' => 'min-width:300px;',
86
- 'type' => 'multiselect',
87
- 'options' => array(
88
- 'virtual' => __( 'Virtual', 'wc-vendors' ),
89
- 'downloadable' => __( 'Downloadable', 'wc-vendors' ),
90
- ),
91
- 'desc_tip' => true,
92
- ),
93
-
94
- array(
95
- 'title' => __( 'Product Data Tabs', 'wc-vendors' ),
96
- 'desc' => sprintf( __( 'This controls what product data tabs the %s can use', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
97
- 'id' => 'wcvendors_capability_product_data_tabs',
98
- 'class' => 'wc-enhanced-select',
99
- 'css' => 'min-width:300px;',
100
- 'type' => 'multiselect',
101
- 'options' => array(
102
- 'general' => __( 'General', 'wc-vendors' ),
103
- 'inventory' => __( 'Inventory', 'wc-vendors' ),
104
- 'shipping' => __( 'Shipping', 'wc-vendors' ),
105
- 'linked_product' => __( 'Linked Products', 'wc-vendors' ),
106
- 'attribute' => __( 'Attributes', 'wc-vendors' ),
107
- 'variations' => __( 'Variations', 'wc-vendors' ),
108
- 'advanced' => __( 'Advanced', 'wc-vendors' ),
109
- ),
110
- 'desc_tip' => true,
111
- ),
112
-
113
-
114
- array(
115
- 'title' => __( 'Featured Product', 'wc-vendors' ),
116
- 'desc' => sprintf( __( 'Allow %s to use the featured product option', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
117
- 'id' => 'wcvendors_capability_product_featured',
118
- 'default' => 'no',
119
- 'type' => 'checkbox',
120
- ),
121
-
122
- array(
123
- 'title' => __( 'Duplicate Product', 'wc-vendors' ),
124
- 'desc' => sprintf( __( 'Allow %s to duplicate products', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
125
- 'id' => 'wcvendors_capability_product_duplicate',
126
- 'default' => 'no',
127
- 'type' => 'checkbox',
128
- ),
129
-
130
- array(
131
- 'title' => __( 'SKU', 'wc-vendors' ),
132
- 'desc' => sprintf( __( 'Hide sku field from %s', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
133
- 'id' => 'wcvendors_capability_product_sku',
134
- 'default' => 'no',
135
- 'type' => 'checkbox',
136
- ),
137
-
138
- array(
139
- 'title' => __( 'Taxes', 'wc-vendors' ),
140
- 'desc' => sprintf( __( 'Hide tax fields from %s', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
141
- 'id' => 'wcvendors_capability_product_taxes',
142
- 'default' => 'no',
143
- 'type' => 'checkbox',
144
- ),
145
-
146
- array( 'type' => 'sectionend', 'id' => 'product_add_options' ),
147
-
148
- ) );
149
-
150
- } elseif ( 'order' === $current_section ){
151
-
152
- $settings = apply_filters( 'wcvendors_settings_capabilities_order', array(
153
-
154
- array(
155
- 'type' => 'title',
156
- 'desc' => sprintf( __( 'Configure what order information a %s can view from an order', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
157
- 'id' => 'order_view_options',
158
- ),
159
-
160
- array(
161
- 'title' => __( 'View Order Notes', 'wc-vendors' ),
162
- 'desc' => sprintf( __( 'Allow %s to view order notes', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
163
- 'id' => 'wcvendors_capability_order_read_notes',
164
- 'default' => 'yes',
165
- 'type' => 'checkbox',
166
- ),
167
-
168
- array(
169
- 'title' => __( 'Add Order notes', 'wc-vendors' ),
170
- 'desc' => sprintf( __( 'Allow %s to add order notes.', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
171
- 'id' => 'wcvendors_capability_order_update_notes',
172
- 'default' => 'yes',
173
- 'type' => 'checkbox',
174
- ),
175
-
176
- array(
177
- 'title' => __( 'Customer Name', 'wc-vendors' ),
178
- 'desc' => sprintf( __( 'Allow %s to view customer name fields', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
179
- 'id' => 'wcvendors_capability_order_customer_name',
180
- 'default' => 'yes',
181
- 'type' => 'checkbox',
182
- ),
183
-
184
- array(
185
- 'title' => __( 'Customer Billing Address', 'wc-vendors' ),
186
- 'desc' => sprintf( __( 'Allow %s to view customer billing address fields', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
187
- 'id' => 'wcvendors_capability_order_customer_billing',
188
- 'default' => 'yes',
189
- 'type' => 'checkbox',
190
- ),
191
-
192
- array(
193
- 'title' => __( 'Customer Shipping Address', 'wc-vendors' ),
194
- 'desc' => sprintf( __( 'Allow %s to view the customer shipping fields', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
195
- 'id' => 'wcvendors_capability_order_customer_shipping',
196
- 'default' => 'yes',
197
- 'type' => 'checkbox',
198
- ),
199
-
200
- array(
201
- 'title' => __( 'Customer Email', 'wc-vendors' ),
202
- 'desc' => sprintf( __( 'Allow %s to view the customer email address', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
203
- 'id' => 'wcvendors_capability_order_customer_email',
204
- 'default' => 'yes',
205
- 'type' => 'checkbox',
206
- ),
207
-
208
- array(
209
- 'title' => __( 'Customer Phone', 'wc-vendors' ),
210
- 'desc' => sprintf( __( 'Allow %s to view the customer phone number', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
211
- 'id' => 'wcvendors_capability_order_customer_phone',
212
- 'default' => 'yes',
213
- 'type' => 'checkbox',
214
- ),
215
-
216
- array( 'type' => 'sectionend', 'id' => 'order_view_options' ),
217
-
218
- ) );
219
-
220
- } else {
221
-
222
- $settings = apply_filters( 'wcvendors_settings_capabilities_general', array(
223
-
224
- array(
225
- 'title' => __( 'Permissions', 'wc-vendors' ),
226
- 'type' => 'title',
227
- 'desc' => sprintf( __( 'Enable or disable functionality for your %s', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
228
- 'id' => 'capabilities_options',
229
- ),
230
-
231
- array( 'type' => 'sectionend', 'id' => 'capabilities_options' ),
232
-
233
- // Products
234
- array(
235
- 'title' => __( 'Products', 'wc-vendors' ),
236
- 'type' => 'title',
237
- 'id' => 'permissions_products_options',
238
- ),
239
-
240
- array(
241
- 'title' => __( 'Submit Products', 'wc-vendors' ),
242
- 'desc' => sprintf( __( 'Allow %s to add/edit products', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
243
- 'id' => 'wcvendors_capability_products_enabled',
244
- 'default' => 'yes',
245
- 'type' => 'checkbox',
246
- ),
247
-
248
- array(
249
- 'title' => __( 'Edit Live Products', 'wc-vendors' ),
250
- 'desc' => sprintf( __( 'Allow %s to edit published (live) products', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
251
- 'id' => 'wcvendors_capability_products_edit',
252
- 'default' => 'yes',
253
- 'type' => 'checkbox',
254
- ),
255
-
256
- array(
257
- 'title' => __( 'Publish Approval', 'wc-vendors' ),
258
- 'desc' => sprintf( __( 'Allow %s to publish products directly to the marketplace without requiring approval.', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
259
- 'id' => 'wcvendors_capability_products_live',
260
- 'default' => 'yes',
261
- 'type' => 'checkbox',
262
- ),
263
-
264
- array( 'type' => 'sectionend', 'id' => 'permissions_products_options' ),
265
-
266
- // Orders
267
- array(
268
- 'title' => __( 'Orders', 'wc-vendors' ),
269
- 'type' => 'title',
270
- 'id' => 'permissions_orders_options',
271
- ),
272
-
273
- array(
274
- 'title' => __( 'View Orders', 'wc-vendors' ),
275
- 'desc' => sprintf( __( 'Allow %s to view orders', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
276
- 'id' => 'wcvendors_capability_orders_enabled',
277
- 'default' => 'yes',
278
- 'type' => 'checkbox',
279
- ),
280
-
281
- array(
282
- 'title' => __( 'Export Orders', 'wc-vendors' ),
283
- 'desc' => sprintf( __( 'Allow %s to export their orders to a CSV file', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
284
- 'id' => 'wcvendors_capability_orders_export',
285
- 'default' => 'yes',
286
- 'type' => 'checkbox',
287
- ),
288
-
289
- array(
290
- 'title' => __( 'Front End Sales Reports', 'wc-vendors' ),
291
- 'desc' => sprintf( __( 'Allow %s to view sales table on the frontend on the %s dashboard page.', 'wc-vendors' ), wcv_get_vendor_name( false, false ), wcv_get_vendor_name( false, false ) ),
292
- 'id' => 'wcvendors_capability_frontend_reports',
293
- 'default' => 'yes',
294
- 'type' => 'checkbox',
295
- ),
296
-
297
-
298
- array( 'type' => 'sectionend', 'id' => 'permissions_orders_options' ),
299
-
300
- ) );
301
-
302
- }
303
-
304
- return apply_filters( 'wcvendors_get_settings_' . $this->id, $settings, $current_section );
305
-
306
- }
307
-
308
-
309
- }
310
-
311
- endif;
312
-
313
- return new WCVendors_Settings_Capabilities();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/class-wcv-settings-commission.php DELETED
@@ -1,88 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) {
3
- exit;
4
- }
5
-
6
- /**
7
- * The commission admin settings
8
- *
9
- * @author Jamie Madden, WC Vendors
10
- * @category Settings
11
- * @package WCVendors/Admin/Settings
12
- * @version 2.0.0
13
- */
14
-
15
- if ( ! defined( 'ABSPATH' ) ) {
16
- exit; // Exit if accessed directly
17
- }
18
-
19
- if ( ! class_exists( 'WCVendors_Settings_Commission', false ) ) :
20
-
21
- /**
22
- * WC_Admin_Settings_General.
23
- */
24
- class WCVendors_Settings_Commission extends WCVendors_Settings_Page {
25
-
26
- /**
27
- * Constructor.
28
- */
29
- public function __construct() {
30
- $this->id = 'commission';
31
- $this->label = __( 'Commission', 'wc-vendors' );
32
-
33
- parent::__construct();
34
- }
35
-
36
- /**
37
- * Get sections.
38
- *
39
- * @return array
40
- */
41
- public function get_sections() {
42
- $sections = array(
43
- '' => __( 'General', 'wc-vendors' ),
44
- );
45
-
46
- return apply_filters( 'wcvendors_get_sections_' . $this->id, $sections );
47
- }
48
-
49
- /**
50
- * Get settings array.
51
- *
52
- * @return array
53
- */
54
- public function get_settings( $current_section = '' ) {
55
-
56
-
57
- $settings = array();
58
-
59
- if ( '' === $current_section ) {
60
- $settings = apply_filters( 'wcvendors_settings_comission', array(
61
-
62
- // General Options
63
- array(
64
- 'type' => 'title',
65
- 'desc' => __( 'These are the commission settings for your marketplace', 'wc-vendors' ),
66
- 'id' => 'commission_options',
67
- ),
68
- array(
69
- 'title' => sprintf( __( '%s Commission %%', 'wc-vendors' ), wcv_get_vendor_name() ),
70
- 'desc' => sprintf( __( 'The global commission rate for your %s', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ),
71
- 'id' => 'wcvendors_vendor_commission_rate',
72
- 'css' => 'width:55px;',
73
- 'default' => '50',
74
- 'type' => 'number',
75
- ),
76
- array( 'type' => 'sectionend', 'id' => 'commission_options' ),
77
-
78
- ) );
79
- }
80
-
81
- return apply_filters( 'wcvendors_get_settings_' . $this->id, $settings, $current_section );
82
- }
83
-
84
- }
85
-
86
- endif;
87
-
88
- return new WCVendors_Settings_Commission();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/class-wcv-settings-display.php DELETED
@@ -1,286 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) {
3
- exit;
4
- }
5
-
6
- /**
7
- * The display settings class
8
- *
9
- * @author Jamie Madden, WC Vendors
10
- * @category Settings
11
- * @package WCVendors/Admin/Settings
12
- * @version 2.0.0
13
- */
14
-
15
- if ( ! defined( 'ABSPATH' ) ) {
16
- exit; // Exit if accessed directly
17
- }
18
-
19
- if ( ! class_exists( 'WCVendors_Settings_Display', false ) ) :
20
-
21
- /**
22
- * WC_Admin_Settings_General.
23
- */
24
- class WCVendors_Settings_Display extends WCVendors_Settings_Page {
25
-
26
- /**
27
- * Constructor.
28
- */
29
- public function __construct() {
30
- $this->id = 'display';
31
- $this->label = __( 'Display', 'wc-vendors' );
32
-
33
- parent::__construct();
34
- }
35
-
36
- /**
37
- * Get sections.
38
- *
39
- * @return array
40
- */
41
- public function get_sections() {
42
- $sections = array(
43
- '' => __( 'General', 'wc-vendors' ),
44
- 'labels' => __( 'Labels', 'wc-vendors' ),
45
- 'advanced' => __( 'Advanced', 'wc-vendors' ),
46
- );
47
-
48
- return apply_filters( 'wcvendors_get_sections_' . $this->id, $sections );
49
- }
50
-
51
- /**
52
- * Get settings array.
53
- *
54
- * @return array
55
- */
56
- public function get_settings( $current_section = '' ) {
57
-
58
-
59
- if ( 'advanced' === $current_section ){
60
-
61
- $settings = apply_filters( 'wcvendors_settings_display_advanced', array(
62
- // Shop Display Options
63
- array(
64
- 'title' => __( '', 'wc-vendors' ),
65
- 'type' => 'title',
66
- 'desc' => sprintf( __( 'Advanced options provide extra display options', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
67
- 'id' => 'advanced_options',
68
- ),
69
- array(
70
- 'title' => __( 'Product Page Stylesheet', 'wc-vendors' ),
71
- 'desc' => sprintf( __( 'You can add CSS in this textarea, which will be loaded on the product add/edit page for %s', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
72
- 'desc_tip' => sprintf( __( 'This enables the sold by labels used to show which %s shop the product belongs to', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
73
- 'id' => 'wcvendors_display_advanced_stylesheet',
74
- 'css' => 'width: 700px;min-height:100px',
75
- 'default' => '',
76
- 'type' => 'textarea',
77
- ),
78
- array(
79
- 'title' => __( 'Use WooCommerce Registration', 'wc-vendors' ),
80
- 'type' => 'checkbox',
81
- 'default' => 'no',
82
- 'id' => 'wcvendors_redirect_wp_registration_to_woocommerce_myaccount',
83
- 'desc' => __( 'This will redirect the WordPress registration to WooCommerce my-account page for registration.', 'wc-vendors' ),
84
- ),
85
-
86
-
87
- array( 'type' => 'sectionend', 'id' => 'advanced_options' ),
88
- ) );
89
-
90
- } elseif ( 'labels' === $current_section ){
91
-
92
- $settings = apply_filters( 'wcvendors_settings_display_labels', array(
93
-
94
- // Shop Display Options
95
- array(
96
- 'title' => __( '', 'wc-vendors' ),
97
- 'type' => 'title',
98
- 'desc' => sprintf( __( 'Labels are shown on the front end, in orders or emails.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
99
- 'id' => 'label_options',
100
- ),
101
-
102
- array(
103
- 'title' => sprintf( __( '%s singluar term', 'wc-vendors' ), wcv_get_vendor_name() ),
104
- 'desc_tip' => __( 'Change all references to vendor to this term', 'wc-vendors' ),
105
- 'id' => 'wcvendors_vendor_singular',
106
- 'type' => 'text',
107
- 'default' => sprintf( __( '%s', 'wc-vendors' ), wcv_get_vendor_name() ),
108
- ),
109
-
110
- array(
111
- 'title' => sprintf( __( '%s plural term', 'wc-vendors' ), wcv_get_vendor_name( false ) ),
112
- 'desc_tip' => __( 'Change all references to vendors to this term', 'wc-vendors' ),
113
- 'id' => 'wcvendors_vendor_plural',
114
- 'type' => 'text',
115
- 'default' => sprintf( __( '%s', 'wc-vendors' ), wcv_get_vendor_name( false ) ),
116
- ),
117
-
118
- array(
119
- 'title' => __( 'Sold by', 'wc-vendors' ),
120
- 'desc' => __( 'Enable sold by labels', 'wc-vendors' ),
121
- 'desc_tip' => sprintf( __( 'This enables the sold by labels used to show which %s shop the product belongs to', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
122
- 'id' => 'wcvendors_display_label_sold_by_enable',
123
- 'default' => 'yes',
124
- 'type' => 'checkbox',
125
- ),
126
-
127
- array(
128
- 'title' => __( 'Sold by Separator', 'wc-vendors' ),
129
- 'desc_tip' => __( 'The sold by separator', 'wc-vendors' ),
130
- 'id' => 'wcvendors_label_sold_by_separator',
131
- 'type' => 'text',
132
- 'default' => __( ':', 'wc-vendors' ),
133
- ),
134
-
135
- array(
136
- 'title' => __( 'Sold by label', 'wc-vendors' ),
137
- 'desc_tip' => __( 'The sold by label', 'wc-vendors' ),
138
- 'id' => 'wcvendors_label_sold_by',
139
- 'type' => 'text',
140
- 'default' => __( 'Sold By', 'wc-vendors' ),
141
- ),
142
-
143
- array(
144
- 'title' => sprintf( __( '%s Store Info', 'wc-vendors' ), wcv_get_vendor_name() ),
145
- 'desc' => sprintf( __( 'Enable %s store info tab on the single product page', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
146
- 'id' => 'wcvendors_label_store_info_enable',
147
- 'default' => 'yes',
148
- 'type' => 'checkbox',
149
- ),
150
-
151
- array(
152
- 'title' => sprintf( __( '%s store Info label', 'wc-vendors' ), wcv_get_vendor_name() ),
153
- 'desc' => sprintf( __( 'The %s store info label', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
154
- 'id' => 'wcvendors_display_label_store_info',
155
- 'type' => 'text',
156
- 'default' => __( 'Store Info', 'wc-vendors' ),
157
- ),
158
-
159
- array( 'type' => 'sectionend', 'id' => 'label_options' ),
160
-
161
- ) );
162
-
163
- } else {
164
-
165
- $settings = apply_filters( 'wcvendors_settings_display_general', array(
166
-
167
- // General Options
168
- array(
169
- 'title' => __( 'Pages', 'wc-vendors' ),
170
- 'type' => 'title',
171
- 'desc' => sprintf( __( 'These pages used on the front end by %s.', 'wc-vendors'), wcv_get_vendor_name( true, false ) ),
172
- 'id' => 'page_options',
173
- ),
174
- array(
175
- 'title' => __( 'Dashboard', 'wc-vendors' ),
176
- 'id' => 'wcvendors_vendor_dashboard_page_id',
177
- 'type' => 'single_select_page',
178
- 'default' => '',
179
- 'class' => 'wc-enhanced-select-nostd',
180
- 'css' => 'min-width:300px;',
181
- 'desc' => sprintf( __( '<br />This sets the page used to display the front end %s dashboard. This page should contain the following shortcode. <code>[wcv_vendor_dashboard]</code>', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
182
- ),
183
- array(
184
- 'title' => __( 'Shop Settings', 'wc-vendors' ),
185
- 'id' => 'wcvendors_shop_settings_page_id',
186
- 'type' => 'single_select_page',
187
- 'default' => '',
188
- 'class' => 'wc-enhanced-select-nostd',
189
- 'css' => 'min-width:300px;',
190
- 'desc' => sprintf( __( '<br />This sets the page used to display the %s shop settings page. This page should contain the following shortcode. <code>[wcv_shop_settings]</code>', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
191
- ),
192
- array(
193
- 'title' => __( 'Orders', 'wc-vendors' ),
194
- 'id' => 'wcvendors_product_orders_page_id',
195
- 'type' => 'single_select_page',
196
- 'default' => '',
197
- 'class' => 'wc-enhanced-select-nostd',
198
- 'css' => 'min-width:300px;',
199
- 'desc' => sprintf( __( '<br />This sets the page used to display the %s orders page. This page should contain the following shortcode. <code>[wcv_orders]</code>', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
200
- ),
201
- array(
202
- 'title' => sprintf( __( '%s', 'wc-vendors' ), wcv_get_vendor_name( false ) ),
203
- 'id' => 'wcvendors_vendors_page_id',
204
- 'type' => 'single_select_page',
205
- 'default' => '',
206
- 'class' => 'wc-enhanced-select-nostd',
207
- 'css' => 'min-width:300px;',
208
- 'desc' => sprintf( __( '<br />This sets the page used to display a paginated list of all %1$s stores. Your %1$s stores will be available at <code>%2$s/page-slug/store-name/</code><br />This page should contain the following shortcode. <code>[wcv_vendorslist]</code>', 'wc-vendors' ), wcv_get_vendor_name( true, false ), esc_html( home_url() ) ),
209
- ),
210
- array(
211
- 'title' => __( 'Terms and Conditions', 'wc-vendors' ),
212
- 'id' => 'wcvendors_vendor_terms_page_id',
213
- 'type' => 'single_select_page',
214
- 'default' => '',
215
- 'class' => 'wc-enhanced-select-nostd',
216
- 'css' => 'min-width:300px;',
217
- 'desc' => sprintf( __( '<br />This sets the page used to display the terms and conditions when a %s signs up.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
218
- ),
219
-
220
- array( 'type' => 'sectionend', 'id' => 'page_options' ),
221
-
222
- // Shop Settings
223
- array(
224
- 'title' => __( 'Store Settings', 'wc-vendors' ),
225
- 'type' => 'title',
226
- 'desc' => sprintf( __( 'These are the settings for the individual %s stores.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
227
- 'id' => 'shop_options',
228
- ),
229
-
230
- array(
231
- 'title' => sprintf( __( '%s Store URL', 'wc-vendors' ), wcv_get_vendor_name() ),
232
- 'desc' => sprintf( __( 'If you enter "vendors" your %1$s store will be %1$s/vendors/store-name/', 'wc-vendors' ), wcv_get_vendor_name( true, false ), esc_html( home_url() ) ),
233
- 'id' => 'wcvendors_vendor_shop_permalink',
234
- 'default' => 'vendors',
235
- 'type' => 'text',
236
- ),
237
-
238
- array(
239
- 'title' => __( 'Shop Header', 'wc-vendors' ),
240
- 'desc' => sprintf( __( 'Enable %s shop headers', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
241
- 'desc_tip' => sprintf( __( 'This enables the %s shop header template and disables the shop description text.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
242
- 'id' => 'wcvendors_display_shop_headers',
243
- 'default' => 'no',
244
- 'type' => 'checkbox',
245
- ),
246
-
247
- array(
248
- 'title' => __( 'Shop HTML', 'wc-vendors' ),
249
- 'desc' => sprintf( __( 'Allow HTML in %s shop description', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
250
- 'desc_tip' => sprintf( __( 'This will enable the WYSIWYG editor and for the %1$s shop description. You can enable or disable this per %1$s by editing the %1$s user account.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
251
- 'id' => 'wcvendors_display_shop_description_html',
252
- 'default' => 'no',
253
- 'type' => 'checkbox',
254
- ),
255
-
256
- array(
257
- 'title' => __( 'Display Name', 'wc-vendors' ),
258
- 'id' => 'wcvendors_display_shop_display_name',
259
- 'desc_tip' => sprintf( __( 'Select what will be used to display the %s name throughout the marketplace.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
260
- 'default' => 'shop_name',
261
- 'type' => 'select',
262
- 'class' => 'wc-enhanced-select',
263
- 'options' => array(
264
- 'display_name' => __( 'Display name', 'wc-vendors' ),
265
- 'shop_name' => __( 'Shop name', 'wc-vendors' ),
266
- 'user_login' => sprintf( __( '%s Username', 'wc-vendors' ), wcv_get_vendor_name() ),
267
- 'user_email' => sprintf( __( '%s Email', 'wc-vendors' ), wcv_get_vendor_name() ),
268
- ),
269
- ),
270
-
271
- array( 'type' => 'sectionend', 'id' => 'shop_options' ),
272
-
273
- ) );
274
-
275
- }
276
-
277
- return apply_filters( 'wcvendors_get_settings_' . $this->id, $settings, $current_section );
278
-
279
- }
280
-
281
-
282
- }
283
-
284
- endif;
285
-
286
- return new WCVendors_Settings_Display();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/class-wcv-settings-general.php DELETED
@@ -1,123 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) {
3
- exit;
4
- }
5
-
6
- /**
7
- * The general admin settings
8
- *
9
- * @author Jamie Madden, WC Vendors
10
- * @category Settings
11
- * @package WCVendors/Admin/Settings
12
- * @version 2.0.0
13
- */
14
-
15
- if ( ! defined( 'ABSPATH' ) ) {
16
- exit; // Exit if accessed directly
17
- }
18
-
19
- if ( ! class_exists( 'WCVendors_Settings_General', false ) ) :
20
-
21
- /**
22
- * WC_Admin_Settings_General.
23
- */
24
- class WCVendors_Settings_General extends WCVendors_Settings_Page {
25
-
26
- /**
27
- * Constructor.
28
- */
29
- public function __construct() {
30
- $this->id = 'general';
31
- $this->label = __( 'General', 'wc-vendors' );
32
-
33
- parent::__construct();
34
- }
35
-
36
- /**
37
- * Get sections.
38
- *
39
- * @return array
40
- */
41
- public function get_sections() {
42
- $sections = array(
43
- '' => __( 'General', 'wc-vendors' ),
44
- );
45
-
46
- return apply_filters( 'wcvendors_get_sections_' . $this->id, $sections );
47
- }
48
-
49
- /**
50
- * Get settings array.
51
- *
52
- * @return array
53
- */
54
- public function get_settings( $current_section = '' ) {
55
-
56
- $settings = array();
57
-
58
- if ( '' === $current_section ) {
59
-
60
- $settings = apply_filters( 'wcvendors_settings', array(
61
-
62
- // General Options
63
- array(
64
- 'title' => __( 'Marketplace Options', 'wc-vendors' ),
65
- 'type' => 'title',
66
- 'desc' => __( 'These are the general settings for your marketplace', 'wc-vendors' ),
67
- 'id' => 'general_options',
68
- ),
69
- array(
70
- 'title' => sprintf( __( '%s Registration', 'wc-vendors' ), wcv_get_vendor_name() ),
71
- 'desc' => sprintf( __( 'Allow users to apply to become a %s', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
72
- 'id' => 'wcvendors_vendor_allow_registration',
73
- 'default' => 'yes',
74
- 'type' => 'checkbox',
75
- ),
76
- array(
77
- 'title' => sprintf( __( 'Terms & Conditions Checkbox', 'wc-vendors' ), wcv_get_vendor_name() ),
78
- 'desc' => sprintf( __( 'Make the terms and conditions checkbox always visible even if become a %s is not checked', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
79
- 'id' => 'wcvendors_terms_and_conditions_visibility',
80
- 'default' => 'yes',
81
- 'type' => 'checkbox',
82
- ),
83
- array(
84
- 'title' => sprintf( __( '%s Approval', 'wc-vendors' ), wcv_get_vendor_name() ),
85
- 'desc' => sprintf( __( 'Manually approve all %s applications', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
86
- 'id' => 'wcvendors_vendor_approve_registration',
87
- 'default' => 'no',
88
- 'type' => 'checkbox',
89
- ),
90
- array(
91
- 'title' => sprintf( __( 'Become a %s', 'wc-vendors' ), wcv_get_vendor_name() ),
92
- 'desc' => sprintf( __( 'Show the "Become a %s" link on WooCommerce my-account page', 'wc-vendors' ), wcv_get_vendor_name( ) ),
93
- 'id' => 'wcvendors_become_a_vendor_my_account_link_visibility',
94
- 'default' => 'yes',
95
- 'type' => 'checkbox',
96
- ),
97
- array(
98
- 'title' => sprintf( __( '%s Taxes', 'wc-vendors' ), wcv_get_vendor_name() ),
99
- 'desc' => sprintf( __( 'Give any taxes to the %s', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
100
- 'id' => 'wcvendors_vendor_give_taxes',
101
- 'default' => 'no',
102
- 'type' => 'checkbox',
103
- ),
104
- array(
105
- 'title' => sprintf( __( '%s Shipping', 'wc-vendors' ), wcv_get_vendor_name() ),
106
- 'desc' => sprintf( __( 'Give any shipping to the %s', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
107
- 'id' => 'wcvendors_vendor_give_shipping',
108
- 'default' => 'no',
109
- 'type' => 'checkbox',
110
- ),
111
- array( 'type' => 'sectionend', 'id' => 'general_options' ),
112
-
113
- ) );
114
- }
115
-
116
- return apply_filters( 'wcvendors_get_settings_' . $this->id, $settings, $current_section );
117
- }
118
-
119
- }
120
-
121
- endif;
122
-
123
- return new WCVendors_Settings_General();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/class-wcv-settings-page.php DELETED
@@ -1,144 +0,0 @@
1
- <?php
2
- /**
3
- * WC Vendors Settings Page/Tab - This is a copy of the WooCommerce Settings page
4
- *
5
- * @author WooThemes, Jamie Madden
6
- * @category Admin
7
- * @package WC Vendors/Admin
8
- * @version 2.0.0
9
- */
10
-
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit; // Exit if accessed directly
13
- }
14
-
15
- if ( ! class_exists( 'WCVendors_Settings_Page', false ) ) :
16
-
17
- /**
18
- * WCVendors_Settings_Page.
19
- */
20
- abstract class WCVendors_Settings_Page {
21
-
22
- /**
23
- * Setting page id.
24
- *
25
- * @var string
26
- */
27
- protected $id = '';
28
-
29
- /**
30
- * Setting page label.
31
- *
32
- * @var string
33
- */
34
- protected $label = '';
35
-
36
- /**
37
- * Constructor.
38
- */
39
- public function __construct() {
40
-
41
- add_filter( 'wcvendors_settings_tabs_array', array( $this, 'add_settings_page' ), 20 );
42
- add_action( 'wcvendors_sections_' . $this->id, array( $this, 'output_sections' ) );
43
- add_action( 'wcvendors_settings_' . $this->id, array( $this, 'output' ) );
44
- add_action( 'wcvendors_settings_save_' . $this->id, array( $this, 'save' ) );
45
- }
46
-
47
- /**
48
- * Get settings page ID.
49
- * @since 2.0.0
50
- * @return string
51
- */
52
- public function get_id() {
53
- return $this->id;
54
- }
55
-
56
- /**
57
- * Get settings page label.
58
- * @since 2.0.0
59
- * @return string
60
- */
61
- public function get_label() {
62
- return $this->label;
63
- }
64
-
65
- /**
66
- * Add this page to settings.
67
- *
68
- * @param array $pages
69
- *
70
- * @return mixed
71
- */
72
- public function add_settings_page( $pages ) {
73
- $pages[ $this->id ] = $this->label;
74
-
75
- return $pages;
76
- }
77
-
78
- /**
79
- * Get settings array.
80
- *
81
- * @return array
82
- */
83
- public function get_settings() {
84
- return apply_filters( 'wcvendors_get_settings_' . $this->id, array() );
85
- }
86
-
87
- /**
88
- * Get sections.
89
- *
90
- * @return array
91
- */
92
- public function get_sections() {
93
- return apply_filters( 'wcvendors_get_sections_' . $this->id, array() );
94
- }
95
-
96
- /**
97
- * Output sections.
98
- */
99
- public function output_sections() {
100
- global $current_section;
101
-
102
- $sections = $this->get_sections();
103
-
104
- if ( empty( $sections ) || 1 === sizeof( $sections ) ) {
105
- return;
106
- }
107
-
108
- echo '<ul class="subsubsub">';
109
-
110
- $array_keys = array_keys( $sections );
111
-
112
- foreach ( $sections as $id => $label ) {
113
- echo '<li><a href="' . admin_url( 'admin.php?page=wcv-settings&tab=' . $this->id . '&section=' . sanitize_title( $id ) ) . '" class="' . ( $current_section == $id ? 'current' : '' ) . '">' . $label . '</a> ' . ( end( $array_keys ) == $id ? '' : '|' ) . ' </li>';
114
- }
115
-
116
- echo '</ul><br class="clear" />';
117
- }
118
-
119
- /**
120
- * Output the settings.
121
- */
122
- public function output() {
123
- global $current_section;
124
-
125
- $settings = $this->get_settings( $current_section );
126
- WCVendors_Admin_Settings::output_fields( $settings );
127
- }
128
-
129
- /**
130
- * Save settings.
131
- */
132
- public function save() {
133
- global $current_section;
134
-
135
- $settings = $this->get_settings( $current_section );
136
- WCVendors_Admin_Settings::save_fields( $settings );
137
-
138
- if ( $current_section ) {
139
- do_action( 'wcvendors_update_options_' . $this->id . '_' . $current_section );
140
- }
141
- }
142
- }
143
-
144
- endif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/class-wcv-settings-payments.php DELETED
@@ -1,143 +0,0 @@
1
- <?php
2
- if ( ! defined( 'ABSPATH' ) ) {
3
- exit;
4
- }
5
-
6
- /**
7
- * The display settings class
8
- *
9
- * @author Jamie Madden, WC Vendors
10
- * @category Settings
11
- * @package WCVendors/Admin/Settings
12
- * @version 2.0.0
13
- */
14
-
15
- if ( ! defined( 'ABSPATH' ) ) {
16
- exit; // Exit if accessed directly
17
- }
18
-
19
- if ( ! class_exists( 'WCVendors_Settings_Payments', false ) ) :
20
-
21
- /**
22
- * WC_Admin_Settings_General.
23
- */
24
- class WCVendors_Settings_Payments extends WCVendors_Settings_Page {
25
-
26
- /**
27
- * Constructor.
28
- */
29
- public function __construct() {
30
- $this->id = 'payments';
31
- $this->label = __( 'Payments', 'wc-vendors' );
32
-
33
- parent::__construct();
34
- }
35
-
36
-
37
- /**
38
- * Get sections.
39
- *
40
- * @return array
41
- */
42
- public function get_sections() {
43
- $sections = array(
44
- '' => __( 'General', 'wc-vendors' ),
45
- 'paypal' => __( 'PayPal Adaptive Payments', 'wc-vendors' ),
46
- );
47
-
48
- return apply_filters( 'wcvendors_get_sections_' . $this->id, $sections );
49
- }
50
-
51
- /**
52
- * Get settings array.
53
- *
54
- * @return array
55
- */
56
- public function get_settings( $current_section = '' ) {
57
-
58
-
59
- if ( 'paypal' === $current_section ){
60
-
61
- $settings = apply_filters( 'wcvendors_settings_payments_paypal', array(
62
-
63
- // Shop Display Options
64
- array(
65
- 'title' => __( '', 'wc-vendors' ),
66
- 'type' => 'title',
67
- 'desc' => sprintf( __( '<h3>PayPal Adaptive Payments - Please Note: PayPal Adaptive Payments has been deprecated by PayPal as of September 2017. These options are for existing users only. This will be completely removed in a future version.</h3>', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
68
- 'id' => 'paypal_options',
69
- ),
70
-
71
-
72
- array(
73
- 'title' => __( '', 'wc-vendors' ),
74
- 'type' => 'title',
75
- 'desc' => sprintf( __( 'Total Commission due: %s', 'wc-vendors' ), wc_price( WCV_Commission::get_totals( 'due' ) ) ),
76
- 'id' => 'paypal_options',
77
- ),
78
-
79
- array(
80
- 'title' => __( 'Instant Pay', 'wc-vendors' ),
81
- 'desc' => __( 'Enable instantpay', 'wc-vendors' ),
82
- 'desc_tip' => sprintf( __( 'Instantly pay %1$s their commission when an order is made, and if a %1$s has a valid PayPal email added on their Shop Settings page.', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
83
- 'id' => 'wcvendors_payments_paypal_instantpay_enable',
84
- 'default' => 'no',
85
- 'type' => 'checkbox',
86
- ),
87
-
88
- array(
89
- 'title' => __( 'Payment schedule', 'wc-vendors' ),
90
- 'desc' => __( 'Note: Schedule will only work if instant pay is unchecked', 'wc-vendors' ),
91
- 'id' => 'wcvendors_payments_paypal_schedule',
92
- 'type' => 'radio',
93
- 'options' => array(
94
- 'daily' => __( 'Daily', 'wc-vendors' ),
95
- 'weekly' => __( 'Weekly', 'wc-vendors' ),
96
- 'biweekly' => __( 'Biweekly', 'wc-vendors' ),
97
- 'monthly' => __( 'Monthly', 'wc-vendors' ),
98
- 'manual' => __( 'Manual', 'wc-vendors' ),
99
- 'now' => '<span style="color:green;"><strong>' . __( 'Now', 'wc-vendors' ) . '</strong></span>',
100
- )
101
- ),
102
-
103
- array(
104
- 'title' => __( 'Email notification', 'wc-vendors' ),
105
- 'desc' => __( 'Enable notify the admin', 'wc-vendors' ),
106
- 'desc_tip' => __( 'Send the marketplace admin an email each time a payment has been made via the payment schedule options above', 'wc-vendors' ),
107
- 'id' => 'wcvendors_payments_paypal_email_enable',
108
- 'default' => 'no',
109
- 'type' => 'checkbox',
110
- ),
111
-
112
-
113
-
114
- array( 'type' => 'sectionend', 'id' => 'paypal_options' ),
115
- ) );
116
-
117
- } else {
118
-
119
- $settings = apply_filters( 'wcvendors_settings_payments_general', array(
120
-
121
- // Shop Display Options
122
- array(
123
- 'title' => __( '', 'wc-vendors' ),
124
- 'type' => 'title',
125
- 'desc' => sprintf( __( '<strong>Payments controls how your %s commission is paid out. These settings only function if you are using a supported gateway.</strong> ', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ),
126
- 'id' => 'payment_general_options',
127
- ),
128
-
129
- array( 'type' => 'sectionend', 'id' => 'payment_general_options' ),
130
-
131
- ) );
132
-
133
- }
134
-
135
- return apply_filters( 'wcvendors_get_settings_' . $this->id, $settings, $current_section );
136
-
137
- }
138
-
139
- }
140
-
141
- endif;
142
-
143
- return new WCVendors_Settings_Payments();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/classes/sf-class-format-options.php DELETED
@@ -1,347 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Format an options array into HTML
5
- * This class has been deprecated
6
- *
7
- * @author Matt Gates <http://mgates.me>
8
- * @package WordPress
9
- */
10
-
11
-
12
- if ( !class_exists( 'SF_Format_Options' ) ) {
13
-
14
- class SF_Format_Options extends SF_Settings_API
15
- {
16
-
17
- /**
18
- * Format an option array into HTML
19
- *
20
- *
21
- * @access public
22
- *
23
- * @param unknown $setting
24
- *
25
- * @return string HTML.
26
- */
27
- public function settings_options_format( $setting )
28
- {
29
- if ( empty( $setting ) ) return false;
30
-
31
- $defaults = apply_filters( $this->id . '_options_defaults', array(
32
- 'name' => '',
33
- 'desc' => '',
34
- 'placeholder' => '',
35
- 'class' => '',
36
- 'tip' => '',
37
- 'id' => '',
38
- 'css' => '',
39
- 'type' => 'text',
40
- 'std' => '',
41
- 'select2' => false,
42
- 'multiple' => false,
43
- 'options' => array(),
44
- 'restrict' => array(),
45
- 'settings' => array()
46
- ) );
47
-
48
- // Each to it's own variable for slim-ness' sakes.
49
- $setting = shortcode_atts( $defaults, $setting );
50
-
51
- $restrict_defaults = array(
52
- 'min' => 0,
53
- 'max' => '',
54
- 'step' => 'any',
55
- );
56
-
57
- $setting[ 'restrict' ] = shortcode_atts( $restrict_defaults, $setting[ 'restrict' ] );
58
-
59
- $setting[ 'value' ] = $this->get_option( $setting[ 'id' ] );
60
- $setting[ 'value' ] = $setting[ 'value' ] !== false ? maybe_unserialize( $setting[ 'value' ] ) : false;
61
- $setting[ 'value' ] = SF_Format_Options::sanitize_value( $setting[ 'value' ], $setting );
62
-
63
- $setting[ 'title' ] = $setting[ 'name' ];
64
- $setting[ 'name' ] = $this->id . "_options[{$setting['id']}]";
65
-
66
- $setting[ 'grouped' ] = !$setting[ 'title' ] ? ' style="padding-top:0px;"' : '';
67
- $setting[ 'tip' ] = SF_Format_Options::get_formatted_tip( $setting[ 'tip' ] );
68
-
69
- $header_types = apply_filters( $this->id . '_options_header_types', array( 'heading', 'title' ) );
70
-
71
- extract( $setting );
72
-
73
- $description = $desc && !$grouped && $type != 'checkbox'
74
- ? '<br /><small>' . $desc . '</small>'
75
- : '<label for="' . $id . '"> ' . $desc . '</label>';
76
-
77
- $description = ( ( in_array( $type, $header_types ) || $type == 'radio' ) && !empty( $desc ) )
78
- ? '<p>' . $desc . '</p>'
79
- : $description;
80
-
81
- ?>
82
-
83
- <?php if ( !in_array( $type, $header_types ) ) : ?>
84
- <!-- Header of the option. -->
85
- <tr valign="top">
86
- <th scope="row"<?php echo $grouped; ?>>
87
-
88
- <?php echo $tip; ?>
89
-
90
- <?php if ( !$grouped ) : ?>
91
- <label for="<?php echo $name; ?>" class="description"><?php echo $title; ?></label>
92
- <?php endif; ?>
93
-
94
- </th>
95
- <td <?php echo $grouped; ?> >
96
- <?php endif; ?>
97
-
98
- <?php foreach ( $header_types as $header ) :
99
- if ( $type != $header ) continue; ?>
100
- <tr>
101
- <th scope="col" colspan="2">
102
- <h3 class="title"><?php echo $title; ?></h3>
103
- <?php echo $description; ?>
104
- </th>
105
- </tr>
106
- <?php endforeach; ?>
107
-
108
- <?php switch ( $type ) :
109
-
110
- case 'text' :
111
- case 'color' :
112
- case 'number' :
113
- if ( $type == 'color' ) {
114
- $type = 'text';
115
- $class .= ' colorpick';
116
- $description .= '<div id="colorPickerDiv_' . $id . '" class="colorpickdiv" style="z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;display:none;"></div>';
117
- }
118
- ?>
119
- <input name="<?php echo $name; ?>"
120
- id="<?php echo $id; ?>"
121
- type="<?php echo $type; ?>"
122
-
123
- <?php if ( $type == 'number' ): ?>
124
- min="<?php echo $restrict[ 'min' ]; ?>"
125
- max="<?php echo $restrict[ 'max' ]; ?>"
126
- step="<?php echo $restrict[ 'step' ]; ?>"
127
- <?php endif; ?>
128
-
129
- class="regular-text <?php echo $class; ?>"
130
- style="<?php echo $css; ?>"
131
- placeholder="<?php echo $placeholder; ?>"
132
- value="<?php echo $value !== false ? $value : $std; ?>"
133
- />
134
- <?php echo $description;
135
- break;
136
-
137
- case 'checkbox':
138
-
139
- $selected = ( $value !== false ) ? $value : $std;
140
-
141
- if ( $multiple ) :
142
-
143
- foreach ( $options as $key => $desc ) : ?>
144
-
145
- <input name="<?php echo $name; ?><?php echo $multiple ? '[]' : ''; ?>"
146
- id="<?php echo $id . '_' . $key; ?>"
147
- type="checkbox"
148
- class="<?php echo $class; ?>"
149
- style="<?php echo $css; ?>"
150
- value="<?php echo $key; ?>"
151
- <?php self::checked( $value, $key ); ?>
152
- />
153
- <label for="<?php echo $id . '_' . $key; ?>">
154
- <?php echo $desc; ?>
155
- </label>
156
- <br/>
157
- <?php
158
-
159
- endforeach;
160
-
161
- else : ?>
162
-
163
- <input name="<?php echo $name; ?>"
164
- id="<?php echo $id ?>"
165
- type="checkbox"
166
- class="<?php echo $class; ?>"
167
- style="<?php echo $css; ?>"
168
- <?php checked( $selected, 1 ); ?>
169
- />
170
- <?php echo $description;
171
- endif;
172
- break;
173
-
174
- case 'radio':
175
-
176
- $selected = ( $value !== false ) ? $value : $std;
177
-
178
- foreach ( $options as $key => $val ) : ?>
179
- <label class="radio">
180
- <input type="radio"
181
- name="<?php echo $name; ?>"
182
- id="<?php echo $key; ?>"
183
- value="<?php echo $key; ?>"
184
- class="<?php echo $class; ?>"
185
- <?php checked( $selected, $key ); ?>
186
- />
187
- <?php echo $val; ?>
188
- </label><br/>
189
- <?php endforeach;
190
- echo $description;
191
- break;
192
-
193
- case 'single_select_page':
194
-
195
- $selected = ( $value !== false ) ? $value : $std;
196
-
197
- $args = array(
198
- 'name' => $name,
199
- 'id' => $id,
200
- 'sort_order' => 'ASC',
201
- 'echo' => 0,
202
- 'selected' => $selected
203
- );
204
-
205
- echo str_replace( "'>", "'><option></option>", wp_dropdown_pages( $args ) );
206
-
207
- echo $description;
208
-
209
- if ( $select2 ) : ?>
210
- <script type="text/javascript">jQuery(function () {
211
- jQuery("#<?php echo $id; ?>").select2({ allowClear: true, placeholder: "<?php _e( 'Select a page...', 'wcvendors' ); ?>", width: '350px' });
212
- });</script>
213
- <?php endif;
214
-
215
- break;
216
-
217
- case 'select':
218
-
219
- $selected = ( $value !== false ) ? $value : $std;
220
- $options = apply_filters( $this->id . '_select_options', $options, $setting ); ?>
221
-
222
- <select id="<?php echo $id; ?>"
223
- class="<?php echo $class; ?>"
224
- style="<?php echo $css; ?>"
225
- name="<?php echo $name; ?><?php echo $multiple ? '[]' : ''; ?>"
226
- <?php echo $multiple ? 'multiple="multiple"' : ''; ?>>
227
-
228
- <?php foreach ( $options as $key => $val ) : ?>
229
- <option
230
- value="<?php echo $key; ?>" <?php self::selected( $selected, $key ); ?>><?php echo $val; ?></option>
231
- <?php endforeach; ?>
232
- </select>
233
-
234
- <?php echo $description;
235
-
236
- if ( $select2 ) : ?>
237
- <script type="text/javascript">jQuery(function () {
238
- jQuery("#<?php echo $id; ?>").select2({ width: '350px' });
239
- });</script>
240
- <?php endif;
241
-
242
- break;
243
-
244
- case 'textarea':
245
- ?>
246
- <textarea name="<?php echo $name; ?>"
247
- id="<?php echo $id; ?>"
248
- class="large-text <?php echo $class; ?>"
249
- style="<?php if ( $css ) echo $css; else echo 'width:300px;'; ?>"
250
- placeholder="<?php echo $placeholder; ?>"
251
- rows="3"
252
- ><?php echo ( $value !== false ) ? $value : $std; ?></textarea>
253
- <?php echo $description;
254
- break;
255
-
256
- case 'wysiwyg':
257
- wp_editor( $value, $id, array( 'textarea_name' => $name ) );
258
- echo $description;
259
- break;
260
-
261
- default :
262
- do_action( $this->id . '_options_type_' . $type, $setting );
263
- break;
264
-
265
- endswitch;
266
-
267
- /* Footer of the option. */
268
- if ( !in_array( $type, $header_types ) ) echo '</td></tr>';
269
-
270
- }
271
-
272
-
273
- /**
274
- *
275
- *
276
- * @param unknown $haystack
277
- * @param unknown $current
278
- */
279
- private function selected( $haystack, $current )
280
- {
281
-
282
- if ( is_array( $haystack ) && in_array( $current, $haystack ) ) {
283
- $current = $haystack = 1;
284
- }
285
-
286
- selected( $haystack, $current );
287
- }
288
-
289
-
290
- /**
291
- *
292
- *
293
- * @param unknown $haystack
294
- * @param unknown $current
295
- */
296
- private function checked( $haystack, $current )
297
- {
298
-
299
- if ( is_array( $haystack ) && !empty( $haystack[ $current ] ) ) {
300
- $current = $haystack = 1;
301
- }
302
-
303
- checked( $haystack, $current );
304
- }
305
-
306
-
307
- /**
308
- * Format a tooltip given a string
309
- *
310
- * @param string $tip
311
- *
312
- * @return string
313
- */
314
- private function get_formatted_tip( $tip )
315
- {
316
- return $tip ? sprintf( '<a href="#" title="%s" class="sf-tips" tabindex="99"></a>', $tip ) : '';
317
- }
318
-
319
-
320
- /**
321
- *
322
- *
323
- * @param unknown $value
324
- * @param unknown $setting
325
- *
326
- * @return unknown
327
- */
328
- private function sanitize_value( $value, $setting )
329
- {
330
- if ( $value !== false && $setting[ 'type' ] != 'wysiwyg' ) {
331
- if ( is_array( $value ) ) {
332
- foreach ( $value as $key => $output ) {
333
- $value[ $key ] = esc_attr( $output );
334
- }
335
- } else {
336
- $value = esc_attr( $value );
337
- }
338
- }
339
-
340
- return apply_filters( $this->id . '_options_sanitize_value', $value, $setting );
341
- }
342
-
343
-
344
- }
345
-
346
-
347
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/classes/sf-class-sanitize.php DELETED
@@ -1,199 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * Sanitize filters
5
- *
6
- * @author Matt Gates <http://mgates.me>
7
- * @package WordPress
8
- */
9
-
10
-
11
- if ( !class_exists( 'SF_Sanitize' ) ) {
12
-
13
- class SF_Sanitize
14
- {
15
-
16
-
17
- /**
18
- * Hooks
19
- */
20
- function __construct()
21
- {
22
- add_filter( 'geczy_sanitize_color', 'sanitize_text_field' );
23
- add_filter( 'geczy_sanitize_text', 'sanitize_text_field' );
24
- add_filter( 'geczy_sanitize_number', array( 'SF_Sanitize', 'sanitize_number_field' ) );
25
- add_filter( 'geczy_sanitize_textarea', array( 'SF_Sanitize', 'sanitize_textarea' ) );
26
- add_filter( 'geczy_sanitize_wysiwyg', array( 'SF_Sanitize', 'sanitize_wysiwyg' ) );
27
- add_filter( 'geczy_sanitize_checkbox', array( 'SF_Sanitize', 'sanitize_checkbox' ), 10, 2 );
28
- add_filter( 'geczy_sanitize_radio', array( 'SF_Sanitize', 'sanitize_enum' ), 10, 2 );
29
- add_filter( 'geczy_sanitize_select', array( 'SF_Sanitize', 'sanitize_enum' ), 10, 2 );
30
- add_filter( 'geczy_sanitize_image', array( 'SF_Sanitize', 'sanitize_image_url' ), 10, 2 );
31
- add_filter( 'geczy_sanitize_single_select_page', array( 'SF_Sanitize', 'sanitize_select_pages' ), 10, 2 );
32
- add_filter( 'geczy_sanitize_multi_select_page', array( 'SF_Sanitize', 'sanitize_multi_pages' ), 10, 2 );
33
- }
34
-
35
-
36
- /**
37
- * Numeric sanitization
38
- *
39
- * @param int $input
40
- *
41
- * @return int
42
- */
43
- public static function sanitize_number_field( $input )
44
- {
45
- $output = is_numeric( $input ) ? (float) $input : false;
46
-
47
- return $input;
48
- }
49
-
50
-
51
- /**
52
- * Textarea sanitization
53
- *
54
- * @param string $input
55
- *
56
- * @return string
57
- */
58
- public static function sanitize_textarea( $input )
59
- {
60
- global $allowedposttags;
61
- $output = wp_kses( $input, $allowedposttags );
62
-
63
- return $output;
64
- }
65
-
66
-
67
- /**
68
- * WYSIWYG sanitization
69
- *
70
- * @param string $input
71
- *
72
- * @return string
73
- */
74
- public static function sanitize_wysiwyg( $input )
75
- {
76
- return $input;
77
- }
78
-
79
-
80
- /**
81
- * Checkbox sanitization
82
- *
83
- * @param int $input
84
- * @param unknown $option
85
- *
86
- * @return int
87
- */
88
- public static function sanitize_checkbox( $input, $option )
89
- {
90
- if ( !empty( $option[ 'multiple' ] ) ) {
91
-
92
- $defaults = array_keys( $option[ 'options' ] );
93
-
94
- foreach ( $defaults as $value ) {
95
-
96
- if ( !is_array( $input ) ) {
97
- $output[ $value ] = 0;
98
- } else {
99
- $output[ $value ] = in_array( $value, $input ) ? 1 : 0;
100
- }
101
-
102
- }
103
-
104
- $output = serialize( $output );
105
- } else {
106
- $output = $input ? 1 : 0;
107
- }
108
-
109
- return $output;
110
- }
111
-
112
-
113
- /**
114
- * Array sanitization
115
- *
116
- * @param unknown $input
117
- * @param array $option
118
- *
119
- * @return bool
120
- */
121
- public static function sanitize_enum( $input, $option )
122
- {
123
- $output = $input;
124
-
125
- $sfs = new SF_Sanitize();
126
-
127
- if ( is_array( $input ) ) {
128
- foreach ( $input as $value ) {
129
- if ( !$sfs->sanitize_enum( $value, $option ) ) {
130
- $output = false;
131
- break;
132
- }
133
- }
134
- $output = $output ? serialize( $output ) : $output;
135
- } else {
136
- $output = array_key_exists( $input, $option[ 'options' ] ) ? $input : false;
137
- }
138
-
139
- return $output;
140
- }
141
-
142
-
143
- /**
144
- * Select box for pages sanitize
145
- *
146
- * @param int $input
147
- * @param int $option
148
- *
149
- * @return int
150
- */
151
- public static function sanitize_select_pages( $input, $option )
152
- {
153
- $output = get_page( $input ) ? (int) $input : 0;
154
-
155
- return $output;
156
- }
157
-
158
- /**
159
- * Select box for pages sanitize
160
- *
161
- * @param int $input
162
- * @param int $option
163
- *
164
- * @return int
165
- */
166
- public static function sanitize_multi_pages( $input, $option )
167
- {
168
-
169
- foreach ( $input as $value ){
170
- $output[ $value ] = get_page( $value ) ? (int) $value : 0;
171
- }
172
-
173
- // $output = serialize( $output );
174
-
175
-
176
- return $output;
177
- }
178
-
179
-
180
-
181
- /**
182
- * Image uploader
183
- *
184
- * @param url $input
185
- *
186
- * @return int
187
- */
188
- public static function sanitize_image_url( $input, $option ) {
189
-
190
- $output = $input;
191
- return $output;
192
-
193
- }
194
-
195
-
196
- }
197
-
198
-
199
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/classes/sf-class-settings.php DELETED
@@ -1,978 +0,0 @@
1
- <?php
2
-
3
- /**
4
- * WP-Simple-Settings-Framework
5
- *
6
- * Copyright (c) 2012 Matt Gates.
7
- * All rights reserved.
8
- *
9
- * Redistribution and use in source and binary forms, with or without
10
- * modification, are permitted provided that the following conditions
11
- * are met:
12
- *
13
- * * Redistributions of source code must retain the above copyright
14
- * notice, this list of conditions and the following disclaimer.
15
- *
16
- * * Redistributions in binary form must reproduce the above copyright
17
- * notice, this list of conditions and the following disclaimer in
18
- * the documentation and/or other materials provided with the
19
- * distribution.
20
- *
21
- * * Neither the names of the copyright holders nor the names of the
22
- * contributors may be used to endorse or promote products derived
23
- * from this software without specific prior written permission.
24
- *
25
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
28
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
29
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
30
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
31
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
33
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
35
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36
- * POSSIBILITY OF SUCH DAMAGE.
37
- *
38
- * @subpackage WP-Simple-Settings-Framework
39
- * @copyright 2012 Matt Gates.
40
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
41
- * @link http://mgates.me
42
- * @version 1.1
43
- * @author Matt Gates <info@mgates.me>
44
- * @package WordPress
45
- */
46
-
47
-
48
- if ( !class_exists( 'SF_Settings_API' ) ) {
49
-
50
- class SF_Settings_API
51
- {
52
-
53
- private $data = array();
54
-
55
- /**
56
- * Init
57
- *
58
- * @param string $id
59
- * @param string $title
60
- * @param string $menu (optional)
61
- * @param string $file
62
- */
63
- public function __construct( $id, $title, $menu = '', $file )
64
- {
65
- $this->assets_url = trailingslashit( plugins_url( 'assets/', dirname( __FILE__ ) ) );
66
- $this->id = $id;
67
- $this->title = $title;
68
- $this->menu = empty( $menu ) ? 'plugins.php' : $menu;
69
-
70
- $this->file = $file;
71
-
72
- $this->includes();
73
- $this->actions();
74
- }
75
-
76
-
77
- // ==================================================================
78
- //
79
- // Getter and setter.
80
- //
81
- // ------------------------------------------------------------------
82
-
83
- /**
84
- * Setter
85
- *
86
- * @param unknown $name
87
- * @param unknown $value
88
- */
89
- public function __set( $name, $value )
90
- {
91
- if ( isset ( $this->data[ $name ] ) && is_array( $this->data[ $name ] ) ) {
92
- $this->data[ $name ] = array_merge( $this->data[ $name ], $value );
93
- } else {
94
- $this->data[ $name ] = $value;
95
- }
96
- }
97
-
98
-
99
- /**
100
- * Getter
101
- *
102
- * @param unknown $name
103
- *
104
- * @return unknown
105
- */
106
- public function __get( $name )
107
- {
108
- if ( array_key_exists( $name, $this->data ) ) {
109
- return $this->data[ $name ];
110
- }
111
-
112
- return null;
113
- }
114
-
115
-
116
- /**
117
- * Isset
118
- *
119
- * @param unknown $name
120
- *
121
- * @return unknown
122
- */
123
- public function __isset( $name )
124
- {
125
- return isset( $this->data[ $name ] );
126
- }
127
-
128
-
129
- /**
130
- * Unset
131
- *
132
- * @param unknown $name
133
- */
134
- public function __unset( $name )
135
- {
136
- unset( $this->data[ $name ] );
137
- }
138
-
139
-
140
- /**
141
- * Add a "Settings" link to the plugins.php page
142
- *
143
- * @param array $links
144
- * @param array $file
145
- *
146
- * @return array
147
- */
148
- public function add_settings_link( $links, $file )
149
- {
150
- $this_plugin = plugin_basename( $this->file );
151
- $page = strpos( $this->menu, '.php' ) ? $this->menu : 'admin.php';
152
- if ( $file == $this_plugin ) {
153
- $settings_link = '<a href="' . $page . '?page=' . $this->id . '">' . __( 'Settings', 'wcvendors' ) . '</a>';
154
- array_unshift( $links, $settings_link );
155
- }
156
-
157
- return $links;
158
- }
159
-
160
-
161
- // ==================================================================
162
- //
163
- // Begin initialization.
164
- //
165
- // ------------------------------------------------------------------
166
-
167
- /**
168
- * Core files
169
- */
170
- private function includes()
171
- {
172
- require_once dirname( __FILE__ ) . '/sf-class-sanitize.php';
173
- require_once dirname( __FILE__ ) . '/sf-class-format-options.php';
174
- new SF_Sanitize;
175
- }
176
-
177
-
178
- /**
179
- * Hooks
180
- */
181
- private function actions()
182
- {
183
- add_action( 'admin_enqueue_scripts', array( &$this, 'admin_enqueue_scripts' ) );
184
- add_action( 'admin_init', array( &$this, 'register_options' ) );
185
- add_action( 'admin_menu', array( &$this, 'create_menu' ) );
186
- add_filter( 'plugin_action_links', array( &$this, 'add_settings_link' ), 10, 2 );
187
- }
188
-
189
-
190
- /**
191
- * Admin scripts and styles
192
- */
193
- public function admin_enqueue_scripts()
194
- {
195
-
196
- $screen = get_current_screen();
197
- $screen_id = $screen->id;
198
-
199
- if ( $screen_id === 'woocommerce_page_wc_prd_vendor') {
200
- wp_register_script( 'bootstrap-tooltip', $this->assets_url . 'js/bootstrap-tooltip.js', array( 'jquery' ), '1.0' );
201
- wp_register_script( 'select2', $this->assets_url . 'js/select2/select2.min.js', array( 'jquery' ), '3.5.2' );
202
- wp_register_script( 'wcvendors-media', $this->assets_url . 'js/wcvendors-media.js', array( 'jquery' ), '1.0' );
203
- wp_register_script( 'sf-scripts', $this->assets_url . 'js/sf-jquery.js', array( 'jquery' ), '1.0' );
204
- wp_register_style( 'select2', $this->assets_url . 'js/select2/select2.css' );
205
- wp_register_style( 'sf-styles', $this->assets_url . 'css/sf-styles.css' );
206
- }
207
- }
208
-
209
-
210
- /**
211
- * Admin scripts and styles
212
- */
213
- public function admin_print_scripts()
214
- {
215
- global $wp_version;
216
-
217
- //Check wp version and load appropriate scripts for colorpicker.
218
- if ( 3.5 <= $wp_version ) {
219
- wp_enqueue_style( 'wp-color-picker' );
220
- wp_enqueue_script( 'wp-color-picker' );
221
- } else {
222
- wp_enqueue_style( 'farbtastic' );
223
- wp_enqueue_script( 'farbtastic' );
224
- }
225
-
226
- wp_enqueue_script( 'bootstrap-tooltip' );
227
- wp_enqueue_script( 'select2' );
228
- wp_enqueue_script( 'wcvendors-media' );
229
- wp_enqueue_script( 'sf-scripts' );
230
-
231
- wp_enqueue_style( 'wp-color-picker' );
232
- wp_enqueue_style( 'select2' );
233
- wp_enqueue_style( 'sf-styles' );
234
- }
235
-
236
-
237
- /**
238
- * Register setting
239
- */
240
- public function register_options()
241
- {
242
- register_setting( $this->id . '_options_nonce', $this->id . '_options', array( &$this, 'validate_options' ) );
243
- }
244
-
245
-
246
- /**
247
- * Create menu
248
- */
249
- public function create_menu()
250
- {
251
- $page = add_submenu_page( $this->menu, $this->title, $this->title, apply_filters( $this->id . '_manage_options', 'manage_options' ), $this->id, array( &$this, 'init_settings_page' ) );
252
- add_action( 'admin_print_scripts-' . $page, array( &$this, 'admin_print_scripts' ) );
253
- }
254
-
255
-
256
- /**
257
- * Parse options into tabbed organization
258
- *
259
- * @return array
260
- */
261
- private function parse_options()
262
- {
263
- $options = $this->options;
264
-
265
- foreach ( $options as $option ) {
266
-
267
- if ( $option[ 'type' ] == 'heading' ) {
268
- $tab_name = sanitize_title( $option[ 'name' ] );
269
- $this->tab_headers = array( $tab_name => $option[ 'name' ] );
270
-
271
- continue;
272
- }
273
-
274
- $option[ 'tab' ] = $tab_name;
275
- $tabs[ $tab_name ][ ] = $option;
276
-
277
- }
278
-
279
- $this->tabs = $tabs;
280
-
281
- return $tabs;
282
- }
283
-
284
-
285
- /**
286
- * Load the options array from a file
287
- *
288
- * @param string $option_file
289
- */
290
- public function load_options( $option_file )
291
- {
292
- if ( !empty( $this->options ) ) return;
293
-
294
- if ( file_exists( $option_file ) ) {
295
- require $option_file;
296
- $this->options = apply_filters( $this->id . '_options', $options );
297
- $this->parse_options();
298
-
299
- $this->current_options = $this->get_current_options();
300
-
301
- /* If the option has no saved data, load the defaults. */
302
- /* @TODO: Can prob add this to the activation hook. */
303
- $this->set_defaults( $this->current_options );
304
- } else {
305
- wp_die( __( 'Could not load settings at: ', 'wcvendors' ) . '<br/><code>' . $option_file . '</code>', __( 'Error - WP Settings Framework', 'wcvendors' ) );
306
- }
307
- }
308
-
309
-
310
- /**
311
- *
312
- *
313
- * @return unknown
314
- */
315
- public function get_current_options()
316
- {
317
- if ( !empty( $this->current_options ) )
318
- return $this->current_options;
319
-
320
- $options = get_option( $this->id . '_options' );
321
-
322
- if ( $options ) {
323
- $options = array_map( 'maybe_unserialize', $options );
324
- }
325
-
326
- return $options;
327
- }
328
-
329
-
330
- /**
331
- * Sanitize and validate post fields
332
- *
333
- * @param unknown $input
334
- *
335
- * @return unknown
336
- */
337
- public function validate_options( $input )
338
- {
339
- if ( !isset( $_POST[ 'update' ] ) )
340
- return $this->get_defaults();
341
-
342
- $clean = $this->current_options;
343
- $tabname = $_POST[ 'currentTab' ];
344
-
345
- foreach ( $this->tabs[ $tabname ] as $option ) :
346
-
347
- if ( !isset( $option[ 'id' ] ) )
348
- continue;
349
-
350
- if ( !isset( $option[ 'type' ] ) )
351
- continue;
352
-
353
- if ( $option[ 'type' ] == 'select' ) {
354
- $option[ 'options' ] = apply_filters( $this->id . '_select_options', $option[ 'options' ], $option );
355
- }
356
-
357
- $id = sanitize_text_field( strtolower( $option[ 'id' ] ) );
358
-
359
- // Set checkbox to false if it wasn't sent in the $_POST
360
- if ( 'checkbox' == $option[ 'type' ] && !isset( $input[ $id ] ) )
361
- $input[ $id ] = 0;
362
-
363
- // For a value to be submitted to database it must pass through a sanitization filter
364
- if ( has_filter( 'geczy_sanitize_' . $option[ 'type' ] ) ) {
365
- $clean[ $id ] = apply_filters( 'geczy_sanitize_' . $option[ 'type' ], $input[ $id ], $option );
366
- }
367
-
368
- endforeach;
369
-
370
- do_action( $this->id . '_options_updated', $clean, $tabname );
371
- add_settings_error( $this->id, 'save_options', __( 'Settings saved.', 'wcvendors' ), 'updated' );
372
-
373
- update_option( WC_Vendors::$id . '_flush_rules', true );
374
-
375
- return apply_filters( $this->id . '_options_on_update', $clean, $tabname );
376
- }
377
-
378
-
379
- /**
380
- * Create default options
381
- *
382
- * @param unknown $current_options (optional)
383
- */
384
- private function set_defaults( $current_options = array() )
385
- {
386
- $options = $this->get_defaults( $current_options );
387
- if ( $options ) {
388
- update_option( $this->id . '_options', $options );
389
- }
390
- }
391
-
392
-
393
- /**
394
- * Retrieve default options
395
- *
396
- * @param unknown $currents (optional)
397
- *
398
- * @return array
399
- */
400
- private function get_defaults( $currents = array() )
401
- {
402
- $output = array();
403
- $config = $this->options;
404
- $flag = false;
405
-
406
- if ( $currents ) {
407
- foreach ( $config as $value ) {
408
- if ( !isset( $value[ 'id' ] ) || !isset( $value[ 'std' ] ) || !isset( $value[ 'type' ] ) )
409
- continue;
410
-
411
- if ( !isset( $currents[ $value[ 'id' ] ] ) ) {
412
- $flag = true;
413
- }
414
- }
415
- }
416
-
417
- foreach ( $config as $option ) {
418
- if ( !isset( $option[ 'id' ] ) || !isset( $option[ 'std' ] ) || !isset( $option[ 'type' ] ) )
419
- continue;
420
-
421
- if ( $currents && isset( $currents[ $option[ 'id' ] ] ) ) {
422
- $output[ $option[ 'id' ] ] = $currents[ $option[ 'id' ] ];
423
- } else if ( has_filter( 'geczy_sanitize_' . $option[ 'type' ] ) ) {
424
- $output[ $option[ 'id' ] ] = apply_filters( 'geczy_sanitize_' . $option[ 'type' ], $option[ 'std' ], $option );
425
- }
426
- }
427
-
428
- if ( $currents ) {
429
- $output = array_merge( $currents, $output );
430
- }
431
-
432
- return !$flag && $currents ? array() : $output;
433
- }
434
-
435
-
436
- /**
437
- * HTML header
438
- */
439
- private function template_header()
440
- {
441
- ?>
442
- <div class="wrap">
443
- <h2><?php echo $this->title; ?></h2>
444
-
445
- <h2 class="nav-tab-wrapper">
446
- <?php echo $this->display_tabs(); ?>
447
- </h2><?php
448
-
449
- if ( !empty ( $_REQUEST[ 'settings-updated' ] ) )
450
- settings_errors();
451
-
452
- }
453
-
454
-
455
- /**
456
- * HTML body
457
- *
458
- * @return unknown
459
- */
460
- private function template_body()
461
- {
462
-
463
- if ( empty( $this->options ) ) return false;
464
-
465
-
466
- $options = $this->options;
467
- $tabs = $this->get_tabs();
468
- $tabname = !empty ( $_GET[ 'tab' ] ) ? $_GET[ 'tab' ] : $tabs[ 0 ][ 'slug' ];
469
-
470
- $options = apply_filters( $this->id . '_options_tab-' . $tabname, $this->tabs[ $tabname ] ); ?>
471
-
472
- <form method="post" action="options.php">
473
- <?php settings_fields( $this->id . '_options_nonce' ); ?>
474
- <table class="form-table">
475
-
476
- <?php
477
- foreach ( $options as $value ) :
478
- $this->settings_options_format( $value );
479
- endforeach;
480
-
481
- do_action( $this->id . '_options_tab-' . $tabname );
482
- ?>
483
-
484
- </table>
485
-
486
- <p class="submit">
487
- <input type="hidden" name="currentTab" value="<?php echo $tabname; ?>">
488
- <input type="submit" name="update" class="button-primary"
489
- value="<?php echo sprintf( __( 'Save %s changes', 'wcvendors' ), $this->tab_headers[ $tabname ] ); ?>"/>
490
- </p>
491
- </form> <?php
492
-
493
- }
494
-
495
-
496
- /**
497
- * HTML footer
498
- */
499
- private function template_footer()
500
- {
501
-
502
- $message = apply_filters( 'wcvendors_footer_msg', __( 'Please help with a <a href="https://wordpress.org/support/view/plugin-reviews/wc-vendors?rate=5#postform" target="top">High Five!</a> | <a href="https://www.wcvendors.com/product/wc-vendors-pro/?utm_source=plugin&utm_campaign=upgrade_promo" target="top">WC Vendors Pro</a> | <a href="https://www.wcvendors.com/product/stripe-commissions-gateway/?utm_source=plugin&utm_campaign=upgrade_promo" target="top">Stripe Commissions & Gateway</a> | <a href="https://docs.wcvendors.com/" target="top">Documentation</a> | <a href="https://wordpress.org/support/plugin/wc-vendors/" target="top">Free Support Forums</a>', 'wcvendors' ) );
503
-
504
- echo '<div><p>' . $message . '</a></p>';
505
- echo '</div>';
506
-
507
-
508
- }
509
-
510
-
511
- /**
512
- * Create the settings page
513
- */
514
- public function init_settings_page()
515
- {
516
-
517
- $this->template_header();
518
- $this->template_body();
519
- $this->template_footer();
520
-
521
- }
522
-
523
-
524
- /**
525
- * Retrieve tabs
526
- *
527
- * @return array
528
- */
529
- private function get_tabs()
530
- {
531
- $tabs = array();
532
- foreach ( $this->options as $option ) {
533
-
534
- if ( $option[ 'type' ] != 'heading' )
535
- continue;
536
-
537
- $option[ 'slug' ] = sanitize_title( $option[ 'name' ] );
538
- unset( $option[ 'type' ] );
539
-
540
- $tabs[ ] = $option;
541
- }
542
-
543
- return $tabs;
544
- }
545
-
546
-
547
- /**
548
- * Heading for navigation
549
- *
550
- * @return string
551
- */
552
- private function display_tabs()
553
- {
554
- $tabs = $this->get_tabs();
555
- $tabname = !empty ( $_GET[ 'tab' ] ) ? $_GET[ 'tab' ] : $tabs[ 0 ][ 'slug' ];
556
- $menu = '';
557
-
558
- foreach ( $tabs as $tab ) {
559
- $class = $tabname == $tab[ 'slug' ] ? 'nav-tab-active' : '';
560
-
561
- $fields = array(
562
- 'page' => $this->id,
563
- 'tab' => $tab[ 'slug' ],
564
- );
565
-
566
- $query = http_build_query( array_merge( $_GET, $fields ) );
567
- $menu .= sprintf( '<a id="%s-tab" class="nav-tab %s" title="%s" href="?%s">%s</a>', $tab[ 'slug' ], $class, $tab[ 'name' ], $query, esc_html( $tab[ 'name' ] ) );
568
- }
569
-
570
- return $menu;
571
- }
572
-
573
-
574
- /**
575
- * Update an option
576
- *
577
- * @param string $name
578
- * @param string $value
579
- *
580
- * @return bool
581
- */
582
- public function update_option( $name, $value )
583
- {
584
- // Overwrite the key/value pair
585
- $this->current_options = array( $name => $value ) + (array) $this->current_options;
586
-
587
- return update_option( $this->id . '_options', $this->current_options );
588
- }
589
-
590
-
591
- /**
592
- * Get an option
593
- *
594
- * @param string $name
595
- * @param string $default (optional)
596
- *
597
- * @return bool
598
- */
599
- public function get_option( $name, $default = false )
600
- {
601
- return isset( $this->current_options[ $name ] ) ? maybe_unserialize( $this->current_options[ $name ] ) : $default;
602
- }
603
-
604
-
605
- public function settings_options_format( $setting )
606
- {
607
- if ( empty( $setting ) ) return false;
608
-
609
- $defaults = apply_filters( $this->id . '_options_defaults', array(
610
- 'name' => '',
611
- 'desc' => '',
612
- 'placeholder' => '',
613
- 'class' => '',
614
- 'tip' => '',
615
- 'id' => '',
616
- 'css' => '',
617
- 'type' => 'text',
618
- 'std' => '',
619
- 'select2' => false,
620
- 'multiple' => false,
621
- 'options' => array(),
622
- 'restrict' => array(),
623
- 'settings' => array()
624
- ) );
625
-
626
- // Each to it's own variable for slim-ness' sakes.
627
- $setting = shortcode_atts( $defaults, $setting );
628
-
629
- $restrict_defaults = array(
630
- 'min' => 0,
631
- 'max' => '',
632
- 'step' => 'any',
633
- );
634
-
635
- $setting[ 'restrict' ] = shortcode_atts( $restrict_defaults, $setting[ 'restrict' ] );
636
-
637
- $setting[ 'value' ] = $this->get_option( $setting[ 'id' ] );
638
- $setting[ 'value' ] = $setting[ 'value' ] !== false ? maybe_unserialize( $setting[ 'value' ] ) : false;
639
- $setting[ 'value' ] = $this->sanitize_value( $setting[ 'value' ], $setting );
640
-
641
- $setting[ 'title' ] = $setting[ 'name' ];
642
- $setting[ 'name' ] = $this->id . "_options[{$setting['id']}]";
643
-
644
- $setting[ 'grouped' ] = !$setting[ 'title' ] ? ' style="padding-top:0px;"' : '';
645
- $setting[ 'tip' ] = $this->get_formatted_tip( $setting[ 'tip' ] );
646
-
647
- $header_types = apply_filters( $this->id . '_options_header_types', array( 'heading', 'title' ) );
648
-
649
- extract( $setting );
650
-
651
- $description = $desc && !$grouped && $type != 'checkbox'
652
- ? '<br /><small>' . $desc . '</small>'
653
- : '<label for="' . $id . '"> ' . $desc . '</label>';
654
-
655
- $description = ( ( in_array( $type, $header_types ) || $type == 'radio' ) && !empty( $desc ) )
656
- ? '<p>' . $desc . '</p>'
657
- : $description;
658
-
659
- ?>
660
-
661
- <?php if ( !in_array( $type, $header_types ) ) : ?>
662
- <!-- Header of the option. -->
663
- <tr valign="top">
664
- <th scope="row"<?php echo $grouped; ?>>
665
-
666
- <?php echo $tip; ?>
667
-
668
- <?php if ( !$grouped ) : ?>
669
- <label for="<?php echo $name; ?>" class="description"><?php echo $title; ?></label>
670
- <?php endif; ?>
671
-
672
- </th>
673
- <td <?php echo $grouped; ?> >
674
- <?php endif; ?>
675
-
676
- <?php foreach ( $header_types as $header ) :
677
- if ( $type != $header ) continue; ?>
678
- <tr>
679
- <th scope="col" colspan="2">
680
- <h3 class="title"><?php echo $title; ?></h3>
681
- <?php echo $description; ?>
682
- </th>
683
- </tr>
684
- <?php endforeach; ?>
685
-
686
- <?php switch ( $type ) :
687
-
688
- case 'text' :
689
- case 'color' :
690
- case 'number' :
691
- if ( $type == 'color' ) {
692
- $type = 'text';
693
- $class .= ' colorpick';
694
- $description .= '<div id="colorPickerDiv_' . $id . '" class="colorpickdiv" style="z-index: 100;background:#eee;border:1px solid #ccc;position:absolute;display:none;"></div>';
695
- }
696
- ?>
697
- <input name="<?php echo $name; ?>"
698
- id="<?php echo $id; ?>"
699
- type="<?php echo $type; ?>"
700
-
701
- <?php if ( $type == 'number' ): ?>
702
- min="<?php echo $restrict[ 'min' ]; ?>"
703
- max="<?php echo $restrict[ 'max' ]; ?>"
704
- step="<?php echo $restrict[ 'step' ]; ?>"
705
- <?php endif; ?>
706
-
707
- class="regular-text <?php echo $class; ?>"
708
- style="<?php echo $css; ?>"
709
- placeholder="<?php echo $placeholder; ?>"
710
- value="<?php echo $value !== false ? $value : $std; ?>"
711
- />
712
- <?php echo $description;
713
- break;
714
-
715
- case 'checkbox':
716
-
717
- $selected = ( $value !== false ) ? $value : $std;
718
-
719
- if ( $multiple ) :
720
-
721
- foreach ( $options as $key => $desc ) : ?>
722
-
723
- <input name="<?php echo $name; ?><?php echo $multiple ? '[]' : ''; ?>"
724
- id="<?php echo $id . '_' . $key; ?>"
725
- type="checkbox"
726
- class="<?php echo $class; ?>"
727
- style="<?php echo $css; ?>"
728
- value="<?php echo $key; ?>"
729
- <?php @checked( $selected[$key], 1 ); ?>
730
- />
731
- <label for="<?php echo $id . '_' . $key; ?>">
732
- <?php echo $desc; ?>
733
- </label>
734
- <br/>
735
- <?php
736
-
737
- endforeach;
738
-
739
- else : ?>
740
-
741
- <input name="<?php echo $name; ?>"
742
- id="<?php echo $id ?>"
743
- type="checkbox"
744
- class="<?php echo $class; ?>"
745
- style="<?php echo $css; ?>"
746
- <?php checked( $selected, 1 ); ?>
747
- />
748
- <?php echo $description;
749
- endif;
750
- break;
751
-
752
- case 'radio':
753
-
754
- $selected = ( $value !== false ) ? $value : $std;
755
-
756
- foreach ( $options as $key => $val ) : ?>
757
- <label class="radio">
758
- <input type="radio"
759
- name="<?php echo $name; ?>"
760
- id="<?php echo $key; ?>"
761
- value="<?php echo $key; ?>"
762
- class="<?php echo $class; ?>"
763
- <?php checked( $selected, $key ); ?>
764
- />
765
- <?php echo $val; ?>
766
- </label><br/>
767
- <?php endforeach;
768
- echo $description;
769
- break;
770
-
771
- case 'single_select_page':
772
-
773
- $selected = ( $value !== false ) ? $value : $std;
774
-
775
- if ( $value == 0 ) $selected = $std;
776
-
777
- $args = array(
778
- 'name' => $name,
779
- 'id' => $id,
780
- 'sort_order' => 'ASC',
781
- 'echo' => 0,
782
- 'selected' => $selected
783
- );
784
-
785
- echo str_replace( "'>", "'><option></option>", wp_dropdown_pages( $args ) );
786
-
787
- echo '<a href="post.php?post='.$selected.'&action=edit" class="button">'.__( 'Edit Page', 'wcvendors' ).'</a>';
788
- echo '<a href="'.get_permalink( $selected ). '" class="button">'.__( 'View Page', 'wcvendors' ).'</a>';
789
-
790
- echo $description;
791
-
792
- if ( $select2 ) : ?>
793
- <script type="text/javascript">jQuery(function () {
794
- jQuery("#<?php echo $id; ?>").select2({ allowClear: true, placeholder: "<?php _e( 'Select a page...', 'wcvendors' ); ?>", width: '350px', allowMultiple: true });
795
- });</script>
796
- <?php endif;
797
-
798
- break;
799
-
800
- case 'multi_select_page':
801
-
802
- // TODO get this working with multiple page selection
803
-
804
- $selected = ( $value !== false ) ? $value : $std;
805
- $selected = implode( ',', array_keys( $selected ) );
806
-
807
- if ( $value == 0 ) $selected = $std;
808
-
809
- $name = $name . '[]';
810
-
811
- $args = array(
812
- 'name' => $name,
813
- 'id' => $id,
814
- 'sort_order' => 'ASC',
815
- 'echo' => 0,
816
- 'selected' => $selected
817
- );
818
-
819
- echo str_replace( "'>", "' multiple=\"multiple\"><option></option>", wp_dropdown_pages( $args ) );
820
-
821
- echo '<a href="post.php?post='.$selected.'&action=edit" class="button">'.__( 'Edit Page', 'wcvendors' ).'</a>';
822
- echo '<a href="'.get_permalink( $selected ). '" class="button">'.__( 'View Page', 'wcvendors' ).'</a>';
823
-
824
- echo $description;
825
-
826
- if ( $select2 ) : ?>
827
- <script type="text/javascript">jQuery(function () {
828
- jQuery("#<?php echo $id; ?>").select2({ allowClear: true, placeholder: "<?php _e( 'Select a page...', 'wcvendors' ); ?>", width: '350px', allowMultiple: true });
829
- });</script>
830
- <?php endif;
831
-
832
- break;
833
-
834
-
835
- case 'select':
836
-
837
- $selected = ( $value !== false ) ? $value : $std;
838
- $options = apply_filters( $this->id . '_select_options', $options, $setting ); ?>
839
-
840
- <select id="<?php echo $id; ?>"
841
- class="<?php echo $class; ?>"
842
- style="<?php echo $css; ?>"
843
- name="<?php echo $name; ?><?php echo $multiple ? '[]' : ''; ?>"
844
- <?php echo $multiple ? 'multiple="multiple"' : ''; ?>>
845
-
846
- <?php foreach ( $options as $key => $val ) : ?>
847
- <option
848
- value="<?php echo $key; ?>" <?php self::selected( $selected, $key ); ?>><?php echo $val; ?></option>
849
- <?php endforeach; ?>
850
- </select>
851
-
852
- <?php echo $description;
853
-
854
- if ( $select2 ) : ?>
855
- <script type="text/javascript">jQuery(function () {
856
- jQuery("#<?php echo $id; ?>").select2({ width: '350px' });
857
- });</script>
858
- <?php endif;
859
-
860
- break;
861
-
862
- case 'textarea':
863
- ?>
864
- <textarea name="<?php echo $name; ?>"
865
- id="<?php echo $id; ?>"
866
- class="large-text <?php echo $class; ?>"
867
- style="<?php if ( $css ) echo $css; else echo 'width:300px;'; ?>"
868
- placeholder="<?php echo $placeholder; ?>"
869
- rows="3"
870
- ><?php echo ( $value !== false ) ? $value : $std; ?></textarea>
871
- <?php echo $description;
872
- break;
873
-
874
- case 'wysiwyg':
875
- wp_editor( $value, $id, array( 'textarea_name' => $name ) );
876
- echo $description;
877
- break;
878
-
879
- case 'image':
880
-
881
- if ( empty ( $value ) ) $value = $std;
882
-
883
- ?>
884
- <img class="wcv-image-container-<?php echo $id; ?>" src="<?php echo $value; ?>" alt="" style="max-width:100%;" />
885
- <br />
886
- <input id="wcv-add-<?php echo $id; ?>" type="button" class="<?php echo $class; ?>" value="<?php echo sprintf( __( 'Update %s', 'wcvendors' ), strtolower( $title ) ); ?>" data-id="<?php echo $id; ?>" data-save_button="<?php echo sprintf( __( 'Add %s', 'wcvendors' ), $title ); ?>" data-window_title="<?php echo sprintf( __( 'Add %s', 'wcvendors' ), strtolower( $title ) ); ?>" data-upload_notice="<?php echo sprintf( __( 'Upload an image for the %s', 'wcvendors' ), strtolower( $title ) ); ?>" />
887
- <input type="hidden" name="<?php echo $name; ?>" id="<?php echo $id; ?>" value="<?php echo $value; ?>">
888
- <?php
889
- break;
890
-
891
- default :
892
- do_action( $this->id . '_options_type_' . $type, $setting );
893
- break;
894
-
895
- endswitch;
896
-
897
- /* Footer of the option. */
898
- if ( !in_array( $type, $header_types ) ) echo '</td></tr>';
899
-
900
- }
901
-
902
-
903
- /**
904
- *
905
- *
906
- * @param unknown $haystack
907
- * @param unknown $current
908
- */
909
- private function selected( $haystack, $current )
910
- {
911
-
912
- if ( is_array( $haystack ) && in_array( $current, $haystack ) ) {
913
- $current = $haystack = 1;
914
- }
915
-
916
- selected( $haystack, $current );
917
- }
918
-
919
-
920
- /**
921
- *
922
- *
923
- * @param unknown $haystack
924
- * @param unknown $current
925
- */
926
- private function checked( $haystack, $current )
927
- {
928
-
929
- if ( is_array( $haystack ) && !empty( $haystack[ $current ] ) ) {
930
- $current = $haystack = 1;
931
- }
932
-
933
- checked( $haystack, $current );
934
- }
935
-
936
-
937
- /**
938
- * Format a tooltip given a string
939
- *
940
- * @param string $tip
941
- *
942
- * @return string
943
- */
944
- private function get_formatted_tip( $tip )
945
- {
946
- return $tip ? sprintf( '<a href="#" title="%s" class="sf-tips" tabindex="99"></a>', $tip ) : '';
947
- }
948
-
949
-
950
- /**
951
- *
952
- *
953
- * @param unknown $value
954
- * @param unknown $setting
955
- *
956
- * @return unknown
957
- */
958
- private function sanitize_value( $value, $setting )
959
- {
960
- if ( $value !== false && $setting[ 'type' ] != 'wysiwyg' ) {
961
- if ( is_array( $value ) ) {
962
- foreach ( $value as $key => $output ) {
963
- $value[ $key ] = esc_attr( $output );
964
- }
965
- } else {
966
- $value = esc_attr( $value );
967
- }
968
- }
969
-
970
- return apply_filters( $this->id . '_options_sanitize_value', $value, $setting );
971
- }
972
-
973
-
974
-
975
- }
976
-
977
-
978
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/settings/sf-options.php DELETED
@@ -1,363 +0,0 @@
1
- <?php
2
- $options = array();
3
-
4
- $options[ ] = array( 'name' => __( 'General', 'wcvendors' ), 'type' => 'heading' );
5
- $options[ ] = array( 'name' => __( 'General options', 'wcvendors' ), 'type' => 'title', 'desc' => '' );
6
-
7
- $options[ ] = array(
8
- 'name' => __( 'Default commission (%)', 'wcvendors' ),
9
- 'desc' => __( 'The default rate you pay each vendor for a product sale. <br>You can also give vendors their own individual commission rates by editing the vendors user account.<br>Also, you can edit an individual products commission to override both of these settings on a per product basis.', 'wcvendors' ),
10
- 'id' => 'default_commission',
11
- 'css' => 'width:70px;',
12
- 'type' => 'number',
13
- 'restrict' => array(
14
- 'min' => 0,
15
- 'max' => 100
16
- )
17
- );
18
-
19
- /* Customize registration message depending on if they have registration enabled on the my account page */
20
- $registration_message = __( 'Allow users or guests to apply to become a vendor', 'wcvendors' );
21
- if ( get_option( 'woocommerce_enable_myaccount_registration' ) === 'no' ) {
22
- $registration_message = __( 'Allow users or guests to apply to become a vendor. <br><br><strong>WARNING:</strong> You MUST "<strong>Enable registration on the "My Account" page</strong>" in your <strong>WooCommerce > Settings > Accounts</strong> page for this option to work. Currently, you have registration disabled.', 'wcvendors' );
23
- }
24
-
25
- $options[ ] = array(
26
- 'name' => __( 'Registration', 'wcvendors' ),
27
- 'desc' => __( 'Allow users or guests to apply to become a vendor', 'wcvendors' ),
28
- 'tip' => __( 'This will show a checkbox on the My Account page\'s registration form asking if the user would like to apply to be a vendor. Also, on the Vendor Dashboard, users can still apply to become a vendor even if this is disabled.', 'wcvendors' ),
29
- 'id' => 'show_vendor_registration',
30
- 'type' => 'checkbox',
31
- 'std' => true,
32
- );
33
-
34
- $options[ ] = array(
35
- 'desc' => __( 'Approve vendor applications manually', 'wcvendors' ),
36
- 'tip' => __( 'With this unchecked, all vendor applications are automatically accepted. Otherwise, you must approve each manually.', 'wcvendors' ),
37
- 'id' => 'manual_vendor_registration',
38
- 'type' => 'checkbox',
39
- 'std' => true,
40
- );
41
-
42
- $options[ ] = array(
43
- 'name' => __( 'Taxes', 'wcvendors' ),
44
- 'desc' => __( 'Give vendors any tax collected per-product', 'wcvendors' ),
45
- 'tip' => __( 'The tax collected on a vendor\'s product will be given in its entirety', 'wcvendors' ),
46
- 'id' => 'give_tax',
47
- 'type' => 'checkbox',
48
- 'std' => false,
49
- );
50
-
51
- $options[ ] = array(
52
- 'name' => __( 'Shipping', 'wcvendors' ),
53
- 'desc' => __( 'Give vendors any shipping collected per-product', 'wcvendors' ),
54
- 'tip' => __( 'WC Vendors Free - Give vendors shipping if using Per Product Shipping gateway. WC Vendors Pro - Give vendors shipping when using Vendor Shipping. No other shipping module is compatible with this option.', 'wcvendors' ),
55
- 'id' => 'give_shipping',
56
- 'type' => 'checkbox',
57
- 'std' => true,
58
- );
59
-
60
- $options[ ] = array( 'name' => __( 'Shop options', 'wcvendors' ), 'type' => 'title', 'desc' => '' );
61
-
62
- $options[ ] = array(
63
- 'name' => __( 'Shop HTML', 'wcvendors' ),
64
- 'desc' => __( 'Enable HTML for a vendor\'s shop description by default. You can enable or disable this per vendor by editing the vendors user account.', 'wcvendors' ),
65
- 'id' => 'shop_html_enabled',
66
- 'type' => 'checkbox',
67
- 'std' => true,
68
- );
69
-
70
- $options[ ] = array(
71
- 'name' => __( 'Vendor Shop Page', 'wcvendors' ),
72
- 'desc' => __( 'Enter one word for the URI. If you enter "<strong>vendors</strong>" your vendors store will be <code>yourdomain.com/vendors/store-name/</code>', 'wcvendors' ),
73
- 'id' => 'vendor_shop_permalink',
74
- 'type' => 'text',
75
- 'std' => 'vendors/',
76
- );
77
-
78
- $options[ ] = array(
79
- 'name' => __( 'Shop Headers', 'wcvendors' ),
80
- 'desc' => __( 'Enable vendor shop headers', 'wcvendors' ),
81
- 'tip' => __( 'This will override the HTML Shop description output on product-archive pages. In order to customize the shop headers visit wcvendors.com and read the article in the Knowledgebase titled Changing the Vendor Templates.', 'wcvendors' ),
82
- 'id' => 'shop_headers_enabled',
83
- 'type' => 'checkbox',
84
- 'std' => false,
85
- );
86
-
87
- $options[ ] = array(
88
- 'name' => __( 'Vendor Display Name', 'wcvendors' ),
89
- 'desc' => __( 'Select what will be displayed for the sold by text throughout the store.', 'wcvendors' ),
90
- 'id' => 'vendor_display_name',
91
- 'type' => 'select',
92
- 'options' => array(
93
- 'display_name' => __( 'Display Name', 'wcvendors'),
94
- 'shop_name' => __( 'Shop Name', 'wcvendors'),
95
- 'user_login' => __( 'User Login', 'wcvendors'),
96
- 'user_email' => __( 'User Email', 'wcvendors'),
97
- ),
98
- 'std' => 'shop_name'
99
-
100
- );
101
-
102
- $options[ ] = array(
103
- 'name' => __( 'Sold By', 'wcvendors' ),
104
- 'desc' => __( 'Enable sold by labels', 'wcvendors' ),
105
- 'tip' => __( 'This will enable or disable the sold by labels.', 'wcvendors' ),
106
- 'id' => 'sold_by',
107
- 'type' => 'checkbox',
108
- 'std' => true,
109
- );
110
-
111
- $options[ ] = array(
112
- 'name' => __( 'Sold By Label', 'wcvendors' ),
113
- 'desc' => __( 'The sold by label used on the site and emails.', 'wcvendors' ),
114
- 'id' => 'sold_by_label',
115
- 'type' => 'text',
116
- 'std' => __( 'Sold By', 'wcvendors' ),
117
- );
118
-
119
- $options[ ] = array(
120
- 'name' => __( 'Seller Info Label', 'wcvendors' ),
121
- 'desc' => __( 'The seller info tab title on the single product page.', 'wcvendors' ),
122
- 'id' => 'seller_info_label',
123
- 'type' => 'text',
124
- 'std' => __( 'Seller Info', 'wcvendors' ),
125
- );
126
-
127
- $options[ ] = array( 'name' => __( 'Products', 'wcvendors' ), 'type' => 'heading' );
128
- $options[ ] = array( 'name' => __( 'Product Add Page', 'wcvendors' ), 'type' => 'title', 'desc' => __( 'Configure what to hide from all vendors when adding a product', 'wcvendors' ) );
129
-
130
- $options[ ] = array(
131
- 'name' => __( 'Left side panel', 'wcvendors' ),
132
- 'desc' => __( 'CHECKING these boxes will **HIDE** these areas of the add product page for vendors', 'wcvendors' ),
133
- 'id' => 'hide_product_panel',
134
- 'options' => array(
135
- 'inventory' => __( 'Inventory', 'wcvendors' ),
136
- 'shipping' => __( 'Shipping', 'wcvendors' ),
137
- 'linked_product' => __( 'Linked Products', 'wcvendors' ),
138
- 'attribute' => __( 'Attributes', 'wcvendors' ),
139
- 'advanced' => __( 'Advanced', 'wcvendors' ),
140
- ),
141
- 'type' => 'checkbox',
142
- 'multiple' => true,
143
- );
144
-
145
- $options[ ] = array(
146
- 'name' => __( 'Types', 'wcvendors' ),
147
- 'desc' => __( 'CHECKING these boxes will HIDE these product types from the vendor', 'wcvendors' ),
148
- 'id' => 'hide_product_types',
149
- 'options' => array(
150
- 'simple' => __( 'Simple', 'wcvendors' ),
151
- 'variable' => __( 'Variable', 'wcvendors' ),
152
- 'grouped' => __( 'Grouped', 'wcvendors' ),
153
- 'external' => __( 'External / affiliate', 'wcvendors' ),
154
- ),
155
- 'type' => 'checkbox',
156
- 'multiple' => true,
157
- );
158
-
159
- $options[ ] = array(
160
- 'name' => __( 'Type options', 'wcvendors' ),
161
- 'desc' => __( 'CHECKING these boxes will **HIDE** these product options from the vendor', 'wcvendors' ),
162
- 'id' => 'hide_product_type_options',
163
- 'options' => array(
164
- 'virtual' => __( 'Virtual', 'wcvendors' ),
165
- 'downloadable' => __( 'Downloadable', 'wcvendors' ),
166
- ),
167
- 'type' => 'checkbox',
168
- 'multiple' => true,
169
- );
170
-
171
- $options[ ] = array(
172
- 'name' => __( 'Miscellaneous', 'wcvendors' ),
173
- 'id' => 'hide_product_misc',
174
- 'options' => array(
175
- 'taxes' => __( 'Taxes', 'wcvendors' ),
176
- 'sku' => __( 'SKU', 'wcvendors' ),
177
- 'featured' => __( 'Featured', 'wcvendors' ),
178
- 'duplicate' => __( 'Duplicate Product', 'wcvendors' ),
179
- ),
180
- 'type' => 'checkbox',
181
- 'multiple' => true,
182
- );
183
-
184
- $options[ ] = array(
185
- 'name' => __( 'Stylesheet', 'wcvendors' ),
186
- 'desc' => __( 'You can add CSS in this textarea, which will be loaded on the product add/edit page for vendors.', 'wcvendors' ),
187
- 'id' => 'product_page_css',
188
- 'type' => 'textarea',
189
- );
190
-
191
-
192
- $options[ ] = array( 'name' => __( 'Capabilities', 'wcvendors' ), 'type' => 'heading', 'id' => 'capabilities' );
193
- $options[ ] = array( 'name' => __( 'Permissions', 'wcvendors' ), 'id' => 'permissions', 'type' => 'title', 'desc' => __( 'General permissions used around the shop', 'wcvendors' ) );
194
-
195
- $options[ ] = array(
196
- 'name' => __( 'Orders', 'wcvendors' ),
197
- 'desc' => __( 'View orders', 'wcvendors' ),
198
- 'tip' => __( 'Show customer details such as email, address, name, etc, for each order', 'wcvendors' ),
199
- 'id' => 'can_show_orders',
200
- 'type' => 'checkbox',
201
- 'std' => true,
202
- );
203
-
204
- $options[ ] = array(
205
- 'desc' => __( 'View comments', 'wcvendors' ),
206
- 'tip' => __( 'View all vendor comments for an order on the frontend', 'wcvendors' ),
207
- 'id' => 'can_view_order_comments',
208
- 'type' => 'checkbox',
209
- 'std' => true,
210
- );
211
-
212
- $options[ ] = array(
213
- 'desc' => __( 'Submit comments', 'wcvendors' ),
214
- 'tip' => __( 'Submit comments for an order on the frontend. Eg, tracking ID for a product', 'wcvendors' ),
215
- 'id' => 'can_submit_order_comments',
216
- 'type' => 'checkbox',
217
- 'std' => true,
218
- );
219
-
220
- $options[ ] = array(
221
- 'desc' => __( 'View email addresses', 'wcvendors' ),
222
- 'tip' => __( 'While viewing order details on the frontend, you can disable or enable email addresses', 'wcvendors' ),
223
- 'id' => 'can_view_order_emails',
224
- 'type' => 'checkbox',
225
- 'std' => true,
226
- );
227
-
228
- $options[ ] = array(
229
- 'desc' => __( 'Export a CSV file of orders for a product', 'wcvendors' ),
230
- 'tip' => __( 'Vendors could export orders for a product on the frontend', 'wcvendors' ),
231
- 'id' => 'can_export_csv',
232
- 'type' => 'checkbox',
233
- 'std' => true,
234
- );
235
-
236
- $options[ ] = array(
237
- 'name' => __( 'Reports', 'wcvendors' ),
238
- 'desc' => __( '<strike>View backend sales reports</strike>. <strong>Depreciated</strong>', 'wcvendors' ),
239
- 'tip' => __( 'This option has been removed and will no longer function. It will be completely removed in future versions. Vendors should use their Vendor Dashboard for reports as all identical functionality is already there. ', 'wcvendors' ),
240
- 'id' => 'can_view_backend_reports',
241
- 'type' => 'checkbox',
242
- 'std' => false,
243
- );
244
-
245
- $options[ ] = array(
246
- 'desc' => __( 'View Frontend sales reports', 'wcvendors' ),
247
- 'tip' => __( 'Sales table on the frontend on the Vendor Dashboard page. The table will only display sales data that pertain to their products, and only for orders that are processing or completed.', 'wcvendors' ),
248
- 'id' => 'can_view_frontend_reports',
249
- 'type' => 'checkbox',
250
- 'std' => true,
251
- );
252
-
253
- $options[ ] = array(
254
- 'name' => __( 'Products', 'wcvendors' ),
255
- 'desc' => __( 'Submit products', 'wcvendors' ),
256
- 'tip' => __( 'Check to allow vendors to list new products. Admin must approve new products by editing the product, and clicking Publish.', 'wcvendors' ),
257
- 'id' => 'can_submit_products',
258
- 'type' => 'checkbox',
259
- 'std' => true,
260
- );
261
-
262
- $options[ ] = array(
263
- 'desc' => __( 'Edit live products', 'wcvendors' ),
264
- 'tip' => __( 'Vendors could edit an approved product after it has already gone live. There is no approval or review after editing a live product. This could be dangerous with malicious vendors, so take caution.', 'wcvendors' ),
265
- 'id' => 'can_edit_published_products',
266
- 'type' => 'checkbox',
267
- 'std' => false,
268
- );
269
-
270
- $options[ ] = array(
271
- 'desc' => __( 'Submit products live without requiring approval', 'wcvendors' ),
272
- 'tip' => __( 'Vendors can submit products without review or approval from a shop admin. This could be dangerous with malicious vendors, so take caution.', 'wcvendors' ),
273
- 'id' => 'can_submit_live_products',
274
- 'type' => 'checkbox',
275
- 'std' => false,
276
- );
277
-
278
- $options[ ] = array( 'name' => __( 'Pages', 'wcvendors' ), 'type' => 'heading' );
279
- $options[ ] = array( 'name' => __( 'Page configuration', 'wcvendors' ), 'type' => 'title', 'desc' => '' );
280
-
281
- $options[ ] = array(
282
- 'name' => __( 'Vendor dashboard', 'wcvendors' ),
283
- 'desc' => __( 'Choose the page that has the shortcode <code>[wcv_vendor_dashboard]</code><br/>. If this page is not set, you will break your site. If you upgrade to Pro, keep this page unchanged as both Pro Dashboard and this Dashboard page must be set.', 'wcvendors' ),
284
- 'id' => 'vendor_dashboard_page',
285
- 'type' => 'single_select_page',
286
- 'select2' => true,
287
- );
288
-
289
- $options[ ] = array(
290
- 'name' => __( 'Shop settings', 'wcvendors' ),
291
- 'desc' => __( 'Choose the page that has the shortcode <code>[wcv_shop_settings]</code><br/>These are the shop settings a vendor can configure. By default, Vendor Dashboard > Shop Settings should have this shortcode.', 'wcvendors' ),
292
- 'id' => 'shop_settings_page',
293
- 'type' => 'single_select_page',
294
- 'select2' => true,
295
- );
296
-
297
- $options[ ] = array(
298
- 'name' => __( 'Orders page', 'wcvendors' ),
299
- 'desc' => __( 'Choose the page that has the shortcode <code>[wcv_orders]</code><br/>By default, Vendor Dashboard > Orders should have the shortcode.', 'wcvendors' ),
300
- 'id' => 'product_orders_page',
301
- 'type' => 'single_select_page',
302
- 'select2' => true,
303
- );
304
-
305
- $options[ ] = array(
306
- 'name' => __( 'Vendor terms', 'wcvendors' ),
307
- 'desc' => __( 'These terms are shown to a user when submitting an application to become a vendor.<br/>If left blank, no terms will be shown to the applicant. Vendor must accept terms in order to register, if set.', 'wcvendors' ),
308
- 'id' => 'terms_to_apply_page',
309
- 'type' => 'single_select_page',
310
- 'select2' => true,
311
- );
312
-
313
- $total_due = 0;
314
- if ( !empty( $_GET[ 'tab' ] ) && $_GET[ 'tab' ] == __( 'payments', 'wcvendors' ) ) {
315
- global $wpdb;
316
-
317
- $table_name = $wpdb->prefix . "pv_commission";
318
- $query = "SELECT sum(total_due + total_shipping + tax) as total
319
- FROM `{$table_name}`
320
- WHERE status = %s";
321
- $results = $wpdb->get_results( $wpdb->prepare( $query, 'due' ) );
322
-
323
- $total_due = array_shift( $results )->total;
324
- }
325
- $options[ ] = array( 'name' => __( 'Payments', 'wcvendors' ), 'type' => 'heading' );
326
- $options[ ] = array(
327
- 'name' => __( 'PayPal Adaptive Payments Scheduling - PayPal MassPay has been depreciated by PayPal as of September 2017', 'wcvendors' ), 'type' => 'title', 'desc' =>
328
- sprintf( __( 'Total commission currently due: %s. <a href="%s">View details</a>.', 'wcvendors' ), !function_exists( 'wc_price' ) ? $total_due : wc_price( $total_due ), '?page=pv_admin_commissions' ) .
329
- '<br/><br/>' . sprintf( __( 'Make sure you update your PayPal Adaptive Payments settings <a href="%s">here</a>. <br><br>To instantly pay with Adaptive Payments you must activate the PayPal AP gateway in your Checkout settings. <br><a href="https://www.wcvendors.com/kb/configuring-paypal-adaptive-payments/" target="top">PayPal AP Application Help</a>. <br><br>Another gateway that offers instant payments to vendors that also accepts credit cards directly on your checkout page is Stripe. <br><a href="https://www.wcvendors.com/product/stripe-commissions-gateway/" target="top">Stripe Commissions & Gateway plugin</a> is $49 and specifically coded for WC Vendors and <a href="https://www.wcvendors.com/product/wc-vendors-pro/" target="top">WC Vendors Pro</a>.', 'wcvendors' ), 'admin.php?page=wc-settings&tab=checkout&section=wc_paypalap' )
330
- );
331
-
332
- $options[ ] = array(
333
- 'name' => __( 'Instant pay', 'wcvendors' ),
334
- 'desc' => __( 'Instantly pay vendors their commission when an order is made, and if a vendor has a valid PayPal email added on their Shop Settings page.', 'wcvendors' ),
335
- 'tip' => __( 'For this to work, customers must checkout with the PayPal Adaptive Payments gateway. Using any other gateways will not pay vendors instantly', 'wcvendors' ),
336
- 'id' => 'instapay',
337
- 'type' => 'checkbox',
338
- 'std' => true,
339
- );
340
-
341
- $options[ ] = array(
342
- 'name' => __( 'Payment schedule', 'wcvendors' ),
343
- 'desc' => __( 'Note: Schedule will only work if instant pay is unchecked', 'wcvendors' ),
344
- 'id' => 'schedule',
345
- 'type' => 'radio',
346
- 'std' => 'manual',
347
- 'options' => array(
348
- 'daily' => __( 'Daily', 'wcvendors' ),
349
- 'weekly' => __( 'Weekly', 'wcvendors' ),
350
- 'biweekly' => __( 'Biweekly', 'wcvendors' ),
351
- 'monthly' => __( 'Monthly', 'wcvendors' ),
352
- 'manual' => __( 'Manual', 'wcvendors' ),
353
- 'now' => '<span style="color:green;"><strong>' . __( 'Now', 'wcvendors' ) . '</strong></span>',
354
- )
355
- );
356
-
357
- $options[ ] = array(
358
- 'name' => __( 'Email notification', 'wcvendors' ),
359
- 'desc' => __( 'Send the WooCommerce admin an email each time a payment has been made via the payment schedule options above', 'wcvendors' ),
360
- 'id' => 'mail_mass_pay_results',
361
- 'type' => 'checkbox',
362
- 'std' => true,
363
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/html-admin-commission-page.php DELETED
@@ -1,39 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Settings
4
- *
5
- * @author Jamie Madden, WC Vendors
6
- * @category Admin
7
- * @package WCVendors/Admin
8
- * @version 2.0.0
9
- */
10
-
11
- if ( ! defined( 'ABSPATH' ) ) {
12
- exit;
13
- }
14
-
15
- $page = filter_input( INPUT_GET, 'page', FILTER_SANITIZE_STRIPPED );
16
- $paged = filter_input( INPUT_GET, 'paged', FILTER_SANITIZE_NUMBER_INT );
17
-
18
-
19
- ?>
20
- <div class="wrap">
21
-
22
- <div id="icon-woocommerce" class="icon32 icon32-woocommerce-reports"><br/></div>
23
- <h2><?php _e( 'Commission', 'wc-vendors' ); ?></h2>
24
- <form id="posts-filter" method="get">
25
-
26
- <?php printf( '<input type="hidden" name="page" value="%s" />', $page ); ?>
27
- <?php printf( '<input type="hidden" name="paged" value="%d" />', $paged ); ?>
28
-
29
- <input type="hidden" name="page" value="wcv-commissions"/>
30
-
31
- <?php $this->commissions_table->prepare_items(); ?>
32
- <?php $this->commissions_table->views(); ?>
33
- <?php $this->commissions_table->display(); ?>
34
-
35
- </form>
36
- <div id="ajax-response"></div>
37
-
38
- <br class="clear"/>
39
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/html-admin-page-extensions.php DELETED
@@ -1,92 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Page - Addons
4
- *
5
- * @var string $view
6
- * @var object $addons
7
- */
8
- if ( ! defined( 'ABSPATH' ) ) {
9
- exit;
10
- }
11
-
12
- ?>
13
- <div class="wrap woocommerce wcv_addons_wrap">
14
-
15
- <h1><?php _e( 'Upgrade your marketplace today!', 'wc-vendors' ); ?></h1>
16
- <br />
17
-
18
- <div class="addons-wcs-banner-block">
19
- <div class="addons-wcs-banner-block-image">
20
- <img class="addons-img" src="<?php echo wcv_assets_url; ?>images/extensions/screenshot-1.png" alt="WC Vendors Pro">
21
- <img class="addons-img" src="<?php echo wcv_assets_url; ?>images/extensions/screenshot-2.png" alt="WC Vendors Pro">
22
- <img class="addons-img" src="<?php echo wcv_assets_url; ?>images/extensions/screenshot-3.png" alt="WC Vendors Pro">
23
- </div>
24
- <div class="addons-wcs-banner-block-content">
25
- <h1><?php _e( 'WC Vendors Pro', 'wc-vendors'); ?></h1>
26
-
27
- <p><?php _e( 'Enhanced your marketplace with pro features and capabilities. Move all your vendors tasks to the frontend. They no longer need or see the WordPress admin. Shipping system included.', 'wc-vendors' ); ?></p>
28
-
29
- <h4>Features</h4>
30
-
31
- <ul class="feature-list">
32
- <li><?php _e( 'Vendors have a main dashboard showing sales reports and recent orders and products.', 'wc-vendors' ); ?></li>
33
- <li><?php _e( 'Vendors have complete front end product management', 'wc-vendors' ); ?></li>
34
- <li><?php _e( 'Vendors can add their own coupons that only apply to their products', 'wc-vendors' ); ?></li>
35
- <li><?php _e( 'Vendors have advanced shipment tracking including shipping providers', 'wc-vendors' ); ?></li>
36
- <li><?php _e( 'Vendors have the ability to print a shipping label with a picking list', 'wc-vendors' ); ?></li>
37
- <li><?php _e( 'Vendors can add all their own social media profile links', 'wc-vendors' ); ?></li>
38
- <li><?php _e( 'Vendors can add SEO to their store and products', 'wc-vendors' ); ?></li>
39
- <li><?php _e( 'Vendors can add their own banner and store icon', 'wc-vendors' ); ?></li>
40
- <li><?php _e( 'Vendors have a comprehensive shipping system available. Either flat rate or table rate based.', 'wc-vendors' ); ?></li>
41
- <li><?php _e( 'Vendor stores templates are more advanced', 'wc-vendors' ); ?></li>
42
- <li><?php _e( 'Vendors have more control over their order notes', 'wc-vendors' ); ?></li>
43
- <li><?php _e( 'Vendors vacation module is included as part of pro not an extra addon', 'wc-vendors' ); ?></li>
44
- <li><?php _e( 'Admins have multiple commission rate options including percentage, percentage + fee, fixed, fixed + fee.', 'wc-vendors' ); ?></li>
45
- <li><?php _e( 'Admins can set global shipping rates as well as allow different shipping modules per vendor. Setting one as flat rate, while another can be table rate', 'wc-vendors' ); ?></li>
46
- <li><?php _e( 'Ebay style feedback allows customers to rate the products from the vendors', 'wc-vendors' ); ?></li>
47
- <li><?php _e( 'Premium ticket based support for all pro users. Annual and lifetime support licenses available.', 'wc-vendors' ); ?></li>
48
- </ul>
49
-
50
-
51
- <a class="product-addons-button product-addons-button-solid" href="https://www.wcvendors.com/product/wc-vendors-pro/">From $199</a>
52
- </div>
53
- </div>
54
-
55
- <ul class="products">
56
- <li class="product">
57
- <a href="https://www.wcvendors.com/product/stripe-commissions-gateway/?utm_source=plugin&utm_medium=addons&utm_campaign=extensions">
58
- <h2><?php _e( 'WC Vendors Stripe Commissions &amp; Gateway', 'wc-vendors'); ?></h2>
59
- <p><?php _e( 'Pay your vendors their commissions instantly when the customer purchases. No need to manually pay your vendors.', 'wc-vendors'); ?></p>
60
- <span class="product-addons-button product-addons-button-solid"><?php _e( 'From $69', 'wc-vendors'); ?></span>
61
- </a>
62
- </li>
63
- <li class="product">
64
- <a href="https://www.wcvendors.com/product/woocommerce-bookings-integration/?utm_source=plugin&utm_medium=addons&utm_campaign=extensions">
65
- <h2><?php _e( 'WooCommerce Bookings Integration<', 'wc-vendors'); ?>/h2>
66
- <span class="price"><?php _e( 'From $69.00', 'wc-vendors'); ?></span>
67
- <p><?php _e( 'Allow vendors to create bookings. Integrate WooCommerce bookings into the WC Vendors Pro Dashboard.', 'wc-vendors'); ?></p>
68
- <span class="product-addons-button product-addons-button-solid"><?php _e( 'From $69', 'wc-vendors'); ?></span>
69
- </a>
70
- </li>
71
- <li class="product">
72
- <a href="https://www.wcvendors.com/product/woocommerce-simple-auctions-integration/?utm_source=plugin&utm_medium=addons&utm_campaign=extensions">
73
- <h2><?php _e( 'WooCommerce Simple Auctions', 'wc-vendors'); ?></h2>
74
- <p><?php _e( 'Integreate WooCommerce Simple Auctions into the WC Vendors Pro dashboard.', 'wc-vendors'); ?> </p>
75
- <span class="product-addons-button product-addons-button-solid"><?php _e( 'From $69', 'wc-vendors'); ?></span>
76
- </a>
77
- </li>
78
- <li class="product">
79
- <a href="https://www.wcvendors.com/home/3rd-party-extensions/y/?utm_source=plugin&utm_medium=addons&utm_campaign=extensions">
80
- <h2><?php _e( '3rd Party Extensions', 'wc-vendors'); ?></h2>
81
- <p><?php _e( 'We have a list of 3rd party developer extensions that inetegrate with WC Vendors and WC Vendors Pro on our website.', 'wc-vendors'); ?></p>
82
- <span class="product-addons-button product-addons-button-solid"><?php _e( 'View extensions', 'wc-vendors'); ?></span>
83
- </a>
84
- </li>
85
-
86
- </ul>
87
-
88
-
89
- <p><?php printf( __( 'Our list of extensions for WC Vendors can be found on our website. <a href="%s">Click here to view our extensions list.</a>', 'wc-vendors' ), 'https://www.wcvendors.com/extensions/' ); ?></p>
90
-
91
-
92
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/html-admin-settings.php DELETED
@@ -1,46 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Settings
4
- *
5
- * @package WC Vendors
6
- */
7
-
8
- if ( ! defined( 'ABSPATH' ) ) {
9
- exit;
10
- }
11
-
12
- $tab_exists = isset( $tabs[ $current_tab ] ) || has_action( 'wcvendors_sections_' . $current_tab ) || has_action( 'wcvendors_settings_' . $current_tab ) || has_action( 'wcvendors_settings_tabs_' . $current_tab );
13
- $current_tab_label = isset( $tabs[ $current_tab ] ) ? $tabs[ $current_tab ] : '';
14
-
15
- if ( ! $tab_exists ) {
16
- wp_safe_redirect( admin_url( 'admin.php?page=wcv-settings' ) );
17
- exit;
18
- }
19
- ?>
20
- <div class="wrap wcvendors">
21
- <form method="<?php echo esc_attr( apply_filters( 'wcvendors_settings_form_method_tab_' . $current_tab, 'post' ) ); ?>" id="mainform" action="" enctype="multipart/form-data">
22
- <nav class="nav-tab-wrapper wcv-nav-tab-wrapper">
23
- <?php
24
-
25
- foreach ( $tabs as $slug => $label ) {
26
- echo '<a href="' . esc_html( admin_url( 'admin.php?page=wcv-settings&tab=' . esc_attr( $slug ) ) ) . '" class="nav-tab ' . ( $current_tab === $slug ? 'nav-tab-active' : '' ) . '">' . esc_html( $label ) . '</a>';
27
- }
28
-
29
- do_action( 'wcvendors_settings_tabs' );
30
-
31
- ?>
32
- </nav>
33
- <h1 class="screen-reader-text"><?php echo esc_html( $current_tab_label ); ?></h1>
34
- <?php
35
- do_action( 'wcvendors_sections_' . $current_tab );
36
- self::show_messages();
37
- do_action( 'wcvendors_settings_' . $current_tab );
38
- ?>
39
- <p class="submit">
40
- <?php if ( empty( $GLOBALS['hide_save_button'] ) ) : ?>
41
- <button name="save" class="button-primary wcvendors-save-button" type="submit" value="<?php esc_attr_e( 'Save changes', 'wcvendors' ); ?>"><?php esc_html_e( 'Save changes', 'wcvendors' ); ?></button>
42
- <?php endif; ?>
43
- <?php wp_nonce_field( 'wcvendors-settings' ); ?>
44
- </p>
45
- </form>
46
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/html-vendor-meta.php DELETED
@@ -1,153 +0,0 @@
1
- <h3><?php _e( 'WC Vendors', 'wc-vendors' ); ?></h3>
2
-
3
- <table class="form-table">
4
- <tbody>
5
-
6
- <?php if ( apply_filters( 'wcvendors_admin_user_meta_shop_html_enable', true ) ) : ?>
7
-
8
- <?php do_action( 'wcvendors_admin_before_shop_html', $user ); ?>
9
- <tr>
10
- <th scope="row">Shop HTML</th>
11
- <td>
12
- <label for="pv_shop_html_enabled">
13
- <input name="pv_shop_html_enabled" type="checkbox" id="pv_shop_html_enabled" <?php checked( true, get_user_meta( $user->ID, 'pv_shop_html_enabled', true ), $echo = true ) ?>/>
14
- <?php _e( 'Enable HTML for the shop description', 'wc-vendors' ); ?>
15
- </label>
16
- </td>
17
- </tr>
18
- <?php do_action( 'wcvendors_admin_after_shop_html', $user ); ?>
19
-
20
- <?php endif; ?>
21
-
22
- <?php if ( apply_filters( 'wcvendors_admin_user_meta_shop_name_enable', true ) ) : ?>
23
-
24
- <?php do_action( 'wcvendors_admin_before_shop_name', $user ); ?>
25
- <tr>
26
- <th><label for="pv_shop_name"><?php _e( 'Shop name', 'wc-vendors' ); ?></label></th>
27
- <td><input type="text" name="pv_shop_name" id="pv_shop_name" value="<?php echo get_user_meta( $user->ID, 'pv_shop_name', true ); ?>" class="regular-text">
28
- </td>
29
- </tr>
30
- <?php do_action( 'wcvendors_admin_after_shop_name', $user ); ?>
31
-
32
- <?php endif; ?>
33
-
34
- <?php if ( apply_filters( 'wcvendors_admin_user_meta_paypal_enable', true ) ) : ?>
35
-
36
- <?php do_action( 'wcvendors_admin_before_paypal', $user ); ?>
37
- <tr>
38
- <th><label for="pv_paypal"><?php _e( 'PayPal E-mail', 'wc-vendors' ); ?> <span class="description"></span></label></th>
39
- <td><input type="email" name="pv_paypal" id="pv_paypal" value="<?php echo get_user_meta( $user->ID, 'pv_paypal', true ); ?>" class="regular-text">
40
- </td>
41
- </tr>
42
- <?php do_action( 'wcvendors_admin_after_paypal', $user ); ?>
43
-
44
- <?php endif; ?>
45
-
46
- <?php if ( apply_filters( 'wcvendors_admin_user_meta_bank_details_enable', true ) ) : ?>
47
-
48
- <?php do_action( 'wcvendors_admin_before_bank_details', $user ); ?>
49
- <tr>
50
- <th><label for="wcv_bank_account_name"><?php _e( 'Bank Account Name', 'wc-vendors' ); ?> <span class="description"></span></label></th>
51
- <td><input type="text" name="wcv_bank_account_name" id="wcv_bank_account_name" value="<?php echo get_user_meta( $user->ID, 'wcv_bank_account_name', true ); ?>" class="regular-text">
52
- </td>
53
- </tr>
54
- <tr>
55
- <th><label for="wcv_bank_account_number"><?php _e( 'Bank Account Number', 'wc-vendors' ); ?> <span class="description"></span></label></th>
56
- <td><input type="text" name="wcv_bank_account_number" id="wcv_bank_account_number" value="<?php echo get_user_meta( $user->ID, 'wcv_bank_account_number', true ); ?>" class="regular-text">
57
- </td>
58
- </tr>
59
- <tr>
60
- <th><label for="wcv_bank_name"><?php _e( 'Bank Name', 'wc-vendors' ); ?> <span class="description"></span></label></th>
61
- <td><input type="text" name="wcv_bank_name" id="wcv_bank_name" value="<?php echo get_user_meta( $user->ID, 'wcv_bank_name', true ); ?>" class="regular-text">
62
- </td>
63
- </tr>
64
- <tr>
65
- <th><label for="wcv_bank_routing_number"><?php _e( 'Routing Number', 'wc-vendors' ); ?> <span class="description"></span></label></th>
66
- <td><input type="text" name="wcv_bank_routing_number" id="wcv_bank_routing_number" value="<?php echo get_user_meta( $user->ID, 'wcv_bank_routing_number', true ); ?>" class="regular-text">
67
- </td>
68
- </tr>
69
- <tr>
70
- <th><label for="wcv_bank_iban"><?php _e( 'IBAN', 'wc-vendors' ); ?> <span class="description"></span></label></th>
71
- <td><input type="text" name="wcv_bank_iban" id="wcv_bank_iban" value="<?php echo get_user_meta( $user->ID, 'wcv_bank_iban', true ); ?>" class="regular-text">
72
- </td>
73
- </tr>
74
- <tr>
75
- <th><label for="wcv_bank_bic_swift"><?php _e( 'BIC/SWIFT', 'wc-vendors' ); ?> <span class="description"></span></label></th>
76
- <td><input type="text" name="wcv_bank_bic_swift" id="wcv_bank_bic_swift" value="<?php echo get_user_meta( $user->ID, 'wcv_bank_bic_swift', true ); ?>" class="regular-text">
77
- </td>
78
- </tr>
79
- <?php do_action( 'wcvendors_admin_after_bank_details', $user ); ?>
80
-
81
- <?php endif; ?>
82
-
83
-
84
- <?php if ( apply_filters( 'wcvendors_admin_user_meta_commission_rate_enable', true ) ) : ?>
85
-
86
- <?php do_action( 'wcvendors_admin_before_commission_due', $user ); ?>
87
- <tr>
88
- <th><label for="pv_custom_commission_rate"><?php _e( 'Commission rate', 'wc-vendors' ); ?> (%)</label></th>
89
- <td><input type="number" step="0.01" max="100" min="0" name="pv_custom_commission_rate" placeholder="<?php _e( 'Leave blank for default', 'wc-vendors' ); ?>" id="pv_custom_commission_rate"
90
- value="<?php echo get_user_meta( $user->ID, 'pv_custom_commission_rate', true ); ?>" class="regular-text">
91
- </td>
92
- </tr>
93
- <?php do_action( 'wcvendors_admin_after_commission_due', $user ); ?>
94
-
95
- <?php endif; ?>
96
-
97
- <?php if ( apply_filters( 'wcvendors_admin_user_meta_give_tax_enable', true ) ) : ?>
98
-
99
- <?php do_action( 'wcvendors_admin_before_give_tax', $user ); ?>
100
- <tr>
101
- <th><label for="wcv_give_vendor_tax"><?php _e( 'Give Tax', 'wc-vendors' ); ?> (%)</label></th>
102
- <td>
103
- <label for="wcv_give_vendor_tax">
104
- <input name="wcv_give_vendor_tax" type="checkbox" id="wcv_give_vendor_tax" <?php checked( true, get_user_meta( $user->ID, 'wcv_give_vendor_tax', true ), $echo = true ) ?>/>
105
- <?php printf( __( 'Tax override for %s', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ); ?>
106
- </label>
107
- </td>
108
- </tr>
109
- <?php do_action( 'wcvendors_admin_after_give_tax', $user ); ?>
110
-
111
- <?php endif; ?>
112
-
113
- <?php if ( apply_filters( 'wcvendors_admin_user_meta_give_shipping_enable', true ) ) : ?>
114
-
115
- <?php do_action( 'wcvendors_admin_before_give_shipping', $user ); ?>
116
- <tr>
117
- <th><label for="wcv_give_vendor_shipping"><?php _e( 'Give Shipping', 'wc-vendors' ); ?> (%)</label></th>
118
- <td>
119
- <label for="wcv_give_vendor_shipping">
120
- <input name="wcv_give_vendor_shipping" type="checkbox" id="wcv_give_vendor_shipping" <?php checked( true, get_user_meta( $user->ID, 'wcv_give_vendor_shipping', true ), $echo = true ) ?>/>
121
- <?php printf( __( 'Shipping override for %s', 'wc-vendors' ), wcv_get_vendor_name( true, false ) ); ?>
122
- </label>
123
- </td>
124
- </tr>
125
- <?php do_action( 'wcvendors_admin_after_give_shipping', $user ); ?>
126
-
127
- <?php endif; ?>
128
-
129
- <?php if ( apply_filters( 'wcvendors_admin_user_meta_seller_info_enable', true ) ) : ?>
130
-
131
- <?php do_action( 'wcvendors_admin_before_seller_info', $user ); ?>
132
- <tr>
133
- <th><label for="pv_seller_info"><?php _e( 'Seller info', 'wc-vendors' ); ?></label></th>
134
- <td><?php wp_editor( get_user_meta( $user->ID, 'pv_seller_info', true ), 'pv_seller_info' ); ?></td>
135
- </tr>
136
- <?php do_action( 'wcvendors_admin_after_seller_info', $user ); ?>
137
-
138
- <?php endif; ?>
139
-
140
- <?php if ( apply_filters( 'wcvendors_admin_user_meta_shop_description_enable', true ) ) : ?>
141
-
142
- <?php do_action( 'wcvendors_admin_before_shop_description', $user ); ?>
143
- <tr>
144
- <th><label for="pv_shop_description"><?php _e( 'Shop description', 'wc-vendors' ); ?></label>
145
- </th>
146
- <td><?php wp_editor( get_user_meta( $user->ID, 'pv_shop_description', true ), 'pv_shop_description' ); ?></td>
147
- </tr>
148
- <?php do_action( 'wcvendors_admin_after_shop_description', $user ); ?>
149
-
150
- <?php endif; ?>
151
-
152
- </tbody>
153
- </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/html-vendor-settings-page.php DELETED
@@ -1,114 +0,0 @@
1
- <div class="wrap">
2
- <h2>Shop Settings</h2>
3
- <table class="form-table">
4
-
5
- <form method="post">
6
- <?php do_action( 'wcvendors_settings_before_paypal' );
7
-
8
- if ( $paypal_address !== 'false' ) { ?>
9
-
10
- <tr>
11
- <th><?php _e( 'PayPal Address', 'wc-vendors' ); ?></th>
12
- <td><input type="email" name="pv_paypal" class="regular-text" id="pv_paypal" placeholder="some@email.com" value="<?php echo get_user_meta( $user_id, 'pv_paypal', true ); ?>"/>
13
- <p class="description">
14
- <?php _e( 'Your PayPal address can be used to send you your commission.', 'wc-vendors' ); ?><br/>
15
- </p>
16
- </td>
17
- </tr>
18
- <?php } ?>
19
- <?php do_action( 'wcvendors_settings_after_paypal' ); ?>
20
-
21
-
22
- <?php if ( apply_filters( 'wcvendors_admin_user_meta_bank_details_enable', true ) ) : ?>
23
-
24
- <?php do_action( 'wcvendors_settings_before_bank_details', $user_id ); ?>
25
- <tr>
26
- <th><label for="wcv_bank_account_name"><?php _e( 'Bank Account Name', 'wc-vendors' ); ?> <span class="description"></span></label></th>
27
- <td><input type="text" name="wcv_bank_account_name" id="wcv_bank_account_name" value="<?php echo get_user_meta( $user_id, 'wcv_bank_account_name', true ); ?>" class="regular-text">
28
- </td>
29
- </tr>
30
- <tr>
31
- <th><label for="wcv_bank_account_number"><?php _e( 'Bank Account Number', 'wc-vendors' ); ?> <span class="description"></span></label></th>
32
- <td><input type="text" name="wcv_bank_account_number" id="wcv_bank_account_number" value="<?php echo get_user_meta( $user_id, 'wcv_bank_account_number', true ); ?>" class="regular-text">
33
- </td>
34
- </tr>
35
- <tr>
36
- <th><label for="wcv_bank_name"><?php _e( 'Bank Name', 'wc-vendors' ); ?> <span class="description"></span></label></th>
37
- <td><input type="text" name="wcv_bank_name" id="wcv_bank_name" value="<?php echo get_user_meta( $user_id, 'wcv_bank_name', true ); ?>" class="regular-text">
38
- </td>
39
- </tr>
40
- <tr>
41
- <th><label for="wcv_bank_routing_number"><?php _e( 'Routing Number', 'wc-vendors' ); ?> <span class="description"></span></label></th>
42
- <td><input type="text" name="wcv_bank_routing_number" id="wcv_bank_routing_number" value="<?php echo get_user_meta( $user_id, 'wcv_bank_routing_number', true ); ?>" class="regular-text">
43
- </td>
44
- </tr>
45
- <tr>
46
- <th><label for="wcv_bank_iban"><?php _e( 'IBAN', 'wc-vendors' ); ?> <span class="description"></span></label></th>
47
- <td><input type="text" name="wcv_bank_iban" id="wcv_bank_iban" value="<?php echo get_user_meta( $user_id, 'wcv_bank_iban', true ); ?>" class="regular-text">
48
- </td>
49
- </tr>
50
- <tr>
51
- <th><label for="wcv_bank_bic_swift"><?php _e( 'BIC/SWIFT', 'wc-vendors' ); ?> <span class="description"></span></label></th>
52
- <td><input type="text" name="wcv_bank_bic_swift" id="wcv_bank_bic_swift" value="<?php echo get_user_meta( $user_id, 'wcv_bank_bic_swift', true ); ?>" class="regular-text">
53
- </td>
54
- </tr>
55
- <?php do_action( 'wcvendors_settings_after_bank_details', $user_id ); ?>
56
-
57
- <?php endif; ?>
58
-
59
-
60
- <tr>
61
- <th><?php _e( 'Shop Name', 'wc-vendors' ); ?></th>
62
- <td><input type="text" name="pv_shop_name" id="pv_shop_name" placeholder="Your shop name" value="<?php echo get_user_meta( $user_id, 'pv_shop_name', true ); ?>"/>
63
- <p class="description"><?php _e( 'Your shop name is public and must be unique.', 'wc-vendors' ); ?></p>
64
- </td>
65
- </tr>
66
- <?php do_action( 'wcvendors_settings_after_shop_name' ); ?>
67
-
68
- <tr>
69
- <th><?php echo apply_filters( 'wcvendors_seller_info_label', __( 'Seller info', 'wc-vendors' ) ); ?></th>
70
- <td><?php
71
-
72
- if ( $global_html || $has_html ) {
73
- $old_post = $GLOBALS[ 'post' ];
74
- $GLOBALS[ 'post' ] = 0;
75
- wp_editor( $seller_info, 'pv_seller_info' );
76
- $GLOBALS[ 'post' ] = $old_post;
77
- } else {
78
- ?><textarea class="large-text" rows="10" id="pv_seller_info_unhtml" style="width:95%"
79
- name="pv_seller_info"><?php echo $seller_info; ?></textarea><?php
80
- }
81
- ?>
82
- <p class="description"><?php _e( 'This is displayed on each of your products.', 'wc-vendors' ); ?></p>
83
- </td>
84
- </tr>
85
- <?php do_action( 'wcvendors_settings_after_seller_info' ); ?>
86
- <?php if ( $shop_description !== 'false' ) { ?>
87
- <tr>
88
- <th><?php _e( 'Shop Description', 'wc-vendors' ); ?></th>
89
- <td><?php
90
-
91
- if ( $global_html || $has_html ) {
92
- $old_post = $GLOBALS[ 'post' ];
93
- $GLOBALS[ 'post' ] = 0;
94
- wp_editor( $description, 'pv_shop_description' );
95
- $GLOBALS[ 'post' ] = $old_post;
96
- } else {
97
- ?><textarea class="large-text" rows="10" id="pv_shop_description_unhtml" style="width:95%" name="pv_shop_description"><?php echo $description; ?></textarea><?php
98
- }
99
- ?>
100
- <p class="description"><?php printf( __( 'This is displayed on your <a href="%s">shop page</a>.', 'wc-vendors' ), $shop_page ); ?></p>
101
- </td>
102
- </tr>
103
-
104
- <?php do_action( 'wcvendors_settings_after_shop_description' ); ?>
105
- <?php } ?>
106
- <?php wp_nonce_field( 'save-shop-settings-admin', 'wc-vendors-nonce' ); ?>
107
- <tr>
108
- <td colspa="2">
109
- <input type="submit" class="button button-primary" name="vendor_application_submit" value="<?php _e( 'Save Shop Settings', 'wc-vendors' ); ?>"/>
110
- </td>
111
- </tr>
112
- </form>
113
- </table>
114
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/notices/html-notice-custom.php DELETED
@@ -1,14 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Custom Notices
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit;
8
- }
9
-
10
- ?>
11
- <div id="message" class="updated wcvendors-message">
12
- <a class="wcvendors-message-close notice-dismiss" href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'wcv-hide-notice', $notice ), 'wcvendors_hide_notices_nonce', '_wcv_notice_nonce' ) ); ?>"><?php _e( 'Dismiss', 'wc-vendors' ); ?></a>
13
- <?php echo wp_kses_post( wpautop( $notice_html ) ); ?>
14
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/notices/html-notice-install.php DELETED
@@ -1,14 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Notice - Install
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit;
8
- }
9
-
10
- ?>
11
- <div id="message" class="updated wcvendors-message wc-connect">
12
- <p><?php _e( '<strong>Welcome to WC Vendors</strong> &#8211; You&lsquo;re almost ready to start your marketplace', 'wc-vendors' ); ?></p>
13
- <p class="submit"><a href="<?php echo esc_url( admin_url( 'admin.php?page=wcv-setup' ) ); ?>" class="button-primary"><?php _e( 'Run the Setup Wizard', 'wc-vendors' ); ?></a> <a class="button-secondary skip" href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'wcv-hide-notice', 'install' ), 'wcvendors_hide_notices_nonce', '_wcv_notice_nonce' ) ); ?>"><?php _e( 'Skip setup', 'wc-vendors' ); ?></a></p>
14
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/notices/html-notice-template-check.php DELETED
@@ -1,17 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Notice - Template Check
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit;
8
- }
9
-
10
- $theme = wp_get_theme();
11
- ?>
12
- <div id="message" class="updated wcvendors-message">
13
- <a class="wcvendors-message-close notice-dismiss" href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'wcv-hide-notice', 'template_files' ), 'wcvendors_hide_notices_nonce', '_wcv_notice_nonce' ) ); ?>"><?php _e( 'Dismiss', 'wc-vendors' ); ?></a>
14
-
15
- <p><?php printf( __( '<strong>Your theme (%1$s) contains outdated copies of some WC Vendors template files.</strong> These files may need updating to ensure they are compatible with the current version of WC Vendors. You can see which files are affected from the <a href="%2$s">system status page</a>. If in doubt, check with the author of the theme.', 'wc-vendors' ), esc_html( $theme[ 'Name' ] ), esc_url( admin_url( 'admin.php?page=wc-status' ) ) ); ?></p>
16
- <p class="submit"><a class="button-primary" href="https://docs.wcvendors.com/knowledge-base/changing-the-vendor-templates/?utm_source=plugin" target="_blank"><?php _e( 'Learn more about templates', 'wc-vendors' ); ?></a></p>
17
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/notices/html-notice-theme-support.php DELETED
File without changes
trunk/classes/admin/views/notices/html-notice-update.php DELETED
@@ -1,19 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Notice - Install
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit;
8
- }
9
-
10
- ?>
11
- <div id="message" class="updated wcvendors-message wc-connect is-dismissible">
12
- <p><?php _e( '<strong>WC Vendors Update Required.</strong> &#8211; We need to upgrade your configuration to the latest version.', 'wc-vendors' ); ?></p>
13
- <p class="submit"><a class="wcv-update-now button-primary" href="<?php echo esc_url( add_query_arg( 'do_update_wcvendors', 'true', admin_url( 'admin.php?page=wcv-settings' ) ) ); ?>" class="button-primary"><?php _e( 'Run the update', 'wc-vendors' ); ?></a></p>
14
- </div>
15
- <script type="text/javascript">
16
- jQuery( '.wcv-update-now' ).click( 'click', function() {
17
- return window.confirm( '<?php echo esc_js( __( 'It is strongly recommended that you backup your database before proceeding. Are you sure you wish to run the updater now?', 'wc-vendors' ) ); ?>' ); // jshint ignore:line
18
- });
19
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/notices/html-notice-updated.php DELETED
@@ -1,14 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Notice - Updated
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit;
8
- }
9
-
10
- ?>
11
- <div id="message" class="updated wcvendors-message wc-connect wcvendors-message-success">
12
- <a class="wcvendors-message-close notice-dismiss" href="<?php echo esc_url( wp_nonce_url( add_query_arg( 'wcv-hide-notice', 'update', remove_query_arg( 'do_update_wcvendors' ) ), 'wcvendors_hide_notices_nonce', '_wcv_notice_nonce' ) ); ?>"><?php _e( 'Dismiss', 'wc-vendors' ); ?></a>
13
- <p><?php _e( 'WC Vendors data update complete. Thank you for updating to the latest version!', 'wc-vendors' ); ?></p>
14
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/notices/html-notice-updating.php DELETED
@@ -1,13 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Notice - Update
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit;
8
- }
9
-
10
- ?>
11
- <div id="message" class="updated wcvendors-message wc-connect">
12
- <p><strong><?php _e( 'WC Vendors data update', 'wc-vendors' ); ?></strong> &#8211; <?php _e( 'Your database is being updated in the background. ', 'wc-vendors' ); ?> <a href="<?php echo esc_url( add_query_arg( 'force_update_wcvendors', 'true', admin_url( 'admin.php?page=wcv-settings' ) ) ); ?>"><?php _e( 'Taking a while? Click here to run it now.', 'wc-vendors' ); ?></a></p>
13
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/setup/capabilities.php DELETED
@@ -1,134 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Step Two
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit; // Exit if accessed directly
8
- }
9
-
10
- ?>
11
-
12
- <form method="post">
13
- <?php wp_nonce_field( 'wcv-setup' ); ?>
14
- <p class="store-setup"><?php printf( __( 'Enable and disable capabilites of the %s', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></p>
15
-
16
- <table class="wcv-setup-table">
17
- <thead>
18
- <tr>
19
- <td class="table-desc"><strong><?php _e( 'Products', 'wc-vendors' ); ?></strong></td>
20
- <td class="table-check"></td>
21
- </tr>
22
- </thead>
23
- <tbody>
24
- <tr>
25
- <td class="table-desc"><?php printf( __( 'Allow %s to add/edit products', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></td>
26
- <td class="table-check">
27
- <input
28
- type="checkbox"
29
- style="float: right; font-size: 4em;"
30
- id="wcv_capability_products_enabled"
31
- name="wcv_capability_products_enabled"
32
- value="yes"
33
- <?php checked( $products_enabled, 'yes' ); ?>
34
- />
35
- </td>
36
- </tr>
37
- <tr>
38
- <td class="table-desc"><?php printf( __( 'Allow %s to edit published (live) products', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></td>
39
- <td class="table-check">
40
- <input
41
- type="checkbox"
42
- style="float: right; font-size: 4em;"
43
- id="wcv_capability_products_edit"
44
- name="wcv_capability_products_edit"
45
- value="yes"
46
- <?php checked( $live_products, 'yes' ); ?>
47
- />
48
- </td>
49
- </tr>
50
- <tr>
51
- <td class="table-desc"><?php printf( __( 'Allow %s to publish products without requiring approval.', 'wc-vendors' ), wcv_get_vendor_name( false, false ) )?></td>
52
- <td class="table-check">
53
- <input
54
- type="checkbox"
55
- style="float: right; font-size: 4em;"
56
- id="wcv_capability_products_live"
57
- name="wcv_capability_products_live"
58
- value="yes"
59
- <?php checked( $products_approval, 'yes' ); ?>
60
- />
61
- </td>
62
- </tr>
63
-
64
- </tbody>
65
- </table>
66
-
67
- <table class="wcv-setup-table">
68
- <thead>
69
- <tr>
70
- <td class="table-desc"><strong><?php _e( 'Orders', 'wc-vendors' ); ?></strong></td>
71
- <td class="table-check"></td>
72
- </tr>
73
- </thead>
74
- <tbody>
75
- <tr>
76
- <td class="table-desc"><?php printf( __( 'Allow %s to view orders', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></td>
77
- <td class="table-check">
78
- <input
79
- type="checkbox"
80
- style="float: right; font-size: 4em;"
81
- id="wcv_capability_orders_enabled"
82
- name="wcv_capability_orders_enabled"
83
- value="yes"
84
- <?php checked( $orders_enabled, 'yes' ); ?>
85
- />
86
- </td>
87
- </tr>
88
- <tr>
89
- <td class="table-desc"><?php printf( __( 'Allow %s to export their orders to a CSV file', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></td>
90
- <td class="table-check">
91
- <input
92
- type="checkbox"
93
- style="float: right; font-size: 4em;"
94
- id="wcv_capability_orders_export"
95
- name="wcv_capability_orders_export"
96
- value="yes"
97
- <?php checked( $export_orders, 'yes' ); ?>
98
- />
99
- </td>
100
- </tr>
101
- <tr>
102
- <td class="table-desc"><?php printf( __( 'Allow %s to view order notes', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></td>
103
- <td class="table-check">
104
- <input
105
- type="checkbox"
106
- style="float: right; font-size: 4em;"
107
- id="wcv_capability_order_read_notes"
108
- name="wcv_capability_order_read_notes"
109
- value="yes"
110
- <?php checked( $view_order_notes, 'yes' ); ?>
111
- />
112
- </td>
113
- </tr>
114
- <tr>
115
- <td class="table-desc"><?php printf( __( 'Allow %s to add order notes.', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></td>
116
- <td class="table-check">
117
- <input
118
- type="checkbox"
119
- style="float: right; font-size: 4em;"
120
- id="wcv_capability_order_update_notes"
121
- name="wcv_capability_order_update_notes"
122
- value="yes"
123
- <?php checked( $view_order_notes, 'yes' ); ?>
124
- />
125
- </td>
126
- </tr>
127
- </tbody>
128
- </table>
129
-
130
-
131
- <p class="wcv-setup-actions step">
132
- <button type="submit" class="button button-next" value="<?php esc_attr_e( "Next", 'wc-vendors' ); ?>" name="save_step"><?php esc_html_e( "Next", 'wc-vendors' ); ?></button>
133
- </p>
134
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/setup/footer.php DELETED
@@ -1,20 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Setup Footer
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit; // Exit if accessed directly
8
- }
9
-
10
- ?>
11
-
12
- <?php if ( 'store_setup' === $this->step ) : ?>
13
- <a class="wcv-return-to-dashboard" href="<?php echo esc_url( admin_url() ); ?>"><?php esc_html_e( 'Exit Wizard', 'wc-vendors' ); ?></a>
14
- <?php elseif ( 'ready' === $this->step ) : ?>
15
- <a class="wcv-return-to-dashboard" href="<?php echo esc_url( admin_url() .'admin.php?page=wcv-settings' ); ?>"><?php esc_html_e( 'Return to your dashboard', 'wc-vendors' ); ?></a>
16
- <?php elseif ( 'activate' === $this->step ) : ?>
17
- <a class="wcv-return-to-dashboard" href="<?php echo esc_url( $this->get_next_step_link() ); ?>"><?php esc_html_e( 'Skip this step', 'wc-vendors' ); ?></a>
18
- <?php endif; ?>
19
- </body>
20
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/setup/general.php DELETED
@@ -1,99 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Step One
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit; // Exit if accessed directly
8
- }
9
-
10
- ?>
11
-
12
- <form method="post">
13
- <?php wp_nonce_field( 'wcv-setup' ); ?>
14
- <p class="store-setup"><?php esc_html_e( 'The following wizard will help you configure your marketplace and get your vendors onboard quickly.', 'wc-vendors' ); ?></p>
15
-
16
- <table class="wcv-setup-table">
17
- <thead>
18
- <tr>
19
- <td class="table-desc"><strong><?php _e( 'General', 'wc-vendors' ); ?></strong></td>
20
- <td class="table-check"></td>
21
- </tr>
22
- </thead>
23
- <tbody>
24
- <tr>
25
- <td class="table-desc"><?php printf( __( 'Allow users to apply to become a %s', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></td>
26
- <td class="table-check">
27
- <input
28
- type="checkbox"
29
- class="option_checkbox"
30
- id="wcv_vendor_allow_registration"
31
- name="wcv_vendor_allow_registration"
32
- value="yes"
33
- <?php checked( $allow_registration, 'yes' ); ?>
34
- />
35
- </td>
36
- </tr>
37
- <tr>
38
- <td class="table-desc"><?php printf( __( 'Manually approve %s applications', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></td>
39
- <td class="table-check">
40
- <input
41
- type="checkbox"
42
- class="option_checkbox"
43
- id="wcv_vendor_approve_registration"
44
- name="wcv_vendor_approve_registration"
45
- value="yes"
46
- <?php checked( $manual_approval, 'yes' ); ?>
47
- />
48
- </td>
49
- </tr>
50
- <tr>
51
- <td class="table-desc"><?php printf( __( 'Give any taxes to %s', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></td></td>
52
- <td class="table-check">
53
- <input
54
- type="checkbox"
55
- class="option_checkbox"
56
- id="wcv_vendor_give_taxes"
57
- name="wcv_vendor_give_taxes"
58
- value="yes"
59
- <?php checked( $vendor_taxes, 'yes' ); ?>
60
- />
61
- </td>
62
- </tr>
63
- <tr>
64
- <td class="table-desc"><?php printf( __( 'Give any shipping to %s', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></td></td>
65
- <td class="table-check">
66
- <input
67
- type="checkbox"
68
- class="option_checkbox"
69
- id="wcv_vendor_give_shipping"
70
- name="wcv_vendor_give_shipping"
71
- value="yes"
72
- <?php checked( $vendor_shipping, 'yes' ); ?>
73
- />
74
- </td>
75
- </tr>
76
- </tbody>
77
- </table>
78
-
79
- <strong><?php _e( 'Commission', 'wc-vendors' ); ?></strong>
80
-
81
- <p class="store-setup"><?php _e( 'Commissions are calculated per product. The commission rate can be set globally, at a vendor level or at a product level.', 'wc-vendors' ); ?></p>
82
-
83
- <!-- Vendor commission rate -->
84
- <p class="store-setup wcv-setup-input">
85
- <label class="" for="">
86
- <?php esc_html_e( 'Global Commission Rate %', 'wc-vendors' ); ?>
87
- </label>
88
- <input
89
- type="text"
90
- id="wcv_vendor_commission_rate"
91
- name="wcv_vendor_commission_rate"
92
- placeholder="%"
93
- value="<?php echo $commission_rate; ?>"
94
- />
95
- </p>
96
- <p class="wcv-setup-actions step">
97
- <button type="submit" class="button button-next" value="<?php esc_attr_e( "Next", 'wc-vendors' ); ?>" name="save_step"><?php esc_html_e( "Next", 'wc-vendors' ); ?></button>
98
- </p>
99
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/setup/header.php DELETED
@@ -1,22 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Setup Header
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit; // Exit if accessed directly
8
- }
9
-
10
- ?>
11
- <!DOCTYPE html>
12
- <html <?php language_attributes(); ?>>
13
- <head>
14
- <meta name="viewport" content="width=device-width" />
15
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
16
- <title><?php esc_html_e( 'WC Vendors &rsaquo; Setup Wizard', 'wc-vendors' ); ?></title>
17
- <?php wp_print_scripts( 'wcv-setup' ); ?>
18
- <?php do_action( 'admin_print_styles' ); ?>
19
- <?php do_action( 'admin_head' ); ?>
20
- </head>
21
- <body class="wcv-setup wp-core-ui">
22
- <h1 id="wcv-logo"><a href="https://www.wcvendors.com/"><img src="<?php echo esc_url( wcv_assets_url ); ?>images/wcvendors_logo.png" alt="WC Vendors" /></a></h1>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/setup/pages.php DELETED
@@ -1,87 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Step One
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit; // Exit if accessed directly
8
- }
9
-
10
- ?>
11
-
12
- <form method="post">
13
- <?php wp_nonce_field( 'wcv-setup' ); ?>
14
- <p class="store-setup"><?php printf( __( 'Select the pages for relevant frontend features for %s', 'wc-vendors' ), wcv_get_vendor_name( false, false ) ); ?></p>
15
-
16
- <table class="wcv-setup-table-pages">
17
- <thead>
18
- <tr>
19
- <td class="table-desc"><strong><?php _e( 'Pages', 'wc-vendors' ); ?></strong></td>
20
- <td class="table-check"></td>
21
- </tr>
22
- </thead>
23
- <tbody>
24
- <tr>
25
- <td class="table-desc"><?php printf(__( '%s Dashboard', 'wc-vendors' ), wcv_get_vendor_name() ); ?>
26
-
27
- </td>
28
- <td class="table-check">
29
- <?php wcv_single_select_page( 'wcvendors_vendor_dashboard_page_id', $vendor_dashboard_page_id, 'wc-enhanced-select' ); ?>
30
- </td>
31
- </tr>
32
- <tr>
33
- <td colspan="3" class="tool-tip">
34
- <?php _e( 'This page should contain the following shortcode. <code>[wcv_vendor_dashboard]</code>', 'wc-vendors' ); ?>
35
- </td>
36
- </tr>
37
- <tr>
38
- <td class="table-desc"><?php printf( __( '%s Shop Settings', 'wc-vendors' ), wcv_get_vendor_name( false ) ); ?></td>
39
- <td class="table-check">
40
- <?php wcv_single_select_page( 'wcvendors_shop_settings_page_id', $shop_settings_page_id, 'wc-enhanced-select' ); ?>
41
- </td>
42
- </tr>
43
- <tr>
44
- <td colspan="3" class="tool-tip">
45
- <?php _e( 'This page should contain the following shortcode. <code>[wcv_shop_settings]</code>', 'wc-vendors' ); ?>
46
- </td>
47
- </tr>
48
- <tr>
49
- <td class="table-desc"><?php _e( 'Orders Page', 'wc-vendors' ); ?></td></td>
50
- <td class="table-check">
51
- <?php wcv_single_select_page( 'wcvendors_product_orders_page_id', $product_orders_page_id, 'wc-enhanced-select' ); ?>
52
- </td>
53
- </tr>
54
- <tr>
55
- <td colspan="3" class="tool-tip">
56
- <?php _e( 'This page should contain the following shortcode. <code>[wcv_orders]</code>', 'wc-vendors' ); ?>
57
- </td>
58
- </tr>
59
- <tr>
60
- <td class="table-desc"><?php printf( __( '%s List Page', 'wc-vendors' ), wcv_get_vendor_name( false ) ); ?></td></td>
61
- <td class="table-check">
62
- <?php wcv_single_select_page( 'wcvendors_vendors_page_id', $vendors_page_id, 'wc-enhanced-select' ); ?>
63
- </td>
64
- </tr>
65
- <tr>
66
- <td colspan="3" class="tool-tip">
67
- <?php _e( 'This page should contain the following shortcode. <code>[wcv_vendorslist]</code>', 'wc-vendors' ); ?>
68
- </td>
69
- </tr>
70
- <tr>
71
- <td class="table-desc"><?php printf( __( '%s Terms Page', 'wc-vendors' ), wcv_get_vendor_name() ); ?></td></td>
72
- <td class="table-check">
73
- <?php wcv_single_select_page( 'wcvendors_vendor_terms_page_id', $terms_page_id, 'wc-enhanced-select' ); ?>
74
- </td>
75
- </tr>
76
- <tr>
77
- <td colspan="3" class="tool-tip">
78
- <?php printf( __( 'This optional page allows you to define terms and conidtions %s need to agree to before applying to your marketplace. ', 'wc-vendors' ), wcv_get_vendor_name( false ) ); ?>
79
- </td>
80
- </tr>
81
-
82
- </tbody>
83
- </table>
84
- <p class="wcv-setup-actions step">
85
- <button type="submit" class="button button-next" value="<?php esc_attr_e( "Next", 'wc-vendors' ); ?>" name="save_step"><?php esc_html_e( "Next", 'wc-vendors' ); ?></button>
86
- </p>
87
- </form>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
trunk/classes/admin/views/setup/ready.php DELETED
@@ -1,78 +0,0 @@
1
- <?php
2
- /**
3
- * Admin View: Step One
4
- */
5
-
6
- if ( ! defined( 'ABSPATH' ) ) {
7
- exit; // Exit if accessed directly
8
- }
9
-
10
- ?>
11
-
12
- <h1><?php esc_html_e( "Your marketplace is ready!", 'wc-vendors' ); ?></h1>
13
-
14
- <!-- <div class="wcvendors-message wcvendors-newsletter">
15
- <p><?php esc_html_e( "Subscribe to our newsletter! Get product updates, marketplace tips, information and more.", 'wc-vendors' ); ?></p>
16
- <form action="//wcvendors.us8.list-manage.com/subscribe/post?u=2c1434dc56f9506bf3c3ecd21&amp;id=13860df971" method="post" target="_blank" novalidate>
17
- <div class="newsletter-form-container">
18
- <input
19
- class="newsletter-form-email"
20
- type="email"
21
- value="<?php echo esc_attr( $user_email ); ?>"
22
- name="EMAIL"
23
- placeholder="<?php esc_attr_e( 'Email address', 'wc-vendors' ); ?>"
24
- required
25
- >
26
- <p class="wcv-setup-actions step newsletter-form-button-container">
27
- <button
28
- type="submit"
29
- value="<?php esc_html_e( 'Subscribe me', 'wc-vendors' ); ?>"
30
- name="subscribe"
31
- id="mc-embedded-subscribe"
32
- class="button-primary button newsletter-form-button"
33
- ><?php esc_html_e( 'Subscribe me', 'wc-vendors' ); ?></button>
34
- </p>
35
- </div>
36
- </form>
37
- </div>
38
- -->
39
- <ul class="wcv-wizard-next-steps">
40
- <li class="wcv-wizard-next-step-item">
41
- <div class="wcv-wizard-next-step-description">
42
- <p class="next-step-heading"><?php esc_html_e( 'Next step', 'wc-vendors' ); ?></p>
43
- <h3 class="next-step-description"><?php esc_html_e( 'Upgrade to Pro!', 'wc-vendors' ); ?></h3>
44
- <p class="next-step-extra-info"><?php esc_html_e( "Upgrade today to extend the features of your marketplace.", 'wc-vendors' ); ?></p>
45
- <p class="next-step-heading"><?php esc_html_e( 'Features', 'wc-vendors' ); ?></p>
46
- <ul>
47
- <li><?php _e( 'Complete frontend dashboard for vendors', 'wc-vendors' ); ?></li>
48
- <li><?php _e( 'Flat rate & table rate shipping module', 'wc-vendors' ); ?></li>
49
- <li><?php _e( 'Coupons, ratings, reports, orders and more.', 'wc-vendors' ); ?></li>
50
- <li><?php _e( 'Advanced commissions', 'wc-vendors' ); ?></li>
51
- <li><?php _e( 'Premium support & updates', 'wc-vendors' ); ?></li>
52
- </ul>
53
- </div>
54
- <div class="wcv-wizard-next-step-action">
55
- <p class="wcv-setup-actions step">
56
- <a class="button button-primary button-large" href="https://www.wcvendors.com/product/wc-vendors-pro/?utm_source=setup_wizard&utm_medium=plugin&utm_campaign=setup_complete" target="_blank">
57
- <?php _e( 'Upgrade Now', 'wc-vendors' ); ?>
58
- </a>
59
- </p>
60
- </div>
61
- </li>
62
- <li class="wcv-wizard-next-step-item">
63
- <div class="wcv-wizard-next-step-description">
64
- <p class="next-step-heading"><?php _e( 'Extend your marketplace', 'wc-vendors' ); ?></p>
65
- <h3 class="next-step-description"><?php _e( 'Extensions', 'wc-vendors' ); ?></h3>
66
- <p class="next-step-extra-info"><?php _e( 'Extend your marketplace today with a variety of extensions from us and 3rd party developers.', 'wc-vendors' ); ?></p>
67
- </div>
68
- <div class="wcv-wizard-next-step-action">
69
- <p class="wcv-setup-actions step">
70
- <a class="button button-large" href="https://www.wcvendors.com/extensions/?utm_source=setup_wizard&utm_medium=plugin&utm_campaign=setup_complete" target="_blank">
71
- <?php _e( 'View Extensions', 'wc-vendors' ); ?>
72
- </a>
73
- </p>
74
-