Slider by Nivo – Responsive WordPress Image Slider - Version 2.3.1

Version Description

  • 2019-12-07
Download this release

Release Info

Developer codeinwp
Plugin Icon 128x128 Slider by Nivo – Responsive WordPress Image Slider
Version 2.3.1
Comparing to
See all releases

Code changes from version 2.3.0 to 2.3.1

CHANGELOG.md CHANGED
@@ -1,4 +1,8 @@
1
 
 
 
 
 
2
  ### v2.3.0 - 2019-03-08
3
  **Changes:**
4
  * Tested up with WordPress 5.1
1
 
2
+ ### v2.3.1 - 2019-12-07
3
+ **Changes:**
4
+ * Tested up for wp 5.3
5
+
6
  ### v2.3.0 - 2019-03-08
7
  **Changes:**
8
  * Tested up with WordPress 5.1
assets/css/nivo-slider.css CHANGED
@@ -1,7 +1,7 @@
1
  /*
2
  * jQuery Nivo Slider v3.2
3
  * http://nivo.dev7studios.com
4
- * Version: 2.3.0
5
  * Copyright 2012, Dev7studios
6
  * Free to use and abuse under the MIT license.
7
  * http://www.opensource.org/licenses/mit-license.php
1
  /*
2
  * jQuery Nivo Slider v3.2
3
  * http://nivo.dev7studios.com
4
+ * Version: 2.3.1
5
  * Copyright 2012, Dev7studios
6
  * Free to use and abuse under the MIT license.
7
  * http://www.opensource.org/licenses/mit-license.php
includes/admin/class-nivo-slider-admin.php CHANGED
@@ -604,7 +604,7 @@ class Nivo_Slider_Admin extends Nivo_Core_Abstract {
604
 
605
  wp_enqueue_style( $this->plugin_name . '_nivo_css', NIVO_SLIDER_PLUGIN_URL . 'assets/css/nivo-slider.css', array(), $this->version, 'all' );
606
  if ( $load_css ) {
607
- wp_enqueue_style( $this->plugin_name . '_admin_css', NIVO_SLIDER_PLUGIN_URL . 'assets/css/admin.css', array(), $this->version, 'all' );
608
  }
609
 
610
  }
@@ -629,7 +629,7 @@ class Nivo_Slider_Admin extends Nivo_Core_Abstract {
629
  */
630
  wp_enqueue_script( $this->plugin_name . '_core_admin', NIVO_SLIDER_PLUGIN_URL . 'assets/js/core-admin.js', array( 'jquery' ), $this->version, false );
631
  //wp_enqueue_script( $this->plugin_name . '_admin', NIVO_SLIDER_PLUGIN_URL . 'assets/js/admin.js', array( 'jquery' ), $this->version, false );
632
- wp_enqueue_script( $this->plugin_name . '_image_admin', NIVO_SLIDER_PLUGIN_URL . 'assets/js/image-admin.js', array( 'jquery' ), $this->version, false );
633
 
634
  }
635
 
604
 
605
  wp_enqueue_style( $this->plugin_name . '_nivo_css', NIVO_SLIDER_PLUGIN_URL . 'assets/css/nivo-slider.css', array(), $this->version, 'all' );
606
  if ( $load_css ) {
607
+ wp_enqueue_style( $this->plugin_name . '_admin_css', NIVO_SLIDER_PLUGIN_URL . 'assets/css/admin.css', array( 'thickbox' ), $this->version, 'all' );
608
  }
609
 
610
  }
629
  */
630
  wp_enqueue_script( $this->plugin_name . '_core_admin', NIVO_SLIDER_PLUGIN_URL . 'assets/js/core-admin.js', array( 'jquery' ), $this->version, false );
631
  //wp_enqueue_script( $this->plugin_name . '_admin', NIVO_SLIDER_PLUGIN_URL . 'assets/js/admin.js', array( 'jquery' ), $this->version, false );
632
+ wp_enqueue_script( $this->plugin_name . '_image_admin', NIVO_SLIDER_PLUGIN_URL . 'assets/js/image-admin.js', array( 'jquery', 'thickbox' ), $this->version, false );
633
 
634
  }
635
 
includes/admin/libs/class-nivo-core-admin-edit.php CHANGED
@@ -305,6 +305,19 @@ class Nivo_Core_Admin_Edit extends Nivo_Core_Abstract implements Nivo_Library_In
305
  'side'
306
  );
307
 
 
 
 
 
 
 
 
 
 
 
 
 
 
308
  }
309
 
310
  /**
@@ -329,6 +342,28 @@ class Nivo_Core_Admin_Edit extends Nivo_Core_Abstract implements Nivo_Library_In
329
  echo '</p>';
330
  }
331
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
  /**
333
  * Adds tracking box to the edit screen
334
  *
305
  'side'
306
  );
307
 
308
+ if ( ! defined( 'OTTER_BLOCKS_VERSION' ) && current_user_can( 'manage_options' ) && version_compare( get_bloginfo( 'version' ), '5.0', '>=' ) ) {
309
+ add_meta_box(
310
+ $this->labels['post_type'] . 'otter_notice',
311
+ __( 'Try Otter\'s Slider Block', 'nivo-slider' ),
312
+ array(
313
+ $this,
314
+ 'meta_box_otter',
315
+ ),
316
+ $this->labels['post_type'],
317
+ 'side'
318
+ );
319
+ }
320
+
321
  }
322
 
323
  /**
342
  echo '</p>';
343
  }
344
 
345
+ /**
346
+ * Adds the Shortcode meta box to the edit screen
347
+ *
348
+ * @since 2.2.*
349
+ * @access public
350
+ */
351
+ public function meta_box_otter() {
352
+ $url = add_query_arg(
353
+ array(
354
+ 'tab' => 'plugin-information',
355
+ 'plugin' => 'otter-blocks',
356
+ 'TB_iframe' => true,
357
+ 'width' => 800,
358
+ 'height' => 800,
359
+ ),
360
+ network_admin_url( 'plugin-install.php' )
361
+ );
362
+
363
+ echo '<p>' . __( 'Nivo Slider recommends Otter for best in class Slider Block for WordPress\'s new Block Editor.', 'nivo-slider' ) . '</p>';
364
+ echo '<a href="' . esc_url( $url ) . '" class="button button-large thickbox">Try Otter</a>';
365
+ }
366
+
367
  /**
368
  * Adds tracking box to the edit screen
369
  *
includes/class-nivo-slider.php CHANGED
@@ -69,7 +69,7 @@ class Nivo_Slider {
69
  public function __construct() {
70
 
71
  $this->plugin_name = 'nivo-slider';
72
- $this->version = '2.3.0';
73
 
74
  $this->load_dependencies();
75
  $this->set_locale();
69
  public function __construct() {
70
 
71
  $this->plugin_name = 'nivo-slider';
72
+ $this->version = '2.3.1';
73
 
74
  $this->load_dependencies();
75
  $this->set_locale();
nivo-slider-lite.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Slider by Nivo - Responsive Image Slider
4
  * Plugin URI: https://themeisle.com/plugins/nivo-slider-lite
5
  * Description: Nivo Slider is The Most Popular And Easiest to Use WordPress Slider Plugin.
6
- * Version: 2.3.0
7
  * Author: ThemeIsle
8
  * Author URI: https://themeisle.com/
9
  * Text Domain: nivo-slider
3
  * Plugin Name: Slider by Nivo - Responsive Image Slider
4
  * Plugin URI: https://themeisle.com/plugins/nivo-slider-lite
5
  * Description: Nivo Slider is The Most Popular And Easiest to Use WordPress Slider Plugin.
6
+ * Version: 2.3.1
7
  * Author: ThemeIsle
8
  * Author URI: https://themeisle.com/
9
  * Text Domain: nivo-slider
readme.md CHANGED
@@ -2,7 +2,7 @@
2
  **Contributors:** [themeisle](https://profiles.wordpress.org/themeisle), [codeinwp](https://profiles.wordpress.org/codeinwp), [nivoslider](https://profiles.wordpress.org/nivoslider)
3
  **Tags:** slider, nivo,slider plugin, slideshow, slideshow plugin, template tag, wordpress gallery, wordpress image slider, wordpress photo gallery
4
  **Requires at least:** 3.0
5
- **Tested up to:** 5.1
6
  **Stable tag:** trunk
7
  **Requires PHP:** 5.3
8
  **License:** GPLv3
@@ -69,6 +69,11 @@ Purchasing a license gets you access to the full version of the Nivo Slider Word
69
  4. The final result
70
 
71
  ## Changelog ##
 
 
 
 
 
72
  ### 2.3.0 - 2019-03-08 ###
73
 
74
  * Tested up with WordPress 5.1
2
  **Contributors:** [themeisle](https://profiles.wordpress.org/themeisle), [codeinwp](https://profiles.wordpress.org/codeinwp), [nivoslider](https://profiles.wordpress.org/nivoslider)
3
  **Tags:** slider, nivo,slider plugin, slideshow, slideshow plugin, template tag, wordpress gallery, wordpress image slider, wordpress photo gallery
4
  **Requires at least:** 3.0
5
+ **Tested up to:** 5.3
6
  **Stable tag:** trunk
7
  **Requires PHP:** 5.3
8
  **License:** GPLv3
69
  4. The final result
70
 
71
  ## Changelog ##
72
+ ### 2.3.1 - 2019-12-07 ###
73
+
74
+ * Tested up for wp 5.3
75
+
76
+
77
  ### 2.3.0 - 2019-03-08 ###
78
 
79
  * Tested up with WordPress 5.1
readme.txt CHANGED
@@ -2,7 +2,7 @@
2
  Contributors: themeisle, codeinwp, nivoslider
3
  Tags: slider, nivo,slider plugin, slideshow, slideshow plugin, template tag, wordpress gallery, wordpress image slider, wordpress photo gallery
4
  Requires at least: 3.0
5
- Tested up to: 5.1
6
  Stable tag: trunk
7
  Requires PHP: 5.3
8
  License: GPLv3
@@ -69,6 +69,11 @@ Purchasing a license gets you access to the full version of the Nivo Slider Word
69
  4. The final result
70
 
71
  == Changelog ==
 
 
 
 
 
72
  = 2.3.0 - 2019-03-08 =
73
 
74
  * Tested up with WordPress 5.1
2
  Contributors: themeisle, codeinwp, nivoslider
3
  Tags: slider, nivo,slider plugin, slideshow, slideshow plugin, template tag, wordpress gallery, wordpress image slider, wordpress photo gallery
4
  Requires at least: 3.0
5
+ Tested up to: 5.3
6
  Stable tag: trunk
7
  Requires PHP: 5.3
8
  License: GPLv3
69
  4. The final result
70
 
71
  == Changelog ==
72
+ = 2.3.1 - 2019-12-07 =
73
+
74
+ * Tested up for wp 5.3
75
+
76
+
77
  = 2.3.0 - 2019-03-08 =
78
 
79
  * Tested up with WordPress 5.1
themeisle-hash.json CHANGED
@@ -1 +1 @@
1
- {"nivo-slider-lite.php":"d5dfe93a1691ac1f0a707fc273068e34"}
1
+ {"nivo-slider-lite.php":"6dd013059533b9daebe0c3f2527c7539"}
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitc85f2341c5e1e808367485f99d9b60a0::getLoader();
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit404e6133548e50f4181f8af5f995d16a::getLoader();
vendor/codeinwp/themeisle-sdk/CHANGELOG.md CHANGED
@@ -1,3 +1,127 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ## [3.0.5](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.4...v3.0.5) (2019-03-07)
2
 
3
 
1
+ ## [3.1.8](https://github.com/Codeinwp/themeisle-sdk/compare/v3.1.7...v3.1.8) (2019-11-18)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * update developers name ([6aca63e](https://github.com/Codeinwp/themeisle-sdk/commit/6aca63e))
7
+
8
+ ## [3.1.7](https://github.com/Codeinwp/themeisle-sdk/compare/v3.1.6...v3.1.7) (2019-11-07)
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * license field style on wp5.3 ([0239997](https://github.com/Codeinwp/themeisle-sdk/commit/0239997))
14
+ * license field style on wp5.3 ([86d3a1b](https://github.com/Codeinwp/themeisle-sdk/commit/86d3a1b))
15
+
16
+ ## [3.1.6](https://github.com/Codeinwp/themeisle-sdk/compare/v3.1.5...v3.1.6) (2019-09-24)
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * remove license related options when deactivated ([02cd6ce](https://github.com/Codeinwp/themeisle-sdk/commit/02cd6ce))
22
+ * remove license related options when deactivated ([d3c1a1f](https://github.com/Codeinwp/themeisle-sdk/commit/d3c1a1f))
23
+
24
+ ## [3.1.5](https://github.com/Codeinwp/themeisle-sdk/compare/v3.1.4...v3.1.5) (2019-09-11)
25
+
26
+
27
+ ### Bug Fixes
28
+
29
+ * allow unloading certain module features ([2a2559a](https://github.com/Codeinwp/themeisle-sdk/commit/2a2559a))
30
+ * license activation workflow, show error message when failed to a… ([ade795c](https://github.com/Codeinwp/themeisle-sdk/commit/ade795c))
31
+ * license activation workflow, show error message when failed to activate ([2f5cbae](https://github.com/Codeinwp/themeisle-sdk/commit/2f5cbae))
32
+
33
+ ## [3.1.4](https://github.com/Codeinwp/themeisle-sdk/compare/v3.1.3...v3.1.4) (2019-08-23)
34
+
35
+
36
+ ### Bug Fixes
37
+
38
+ * license key was missing on get_version call ([365cde6](https://github.com/Codeinwp/themeisle-sdk/commit/365cde6))
39
+ * license key was missing on get_version call ([c02f225](https://github.com/Codeinwp/themeisle-sdk/commit/c02f225))
40
+
41
+ ## [3.1.3](https://github.com/Codeinwp/themeisle-sdk/compare/v3.1.2...v3.1.3) (2019-08-20)
42
+
43
+
44
+ ### Bug Fixes
45
+
46
+ * license deactivation behaviour https://github.com/Codeinwp/visua… ([59c4afe](https://github.com/Codeinwp/themeisle-sdk/commit/59c4afe))
47
+ * license deactivation behaviour https://github.com/Codeinwp/visualizer-pro/issues/192 ([f641e18](https://github.com/Codeinwp/themeisle-sdk/commit/f641e18))
48
+
49
+ ## [3.1.2](https://github.com/Codeinwp/themeisle-sdk/compare/v3.1.1...v3.1.2) (2019-08-12)
50
+
51
+
52
+ ### Bug Fixes
53
+
54
+ * phpunit test case ([efe851c](https://github.com/Codeinwp/themeisle-sdk/commit/efe851c))
55
+ * url format for license endpoint, improve changelog handling and license checks ([a492c68](https://github.com/Codeinwp/themeisle-sdk/commit/a492c68))
56
+
57
+ ## [3.1.1](https://github.com/Codeinwp/themeisle-sdk/compare/v3.1.0...v3.1.1) (2019-08-08)
58
+
59
+
60
+ ### Bug Fixes
61
+
62
+ * adds is_file for file existence check ([d1205c4](https://github.com/Codeinwp/themeisle-sdk/commit/d1205c4))
63
+ * adds is_file for file existence check ([be119c1](https://github.com/Codeinwp/themeisle-sdk/commit/be119c1))
64
+
65
+ # [3.1.0](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.10...v3.1.0) (2019-08-05)
66
+
67
+
68
+ ### Bug Fixes
69
+
70
+ * adds extra comments for rest of the options, fix [#64](https://github.com/Codeinwp/themeisle-sdk/issues/64) ([018b22f](https://github.com/Codeinwp/themeisle-sdk/commit/018b22f))
71
+ * hide license key when active under a password mask, fix [#67](https://github.com/Codeinwp/themeisle-sdk/issues/67) ([c0633c2](https://github.com/Codeinwp/themeisle-sdk/commit/c0633c2))
72
+ * new uninstall feedback popup issues ([5bda4bd](https://github.com/Codeinwp/themeisle-sdk/commit/5bda4bd))
73
+ * phpcs indentation errors ([d59ed4f](https://github.com/Codeinwp/themeisle-sdk/commit/d59ed4f))
74
+ * undefined notices on license check, fix [#60](https://github.com/Codeinwp/themeisle-sdk/issues/60) ([7f56a97](https://github.com/Codeinwp/themeisle-sdk/commit/7f56a97))
75
+ * uninstall feedback popup placement [[#61](https://github.com/Codeinwp/themeisle-sdk/issues/61)] ([1102d6c](https://github.com/Codeinwp/themeisle-sdk/commit/1102d6c))
76
+
77
+
78
+ ### Features
79
+
80
+ * new product feedback popup ([f0dbab3](https://github.com/Codeinwp/themeisle-sdk/commit/f0dbab3))
81
+ * new uninstall feedback form for themes ([8a29f21](https://github.com/Codeinwp/themeisle-sdk/commit/8a29f21))
82
+
83
+ ## [3.0.10](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.9...v3.0.10) (2019-07-16)
84
+
85
+
86
+ ### Bug Fixes
87
+
88
+ * compatibility with lower PHP versions ([065ac8e](https://github.com/Codeinwp/themeisle-sdk/commit/065ac8e))
89
+ * not loading licenser when SDK comes from theme [[#62](https://github.com/Codeinwp/themeisle-sdk/issues/62)] ([b706ca7](https://github.com/Codeinwp/themeisle-sdk/commit/b706ca7))
90
+ * not loading licenser when SDK comes from theme [[#65](https://github.com/Codeinwp/themeisle-sdk/issues/65) ([419d8e6](https://github.com/Codeinwp/themeisle-sdk/commit/419d8e6))
91
+ * preserve loaded when adding the licenser one ([cd50434](https://github.com/Codeinwp/themeisle-sdk/commit/cd50434))
92
+
93
+ ## [3.0.9](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.8...v3.0.9) (2019-06-26)
94
+
95
+
96
+ ### Bug Fixes
97
+
98
+ * adds new icon for dashboard widget ([de78068](https://github.com/Codeinwp/themeisle-sdk/commit/de78068))
99
+ * anchor element on license activation message which should link to the license field, fix [#57](https://github.com/Codeinwp/themeisle-sdk/issues/57) ([2e78856](https://github.com/Codeinwp/themeisle-sdk/commit/2e78856))
100
+ * change uninstall feedback logo with new version, fix [#58](https://github.com/Codeinwp/themeisle-sdk/issues/58) ([2554a4f](https://github.com/Codeinwp/themeisle-sdk/commit/2554a4f))
101
+ * remove soon to expire notice, fix https://github.com/Codeinwp/themeisle/issues/752 ([a126225](https://github.com/Codeinwp/themeisle-sdk/commit/a126225))
102
+
103
+ ## [3.0.8](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.7...v3.0.8) (2019-05-28)
104
+
105
+
106
+ ### Bug Fixes
107
+
108
+ * undefined class on diff module which should check the class on global namespace ([df6bb12](https://github.com/Codeinwp/themeisle-sdk/commit/df6bb12))
109
+
110
+ ## [3.0.7](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.6...v3.0.7) (2019-05-27)
111
+
112
+
113
+ ### Bug Fixes
114
+
115
+ * change store url with the new domain ([6bdbe1e](https://github.com/Codeinwp/themeisle-sdk/commit/6bdbe1e))
116
+
117
+ ## [3.0.6](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.5...v3.0.6) (2019-05-21)
118
+
119
+
120
+ ### Bug Fixes
121
+
122
+ * build php version for deployment stage ([a785699](https://github.com/Codeinwp/themeisle-sdk/commit/a785699))
123
+ * uninstall feedback should load only on the proper pages ([259e78f](https://github.com/Codeinwp/themeisle-sdk/commit/259e78f))
124
+
125
  ## [3.0.5](https://github.com/Codeinwp/themeisle-sdk/compare/v3.0.4...v3.0.5) (2019-03-07)
126
 
127
 
vendor/codeinwp/themeisle-sdk/load.php CHANGED
@@ -14,14 +14,22 @@ if ( ! defined( 'ABSPATH' ) ) {
14
  return;
15
  }
16
  // Current SDK version and path.
17
- $themeisle_sdk_version = '3.0.5';
18
  $themeisle_sdk_path = dirname( __FILE__ );
19
 
20
  global $themeisle_sdk_max_version;
21
  global $themeisle_sdk_max_path;
22
 
 
 
 
 
 
 
 
 
23
  if ( version_compare( $themeisle_sdk_version, $themeisle_sdk_max_path ) == 0 &&
24
- apply_filters( 'themeisle_sdk_should_overwrite_path', false, $themeisle_sdk_path, $themeisle_sdk_max_path ) ) {
25
  $themeisle_sdk_max_path = $themeisle_sdk_path;
26
  }
27
 
@@ -30,6 +38,21 @@ if ( version_compare( $themeisle_sdk_version, $themeisle_sdk_max_version ) > 0 )
30
  $themeisle_sdk_max_path = $themeisle_sdk_path;
31
  }
32
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  // load the latest sdk version from the active Themeisle products.
34
  if ( ! function_exists( 'themeisle_sdk_load_latest' ) ) :
35
  /**
14
  return;
15
  }
16
  // Current SDK version and path.
17
+ $themeisle_sdk_version = '3.1.8';
18
  $themeisle_sdk_path = dirname( __FILE__ );
19
 
20
  global $themeisle_sdk_max_version;
21
  global $themeisle_sdk_max_path;
22
 
23
+ // If this is the latest SDK and it comes from a theme, we should load licenser separately.
24
+ $themeisle_sdk_relative_licenser_path = '/src/Modules/Licenser.php';
25
+
26
+ global $themeisle_sdk_abs_licenser_path;
27
+ if ( ! is_file( $themeisle_sdk_path . $themeisle_sdk_relative_licenser_path ) && is_file( $themeisle_sdk_max_path . $themeisle_sdk_relative_licenser_path ) ) {
28
+ $themeisle_sdk_abs_licenser_path = $themeisle_sdk_max_path . $themeisle_sdk_relative_licenser_path;
29
+ add_filter( 'themeisle_sdk_required_files', 'themeisle_sdk_load_licenser_if_present' );
30
+ }
31
  if ( version_compare( $themeisle_sdk_version, $themeisle_sdk_max_path ) == 0 &&
32
+ apply_filters( 'themeisle_sdk_should_overwrite_path', false, $themeisle_sdk_path, $themeisle_sdk_max_path ) ) {
33
  $themeisle_sdk_max_path = $themeisle_sdk_path;
34
  }
35
 
38
  $themeisle_sdk_max_path = $themeisle_sdk_path;
39
  }
40
 
41
+ // load the latest sdk version from the active Themeisle products.
42
+ if ( ! function_exists( 'themeisle_sdk_load_licenser_if_present' ) ) :
43
+ /**
44
+ * Always load the licenser, if present.
45
+ *
46
+ * @param array $to_load Previously files to load.
47
+ */
48
+ function themeisle_sdk_load_licenser_if_present( $to_load ) {
49
+ global $themeisle_sdk_abs_licenser_path;
50
+ $to_load[] = $themeisle_sdk_abs_licenser_path;
51
+
52
+ return $to_load;
53
+ }
54
+ endif;
55
+
56
  // load the latest sdk version from the active Themeisle products.
57
  if ( ! function_exists( 'themeisle_sdk_load_latest' ) ) :
58
  /**
vendor/codeinwp/themeisle-sdk/src/Loader.php CHANGED
@@ -84,7 +84,7 @@ final class Loader {
84
  */
85
  public static function add_product( $base_file ) {
86
 
87
- if ( ! is_readable( $base_file ) ) {
88
  return self::$instance;
89
  }
90
  $product = new Product( $base_file );
84
  */
85
  public static function add_product( $base_file ) {
86
 
87
+ if ( ! is_file( $base_file ) ) {
88
  return self::$instance;
89
  }
90
  $product = new Product( $base_file );
vendor/codeinwp/themeisle-sdk/src/Modules/Dashboard_widget.php CHANGED
@@ -72,7 +72,9 @@ class Dashboard_Widget extends Abstract_Module {
72
  * @return Dashboard_Widget Module instance.
73
  */
74
  public function load( $product ) {
75
-
 
 
76
  $this->product = $product;
77
  $this->dashboard_name = apply_filters( 'themeisle_sdk_dashboard_widget_name', 'WordPress Guides/Tutorials' );
78
  $this->feeds = apply_filters(
@@ -127,10 +129,10 @@ class Dashboard_Widget extends Abstract_Module {
127
  }
128
 
129
  #themeisle h2.hndle {
130
- background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA3Ny4xMiA3Ny4xMiI+PHRpdGxlPkFzc2V0IDM8L3RpdGxlPjxwYXRoIGQ9Ik03NS43Niw0Ny42cS0xLjUsNi40Ni00LjA3LDkuMjZBMzYuMjIsMzYuMjIsMCwwLDEsNjMuMjYsNjNhNTEsNTEsMCwwLDEtOS43OSw0LjZoLS4xNXY0LjgyQTQuNjYsNC42NiwwLDAsMSw1Miw3NS43Niw0LjA3LDQuMDcsMCwwLDEsNDksNzcuMTJhNCw0LDAsMCwxLTIuMTgtLjYxQTQuOTQsNC45NCwwLDAsMSw0NS4xOSw3NWE0LjQyLDQuNDIsMCwwLDEtNy41NCwwLDQuOTQsNC45NCwwLDAsMS0xLjU4LDEuNSwzLjc1LDMuNzUsMCwwLDEtMiwuNjFBNC4yNyw0LjI3LDAsMCwxLDMwLjI3LDc1YTQuOTQsNC45NCwwLDAsMS0xLjU4LDEuNSw0LDQsMCwwLDEtMi4xOC42MSwzLjkzLDMuOTMsMCwwLDEtMy4xNi0xLjQzLDUuMyw1LjMsMCwwLDEtMS4yMS0zLjU0LDEzLjgxLDEzLjgxLDAsMCwxLTguNTgsMywxMy4yMywxMy4yMywwLDAsMS05LTMuNDdBMTguMjEsMTguMjEsMCwwLDAsOSw3MC43OWExNC4yNiwxNC4yNiwwLDAsMS03LjgzLTUuNDIsMTYuMTIsMTYuMTIsMCwwLDAsNS4xOS4wNywxMi44OSwxMi44OSwwLDAsMCw0LjktMS43M1EzLjE1LDU1LjQzLDEuMDUsNTAuNDZhMTgsMTgsMCwwLDEtMS02LjkzQTQwLDQwLDAsMCwxLDEuMjEsMzQsMjYuNTksMjYuNTksMCwwLDEsNS4yNywyNC4xUTguNDQsMTkuNDMsMTMsMTkuNDNhMy40MSwzLjQxLDAsMCwxLDMuNDcsMi4yNmMuNi0uOCwxLjItMS41NiwxLjgxLTIuMjZsLjQ1LS40NS43NS0uNzUsMS4wNS0xLjgxYTM1LjIsMzUuMiwwLDAsMSwyLjExLTMuMzIsMjguNTcsMjguNTcsMCwwLDEsOS4xMi03LjY4QTIzLjQsMjMuNCwwLDAsMSw0Mi45MywyLjU2YTIyLjIyLDIyLjIyLDAsMCwxLDIuNzEuMTVBOC4xNiw4LjE2LDAsMCwxLDUxLjgxLDAsOC42OSw4LjY5LDAsMCwxLDU4LDIuNDFhMS41MSwxLjUxLDAsMCwxLC4xNS42OGMwLC4yNS0uNTUuOTMtMS42NiwybC0uMy4zYTkuNjksOS42OSwwLDAsMSwxLjU4LjgzYy41NS4zNS44My42NS44My45YTEuNjIsMS42MiwwLDAsMS0uNiwxbC0uMTUuMTVxNi43OCw2LDguNTgsMTYuMjdBMy4zLDMuMywwLDAsMSw2OSwyMy4zNWE2LjQ4LDYuNDgsMCwwLDEsNC4yMiwyLjFxMy45MiwzLjMyLDMuOTIsMTEuOUE0Mi4wNSw0Mi4wNSwwLDAsMSw3NS43Niw0Ny42Wk01My42Miw1NC4wN2EyNCwyNCwwLDAsMS0xNCw0LjUyQTIxLjQxLDIxLjQxLDAsMCwxLDI3LDU0LjY3LDI0LjI4LDI0LjI4LDAsMCwxLDE4LjUzLDQ1YTI5LDI5LDAsMCwxLTMtMTMsMzEuNzgsMzEuNzgsMCwwLDEsLjkxLTcuNTNBMzIuMTcsMzIuMTcsMCwwLDAsMTEuOSw0MS4yN2EzMy41LDMzLjUsMCwwLDAsMi43OSwxMy40LDI5LjEsMjkuMSwwLDAsMCw3LjksMTAuODUsNC42OCw0LjY4LDAsMCwxLDEuNjYtMS44OCw0LjE3LDQuMTcsMCwwLDEsNC40NC0uMDgsNC41LDQuNSwwLDAsMSwxLjU4LDEuNjZBNC4yLDQuMiwwLDAsMSwzNCw2M2EzLjgzLDMuODMsMCwwLDEsMiwuNiw0LjUsNC41LDAsMCwxLDEuNTgsMS42Niw0LjI3LDQuMjcsMCwwLDEsNy41NCwwLDQuNSw0LjUsMCwwLDEsMS41OC0xLjY2LDQuMTcsNC4xNywwLDAsMSw0LjQ0LjA4LDMuODYsMy44NiwwLDAsMSwxLjUxLDEuNzMsMzAuMTcsMzAuMTcsMCwwLDAsNy42OC05Ljk0LDMxLjE4LDMxLjE4LDAsMCwwLDMuMTYtMTIuMzVBMjguMzksMjguMzksMCwwLDEsNTMuNjIsNTQuMDdaTTI4Ljc3LDY1LjM3YTMuMSwzLjEsMCwwLDAtNC4zNywwLDMuMDYsMy4wNiwwLDAsMC0uOSwyLjI2djQuODJhMy4zMiwzLjMyLDAsMCwwLC45LDIuMzMsMi45MywyLjkzLDAsMCwwLDQuMzcsMCwzLjMyLDMuMzIsMCwwLDAsLjktMi4zM1Y2Ny42M0EzLjA2LDMuMDYsMCwwLDAsMjguNzcsNjUuMzdabS45LTQ4YTQuMjQsNC4yNCwwLDAsMCwzLjQ3LDEuNzMsNC40NSw0LjQ1LDAsMCwwLDMuNTQtMS43Myw2LDYsMCwwLDAsMS40My0zLjkyLDUuNyw1LjcsMCwwLDAtMS40My0zLjg0QTQuNTMsNC41MywwLDAsMCwzMy4xNCw4YTQuMzEsNC4zMSwwLDAsMC0zLjQ3LDEuNjYsNS43OSw1Ljc5LDAsMCwwLTEuMzUsMy43N0E2LjMzLDYuMzMsMCwwLDAsMjkuNjcsMTcuNFptNi40OCw0OGEzLjEsMy4xLDAsMCwwLTQuMzcsMCwzLjA2LDMuMDYsMCwwLDAtLjksMi4yNnY0LjgyYTMuMzIsMy4zMiwwLDAsMCwuOSwyLjMzLDIuOTMsMi45MywwLDAsMCw0LjM3LDAsMy4zMiwzLjMyLDAsMCwwLC45LTIuMzNWNjcuNjNBMy4wNiwzLjA2LDAsMCwwLDM2LjE1LDY1LjM3Wm0tNC4wNy01NC4zYTIuMzcsMi4zNywwLDAsMSwyLTEsMi4xNywyLjE3LDAsMCwxLDEuODgsMSw0LjEsNC4xLDAsMCwxLDAsNC41MiwyLjE3LDIuMTcsMCwwLDEtMS44OCwxLDIuMzcsMi4zNywwLDAsMS0yLTEsMy43MiwzLjcyLDAsMCwxLS43NS0yLjM0QTMuNDksMy40OSwwLDAsMSwzMi4wOCwxMS4wN1ptNSw5LjQxYTIwLjYxLDIwLjYxLDAsMCwwLTMuNTQsMTIuMjgsMTcuMTUsMTcuMTUsMCwwLDAsNC4wNywxMSwxMi40MywxMi40MywwLDAsMCw5Ljg3LDQuNDUsMTUuMywxNS4zLDAsMCwwLDktMywxMywxMywwLDAsMCwuNi0zLjMycTAtMy4zMi0zLjE2LTMuMzFhOC41OCw4LjU4LDAsMCwwLTIsLjNxLTcuODMsMS41LTExLjU5LS4zLTQuNTMtMi4xMi00LjUyLTkuMzRBMzcuOTIsMzcuOTIsMCwwLDEsMzcuMDUsMjAuNDhaTTYxLjQ1LDE3QTEyLjg0LDEyLjg0LDAsMCwwLDUxLjIxLDEyLjJhMTUuMTEsMTUuMTEsMCwwLDAtNi40LDEuNDMsMTcuODMsMTcuODMsMCwwLDAtNS41LDRxLTYuMTgsMjAuNjQsNi4xOCwyMC42NEEyNC43NSwyNC43NSwwLDAsMCw0OSwzNy44MWEzOC45MiwzOC45MiwwLDAsMSw0LjgyLS40NmMxLjgxLDAsMy4wNi40NiwzLjc3LDEuMzZxMS4zNSwxLjUuNzUsNS4xMmEyMS43MiwyMS43MiwwLDAsMCw1LTcuMTVBMjEuMzgsMjEuMzgsMCwwLDAsNjUuMDcsMjgsMTcuNDQsMTcuNDQsMCwwLDAsNjEuNDUsMTdaTTQzLjYsNjUuMzdhMi43MiwyLjcyLDAsMCwwLTIuMS0uOSwzLDMsMCwwLDAtMi4xOS45LDMuMDYsMy4wNiwwLDAsMC0uOSwyLjI2djQuODJhMy4zMiwzLjMyLDAsMCwwLC45LDIuMzMsMi44NCwyLjg0LDAsMCwwLDIuMTksMSwyLjYxLDIuNjEsMCwwLDAsMi4xLTEsMy40NSwzLjQ1LDAsMCwwLC44My0yLjMzVjY3LjYzQTMuMTcsMy4xNywwLDAsMCw0My42LDY1LjM3Wm03LjQ2LDBhMywzLDAsMCwwLTIuMTgtLjksMi43MywyLjczLDAsMCwwLTIuMTEuOSwzLjE3LDMuMTcsMCwwLDAtLjgzLDIuMjZ2NC44MmEzLjQ1LDMuNDUsMCwwLDAsLjgzLDIuMzMsMi42MSwyLjYxLDAsMCwwLDIuMTEsMSwyLjgzLDIuODMsMCwwLDAsMi4xOC0xLDMuMzIsMy4zMiwwLDAsMCwuOS0yLjMzVjY3LjYzQTMuMDYsMy4wNiwwLDAsMCw1MS4wNiw2NS4zN1oiLz48L3N2Zz4=');
131
  background-repeat: no-repeat;
132
  background-position: 92% 50%;
133
- background-size: 30px;
134
  }
135
 
136
  #themeisle .inside {
72
  * @return Dashboard_Widget Module instance.
73
  */
74
  public function load( $product ) {
75
+ if ( apply_filters( 'themeisle_sdk_hide_dashboard_widget', false ) ) {
76
+ return;
77
+ }
78
  $this->product = $product;
79
  $this->dashboard_name = apply_filters( 'themeisle_sdk_dashboard_widget_name', 'WordPress Guides/Tutorials' );
80
  $this->feeds = apply_filters(
129
  }
130
 
131
  #themeisle h2.hndle {
132
+ background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABbCAMAAADncTNAAAAAtFBMVEVHcEyAgIB/f3+xsbGgoaGBgYGCgoKKioqAgIC1tbW5ubnFx8iAgIDU1taBgYGCgoKAgIC0tLXW19jW2NiAgIC3uLiBgYHLzMy4uLhycnLW19d/f3/T1NW0tLTX19mVlZWvr6+BgYHl5eWKiottbW5JSUnW2Nm5ubnh4eHT1NWVlZVjY2N4eHh9fX6pqqq+v79PT0/39/fu7u7Nzc7Z2ttYWFgBAQHDw8P////JysoZGRk0NTZqJc/sAAAAIXRSTlMA0FL7/oEnEPL6eibivm9gwJya76/enFq2CXI+2lFAyM8GATmPAAADj0lEQVR4Xu2YaW/iOhSGAwRCWDosnXa6znjJvm8svf//f12TuARyhiR2pfnUR6gSEnr0+uT4xK7yRb755pvhHePli5K7Bfpkuhoq8ozRJdMH+WWha6Z3sqYparCSLRJqspjImVbANJU03cNMMpofAwQZCGsmpQYyFvVM0Q00OQ9koMl5IPcCoro+RA1Dt2Ea9n9eZ0+YHJLkgIlkDywQx00wCTyaReiKH8LbNU9ybJOdkchV6QFxyCFLbVvdfaREqgUWg/tx2UbqIcK2Hex2TdGLwFTjIj3XP3YfCZFsb23KRZn/3263oymSFI0/a5S4PqUBjoBIJBDjeEhCN0wxQSRybIxtJ3K5SGzuE/vAwIQc8ZmMMJFAIM4oikZItfEFtorGgoE43FObwqHU68OtPCnOz8KZ2Jbl5LgkSW0Tc7YyIz/EFWmS4jMbiZU5mJOmKRaJpKGGyLZtDJh3iyaNUu/3+xyKnrtFL71EG+FTiMpENhQtxUQ8kSOXCIr2tnCNhg/gTX0SHYFp0t7TCwQZ7U841yoHrW6rtGroUwTWVnLMssxx+H4bgZcSOFf5MYx0Ae8FghomMDyC2EBNImBywPkNTDNqGLQpIg2TjUNU8tBy9DQMo0DAZF16rAi7vJAtFTIYFAHUc6hIRW6OuOhJgaCSwmDEAYK4oa7ro+qIEyJU/US7KTJKPNSFT9tFgVFBu0SF1y7yjX4masRA9Da7EFGj28R/BkQz6xGIOurkx38T/bKs9Uk8aIiMwm/Jw0VP1yLrJwt13xAxvABBgsK4KWLov35DkRF7ZaqgzuZ7MQ8MOntmVYyAqKTwaICKqvSUFnVccMN5sziEP/5+xGDTahbH5Q3ZB76zr8fI+nJtvUUU3t3ml5GKviK/npCg3CGodnuJ4JVkfRFJYGVDBZrqKnn9RLf+CzDTS5PaN5J38+auzX4ykU4Qoj0rdKfcYs5ijfo9OL/uRUgZyQr7NCWtWwiUSLc4arfJa7lpszTA1OJZAQ8w8dXFrR5YHzCWSnS3pZ18tOi4Ps4vl/c7i/6qomjRecN+UubrPyPGn/VEMU3T0UFHkaPzpgjxmJsnjmrtionlMDZiog0TsY/DPtn8SXtlBvbtxKtwopy7lqW3smQO+yoGE1Uu55GJ3pmI8ygoejZNnqj0vnIRCyTKfLstRdtStGQi09myUsvwvlkuzSUXbV+Xz5ryBebV33fln/A/moud69FZiEYAAAAASUVORK5CYII=');
133
  background-repeat: no-repeat;
134
  background-position: 92% 50%;
135
+ background-size: 25px;
136
  }
137
 
138
  #themeisle .inside {
vendor/codeinwp/themeisle-sdk/src/Modules/Endpoint.php CHANGED
@@ -273,7 +273,7 @@ class Endpoint extends Abstract_Module {
273
 
274
  // fetch the calculated hashes.
275
  if ( ! $wp_filesystem->is_readable( $path . '/' . self::HASH_FILE ) ) {
276
- return new WP_Error( 'themeisle_sdk_hash_not_found', sprintf( '%s not found', self::HASH_FILE ) );
277
  }
278
 
279
  $hashes = json_decode( $wp_filesystem->get_contents( $path . '/' . self::HASH_FILE ), true );
273
 
274
  // fetch the calculated hashes.
275
  if ( ! $wp_filesystem->is_readable( $path . '/' . self::HASH_FILE ) ) {
276
+ return new \WP_Error( 'themeisle_sdk_hash_not_found', sprintf( '%s not found', self::HASH_FILE ) );
277
  }
278
 
279
  $hashes = json_decode( $wp_filesystem->get_contents( $path . '/' . self::HASH_FILE ), true );
vendor/codeinwp/themeisle-sdk/src/Modules/Licenser.php CHANGED
@@ -89,6 +89,9 @@ class Licenser extends Abstract_Module {
89
  if ( ! is_admin() ) {
90
  return false;
91
  }
 
 
 
92
  add_settings_field(
93
  $this->product->get_key() . '_license',
94
  $this->product->get_name() . ' license',
@@ -109,8 +112,70 @@ class Licenser extends Abstract_Module {
109
  $valid_string = apply_filters( $this->product->get_key() . '_lc_valid_string', 'Valid' );
110
  $invalid_string = apply_filters( $this->product->get_key() . '_lc_invalid_string', 'Invalid' );
111
  $license_message = apply_filters( $this->product->get_key() . '_lc_license_message', 'Enter your license from %s purchase history in order to get %s updates' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
112
 
113
- echo '<p ><input ' . ( ( 'valid' === $status ) ? ( 'style="border:1px solid #7ad03a; "' ) : '' ) . ' type="text" id="' . $this->product->get_key() . '_license" name="' . $this->product->get_key() . '_license" value="' . $value . '" /><a ' . ( ( 'valid' === $status ) ? ( 'style="color:#fff;background: #7ad03a; display: inline-block;text-decoration: none;font-size: 13px;line-height: 26px;height: 26px; margin-left:5px; padding: 0 10px 1px; -webkit-border-radius: 3px;border-radius: 3px; ">' . $valid_string ) : ( 'style="color:#fff;background: #dd3d36; display: inline-block;text-decoration: none;font-size: 13px;line-height: 26px;height: 26px; margin-left:5px; padding: 0 10px 1px; -webkit-border-radius: 3px;border-radius: 3px; ">' . $invalid_string ) ) . ' </a>&nbsp;&nbsp;&nbsp;<button name="' . $this->product->get_key() . '_btn_trigger" ' . ( ( 'valid' === $status ) ? ( ' class="button button-primary">' . $deactivate_string ) : ( ' class="button button-primary" value="yes" type="submit" >' . $activate_string ) ) . ' </button></p><p class="description">' . sprintf( $license_message, '<a href="' . $this->get_api_url() . '">' . $this->get_distributor_name() . '</a> ', $this->product->get_type() ) . '</p>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
 
115
  }
116
 
@@ -166,10 +231,13 @@ class Licenser extends Abstract_Module {
166
  if ( ! is_admin() ) {
167
  return false;
168
  }
 
 
 
 
169
  $status = $this->get_license_status();
170
  $no_activations_string = apply_filters( $this->product->get_key() . '_lc_no_activations_string', 'No activations left for %s !!!. You need to upgrade your plan in order to use %s on more websites. Please ask the %s Staff for more details.' );
171
  $no_valid_string = apply_filters( $this->product->get_key() . '_lc_no_valid_string', 'In order to benefit from updates and support for %s, please add your license code from your <a href="%s" target="_blank">purchase history</a> and validate it <a href="%s">here</a>. ' );
172
- $expiration_string = apply_filters( $this->product->get_key() . '_lc_expiration_string', 'Your license is about to expire for %s. You can go to %s and renew it ' );
173
 
174
  // No activations left for this license.
175
  if ( 'valid' != $status && $this->check_activation() ) {
@@ -195,7 +263,7 @@ class Licenser extends Abstract_Module {
195
  ?>
196
  <div class="error">
197
  <p>
198
- <strong><?php echo sprintf( $no_valid_string, $this->product->get_name() . ' ' . $this->product->get_type(), $this->get_api_url(), admin_url( 'options-general.php' ) . '#' . $this->product->get_key() ); ?> </strong>
199
  </p>
200
  </div>
201
  <?php
@@ -203,26 +271,6 @@ class Licenser extends Abstract_Module {
203
  return false;
204
  }
205
 
206
- // Expired and soon to expire license.
207
- if ( 'valid' == $status && $this->check_expiration() ) {
208
- ?>
209
- <div class="update-nag">
210
- <p>
211
- <strong>
212
- <?php
213
- echo sprintf(
214
- $expiration_string,
215
- $this->product->get_name() . ' ' . $this->product->get_type(),
216
- '<a href="' . $this->renew_url() . '" target="_blank">' . $this->get_distributor_name() . '</a>'
217
- );
218
- ?>
219
- </strong>
220
- </p>
221
- </div>
222
- <?php
223
- return false;
224
- }
225
-
226
  return true;
227
  }
228
 
@@ -376,6 +424,26 @@ class Licenser extends Abstract_Module {
376
  update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
377
  }
378
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
379
  /**
380
  * Activate the license remotely.
381
  */
@@ -402,19 +470,22 @@ class Licenser extends Abstract_Module {
402
  $response = wp_remote_get( add_query_arg( $api_params, $this->get_api_url() ) );
403
  // make sure the response came back okay.
404
  if ( is_wp_error( $response ) ) {
405
- $license_data = new \stdClass();
406
- $license_data->license = ( 'valid' != $status ) ? 'valid' : 'invalid';
407
 
408
- } else {
409
- $license_data = json_decode( wp_remote_retrieve_body( $response ) );
410
- if ( ! is_object( $license_data ) ) {
411
- $license_data = new \stdClass();
412
- $license_data->license = ( 'valid' != $status ) ? 'valid' : 'invalid';
413
- }
414
- if ( ! isset( $license_data->license ) ) {
415
- $license_data->license = 'invalid';
416
- }
417
  }
 
 
 
 
 
 
 
 
 
 
 
 
418
  if ( ! isset( $license_data->key ) ) {
419
  $license_data->key = $license;
420
  }
@@ -422,10 +493,19 @@ class Licenser extends Abstract_Module {
422
  $this->reset_failed_checks();
423
  }
424
 
 
 
 
 
 
 
 
 
 
 
425
  if ( isset( $license_data->plan ) ) {
426
  update_option( $this->product->get_key() . '_license_plan', $license_data->plan );
427
  }
428
-
429
  update_option( $this->product->get_key() . '_license_data', $license_data );
430
  set_transient( $this->product->get_key() . '_license_data', $license_data, 12 * HOUR_IN_SECONDS );
431
 
@@ -445,7 +525,7 @@ class Licenser extends Abstract_Module {
445
  function update_nag() {
446
  $theme = wp_get_theme( $this->product->get_slug() );
447
  $api_response = get_transient( $this->product_key );
448
- if ( false === $api_response ) {
449
  return;
450
  }
451
  $update_url = wp_nonce_url( 'update.php?action=upgrade-theme&amp;theme=' . urlencode( $this->product->get_slug() ), 'upgrade-theme_' . $this->product->get_slug() );
@@ -457,7 +537,7 @@ class Licenser extends Abstract_Module {
457
  '<strong>%1$s %2$s</strong> is available. <a href="%3$s" class="thickbox" title="%4s">Check out what\'s new</a> or <a href="%5$s"%6$s>update now</a>.',
458
  $theme->get( 'Name' ),
459
  $api_response->new_version,
460
- '#TB_inline?width=640&amp;inlineId=' . $this->product->get_version() . '_changelog',
461
  $theme->get( 'Name' ),
462
  $update_url,
463
  $update_onclick
@@ -507,7 +587,7 @@ class Licenser extends Abstract_Module {
507
 
508
  return false;
509
  }
510
- $update_data->sections = maybe_unserialize( $update_data->sections );
511
 
512
  set_transient( $this->product_key, $update_data, 12 * HOUR_IN_SECONDS );
513
  }
@@ -530,18 +610,17 @@ class Licenser extends Abstract_Module {
530
  $api_params = array(
531
  'edd_action' => 'get_version',
532
  'version' => $this->product->get_version(),
533
- 'license' => $this->license_key,
534
- 'name' => $this->product->get_name(),
535
  'slug' => $this->product->get_slug(),
536
- 'author' => $this->get_distributor_name(),
537
  'url' => rawurlencode( home_url() ),
538
  );
539
  $response = wp_remote_get(
540
- $this->get_api_url(),
541
  array(
542
  'timeout' => 15,
543
  'sslverify' => false,
544
- 'body' => $api_params,
545
  )
546
  );
547
  if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) {
89
  if ( ! is_admin() ) {
90
  return false;
91
  }
92
+ if ( apply_filters( $this->product->get_key() . '_hide_license_field', false ) ) {
93
+ return;
94
+ }
95
  add_settings_field(
96
  $this->product->get_key() . '_license',
97
  $this->product->get_name() . ' license',
112
  $valid_string = apply_filters( $this->product->get_key() . '_lc_valid_string', 'Valid' );
113
  $invalid_string = apply_filters( $this->product->get_key() . '_lc_invalid_string', 'Invalid' );
114
  $license_message = apply_filters( $this->product->get_key() . '_lc_license_message', 'Enter your license from %s purchase history in order to get %s updates' );
115
+ $error_message = $this->get_error();
116
+ ?>
117
+ <style type="text/css">
118
+ input.themeisle-sdk-text-input-valid {
119
+ border: 1px solid #7ad03a;
120
+ }
121
+
122
+ input.themeisle-sdk-license-input {
123
+ width: 300px;
124
+ padding: 0 8px;
125
+ line-height: 2;
126
+ min-height: 30px;
127
+ }
128
+
129
+ .themeisle-sdk-license-deactivate-cta {
130
+ color: #fff;
131
+ background: #7ad03a;
132
+ display: inline-block;
133
+ text-decoration: none;
134
+ font-size: 13px;
135
+ line-height: 30px;
136
+ height: 26px;
137
+ margin-left: 5px;
138
+ padding: 0 10px 3px;
139
+ -webkit-border-radius: 3px;
140
+ border-radius: 3px;
141
+ }
142
+
143
+ .themeisle-sdk-license-activate-cta {
144
+ color: #fff;
145
+ background: #dd3d36;
146
+ display: inline-block;
147
+ text-decoration: none;
148
+ font-size: 13px;
149
+ line-height: 30px;
150
+ height: 26px;
151
+ margin-left: 5px;
152
+ padding: 0 10px 3px;
153
+ -webkit-border-radius: 3px;
154
+ border-radius: 3px;
155
+ }
156
+
157
+ button.button.themeisle-sdk-licenser-button-cta {
158
+ line-height: 26px;
159
+ height: 29px;
160
+ vertical-align: top;
161
+ }
162
 
163
+ </style>
164
+ <?php
165
+ echo sprintf(
166
+ '<p>%s<input class="themeisle-sdk-license-input %s" type="text" id="%s_license" name="%s_license" value="%s" /><a class="%s">%s</a>&nbsp;&nbsp;&nbsp;<button name="%s_btn_trigger" class="button button-primary themeisle-sdk-licenser-button-cta" value="yes" type="submit" >%s</button></p><p class="description">%s</p>%s',
167
+ ( ( 'valid' === $status ) ? sprintf( '<input type="hidden" value="%s" name="%s_license" />', $value, $this->product->get_key() ) : '' ),
168
+ ( ( 'valid' === $status ) ? 'themeisle-sdk-text-input-valid' : '' ),
169
+ $this->product->get_key(),
170
+ ( ( 'valid' === $status ) ? $this->product->get_key() . '_mask' : $this->product->get_key() ),
171
+ ( ( 'valid' === $status ) ? ( str_repeat( '*', 30 ) . substr( $value, - 5 ) ) : $value ),
172
+ ( 'valid' === $status ? 'themeisle-sdk-license-deactivate-cta' : 'themeisle-sdk-license-activate-cta' ),
173
+ ( 'valid' === $status ? $valid_string : $invalid_string ),
174
+ $this->product->get_key(),
175
+ ( 'valid' === $status ? $deactivate_string : $activate_string ),
176
+ sprintf( $license_message, '<a href="' . $this->get_api_url() . '">' . $this->get_distributor_name() . '</a> ', $this->product->get_type() ),
177
+ empty( $error_message ) ? '' : sprintf( '<p style="color:#dd3d36">%s</p>', $error_message )
178
+ );
179
 
180
  }
181
 
231
  if ( ! is_admin() ) {
232
  return false;
233
  }
234
+
235
+ if ( apply_filters( $this->product->get_key() . '_hide_license_notices', false ) ) {
236
+ return;
237
+ }
238
  $status = $this->get_license_status();
239
  $no_activations_string = apply_filters( $this->product->get_key() . '_lc_no_activations_string', 'No activations left for %s !!!. You need to upgrade your plan in order to use %s on more websites. Please ask the %s Staff for more details.' );
240
  $no_valid_string = apply_filters( $this->product->get_key() . '_lc_no_valid_string', 'In order to benefit from updates and support for %s, please add your license code from your <a href="%s" target="_blank">purchase history</a> and validate it <a href="%s">here</a>. ' );
 
241
 
242
  // No activations left for this license.
243
  if ( 'valid' != $status && $this->check_activation() ) {
263
  ?>
264
  <div class="error">
265
  <p>
266
+ <strong><?php echo sprintf( $no_valid_string, $this->product->get_name() . ' ' . $this->product->get_type(), $this->get_api_url(), admin_url( 'options-general.php' ) . '#' . $this->product->get_key() . '_license' ); ?> </strong>
267
  </p>
268
  </div>
269
  <?php
271
  return false;
272
  }
273
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
274
  return true;
275
  }
276
 
424
  update_option( $this->product->get_key() . '_failed_checks', $this->failed_checks );
425
  }
426
 
427
+ /**
428
+ * Set license validation error message.
429
+ *
430
+ * @param string $message Error message.
431
+ */
432
+ public function set_error( $message = '' ) {
433
+ set_transient( $this->product->get_key() . 'act_err', $message, MINUTE_IN_SECONDS );
434
+
435
+ return;
436
+ }
437
+
438
+ /**
439
+ * Return the last error message.
440
+ *
441
+ * @return mixed Error message.
442
+ */
443
+ public function get_error() {
444
+ return get_transient( $this->product->get_key() . 'act_err' );
445
+ }
446
+
447
  /**
448
  * Activate the license remotely.
449
  */
470
  $response = wp_remote_get( add_query_arg( $api_params, $this->get_api_url() ) );
471
  // make sure the response came back okay.
472
  if ( is_wp_error( $response ) ) {
473
+ $this->set_error( sprintf( 'ERROR: Failed to connect to the license service. Please try again later. Reason: %s', $response->get_error_message() ) );
 
474
 
475
+ return;
 
 
 
 
 
 
 
 
476
  }
477
+
478
+ $license_data = json_decode( wp_remote_retrieve_body( $response ) );
479
+
480
+ if ( ! is_object( $license_data ) ) {
481
+ $this->set_error( 'ERROR: Failed to validate license. Please try again in one minute.' );
482
+
483
+ return;
484
+ }
485
+ if ( ! isset( $license_data->license ) ) {
486
+ $license_data->license = 'invalid';
487
+ }
488
+
489
  if ( ! isset( $license_data->key ) ) {
490
  $license_data->key = $license;
491
  }
493
  $this->reset_failed_checks();
494
  }
495
 
496
+ $this->set_error( '' );
497
+
498
+ if ( 'deactivate_license' === $api_params['edd_action'] ) {
499
+
500
+ delete_option( $this->product->get_key() . '_license_data' );
501
+ delete_option( $this->product->get_key() . '_license_plan' );
502
+ delete_transient( $this->product->get_key() . '_license_data' );
503
+
504
+ return;
505
+ }
506
  if ( isset( $license_data->plan ) ) {
507
  update_option( $this->product->get_key() . '_license_plan', $license_data->plan );
508
  }
 
509
  update_option( $this->product->get_key() . '_license_data', $license_data );
510
  set_transient( $this->product->get_key() . '_license_data', $license_data, 12 * HOUR_IN_SECONDS );
511
 
525
  function update_nag() {
526
  $theme = wp_get_theme( $this->product->get_slug() );
527
  $api_response = get_transient( $this->product_key );
528
+ if ( false === $api_response || ! isset( $api_response->new_version ) ) {
529
  return;
530
  }
531
  $update_url = wp_nonce_url( 'update.php?action=upgrade-theme&amp;theme=' . urlencode( $this->product->get_slug() ), 'upgrade-theme_' . $this->product->get_slug() );
537
  '<strong>%1$s %2$s</strong> is available. <a href="%3$s" class="thickbox" title="%4s">Check out what\'s new</a> or <a href="%5$s"%6$s>update now</a>.',
538
  $theme->get( 'Name' ),
539
  $api_response->new_version,
540
+ sprintf( '%s&TB_iframe=true&amp;width=1024&amp;height=800', $this->product->get_changelog() ),
541
  $theme->get( 'Name' ),
542
  $update_url,
543
  $update_onclick
587
 
588
  return false;
589
  }
590
+ $update_data->sections = isset( $update_data->sections ) ? maybe_unserialize( $update_data->sections ) : null;
591
 
592
  set_transient( $this->product_key, $update_data, 12 * HOUR_IN_SECONDS );
593
  }
610
  $api_params = array(
611
  'edd_action' => 'get_version',
612
  'version' => $this->product->get_version(),
613
+ 'license' => empty( $this->license_key ) ? 'free' : $this->license_key,
614
+ 'name' => rawurlencode( $this->product->get_name() ),
615
  'slug' => $this->product->get_slug(),
616
+ 'author' => rawurlencode( $this->get_distributor_name() ),
617
  'url' => rawurlencode( home_url() ),
618
  );
619
  $response = wp_remote_get(
620
+ add_query_arg( $api_params, $this->get_api_url() ),
621
  array(
622
  'timeout' => 15,
623
  'sslverify' => false,
 
624
  )
625
  );
626
  if ( is_wp_error( $response ) || 200 != wp_remote_retrieve_response_code( $response ) ) {
vendor/codeinwp/themeisle-sdk/src/Modules/Notification.php CHANGED
@@ -430,6 +430,9 @@ class Notification extends Abstract_Module {
430
  * @return Notification Module instance.
431
  */
432
  public function load( $product ) {
 
 
 
433
  $this->product = $product;
434
 
435
  $notifications = apply_filters( 'themeisle_sdk_registered_notifications', [] );
430
  * @return Notification Module instance.
431
  */
432
  public function load( $product ) {
433
+ if ( apply_filters( 'themeisle_sdk_hide_notifications', false ) ) {
434
+ return;
435
+ }
436
  $this->product = $product;
437
 
438
  $notifications = apply_filters( 'themeisle_sdk_registered_notifications', [] );
vendor/codeinwp/themeisle-sdk/src/Modules/Review.php CHANGED
@@ -60,7 +60,7 @@ class Review extends Abstract_Module {
60
  'Stefan',
61
  'Uriahs',
62
  'Madalin',
63
- 'Radu',
64
  'Silviu',
65
  'Andrei',
66
  ];
60
  'Stefan',
61
  'Uriahs',
62
  'Madalin',
63
+ 'Cristi',
64
  'Silviu',
65
  'Andrei',
66
  ];
vendor/codeinwp/themeisle-sdk/src/Modules/Uninstall_feedback.php CHANGED
@@ -54,7 +54,9 @@ class Uninstall_Feedback extends Abstract_Module {
54
  'placeholder' => 'What\'s the plugin\'s name?',
55
  ),
56
  'I could not get the plugin to work' => array(
57
- 'id' => 4,
 
 
58
  ),
59
  'I no longer need the plugin' => array(
60
  'id' => 5,
@@ -62,7 +64,9 @@ class Uninstall_Feedback extends Abstract_Module {
62
  'placeholder' => 'If you could improve one thing about our product, what would it be?',
63
  ),
64
  'It\'s a temporary deactivation. I\'m just debugging an issue.' => array(
65
- 'id' => 6,
 
 
66
  ),
67
  );
68
  /**
@@ -75,7 +79,9 @@ class Uninstall_Feedback extends Abstract_Module {
75
  'id' => 7,
76
  ),
77
  'It lacks options' => array(
78
- 'id' => 8,
 
 
79
  ),
80
  'Is not working with a plugin that I need' => array(
81
  'id' => 9,
@@ -95,7 +101,7 @@ class Uninstall_Feedback extends Abstract_Module {
95
  'Other' => array(
96
  'id' => 999,
97
  'type' => 'textarea',
98
- 'placeholder' => 'cmon cmon tell us',
99
  ),
100
  );
101
  /**
@@ -103,13 +109,13 @@ class Uninstall_Feedback extends Abstract_Module {
103
  *
104
  * @var string $heading_plugin The heading of the modal
105
  */
106
- private $heading_plugin = 'Quick Feedback <span>Because we care about our clients, please leave us feedback.</span>';
107
  /**
108
  * Default heading for theme.
109
  *
110
  * @var string $heading_theme The heading of the modal
111
  */
112
- private $heading_theme = 'Looking to change {theme}? <span> What does not work for you?</span>';
113
  /**
114
  * Default submit button action text.
115
  *
@@ -127,342 +133,344 @@ class Uninstall_Feedback extends Abstract_Module {
127
  * Loads the additional resources
128
  */
129
  function load_resources() {
130
- add_thickbox();
 
 
 
 
131
 
132
- $id = $this->product->get_key() . '_deactivate';
133
 
134
- $this->add_css( $this->product->get_type(), $this->product->get_key() );
135
- $this->add_js( $this->product->get_type(), $this->product->get_key(), '#TB_inline?' . apply_filters( $this->product->get_key() . '_feedback_deactivate_attributes', 'width=600&height=550' ) . '&inlineId=' . $id );
 
136
 
137
- echo '<div id="' . $id . '" style="display:none;" class="themeisle-deactivate-box">' . $this->get_html( $this->product->get_type(), $this->product->get_key() ) . '</div>';
 
 
 
138
  }
139
 
140
  /**
141
- * Loads the css
142
- *
143
- * @param string $type The type of product.
144
- * @param string $key The product key.
145
  */
146
- function add_css( $type, $key ) {
147
- $key = esc_attr( $key );
148
- $suffix = Product::THEME_TYPE === $type ? 'theme-install-php' : 'plugins-php';
149
- $icon = esc_attr( apply_filters( $this->product->get_slug() . '_uninstall_feedback_icon', '' ) );
150
- if ( empty( $icon ) ) {
151
- $icon = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDNkVDM0M4RkYxMzMxMUU3OEMyMkQ0NTIxRTVEQ0ZBRiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDNkVDM0M5MEYxMzMxMUU3OEMyMkQ0NTIxRTVEQ0ZBRiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkM2RUMzQzhERjEzMzExRTc4QzIyRDQ1MjFFNURDRkFGIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkM2RUMzQzhFRjEzMzExRTc4QzIyRDQ1MjFFNURDRkFGIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+KBNOswAAFtFJREFUeNrkWwmUXVWV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';
152
- }
 
 
153
  ?>
154
- <style type="text/css" id="<?php echo $key; ?>ti-deactivate-css">
155
- input[name="ti-deactivate-option"] ~ div {
156
- display: none;
157
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
158
 
159
- input[name="ti-deactivate-option"]:checked ~ div {
160
- display: block;
 
 
 
 
 
 
 
 
 
 
161
  }
162
 
163
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_window.thickbox-loading:before {
164
- background: none !important;
 
 
165
  }
166
 
167
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_title {
168
- background: url('<?php echo $icon; ?>') 40px 30px no-repeat;
169
- border: none;
170
- box-sizing: border-box;
171
- color: #373e40;
172
- font-size: 24px;
173
- font-weight: 700;
174
- height: 90px;
175
- padding: 40px 40px 0 120px;
176
- text-transform: uppercase;
177
- width: 100%;
178
  }
179
 
180
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content ul i {
181
- padding-left: 5px;
182
- margin: 0 1px;
183
  }
184
 
185
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content ul strong {
186
- width: 125px;
187
- display: block;
188
  margin: 0;
189
- float: left;
190
  }
191
 
192
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content ul {
193
- margin-left: 39px;
194
- margin-top: 2px;
195
- padding-top: 0px;
196
  }
197
 
198
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content p {
199
- font-style: italic;
200
- margin-bottom: 0px;
201
  }
202
 
203
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content {
 
 
204
  display: none;
205
- }
206
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open #<?php echo $key; ?>-info-disclosure-content {
207
- display: block;
208
- position:absolute;
209
- bottom: 100px;
210
  }
211
 
212
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open #<?php echo $key; ?>-info-disclosure {
213
- top: -130px;
 
 
 
214
  }
215
 
216
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open {
217
- height: 590px !important;
218
- }
219
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure {
220
- position: absolute;
221
- top: -50px;
222
- font-size: 13px;
223
- color: #8d9192;
224
- font-weight: 400;
225
- right: 40px;
226
  }
227
 
228
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.actions {
229
- box-sizing: border-box;
230
- padding: 30px 40px;
231
- background-color: #eaeaea;
232
  }
233
 
234
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button {
235
- background: #ec5d60;
236
- border: none;
237
- box-shadow: none;
238
- color: #ffffff;
239
- font-size: 15px;
240
- font-weight: 700;
241
- height: auto;
242
- line-height: 20px;
243
- padding: 10px 15px;
244
- text-transform: uppercase;
245
- -webkit-transition: 0.3s ease;
246
- -moz-transition: 0.3s ease;
247
- -ms-transition: 0.3s ease;
248
- -o-transition: 0.3s ease;
249
- transition: 0.3s ease;
250
  }
251
 
252
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary {
253
- background: transparent;
254
- box-shadow: none;
255
- color: #8d9192;
256
- font-weight: 400;
257
- float: right;
258
- line-height: 40px;
259
- padding: 0;
260
- text-decoration: underline;
261
- text-shadow: none;
262
- text-transform: none;
263
  }
264
 
265
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:hover {
266
- background: #e83f42;
 
267
  }
268
 
269
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary:hover {
270
- background: transparent;
 
 
 
271
  }
272
 
273
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:focus {
274
- box-shadow: none;
275
- outline: none;
276
  }
277
 
278
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:active {
279
- box-shadow: none;
280
- transform: translateY(0);
281
  }
282
 
283
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:disabled {
284
- cursor: not-allowed;
 
285
  }
286
 
287
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary:hover {
288
- text-decoration: none;
 
 
 
 
 
289
  }
290
 
291
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.revive_network-container {
292
- background-color: #ffffff;
 
293
  }
294
 
295
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list {
296
- margin: 0;
297
  }
298
 
299
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li {
300
- color: #373e40;
301
- font-size: 13px;
302
- margin-bottom: 5px;
 
303
  }
304
 
305
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li label {
306
- margin-left: 10px;
307
- line-height: 28px;
308
- font-size: 15px;
309
  }
310
 
311
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list input[type=radio] {
312
- margin-top: 1px;
313
  }
314
 
315
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_ajaxContent {
316
- box-sizing: border-box;
317
- height: auto !important;
318
- padding: 20px 40px;
319
- width: 100% !important;
 
 
 
 
 
 
 
 
 
320
  }
321
 
322
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container li div textarea {
323
- padding: 10px 15px;
324
- width: 100%;
325
  }
326
 
327
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li div {
328
- margin: 10px 30px;
329
  }
330
 
331
- .<?php echo $key; ?>-container #TB_title #TB_ajaxWindowTitle {
332
- box-sizing: border-box;
333
- display: block;
334
- float: none;
335
- font-weight: 700;
336
- line-height: 1;
337
- padding: 0;
338
- text-align: left;
339
- width: 100%;
340
  }
341
 
342
- .<?php echo $key; ?>-container #TB_title #TB_ajaxWindowTitle span {
343
- color: #8d9192;
344
- display: block;
345
- font-size: 15px;
346
- font-weight: 400;
347
- margin-top: 5px;
348
- text-transform: none;
349
- }
350
 
351
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container .actions {
352
- width: 100%;
353
  display: block;
354
  position: absolute;
355
- left: 0;
356
- bottom: 0;
 
 
 
 
 
357
  }
358
 
359
- .theme-install-php .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
360
- font-size: 32px;
 
 
 
 
 
361
  }
362
 
363
- .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
364
- color: #eee;
 
 
 
 
 
 
 
 
365
  }
366
 
367
- .<?php echo $key; ?>-container #TB_closeWindowButton {
368
- left: auto;
369
- right: -5px;
370
- top: -35px;
371
- color: #eee;
372
  }
373
 
374
- .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
375
- text-align: right;
376
- line-height: 25px;
377
- width: 25px;
378
- height: 25px;
379
- }
380
 
381
- .<?php echo $key; ?>-container #TB_closeWindowButton:focus .tb-close-icon {
382
- box-shadow: none;
383
- outline: none;
384
  }
385
 
386
- .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
387
- font: normal 25px dashicons;
388
  }
389
 
390
- body.<?php echo $suffix; ?> .<?php echo $key; ?>-container {
391
- margin: auto !important;
392
- height: 500px !important;
393
- top: 0 !important;
394
- left: 0 !important;
395
- bottom: 0 !important;
396
- right: 0 !important;
397
- width: 600px !important;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
398
  }
399
  </style>
400
  <?php
401
- do_action( $this->product->get_key() . '_uninstall_feedback_after_css' );
402
  }
403
 
404
  /**
405
- * Loads the js.
406
- *
407
- * @param string $type The type of product.
408
- * @param string $key The product key.
409
- * @param string $src The url that will hijack the deactivate button url.
410
  */
411
- function add_js( $type, $key, $src ) {
412
- $heading = Product::PLUGIN_TYPE === $type ? $this->heading_plugin : str_replace( '{theme}', $this->product->get_name(), $this->heading_theme );
413
- $key = esc_attr( $key );
414
- $heading = apply_filters( $this->product->get_key() . '_feedback_deactivate_heading', $heading );
415
  ?>
416
  <script type="text/javascript" id="ti-deactivate-js">
417
  (function ($) {
418
  $(document).ready(function () {
419
- var auto_trigger = false;
420
- var target_element = 'tr[data-plugin^="<?php echo $this->product->get_slug(); ?>/"] span.deactivate a';
421
- <?php
422
- if ( 'theme' === $type ) {
423
- ?>
424
- auto_trigger = true;
425
- if ($('a.ti-auto-anchor').length == 0) {
426
- $('body').append($('<a class="ti-auto-anchor" href=""></a>'));
427
- }
428
- target_element = 'a.ti-auto-anchor';
429
- <?php
430
- }
431
- ?>
432
 
433
- if (auto_trigger) {
434
- setTimeout(function () {
435
- $('a.ti-auto-anchor').trigger('click');
436
- }, <?php echo self::AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS * 1000; ?> );
437
- }
438
- $(document).on('thickbox:removed', function () {
439
- $.post(ajaxurl, {
440
- 'action': '<?php echo $key . '_uninstall_feedback'; ?>',
441
- 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
442
- 'type': '<?php echo $type; ?>',
443
- 'key': '<?php echo $key; ?>'
444
- });
445
- });
446
- var href = $(target_element).attr('href');
447
- $('#<?php echo $key; ?>ti-deactivate-no').attr('data-ti-action', href).on('click', function (e) {
448
  e.preventDefault();
449
- e.stopPropagation();
450
-
451
- $('body').unbind('thickbox:removed');
452
- tb_remove();
453
- var redirect = $(this).attr('data-ti-action');
454
- if (redirect !== '') {
455
- location.href = redirect;
456
- }
457
  });
458
 
459
- $('#<?php echo $key; ?> ul.ti-list label, #<?php echo $key; ?> ul.ti-list input[name="ti-deactivate-option"]').on('click', function (e) {
460
- $('#<?php echo $key; ?>ti-deactivate-yes').val($('#<?php echo $key; ?>ti-deactivate-yes').attr('data-after-text'));
 
 
461
 
462
- var radio = $(this).prop('tagName') === 'LABEL' ? $(this).parent() : $(this);
463
- if (radio.parent().find('textarea').length > 0 && radio.parent().find('textarea').val().length === 0) {
 
 
464
  $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
465
- radio.parent().find('textarea').on('keyup', function (ee) {
466
  if ($(this).val().length === 0) {
467
  $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
468
  } else {
@@ -473,127 +481,236 @@ class Uninstall_Feedback extends Abstract_Module {
473
  $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
474
  }
475
  });
476
- $("#<?php echo $key; ?>-info-disclosure").on('click', function () {
477
- $("#TB_window").toggleClass("<?php echo $key; ?>-container-disc-open");
478
- return false;
479
- });
480
- $('#<?php echo $key; ?>ti-deactivate-yes').attr('data-ti-action', href).on('click', function (e) {
481
  e.preventDefault();
482
  e.stopPropagation();
 
 
 
483
  $.post(ajaxurl, {
484
- 'action': '<?php echo $key . '_uninstall_feedback'; ?>',
485
  'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
486
- 'id': $('#<?php echo $key; ?> input[name="ti-deactivate-option"]:checked').parent().attr('ti-option-id'),
487
- 'msg': $('#<?php echo $key; ?> input[name="ti-deactivate-option"]:checked').parent().find('textarea').val(),
488
- 'type': '<?php echo $type; ?>',
 
489
  });
490
- var redirect = $(this).attr('data-ti-action');
491
- if (redirect != '') {
492
- location.href = redirect;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
493
  } else {
494
- $('body').unbind('thickbox:removed');
495
- tb_remove();
496
  }
497
  });
498
 
499
- $(target_element).attr('name', '<?php echo wp_kses( $heading, array( 'span' => array() ) ); ?>').attr('href', '<?php echo $src; ?>').addClass('thickbox');
500
- var thicbox_timer;
501
- $(target_element).on('click', function () {
502
- tiBindThickbox();
 
 
 
 
 
503
  });
504
 
505
- function tiBindThickbox() {
506
- var thicbox_timer = setTimeout(function () {
507
- if ($("#<?php echo esc_html( $key ); ?>").is(":visible")) {
508
- $("body").trigger('thickbox:iframe:loaded');
509
- $("#TB_window").addClass("<?php echo $key; ?>-container");
510
- clearTimeout(thicbox_timer);
511
- $('body').unbind('thickbox:removed');
512
- } else {
513
- tiBindThickbox();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
514
  }
515
- }, 100);
516
- }
517
  });
518
  })(jQuery);
 
519
  </script>
520
  <?php
521
-
522
  do_action( $this->product->get_key() . '_uninstall_feedback_after_js' );
523
  }
524
 
525
  /**
526
- * Generates the HTML.
527
  *
528
- * @param string $type The type of product.
529
- * @param string $key The product key.
530
  */
531
- function get_html( $type, $key ) {
532
- $options = Product::PLUGIN_TYPE === $type ? $this->options_plugin : $this->options_theme;
533
- $button_cancel = Product::PLUGIN_TYPE === $type ? $this->button_cancel : 'Skip';
534
- $button_submit = Product::PLUGIN_TYPE === $type ? $this->button_submit : 'Submit';
535
- $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $options ) );
536
- $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', $button_submit );
537
- $button_cancel = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_cancel', $button_cancel );
538
-
539
- $options += $this->other;
540
-
541
- $list = '';
542
- foreach ( $options as $title => $attributes ) {
543
- $id = $attributes['id'];
544
- $list .= '<li ti-option-id="' . $id . '"><input type="radio" name="ti-deactivate-option" id="' . $key . $id . '"><label for="' . $key . $id . '">' . str_replace( '{theme}', $this->product->get_name(), $title ) . '</label>';
545
- if ( array_key_exists( 'type', $attributes ) ) {
546
- $list .= '<div>';
547
- $placeholder = array_key_exists( 'placeholder', $attributes ) ? $attributes['placeholder'] : '';
548
- switch ( $attributes['type'] ) {
549
- case 'text':
550
- $list .= '<textarea style="width: 100%" rows="1" name="comments" placeholder="' . $placeholder . '"></textarea>';
551
- break;
552
- case 'textarea':
553
- $list .= '<textarea style="width: 100%" rows="2" name="comments" placeholder="' . $placeholder . '"></textarea>';
554
- break;
555
- }
556
- $list .= '</div>';
557
- }
558
- $list .= '</li>';
559
- }
560
-
561
  $disclosure_new_labels = apply_filters( $this->product->get_slug() . '_themeisle_sdk_disclosure_content_labels', [], $this->product );
562
  $disclosure_labels = array_merge(
563
  [
564
  'title' => 'Below is a detailed view of all data that ThemeIsle will receive if you fill in this survey. No domain name, email address or IP addresses are transmited after you submit the survey.',
565
  'items' => [
566
  sprintf( '%s %s version %s %s %s %s', '<strong>', ucwords( $this->product->get_type() ), '</strong>', '<code>', $this->product->get_version(), '</code>' ),
567
- sprintf( '%s Uninstall reason %s %s Selected reson from the above survey %s ', '<strong>', '</strong>', '<i>', '</i>' ),
568
  ],
569
  ],
570
  $disclosure_new_labels
571
  );
572
 
573
- $info_disclosure_link = '<a href="#" id="' . $this->product->get_key() . '-info-disclosure">' . apply_filters( $this->product->get_slug() . '_themeisle_sdk_info_collect_cta', 'What info do we collect?' ) . '</a>';
574
- $info_disclosure_content = '<div id="' . $this->product->get_key() . '-info-disclosure-content"><p>' . wp_kses_post( $disclosure_labels['title'] ) . '</p><ul>';
575
  foreach ( $disclosure_labels['items'] as $disclosure_item ) {
576
  $info_disclosure_content .= sprintf( '<li>%s</li>', wp_kses_post( $disclosure_item ) );
577
  }
578
  $info_disclosure_content .= '</ul></div>';
579
 
580
- return
581
- '<div id="' . $this->product->get_key() . '"><ul class="ti-list">' . $list . '</ul>'
582
- . $info_disclosure_content
583
- . '<div class="actions">'
584
- . get_submit_button(
585
- $button_submit,
586
- 'secondary',
587
- $this->product->get_key() . 'ti-deactivate-yes',
588
- false,
589
- array(
590
- 'data-after-text' => $button_submit,
591
- 'disabled' => true,
592
- )
593
- )
594
- . wp_kses_post( $info_disclosure_link )
595
- . get_submit_button( $button_cancel, 'primary', $this->product->get_key() . 'ti-deactivate-no', false )
596
- . '</div></div>';
597
  }
598
 
599
  /**
@@ -719,6 +836,11 @@ class Uninstall_Feedback extends Abstract_Module {
719
  * @return Uninstall_Feedback Current module instance.
720
  */
721
  public function load( $product ) {
 
 
 
 
 
722
  $this->product = $product;
723
  add_action( 'admin_head', array( $this, 'load_resources' ) );
724
  add_action( 'wp_ajax_' . $this->product->get_key() . '_uninstall_feedback', array( $this, 'post_deactivate' ) );
54
  'placeholder' => 'What\'s the plugin\'s name?',
55
  ),
56
  'I could not get the plugin to work' => array(
57
+ 'type' => 'textarea',
58
+ 'placeholder' => 'What problem are you experiencing?',
59
+ 'id' => 4,
60
  ),
61
  'I no longer need the plugin' => array(
62
  'id' => 5,
64
  'placeholder' => 'If you could improve one thing about our product, what would it be?',
65
  ),
66
  'It\'s a temporary deactivation. I\'m just debugging an issue.' => array(
67
+ 'type' => 'textarea',
68
+ 'placeholder' => 'What problem are you experiencing?',
69
+ 'id' => 6,
70
  ),
71
  );
72
  /**
79
  'id' => 7,
80
  ),
81
  'It lacks options' => array(
82
+ 'placeholder' => 'What option is missing?',
83
+ 'type' => 'text',
84
+ 'id' => 8,
85
  ),
86
  'Is not working with a plugin that I need' => array(
87
  'id' => 9,
101
  'Other' => array(
102
  'id' => 999,
103
  'type' => 'textarea',
104
+ 'placeholder' => 'What can we do better?',
105
  ),
106
  );
107
  /**
109
  *
110
  * @var string $heading_plugin The heading of the modal
111
  */
112
+ private $heading_plugin = 'What’s wrong?';
113
  /**
114
  * Default heading for theme.
115
  *
116
  * @var string $heading_theme The heading of the modal
117
  */
118
+ private $heading_theme = 'What does not work for you in {theme}?';
119
  /**
120
  * Default submit button action text.
121
  *
133
  * Loads the additional resources
134
  */
135
  function load_resources() {
136
+ $screen = get_current_screen();
137
+
138
+ if ( ! $screen || ! in_array( $screen->id, array( 'theme-install', 'plugins' ) ) ) {
139
+ return;
140
+ }
141
 
142
+ $this->add_feedback_popup_style();
143
 
144
+ if ( $this->product->get_type() === 'theme' ) {
145
+ $this->add_theme_feedback_drawer_js();
146
+ $this->render_theme_feedback_popup();
147
 
148
+ return;
149
+ }
150
+ $this->add_plugin_feedback_popup_js();
151
+ $this->render_plugin_feedback_popup();
152
  }
153
 
154
  /**
155
+ * Render theme feedback drawer.
 
 
 
156
  */
157
+ private function render_theme_feedback_popup() {
158
+ $heading = str_replace( '{theme}', $this->product->get_name(), $this->heading_theme );
159
+ $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', 'Submit' );
160
+ $options = $this->options_theme;
161
+ $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $options ) );
162
+ $info_disclosure_link = '<a href="#" class="info-disclosure-link">' . apply_filters( $this->product->get_slug() . '_themeisle_sdk_info_collect_cta', 'What info do we collect?' ) . '</a>';
163
+
164
+ $options += $this->other;
165
+
166
  ?>
167
+ <div class="ti-theme-uninstall-feedback-drawer ti-feedback">
168
+ <div class="popup--header">
169
+ <h5><?php echo wp_kses( $heading, array( 'span' => true ) ); ?> </h5>
170
+ <button class="toggle"><span>&times;</span></button>
171
+ </div><!--/.popup--header-->
172
+ <div class="popup--body">
173
+ <?php $this->render_options_list( $options ); ?>
174
+ </div><!--/.popup--body-->
175
+ <div class="popup--footer">
176
+ <div class="actions">
177
+ <?php
178
+ echo wp_kses_post( $info_disclosure_link );
179
+ echo wp_kses_post( $this->get_disclosure_labels() );
180
+ echo '<div class="buttons">';
181
+ echo get_submit_button(
182
+ $button_submit,
183
+ 'secondary',
184
+ $this->product->get_key() . 'ti-deactivate-yes',
185
+ false,
186
+ array(
187
+ 'data-after-text' => $button_submit,
188
+ 'disabled' => true,
189
+ )
190
+ );
191
+ echo '</div>';
192
+ ?>
193
+ </div><!--/.actions-->
194
+ </div><!--/.popup--footer-->
195
+ </div>
196
+ <?php
197
+ }
198
 
199
+ /**
200
+ * Add feedback styles.
201
+ */
202
+ private function add_feedback_popup_style() {
203
+ ?>
204
+ <style>
205
+ .ti-feedback {
206
+ background: #fff;
207
+ max-width: 400px;
208
+ z-index: 10000;
209
+ box-shadow: 0 0 15px -5px rgba(0, 0, 0, .5);
210
+ transition: all .3s ease-out;
211
  }
212
 
213
+
214
+ .ti-feedback .popup--header {
215
+ position: relative;
216
+ background-color: #23A1CE;
217
  }
218
 
219
+ .ti-feedback .popup--header h5 {
220
+ margin: 0;
221
+ font-size: 16px;
222
+ padding: 15px;
223
+ color: #fff;
224
+ font-weight: 600;
225
+ text-align: center;
226
+ letter-spacing: .3px;
 
 
 
227
  }
228
 
229
+ .ti-feedback .popup--body {
230
+ padding: 15px;
 
231
  }
232
 
233
+ .ti-feedback .popup--form {
 
 
234
  margin: 0;
235
+ font-size: 13px;
236
  }
237
 
238
+ .ti-feedback .popup--form input[type="radio"] {
239
+ margin: 0 10px 0 0;
 
 
240
  }
241
 
242
+ .ti-feedback .popup--form input[type="radio"]:checked ~ textarea {
243
+ display: block;
 
244
  }
245
 
246
+ .ti-feedback .popup--form textarea {
247
+ width: 100%;
248
+ margin: 10px 0 0;
249
  display: none;
250
+ max-height: 150px;
 
 
 
 
251
  }
252
 
253
+ .ti-feedback li {
254
+ display: flex;
255
+ align-items: center;
256
+ margin-bottom: 15px;
257
+ flex-wrap: wrap;
258
  }
259
 
260
+ .ti-feedback li label {
261
+ max-width: 90%;
 
 
 
 
 
 
 
 
262
  }
263
 
264
+ .ti-feedback li:last-child {
265
+ margin-bottom: 0;
 
 
266
  }
267
 
268
+ .ti-feedback .popup--footer {
269
+ padding: 0 15px 15px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
270
  }
271
 
272
+ .ti-feedback .actions {
273
+ display: flex;
274
+ flex-wrap: wrap;
 
 
 
 
 
 
 
 
275
  }
276
 
277
+ .info-disclosure-link {
278
+ width: 100%;
279
+ margin-bottom: 15px;
280
  }
281
 
282
+ .ti-feedback .info-disclosure-content {
283
+ max-height: 0;
284
+ overflow: hidden;
285
+ width: 100%;
286
+ transition: .3s ease;
287
  }
288
 
289
+ .ti-feedback .info-disclosure-content.active {
290
+ max-height: 300px;
 
291
  }
292
 
293
+ .ti-feedback .info-disclosure-content p {
294
+ margin: 0;
 
295
  }
296
 
297
+ .ti-feedback .info-disclosure-content ul {
298
+ margin: 10px 0;
299
+ border-radius: 3px;
300
  }
301
 
302
+ .ti-feedback .info-disclosure-content ul li {
303
+ display: flex;
304
+ align-items: center;
305
+ justify-content: space-between;
306
+ margin-bottom: 0;
307
+ padding: 5px 0;
308
+ border-bottom: 1px solid #ccc;
309
  }
310
 
311
+ .ti-feedback .buttons {
312
+ display: flex;
313
+ width: 100%;
314
  }
315
 
316
+ .ti-feedback .buttons input:last-child {
317
+ margin-left: auto;
318
  }
319
 
320
+ .ti-theme-uninstall-feedback-drawer {
321
+ border-top-left-radius: 5px;
322
+ position: fixed;
323
+ top: 100%;
324
+ right: 15px;
325
  }
326
 
327
+ .ti-theme-uninstall-feedback-drawer.active {
328
+ transform: translateY(-100%);
 
 
329
  }
330
 
331
+ .ti-theme-uninstall-feedback-drawer .popup--header {
332
+ border-top-left-radius: 5px;
333
  }
334
 
335
+ .ti-theme-uninstall-feedback-drawer .popup--header .toggle {
336
+ position: absolute;
337
+ padding: 3px 0;
338
+ width: 30px;
339
+ top: -26px;
340
+ right: 0;
341
+ cursor: pointer;
342
+ border-top-left-radius: 5px;
343
+ border-top-right-radius: 5px;
344
+ font-size: 20px;
345
+ background-color: #23A1CE;
346
+ color: #fff;
347
+ border: none;
348
+ line-height: 20px;
349
  }
350
 
351
+ .ti-theme-uninstall-feedback-drawer .toggle span {
352
+ margin: 0;
353
+ display: inline-block;
354
  }
355
 
356
+ .ti-theme-uninstall-feedback-drawer:not(.active) .toggle span {
357
+ transform: rotate(45deg);
358
  }
359
 
360
+ .ti-theme-uninstall-feedback-drawer .popup--header .toggle:hover {
361
+ background-color: #1880a5;
 
 
 
 
 
 
 
362
  }
363
 
 
 
 
 
 
 
 
 
364
 
365
+ .ti-plugin-uninstall-feedback-popup .popup--header:before {
366
+ content: "";
367
  display: block;
368
  position: absolute;
369
+ border: 20px solid #23A1CE;
370
+ left: -10px;
371
+ top: 50%;
372
+ border-top: 20px solid transparent;
373
+ border-bottom: 20px solid transparent;
374
+ border-left: 0;
375
+ transform: translateY(-50%);
376
  }
377
 
378
+ .ti-plugin-uninstall-feedback-popup {
379
+ display: none;
380
+ position: absolute;
381
+ white-space: normal;
382
+ width: 400px;
383
+ left: 100%;
384
+ top: -15px;
385
  }
386
 
387
+ .ti-plugin-uninstall-feedback-popup.sending-feedback .popup--body i {
388
+ animation: rotation 2s infinite linear;
389
+ display: block;
390
+ float: none;
391
+ align-items: center;
392
+ width: 100%;
393
+ margin: 0 auto;
394
+ height: 100%;
395
+ background: transparent;
396
+ padding: 0;
397
  }
398
 
399
+ .ti-plugin-uninstall-feedback-popup.sending-feedback .popup--body i:before {
400
+ padding: 0;
401
+ background: transparent;
402
+ box-shadow: none;
403
+ color: #b4b9be
404
  }
405
 
 
 
 
 
 
 
406
 
407
+ .ti-plugin-uninstall-feedback-popup.active {
408
+ display: block;
 
409
  }
410
 
411
+ tr[data-plugin^="<?php echo $this->product->get_slug(); ?>"] .deactivate {
412
+ position: relative;
413
  }
414
 
415
+ body.ti-feedback-open .ti-feedback-overlay {
416
+ content: "";
417
+ display: block;
418
+ background-color: rgba(0, 0, 0, 0.5);
419
+ top: 0;
420
+ bottom: 0;
421
+ right: 0;
422
+ left: 0;
423
+ z-index: 10000;
424
+ position: fixed;
425
+ }
426
+
427
+ @media (max-width: 768px) {
428
+ .ti-plugin-uninstall-feedback-popup {
429
+ position: fixed;
430
+ max-width: 100%;
431
+ margin: 0 auto;
432
+ left: 50%;
433
+ top: 50px;
434
+ transform: translateX(-50%);
435
+ }
436
+
437
+ .ti-plugin-uninstall-feedback-popup .popup--header:before {
438
+ display: none;
439
+ }
440
  }
441
  </style>
442
  <?php
 
443
  }
444
 
445
  /**
446
+ * Theme feedback drawer JS.
 
 
 
 
447
  */
448
+ private function add_theme_feedback_drawer_js() {
449
+ $key = $this->product->get_key();
 
 
450
  ?>
451
  <script type="text/javascript" id="ti-deactivate-js">
452
  (function ($) {
453
  $(document).ready(function () {
454
+ setTimeout(function () {
455
+ $('.ti-theme-uninstall-feedback-drawer').addClass('active');
456
+ }, <?php echo absint( self::AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS * 1000 ); ?> );
 
 
 
 
 
 
 
 
 
 
457
 
458
+ $('.ti-theme-uninstall-feedback-drawer .toggle').on('click', function (e) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
459
  e.preventDefault();
460
+ $('.ti-theme-uninstall-feedback-drawer').toggleClass('active');
 
 
 
 
 
 
 
461
  });
462
 
463
+ $('.info-disclosure-link').on('click', function (e) {
464
+ e.preventDefault();
465
+ $('.info-disclosure-content').toggleClass('active');
466
+ });
467
 
468
+ $('.ti-theme-uninstall-feedback-drawer input[type="radio"]').on('change', function () {
469
+ var radio = $(this);
470
+ if (radio.parent().find('textarea').length > 0 &&
471
+ radio.parent().find('textarea').val().length === 0) {
472
  $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
473
+ radio.parent().find('textarea').on('keyup', function (e) {
474
  if ($(this).val().length === 0) {
475
  $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
476
  } else {
481
  $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
482
  }
483
  });
484
+
485
+ $('#<?php echo $key; ?>ti-deactivate-yes').on('click', function (e) {
 
 
 
486
  e.preventDefault();
487
  e.stopPropagation();
488
+
489
+ var selectedOption = $(
490
+ '.ti-theme-uninstall-feedback-drawer input[name="ti-deactivate-option"]:checked');
491
  $.post(ajaxurl, {
492
+ 'action': '<?php echo esc_attr( $key ) . '_uninstall_feedback'; ?>',
493
  'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
494
+ 'id': selectedOption.parent().attr('ti-option-id'),
495
+ 'msg': selectedOption.parent().find('textarea').val(),
496
+ 'type': 'theme',
497
+ 'key': '<?php echo esc_attr( $key ); ?>'
498
  });
499
+ $('.ti-theme-uninstall-feedback-drawer').fadeOut();
500
+ });
501
+ });
502
+ })(jQuery);
503
+
504
+ </script>
505
+ <?php
506
+ do_action( $this->product->get_key() . '_uninstall_feedback_after_js' );
507
+ }
508
+
509
+ /**
510
+ * Render the options list.
511
+ *
512
+ * @param array $options the options for the feedback form.
513
+ */
514
+ private function render_options_list( $options ) {
515
+ $key = $this->product->get_key();
516
+ $inputs_row_map = [
517
+ 'text' => 1,
518
+ 'textarea' => 2,
519
+ ];
520
+ ?>
521
+ <ul class="popup--form">
522
+ <?php foreach ( $options as $title => $attributes ) { ?>
523
+ <li ti-option-id="<?php echo esc_attr( $attributes['id'] ); ?>">
524
+ <input type="radio" name="ti-deactivate-option" id="<?php echo esc_attr( $key . $attributes['id'] ); ?>">
525
+ <label for="<?php echo esc_attr( $key . $attributes['id'] ); ?>">
526
+ <?php echo str_replace( '{theme}', $this->product->get_name(), $title ); ?>
527
+ </label>
528
+ <?php
529
+ if ( array_key_exists( 'type', $attributes ) ) {
530
+ $placeholder = array_key_exists( 'placeholder', $attributes ) ? $attributes['placeholder'] : '';
531
+ echo '<textarea width="100%" rows="' . $inputs_row_map[ $attributes['type'] ] . '" name="comments" placeholder="' . esc_attr( $placeholder ) . '"></textarea>';
532
+ }
533
+ ?>
534
+ </li>
535
+ <?php } ?>
536
+ </ul>
537
+ <?php
538
+ }
539
+
540
+ /**
541
+ * Render plugin feedback popup.
542
+ */
543
+ private function render_plugin_feedback_popup() {
544
+ $button_cancel = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_cancel', $this->button_cancel );
545
+ $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', $this->button_submit );
546
+ $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $this->options_plugin ) );
547
+ $info_disclosure_link = '<a href="#" class="info-disclosure-link">' . apply_filters( $this->product->get_slug() . '_themeisle_sdk_info_collect_cta', 'What info do we collect?' ) . '</a>';
548
+
549
+ $options += $this->other;
550
+ ?>
551
+ <div class="ti-plugin-uninstall-feedback-popup ti-feedback" id="<?php echo esc_attr( $this->product->get_slug() . '_uninstall_feedback_popup' ); ?>">
552
+ <div class="popup--header">
553
+ <h5><?php echo wp_kses( $this->heading_plugin, array( 'span' => true ) ); ?> </h5>
554
+ </div><!--/.popup--header-->
555
+ <div class="popup--body">
556
+ <?php $this->render_options_list( $options ); ?>
557
+ </div><!--/.popup--body-->
558
+ <div class="popup--footer">
559
+ <div class="actions">
560
+ <?php
561
+ echo wp_kses_post( $info_disclosure_link );
562
+ echo wp_kses_post( $this->get_disclosure_labels() );
563
+ echo '<div class="buttons">';
564
+ echo get_submit_button(
565
+ $button_cancel,
566
+ 'secondary',
567
+ $this->product->get_key() . 'ti-deactivate-no',
568
+ false
569
+ );
570
+ echo get_submit_button(
571
+ $button_submit,
572
+ 'primary',
573
+ $this->product->get_key() . 'ti-deactivate-yes',
574
+ false,
575
+ array(
576
+ 'data-after-text' => $button_submit,
577
+ 'disabled' => true,
578
+ )
579
+ );
580
+ echo '</div>';
581
+ ?>
582
+ </div><!--/.actions-->
583
+ </div><!--/.popup--footer-->
584
+ </div>
585
+
586
+ <?php
587
+ }
588
+
589
+ /**
590
+ * Add plugin feedback popup JS
591
+ */
592
+ private function add_plugin_feedback_popup_js() {
593
+ $popup_id = '#' . $this->product->get_slug() . '_uninstall_feedback_popup';
594
+ $key = $this->product->get_key();
595
+ ?>
596
+ <script type="text/javascript" id="ti-deactivate-js">
597
+ (function ($) {
598
+ $(document).ready(function () {
599
+ var targetElement = 'tr[data-plugin^="<?php echo $this->product->get_slug(); ?>/"] span.deactivate a';
600
+ var redirectUrl = $(targetElement).attr('href');
601
+ if ($('.ti-feedback-overlay').length === 0) {
602
+ $('body').prepend('<div class="ti-feedback-overlay"></div>');
603
+ }
604
+ $('<?php echo esc_attr( $popup_id ); ?> ').appendTo($(targetElement).parent());
605
+
606
+ $(targetElement).on('click', function (e) {
607
+ e.preventDefault();
608
+ $('<?php echo esc_attr( $popup_id ); ?> ').addClass('active');
609
+ $('body').addClass('ti-feedback-open');
610
+ $('.ti-feedback-overlay').on('click', function () {
611
+ $('<?php echo esc_attr( $popup_id ); ?> ').removeClass('active');
612
+ $('body').removeClass('ti-feedback-open');
613
+ });
614
+ });
615
+
616
+ $('<?php echo esc_attr( $popup_id ); ?> .info-disclosure-link').on('click', function (e) {
617
+ e.preventDefault();
618
+ $(this).parent().find('.info-disclosure-content').toggleClass('active');
619
+ });
620
+
621
+ $('<?php echo esc_attr( $popup_id ); ?> input[type="radio"]').on('change', function () {
622
+ var radio = $(this);
623
+ if (radio.parent().find('textarea').length > 0 &&
624
+ radio.parent().find('textarea').val().length === 0) {
625
+ $('<?php echo esc_attr( $popup_id ); ?> #<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
626
+ radio.parent().find('textarea').on('keyup', function (e) {
627
+ if ($(this).val().length === 0) {
628
+ $('<?php echo esc_attr( $popup_id ); ?> #<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
629
+ } else {
630
+ $('<?php echo esc_attr( $popup_id ); ?> #<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
631
+ }
632
+ });
633
  } else {
634
+ $('<?php echo esc_attr( $popup_id ); ?> #<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
 
635
  }
636
  });
637
 
638
+ $('<?php echo esc_attr( $popup_id ); ?> #<?php echo $key; ?>ti-deactivate-no').on('click', function (e) {
639
+ e.preventDefault();
640
+ e.stopPropagation();
641
+ $(targetElement).unbind('click');
642
+ $('body').removeClass('ti-feedback-open');
643
+ $('<?php echo esc_attr( $popup_id ); ?>').remove();
644
+ if (redirectUrl !== '') {
645
+ location.href = redirectUrl;
646
+ }
647
  });
648
 
649
+ $('<?php echo esc_attr( $popup_id ); ?> #<?php echo $key; ?>ti-deactivate-yes').on('click', function (e) {
650
+ e.preventDefault();
651
+ e.stopPropagation();
652
+ $(targetElement).unbind('click');
653
+ var selectedOption = $(
654
+ '<?php echo esc_attr( $popup_id ); ?> input[name="ti-deactivate-option"]:checked');
655
+ var data = {
656
+ 'action': '<?php echo esc_attr( $key ) . '_uninstall_feedback'; ?>',
657
+ 'nonce': '<?php echo wp_create_nonce( (string) __CLASS__ ); ?>',
658
+ 'id': selectedOption.parent().attr('ti-option-id'),
659
+ 'msg': selectedOption.parent().find('textarea').val(),
660
+ 'type': 'plugin',
661
+ 'key': '<?php echo esc_attr( $key ); ?>'
662
+ };
663
+ $.ajax({
664
+ type: 'POST',
665
+ url: ajaxurl,
666
+ data: data,
667
+ complete() {
668
+ $('body').removeClass('ti-feedback-open');
669
+ $('<?php echo esc_attr( $popup_id ); ?>').remove();
670
+ if (redirectUrl !== '') {
671
+ location.href = redirectUrl;
672
+ }
673
+ },
674
+ beforeSend() {
675
+ $('<?php echo esc_attr( $popup_id ); ?>').addClass('sending-feedback');
676
+ $('<?php echo esc_attr( $popup_id ); ?> .popup--footer').remove();
677
+ $('<?php echo esc_attr( $popup_id ); ?> .popup--body').html('<i class="dashicons dashicons-update-alt"></i>');
678
  }
679
+ });
680
+ });
681
  });
682
  })(jQuery);
683
+
684
  </script>
685
  <?php
 
686
  do_action( $this->product->get_key() . '_uninstall_feedback_after_js' );
687
  }
688
 
689
  /**
690
+ * Get the disclosure labels markup.
691
  *
692
+ * @return string
 
693
  */
694
+ private function get_disclosure_labels() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
695
  $disclosure_new_labels = apply_filters( $this->product->get_slug() . '_themeisle_sdk_disclosure_content_labels', [], $this->product );
696
  $disclosure_labels = array_merge(
697
  [
698
  'title' => 'Below is a detailed view of all data that ThemeIsle will receive if you fill in this survey. No domain name, email address or IP addresses are transmited after you submit the survey.',
699
  'items' => [
700
  sprintf( '%s %s version %s %s %s %s', '<strong>', ucwords( $this->product->get_type() ), '</strong>', '<code>', $this->product->get_version(), '</code>' ),
701
+ sprintf( '%s Uninstall reason %s %s Selected reason from the above survey %s ', '<strong>', '</strong>', '<i>', '</i>' ),
702
  ],
703
  ],
704
  $disclosure_new_labels
705
  );
706
 
707
+ $info_disclosure_content = '<div class="info-disclosure-content"><p>' . wp_kses_post( $disclosure_labels['title'] ) . '</p><ul>';
 
708
  foreach ( $disclosure_labels['items'] as $disclosure_item ) {
709
  $info_disclosure_content .= sprintf( '<li>%s</li>', wp_kses_post( $disclosure_item ) );
710
  }
711
  $info_disclosure_content .= '</ul></div>';
712
 
713
+ return $info_disclosure_content;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
714
  }
715
 
716
  /**
836
  * @return Uninstall_Feedback Current module instance.
837
  */
838
  public function load( $product ) {
839
+
840
+ if ( apply_filters( $product->get_key() . '_hide_uninstall_feedback', false ) ) {
841
+ return;
842
+ }
843
+
844
  $this->product = $product;
845
  add_action( 'admin_head', array( $this, 'load_resources' ) );
846
  add_action( 'wp_ajax_' . $this->product->get_key() . '_uninstall_feedback', array( $this, 'post_deactivate' ) );
vendor/codeinwp/themeisle-sdk/src/Product.php CHANGED
@@ -114,7 +114,7 @@ class Product {
114
  */
115
  public function __construct( $basefile ) {
116
  if ( ! empty( $basefile ) ) {
117
- if ( is_readable( $basefile ) ) {
118
  $this->basefile = $basefile;
119
  $this->setup_from_path();
120
  $this->setup_from_fileheaders();
@@ -200,6 +200,7 @@ class Product {
200
  public function get_key() {
201
  return $this->key;
202
  }
 
203
  /**
204
  * Check if the product is either theme or plugin.
205
  *
@@ -342,6 +343,11 @@ class Product {
342
  * @return string The store url.
343
  */
344
  public function get_store_url() {
 
 
 
 
 
345
  return $this->store_url;
346
  }
347
 
@@ -354,6 +360,21 @@ class Product {
354
  return $this->basefile;
355
  }
356
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
357
  /**
358
  * Returns product filename.
359
  *
@@ -362,6 +383,7 @@ class Product {
362
  public function get_file() {
363
  return $this->file;
364
  }
 
365
  /**
366
  * Returns the pro slug, if available.
367
  *
114
  */
115
  public function __construct( $basefile ) {
116
  if ( ! empty( $basefile ) ) {
117
+ if ( is_file( $basefile ) ) {
118
  $this->basefile = $basefile;
119
  $this->setup_from_path();
120
  $this->setup_from_fileheaders();
200
  public function get_key() {
201
  return $this->key;
202
  }
203
+
204
  /**
205
  * Check if the product is either theme or plugin.
206
  *
343
  * @return string The store url.
344
  */
345
  public function get_store_url() {
346
+
347
+ if ( strpos( $this->store_url, '/themeisle.com' ) !== false ) {
348
+ return 'https://store.themeisle.com/';
349
+ }
350
+
351
  return $this->store_url;
352
  }
353
 
360
  return $this->basefile;
361
  }
362
 
363
+ /**
364
+ * Get changelog url.
365
+ *
366
+ * @return string Changelog url.
367
+ */
368
+ public function get_changelog() {
369
+ return add_query_arg(
370
+ [
371
+ 'name' => rawurlencode( $this->get_name() ),
372
+ 'edd_action' => 'view_changelog',
373
+ ],
374
+ $this->get_store_url()
375
+ );
376
+ }
377
+
378
  /**
379
  * Returns product filename.
380
  *
383
  public function get_file() {
384
  return $this->file;
385
  }
386
+
387
  /**
388
  * Returns the pro slug, if available.
389
  *
vendor/codeinwp/themeisle-sdk/start.php CHANGED
@@ -37,7 +37,7 @@ $files_to_load = [
37
  $files_to_load = array_merge( $files_to_load, apply_filters( 'themeisle_sdk_required_files', [] ) );
38
 
39
  foreach ( $files_to_load as $file ) {
40
- if ( is_readable( $file ) ) {
41
  require_once $file;
42
  }
43
  }
37
  $files_to_load = array_merge( $files_to_load, apply_filters( 'themeisle_sdk_required_files', [] ) );
38
 
39
  foreach ( $files_to_load as $file ) {
40
+ if ( is_file( $file ) ) {
41
  require_once $file;
42
  }
43
  }
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitc85f2341c5e1e808367485f99d9b60a0
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInitc85f2341c5e1e808367485f99d9b60a0
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInitc85f2341c5e1e808367485f99d9b60a0', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInitc85f2341c5e1e808367485f99d9b60a0', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit404e6133548e50f4181f8af5f995d16a
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit404e6133548e50f4181f8af5f995d16a', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit404e6133548e50f4181f8af5f995d16a', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
vendor/composer/installed.json CHANGED
@@ -1,17 +1,17 @@
1
  [
2
  {
3
  "name": "codeinwp/themeisle-sdk",
4
- "version": "3.0.5",
5
- "version_normalized": "3.0.5.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Codeinwp/themeisle-sdk.git",
9
- "reference": "7ead6c057d783ea6c827d5b5de52a25c0e72de58"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/7ead6c057d783ea6c827d5b5de52a25c0e72de58",
14
- "reference": "7ead6c057d783ea6c827d5b5de52a25c0e72de58",
15
  "shasum": ""
16
  },
17
  "require-dev": {
@@ -19,7 +19,7 @@
19
  "squizlabs/php_codesniffer": "^3.1",
20
  "wp-coding-standards/wpcs": "^1.0.0"
21
  },
22
- "time": "2019-03-07 15:42:52",
23
  "type": "library",
24
  "installation-source": "dist",
25
  "notification-url": "https://packagist.org/downloads/",
1
  [
2
  {
3
  "name": "codeinwp/themeisle-sdk",
4
+ "version": "3.1.8",
5
+ "version_normalized": "3.1.8.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/Codeinwp/themeisle-sdk.git",
9
+ "reference": "d036ec8dd9ad318a05af3f21222025ec6a389a42"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/d036ec8dd9ad318a05af3f21222025ec6a389a42",
14
+ "reference": "d036ec8dd9ad318a05af3f21222025ec6a389a42",
15
  "shasum": ""
16
  },
17
  "require-dev": {
19
  "squizlabs/php_codesniffer": "^3.1",
20
  "wp-coding-standards/wpcs": "^1.0.0"
21
  },
22
+ "time": "2019-11-18 12:33:19",
23
  "type": "library",
24
  "installation-source": "dist",
25
  "notification-url": "https://packagist.org/downloads/",