PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.9.5
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.9.5
4.0.8 4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 All 149 releases
← All changes | vendor/codeinwp/themeisle-sdk/src/Modules/Uninstall_feedback.php +475 -343 3.1.33.9.5 View file →
@@ -39,9 +39,9 @@
39 39 * Where to send the data.
40 40 *
41 41 * @var string Endpoint url.
42 42 */
43 - const FEEDBACK_ENDPOINT = 'http://feedback.themeisle.com/wordpress/wp-json/__pirate_feedback_/v1/feedback';
43 + const FEEDBACK_ENDPOINT = 'https://api.themeisle.com/tracking/uninstall';
44 44
45 45 /**
46 46 * Default options for plugins.
47 47 *
@@ -53,9 +53,11 @@
53 53 'type' => 'text',
54 54 'placeholder' => 'What\'s the plugin\'s name?',
55 55 ),
56 56 'I could not get the plugin to work' => array(
57 - 'id' => 4,
57 + 'type' => 'textarea',
58 + 'placeholder' => 'What problem are you experiencing?',
59 + 'id' => 4,
58 60 ),
59 61 'I no longer need the plugin' => array(
60 62 'id' => 5,
61 63 'type' => 'textarea',
@@ -61,9 +63,11 @@
61 63 'type' => 'textarea',
62 64 'placeholder' => 'If you could improve one thing about our product, what would it be?',
63 65 ),
64 66 'It\'s a temporary deactivation. I\'m just debugging an issue.' => array(
65 - 'id' => 6,
67 + 'type' => 'textarea',
68 + 'placeholder' => 'What problem are you experiencing?',
69 + 'id' => 6,
66 70 ),
67 71 );
68 72 /**
69 73 * Default options for theme.
@@ -74,9 +78,11 @@
74 78 'I don\'t know how to make it look like demo' => array(
75 79 'id' => 7,
76 80 ),
77 81 'It lacks options' => array(
78 - 'id' => 8,
82 + 'placeholder' => 'What option is missing?',
83 + 'type' => 'text',
84 + 'id' => 8,
79 85 ),
80 86 'Is not working with a plugin that I need' => array(
81 87 'id' => 9,
82 88 'type' => 'text',
@@ -94,9 +100,9 @@
94 100 private $other = array(
95 101 'Other' => array(
96 102 'id' => 999,
97 103 'type' => 'textarea',
98 - 'placeholder' => 'cmon cmon tell us',
104 + 'placeholder' => 'What can we do better?',
99 105 ),
100 106 );
101 107 /**
102 108 * Default heading for plugin.
@@ -102,15 +108,15 @@
102 108 * Default heading for plugin.
103 109 *
104 110 * @var string $heading_plugin The heading of the modal
105 111 */
106 - private $heading_plugin = 'Quick Feedback <span>Because we care about our clients, please leave us feedback.</span>';
112 + private $heading_plugin = 'What\'s wrong?';
107 113 /**
108 114 * Default heading for theme.
109 115 *
110 116 * @var string $heading_theme The heading of the modal
111 117 */
112 - private $heading_theme = 'Looking to change {theme}? <span> What does not work for you?</span>';
118 + private $heading_theme = 'What does not work for you in {theme}?';
113 119 /**
114 120 * Default submit button action text.
115 121 *
116 122 * @var string $button_submit The text of the deactivate button
@@ -125,476 +131,595 @@
125 131
126 132 /**
127 133 * Loads the additional resources
128 134 */
129 - function load_resources() {
130 - add_thickbox();
135 + public function load_resources() {
136 + $screen = get_current_screen();
131 137
132 - $id = $this->product->get_key() . '_deactivate';
138 + if ( ! $screen || ! in_array( $screen->id, array( 'theme-install', 'plugins' ) ) ) {
139 + return;
140 + }
133 141
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 );
142 + $this->add_feedback_popup_style();
136 143
137 - echo '<div id="' . $id . '" style="display:none;" class="themeisle-deactivate-box">' . $this->get_html( $this->product->get_type(), $this->product->get_key() ) . '</div>';
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();
138 152 }
139 153
140 154 /**
141 - * Loads the css
142 - *
143 - * @param string $type The type of product.
144 - * @param string $key The product key.
155 + * Render theme feedback drawer.
145 156 */
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+KBNOswAAFtFJREFUeNrkWwmUXVWV3W/8Y81zkVAhgUwQg00IAYIRGcRuERDSKqALtVEbxRYcGzWIuhatKCYuUXQtERRtFAccQCDtckCZwpRISEIlIXMqlaGGP///ht7n3vd//YRUUkljN718a53U+++//97d95yzz3BvjDAM8fd02May4YndaZhoDErYeu/laCyN8rN16PuDAPA83mcAjjOxd8jcVypydhrlKspCSidlhPIk5T8p9/+PAP8fTrZJaaQ0UFxKiVKk/CvlU5Rk3b0C+gTKFZRvUa75/wJ4EuVcyimU2RGQdkqCkoOBDExjBoJx3Uwm5OlXt4bFrIPgTXSJK+DY59PEO8a5s0mPiEPyfUrwMieh3ED57qsTsJBhoXAOmps+gd6u85AvGtgxQEOmJcfj+vvxDsvS/hzsB5pkgA9QplJuoux59QD2g1ZUvCXhVe+4pnjxJc5gdx8SxTza1jwDY9ntMDdsBlLJQ4O2CTogRs+vBzydFmLCMm98NWl4OvL5O3Hd+09/9p8/iK/9GOjfRHZKpnHZWy7AlbfPRuK918DYTm3H3PHZWrQbVnHKtUBbh201EvSFvHLX0TLlK3ksRLG4HPPmnL7+0vfiaz8EOkwP+aduwPKbZ+DadyzBnVuPBa4nEQf+/hqW0zKvZcqkJoYmi0DTMXo2+cyltiu8oSi+HQrR3UG5+n9Fw6bFmRYJOVehUf/VAsrPacodOPtM3LcmjmPSwMz4cvzXAJEXt6C89gv49rJTcMk3zkdPL8e9e0iTVNHTTziuGTi9D5jF73oaNVg5RnLAjiywagfwp01ybiJufQOOuYMTdf9hg3s5H83oEQIWhYwOMGySf2KNFTjJchW0EMmPKB1KMx2d2LQFGCKtvPD0A1izbitnitcZbrat+T12Fi8i4C5g6y49kDkk7re/RoNtTmo+DiKmFlPupaZPbAPOp3VceSLwYD/fttrFUPlbSNsL+YgtB48QjGKmje+ceBlKlqsATBywIe82sG9TC5OhONqP2wOnucB0wRY13Cn6qQWPYgEtVNZvf8/J3RhnZAprrtjY81qkxHX3jGrtvn8esHgm0wzek6Vf76Y2Q19ncibBmymeM1Mz+H1IS2ji9XfPAuZzAm5+ajLWDn8JKfvymgprQczHyvbpGEh14f2nX89sLyVsehQmbQewKj5GBxtQzMXQ3DvyWcvxz9rPvFf9Fed+ELjnl8Q07To07FyJ3MATCDouxXmL344pO55nmsFs8avMHE8jmH1/puzmkEsarBo7n2dweCbn06YFxJizWJzFErVW5Kwez8m45VTgM08txqqhu5C0HxyDHNIIDSxedCP6Ozk5Bb6rNHzkpCWQTJqlwQcWcgkUh+NXG2b4sf1uSjDGPvQITh98Bh/5F35s6UXTovvR+eaVuPD6O/DRt8bg/uL7CK+nj75mI7DtD0CefhkUopfYkUZtDdyn75Y2kMz+wvtW6s8yMRmCaCLwG2Za6E5ch4xnoMLPZUo2g3uPPQfr25iNFob3U76BpUMTVK2JBLOmP37hU5hE5yzBvbZz2p6lyXYSiH/AvBVLCI/pRvnmG7Fy8nysYtgVEz+jIYPuu7+NSvIe2OfZMIvh4YuQevIRkxYtx6fxd662hkZOzu9257Fk/esZrlaI2arY+PY70d8yhRNZOWKWPobSS4fPFBx37YaeHkwdGrgCqfDWZGveRHAQI6GWje07EXvfRzB/0XzMn0UfzdBnH/oLwrOogTcfS7BbtSaPxL7kfp+aLayliR+nJytDEz8jnsRpDW/F45kVFTfE0rmXo7+VPOqXjygOn0f5qXgk5QnKc9Ty50MVfozbGjqyVFFwIFWM0XkioXPiB8hct9wGfI15Qmo3gnfSb3MZVW4e1SGmHtL8K1u1G1QYciyCflPqPFRK9ouN0/CJM6+LNBtOKA6Lqy6hfJri1H5jWbFUIX9D75597yM/NSWaiwfG4ZeDlpw4ldLvjXO23zOPeYMPw9/HqY5pRj+qg8/1yebYp0ktzwfNDGdgvnvcKnd6P7yKDmcTzLQE7Oc4SMflty1xA21JEyazng8v/4110uDmrrAphBXzdK47kUNYdS7j94ITEI7uhOkEh56sCefsGQ1cEotkIV3+ePKUm856txCXlKCXqLzgMIDfqEowaqQ1YaCv0URrjJyciGHu9k24+k8PsiB1EW8q6rg40S6GzPbZ3bSnOK1xAJZtHrpwmHDM4HODnDbtcAiPetNnb8x1fBFmebnK+oBHKVeOZ9JMBPEfHKDbTrBdKZMZX4gS3TDvmHjvA79BayGDYSONWKo8ce36BNZGgCd3EmyRRDt8BMw8kaNquhXmLC3vrHhOj2GXqp54POUHUVL0hQM1fBXvOjnlGOgm2Arjrcdn5VwHJ2zZggueXYEc4tSOD8vxxupW4zDAJcuaxBDSmUaQzzKS5HXV87cowWFMgWPElBtSHLPGW1I/L64HzGwB75KTjqShrI3JlBprgbnoPz3xONqZrVRoEKYVQrGzmJSkhgJ6PABGBLiPBBW3SJySXHhjJd8rfhiK/CVtF8X1pk3EdP4iL/x36ZOZtUonxClJ3iQ3lqldscQK70tmczj/mRUoE6z8TqolBboKWDqSVeDjabvZ0n7MxCH0A/ytjqyf5msspTCxTpvDEdCmHtZrKYuqgC8VbTe5ot1QZWjyg6ztYNbmzZi+Y5tkViqlNKhdQ4BVw45Dc3Uj0CIHalvuFfsJyuqrMLReAcI6+DGCHsX+AccZRPSR4JCa40bVtF8no4tJ4a7GxXELWLnRDyUBt7DghReQCop8gHFAmhdGPWd7f007ddqu4hLt+gX6vuTJCX4MXnHvlVRzS2lmrfgQxYVROtDg1sb+D6Zql4Y4PsY6ltasAQfanA3Px4xtWyIXqFZd9EXF0KFuw4h2rQioAu3UmbmpQUtiIKHDFKtoQTlb0t+9YkeFFtmNFUNMJw0ydGjUwErH16VNR6/rkT9zJCSJc8tNnjLnkD5rIp3N44TB7UzHx8KI75mcxGiw5XIENgLp2AdoPLq2Tx6aV1qOt01CcUieUTk8w0848SpjXeFUPDvUQmCBAloFK2IyZzC1jlIy8mnqN2bVlDWPlqnVhlwO7SOj/DymjYCARdRgBbA8yHXHfLhewwJW/GSbaJkaDrKwk0m4bXMwujkLv1JSWaJ6vIyoKvJMSWwM6XuVyXWM374kO8FBJknYKYn1T07hKzxyjPbfsE7qWoEyIsxU8SliNvFdZdJ8sctEIVEq1/xXDCVkdVQpOHAk+ZDYVSCQpubIj0w9SDVoQycnTGIwyAcOcBr7mAp6MSS6ephenonsrrX06wzcRJSLmJoMaYD0FpvjINsZbeQhxvAKx5HfiFR7hWltXV9bUtyB45G6YzPMS0scq1XTcFjT8Jiz26r0k4nlVS9ATUJ+jpVKcFgD1/uwvKY4GkeyI6fnbZQgWlt0fSqrDPJ039DgxfSFmkd5/Uk+9DiadSWrfhZjgRxrWohyIY+glFcmboQmgcdYVzTDdJs4KQ0E18RrBGi5KA3vRqb/e2jsLfKxjp5ctxW4mwnRmgHFlZ7y33BMwxHVBDqSlgVwuxF94YU6u/KV8UtzkjE3Yrux0B4qwGHF4kB4U5GmNkoQba21RoGWqI8soMVzHufnN1CaWc/6jh4N73HTSdJoS9TlqIoVdTwkhPH54u+Bg1hbL7zhhfByD8BtciS7AJa3oXD3Ls73ND7Oh7TpqiYtMELolkBkEFmzuqajTDnyYb/6i4NkRAKYZSdBM5pZUWjas0f/KBar8+U6ApNguJevepD3S1oq5WFYjjqT9GOPbiEpZ00KWgLpcVV0p0OE1uE0dHGiCLSBz3osicqyvchk5V1mzb9rJh2pStrdUSDca0buq8ZbZWgvMt4SycejnRgHKYCkiad8VF5C08fOnWPsXGXsGmh+bqTJ/5Gv+4skeOL/uxWJVTMwMuH+f2vnVcCVKMaWYIiKfsf33pLF8EuuKtsrDv1eIkagDTqo8+OSF1Y1vM6MNF5LOJT/Rg5QJPuWGGfNAzoH8rk4EkdxOKGb8uI8+6i1wUHdxKuxdB14N5J7ONCnKEkBRMuo7NXaRtSDluEoYNXzYIxn42KFW2H8mr/9RoD8YAK5bJqG7yGXSMC3rJqGa2YtU1RbnsJacZS9QlyS45vRzETxB3kOcJQAmlnlAC8v6Ya2NaG7saTSTbUSsX2H1mZ3J99i6BaPYYyJpO5Fyvd8zdxn82Ux+nSZBOinOIBG3cEQkgqicCXEZEvSQlm5De6d62CtcMmPDvYNtCh05GXsaGmlm/Pd5aI230hpokBZoeF8+VXA2yX58ALNxYrMOMNhpYJhFv4bWzswbe+gWp4/0JdL+RiGCbplCrVbbeYx91Ya6u2l9jy9hUHFV1NPgISpMuUXPF8VgZ7O8zSBm6MRUdmatITtZa1pE8H+gdHg90xP88yVYw72bGiHR841VdAMsbp7kn5HqJspSsOGNueK1uJW6cvZ0Yr6BWOa9RnfPSU+zbm/vRMX9P91nGIsxMiuBrXkku6kFXhV0FsYn8mufX3UakL7uBFpu8ri0vXYxGvfpbRR+qQ/ymE2+nqhf4TnWzlhLxLwFko+VGwfsHzd3d+OYjamwIp2C2T21cccq0mwluqHKsUs+DV3FJy7BfCDlE+q7ocCW1Ga0H+BZ6YcC+8xs6b9AwHLRO3a1KxCTLo9r8OQaGcX/ZmlJSZz5pv5vR1qbVc3usgT04a+f4R/VxDg414UNH3USjaJ55KvM8Hw6Q4717eiRP5wIt5leoLdqUb0d3VANe/qxik/r/PfX1cbAOTN8F7RqMkSzvA9DVYYkgnBo32TsT3Vwhf44y4/BjTnLRtbMTSQ1pwvaaGQlmRh617UMjwytvovImvDVUJL8LzBlrKGk0CRxSdh9WaGuTSvxwzkMzG8tJYxl2DdCFKoSj0Pz07qow83wygXUQ1Gmp1R5SQx598qwAZ1bwTBZw2/sgu+NmVEJm0z192VTuGxqceypK1gvCpW6ksh602bmrCV4rGiUhqVBN3k+fAwTZOgX1jDV/PdmYzWpLCqG9XTMgFy7lRragkbJKB8EQMbXWxY08yCy1Wldf3CiVS/D594orIaQ1mo7pULCZfHNsfcSxnU+7Sk7RJiA5/+Sf7gzv1MWkyLL//ZSSfirc8/zzwjPKAuHnt5Ujieyf3OXUkMZ1z09mTR0soUUIBX15IlKxOti7nXJyhG3Sq/76kmurx+eNjFjp2NJPE4Gvn8GIz9Jl2UsLmhDQ/PnKUX2eQdQri81w9q95JR8c0xi4wiMjV9l+GX51C7HzUi4hJN28UAj0yZhGe6e3Dqzu3Iwh23G5siMGmrDBdsrNnYgPSuBDoIurWpzCTMZ4IU+a56pRexeFhXaxsoknn3jiSxZyiGQs5BOrTQRgDmAWCrgH8697UYbOZ00BoNy9HRgn4fmrWGrCwobKgDnNAxTmvu0wQ7jdq9WJk1NW3zb9G1cMcpc3Dab7brimmcJpzyKYLu5PAkaR3OGViXt2EPkNASHhqZbCQI3LGDagRRIMuUfNFGJm+xxONAPQspPqNLadXcr8yrHi45ZWeiEXedOo+2WyJ1cGRq+cZSZaTkBtT0V3jh9v04x3SeQpibxxtGRKPSLriaoNtpWgurmnaLJfxqxhRc8WwfXrd9G0Zgjdt3rA6skeWdLEEXGY4ynLgcZ2AoK9SnSa32+9BQnmhT4jxvJcAUn+9EXYvxmkEpavfW+QuxpZ2ESu2GaoVfp6msukbD0FrCRy57Wa8g9p5f0s+eRzi0AIYnhWmZEc94yPTKi0hkvaJpiw5VJE+v7whx0Ysb4Pr2YZeFor6m0riYZRMhNfJvo3wmoJQ6t9DMJKOV0hY6PLcI+uDmW//cBpTxdFcvPn7hBZxAQ2l3LKMz/0jbvoqgfnawBTvLeRvhpVfDSD3Hp3GWStKkdzJGJfaQEeTONYJyl1FxOePD2HT2UnrALrxx5SSUEE60vVYDL3bhEk6cwJIEFuNfV5X7Ri3OH+6pYsoVMvn7Lv5HvNTWBlfiOlSltJl+chOB/htls+ztODjgxbKKx9fGNsFs+gPM9ntZkrK+tEdGjHz3b81ifD7cHZPDObfAbFmJJ2ZmMXVLA07d2oa8mt8j7i++TCa+ZhgyGnhYsuhM/Oqk6YiXmDeY5mBoWt8kwA9QHmYY9BXYcQDbtWEECf3XGoLR8X2QMSgztgT5rvuQ2ngG0ttglRLw3AAfvfZpdIzE8PrVnRhGpa67ZEZtfh0fxwCadZVW9bpRIz8j+nSo60Jdab7rK/Pm4tvzZiNeLA7CjP2ARHUbtfvShNcmEj9JtEWl0J66TZ6S2b4OZmkx06+FLDSVFdRWP8m07QT8nS/NxzmruzEkoGMBUhcW4E4vo9zvIv/LJIKyLLP6SF2Uh9PnofRXF7n7Eyp0WC28fnEOdpeP4tMMQcvjasKc7gqSb8nDag5QfDSO/J8lswoU2K/PnYUbz16wwTGdH5pm7K7QcjZSFGGFJsWOxIrxL8W0Dgp4drSzzVHNSr3Fty3a0jv+ki9BNzHkfHXpPFzy5CTElg0geWlG0yqDcf7HDdjzuVZ0LtuN+Hl5XWyzasrc3ozh25rQ+d1diJ1WrDWbRm5uRebeNLp/NAB7dinaZ2lg9DOt2Ht3E76+YMajSxfM/QFJ7Sem6exToBTYIwcsfxdR7o7ATsw0JFelVg1iuXXzdFy7uEHFT5BtmQUwQlRQejyO+MKC6lQq77HKCAs+ys/FEDtLth/FdP/KLiEYZhnX7yB2ulyXriSvx3i+r1z6ycfmfehtfed/H+1WOc2iIqiCOgrAJC21sYRFLO6LAM+e6Hq0RQ2ULQ99cwy8OdHNCyIs4o0043ce9hQBm6Tt9PB6g4qehpGFPZlAPH52u/X1MAnDzcCeRAMrs7Jy5DoLkYATksoWEyflbyqY7s7n9/WgUIrBdkNNSgKoKkbd+SFIq/6KOP5llPOjnaq7J7QIz/LOzUlY4ODcTmqL3uB06hXYkpR3BGx31V3nfaVQA3Wi+90u1ZVU99ukEIelnt2uvy+45tSpQ6nvXPgAnrrsDlwxaxUrRwsFz8HRHPYBw1+ktv8CA9FC7oSOuBnuYaLcBrvDqHU7jfU6T5LNKwJA9aaCqKMRRDvsOnV3RJp0og11Pa0nSMrRIK9VUtLLE3M6d+Dui36IM57ehqWr3oD+zGRYTFmtowQcQv9HC9Hy6ye42WCfZeDz81NSxFpfVqZbXVU0qsCk5OvV8xdGSyWmdD9oAW5v1I2sjO3ZkL2V1fv90aoidJzypca2cc3Jf8a7pq/CHS8uwJfXnIvthW7FsbI74Uj3Sz9GOScC/fNqDXmQTRXS87mlFARnzYwnll3U1JZFmR7g7dba9Bjh1F4Ot4IKjSUY0vslKzs0CLle3qZ70GLS5c16c4rBqqL8kloN1PsqX9K9aea7+42gHEfaKeLDJz+MNRd/HjedfB+unPYnloQWg4F52Dh8qO8lHk+Jtv+INWSjpp+MarjAYvvnfVNxSXOrlJWP8pY07BaClRLUl//g8Fma7FJqmfVAU3Q9WMfrzFF9ZkdxQ5GTtGoN40lev4cfblVmbST0xBnmI/xHdhcVDo6A8++UlH0+t28qrlxxPVbnZnBOjYOy9OG2Hm6OZPz9/q6EHNG4eTlHuIQaPY7mzN+Yn1N9JMMq0mQ/icquHmpwLa/LXotHVPEalD5EP23l9VUc+fUc9UoOKQU/9x7OLSndelJfHwesckRqtKyVdnLbOjQ4hUPuATP+3v4r3n8LMAAsR90w+kkNLQAAAABJRU5ErkJggg==';
152 - }
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 +
153 166 ?>
154 - <style type="text/css" id="<?php echo $key; ?>ti-deactivate-css">
155 - input[name="ti-deactivate-option"] ~ div {
156 - display: none;
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( //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Function has an internal sanitization.
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;
157 211 }
158 212
159 - input[name="ti-deactivate-option"]:checked ~ div {
160 - display: block;
161 - }
162 213
163 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #TB_window.thickbox-loading:before {
164 - background: none !important;
214 + .ti-feedback .popup--header {
215 + position: relative;
216 + background-color: #23A1CE;
165 217 }
166 218
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%;
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;
178 227 }
179 228
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;
229 + .ti-feedback .popup--body {
230 + padding: 15px;
183 231 }
184 232
185 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content ul strong {
186 - width: 125px;
187 - display: block;
233 + .ti-feedback .popup--form {
188 234 margin: 0;
189 - float: left;
235 + font-size: 13px;
190 236 }
191 237
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;
238 + .ti-feedback .popup--form input[type="radio"] {
239 + <?php echo is_rtl() ? 'margin: 0 0 0 10px;' : 'margin: 0 10px 0 0;'; ?>
196 240 }
197 241
198 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content p {
199 - font-style: italic;
200 - margin-bottom: 0px;
242 + .ti-feedback .popup--form input[type="radio"]:checked ~ textarea {
243 + display: block;
201 244 }
202 245
203 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container #<?php echo $key; ?>-info-disclosure-content {
246 + .ti-feedback .popup--form textarea {
247 + width: 100%;
248 + margin: 10px 0 0;
204 249 display: none;
250 + max-height: 150px;
205 251 }
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;
252 +
253 + .ti-feedback li {
254 + display: flex;
255 + align-items: center;
256 + margin-bottom: 15px;
257 + flex-wrap: wrap;
210 258 }
211 259
212 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open #<?php echo $key; ?>-info-disclosure {
213 - top: -130px;
260 + .ti-feedback li label {
261 + max-width: 90%;
214 262 }
215 263
216 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container.<?php echo $key; ?>-container-disc-open {
217 - height: 590px !important;
264 + .ti-feedback li:last-child {
265 + margin-bottom: 0;
218 266 }
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;
267 +
268 + .ti-feedback .popup--footer {
269 + padding: 0 15px 15px;
226 270 }
227 271
228 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.actions {
229 - box-sizing: border-box;
230 - padding: 30px 40px;
231 - background-color: #eaeaea;
272 + .ti-feedback .actions {
273 + display: flex;
274 + flex-wrap: wrap;
232 275 }
233 276
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;
277 + .info-disclosure-link {
278 + width: 100%;
279 + margin-bottom: 15px;
250 280 }
251 281
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;
282 + .ti-feedback .info-disclosure-content {
283 + max-height: 0;
284 + overflow: hidden;
285 + width: 100%;
286 + transition: .3s ease;
263 287 }
264 288
265 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:hover {
266 - background: #e83f42;
289 + .ti-feedback .info-disclosure-content.active {
290 + max-height: 300px;
267 291 }
268 292
269 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary:hover {
270 - background: transparent;
293 + .ti-feedback .info-disclosure-content p {
294 + margin: 0;
271 295 }
272 296
273 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:focus {
274 - box-shadow: none;
275 - outline: none;
297 + .ti-feedback .info-disclosure-content ul {
298 + margin: 10px 0;
299 + border-radius: 3px;
276 300 }
277 301
278 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:active {
279 - box-shadow: none;
280 - transform: translateY(0);
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;
281 309 }
282 310
283 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button:disabled {
284 - cursor: not-allowed;
311 + .ti-feedback .buttons {
312 + display: flex;
313 + width: 100%;
285 314 }
286 315
287 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container input.button.button-primary:hover {
288 - text-decoration: none;
316 + .ti-feedback .buttons input:last-child {
317 + <?php echo is_rtl() ? 'margin-right: auto;' : 'margin-left: auto;'; ?>
289 318 }
290 319
291 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container div.revive_network-container {
292 - background-color: #ffffff;
320 + .ti-theme-uninstall-feedback-drawer {
321 + border-top-left-radius: 5px;
322 + position: fixed;
323 + top: 100%;
324 + right: 15px;
293 325 }
294 326
295 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list {
296 - margin: 0;
327 + .ti-theme-uninstall-feedback-drawer.active {
328 + transform: translateY(-100%);
297 329 }
298 330
299 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li {
300 - color: #373e40;
301 - font-size: 13px;
302 - margin-bottom: 5px;
331 + .ti-theme-uninstall-feedback-drawer .popup--header {
332 + border-top-left-radius: 5px;
303 333 }
304 334
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;
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;
309 349 }
310 350
311 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list input[type=radio] {
312 - margin-top: 1px;
351 + .ti-theme-uninstall-feedback-drawer .toggle span {
352 + margin: 0;
353 + display: inline-block;
313 354 }
314 355
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;
356 + .ti-theme-uninstall-feedback-drawer:not(.active) .toggle span {
357 + transform: rotate(45deg);
320 358 }
321 359
322 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container li div textarea {
323 - padding: 10px 15px;
324 - width: 100%;
360 + .ti-theme-uninstall-feedback-drawer .popup--header .toggle:hover {
361 + background-color: #1880a5;
325 362 }
326 363
327 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container ul.ti-list li div {
328 - margin: 10px 30px;
329 - }
330 364
331 - .<?php echo $key; ?>-container #TB_title #TB_ajaxWindowTitle {
332 - box-sizing: border-box;
365 + .ti-plugin-uninstall-feedback-popup .popup--header:before {
366 + content: "";
333 367 display: block;
334 - float: none;
335 - font-weight: 700;
336 - line-height: 1;
337 - padding: 0;
338 - text-align: left;
339 - width: 100%;
368 + position: absolute;
369 + top: 50%;
370 + transform: translateY(-50%);
371 + <?php
372 + echo is_rtl() ?
373 + 'right: -10px;
374 + border-top: 20px solid transparent;
375 + border-left: 20px solid #23A1CE;
376 + border-bottom: 20px solid transparent;' :
377 + 'left: -10px;
378 + border-top: 20px solid transparent;
379 + border-right: 20px solid #23A1CE;
380 + border-bottom: 20px solid transparent;';
381 + ?>
340 382 }
341 383
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;
384 + .ti-plugin-uninstall-feedback-popup {
385 + display: none;
386 + position: absolute;
387 + white-space: normal;
388 + width: 400px;
389 + <?php echo is_rtl() ? 'right: calc( 100% + 15px );' : 'left: calc( 100% + 15px );'; ?>
390 + top: -15px;
349 391 }
350 392
351 - body.<?php echo $suffix; ?> .<?php echo $key; ?>-container .actions {
393 + .ti-plugin-uninstall-feedback-popup.sending-feedback .popup--body i {
394 + animation: rotation 2s infinite linear;
395 + display: block;
396 + float: none;
397 + align-items: center;
352 398 width: 100%;
353 - display: block;
354 - position: absolute;
355 - left: 0;
356 - bottom: 0;
399 + margin: 0 auto;
400 + height: 100%;
401 + background: transparent;
402 + padding: 0;
357 403 }
358 404
359 - .theme-install-php .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
360 - font-size: 32px;
405 + .ti-plugin-uninstall-feedback-popup.sending-feedback .popup--body i:before {
406 + padding: 0;
407 + background: transparent;
408 + box-shadow: none;
409 + color: #b4b9be
361 410 }
362 411
363 - .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
364 - color: #eee;
365 - }
366 412
367 - .<?php echo $key; ?>-container #TB_closeWindowButton {
368 - left: auto;
369 - right: -5px;
370 - top: -35px;
371 - color: #eee;
413 + .ti-plugin-uninstall-feedback-popup.active {
414 + display: block;
372 415 }
373 416
374 - .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon {
375 - text-align: right;
376 - line-height: 25px;
377 - width: 25px;
378 - height: 25px;
417 + tr[data-plugin^="<?php echo esc_attr( $this->product->get_slug() ); ?>"] .deactivate {
418 + position: relative;
379 419 }
380 420
381 - .<?php echo $key; ?>-container #TB_closeWindowButton:focus .tb-close-icon {
382 - box-shadow: none;
383 - outline: none;
421 + body.ti-feedback-open .ti-feedback-overlay {
422 + content: "";
423 + display: block;
424 + background-color: rgba(0, 0, 0, 0.5);
425 + top: 0;
426 + bottom: 0;
427 + right: 0;
428 + left: 0;
429 + z-index: 10000;
430 + position: fixed;
384 431 }
385 432
386 - .<?php echo $key; ?>-container #TB_closeWindowButton .tb-close-icon:before {
387 - font: normal 25px dashicons;
388 - }
433 + @media (max-width: 768px) {
434 + .ti-plugin-uninstall-feedback-popup {
435 + position: fixed;
436 + max-width: 100%;
437 + margin: 0 auto;
438 + left: 50%;
439 + top: 50px;
440 + transform: translateX(-50%);
441 + }
389 442
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;
443 + .ti-plugin-uninstall-feedback-popup .popup--header:before {
444 + display: none;
445 + }
398 446 }
399 447 </style>
400 448 <?php
401 - do_action( $this->product->get_key() . '_uninstall_feedback_after_css' );
402 449 }
403 450
404 451 /**
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.
452 + * Theme feedback drawer JS.
410 453 */
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 );
454 + private function add_theme_feedback_drawer_js() {
455 + $key = $this->product->get_key();
415 456 ?>
416 457 <script type="text/javascript" id="ti-deactivate-js">
417 458 (function ($) {
418 459 $(document).ready(function () {
419 - var auto_trigger = false;
420 - var target_element = 'tr[data-plugin^="<?php echo $this->product->get_slug(); ?>/"] span.deactivate a';
460 + setTimeout(function () {
461 + $('.ti-theme-uninstall-feedback-drawer').addClass('active');
462 + }, <?php echo absint( self::AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS * 1000 ); ?> );
463 +
464 + $('.ti-theme-uninstall-feedback-drawer .toggle').on('click', function (e) {
465 + e.preventDefault();
466 + $('.ti-theme-uninstall-feedback-drawer').toggleClass('active');
467 + });
468 +
469 + $('.info-disclosure-link').on('click', function (e) {
470 + e.preventDefault();
471 + $('.info-disclosure-content').toggleClass('active');
472 + });
473 +
474 + $('.ti-theme-uninstall-feedback-drawer input[type="radio"]').on('change', function () {
475 + var radio = $(this);
476 + if (radio.parent().find('textarea').length > 0 &&
477 + radio.parent().find('textarea').val().length === 0) {
478 + $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
479 + radio.parent().find('textarea').on('keyup', function (e) {
480 + if ($(this).val().length === 0) {
481 + $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
482 + } else {
483 + $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
484 + }
485 + });
486 + } else {
487 + $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
488 + }
489 + });
490 +
491 + $('#<?php echo esc_attr( $key ); ?>ti-deactivate-yes').on('click', function (e) {
492 + e.preventDefault();
493 + e.stopPropagation();
494 +
495 + var selectedOption = $(
496 + '.ti-theme-uninstall-feedback-drawer input[name="ti-deactivate-option"]:checked');
497 + $.post(ajaxurl, {
498 + 'action': '<?php echo esc_attr( $key ) . '_uninstall_feedback'; ?>',
499 + 'nonce': '<?php echo esc_attr( wp_create_nonce( (string) __CLASS__ ) ); ?>',
500 + 'id': selectedOption.parent().attr('ti-option-id'),
501 + 'msg': selectedOption.parent().find('textarea').val(),
502 + 'type': 'theme',
503 + 'key': '<?php echo esc_attr( $key ); ?>'
504 + });
505 + $('.ti-theme-uninstall-feedback-drawer').fadeOut();
506 + });
507 + });
508 + })(jQuery);
509 +
510 + </script>
511 + <?php
512 + do_action( $this->product->get_key() . '_uninstall_feedback_after_js' );
513 + }
514 +
515 + /**
516 + * Render the options list.
517 + *
518 + * @param array $options the options for the feedback form.
519 + */
520 + private function render_options_list( $options ) {
521 + $key = $this->product->get_key();
522 + $inputs_row_map = [
523 + 'text' => 1,
524 + 'textarea' => 2,
525 + ];
526 + ?>
527 + <ul class="popup--form">
528 + <?php foreach ( $options as $title => $attributes ) { ?>
529 + <li ti-option-id="<?php echo esc_attr( $attributes['id'] ); ?>">
530 + <input type="radio" name="ti-deactivate-option" id="<?php echo esc_attr( $key . $attributes['id'] ); ?>">
531 + <label for="<?php echo esc_attr( $key . $attributes['id'] ); ?>">
532 + <?php echo esc_attr( str_replace( '{theme}', $this->product->get_name(), $title ) ); ?>
533 + </label>
421 534 <?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>'));
535 + if ( array_key_exists( 'type', $attributes ) ) {
536 + $placeholder = array_key_exists( 'placeholder', $attributes ) ? $attributes['placeholder'] : '';
537 + echo '<textarea width="100%" rows="' . esc_attr( $inputs_row_map[ $attributes['type'] ] ) . '" name="comments" placeholder="' . esc_attr( $placeholder ) . '"></textarea>';
427 538 }
428 - target_element = 'a.ti-auto-anchor';
429 - <?php
430 - }
431 539 ?>
540 + </li>
541 + <?php } ?>
542 + </ul>
543 + <?php
544 + }
432 545
433 - if (auto_trigger) {
434 - setTimeout(function () {
435 - $('a.ti-auto-anchor').trigger('click');
436 - }, <?php echo self::AUTO_TRIGGER_DEACTIVATE_WINDOW_SECONDS * 1000; ?> );
546 + /**
547 + * Render plugin feedback popup.
548 + */
549 + private function render_plugin_feedback_popup() {
550 + $button_cancel = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_cancel', $this->button_cancel );
551 + $button_submit = apply_filters( $this->product->get_key() . '_feedback_deactivate_button_submit', $this->button_submit );
552 + $options = $this->randomize_options( apply_filters( $this->product->get_key() . '_feedback_deactivate_options', $this->options_plugin ) );
553 + $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>';
554 +
555 + $options += $this->other;
556 + ?>
557 + <div class="ti-plugin-uninstall-feedback-popup ti-feedback" id="<?php echo esc_attr( $this->product->get_slug() . '_uninstall_feedback_popup' ); ?>">
558 + <div class="popup--header">
559 + <h5><?php echo wp_kses( $this->heading_plugin, array( 'span' => true ) ); ?> </h5>
560 + </div><!--/.popup--header-->
561 + <div class="popup--body">
562 + <?php $this->render_options_list( $options ); ?>
563 + </div><!--/.popup--body-->
564 + <div class="popup--footer">
565 + <div class="actions">
566 + <?php
567 + echo wp_kses_post( $info_disclosure_link );
568 + echo wp_kses_post( $this->get_disclosure_labels() );
569 + echo '<div class="buttons">';
570 + echo get_submit_button( //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Function internals are escaped.
571 + $button_cancel,
572 + 'secondary',
573 + $this->product->get_key() . 'ti-deactivate-no',
574 + false
575 + );
576 + echo get_submit_button( //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped, Function internals are escaped.
577 + $button_submit,
578 + 'primary',
579 + $this->product->get_key() . 'ti-deactivate-yes',
580 + false,
581 + array(
582 + 'data-after-text' => $button_submit,
583 + 'disabled' => true,
584 + )
585 + );
586 + echo '</div>';
587 + ?>
588 + </div><!--/.actions-->
589 + </div><!--/.popup--footer-->
590 + </div>
591 +
592 + <?php
593 + }
594 +
595 + /**
596 + * Add plugin feedback popup JS
597 + */
598 + private function add_plugin_feedback_popup_js() {
599 + $popup_id = '#' . $this->product->get_slug() . '_uninstall_feedback_popup';
600 + $key = $this->product->get_key();
601 + ?>
602 + <script type="text/javascript" id="ti-deactivate-js">
603 + (function ($) {
604 + $(document).ready(function () {
605 + var targetElement = 'tr[data-plugin^="<?php echo esc_attr( $this->product->get_slug() ); ?>/"] span.deactivate a';
606 + var redirectUrl = $(targetElement).attr('href');
607 + if ($('.ti-feedback-overlay').length === 0) {
608 + $('body').prepend('<div class="ti-feedback-overlay"></div>');
437 609 }
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; ?>'
610 + $('<?php echo esc_attr( $popup_id ); ?> ').appendTo($(targetElement).parent());
611 +
612 + $(targetElement).on('click', function (e) {
613 + e.preventDefault();
614 + $('<?php echo esc_attr( $popup_id ); ?> ').addClass('active');
615 + $('body').addClass('ti-feedback-open');
616 + $('.ti-feedback-overlay').on('click', function () {
617 + $('<?php echo esc_attr( $popup_id ); ?> ').removeClass('active');
618 + $('body').removeClass('ti-feedback-open');
444 619 });
445 620 });
446 - var href = $(target_element).attr('href');
447 - $('#<?php echo $key; ?>ti-deactivate-no').attr('data-ti-action', href).on('click', function (e) {
621 +
622 + $('<?php echo esc_attr( $popup_id ); ?> .info-disclosure-link').on('click', function (e) {
448 623 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 - }
624 + $(this).parent().find('.info-disclosure-content').toggleClass('active');
457 625 });
458 626
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) {
627 + $('<?php echo esc_attr( $popup_id ); ?> input[type="radio"]').on('change', function () {
628 + var radio = $(this);
629 + if (radio.parent().find('textarea').length > 0 &&
630 + radio.parent().find('textarea').val().length === 0) {
631 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
632 + radio.parent().find('textarea').on('keyup', function (e) {
466 633 if ($(this).val().length === 0) {
467 - $('#<?php echo $key; ?>ti-deactivate-yes').attr('disabled', 'disabled');
634 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').attr('disabled', 'disabled');
468 635 } else {
469 - $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
636 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
470 637 }
471 638 });
472 639 } else {
473 - $('#<?php echo $key; ?>ti-deactivate-yes').removeAttr('disabled');
640 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').removeAttr('disabled');
474 641 }
475 642 });
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) {
643 +
644 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-no').on('click', function (e) {
481 645 e.preventDefault();
482 646 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();
647 + $(targetElement).unbind('click');
648 + $('body').removeClass('ti-feedback-open');
649 + $('<?php echo esc_attr( $popup_id ); ?>').remove();
650 + if (redirectUrl !== '') {
651 + location.href = redirectUrl;
496 652 }
497 653 });
498 654
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();
655 + $('<?php echo esc_attr( $popup_id ); ?> #<?php echo esc_attr( $key ); ?>ti-deactivate-yes').on('click', function (e) {
656 + e.preventDefault();
657 + e.stopPropagation();
658 + $(targetElement).unbind('click');
659 + var selectedOption = $(
660 + '<?php echo esc_attr( $popup_id ); ?> input[name="ti-deactivate-option"]:checked');
661 + var data = {
662 + 'action': '<?php echo esc_attr( $key ) . '_uninstall_feedback'; ?>',
663 + 'nonce': '<?php echo esc_attr( wp_create_nonce( (string) __CLASS__ ) ); ?>',
664 + 'id': selectedOption.parent().attr('ti-option-id'),
665 + 'msg': selectedOption.parent().find('textarea').val(),
666 + 'type': 'plugin',
667 + 'key': '<?php echo esc_attr( $key ); ?>'
668 + };
669 + $.ajax({
670 + type: 'POST',
671 + url: ajaxurl,
672 + data: data,
673 + complete() {
674 + $('body').removeClass('ti-feedback-open');
675 + $('<?php echo esc_attr( $popup_id ); ?>').remove();
676 + if (redirectUrl !== '') {
677 + location.href = redirectUrl;
678 + }
679 + },
680 + beforeSend() {
681 + $('<?php echo esc_attr( $popup_id ); ?>').addClass('sending-feedback');
682 + $('<?php echo esc_attr( $popup_id ); ?> .popup--footer').remove();
683 + $('<?php echo esc_attr( $popup_id ); ?> .popup--body').html('<i class="dashicons dashicons-update-alt"></i>');
684 + }
685 + });
503 686 });
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 687 });
518 688 })(jQuery);
689 +
519 690 </script>
520 691 <?php
521 -
522 692 do_action( $this->product->get_key() . '_uninstall_feedback_after_js' );
523 693 }
524 694
525 695 /**
526 - * Generates the HTML.
696 + * Get the disclosure labels markup.
527 697 *
528 - * @param string $type The type of product.
529 - * @param string $key The product key.
698 + * @return string
530 699 */
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 -
700 + private function get_disclosure_labels() {
561 701 $disclosure_new_labels = apply_filters( $this->product->get_slug() . '_themeisle_sdk_disclosure_content_labels', [], $this->product );
562 702 $disclosure_labels = array_merge(
563 703 [
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.',
704 + 'title' => 'Below is a detailed view of all data that ThemeIsle will receive if you fill in this survey. No email address or IP addresses are transmitted after you submit the survey.',
565 705 'items' => [
566 706 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>' ),
707 + sprintf( '%sCurrent website:%s %s %s %s', '<strong>', '</strong>', '<code>', get_site_url(), '</code>' ),
708 + sprintf( '%sUsage time:%s %s %s%s', '<strong>', '</strong>', '<code>', ( time() - $this->product->get_install_time() ), 's</code>' ),
709 + sprintf( '%s Uninstall reason %s %s Selected reason from the above survey %s ', '<strong>', '</strong>', '<i>', '</i>' ),
568 710 ],
569 711 ],
570 712 $disclosure_new_labels
571 713 );
572 714
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>';
715 + $info_disclosure_content = '<div class="info-disclosure-content"><p>' . wp_kses_post( $disclosure_labels['title'] ) . '</p><ul>';
575 716 foreach ( $disclosure_labels['items'] as $disclosure_item ) {
576 717 $info_disclosure_content .= sprintf( '<li>%s</li>', wp_kses_post( $disclosure_item ) );
577 718 }
578 719 $info_disclosure_content .= '</ul></div>';
579 720
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>';
721 + return $info_disclosure_content;
597 722 }
598 723
599 724 /**
600 725 * Randomizes the options array.
@@ -600,9 +725,9 @@
600 725 * Randomizes the options array.
601 726 *
602 727 * @param array $options The options array.
603 728 */
604 - function randomize_options( $options ) {
729 + public function randomize_options( $options ) {
605 730 $new = array();
606 731 $keys = array_keys( $options );
607 732 shuffle( $keys );
608 733
@@ -615,9 +740,9 @@
615 740
616 741 /**
617 742 * Called when the deactivate button is clicked.
618 743 */
619 - function post_deactivate() {
744 + public function post_deactivate() {
620 745 check_ajax_referer( (string) __CLASS__, 'nonce' );
621 746
622 747 $this->post_deactivate_or_cancel();
623 748
@@ -629,10 +754,10 @@
629 754 }
630 755 $this->call_api(
631 756 array(
632 757 'type' => 'deactivate',
633 - 'id' => $_POST['id'],
634 - 'comment' => isset( $_POST['msg'] ) ? $_POST['msg'] : '',
758 + 'id' => sanitize_key( $_POST['id'] ),
759 + 'comment' => isset( $_POST['msg'] ) ? sanitize_textarea_field( $_POST['msg'] ) : '',
635 760 )
636 761 );
637 762 wp_send_json( [] );
638 763
@@ -641,16 +766,16 @@
641 766 /**
642 767 * Called when the deactivate/cancel button is clicked.
643 768 */
644 769 private function post_deactivate_or_cancel() {
645 - if ( ! isset( $_POST['type'] ) || ! isset( $_POST['key'] ) ) {
770 + if ( ! isset( $_POST['type'] ) || ! isset( $_POST['key'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing, Nonce already present in caller function.
646 771 return;
647 772 }
648 - if ( 'theme' !== $_POST['type'] ) {
773 + if ( 'theme' !== $_POST['type'] ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing, Nonce already present in caller function.
649 774 return;
650 775 }
651 776
652 - set_transient( 'ti_sdk_pause_' . $_POST['key'], true, self::PAUSE_DEACTIVATE_WINDOW_DAYS * DAY_IN_SECONDS );
777 + set_transient( 'ti_sdk_pause_' . sanitize_text_field( $_POST['key'] ), true, self::PAUSE_DEACTIVATE_WINDOW_DAYS * DAY_IN_SECONDS );//phpcs:ignore WordPress.Security.NonceVerification.Missing, Nonce already present in caller function.
653 778
654 779 }
655 780
656 781 /**
@@ -660,12 +785,14 @@
660 785 *
661 786 * @return bool Is the request succesfull?
662 787 */
663 788 protected function call_api( $attributes ) {
664 - $slug = $this->product->get_slug();
665 - $version = $this->product->get_version();
666 - $attributes['slug'] = $slug;
667 - $attributes['version'] = $version;
789 + $slug = $this->product->get_slug();
790 + $version = $this->product->get_version();
791 + $attributes['slug'] = $slug;
792 + $attributes['version'] = $version;
793 + $attributes['url'] = get_site_url();
794 + $attributes['active_time'] = ( time() - $this->product->get_install_time() );
668 795
669 796 $response = wp_remote_post(
670 797 self::FEEDBACK_ENDPOINT,
671 798 array(
@@ -718,8 +845,13 @@
718 845 *
719 846 * @return Uninstall_Feedback Current module instance.
720 847 */
721 848 public function load( $product ) {
849 +
850 + if ( apply_filters( $product->get_key() . '_hide_uninstall_feedback', false ) ) {
851 + return;
852 + }
853 +
722 854 $this->product = $product;
723 855 add_action( 'admin_head', array( $this, 'load_resources' ) );
724 856 add_action( 'wp_ajax_' . $this->product->get_key() . '_uninstall_feedback', array( $this, 'post_deactivate' ) );
725 857