PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.5.81
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.5.81
5.5.85 5.5.84 5.5.83 5.5.82 5.5.81 5.5.80 5.5.79 5.5.77 5.5.76 5.5.75 5.5.73 5.5.72 5.5.22 5.5.23 5.5.29 5.5.3 5.5.31 5.5.32 5.5.34 5.5.35 5.5.36 5.5.37 5.5.4 5.5.40 5.5.41 All 161 releases
wp-data-access / WPDataAccess / Dashboard / WPDA_Dashboard.php

WPDA_Dashboard.php in WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards 5.5.81, at WPDataAccess/Dashboard/WPDA_Dashboard.php

2,216 lines 73.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 // phpcs:disable WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing -- verified on page
4 namespace WPDataAccess\Dashboard;
5
6 use WP_Data_Access_Admin;
7 use WPDataAccess\Data_Dictionary\WPDA_Dictionary_Lists;
8 use WPDataAccess\Plugin_Table_Models\WPDA_App_Model;
9 use WPDataAccess\Plugin_Table_Models\WPDA_Design_Table_Model;
10 use WPDataAccess\Plugin_Table_Models\WPDA_Publisher_Model;
11 use WPDataAccess\Plugin_Table_Models\WPDP_Project_Model;
12 use WPDataAccess\Premium\WPDAPRO_Dashboard\WPDAPRO_Dashboard;
13 use WPDataAccess\Premium\WPDAPRO_Dashboard\WPDAPRO_Widget_Project;
14 use WPDataAccess\Premium\WPDAPRO_Data_Forms\WPDAPRO_Data_Forms_Init;
15 use WPDataAccess\Utilities\WPDA_Message_Box;
16 use WPDataAccess\WPDA;
17 use WPDataAccess\Connection\WPDADB;
18 use WPDataProjects\WPDP;
19 use WPDataAccess\Settings\WPDA_Settings_Legacy_Dashboard;
20 /**
21 * Dashboard class
22 */
23 class WPDA_Dashboard {
24 /**
25 * Nonce seed
26 */
27 const DASHBOARD_SAVE = 'WPDA_DASHBOARD_SAVE';
28
29 /**
30 * Nonce seed
31 */
32 const USER_DASHBOARD = 'wpda-user-dashboard-widgets';
33
34 /**
35 * Meta key
36 */
37 const USER_NEW_MESSAGE = 'wpda_new_dashboard_message';
38
39 /**
40 * Available dashboards
41 *
42 * @var array|null
43 */
44 protected $dashboards = null;
45
46 /**
47 * Number of dashboard columns
48 *
49 * @var int
50 */
51 protected $number_of_columns = 2;
52
53 /**
54 * Nonce for adding objects
55 *
56 * @var null
57 */
58 protected $wp_nonce_add = null;
59
60 /**
61 * Nonce for save actions
62 *
63 * @var null
64 */
65 protected $wp_nonce_save = null;
66
67 /**
68 * Current dashboard
69 *
70 * @var WPDAPRO_Dashboard|null
71 */
72 protected $dashboard = null;
73
74 /**
75 * Widgets on current dashboard
76 *
77 * @var array|null
78 */
79 protected $dashboard_widgets = null;
80
81 /**
82 * Dashboard positions of all visible objects
83 *
84 * @var array|null
85 */
86 protected $dashboard_positions = null;
87
88 /**
89 * Shared dashboards
90 *
91 * @var array
92 */
93 protected $shared_dashboards = array();
94
95 /**
96 * Dashboard access
97 *
98 * @var array
99 */
100 protected $shared_access = array();
101
102 /**
103 * Locked dashboards
104 *
105 * @var array
106 */
107 protected $shared_locked = array();
108
109 /**
110 * Locked dashboards
111 *
112 * @var array
113 */
114 protected $locked_dashboards = array();
115
116 /**
117 * Indicates if current user can create dashboards
118 *
119 * @var bool
120 */
121 protected $cannot_create_dashboard = false;
122
123 /**
124 * Available tabs on current dashboard
125 *
126 * @var string[]
127 */
128 protected $tabs = array('Default');
129
130 /**
131 * Current tabs
132 *
133 * @var int|mixed|string|null
134 */
135 protected $tab = 'Default';
136
137 /**
138 * Current tab label
139 *
140 * @var string
141 */
142 protected $tab_name = '';
143
144 /**
145 * Current tab index
146 *
147 * @var false|int|string
148 */
149 protected $tab_index = 0;
150
151 /**
152 * Indicates if default tab show be hidden
153 *
154 * @var bool
155 */
156 protected $hide_default_tab = false;
157
158 /**
159 * Indicates if dashboard is locked
160 *
161 * @var bool
162 */
163 protected $is_locked = false;
164
165 /**
166 * Message
167 *
168 * @var null
169 */
170 protected $message = null;
171
172 /**
173 * Message type
174 *
175 * @var string|null
176 */
177 protected $message_type = null;
178
179 private $option_legacy_tools;
180
181 /**
182 * Constructor
183 *
184 * @param boolean $widget_mode True = allowed to manage dashboards and widgets.
185 */
186 public function __construct( $widget_mode = false ) {
187 if ( $widget_mode ) {
188 // Prepare nonces.
189 $this->wp_nonce_add = wp_create_nonce( WPDA_Widget::WIDGET_ADD . WPDA::get_current_user_login() );
190 $this->wp_nonce_save = wp_create_nonce( static::DASHBOARD_SAVE . WPDA::get_current_user_login() );
191 // Load Data Tables resources.
192 \WPDataAccess\Data_Tables\WPDA_Data_Tables::enqueue_styles_and_script();
193 }
194 // Start with empty array.
195 if ( $widget_mode ) {
196 update_user_meta( WPDA::get_current_user_id(), self::USER_DASHBOARD, array() );
197 }
198 $this->option_legacy_tools = WPDA::get_option( WPDA::OPTION_PLUGIN_LEGACY_TOOLS );
199 }
200
201 /**
202 * Add dashboard
203 *
204 * @param boolean $widget_mode True = user is allowed to manage dashboards.
205 *
206 * @return void
207 */
208 public static function add_dashboard( $widget_mode = false ) {
209 $dashboard = new WPDA_Dashboard($widget_mode);
210 $dashboard->dashboard();
211 }
212
213 /**
214 * Construct plugin dashboard
215 *
216 * @return void
217 */
218 public function dashboard() {
219 wp_enqueue_style( 'wpdataaccess_dashboard' );
220 wp_enqueue_script( 'wpdataaccess_dashboard' );
221 if ( WPDA::current_user_is_admin() ) {
222 $this->dashboard_default();
223 $this->dashboard_mobile();
224 }
225 if ( isset( $_REQUEST['page'] ) ) {
226 switch ( $_REQUEST['page'] ) {
227 case 'wpda_dashboard':
228 $this->toolbar();
229 $this->add_forms();
230 $this->tabs();
231 $this->columns();
232 $this->add_panels();
233 $this->dashboard_js();
234 break;
235 case WP_Data_Access_Admin::PAGE_MAIN:
236 if ( !isset( $_REQUEST['page_action'] ) ) {
237 if ( !isset( $_REQUEST['table_name'] ) ) {
238 $this->toolbar_wpda();
239 } else {
240 if ( !isset( $_REQUEST['action'] ) || 'new' !== $_REQUEST['action'] && 'edit' !== $_REQUEST['action'] ) {
241 $this->toolbar_wpda_table();
242 } else {
243 $this->toolbar_wpda_row();
244 }
245 }
246 } elseif ( 'wpda_backup' === $_REQUEST['page_action'] && (!isset( $_REQUEST['action'] ) || 'remove' === $_REQUEST['action'] || 'update' === $_REQUEST['action'] || 'add' === $_REQUEST['action']) ) {
247 $this->toolbar_backup();
248 } elseif ( 'wpda_import_csv' === $_REQUEST['page_action'] ) {
249 $this->toolbar_import_csv();
250 }
251 break;
252 case WP_Data_Access_Admin::PAGE_APPS:
253 $this->toolbar_apps();
254 break;
255 case WP_Data_Access_Admin::PAGE_QUERY_BUILDER:
256 $this->toolbar_sql();
257 break;
258 case WP_Data_Access_Admin::PAGE_DESIGNER:
259 if ( !isset( $_REQUEST['action'] ) || 'new' !== $_REQUEST['action'] && 'edit' !== $_REQUEST['action'] ) {
260 $this->toolbar_designer();
261 }
262 break;
263 case WP_Data_Access_Admin::PAGE_PUBLISHER:
264 if ( (!isset( $_REQUEST['action'] ) || 'new' !== $_REQUEST['action'] && 'edit' !== $_REQUEST['action'] || isset( $_REQUEST['postaction'] ) && 'list' === $_REQUEST['postaction']) && !(isset( $_REQUEST['page_action'] ) && 'wpda_mngstl' === $_REQUEST['page_action']) ) {
265 $this->toolbar_publisher();
266 }
267 break;
268 case WP_Data_Access_Admin::PAGE_CHARTS:
269 $this->toolbar_charts();
270 break;
271 case WPDP::PAGE_MAIN:
272 if ( !isset( $_REQUEST['action'] ) || 'new' !== $_REQUEST['action'] && 'edit' !== $_REQUEST['action'] ) {
273 $this->toolbar_projects();
274 }
275 break;
276 case WPDP::PAGE_TEMPLATES:
277 if ( !isset( $_REQUEST['action'] ) || 'new' !== $_REQUEST['action'] && 'edit' !== $_REQUEST['action'] ) {
278 $this->toolbar_templates();
279 }
280 break;
281 }
282 }
283 if ( isset( $_GET['page_iaction'] ) ) {
284 // Perform interactive action to auto start user selected feature.
285 ?>
286 <script>
287 jQuery(function() {
288 const iaction = "<?php
289 // phpcs:disable WordPress.Security.ValidatedSanitizedInput.MissingUnslash
290 echo esc_attr( sanitize_text_field( $_GET['page_iaction'] ) );
291 // phpcs:enable WordPress.Security.ValidatedSanitizedInput.MissingUnslash
292 ?>";
293 switch (iaction) {
294 case "create_new_app":
295 var interval = setInterval(
296 function() {
297 if (window.ppActionCreateApp !== undefined) {
298 window.ppActionCreateApp();
299 clearInterval(interval);
300 }
301 }, 100);
302 break;
303 case "wpda_import_sql":
304 var interval = setInterval(
305 function() {
306 if (window.ppActionEnableImport !== undefined) {
307 window.ppActionEnableImport();
308 clearInterval(interval);
309 }
310 }, 100);
311 break;
312 case "manage_databases":
313 jQuery('#wpda_manage_databases').show();
314 jQuery('#local_database').focus();
315 break;
316 }
317 });
318 </script>
319 <?php
320 }
321 }
322
323 /**
324 * Get correct help url for current page
325 *
326 * @return string
327 */
328 protected function get_help_url() {
329 $help_url = 'https://docs.wpdataaccess.com/';
330 if ( isset( $_REQUEST['page'] ) ) {
331 switch ( $_REQUEST['page'] ) {
332 case \WP_Data_Access_Admin::PAGE_MAIN:
333 $help_url = 'https://docs.explorer.wpdataaccess.com/';
334 break;
335 case \WP_Data_Access_Admin::PAGE_APPS:
336 $help_url = 'https://docs.rad.wpdataaccess.com/';
337 break;
338 case \WP_Data_Access_Admin::PAGE_QUERY_BUILDER:
339 $help_url = 'https://docs.sql.wpdataaccess.com/';
340 break;
341 case \WP_Data_Access_Admin::PAGE_DESIGNER:
342 $help_url = 'https://docs.legacy.wpdataaccess.com/docs/data-designer-getting-started/';
343 break;
344 case \WP_Data_Access_Admin::PAGE_PUBLISHER:
345 $help_url = 'https://docs.legacy.wpdataaccess.com/docs/data-tables-getting-started/';
346 break;
347 case \WP_Data_Access_Admin::PAGE_DASHBOARD:
348 $help_url = 'https://docs.legacy.wpdataaccess.com/docs/bi-getting-started/';
349 break;
350 case \WP_Data_Access_Admin::PAGE_CHARTS:
351 $help_url = 'https://docs.legacy.wpdataaccess.com/docs/chart-widgets/';
352 break;
353 case WPDP::PAGE_MAIN:
354 $help_url = 'https://docs.legacy.wpdataaccess.com/docs/data-projects/';
355 break;
356 case WPDP::PAGE_TEMPLATES:
357 $help_url = 'https://docs.legacy.wpdataaccess.com/docs/project-templates/';
358 break;
359 case 'wpdataaccess':
360 $current_tab = ( isset( $_REQUEST['tab'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['tab'] ) ) : 'plugin' );
361 switch ( $current_tab ) {
362 case 'plugin':
363 $help_url = 'https://docs.settings.wpdataaccess.com/plugin.html';
364 break;
365 case 'pds':
366 $help_url = 'https://docs.settings.wpdataaccess.com/pds.html';
367 break;
368 case 'backend':
369 $help_url = 'https://docs.settings.wpdataaccess.com/back-end.html';
370 break;
371 case 'frontend':
372 $help_url = 'https://docs.settings.wpdataaccess.com/frond-end.html';
373 break;
374 case 'uninstall':
375 $help_url = 'https://docs.settings.wpdataaccess.com/uninstall.html';
376 break;
377 case 'repository':
378 $help_url = 'https://docs.settings.wpdataaccess.com/repository.html';
379 break;
380 case 'mail':
381 $help_url = 'https://docs.settings.wpdataaccess.com/mail.html';
382 break;
383 case 'drives':
384 $help_url = 'https://docs.settings.wpdataaccess.com/drives.html';
385 break;
386 case 'system':
387 $help_url = 'https://docs.settings.wpdataaccess.com/system-info.html';
388 break;
389 case 'legacy':
390 $vtab = ( isset( $_REQUEST['vtab'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['vtab'] ) ) : 'plugin' );
391 switch ( $vtab ) {
392 case 'backend':
393 $help_url = 'https://docs.settings.wpdataaccess.com/legacy-tools-back-end.html';
394 break;
395 case 'frontend':
396 $help_url = 'https://docs.settings.wpdataaccess.com/legacy-tools-front-end.html';
397 break;
398 case 'datatables':
399 $help_url = 'https://docs.settings.wpdataaccess.com/legacy-tools-data-tables.html';
400 break;
401 case 'dataforms':
402 $help_url = 'https://docs.settings.wpdataaccess.com/legacy-tools-data-forms.html';
403 break;
404 case 'dashboard':
405 $help_url = 'https://docs.settings.wpdataaccess.com/legacy-tools-dashboard.html';
406 break;
407 case 'databackup':
408 $help_url = 'https://docs.settings.wpdataaccess.com/legacy-tools-data-backup.html';
409 break;
410 case 'roles':
411 $help_url = 'https://docs.settings.wpdataaccess.com/legacy-tools-roles.html';
412 break;
413 default:
414 $help_url = 'https://docs.settings.wpdataaccess.com/legacy-tools-plugin.html';
415 }
416 break;
417 }
418 break;
419 }
420 }
421 return $help_url;
422 }
423
424 /**
425 * Construct default dashboard
426 *
427 * @return void
428 */
429 protected function dashboard_default() {
430 ?>
431 <div id="wpda-dashboard" style="display:none">
432 <div class="wpda-dashboard">
433 <div class="wpda-dashboard-group wpda-dashboard-group-administration">
434 <div class="icons">
435 <a class="wpda-dashboard-item wpda_tooltip_icons" href="<?php
436 echo esc_url( admin_url( 'admin.php' ) );
437 ?>?page=wpda_navi" title="Quick links and frequently asked questions">
438 <div class="fa-solid fa-house"></div>
439 <div class="label">Tool Guide</div>
440 </a>
441 <a class="wpda-dashboard-item wpda_tooltip_icons" href="<?php
442 echo esc_url( admin_url( 'admin.php' ) );
443 ?>?page=wpda_apps" title="Data-driven Rapid Application Development">
444 <div class="fa-solid">
445 <svg xmlns="http://www.w3.org/2000/svg" height="26px" width="26px" viewBox="4 4 16 16" fill="inherit">
446 <path d="M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z"/>
447 </svg>
448 </div>
449 <div class="label">App Builder</div>
450 </a>
451 <a class="wpda-dashboard-item wpda_tooltip_icons" href="<?php
452 echo esc_url( admin_url( 'admin.php' ) );
453 ?>?page=wpda" title="Manage local and remote data and databases">
454 <div class="fa-solid fa-database"></div>
455 <div class="label">Explorer</div>
456 </a>
457 <a class="wpda-dashboard-item wpda_tooltip_icons" href="<?php
458 echo esc_url( admin_url( 'admin.php' ) );
459 ?>?page=wpda_query_builder" title="SQL Query Builder">
460 <div class="fa-solid fa-code"></div>
461 <div class="label">SQL</div>
462 </a>
463 </div>
464 <div class="subject">Data(base) Administration & App Development</div>
465 </div>
466 <div class="wpda-dashboard-group wpda-dashboard-group-projects"
467 <?php
468 if ( !$this->option_legacy_tools['tables'][0] && !$this->option_legacy_tools['forms'][0] && !$this->option_legacy_tools['templates'][0] && !$this->option_legacy_tools['designer'][0] && !$this->option_legacy_tools['dashboards'][0] && !$this->option_legacy_tools['charts'][0] ) {
469 echo 'style="display: none"';
470 }
471 ?>
472 >
473 <div class="icons">
474 <a class="wpda-dashboard-item wpda_tooltip_icons"
475 href="<?php
476 echo esc_url( admin_url( 'admin.php' ) );
477 ?>?page=wpda_publisher"
478 title="OLD Table Builder
479
480 Use App Builder to access the NEW Table Builder
481 "
482 <?php
483 if ( !$this->option_legacy_tools['tables'][0] ) {
484 echo 'style="display: none"';
485 }
486 ?>
487 >
488 <div class="fa-solid fa-table"></div>
489 <div class="label">Tables</div>
490 </a>
491 <a class="wpda-dashboard-item wpda_tooltip_icons"
492 href="<?php
493 echo esc_url( admin_url( 'admin.php' ) );
494 ?>?page=wpda_wpdp"
495 title="OLD Form Builder
496
497 Use App Builder to access the NEW Form Builder
498 "
499 <?php
500 if ( !$this->option_legacy_tools['forms'][0] ) {
501 echo 'style="display: none"';
502 }
503 ?>
504 >
505 <div class="fa-solid fa-wand-magic-sparkles"></div>
506 <div class="label">Forms</div>
507 </a>
508 <a class="wpda-dashboard-item wpda_tooltip_icons"
509 href="<?php
510 echo esc_url( admin_url( 'admin.php' ) );
511 ?>?page=wpda_templates"
512 title="OLD Form Templates
513
514 Customize forms using templates"
515 <?php
516 if ( !$this->option_legacy_tools['templates'][0] ) {
517 echo 'style="display: none"';
518 }
519 ?>
520 >
521 <div class="fa-solid fa-desktop"></div>
522 <div class="label">Templates</div>
523 </a>
524 <a class="wpda-dashboard-item wpda_tooltip_icons"
525 href="<?php
526 echo esc_url( admin_url( 'admin.php' ) );
527 ?>?page=wpda_designer"
528 title="Create database tables and indexes"
529 <?php
530 if ( !$this->option_legacy_tools['designer'][0] ) {
531 echo 'style="display: none"';
532 }
533 ?>
534 >
535 <div class="fa-solid fa-drafting-compass"></div>
536 <div class="label">Designer</div>
537 </a>
538 <?php
539 ?>
540 </div>
541 <div class="subject">Legacy Tools</div>
542 </div>
543 <div class="wpda-dashboard-group wpda-dashboard-group-settings">
544 <div class="icons">
545 <a class="wpda-dashboard-item wpda_tooltip_icons" href="<?php
546 echo esc_url( admin_url( 'options-general.php' ) );
547 ?>?page=wpdataaccess" title="Manage plugin user interface and behavior">
548 <div class="fa-solid fa-cog"></div>
549 <div class="label">Settings</div>
550 </a>
551 <?php
552 if ( wpda_freemius()->is_registered() ) {
553 ?>
554 <a class="wpda-dashboard-item wpda_tooltip_icons" href="<?php
555 echo esc_url( admin_url( 'admin.php' ) );
556 ?>?page=<?php
557 echo esc_attr( WP_Data_Access_Admin::MAIN_PAGE_SLUG );
558 ?>-account" title="Manage your WP Data Access account">
559 <div class="fa-solid fa-user"></div>
560 <div class="label">Account</div>
561 </a>
562 <?php
563 }
564 ?>
565 <a class="wpda-dashboard-item wpda_tooltip_icons" target="_blank" href="https://wpdataaccess.com/pricing/" title="Pricing, licensing and ordering">
566 <div class="fa-solid fa-hand-holding-usd"></div>
567 <div class="label">Pricing</div>
568 </a>
569 <a class="wpda-dashboard-item wpda_tooltip_icons" href="<?php
570 echo esc_url( admin_url( 'admin.php' ) );
571 ?>?page=<?php
572 echo esc_attr( WP_Data_Access_Admin::MAIN_PAGE_SLUG );
573 ?>-pricing" title="Upgrade your WP Data Access account">
574 <div class="fa-solid fa-gem"></div>
575 <div class="label">Upgrade</div>
576 </a>
577 <?php
578 if ( wpda_freemius()->is_free_plan() && !wpda_freemius()->is_trial() && !wpda_freemius()->is_trial_utilized() ) {
579 ?>
580 <a class="wpda-dashboard-item wpda_tooltip_icons" href="https://wpdataaccess.com/order/?l=0&b=trial" title="Get your 14-day free trial" target="_blank">
581 <div class="fa-solid fa-star"></div>
582 <div class="label">Free Trial</div>
583 </a>
584 <?php
585 }
586 ?>
587 </div>
588 <div class="subject">Plugin & User Management</div>
589 </div>
590 <div class="wpda-dashboard-group wpda-dashboard-group-support">
591 <div class="icons">
592 <a class="wpda-dashboard-item wpda_tooltip_icons" target="_blank" href="<?php
593 echo esc_url( $this->get_help_url() );
594 ?>" title="Context sensitive help">
595 <div class="fa-solid fa-question-circle"></div>
596 <div class="label">Docs</div>
597 </a>
598 <a class="wpda-dashboard-item wpda_tooltip_icons" target="_blank" href="https://wordpress.org/support/plugin/wp-data-access/" title="Public support forum">
599 <div class="fa-solid fa-life-ring"></div>
600 <div class="label">Forum</div>
601 </a>
602 <?php
603 ?>
604 </div>
605 <div class="subject">Help</div>
606 </div>
607 </div>
608 </div>
609 <?php
610 }
611
612 /**
613 * Construct mobile dashboard
614 *
615 * @return void
616 */
617 protected function dashboard_mobile() {
618 $premium_separator = 'wpda-separator';
619 ?>
620 <div id="wpda-dashboard-mobile" style="display:none">
621 <div id="wpda-dashboard-drop-down">
622 <div class="wpda_nav_toggle" onclick="toggleMenu()"><i class="fas fa-bars"></i></div>
623 <div class="wpda_nav_title">WP Data Access</div>
624 </div>
625 <ul>
626 <li class="menu-item"><a href="<?php
627 echo esc_url( admin_url( 'admin.php' ) );
628 ?>?page=wpda"><i class="fas fa-database"></i> Explorer</a></li>
629 <li class="menu-item"><a href="<?php
630 echo esc_url( admin_url( 'admin.php' ) );
631 ?>?page=wpda_query_builder"><i class="fas fa-code"></i> SQL</a></li>
632 <li class="menu-item wpda-separator"><a href="<?php
633 echo esc_url( admin_url( 'admin.php' ) );
634 ?>?page=wpda_designer"><i class="fas fa-drafting-compass"></i> Designer</a></li>
635 <li class="menu-item wpda-separator"><a href="<?php
636 echo esc_url( admin_url( 'admin.php' ) );
637 ?>?page=wpda_apps"><span style="display: inline-block; width: 20px"><svg xmlns="http://www.w3.org/2000/svg" height="12px" width="12px" viewBox="4 4 16 16" fill="inherit">
638 <path d="M4 8h4V4H4v4zm6 12h4v-4h-4v4zm-6 0h4v-4H4v4zm0-6h4v-4H4v4zm6 0h4v-4h-4v4zm6-10v4h4V4h-4zm-6 4h4V4h-4v4zm6 6h4v-4h-4v4zm0 6h4v-4h-4v4z"/>
639 </svg></span> Apps</a></li>
640 <?php
641 ?>
642 <li class="menu-item <?php
643 echo esc_attr( $premium_separator );
644 ?>"><a href="<?php
645 echo esc_url( admin_url( 'admin.php' ) );
646 ?>?page=wpda_publisher"><i class="fas fa-address-card"></i> Tables</a></li>
647 <?php
648 ?>
649 <li class="menu-item"><a href="<?php
650 echo esc_url( admin_url( 'admin.php' ) );
651 ?>?page=wpda_wpdp"><i class="fas fa-magic"></i> Forms</a></li>
652 <li class="menu-item wpda-separator"><a href="<?php
653 echo esc_url( admin_url( 'admin.php' ) );
654 ?>?page=wpda_templates"><i class="fas fa-desktop"></i> Templates</a></li>
655 <li class="menu-item"><a href="<?php
656 echo esc_url( admin_url( 'options-general.php' ) );
657 ?>?page=wpdataaccess"><i class="fas fa-cog"></i> Settings</a></li>
658 <?php
659 if ( wpda_freemius()->is_registered() ) {
660 ?>
661 <li class="menu-item"><a href="<?php
662 echo esc_url( admin_url( 'admin.php' ) );
663 ?>?page=<?php
664 echo esc_attr( WP_Data_Access_Admin::MAIN_PAGE_SLUG );
665 ?>-account"><i class="fas fa-user"></i> Account</a></li>
666 <?php
667 }
668 ?>
669 <?php
670 $menufound = false;
671 global $submenu;
672 if ( isset( $submenu[WPDA::get_option( WP_Data_Access_Admin::PAGE_MAIN )] ) ) {
673 foreach ( $submenu[WPDA::get_option( WP_Data_Access_Admin::PAGE_MAIN )] as $pluginmenu ) {
674 if ( WP_Data_Access_Admin::MAIN_PAGE_SLUG . '-pricing' === $pluginmenu[2] ) {
675 $menufound = true;
676 break;
677 }
678 }
679 }
680 ?>
681 <li class="menu-item <?php
682 echo ( $menufound ? '' : 'wpda-separator' );
683 ?>"><a href="https://wpdataaccess.com/pricing/" target="_blank"><i class="fas fa-hand-holding-usd"></i> Pricing</a></li>
684 <?php
685 if ( $menufound ) {
686 ?>
687 <li class="menu-item wpda-separator"><a href="<?php
688 echo esc_url( admin_url( 'admin.php' ) );
689 ?>?page=<?php
690 echo esc_attr( WP_Data_Access_Admin::MAIN_PAGE_SLUG );
691 ?>-pricing"><i class="fas fa-gem"></i> Upgrade</a></li>
692 <?php
693 }
694 ?>
695 <li class="menu-item"><a target="_blank" href="https://docs.wpdataaccess.com/"><i class="fas fa-question"></i> Online Documentation</a></li>
696 <li class="menu-item"><a target="_blank" href="https://wordpress.org/support/plugin/wp-data-access/"><i class="fas fa-life-ring"></i> Support Forum</a></li>
697 <?php
698 ?>
699 </ul>
700 </div>
701 <?php
702 }
703
704 /**
705 * Add dashboard tabs
706 *
707 * @return void
708 */
709 protected function tabs() {
710 }
711
712 /**
713 * Construct toolbar
714 *
715 * @return void
716 */
717 protected function toolbar() {
718 if ( $this->cannot_create_dashboard ) {
719 return;
720 }
721 $remove_columns_message = __( 'Remove columns outside of range? Widgets will no longer be available!', 'wp-data-access' );
722 ?>
723 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
724 <div class="wpda-nowrap">
725 <div>
726 <?php
727 if ( WPDA::current_user_is_admin() ) {
728 ?>
729 <div>
730 <a href="javascript:addPanel()"
731 class="wpda-dashboard-item wpda_tooltip"
732 title="Create new widget"
733 >
734 <i class="fas fa-folder-plus"></i>
735 <div>
736 Create widget
737 </div>
738 </a>
739 </div>
740 <?php
741 }
742 ?>
743 </div>
744 </div>
745 <div>
746 <?php
747 $this->get_promotions( 'toolbar' );
748 ?>
749 </div>
750 <div style="white-space:nowrap">
751 <div>
752 <div>
753 <a href="javascript:removeColumns(1)"
754 class="wpda-dashboard-item wpda_tooltip"
755 title="One column"
756 >
757 <i class="fas fa-dice-one"></i>
758 <div>
759 1 column
760 </div>
761 </a>
762 </div><div>
763 <a href="javascript:removeColumns(2); addColumns(2)"
764 class="wpda-dashboard-item wpda_tooltip"
765 title="Switch to two column layout"
766 >
767 <i class="fas fa-dice-two"></i>
768 <div>
769 2 columns
770 </div>
771 </a>
772 </div><div>
773 <a href="javascript:removeColumns(3); addColumns(3)"
774 class="wpda-dashboard-item wpda_tooltip"
775 title="Switch to three column layout"
776 >
777 <i class="fas fa-dice-three"></i>
778 <div>
779 3 columns
780 </div>
781 </a>
782 </div><div>
783 <a href="javascript:addColumns(4)"
784 class="wpda-dashboard-item wpda_tooltip"
785 title="Switch to four column layout"
786 >
787 <i class="fas fa-dice-four"></i>
788 <div>
789 4 columns
790 </div>
791 </a>
792 </div>
793 </div>
794 </div>
795 </div>
796 <?php
797 if ( wpda_freemius()->is_free_plan() ) {
798 ?>
799 <div class="wpda_dashboard_free_message">
800 <table>
801 <tr>
802 <td style="text-align:left">
803 The free version of WP Data Access has limited dashboard support.
804 Data Widgets can be added and moved, but not saved or shared.
805 Update to premium to analyse, report and share your data.
806 </td>
807 <td style="white-space:nowrap">
808 <a href="https://wpdataaccess.com/pricing/" target="_blank" class="button button-primary">UPGRADE TO PREMIUM</a>
809 <a href="https://docs.legacy.wpdataaccess.com/docs/bi-getting-started/" target="_blank" class="button">READ MORE</a>
810 </td>
811 </tr>
812 </table>
813 </div>
814 <?php
815 }
816 ?>
817 <script type="application/javascript">
818 function manageTabs() {
819 closePanel();
820 jQuery("#wpda-manage-tabs").show();
821 }
822 function noColumns() {
823 return jQuery(".wpda-dashboard-column").length;
824 }
825 function addColumns(colNum) {
826 if (noColumns()<colNum) {
827 for (var i=noColumns()+1; i<=colNum; i++) {
828 jQuery("#wpda-dashboard-content").append('<div id="wpda-dashboard-column-' + i + '" class="wpda-dashboard-column wpda-dashboard-column-' + i + '"></div>');
829 }
830 refreshPanels(colNum);
831 resetColumnSelection();
832 makeSortable();
833 saveDashBoard();
834 }
835 }
836 function removeColumns(colNum) {
837 if (noColumns()>colNum) {
838 if (confirm("<?php
839 echo esc_html( $remove_columns_message );
840 ?>")) {
841 noCols = noColumns();
842 for (var i=colNum+1; i<=noCols; i++) {
843 jQuery("#wpda-dashboard-column-" + i).remove();
844 }
845 refreshPanels(colNum);
846 makeSortable();
847 saveDashBoard();
848 }
849 }
850 }
851 function refreshPanels(colNum) {
852 for (var i=1; i<=4; i++) {
853 jQuery(".wpda-dashboard-column").removeClass("wpda-dashboard-column-" + i);
854 }
855 jQuery(".wpda-dashboard-column").addClass("wpda-dashboard-column-" + colNum);
856 refreshAllPanels();
857 }
858 jQuery(function(){
859 jQuery("#wpda_delete_new_dashboard_message").on("click", function() {
860 if (confirm("Remove message and link? This cannot be undone!")) {
861 jQuery.ajax({
862 type: "POST",
863 url: wpda_ajaxurl + "?action=wpda_remove_new_dashboard_message",
864 data: {
865 wp_nonce: wpda_wpnonce_save
866 }
867 }).done(
868 function(data) {
869 if (data==="OK") {
870 jQuery("#wpda_delete_new_dashboard_message_container").hide();
871 }
872 }
873 );
874 }
875 });
876 });
877 </script>
878 <?php
879 }
880
881 /**
882 * Data Explorer main page toolbar
883 *
884 * @return void
885 */
886 protected function toolbar_wpda() {
887 $schema_name = ( isset( $_REQUEST['wpdaschema_name'] ) ? esc_attr( sanitize_text_field( wp_unslash( $_REQUEST['wpdaschema_name'] ) ) ) : '' );
888 ?>
889 <form id="wpda_new_design" style="display: none" method="post" action="?page=<?php
890 echo esc_attr( WP_Data_Access_Admin::PAGE_DESIGNER );
891 ?>">
892 <input type="hidden" name="action" value="create_table">
893 <input type="hidden" name="caller" value="dataexplorer">
894 <input type="hidden" name="_wpnonce" value="<?php
895 echo esc_attr( wp_create_nonce( "wpda-query-" . WPDA_Design_Table_Model::get_base_table_name() . "--" ) );
896 ?>">
897 </form>
898 <form id="wpda_goto_backup" style="display: none" method="post" action="?page=<?php
899 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
900 ?>&page_action=wpda_backup">
901 <input type="hidden" name="wpdaschema_name" value="<?php
902 echo esc_attr( $schema_name );
903 ?>">
904 </form>
905 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
906 <div class="wpda-nowrap">
907 <div>
908 <div>
909 <a href="<?php
910 echo esc_url( admin_url( 'admin.php' ) );
911 ?>?page=<?php
912 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
913 ?>&page_action=wpda_global_search"
914 class="wpda-dashboard-item wpda_tooltip"
915 title="Search and replace text in multiple databases and tables"
916 >
917 <i class="fas fa-search-plus"></i>
918 <div>
919 Search & Replace
920 </div>
921 </a>
922 </div><div>
923 <a href="javascript:jQuery('#wpda_new_design').submit()"
924 class="wpda-dashboard-item wpda_tooltip"
925 title="Create new table design"
926 >
927 <i class="fas fa-plus-circle"></i>
928 <div>
929 Create table design
930 </div>
931 </a>
932 </div>
933 </div><div>
934 <div>
935 <a onClick="window.ppActionEnableImport();"
936 href="javascript:void(0)"
937 class="wpda-dashboard-item wpda_tooltip"
938 title="Import and execute SQL script files"
939 >
940 <i class="fas fa-file-code"></i>
941 <div>
942 Import SQL files
943 </div>
944 </a>
945 </div><div>
946 <a href="<?php
947 echo esc_url( admin_url( 'admin.php' ) );
948 ?>?page=<?php
949 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
950 ?>&page_action=wpda_import_csv"
951 class="wpda-dashboard-item wpda_tooltip"
952 title="Import CSV files"
953 >
954 <i class="fas fa-file-csv"></i>
955 <div>
956 Import CSV files
957 </div>
958 </a>
959 </div><div>
960 <a onclick="window.ppActionEnableExport();"
961 href="javascript:void(0)"
962 class="wpda-dashboard-item wpda_tooltip"
963 title="Unattended scheduled exports"
964 >
965 <i class="fas fa-clock"></i>
966 <div>
967 Export
968 </div>
969 </a>
970 </div><?php
971 $wpda_db_options_activated = get_option( 'wpda_db_options_activated' );
972 if ( is_array( $wpda_db_options_activated ) && 0 < count( $wpda_db_options_activated ) ) {
973 // Show old Data Backup feature only if still in use
974 ?><div>
975 <a href="javascript:void(0)"
976 id="wpda_toolbar_icon_go_backup"
977 class="wpda-dashboard-item wpda_tooltip"
978 title="Data Backup - unattended exports"
979 >
980 <i class="fas fa-file-archive"></i>
981 <div>
982 Data Backup
983 </div>
984 </a>
985 </div><?php
986 }
987 ?>
988 </div><div>
989 <div>
990 <a onclick="jQuery('#wpda_manage_databases').show(); jQuery('#local_database').focus();"
991 href="javascript:void(0)"
992 class="wpda-dashboard-item wpda_tooltip"
993 title="Manage remote database connections and local databases"
994 >
995 <i id="wpda_toolbar_icon_add_database" class="fas fa-server"></i>
996 <div>
997 Databases
998 </div>
999 </a>
1000 </div><?php
1001 ?>
1002 </div>
1003 </div>
1004 <div class="wpda-promotion" style="font-size: 16px">
1005 The old Data Explorer is no longer available. <a href="https://wpdataaccess.com/contact/" target="_blank"><i class="fa-solid fa-arrow-up-right-from-square"></i> Please contact us if you need any help.</a>
1006 </div>
1007 <?php
1008 //$this->get_promotions('wpda');
1009 ?>
1010 </div>
1011 <?php
1012 }
1013
1014 /**
1015 * Data Explorer table page toolbar
1016 *
1017 * @return void
1018 */
1019 protected function toolbar_wpda_table() {
1020 ?>
1021 <form id="wpda_new_row" style="display: none" method="post" action="?page=<?php
1022 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
1023 ?>">
1024 <?php
1025 if ( isset( $_REQUEST['wpdaschema_name'] ) ) {
1026 $schema_name = esc_attr( sanitize_text_field( wp_unslash( $_REQUEST['wpdaschema_name'] ) ) );
1027 // phpcs:disable WordPress.Security.EscapeOutput
1028 echo "<input type='hidden' name='wpdaschema_name' value='{$schema_name}'>";
1029 // phpcs:enable WordPress.Security.EscapeOutput
1030 }
1031 ?>
1032 <input type="hidden" id="wpda_new_row_table_name" name="table_name" value="">
1033 <input type="hidden" name="action" value="new">
1034 </form>
1035 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1036 <div class="wpda-nowrap">
1037 <div>
1038 <div>
1039 <a href="javascript:void(0)"
1040 id="wpda_toolbar_icon_add_row"
1041 class="wpda-dashboard-item wpda_tooltip"
1042 title="Add new row to table"
1043 >
1044 <i class="fas fa-plus-circle"></i>
1045 <div>
1046 Add row
1047 </div>
1048 </a>
1049 </div><div>
1050 <a onclick="jQuery('#upload_file_container').show()"
1051 href="javascript:void(0)"
1052 class="wpda-dashboard-item wpda_tooltip"
1053 title="Allows only imports into table authors"
1054 >
1055 <i class="fas fa-code"></i>
1056 <div>
1057 Import rows
1058 </div>
1059 </a>
1060 </div>
1061 </div>
1062 </div>
1063 <?php
1064 $this->get_promotions( 'table' );
1065 ?>
1066 </div>
1067 <?php
1068 }
1069
1070 /**
1071 * Data Explorer data entry form toolbar
1072 *
1073 * @return void
1074 */
1075 protected function toolbar_wpda_row() {
1076 ?>
1077 <form id="wpda_new_row" style="display: none" method="post" action="?page=<?php
1078 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
1079 ?>">
1080 <?php
1081 if ( isset( $_REQUEST['wpdaschema_name'] ) ) {
1082 $schema_name = esc_attr( sanitize_text_field( wp_unslash( $_REQUEST['wpdaschema_name'] ) ) );
1083 // phpcs:disable WordPress.Security.EscapeOutput
1084 echo "<input type='hidden' name='wpdaschema_name' value='{$schema_name}'>";
1085 // phpcs:enable WordPress.Security.EscapeOutput
1086 }
1087 ?>
1088 <input type="hidden" id="wpda_new_row_table_name" name="table_name" value="">
1089 <input type="hidden" name="action" value="new">
1090 </form>
1091 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1092 <div class="wpda-nowrap">
1093 <div>
1094 <div>
1095 <a href="javascript:void(0)"
1096 id="wpda_toolbar_icon_add_row"
1097 class="wpda-dashboard-item wpda_tooltip"
1098 title="Add new row to table"
1099 >
1100 <i class="fas fa-plus-circle"></i>
1101 <div>
1102 Add row
1103 </div>
1104 </a>
1105 </div>
1106 </div>
1107 </div>
1108 <?php
1109 $this->get_promotions( 'row' );
1110 ?>
1111 </div>
1112 <?php
1113 }
1114
1115 /**
1116 * Data Backup toolbar
1117 *
1118 * @return void
1119 */
1120 protected function toolbar_backup() {
1121 ?>
1122 <form id="wpda_new_backup" style="display: none" method="post" action="?page=<?php
1123 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
1124 ?>&page_action=wpda_backup">
1125 <input type="hidden" id="wpda_new_backup_wpdaschema_name" name="wpdaschema_name" value="">
1126 <input type="hidden" name="action" value="new">
1127 <input type="hidden" name="wp_nonce" value="<?php
1128 echo esc_attr( wp_create_nonce( 'wpda-backup-' . WPDA::get_current_user_login() ) );
1129 ?>"/>
1130 </form>
1131 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1132 <div class="wpda-nowrap">
1133 <div>
1134 <div>
1135 <a href="javascript:void(0)"
1136 id="wpda_toolbar_icon_add_backup"
1137 class="wpda-dashboard-item wpda_tooltip"
1138 title="Create new data backup"
1139 >
1140 <i class="fas fa-plus-circle"></i>
1141 <div>
1142 Create backup
1143 </div>
1144 </a>
1145 </div>
1146 </div>
1147 </div>
1148 <?php
1149 $this->get_promotions( 'backup' );
1150 ?>
1151 </div>
1152 <?php
1153 }
1154
1155 /**
1156 * CSV import toolbar
1157 *
1158 * @return void
1159 */
1160 protected function toolbar_import_csv() {
1161 if ( !isset( $_REQUEST['action'] ) || '-1' === $_REQUEST['action'] || 'bulk-delete' === $_REQUEST['action'] || 'delete' === $_REQUEST['action'] ) {
1162 ?>
1163 <form id="wpda_upload_csv" style="display:none" method="post" action="?page=wpda&page_action=wpda_import_csv">
1164 <input type="hidden" name="action" value="upload">
1165 </form>
1166 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1167 <div class="wpda-nowrap">
1168 <div>
1169 <div>
1170 <a href="javascript:jQuery('#wpda_upload_csv').submit()"
1171 class="wpda-dashboard-item wpda_tooltip"
1172 title="Upload new CSV File"
1173 >
1174 <i class="fas fa-plus-circle"></i>
1175 <div>
1176 Upload CSV file
1177 </div>
1178 </a>
1179 </div>
1180 </div>
1181 </div>
1182 <?php
1183 $this->get_promotions( 'csv' );
1184 ?>
1185 </div>
1186 <?php
1187 }
1188 }
1189
1190 /**
1191 * Data Apps toolbar.
1192 *
1193 * @return void
1194 */
1195 protected function toolbar_apps() {
1196 $has_apps = WPDA_App_Model::has_any();
1197 ?>
1198 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1199 <div class="wpda-nowrap">
1200 <div>
1201 <div>
1202 <a href="javascript:window.ppActionCreateApp()"
1203 class="wpda-dashboard-item wpda_tooltip wpda-create-new-app"
1204 title="Create new app"
1205 >
1206 <i class="fas fa-plus-circle"></i>
1207 <div>
1208 Create New App
1209 </div>
1210 </a>
1211 </div><div>
1212 <a href="javascript:window.ppActionRenameDatabase()"
1213 class="wpda-dashboard-item wpda_tooltip wpda-rename-database"
1214 title="Rename Database"
1215 >
1216 <svg stroke="currentColor" fill="none" stroke-width="2" viewBox="0 2 24 24" stroke-linecap="round" stroke-linejoin="round" height="32px" width="32px" xmlns="http://www.w3.org/2000/svg">
1217 <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
1218 <path d="M4 6c0 1.657 3.582 3 8 3s8 -1.343 8 -3s-3.582 -3 -8 -3s-8 1.343 -8 3"></path>
1219 <path d="M4 6v6c0 1.657 3.582 3 8 3c.478 0 .947 -.016 1.402 -.046"></path>
1220 <path d="M20 12v-6"></path>
1221 <path d="M4 12v6c0 1.526 3.04 2.786 6.972 2.975"></path>
1222 <path d="M18.42 15.61a2.1 2.1 0 0 1 2.97 2.97l-3.39 3.42h-3v-3l3.42 -3.39z"></path>
1223 </svg>
1224 <div>
1225 Rename Database
1226 </div>
1227 </a>
1228 </div><?php
1229 ?>
1230 </div>
1231 </div>
1232 <div class="wpda-promotion" style="display: flex; align-items: center; gap: 5px; font-size: 16px;">
1233 <?php
1234 if ( !$has_apps ) {
1235 ?>
1236 <span>
1237 <strong>
1238 New to the App Builder? Watch the Getting Started tutorial! 👉
1239 </strong>
1240 </span><?php
1241 }
1242 ?><span>
1243 <a href="https://www.youtube.com/watch?v=j0MJvuMG7k8"
1244 target="_blank"
1245 class="wpda_tooltip"
1246 title="App Builder Getting Started tutorial"
1247 >
1248 <i class="fas fab fa-square-youtube"></i>
1249 </a>
1250 </span><span>
1251 <a href="https://docs.rad.wpdataaccess.com/"
1252 target="_blank"
1253 class="wpda_tooltip"
1254 title="Online App Builder documentation"
1255 >
1256 <i class="fas fa-circle-info"></i>
1257 </a>
1258 </span>
1259 </div>
1260 <?php
1261 // $this->get_promotions('apps');
1262 ?>
1263 </div>
1264 <?php
1265 }
1266
1267 /**
1268 * Query Builder toolbar
1269 *
1270 * @return void
1271 */
1272 protected function toolbar_sql() {
1273 $current_query_builder_version = get_user_meta( WPDA::get_current_user_id(), 'wpda_query_builder_version', true );
1274 ?>
1275 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1276 <div class="wpda-nowrap">
1277 <div>
1278 <?php
1279 if ( 'old' === $current_query_builder_version ) {
1280 ?>
1281 <div>
1282 <a href="javascript:tabNew()"
1283 class="wpda-dashboard-item wpda_tooltip"
1284 title="Create new query"
1285 >
1286 <i class="fas fa-plus-circle"></i>
1287 <div>
1288 Create new query
1289 </div>
1290 </a>
1291 </div><div>
1292 <a href="javascript:openQuery()"
1293 class="wpda-dashboard-item wpda_tooltip"
1294 title="Open existing query"
1295 >
1296 <i class="fas fa-folder-open"></i>
1297 <div>
1298 Open existing query
1299 </div>
1300 </a>
1301 </div>
1302 <?php
1303 } else {
1304 ?>
1305 <div>
1306 <a href="javascript:void(0)"
1307 onclick="ppActionOpenQueriesMenu(event)"
1308 class="wpda-dashboard-item wpda_tooltip"
1309 title="Create new query"
1310 >
1311 <i class="fas fa-bars"></i>
1312 <div>
1313 Menu
1314 </div>
1315 </a>
1316 </div><div>
1317 <a href="javascript:void(0)"
1318 onclick="ppActionFullScreen()"
1319 class="wpda-dashboard-item wpda_tooltip"
1320 title="Switch to full screen mode"
1321 >
1322 <i class="fas fa-expand"></i>
1323 <div>
1324 Full Screen
1325 </div>
1326 </a>
1327 </div>
1328 <?php
1329 }
1330 ?>
1331 </div>
1332 </div>
1333 <div class="wpda-promotion" style="font-size: 16px">
1334 <?php
1335 if ( 'old' !== $current_query_builder_version ) {
1336 ?>
1337 <span
1338 style="display: flex; align-items: center; gap: 5px; white-space: nowrap;"
1339 >
1340 <a href="?page=<?php
1341 echo esc_attr( WP_Data_Access_Admin::PAGE_QUERY_BUILDER );
1342 ?>&qb=old"
1343 style="display: flex; align-items: center; gap: 5px; white-space: nowrap;"
1344 >
1345 <i class="fas fa-toggle-on"></i>
1346 <span>Switch to old Query Builder</span>
1347 </a>
1348 </span>
1349 <?php
1350 } else {
1351 ?>
1352 <a href="?page=<?php
1353 echo esc_attr( WP_Data_Access_Admin::PAGE_QUERY_BUILDER );
1354 ?>&qb=new"
1355 style="display: flex; align-items: center; gap: 5px;"
1356 >
1357 <i class="fas fa-toggle-off"></i>
1358 <span>Switch to new Query Builder</span>
1359 </a>
1360 <?php
1361 }
1362 ?>
1363 </div>
1364 </div>
1365 <?php
1366 }
1367
1368 /**
1369 * Data Designer toolbar
1370 *
1371 * @return void
1372 */
1373 protected function toolbar_designer() {
1374 ?>
1375 <form id="wpda_new_design" style="display: none" method="post" action="?page=<?php
1376 echo esc_attr( WP_Data_Access_Admin::PAGE_DESIGNER );
1377 ?>">
1378 <input type="hidden" name="action" value="edit">
1379 <input type="hidden" name="table_name" value="<?php
1380 echo esc_attr( WPDA_Design_Table_Model::get_base_table_name() );
1381 ?>">
1382 <input type="hidden" name="_wpnonce" value="<?php
1383 echo esc_attr( wp_create_nonce( "wpda-query-" . WPDA_Design_Table_Model::get_base_table_name() . "--" ) );
1384 ?>">
1385 </form>
1386 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1387 <div class="wpda-nowrap">
1388 <div>
1389 <div>
1390 <a href="javascript:jQuery('#wpda_new_design').submit()"
1391 class="wpda-dashboard-item wpda_tooltip"
1392 title="Create new table design"
1393 >
1394 <i class="fas fa-plus-circle"></i>
1395 <div>
1396 Create table design
1397 </div>
1398 </a>
1399 </div><div>
1400 <a onclick="jQuery('#upload_file_container').show()"
1401 href="javascript:void(0)"
1402 class="wpda-dashboard-item wpda_tooltip"
1403 title="Import table designs"
1404 >
1405 <i class="fas fa-code"></i>
1406 <div>
1407 Import table designs
1408 </div>
1409 </a>
1410 </div>
1411 </div>
1412 </div>
1413 <?php
1414 $this->get_promotions( 'designer' );
1415 ?>
1416 </div>
1417 <?php
1418 }
1419
1420 /**
1421 * Data Tables toolbar
1422 *
1423 * @return void
1424 */
1425 protected function toolbar_publisher() {
1426 ?>
1427 <form id="wpda_new_publication" style="display: none" method="post" action="?page=<?php
1428 echo esc_attr( WP_Data_Access_Admin::PAGE_PUBLISHER );
1429 ?>">
1430 <input type="hidden" id="wpda_new_publication_table_name" name="table_name" value="">
1431 <input type="hidden" name="action" value="new">
1432 </form>
1433 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1434 <div class="wpda-nowrap">
1435 <div>
1436 <div>
1437 <a href="javascript:void(0)"
1438 id="wpda_toolbar_icon_add_publication"
1439 class="wpda-dashboard-item wpda_tooltip"
1440 title="Create new data table"
1441 >
1442 <i class="fas fa-plus-circle"></i>
1443 <div>
1444 Create data table
1445 </div>
1446 </a>
1447 </div><div>
1448 <a onclick="jQuery('#upload_file_container').show()"
1449 href="javascript:void(0)"
1450 class="wpda-dashboard-item wpda_tooltip"
1451 title="Import data tables"
1452 >
1453 <i class="fas fa-code"></i>
1454 <div>
1455 Import data tables
1456 </div>
1457 </a>
1458 </div><?php
1459 ?>
1460 </div>
1461 </div>
1462 <?php
1463 $this->get_promotions( 'publisher' );
1464 ?>
1465 </div>
1466 <?php
1467 }
1468
1469 /**
1470 * Charts toolbar
1471 *
1472 * @return void
1473 */
1474 protected function toolbar_charts() {
1475 }
1476
1477 /**
1478 * Data Projects toolbar
1479 *
1480 * @return void
1481 */
1482 protected function toolbar_projects() {
1483 ?>
1484 <form id="wpda_new_project" style="display: none" method="post" action="?page=<?php
1485 echo esc_attr( WPDP::PAGE_MAIN );
1486 ?>">
1487 <input type="hidden" name="action" value="new">
1488 <input type="hidden" name="mode" value="edit">
1489 <input type="hidden" name="table_name" value="<?php
1490 echo esc_attr( WPDP_Project_Model::get_base_table_name() );
1491 ?>">
1492 </form>
1493 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1494 <div class="wpda-nowrap">
1495 <div>
1496 <div>
1497 <a href="javascript:jQuery('#wpda_new_project').submit()"
1498 class="wpda-dashboard-item wpda_tooltip"
1499 title="Create new project"
1500 >
1501 <i class="fas fa-plus-circle"></i>
1502 <div>
1503 Create project
1504 </div>
1505 </a>
1506 </div><div>
1507 <a onclick="jQuery('#upload_file_container_multi').show()"
1508 href="javascript:void(0)"
1509 class="wpda-dashboard-item wpda_tooltip"
1510 title="Import projects"
1511 >
1512 <i class="fas fa-code"></i>
1513 <div>
1514 Import projects
1515 </div>
1516 </a>
1517 </div>
1518 </div>
1519 </div>
1520 <?php
1521 $this->get_promotions( 'projects' );
1522 ?>
1523 </div>
1524 <?php
1525 }
1526
1527 /**
1528 * Project Templates toolbar
1529 *
1530 * @return void
1531 */
1532 protected function toolbar_templates() {
1533 ?>
1534 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1535 <div class="wpda-nowrap">
1536 <div>
1537 <div>
1538 <a onclick="jQuery('#no_repository_buttons').hide(); jQuery('#add_table_to_repository').show()"
1539 href="javascript:void(0)"
1540 class="wpda-dashboard-item wpda_tooltip"
1541 title="Create new project template"
1542 >
1543 <i class="fas fa-plus-circle"></i>
1544 <div>
1545 Create project template
1546 </div>
1547 </a>
1548 </div>
1549 </div>
1550 </div>
1551 <?php
1552 $this->get_promotions( 'templates' );
1553 ?>
1554 </div>
1555 <?php
1556 }
1557
1558 /**
1559 * Widgets toolbar
1560 *
1561 * @return void
1562 */
1563 protected function add_forms() {
1564 ?>
1565 <div id="wpda-select-panel-type" class="wpda-add-panel" style="display: none">
1566 <form>
1567 <fieldset class="wpda_fieldset wpda_fieldset_dashboard">
1568 <legend>
1569 Create widget
1570 </legend>
1571 <div>
1572 <label>
1573 Widget type
1574 </label>
1575 <select id="wpda-select-panel-type-choice">
1576 <?php
1577 if ( class_exists( 'Code_Manager\\Code_Manager_Model' ) ) {
1578 ?>
1579 <option value="code">Custom Code</option>
1580 <?php
1581 }
1582 ?>
1583 <option value="chart" selected>Chart</option>
1584 <option value="pub">Data Table</option>
1585 <?php
1586 if ( class_exists( 'WPDataAccess\\Premium\\WPDAPRO_Dashboard\\WPDAPRO_Widget_Project' ) ) {
1587 ?>
1588 <option value="project">Data Project</option>
1589 <?php
1590 }
1591 ?>
1592 <option value="dbs">Database Info</option>
1593 </select>
1594 <?php
1595 if ( !class_exists( 'Code_Manager\\Code_Manager_Model' ) || !class_exists( 'WPDataAccess\\Premium\\WPDAPRO_Dashboard\\WPDAPRO_Widget_Project' ) ) {
1596 ?>
1597 <a href="https://docs.legacy.wpdataaccess.com/docs/bi-getting-started/" target="_blank">
1598 <i class="fas fa-question-circle pointer wpda_tooltip"
1599 style="font-size: 170%; vertical-align: middle"
1600 title="Your installation does not support all available widget types! Click to learn how to install more widget types..."></i>
1601 </a>
1602 <?php
1603 }
1604 ?>
1605 </div>
1606 </fieldset>
1607 <div class="wpda-panel-buttons">
1608 <span class="wpda-panel-buttons">
1609 <button id="wpda-select-panel-type-button" class="button button-primary">
1610 <i class="fas fa-check wpda_icon_on_button"></i>
1611 Next
1612 </button>
1613 <button id="wpda-select-panel-type-button-cancel" class="button button-secondary">
1614 <i class="fas fa-times-circle wpda_icon_on_button"></i>
1615 Cancel
1616 </button>
1617 </span>
1618 </div>
1619 </form>
1620 </div>
1621 <div id="wpda-add-panel" class="wpda-add-panel" style="display: none">
1622 <form>
1623 <fieldset class="wpda_fieldset wpda_fieldset_dashboard">
1624 <legend>
1625 Create widget
1626 </legend>
1627 <div>
1628 <label>
1629 Widget type
1630 </label>
1631 <input type="text" id="wpda-add-panel-type-show" readonly>
1632 <input type="hidden" id="wpda-add-panel-type">
1633 </div>
1634 <div>
1635 <label>
1636 Widget name
1637 </label>
1638 <input type="text" id="wpda-add-panel-name" required/>
1639 </div>
1640 <div id="wpda-panel-code" style="display: none">
1641 <label>
1642 Select shortcode
1643 </label>
1644 <select id="wpda-add-panel-code">
1645 <?php
1646 if ( class_exists( 'Code_Manager\\Code_Manager_Model' ) ) {
1647 $codes = \Code_Manager\Code_Manager_Model::get_active_shortcodes();
1648 foreach ( $codes as $code ) {
1649 ?>
1650 <option value="<?php
1651 echo esc_attr( $code['code_id'] );
1652 ?>"><?php
1653 echo esc_attr( $code['code_name'] ) . ' (' . esc_attr( $code['code_type'] ) . ')';
1654 ?></option>
1655 <?php
1656 }
1657 }
1658 ?>
1659 </select>
1660 </div>
1661 <div id="wpda-panel-project">
1662 <label>
1663 Select project
1664 </label>
1665 <select id="wpda-add-panel-project">
1666 <?php
1667 $projects = WPDP_Project_Model::get_project_list();
1668 foreach ( $projects as $project ) {
1669 ?>
1670 <option value="<?php
1671 echo esc_attr( $project['project_id'] );
1672 ?>"><?php
1673 echo esc_attr( $project['project_name'] ) . ' (project_id=' . esc_attr( $project['project_id'] ) . ')';
1674 ?></option>
1675 <?php
1676 }
1677 ?>
1678 </select>
1679 </div>
1680 <div id="wpda-panel-publication">
1681 <label>
1682 Select data table
1683 </label>
1684 <select id="wpda-add-panel-publication">
1685 <?php
1686 $pubs = WPDA_Publisher_Model::get_publication_list();
1687 foreach ( $pubs as $pub ) {
1688 ?>
1689 <option value="<?php
1690 echo esc_attr( $pub['pub_id'] );
1691 ?>"><?php
1692 echo esc_attr( $pub['pub_name'] ) . ' (pub_id=' . esc_attr( $pub['pub_id'] ) . ')';
1693 ?></option>
1694 <?php
1695 }
1696 ?>
1697 </select>
1698 </div>
1699 <div id="wpda-panel-dbms">
1700 <label>
1701 Select database
1702 </label>
1703 <select id="wpda-add-panel-dbms">
1704 <option value="wpdb" selected>WordPress database (
1705 <?php
1706 global $wpdb;
1707 echo esc_attr( $wpdb->dbname );
1708 ?>
1709 )</option>
1710 <?php
1711 $rdbs = WPDADB::get_remote_databases();
1712 ksort( $rdbs );
1713 // phpcs:ignore -- 8.1 proof
1714 foreach ( $rdbs as $key => $rdb ) {
1715 ?>
1716 <option value="<?php
1717 echo esc_attr( $key );
1718 ?>"><?php
1719 echo esc_attr( $key );
1720 ?></option>
1721 <?php
1722 }
1723 ?>
1724 </select>
1725 </div>
1726 <div>
1727 <label>
1728 Add to column
1729 </label>
1730 <select id="wpda-add-panel-column">
1731 <option value="1" selected>1</option>
1732 <option value="2">2</option>
1733 </select>
1734 <select id="wpda-add-panel-position">
1735 <option value="prepend" selected>Before</option>
1736 <option value="append">After</option>
1737 </select>
1738 </div>
1739 </fieldset>
1740 <div class="wpda-panel-buttons">
1741 <span class="wpda-panel-buttons">
1742 <button id="wpda-add-panel-button" class="button button-primary">
1743 <i class="fas fa-check wpda_icon_on_button"></i>
1744 Create
1745 </button>
1746 <button id="wpda-add-panel-button-back" class="button">
1747 <i class="fas fa-angle-left wpda_icon_on_button"></i>
1748 Back
1749 </button>
1750 <button id="wpda-add-panel-button-cancel" class="button button-secondary">
1751 <i class="fas fa-times-circle wpda_icon_on_button"></i>
1752 Cancel
1753 </button>
1754 </span>
1755 </div>
1756 </div>
1757 </form>
1758 <script type="application/javascript">
1759 jQuery(function() {
1760 jQuery("#wpda-select-panel-type-button").on("click", function() {
1761 jQuery("#wpda-panel-code").hide();
1762 jQuery("#wpda-panel-project").hide();
1763 jQuery("#wpda-panel-publication").hide();
1764 jQuery("#wpda-panel-dbms").hide();
1765
1766 jQuery("#wpda-add-panel-type-show").val(jQuery("#wpda-select-panel-type-choice option:selected").text());
1767 jQuery("#wpda-add-panel-type").val(jQuery("#wpda-select-panel-type-choice").val());
1768
1769 switch (jQuery("#wpda-select-panel-type-choice").val()) {
1770 case "code":
1771 jQuery("#wpda-panel-code").show();
1772 break;
1773 case "dbs":
1774 jQuery("#wpda-panel-dbms").show();
1775 break;
1776 case "project":
1777 jQuery("#wpda-panel-project").show();
1778 break;
1779 case "pub":
1780 jQuery("#wpda-panel-publication").show();
1781 break;
1782 }
1783
1784 jQuery("#wpda-select-panel-type").hide();
1785 jQuery("#wpda-add-panel").show();
1786
1787 return false;
1788 });
1789
1790 jQuery("#wpda-select-panel-type-button-cancel").on("click", function() {
1791 jQuery("#wpda-select-panel-type").hide();
1792
1793 return false;
1794 });
1795
1796 jQuery("#wpda-add-panel-button").on("click", function () {
1797 panelName = jQuery("#wpda-add-panel-name").val();
1798
1799 if (panelName=="") {
1800 alert("Widget name is required");
1801 } else {
1802 switch (jQuery("#wpda-add-panel-type").val()) {
1803 case "chart":
1804 addPanelChartToDashboard(
1805 "<?php
1806 echo esc_attr( $this->wp_nonce_add );
1807 ?>",
1808 panelName,
1809 null,
1810 null,
1811 jQuery("#wpda-add-panel-column").val(),
1812 jQuery("#wpda-add-panel-position").val(),
1813 );
1814 break;
1815 case "code":
1816 addPanelCodeToDashboard(
1817 "<?php
1818 echo esc_attr( $this->wp_nonce_add );
1819 ?>",
1820 panelName,
1821 jQuery("#wpda-add-panel-code").val(),
1822 jQuery("#wpda-add-panel-column").val(),
1823 jQuery("#wpda-add-panel-position").val(),
1824 );
1825 break;
1826 case "dbs":
1827 addPanelDbmsToDashboard(
1828 "<?php
1829 echo esc_attr( $this->wp_nonce_add );
1830 ?>",
1831 panelName,
1832 jQuery("#wpda-add-panel-dbms").val(),
1833 jQuery("#wpda-add-panel-column").val(),
1834 jQuery("#wpda-add-panel-position").val(),
1835 );
1836 break;
1837 case "project":
1838 addPanelProjectToDashboard(
1839 "<?php
1840 echo esc_attr( $this->wp_nonce_add );
1841 ?>",
1842 panelName,
1843 jQuery("#wpda-add-panel-project").val(),
1844 jQuery("#wpda-add-panel-column").val(),
1845 jQuery("#wpda-add-panel-position").val(),
1846 );
1847 break;
1848 case "pub":
1849 addPanelPublicationToDashboard(
1850 "<?php
1851 echo esc_attr( $this->wp_nonce_add );
1852 ?>",
1853 panelName,
1854 jQuery("#wpda-add-panel-publication").val(),
1855 jQuery("#wpda-add-panel-column").val(),
1856 jQuery("#wpda-add-panel-position").val(),
1857 );
1858 break;
1859 default:
1860 alert("Unknown panel type");
1861 }
1862 }
1863
1864 return false;
1865 });
1866
1867 jQuery("#wpda-add-panel-button-back").on("click", function() {
1868 jQuery("#wpda-add-panel").hide();
1869 jQuery("#wpda-select-panel-type").show();
1870
1871 return false;
1872 });
1873
1874 jQuery("#wpda-add-panel-button-cancel").on("click", function () {
1875 closePanel();
1876
1877 return false;
1878 });
1879 });
1880 </script>
1881 <?php
1882 }
1883
1884 /**
1885 * Add dashboard columns
1886 *
1887 * @return void
1888 */
1889 protected function columns() {
1890 ?>
1891 <div id="wpda-dashboard-content" class="wpda-dashboard-content">
1892 <?php
1893 // Following line requires PHP 7.
1894 // $last_key = array_key_last($this->dashboard_positions[0]); .
1895 $last_key = 1;
1896 if ( is_array( $this->dashboard_positions ) && count( $this->dashboard_positions ) > 0 ) {
1897 // phpcs:ignore -- 8.1 proof
1898 foreach ( $this->dashboard_positions[0] as $key => $val ) {
1899 $last_key = $key;
1900 }
1901 }
1902 $this->number_of_columns = $last_key;
1903 for ($i = 1; $i <= $this->number_of_columns; $i++) {
1904 ?>
1905 <div id="wpda-dashboard-column-<?php
1906 echo esc_attr( $i );
1907 ?>" class="wpda-dashboard-column wpda-dashboard-column-<?php
1908 echo esc_attr( $this->number_of_columns );
1909 ?>">
1910 </div>
1911 <?php
1912 }
1913 ?>
1914 </div>
1915 <?php
1916 }
1917
1918 /**
1919 * Add panels to dashboard
1920 *
1921 * @return void
1922 */
1923 protected function add_panels() {
1924 }
1925
1926 /**
1927 * Add panel
1928 *
1929 * @param string $dashboard_widget Widget name.
1930 * @param string $column Column name.
1931 * @param string $position Position.
1932 * @param string $widget_id Widget ID.
1933 * @return void
1934 */
1935 protected static function add_panel(
1936 $dashboard_widget,
1937 $column,
1938 $position,
1939 $widget_id = null
1940 ) {
1941 }
1942
1943 /**
1944 * Get available databases as option list
1945 *
1946 * @return string
1947 */
1948 private function get_databases() {
1949 // Get available databases.
1950 $dbs = WPDA_Dictionary_Lists::get_db_schemas();
1951 foreach ( $dbs as $db ) {
1952 $databases[] = $db['schema_name'];
1953 }
1954 global $wpdb;
1955 $database_options = '';
1956 foreach ( $databases as $database ) {
1957 $selected = ( WPDA::get_user_default_scheme() === $database ? 'selected' : '' );
1958 if ( $database === $wpdb->dbname ) {
1959 $database_text = "WordPress database ({$database})";
1960 } else {
1961 $database_text = $database;
1962 }
1963 $database_options .= '<option value="' . esc_attr( $database ) . '" ' . esc_attr( $selected ) . '>' . esc_attr( $database_text ) . '</option>';
1964 }
1965 // Return available databases as option list.
1966 return $database_options;
1967 }
1968
1969 /**
1970 * Add javascript functions
1971 *
1972 * @return void
1973 */
1974 public function dashboard_js() {
1975 ?>
1976 <script type="application/javascript">
1977 let wpda_wpnonce_save = "<?php
1978 echo esc_attr( wp_create_nonce( static::DASHBOARD_SAVE . WPDA::get_current_user_login() ) );
1979 ?>";
1980 let wpda_wpnonce_add = "<?php
1981 echo esc_attr( wp_create_nonce( WPDA_Widget::WIDGET_ADD . WPDA::get_current_user_login() ) );
1982 ?>";
1983 let wpda_wpnonce_qb = "<?php
1984 echo esc_attr( wp_create_nonce( 'wpda-query-builder-' . WPDA::get_current_user_id() ) );
1985 ?>";
1986 let wpda_wpnonce_refresh = "<?php
1987 echo esc_attr( wp_create_nonce( WPDA_Widget::WIDGET_REFRESH . WPDA::get_current_user_login() ) );
1988 ?>";
1989 let wpda_ajaxurl = "<?php
1990 echo esc_url( admin_url( 'admin-ajax.php' ) );
1991 ?>";
1992 let wpda_databases = '<?php
1993 // phpcs:disable WordPress.Security.EscapeOutput
1994 echo $this->get_databases();
1995 // phpcs:enable WordPress.Security.EscapeOutput
1996 ?>';
1997 let wpda_shared_dashboards = <?php
1998 echo json_encode( $this->shared_dashboards );
1999 // phpcs:ignore
2000 ?>;
2001
2002 function saveWidgetPositions() {} // Implemented in the premium version
2003 function saveDashBoard(callback) {
2004 saveWidgetPositions();
2005 jQuery.ajax({
2006 type: "POST",
2007 url: wpda_ajaxurl + "?action=wpda_save_dashboard",
2008 data: {
2009 wp_nonce: wpda_wpnonce_save,
2010 wpda_widgets: dashboardWidgets,
2011 wpda_positions: dashboardWidgetPosition,
2012 wpda_deleted: dashboardWidgetDeleted,
2013 wpda_tabname: "<?php
2014 echo esc_attr( $this->tab_name );
2015 ?>"
2016 }
2017 }).done(
2018 function(data) {
2019 dashboardWidgetDeleted = [];
2020 if (callback!==undefined) {
2021 callback();
2022 }
2023 }
2024 ).fail(
2025 function (msg) {
2026 console.log("WP Data Access error (saveDashBoard):", msg);
2027 }
2028 );
2029 }
2030 <?php
2031 ?>
2032 </script>
2033 <?php
2034 }
2035
2036 /**
2037 * Save dashboard and widgets
2038 *
2039 * @return void
2040 */
2041 public static function save() {
2042 $wp_nonce = ( isset( $_POST['wp_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wp_nonce'] ) ) : '' );
2043 if ( !wp_verify_nonce( $wp_nonce, static::DASHBOARD_SAVE . WPDA::get_current_user_login() ) ) {
2044 WPDA::sent_header( 'application/json' );
2045 static::msg( 'ERROR', 'Token expired, please refresh page' );
2046 wp_die();
2047 }
2048 // phpcs:disable WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
2049 $widgets = ( isset( $_POST['wpda_widgets'] ) ? WPDA::sanitize_text_field_array( $_POST['wpda_widgets'] ) : array() );
2050 // phpcs:enable WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
2051 $save = array();
2052 foreach ( $widgets as $widget ) {
2053 $save[$widget['widgetName']] = $widget;
2054 }
2055 update_user_meta( WPDA::get_current_user_id(), self::USER_DASHBOARD, $save );
2056 self::msg( 'SUCCESS', 'Widget succesfully saved' );
2057 wp_die();
2058 }
2059
2060 /**
2061 * Get list of all widgets
2062 *
2063 * @return void
2064 */
2065 public static function get_list() {
2066 $wp_nonce = ( isset( $_POST['wpda_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wpda_wpnonce'] ) ) : '' );
2067 if ( !wp_verify_nonce( $wp_nonce, WPDA_Widget::WIDGET_REFRESH . WPDA::get_current_user_login() ) ) {
2068 WPDA::sent_header( 'application/json' );
2069 static::msg( 'ERROR', 'Token expired, please refresh page' );
2070 wp_die();
2071 }
2072 // Placeholder: implemented in the premium version.
2073 echo '';
2074 wp_die();
2075 }
2076
2077 /**
2078 * Delete widget
2079 *
2080 * @return void
2081 */
2082 public static function delete_widget() {
2083 $wp_nonce = ( isset( $_POST['wpda_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wpda_wpnonce'] ) ) : '' );
2084 if ( !wp_verify_nonce( $wp_nonce, self::DASHBOARD_SAVE . WPDA::get_current_user_login() ) ) {
2085 WPDA::sent_header( 'application/json' );
2086 static::msg( 'ERROR', 'Token expired, please refresh page' );
2087 wp_die();
2088 }
2089 // Placeholder: implemented in the premium version.
2090 echo '';
2091 wp_die();
2092 }
2093
2094 /**
2095 * Edit chart
2096 *
2097 * @return void
2098 */
2099 public static function edit_chart() {
2100 $wp_nonce = ( isset( $_POST['wpda_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wpda_wpnonce'] ) ) : '' );
2101 if ( !wp_verify_nonce( $wp_nonce, WPDA_Widget::WIDGET_REFRESH . WPDA::get_current_user_login() ) ) {
2102 WPDA::sent_header( 'application/json' );
2103 static::msg( 'ERROR', 'Token expired, please refresh page' );
2104 wp_die();
2105 }
2106 // Placeholder: implemented in the premium version.
2107 echo '';
2108 wp_die();
2109 }
2110
2111 /**
2112 * Load widget via ajax
2113 *
2114 * @return void
2115 */
2116 public static function load_widget() {
2117 $wp_nonce = ( isset( $_POST['wpda_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wpda_wpnonce'] ) ) : '' );
2118 if ( !wp_verify_nonce( $wp_nonce, WPDA_Widget::WIDGET_REFRESH . WPDA::get_current_user_login() ) ) {
2119 WPDA::sent_header( 'application/json' );
2120 static::msg( 'ERROR', 'Token expired, please refresh page' );
2121 wp_die();
2122 }
2123 // Placeholder: implemented in the premium version.
2124 echo '';
2125 wp_die();
2126 }
2127
2128 /**
2129 * Construct tab name
2130 *
2131 * @param string $tab_name Original tab name.
2132 * @return string
2133 */
2134 public static function get_tab_name( $tab_name ) {
2135 return '_' . str_replace( ' ', '_', $tab_name );
2136 }
2137
2138 /**
2139 * Permanently remove plugin info message from dashboard
2140 *
2141 * @return void
2142 */
2143 public static function remove_new_dashboard_message() {
2144 WPDA::sent_header( 'text/html; charset=UTF-8' );
2145 $wp_nonce = ( isset( $_POST['wp_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wp_nonce'] ) ) : '' );
2146 if ( wp_verify_nonce( $wp_nonce, self::DASHBOARD_SAVE . WPDA::get_current_user_login() ) ) {
2147 // Permanently remove message from dashboard toolbar.
2148 update_user_meta( WPDA::get_current_user_id(), self::USER_NEW_MESSAGE, 'removed' );
2149 echo 'OK';
2150 } else {
2151 echo 'FAILED';
2152 }
2153 wp_die();
2154 }
2155
2156 /**
2157 * Construct ajax message
2158 *
2159 * @param string $status Status.
2160 * @param string $msg Message.
2161 * @return false|string
2162 */
2163 public static function msg( $status, $msg ) {
2164 $error = array(
2165 'status' => esc_attr( $status ),
2166 'msg' => $msg,
2167 );
2168 echo json_encode( $error );
2169 // phpcs:ignore WordPress.Security.EscapeOutput
2170 }
2171
2172 private function get_promotions( $tool ) {
2173 switch ( $tool ) {
2174 case 'publisher':
2175 case 'projects':
2176 case 'templates':
2177 case 'charts':
2178 $promotions = array(array(
2179 'This tool will be transitioned to the new App Builder. Please migrate on time.' => array(null, 'fa-lightbulb'),
2180 ));
2181 break;
2182 default:
2183 $promotions = array();
2184 }
2185 if ( count( $promotions ) > 0 ) {
2186 // phpcs:ignore -- 8.1 proof
2187 $promotion_index = random_int( 0, count( $promotions ) - 1 );
2188 $promotion = $promotions[$promotion_index];
2189 $promotion_text = key( $promotion );
2190 $promotion_url = $promotion[$promotion_text][0];
2191 $promotion_icon = $promotion[$promotion_text][1];
2192 ?>
2193 <div class="wpda-promotion">
2194 <span><i class="fas <?php
2195 echo esc_attr( $promotion_icon );
2196 ?>"></i></span>
2197 <?php
2198 echo esc_attr( $promotion_text );
2199 ?>
2200 <?php
2201 if ( null !== $promotion_url ) {
2202 ?>
2203 <a href="<?php
2204 echo esc_url( $promotion_url );
2205 ?>" target="_blank">Read more...</a>
2206 <?php
2207 }
2208 ?>
2209 </div>
2210 <?php
2211 }
2212 }
2213
2214 }
2215
2216 // phpcs:enable WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing