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

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