PluginProbe
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards / 5.5.75
WP Data Access – App Builder for Tables, Forms, Charts, Maps & Dashboards v5.5.75
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.75, at WPDataAccess/Dashboard/WPDA_Dashboard.php

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