PluginProbe
Media Cloud Sync / 1.3.0
Media Cloud Sync v1.3.0
1.4.0 1.3.12 1.3.11 1.3.10 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.2.0 1.2.10 1.2.11 1.2.12 1.2.13 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3.0 All 34 releases
media-cloud-sync / includes / admin.php

admin.php in Media Cloud Sync 1.3.0, at includes/admin.php

441 lines 28.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Dudlewebs\WPMCS;
3
4 defined('ABSPATH') || exit;
5
6 use WP_Site;
7 class Admin {
8 private static $instance = null;
9 private $assets_url;
10 private $version;
11 private $token;
12 private $script_suffix;
13
14 protected $hook_suffix = [];
15 /**
16 * Admin constructor.
17 * @since 1.0.0
18 */
19 public function __construct() {
20 $this->assets_url = WPMCS_ASSETS_URL;
21 $this->version = WPMCS_VERSION;
22 $this->token = WPMCS_TOKEN;
23 $this->script_suffix = defined('SCRIPT_DEBUG') && SCRIPT_DEBUG ? '' : '.min';
24
25 $plugin = plugin_basename(WPMCS_FILE);
26
27 // Create file directory on action do
28 add_action( $this->token.'_create_plugin_dir', [ $this, 'create_plugin_dir' ] );
29
30 // add action links to link to link list display on the plugins page.
31 add_filter("plugin_action_links_$plugin", [$this, 'plugin_action_links']);
32
33 // add our custom CSS classes to <body>
34 add_filter( 'admin_body_class', [ $this, 'admin_body_class' ] );
35 // Admin Init
36 add_action('admin_init', [$this, 'adminInit']);
37
38 add_action('admin_menu', [$this, 'add_menu'], 10);
39
40 add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_scripts'], 10, 1);
41 add_action('admin_enqueue_scripts', [$this, 'admin_enqueue_styles'], 10, 1);
42 // Load media scripts
43 add_action( 'load-upload.php', [ $this, 'load_media_assets' ], 11 );
44
45 // Plugin Deactivation Survey
46 add_action('admin_footer', array($this, 'wpmcs_deactivation_form'));
47
48 if (is_multisite()) {
49 // Register multisite site creation hooks
50 add_action('wp_initialize_site', [$this, 'create_multisite_table'], 10, 1);
51 add_action('wpmu_new_blog', [$this, 'create_multisite_table'], 10, 1);
52 }
53 }
54
55 /**
56 * Method that is used on plugin initialization time
57 * @since 1.0.0
58 */
59 public function adminInit() {
60 if (version_compare(get_option( $this->token.'_db_version' ), WPMCS_DB_VERSION, '!=') ) {
61 Db::instance()->do_database_upgrade();
62 }
63
64 if (get_option($this->token.'_do_activation_redirect', false) && !Utils::get_service()) {
65 delete_option($this->token.'_do_activation_redirect');
66 wp_redirect(admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure'));
67 } else {
68 delete_option($this->token.'_do_activation_redirect');
69 }
70 }
71
72 /**
73 * Installation. Runs on activation.
74 *
75 * @access public
76 * @return void
77 * @since 1.0.0
78 */
79 public function install($network_wide = false) {
80 Db::handle_tables($network_wide);
81
82 // Redirection on activation
83 add_option($this->token.'_do_activation_redirect', true);
84
85 //Protect directories
86 $this->_protect_upload_dir();
87 }
88
89 /**
90 * Create plugin specific upload directory
91 * @since 1.0.0
92 */
93 public function create_plugin_dir() {
94 //Protect directories
95 $this->_protect_upload_dir();
96 }
97
98 /**
99 * Protect Directory from external access.
100 *
101 * @access private
102 * @return void
103 * @since 1.3.0
104 * @see \Dudlewebs\WPMCS\Admin::_protect_upload_dir
105 */
106 private function _protect_upload_dir(){
107 $upload_dir = wp_upload_dir();
108
109 $upload_base = $upload_dir['basedir'] . '/' . Schema::getConstant('UPLOADS');
110
111 $files = array(
112 array(
113 'base' => $upload_base,
114 'file' => '.htaccess',
115 'content' => "Options -Indexes\nDeny from all"
116 ),
117 array(
118 'base' => $upload_base,
119 'file' => 'index.php',
120 'content' => "<?php\n// Silence is golden."
121 )
122 );
123
124 foreach ($files as $file) {
125 if ((wp_mkdir_p($file['base'])) && (!file_exists(trailingslashit($file['base']) . $file['file'])) // If file not exist
126 ) {
127 if ($file_handle = @fopen(trailingslashit($file['base']) . $file['file'], 'w')) {
128 fwrite($file_handle, $file['content']);
129 fclose($file_handle);
130 }
131 }
132 }
133 }
134
135 /**
136 * Deactivation hook
137 */
138 public function deactivation(){
139 }
140
141
142 /**
143 * Handle multisite site creation.
144 */
145 public function create_multisite_table($site) {
146 if (is_numeric($site)) {
147 $site_id = (int) $site;
148 } elseif ($site instanceof \WP_Site) {
149 $site_id = $site->blog_id;
150 } else {
151 return; // Invalid input
152 }
153
154 switch_to_blog($site_id);
155 Db::instance()->create_table();
156 restore_current_blog();
157 }
158
159 /**
160 * Load admin Javascript.
161 * @access public
162 * @return void
163 * @since 1.0.0
164 */
165 public function admin_enqueue_scripts($hook = '') {
166 if (!isset($this->hook_suffix) || empty($this->hook_suffix)) {
167 return;
168 }
169
170 $screen = get_current_screen();
171
172 // deactivate form js
173 if ($screen->id == 'plugins') {
174 wp_enqueue_script($this->token . '-deactivate-form', esc_url($this->assets_url) . 'js/deactivate.js', array('jquery'), $this->version, true);
175 }
176
177
178 if (in_array($screen->id, $this->hook_suffix, true)) {
179 // Enqueue WordPress media scripts.
180 if (!did_action('wp_enqueue_media')) {
181 wp_enqueue_media();
182 }
183
184 // Enqueue custom backend script.
185 wp_enqueue_script($this->token . '-backend', esc_url($this->assets_url) . 'js/backend.js', array('wp-i18n'), $this->version, true);
186
187 // Localize a script.
188 wp_localize_script(
189 $this->token . '-backend',
190 $this->token . '_object',
191 array(
192 'api_nonce' => wp_create_nonce('wp_rest'),
193 'root' => rest_url($this->token . '/v1/'),
194 'assets_url' => $this->assets_url,
195 'admin_url' => admin_url(),
196 )
197 );
198 }
199 }
200
201
202
203 /**
204 * Load admin CSS.
205 * @access public
206 * @return void
207 * @since 1.0.0
208 */
209 public function admin_enqueue_styles($hook = '') {
210 if ( ! isset($this->hook_suffix) || empty($this->hook_suffix)) {
211 return;
212 }
213 $screen = get_current_screen();
214 if (in_array($screen->id, $this->hook_suffix)) {
215 wp_register_style($this->token.'-backend',
216 esc_url($this->assets_url).'css/backend.css?nocache='.rand(0, 10000), array(), $this->version);
217 wp_enqueue_style($this->token.'-backend');
218 }
219
220 if ($screen->id == 'plugins') {
221 wp_enqueue_style($this->token . '-deactivate-form', esc_url($this->assets_url) . 'css/deactivate.css', array(), $this->version);
222 }
223 }
224
225 /**
226 * Show action links on the plugin screen.
227 *
228 * @param mixed $links Plugin Action links.
229 *
230 * @return array
231 */
232 public function plugin_action_links($links){
233 $action_links = array(
234 'getstarted' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui#/configure') . '">' . esc_html__('Get Started', 'media-cloud-sync') . '</a>',
235 'settings' => '<a href="' . admin_url('admin.php?page=' . $this->token . '-admin-ui/') . '">' . esc_html__('Settings', 'media-cloud-sync') . '</a>',
236 );
237
238 return array_merge($action_links, $links);
239 }
240
241
242
243
244 /**
245 * Add Admin Menu
246 */
247 public function add_menu() {
248 $this->hook_suffix[] = add_menu_page(
249 esc_html__('Media Cloud Sync', 'media-cloud-sync'),
250 esc_html__('Media Cloud Sync', 'media-cloud-sync'),
251 'manage_options',
252 $this->token.'-admin-ui',
253 array($this, 'adminUi'),
254 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI1MCIgaGVpZ2h0PSI1MCIgdmlld0JveD0iMCAwIDUwIDUwIiBmaWxsPSJub25lIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzEwNDRfNzQ4KSI+CjxwYXRoIGQ9Ik0xNC4yNDg0IDIxLjQyNDdDMTQuNjcxMiAxOC44Nzc2IDE1Ljk4NDMgMTYuNTYzMiAxNy45NTM4IDE0Ljg5MzZDMTkuOTIzNCAxMy4yMjQgMjIuNDIxNiAxMi4zMDc2IDI1LjAwMzUgMTIuMzA3NkMyNy41ODU1IDEyLjMwNzYgMzAuMDgzNyAxMy4yMjQgMzIuMDUzMyAxNC44OTM2QzM0LjAyMjggMTYuNTYzMiAzNS4zMzU5IDE4Ljg3NzYgMzUuNzU4NyAyMS40MjQ3QzM3Ljg1MDMgMjEuNjIyNiAzOS43ODU0IDIyLjYxOCA0MS4xNjI3IDI0LjIwNDZDNDIuNTM5OSAyNS43OTEyIDQzLjI1MzQgMjcuODQ3MSA0My4xNTUzIDI5Ljk0NTdDNDMuMDU3MSAzMi4wNDQzIDQyLjE1NDggMzQuMDI0NiA0MC42MzU1IDM1LjQ3NTdDMzkuMTE2MiAzNi45MjY4IDM3LjA5NjYgMzcuNzM3MyAzNC45OTU3IDM3LjczOTFIMTUuMDExNEMxMi45MTA1IDM3LjczNzMgMTAuODkwOSAzNi45MjY4IDkuMzcxNTkgMzUuNDc1N0M3Ljg1MjMxIDM0LjAyNDYgNi45NDk5OSAzMi4wNDQzIDYuODUxODMgMjkuOTQ1N0M2Ljc1MzY4IDI3Ljg0NzEgNy40NjcyMiAyNS43OTEyIDguODQ0NDMgMjQuMjA0NkMxMC4yMjE2IDIyLjYxOCAxMi4xNTY4IDIxLjYyMjYgMTQuMjQ4NCAyMS40MjQ3WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNMjMuMTg2NyAyOS41NjRDMjMuMTg2NyAzMC42Mzc3IDIyLjk3NTIgMzEuNzAwNyAyMi41NjQ0IDMyLjY5MjZDMjIuMTUzNSAzMy42ODQ1IDIxLjU1MTMgMzQuNTg1OCAyMC43OTIyIDM1LjM0NDlDMjAuMDMzIDM2LjEwNDEgMTkuMTMxOCAzNi43MDYzIDE4LjEzOTkgMzcuMTE3MUMxNy4xNDggMzcuNTI4IDE2LjA4NDkgMzcuNzM5NCAxNS4wMTEzIDM3LjczOTRDMTMuOTM3NyAzNy43Mzk0IDEyLjg3NDYgMzcuNTI4IDExLjg4MjcgMzcuMTE3MUMxMC44OTA4IDM2LjcwNjMgOS45ODk2IDM2LjEwNDEgOS4yMzA0NSAzNS4zNDQ5QzguNDcxMjkgMzQuNTg1OCA3Ljg2OTEgMzMuNjg0NSA3LjQ1ODI1IDMyLjY5MjZDNy4wNDc0IDMxLjcwMDcgNi44MzU5NCAzMC42Mzc3IDYuODM1OTQgMjkuNTY0QzYuODM1OTQgMjcuMzk1OCA3LjY5NzI3IDI1LjMxNjQgOS4yMzA0NSAyMy43ODMyQzEwLjc2MzYgMjIuMjUgMTIuODQzMSAyMS4zODg3IDE1LjAxMTMgMjEuMzg4N0MxNy4xNzk2IDIxLjM4ODcgMTkuMjU5IDIyLjI1IDIwLjc5MjIgMjMuNzgzMkMyMi4zMjUzIDI1LjMxNjQgMjMuMTg2NyAyNy4zOTU4IDIzLjE4NjcgMjkuNTY0WiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzEwNDRfNzQ4KSIgZmlsbC1vcGFjaXR5PSIwLjMiLz4KPHBhdGggZD0iTTI1LjAwMzQgMzQuMTA1N0MyNy4wODMyIDM0LjEwNTUgMjkuMTE5NSAzMy41MTAzIDMwLjg3MiAzMi4zOTA0QzMyLjYyNDUgMzEuMjcwNSAzNC4wMjAxIDI5LjY3MjYgMzQuODk0IDI3Ljc4NTRDMzUuNzY3OCAyNS44OTgxIDM2LjA4MzYgMjMuODAwMiAzNS44MDM5IDIxLjczOTNDMzUuNTI0MiAxOS42Nzg1IDM0LjY2MDggMTcuNzQwNiAzMy4zMTU2IDE2LjE1NDVDMzEuOTcwMyAxNC41Njg0IDMwLjE5OTQgMTMuNDAwMiAyOC4yMTE4IDEyLjc4NzlDMjYuMjI0MiAxMi4xNzU1IDI0LjEwMyAxMi4xNDQ2IDIyLjA5ODMgMTIuNjk4NkMyMC4wOTM3IDEzLjI1MjcgMTguMjg5NSAxNC4zNjg3IDE2Ljg5ODUgMTUuOTE0OUMxNS41MDc2IDE3LjQ2MTEgMTQuNTg4IDE5LjM3MjkgMTQuMjQ4MyAyMS40MjQ4QzE0LjQ5OSAyMS40MDA2IDE0Ljc1MzMgMjEuMzg4NCAxNS4wMTEzIDIxLjM4ODRDMTYuNDUxNyAyMS4zODgyIDE3Ljg2NjYgMjEuNzY4NSAxOS4xMTI3IDIyLjQ5MDhDMjAuMzU4OCAyMy4yMTMyIDIxLjM5MiAyNC4yNTE5IDIyLjEwNzcgMjUuNTAxOUMyMi44MjMzIDI2Ljc1MiAyMy4xOTYgMjguMTY4OCAyMy4xODggMjkuNjA5MkMyMy4xOCAzMS4wNDk1IDIyLjc5MTYgMzIuNDYyMiAyMi4wNjIxIDMzLjcwNDJDMjMuMDE5NyAzMy45NzE1IDI0LjAwOTMgMzQuMTA2NiAyNS4wMDM0IDM0LjEwNTdaIiBmaWxsPSJ1cmwoI3BhaW50Ml9saW5lYXJfMTA0NF83NDgpIiBmaWxsLW9wYWNpdHk9IjAuMyIvPgo8cGF0aCBkPSJNMjUuMDAzNCAzNC4xMDU3QzI3LjA4MzIgMzQuMTA1NSAyOS4xMTk1IDMzLjUxMDMgMzAuODcyIDMyLjM5MDRDMzIuNjI0NSAzMS4yNzA1IDM0LjAyMDEgMjkuNjcyNiAzNC44OTQgMjcuNzg1NEMzNS43Njc4IDI1Ljg5ODEgMzYuMDgzNiAyMy44MDAyIDM1LjgwMzkgMjEuNzM5M0MzNS41MjQyIDE5LjY3ODUgMzQuNjYwOCAxNy43NDA2IDMzLjMxNTYgMTYuMTU0NUMzMS45NzAzIDE0LjU2ODQgMzAuMTk5NCAxMy40MDAyIDI4LjIxMTggMTIuNzg3OUMyNi4yMjQyIDEyLjE3NTUgMjQuMTAzIDEyLjE0NDYgMjIuMDk4MyAxMi42OTg2QzIwLjA5MzcgMTMuMjUyNyAxOC4yODk1IDE0LjM2ODcgMTYuODk4NSAxNS45MTQ5QzE1LjUwNzYgMTcuNDYxMSAxNC41ODggMTkuMzcyOSAxNC4yNDgzIDIxLjQyNDhDMTQuNDk5IDIxLjQwMDYgMTQuNzUzMyAyMS4zODg0IDE1LjAxMTMgMjEuMzg4NEMxNi40NTE3IDIxLjM4ODIgMTcuODY2NiAyMS43Njg1IDE5LjExMjcgMjIuNDkwOEMyMC4zNTg4IDIzLjIxMzIgMjEuMzkyIDI0LjI1MTkgMjIuMTA3NyAyNS41MDE5QzIyLjgyMzMgMjYuNzUyIDIzLjE5NiAyOC4xNjg4IDIzLjE4OCAyOS42MDkyQzIzLjE4IDMxLjA0OTUgMjIuNzkxNiAzMi40NjIyIDIyLjA2MjEgMzMuNzA0MkMyMy4wMTk3IDMzLjk3MTUgMjQuMDA5MyAzNC4xMDY2IDI1LjAwMzQgMzQuMTA1N1oiIGZpbGw9InVybCgjcGFpbnQzX3JhZGlhbF8xMDQ0Xzc0OCkiLz4KPHBhdGggZD0iTTE0LjI0ODQgMjEuNDI0N0MxNC42NzEyIDE4Ljg3NzYgMTUuOTg0MyAxNi41NjMyIDE3Ljk1MzggMTQuODkzNkMxOS45MjM0IDEzLjIyNCAyMi40MjE2IDEyLjMwNzYgMjUuMDAzNSAxMi4zMDc2QzI3LjU4NTUgMTIuMzA3NiAzMC4wODM3IDEzLjIyNCAzMi4wNTMzIDE0Ljg5MzZDMzQuMDIyOCAxNi41NjMyIDM1LjMzNTkgMTguODc3NiAzNS43NTg3IDIxLjQyNDdDMzcuODUwMyAyMS42MjI2IDM5Ljc4NTQgMjIuNjE4IDQxLjE2MjcgMjQuMjA0NkM0Mi41Mzk5IDI1Ljc5MTIgNDMuMjUzNCAyNy44NDcxIDQzLjE1NTMgMjkuOTQ1N0M0My4wNTcxIDMyLjA0NDMgNDIuMTU0OCAzNC4wMjQ2IDQwLjYzNTUgMzUuNDc1N0MzOS4xMTYyIDM2LjkyNjggMzcuMDk2NiAzNy43MzczIDM0Ljk5NTcgMzcuNzM5MUgxNS4wMTE0QzEyLjkxMDUgMzcuNzM3MyAxMC44OTA5IDM2LjkyNjggOS4zNzE1OSAzNS40NzU3QzcuODUyMzEgMzQuMDI0NiA2Ljk0OTk5IDMyLjA0NDMgNi44NTE4MyAyOS45NDU3QzYuNzUzNjggMjcuODQ3MSA3LjQ2NzIyIDI1Ljc5MTIgOC44NDQ0MyAyNC4yMDQ2QzEwLjIyMTYgMjIuNjE4IDEyLjE1NjggMjEuNjIyNiAxNC4yNDg0IDIxLjQyNDdaIiBmaWxsPSJ1cmwoI3BhaW50NF9yYWRpYWxfMTA0NF83NDgpIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZyBmaWx0ZXI9InVybCgjZmlsdGVyMF9kXzEwNDRfNzQ4KSI+CjxyZWN0IHg9IjM1LjkzNzUiIHk9IjQuNjg3NSIgd2lkdGg9IjkuMzc1IiBoZWlnaHQ9IjkuMzc1IiByeD0iNC42ODc1IiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxwYXRoIGQ9Ik00Mi41ODA5IDEwLjcyQzQyLjM2MTYgMTEuMzY3NSA0MS45Nzg3IDExLjYwODYgNDEuNzc2OCAxMS43MTE3QzQxLjk2MTMgMTEuNzE2MiA0Mi4zMTk4IDExLjc2NTEgNDIuNzI3MSAxMS41MjQyQzQzLjMxMTkgMTEuMTM3OCA0My40MjQ0IDEwLjY0MzYgNDMuNDM3MiAxMC41MTEyQzQzLjQ0NzcgMTAuNDAzNiA0My40MzcyIDEwLjI4MDcgNDMuNDM3MiA5Ljg2MzcxQzQzLjQwNTkgOS43OTQyMSA0My4zNDMyIDkuNTcxMzEgNDMuMDA5IDkuNTcxMzFDNDIuNzQxNyA5LjU3MTMxIDQyLjYxMjIgOS43OTA2MSA0Mi42MTIyIDkuOTA1NDhDNDIuNjEyMiAxMC4xOTc5IDQyLjYyMjcgMTAuNDI3NiA0Mi41ODA5IDEwLjcyWiIgZmlsbD0idXJsKCNwYWludDVfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNNDEuMjIzMyAxMC41ODQzQzQxLjE4MTUgMTEuMTAyMyA0MC43NjczIDExLjU1MiA0MC41NjU0IDExLjcxMjFDNDAuNzQ5OSAxMS43MTkxIDQxLjE5ODIgMTEuNjcwNCA0MS41MTU3IDExLjQxOTdDNDEuOTEyNSAxMS4xMDY0IDQyLjA2NjggMTAuNjk1OSA0Mi4wNzk2IDEwLjQ5MDNDNDIuMDkwMSAxMC4zMjMyIDQyLjA5MDEgOS4yNzg5IDQyLjA5MDEgOC42MzE0M0M0Mi4wNTg3IDguNTIzNTIgNDEuOTI5MiA4LjMwNzY5IDQxLjY2MTkgOC4zMDc2OUM0MS4zOTQ1IDguMzA3NjkgNDEuMjc5IDguNTIzNTIgNDEuMjU0NiA4LjYzMTQzQzQxLjI2MTYgOS4wNjY1NiA0MS4yNjUxIDEwLjA2NjMgNDEuMjIzMyAxMC41ODQzWiIgZmlsbD0idXJsKCNwYWludDZfbGluZWFyXzEwNDRfNzQ4KSIvPgo8cGF0aCBkPSJNMzkuNzcxNyAxMC4zOTYzVjcuNDkzMTNDMzkuNzcxNyA3LjMyNjA0IDM5Ljg1OTQgNy4wMDAyMiA0MC4yMTAzIDcuMDMzNjRDNDAuNTYxMiA3LjA2NzA1IDQwLjYwMzIgNy4zMjYwNCA0MC42MDcxIDcuNDkzMTNDNDAuNjIxMSA4LjA4ODM5IDQwLjY0MDYgOS41MDIzOCA0MC42MDcxIDEwLjM5NjNDNDAuNDgxOCAxMS4zMDQ5IDM5Ljc1MDggMTEuNjIxNiAzOS4zNTQgMTEuNjkxMkMzOC43Mzc4IDExLjc5OTMgMzcuODcyMiAxMS40MTk3IDM3LjcyNDggMTAuNTczOEMzNy40ODQ3IDkuMTk1MzUgMzguNzc5NiA4Ljc0NjMgMzkuMDcyIDguNzc3NjNDMzkuMzAxOCA4Ljc2ODc5IDM5LjM1MDUgOC44OTI1IDM5LjM1NCA4Ljk1NTE2VjkuNjQ0NDFDMzguOTc4IDkuNTM5OTggMzguNDAzNyA5LjgyMTk0IDM4LjU0OTkgMTAuMzk2M0MzOC43Nzk2IDExLjEwNjQgMzkuNjI1NSAxMC45MzkzIDM5Ljc3MTcgMTAuMzk2M1oiIGZpbGw9InVybCgjcGFpbnQ3X2xpbmVhcl8xMDQ0Xzc0OCkiLz4KPGNpcmNsZSBjeD0iMzQuOTYwOSIgY3k9IjMzLjM5ODQiIHI9IjYuMjk2ODgiIHN0cm9rZT0iIzMxNjRFNCIgc3Ryb2tlLXdpZHRoPSI0Ii8+CjxwYXRoIGQ9Ik0zMy44MTQzIDMwLjU2NTJMMzIuNzE1IDMxLjY1MDVDMzIuNjY4MyAzMS42OTY2IDMyLjYzNjUgMzEuNzU1MyAzMi42MjM2IDMxLjgxOTNDMzIuNjEwNyAzMS44ODMyIDMyLjYxNzMgMzEuOTQ5NSAzMi42NDI2IDMyLjAwOThMMzIuNjUzOSAzMi4wMzM2QzMyLjY4MTkgMzIuMDg3NyAzMi43MjQ1IDMyLjEzMyAzMi43NzY5IDMyLjE2NDdDMzIuODI5MyAzMi4xOTYzIDMyLjg4OTYgMzIuMjEzMSAzMi45NTExIDMyLjIxMzFIMzMuMzgyN0wzMy4zODI1IDM0LjYzMTZDMzMuMzgyNSAzNC43MTkgMzMuNDE3NyAzNC44MDI5IDMzLjQ4MDMgMzQuODY0N0MzMy41NDI5IDM0LjkyNjUgMzMuNjI3OCAzNC45NjEyIDMzLjcxNjQgMzQuOTYxMkgzNC4zODRMMzQuNDA5MSAzNC45NjA0QzM0LjQ5MyAzNC45NTQxIDM0LjU3MTUgMzQuOTE2OCAzNC42Mjg4IDM0Ljg1NThDMzQuNjg2MSAzNC43OTQ5IDM0LjcxNzkgMzQuNzE0OCAzNC43MTc5IDM0LjYzMTZWMzIuMjEzMUgzNS4xNDk3QzM1LjIxNTcgMzIuMjEzMSAzNS4yODAyIDMyLjE5MzggMzUuMzM1MSAzMi4xNTc1QzM1LjM5IDMyLjEyMTMgMzUuNDMyOCAzMi4wNjk5IDM1LjQ1OCAzMi4wMDk2QzM1LjQ4MzMgMzEuOTQ5NCAzNS40ODk5IDMxLjg4MzIgMzUuNDc3IDMxLjgxOTNDMzUuNDY0MSAzMS43NTUzIDM1LjQzMjQgMzEuNjk2NiAzNS4zODU3IDMxLjY1MDVMMzQuMjg2NCAzMC41NjUyQzM0LjIyMzggMzAuNTAzNSAzNC4xMzg5IDMwLjQ2ODggMzQuMDUwNCAzMC40Njg4QzMzLjk2MTggMzAuNDY4OCAzMy44NzY5IDMwLjUwMzUgMzMuODE0MyAzMC41NjUyWiIgZmlsbD0iIzMxNjRFNCIvPgo8cGF0aCBkPSJNMzYuNDM3OSAzNi4zNzMyTDM3LjMzNjkgMzUuNDc0M0MzNy4zNzUxIDM1LjQzNjEgMzcuNDAxMSAzNS4zODc1IDM3LjQxMTYgMzUuMzM0NUMzNy40MjIyIDM1LjI4MTUgMzcuNDE2OCAzNS4yMjY2IDM3LjM5NjEgMzUuMTc2N0wzNy4zODY4IDM1LjE1N0MzNy4zNjM5IDM1LjExMjIgMzcuMzI5MSAzNS4wNzQ3IDM3LjI4NjMgMzUuMDQ4NEMzNy4yNDM0IDM1LjAyMjIgMzcuMTk0MSAzNS4wMDgzIDM3LjE0MzkgMzUuMDA4M0gzNi43OTA5TDM2Ljc5MDkgMzMuNTE4NkMzNi43OTA5IDMzLjQ0NjIgMzYuNzYyMSAzMy4zNzY4IDM2LjcxMSAzMy4zMjU2QzM2LjY1OTggMzMuMjc0NCAzNi41OTAzIDMzLjI0NTcgMzYuNTE3OSAzMy4yNDU3SDM1Ljk3MkwzNS45NTE1IDMzLjI0NjNDMzUuODgyOCAzMy4yNTE1IDM1LjgxODYgMzMuMjgyNCAzNS43NzE4IDMzLjMzMjlDMzUuNzI1IDMzLjM4MzQgMzUuNjk5IDMzLjQ0OTggMzUuNjk5IDMzLjUxODZMMzUuNjk5MSAzNS4wMDgzSDM1LjM0NkMzNS4yOTIxIDM1LjAwODMgMzUuMjM5MyAzNS4wMjQ0IDM1LjE5NDQgMzUuMDU0M0MzNS4xNDk1IDM1LjA4NDMgMzUuMTE0NiAzNS4xMjcgMzUuMDkzOSAzNS4xNzY4QzM1LjA3MzIgMzUuMjI2NyAzNS4wNjc4IDM1LjI4MTYgMzUuMDc4NCAzNS4zMzQ1QzM1LjA4ODkgMzUuMzg3NSAzNS4xMTQ5IDM1LjQzNjEgMzUuMTUzMSAzNS40NzQzTDM2LjA1MiAzNi4zNzMyQzM2LjEwMzIgMzYuNDI0NCAzNi4xNzI2IDM2LjQ1MzEgMzYuMjQ1IDM2LjQ1MzFDMzYuMzE3MyAzNi40NTMxIDM2LjM4NjggMzYuNDI0NCAzNi40Mzc5IDM2LjM3MzJaIiBmaWxsPSIjMzE2NEU0Ii8+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF8xMDQ0Xzc0OCIgeD0iMjUuOTM3NSIgeT0iLTUuMzEyNSIgd2lkdGg9IjI5LjM3NSIgaGVpZ2h0PSIyOS4zNzUiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+CjxmZU1vcnBob2xvZ3kgcmFkaXVzPSIyIiBvcGVyYXRvcj0iZGlsYXRlIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93XzEwNDRfNzQ4Ii8+CjxmZU9mZnNldC8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjQiLz4KPGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0ib3V0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDEgMCAwIDAgMCAxIDAgMCAwIDAgMSAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3dfMTA0NF83NDgiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbj0iU291cmNlR3JhcGhpYyIgaW4yPSJlZmZlY3QxX2Ryb3BTaGFkb3dfMTA0NF83NDgiIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8xMDQ0Xzc0OCIgeDE9IjguMTMzMiIgeTE9IjE3LjA3MzYiIHgyPSIyNC40MTMxIiB5Mj0iNDEuMjM2NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwIi8+CjxzdG9wIG9mZnNldD0iMC42OSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzEwNDRfNzQ4IiB4MT0iNi44MzU5NCIgeTE9IjI0LjE5MDEiIHgyPSIxNy44NTgyIiB5Mj0iMzMuOTQ2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IndoaXRlIi8+CjxzdG9wIG9mZnNldD0iMC43ODUiIHN0b3AtY29sb3I9IndoaXRlIiBzdG9wLW9wYWNpdHk9IjAuOCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50Ml9saW5lYXJfMTA0NF83NDgiIHgxPSIxOC4wMDE3IiB5MT0iMTMuNTMxIiB4Mj0iMjAuODk1OCIgeTI9IjI4LjU1NzMiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agb2Zmc2V0PSIwLjIzNSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQzX3JhZGlhbF8xMDQ0Xzc0OCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgxNS4wOTQ5IDMwLjE1NDMpIHJvdGF0ZSgtMjIuOTg1Nikgc2NhbGUoMTMuMjU5MiAxMS44NzY4KSI+CjxzdG9wIG9mZnNldD0iMC4zOSIgc3RvcC1jb2xvcj0id2hpdGUiLz4KPHN0b3Agb2Zmc2V0PSIwLjkzIiBzdG9wLWNvbG9yPSJ3aGl0ZSIgc3RvcC1vcGFjaXR5PSIwLjQyIi8+CjwvcmFkaWFsR3JhZGllbnQ+CjxyYWRpYWxHcmFkaWVudCBpZD0icGFpbnQ0X3JhZGlhbF8xMDQ0Xzc0OCIgY3g9IjAiIGN5PSIwIiByPSIxIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgZ3JhZGllbnRUcmFuc2Zvcm09InRyYW5zbGF0ZSgyMy40OTAyIDEwLjcxNSkgcm90YXRlKDYzLjU3NTEpIHNjYWxlKDMxLjQ2ODEgMjI3LjE3NSkiPgo8c3RvcCBvZmZzZXQ9IjAuNDQ1IiBzdG9wLWNvbG9yPSIjMThCQUE3IiBzdG9wLW9wYWNpdHk9IjAiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMThCQUE3Ii8+CjwvcmFkaWFsR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQ1X2xpbmVhcl8xMDQ0Xzc0OCIgeDE9IjM3LjY5NTMiIHkxPSI4Ljk5NzM1IiB4Mj0iNDMuNDQxOSIgeTI9IjguOTk3MzQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzM0QkI3QSIvPgo8c3RvcCBvZmZzZXQ9IjAuMjU1MjA4IiBzdG9wLWNvbG9yPSIjMThCQUE3Ii8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzMxNjRFNCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50Nl9saW5lYXJfMTA0NF83NDgiIHgxPSIzNy42OTUzIiB5MT0iOC45OTczNSIgeDI9IjQzLjQ0MTkiIHkyPSI4Ljk5NzM0IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMzNEJCN0EiLz4KPHN0b3Agb2Zmc2V0PSIwLjI1NTIwOCIgc3RvcC1jb2xvcj0iIzE4QkFBNyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMzMTY0RTQiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDdfbGluZWFyXzEwNDRfNzQ4IiB4MT0iMzcuNjk1MyIgeTE9IjguOTk3MzUiIHgyPSI0My40NDE5IiB5Mj0iOC45OTczNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMzRCQjdBIi8+CjxzdG9wIG9mZnNldD0iMC4yNTUyMDgiIHN0b3AtY29sb3I9IiMxOEJBQTciLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMzE2NEU0Ii8+CjwvbGluZWFyR3JhZGllbnQ+CjxjbGlwUGF0aCBpZD0iY2xpcDBfMTA0NF83NDgiPgo8cmVjdCB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+',
255 999
256 );
257
258 $this->hook_suffix[] = add_submenu_page(
259 $this->token . '-admin-ui',
260 esc_html__('Dashboard', 'media-cloud-sync'),
261 esc_html__('Dashboard', 'media-cloud-sync'),
262 'manage_options',
263 $this->token . '-admin-ui' ,
264 array($this, 'adminUi')
265 );
266
267 if(Utils::is_service_enabled()) {
268 $this->hook_suffix[] = add_submenu_page(
269 $this->token . '-admin-ui',
270 esc_html__('Settings', 'media-cloud-sync'),
271 esc_html__('Settings', 'media-cloud-sync'),
272 'manage_options',
273 $this->token . '-admin-ui#/settings' ,
274 array($this, 'adminUi')
275 );
276 } else {
277 $this->hook_suffix[] = add_submenu_page(
278 $this->token . '-admin-ui',
279 esc_html__('Configure', 'media-cloud-sync'),
280 esc_html__('Configure', 'media-cloud-sync'),
281 'manage_options',
282 $this->token . '-admin-ui#/configure' ,
283 array($this, 'adminUi')
284 );
285 }
286 }
287
288 /**
289 * Calling view function for admin page components
290 */
291 public function adminUi() {
292 echo wp_kses_post(sprintf(
293 '<div id="%s_ui_root">
294 <div class="%s_loader">
295 <h1>%s</h1>
296 <p>%s</p>
297 </div>
298 </div>',
299 $this->token,
300 $this->token,
301 esc_html__('Media Cloud Sync By Dudlewebs','media-cloud-sync'),
302 esc_html__('Plugin is loading Please wait for a while..', 'media-cloud-sync')
303 ));
304
305 }
306
307
308 /**
309 * Load the media assets
310 */
311 public function load_media_assets() {
312 /** CSS */
313 wp_enqueue_style($this->token . '-media', esc_url($this->assets_url) . 'css/media.css', array(), $this->version);
314
315 /** JS */
316 wp_enqueue_script(
317 $this->token . '-media',
318 esc_url($this->assets_url) . 'js/media.js',
319 array(
320 'jquery',
321 'media-views',
322 'media-grid',
323 'wp-util'
324 ),
325 $this->version,
326 true
327 );
328
329 // Localize a script.
330 wp_localize_script(
331 $this->token . '-media',
332 $this->token . '_media_object',
333 array(
334 'file_details_nonce' => wp_create_nonce('get_media_provider_details'),
335 'admin_ajax_url' => admin_url('admin-ajax.php'),
336 'strings' => array(
337 'provider' => esc_html__("Provider: ", "media-cloud-sync"),
338 'region' => esc_html__("Region: ", "media-cloud-sync"),
339 'access' => esc_html__("Access: ", "media-cloud-sync"),
340 'access_private' => esc_html__("Private", "media-cloud-sync"),
341 'access_public' => esc_html__("Public", "media-cloud-sync"),
342 )
343 )
344 );
345 }
346
347
348 /**
349 * Deactivation form
350 * @since 1.0.2
351 */
352 public function wpmcs_deactivation_form() {
353 $currentScreen = get_current_screen();
354 $screenID = $currentScreen->id;
355 if ($screenID == 'plugins') {
356 ?>
357 <div id="dw-wpmcs-survey-form-wrap">
358 <div id="dw-wpmcs-survey-form">
359 <h2>We Value Your Feedback</h2>
360 <p>We're sorry to see you go! Please let us know why you are deactivating this plugin. Your feedback is anonymous and will help us improve.</p>
361 <form method="POST">
362 <input name="plugin_name" type="hidden" value="<?= esc_attr($this->token); ?>" required>
363 <input name="website" type="hidden" value="<?= esc_url(get_site_url()); ?>" required>
364 <input name="title" type="hidden" value="<?= esc_attr(get_bloginfo('name')); ?>" required>
365 <input name="version" type="hidden" value="<?= esc_attr($this->version); ?>" required>
366
367 <div class="dw-wpmcs-reason">
368 <label><input type="radio" name="reason" value="I\'m only deactivating temporarily"> I'm only deactivating temporarily</label>
369 <label><input type="radio" name="reason" value="I no longer need the plugin"> I no longer need the plugin</label>
370 <label><input type="radio" name="reason" value="I only needed the plugin for a short period"> I only needed the plugin for a short period</label>
371 <label><input type="radio" name="reason" value="I found a better plugin"> I found a better plugin</label>
372 <label><input type="radio" name="reason" value="Upgrading to PRO version"> Upgrading to PRO version</label>
373 <label><input type="radio" name="reason" value="Plugin doesn\'t meet my requirements"> Plugin doesn't meet my requirements</label>
374 <label><input type="radio" name="reason" value="Plugin broke my site"> Plugin broke my site</label>
375 <label><input type="radio" name="reason" value="Plugin suddenly stopped working"> Plugin suddenly stopped working</label>
376 <label><input type="radio" name="reason" value="I found a bug"> I found a bug</label>
377 <label><input type="radio" name="reason" value="Other"> Other</label>
378 </div>
379
380 <div class="dw-wpmcs-comments" style="display:none;">
381 <textarea name="comments" placeholder="Please specify" rows="3"></textarea>
382 <p>Need help? <a href="https://dudlewebs.com/" target="_blank">Use live chat support</a></p>
383 </div>
384
385 <p id="dw-wpmcs-error" class="dw-wpmcs-error"></p>
386 <div class="dw-wpmcs-actions">
387 <button type="button" class="dw-button dw-skip" id="dw-wpmcs-skip">Skip & Deactivate</button>
388 <button type="button" class="dw-button dw-secondary" id="dw-wpmcs-cancel">Cancel</button>
389 <button type="submit" class="dw-button dw-primary" id="dw-wpmcs-deactivate">Submit & Deactivate</button>
390 </div>
391 </form>
392 </div>
393 </div>
394 <?php }
395 }
396
397
398
399 /**
400 * Add custom classes to the HTML body tag
401 *
402 * @param string $classes
403 *
404 * @return string
405 */
406 public function admin_body_class( $classes ) {
407 if ( ! $classes ) {
408 $classes = array();
409 } else {
410 $classes = explode( ' ', $classes );
411 }
412 $classes[] = $this->token.'_page';
413 /**
414 * Recommended way to target WP 3.8+
415 * http://make.wordpress.org/ui/2013/11/19/targeting-the-new-dashboard-design-in-a-post-mp6-world/
416 *
417 */
418 if ( version_compare( $GLOBALS['wp_version'], '3.8-alpha', '>' ) ) {
419 if ( ! in_array( 'mp6', $classes ) ) {
420 $classes[] = 'mp6';
421 }
422 }
423 return implode( ' ', $classes );
424 }
425
426
427 /**
428 * Ensures only one instance of Class is loaded or can be loaded.
429 *
430 * @return Main Class instance
431 * @since 1.0.0
432 * @static
433 */
434 public static function instance(){
435 if (is_null(self::$instance)) {
436 self::$instance = new self();
437 }
438 return self::$instance;
439 }
440
441 }