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

2,287 lines 75.4 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 <input type="hidden" name="_wpnonce" value="<?php
898 echo esc_attr( wp_create_nonce( "wpda-query-" . WPDA_Design_Table_Model::get_base_table_name() . "--" ) );
899 ?>">
900 </form>
901 <form id="wpda_goto_backup" style="display: none" method="post" action="?page=<?php
902 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
903 ?>&page_action=wpda_backup">
904 <input type="hidden" name="wpdaschema_name" value="<?php
905 echo esc_attr( $schema_name );
906 ?>">
907 </form>
908 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
909 <div class="wpda-nowrap">
910 <div>
911 <div>
912 <a href="<?php
913 echo esc_url( admin_url( 'admin.php' ) );
914 ?>?page=<?php
915 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
916 ?>&page_action=wpda_global_search"
917 class="wpda-dashboard-item wpda_tooltip"
918 title="Search and replace text in multiple databases and tables"
919 >
920 <i class="fas fa-search-plus"></i>
921 <div>
922 Search & Replace
923 </div>
924 </a>
925 </div><div>
926 <a href="javascript:jQuery('#wpda_new_design').submit()"
927 class="wpda-dashboard-item wpda_tooltip"
928 title="Create new table design"
929 >
930 <i class="fas fa-plus-circle"></i>
931 <div>
932 Create table design
933 </div>
934 </a>
935 </div>
936 </div><div>
937 <div>
938 <?php
939 if ( 'new' !== $this->current_version && '' !== $this->current_version ) {
940 ?>
941 <a onclick="jQuery('#upload_file_container_multi').show();"
942 href="javascript:void(0)"
943 class="wpda-dashboard-item wpda_tooltip"
944 title="Import and execute SQL script files"
945 >
946 <i class="fas fa-file-code"></i>
947 <div>
948 Import SQL files
949 </div>
950 </a>
951 <?php
952 } else {
953 ?>
954 <a onClick="window.ppActionEnableImport();"
955 href="javascript:void(0)"
956 class="wpda-dashboard-item wpda_tooltip"
957 title="Import and execute SQL script files"
958 >
959 <i class="fas fa-file-code"></i>
960 <div>
961 Import SQL files
962 </div>
963 </a>
964 <?php
965 }
966 ?>
967 </div><div>
968 <a href="<?php
969 echo esc_url( admin_url( 'admin.php' ) );
970 ?>?page=<?php
971 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
972 ?>&page_action=wpda_import_csv"
973 class="wpda-dashboard-item wpda_tooltip"
974 title="Import CSV files"
975 >
976 <i class="fas fa-file-csv"></i>
977 <div>
978 Import CSV files
979 </div>
980 </a>
981 </div><div>
982 <a onclick="window.ppActionEnableExport();"
983 href="javascript:void(0)"
984 class="wpda-dashboard-item wpda_tooltip"
985 title="Unattended scheduled exports"
986 >
987 <i class="fas fa-clock"></i>
988 <div>
989 Export
990 </div>
991 </a>
992 </div><?php
993 $wpda_db_options_activated = get_option( 'wpda_db_options_activated' );
994 if ( is_array( $wpda_db_options_activated ) && 0 < count( $wpda_db_options_activated ) ) {
995 // Show old Data Backup feature only if still in use
996 ?><div>
997 <a href="javascript:void(0)"
998 id="wpda_toolbar_icon_go_backup"
999 class="wpda-dashboard-item wpda_tooltip"
1000 title="Data Backup - unattended exports"
1001 >
1002 <i class="fas fa-file-archive"></i>
1003 <div>
1004 Data Backup
1005 </div>
1006 </a>
1007 </div><?php
1008 }
1009 ?>
1010 </div><div>
1011 <?php
1012 if ( 'new' !== $this->current_version && '' !== $this->current_version ) {
1013 ?>
1014 <div>
1015 <a onclick="jQuery('#wpda_db_container').show(); jQuery('#local_database').focus();"
1016 href="javascript:void(0)"
1017 class="wpda-dashboard-item wpda_tooltip"
1018 title="Add remote database or create local database"
1019 >
1020 <i id="wpda_toolbar_icon_add_database" class="fas fa-database"></i>
1021 <div>
1022 Add database
1023 </div>
1024 </a>
1025 </div>
1026 <?php
1027 } else {
1028 ?>
1029 <div>
1030 <a onclick="jQuery('#wpda_manage_databases').show(); jQuery('#local_database').focus();"
1031 href="javascript:void(0)"
1032 class="wpda-dashboard-item wpda_tooltip"
1033 title="Manage remote database connections and local databases"
1034 >
1035 <i id="wpda_toolbar_icon_add_database" class="fas fa-server"></i>
1036 <div>
1037 Databases
1038 </div>
1039 </a>
1040 </div><?php
1041 }
1042 ?>
1043 <?php
1044 ?>
1045 </div>
1046 </div>
1047 <div class="wpda-promotion" style="font-size: 16px">
1048 <?php
1049 if ( 'new' !== $this->current_version && '' !== $this->current_version ) {
1050 ?>
1051 <a href="?page=<?php
1052 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
1053 ?>&de=new"
1054 style="display: flex; align-items: center; gap: 5px;"
1055 >
1056 <i class="fas fa-toggle-off"></i>
1057 <span>Switch to new Data Explorer</span>
1058 </a>
1059 <?php
1060 } else {
1061 ?>
1062 <span
1063 style="display: flex; align-items: center; gap: 5px; white-space: nowrap;"
1064 >
1065 <a href="?page=<?php
1066 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
1067 ?>&de=old"
1068 style="display: flex; align-items: center; gap: 5px; white-space: nowrap;"
1069 >
1070 <i class="fas fa-toggle-on"></i>
1071 <span>Switch to old Data Explorer</span>
1072 </a>
1073 </span>
1074 <?php
1075 }
1076 ?>
1077 </div>
1078 <?php
1079 //$this->get_promotions('wpda');
1080 ?>
1081 </div>
1082 <?php
1083 }
1084
1085 /**
1086 * Data Explorer table page toolbar
1087 *
1088 * @return void
1089 */
1090 protected function toolbar_wpda_table() {
1091 ?>
1092 <form id="wpda_new_row" style="display: none" method="post" action="?page=<?php
1093 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
1094 ?>">
1095 <?php
1096 if ( isset( $_REQUEST['wpdaschema_name'] ) ) {
1097 $schema_name = esc_attr( sanitize_text_field( wp_unslash( $_REQUEST['wpdaschema_name'] ) ) );
1098 // phpcs:disable WordPress.Security.EscapeOutput
1099 echo "<input type='hidden' name='wpdaschema_name' value='{$schema_name}'>";
1100 // phpcs:enable WordPress.Security.EscapeOutput
1101 }
1102 ?>
1103 <input type="hidden" id="wpda_new_row_table_name" name="table_name" value="">
1104 <input type="hidden" name="action" value="new">
1105 </form>
1106 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1107 <div class="wpda-nowrap">
1108 <div>
1109 <div>
1110 <a href="javascript:void(0)"
1111 id="wpda_toolbar_icon_add_row"
1112 class="wpda-dashboard-item wpda_tooltip"
1113 title="Add new row to table"
1114 >
1115 <i class="fas fa-plus-circle"></i>
1116 <div>
1117 Add row
1118 </div>
1119 </a>
1120 </div><div>
1121 <a onclick="jQuery('#upload_file_container').show()"
1122 href="javascript:void(0)"
1123 class="wpda-dashboard-item wpda_tooltip"
1124 title="Allows only imports into table authors"
1125 >
1126 <i class="fas fa-code"></i>
1127 <div>
1128 Import rows
1129 </div>
1130 </a>
1131 </div>
1132 </div>
1133 </div>
1134 <?php
1135 $this->get_promotions( 'table' );
1136 ?>
1137 </div>
1138 <?php
1139 }
1140
1141 /**
1142 * Data Explorer data entry form toolbar
1143 *
1144 * @return void
1145 */
1146 protected function toolbar_wpda_row() {
1147 ?>
1148 <form id="wpda_new_row" style="display: none" method="post" action="?page=<?php
1149 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
1150 ?>">
1151 <?php
1152 if ( isset( $_REQUEST['wpdaschema_name'] ) ) {
1153 $schema_name = esc_attr( sanitize_text_field( wp_unslash( $_REQUEST['wpdaschema_name'] ) ) );
1154 // phpcs:disable WordPress.Security.EscapeOutput
1155 echo "<input type='hidden' name='wpdaschema_name' value='{$schema_name}'>";
1156 // phpcs:enable WordPress.Security.EscapeOutput
1157 }
1158 ?>
1159 <input type="hidden" id="wpda_new_row_table_name" name="table_name" value="">
1160 <input type="hidden" name="action" value="new">
1161 </form>
1162 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1163 <div class="wpda-nowrap">
1164 <div>
1165 <div>
1166 <a href="javascript:void(0)"
1167 id="wpda_toolbar_icon_add_row"
1168 class="wpda-dashboard-item wpda_tooltip"
1169 title="Add new row to table"
1170 >
1171 <i class="fas fa-plus-circle"></i>
1172 <div>
1173 Add row
1174 </div>
1175 </a>
1176 </div>
1177 </div>
1178 </div>
1179 <?php
1180 $this->get_promotions( 'row' );
1181 ?>
1182 </div>
1183 <?php
1184 }
1185
1186 /**
1187 * Data Backup toolbar
1188 *
1189 * @return void
1190 */
1191 protected function toolbar_backup() {
1192 ?>
1193 <form id="wpda_new_backup" style="display: none" method="post" action="?page=<?php
1194 echo esc_attr( WP_Data_Access_Admin::PAGE_MAIN );
1195 ?>&page_action=wpda_backup">
1196 <input type="hidden" id="wpda_new_backup_wpdaschema_name" name="wpdaschema_name" value="">
1197 <input type="hidden" name="action" value="new">
1198 <input type="hidden" name="wp_nonce" value="<?php
1199 echo esc_attr( wp_create_nonce( 'wpda-backup-' . WPDA::get_current_user_login() ) );
1200 ?>"/>
1201 </form>
1202 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1203 <div class="wpda-nowrap">
1204 <div>
1205 <div>
1206 <a href="javascript:void(0)"
1207 id="wpda_toolbar_icon_add_backup"
1208 class="wpda-dashboard-item wpda_tooltip"
1209 title="Create new data backup"
1210 >
1211 <i class="fas fa-plus-circle"></i>
1212 <div>
1213 Create backup
1214 </div>
1215 </a>
1216 </div>
1217 </div>
1218 </div>
1219 <?php
1220 $this->get_promotions( 'backup' );
1221 ?>
1222 </div>
1223 <?php
1224 }
1225
1226 /**
1227 * CSV import toolbar
1228 *
1229 * @return void
1230 */
1231 protected function toolbar_import_csv() {
1232 if ( !isset( $_REQUEST['action'] ) || '-1' === $_REQUEST['action'] || 'bulk-delete' === $_REQUEST['action'] || 'delete' === $_REQUEST['action'] ) {
1233 ?>
1234 <form id="wpda_upload_csv" style="display:none" method="post" action="?page=wpda&page_action=wpda_import_csv">
1235 <input type="hidden" name="action" value="upload">
1236 </form>
1237 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1238 <div class="wpda-nowrap">
1239 <div>
1240 <div>
1241 <a href="javascript:jQuery('#wpda_upload_csv').submit()"
1242 class="wpda-dashboard-item wpda_tooltip"
1243 title="Upload new CSV File"
1244 >
1245 <i class="fas fa-plus-circle"></i>
1246 <div>
1247 Upload CSV file
1248 </div>
1249 </a>
1250 </div>
1251 </div>
1252 </div>
1253 <?php
1254 $this->get_promotions( 'csv' );
1255 ?>
1256 </div>
1257 <?php
1258 }
1259 }
1260
1261 /**
1262 * Data Apps toolbar.
1263 *
1264 * @return void
1265 */
1266 protected function toolbar_apps() {
1267 $has_apps = WPDA_App_Model::has_any();
1268 ?>
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:window.ppActionCreateApp()"
1274 class="wpda-dashboard-item wpda_tooltip wpda-create-new-app"
1275 title="Create new app"
1276 >
1277 <i class="fas fa-plus-circle"></i>
1278 <div>
1279 Create New App
1280 </div>
1281 </a>
1282 </div><div>
1283 <a href="javascript:window.ppActionRenameDatabase()"
1284 class="wpda-dashboard-item wpda_tooltip wpda-rename-database"
1285 title="Rename Database"
1286 >
1287 <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">
1288 <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
1289 <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>
1290 <path d="M4 6v6c0 1.657 3.582 3 8 3c.478 0 .947 -.016 1.402 -.046"></path>
1291 <path d="M20 12v-6"></path>
1292 <path d="M4 12v6c0 1.526 3.04 2.786 6.972 2.975"></path>
1293 <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>
1294 </svg>
1295 <div>
1296 Rename Database
1297 </div>
1298 </a>
1299 </div><?php
1300 ?>
1301 </div>
1302 </div>
1303 <div class="wpda-promotion" style="display: flex; align-items: center; gap: 5px; font-size: 16px;">
1304 <?php
1305 if ( !$has_apps ) {
1306 ?>
1307 <span>
1308 <strong>
1309 New to the App Builder? Watch the Getting Started tutorial! 👉
1310 </strong>
1311 </span><?php
1312 }
1313 ?><span>
1314 <a href="https://www.youtube.com/watch?v=j0MJvuMG7k8"
1315 target="_blank"
1316 class="wpda_tooltip"
1317 title="App Builder Getting Started tutorial"
1318 >
1319 <i class="fas fab fa-square-youtube"></i>
1320 </a>
1321 </span><span>
1322 <a href="https://docs.rad.wpdataaccess.com/"
1323 target="_blank"
1324 class="wpda_tooltip"
1325 title="Online App Builder documentation"
1326 >
1327 <i class="fas fa-circle-info"></i>
1328 </a>
1329 </span>
1330 </div>
1331 <?php
1332 // $this->get_promotions('apps');
1333 ?>
1334 </div>
1335 <?php
1336 }
1337
1338 /**
1339 * Query Builder toolbar
1340 *
1341 * @return void
1342 */
1343 protected function toolbar_sql() {
1344 $current_query_builder_version = get_user_meta( WPDA::get_current_user_id(), 'wpda_query_builder_version', true );
1345 ?>
1346 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1347 <div class="wpda-nowrap">
1348 <div>
1349 <?php
1350 if ( 'old' === $current_query_builder_version ) {
1351 ?>
1352 <div>
1353 <a href="javascript:tabNew()"
1354 class="wpda-dashboard-item wpda_tooltip"
1355 title="Create new query"
1356 >
1357 <i class="fas fa-plus-circle"></i>
1358 <div>
1359 Create new query
1360 </div>
1361 </a>
1362 </div><div>
1363 <a href="javascript:openQuery()"
1364 class="wpda-dashboard-item wpda_tooltip"
1365 title="Open existing query"
1366 >
1367 <i class="fas fa-folder-open"></i>
1368 <div>
1369 Open existing query
1370 </div>
1371 </a>
1372 </div>
1373 <?php
1374 } else {
1375 ?>
1376 <div>
1377 <a href="javascript:void(0)"
1378 onclick="ppActionOpenQueriesMenu(event)"
1379 class="wpda-dashboard-item wpda_tooltip"
1380 title="Create new query"
1381 >
1382 <i class="fas fa-bars"></i>
1383 <div>
1384 Menu
1385 </div>
1386 </a>
1387 </div><div>
1388 <a href="javascript:void(0)"
1389 onclick="ppActionFullScreen()"
1390 class="wpda-dashboard-item wpda_tooltip"
1391 title="Switch to full screen mode"
1392 >
1393 <i class="fas fa-expand"></i>
1394 <div>
1395 Full Screen
1396 </div>
1397 </a>
1398 </div>
1399 <?php
1400 }
1401 ?>
1402 </div>
1403 </div>
1404 <div class="wpda-promotion" style="font-size: 16px">
1405 <?php
1406 if ( 'old' !== $current_query_builder_version ) {
1407 ?>
1408 <span
1409 style="display: flex; align-items: center; gap: 5px; white-space: nowrap;"
1410 >
1411 <a href="?page=<?php
1412 echo esc_attr( WP_Data_Access_Admin::PAGE_QUERY_BUILDER );
1413 ?>&qb=old"
1414 style="display: flex; align-items: center; gap: 5px; white-space: nowrap;"
1415 >
1416 <i class="fas fa-toggle-on"></i>
1417 <span>Switch to old Query Builder</span>
1418 </a>
1419 </span>
1420 <?php
1421 } else {
1422 ?>
1423 <a href="?page=<?php
1424 echo esc_attr( WP_Data_Access_Admin::PAGE_QUERY_BUILDER );
1425 ?>&qb=new"
1426 style="display: flex; align-items: center; gap: 5px;"
1427 >
1428 <i class="fas fa-toggle-off"></i>
1429 <span>Switch to new Query Builder</span>
1430 </a>
1431 <?php
1432 }
1433 ?>
1434 </div>
1435 </div>
1436 <?php
1437 }
1438
1439 /**
1440 * Data Designer toolbar
1441 *
1442 * @return void
1443 */
1444 protected function toolbar_designer() {
1445 ?>
1446 <form id="wpda_new_design" style="display: none" method="post" action="?page=<?php
1447 echo esc_attr( WP_Data_Access_Admin::PAGE_DESIGNER );
1448 ?>">
1449 <input type="hidden" name="action" value="edit">
1450 <input type="hidden" name="table_name" value="<?php
1451 echo esc_attr( WPDA_Design_Table_Model::get_base_table_name() );
1452 ?>">
1453 <input type="hidden" name="_wpnonce" value="<?php
1454 echo esc_attr( wp_create_nonce( "wpda-query-" . WPDA_Design_Table_Model::get_base_table_name() . "--" ) );
1455 ?>">
1456 </form>
1457 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1458 <div class="wpda-nowrap">
1459 <div>
1460 <div>
1461 <a href="javascript:jQuery('#wpda_new_design').submit()"
1462 class="wpda-dashboard-item wpda_tooltip"
1463 title="Create new table design"
1464 >
1465 <i class="fas fa-plus-circle"></i>
1466 <div>
1467 Create table design
1468 </div>
1469 </a>
1470 </div><div>
1471 <a onclick="jQuery('#upload_file_container').show()"
1472 href="javascript:void(0)"
1473 class="wpda-dashboard-item wpda_tooltip"
1474 title="Import table designs"
1475 >
1476 <i class="fas fa-code"></i>
1477 <div>
1478 Import table designs
1479 </div>
1480 </a>
1481 </div>
1482 </div>
1483 </div>
1484 <?php
1485 $this->get_promotions( 'designer' );
1486 ?>
1487 </div>
1488 <?php
1489 }
1490
1491 /**
1492 * Data Tables toolbar
1493 *
1494 * @return void
1495 */
1496 protected function toolbar_publisher() {
1497 ?>
1498 <form id="wpda_new_publication" style="display: none" method="post" action="?page=<?php
1499 echo esc_attr( WP_Data_Access_Admin::PAGE_PUBLISHER );
1500 ?>">
1501 <input type="hidden" id="wpda_new_publication_table_name" name="table_name" value="">
1502 <input type="hidden" name="action" value="new">
1503 </form>
1504 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1505 <div class="wpda-nowrap">
1506 <div>
1507 <div>
1508 <a href="javascript:void(0)"
1509 id="wpda_toolbar_icon_add_publication"
1510 class="wpda-dashboard-item wpda_tooltip"
1511 title="Create new data table"
1512 >
1513 <i class="fas fa-plus-circle"></i>
1514 <div>
1515 Create data table
1516 </div>
1517 </a>
1518 </div><div>
1519 <a onclick="jQuery('#upload_file_container').show()"
1520 href="javascript:void(0)"
1521 class="wpda-dashboard-item wpda_tooltip"
1522 title="Import data tables"
1523 >
1524 <i class="fas fa-code"></i>
1525 <div>
1526 Import data tables
1527 </div>
1528 </a>
1529 </div><?php
1530 ?>
1531 </div>
1532 </div>
1533 <?php
1534 $this->get_promotions( 'publisher' );
1535 ?>
1536 </div>
1537 <?php
1538 }
1539
1540 /**
1541 * Charts toolbar
1542 *
1543 * @return void
1544 */
1545 protected function toolbar_charts() {
1546 }
1547
1548 /**
1549 * Data Projects toolbar
1550 *
1551 * @return void
1552 */
1553 protected function toolbar_projects() {
1554 ?>
1555 <form id="wpda_new_project" style="display: none" method="post" action="?page=<?php
1556 echo esc_attr( WPDP::PAGE_MAIN );
1557 ?>">
1558 <input type="hidden" name="action" value="new">
1559 <input type="hidden" name="mode" value="edit">
1560 <input type="hidden" name="table_name" value="<?php
1561 echo esc_attr( WPDP_Project_Model::get_base_table_name() );
1562 ?>">
1563 </form>
1564 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1565 <div class="wpda-nowrap">
1566 <div>
1567 <div>
1568 <a href="javascript:jQuery('#wpda_new_project').submit()"
1569 class="wpda-dashboard-item wpda_tooltip"
1570 title="Create new project"
1571 >
1572 <i class="fas fa-plus-circle"></i>
1573 <div>
1574 Create project
1575 </div>
1576 </a>
1577 </div><div>
1578 <a onclick="jQuery('#upload_file_container_multi').show()"
1579 href="javascript:void(0)"
1580 class="wpda-dashboard-item wpda_tooltip"
1581 title="Import projects"
1582 >
1583 <i class="fas fa-code"></i>
1584 <div>
1585 Import projects
1586 </div>
1587 </a>
1588 </div>
1589 </div>
1590 </div>
1591 <?php
1592 $this->get_promotions( 'projects' );
1593 ?>
1594 </div>
1595 <?php
1596 }
1597
1598 /**
1599 * Project Templates toolbar
1600 *
1601 * @return void
1602 */
1603 protected function toolbar_templates() {
1604 ?>
1605 <div id="wpda-dashboard-toolbar" class="wpda-dashboard-toolbar" style="display:none">
1606 <div class="wpda-nowrap">
1607 <div>
1608 <div>
1609 <a onclick="jQuery('#no_repository_buttons').hide(); jQuery('#add_table_to_repository').show()"
1610 href="javascript:void(0)"
1611 class="wpda-dashboard-item wpda_tooltip"
1612 title="Create new project template"
1613 >
1614 <i class="fas fa-plus-circle"></i>
1615 <div>
1616 Create project template
1617 </div>
1618 </a>
1619 </div>
1620 </div>
1621 </div>
1622 <?php
1623 $this->get_promotions( 'templates' );
1624 ?>
1625 </div>
1626 <?php
1627 }
1628
1629 /**
1630 * Widgets toolbar
1631 *
1632 * @return void
1633 */
1634 protected function add_forms() {
1635 ?>
1636 <div id="wpda-select-panel-type" class="wpda-add-panel" style="display: none">
1637 <form>
1638 <fieldset class="wpda_fieldset wpda_fieldset_dashboard">
1639 <legend>
1640 Create widget
1641 </legend>
1642 <div>
1643 <label>
1644 Widget type
1645 </label>
1646 <select id="wpda-select-panel-type-choice">
1647 <?php
1648 if ( class_exists( 'Code_Manager\\Code_Manager_Model' ) ) {
1649 ?>
1650 <option value="code">Custom Code</option>
1651 <?php
1652 }
1653 ?>
1654 <option value="chart" selected>Chart</option>
1655 <option value="pub">Data Table</option>
1656 <?php
1657 if ( class_exists( 'WPDataAccess\\Premium\\WPDAPRO_Dashboard\\WPDAPRO_Widget_Project' ) ) {
1658 ?>
1659 <option value="project">Data Project</option>
1660 <?php
1661 }
1662 ?>
1663 <option value="dbs">Database Info</option>
1664 </select>
1665 <?php
1666 if ( !class_exists( 'Code_Manager\\Code_Manager_Model' ) || !class_exists( 'WPDataAccess\\Premium\\WPDAPRO_Dashboard\\WPDAPRO_Widget_Project' ) ) {
1667 ?>
1668 <a href="https://docs.legacy.wpdataaccess.com/docs/bi-getting-started/" target="_blank">
1669 <i class="fas fa-question-circle pointer wpda_tooltip"
1670 style="font-size: 170%; vertical-align: middle"
1671 title="Your installation does not support all available widget types! Click to learn how to install more widget types..."></i>
1672 </a>
1673 <?php
1674 }
1675 ?>
1676 </div>
1677 </fieldset>
1678 <div class="wpda-panel-buttons">
1679 <span class="wpda-panel-buttons">
1680 <button id="wpda-select-panel-type-button" class="button button-primary">
1681 <i class="fas fa-check wpda_icon_on_button"></i>
1682 Next
1683 </button>
1684 <button id="wpda-select-panel-type-button-cancel" class="button button-secondary">
1685 <i class="fas fa-times-circle wpda_icon_on_button"></i>
1686 Cancel
1687 </button>
1688 </span>
1689 </div>
1690 </form>
1691 </div>
1692 <div id="wpda-add-panel" class="wpda-add-panel" style="display: none">
1693 <form>
1694 <fieldset class="wpda_fieldset wpda_fieldset_dashboard">
1695 <legend>
1696 Create widget
1697 </legend>
1698 <div>
1699 <label>
1700 Widget type
1701 </label>
1702 <input type="text" id="wpda-add-panel-type-show" readonly>
1703 <input type="hidden" id="wpda-add-panel-type">
1704 </div>
1705 <div>
1706 <label>
1707 Widget name
1708 </label>
1709 <input type="text" id="wpda-add-panel-name" required/>
1710 </div>
1711 <div id="wpda-panel-code" style="display: none">
1712 <label>
1713 Select shortcode
1714 </label>
1715 <select id="wpda-add-panel-code">
1716 <?php
1717 if ( class_exists( 'Code_Manager\\Code_Manager_Model' ) ) {
1718 $codes = \Code_Manager\Code_Manager_Model::get_active_shortcodes();
1719 foreach ( $codes as $code ) {
1720 ?>
1721 <option value="<?php
1722 echo esc_attr( $code['code_id'] );
1723 ?>"><?php
1724 echo esc_attr( $code['code_name'] ) . ' (' . esc_attr( $code['code_type'] ) . ')';
1725 ?></option>
1726 <?php
1727 }
1728 }
1729 ?>
1730 </select>
1731 </div>
1732 <div id="wpda-panel-project">
1733 <label>
1734 Select project
1735 </label>
1736 <select id="wpda-add-panel-project">
1737 <?php
1738 $projects = WPDP_Project_Model::get_project_list();
1739 foreach ( $projects as $project ) {
1740 ?>
1741 <option value="<?php
1742 echo esc_attr( $project['project_id'] );
1743 ?>"><?php
1744 echo esc_attr( $project['project_name'] ) . ' (project_id=' . esc_attr( $project['project_id'] ) . ')';
1745 ?></option>
1746 <?php
1747 }
1748 ?>
1749 </select>
1750 </div>
1751 <div id="wpda-panel-publication">
1752 <label>
1753 Select data table
1754 </label>
1755 <select id="wpda-add-panel-publication">
1756 <?php
1757 $pubs = WPDA_Publisher_Model::get_publication_list();
1758 foreach ( $pubs as $pub ) {
1759 ?>
1760 <option value="<?php
1761 echo esc_attr( $pub['pub_id'] );
1762 ?>"><?php
1763 echo esc_attr( $pub['pub_name'] ) . ' (pub_id=' . esc_attr( $pub['pub_id'] ) . ')';
1764 ?></option>
1765 <?php
1766 }
1767 ?>
1768 </select>
1769 </div>
1770 <div id="wpda-panel-dbms">
1771 <label>
1772 Select database
1773 </label>
1774 <select id="wpda-add-panel-dbms">
1775 <option value="wpdb" selected>WordPress database (
1776 <?php
1777 global $wpdb;
1778 echo esc_attr( $wpdb->dbname );
1779 ?>
1780 )</option>
1781 <?php
1782 $rdbs = WPDADB::get_remote_databases();
1783 ksort( $rdbs );
1784 // phpcs:ignore -- 8.1 proof
1785 foreach ( $rdbs as $key => $rdb ) {
1786 ?>
1787 <option value="<?php
1788 echo esc_attr( $key );
1789 ?>"><?php
1790 echo esc_attr( $key );
1791 ?></option>
1792 <?php
1793 }
1794 ?>
1795 </select>
1796 </div>
1797 <div>
1798 <label>
1799 Add to column
1800 </label>
1801 <select id="wpda-add-panel-column">
1802 <option value="1" selected>1</option>
1803 <option value="2">2</option>
1804 </select>
1805 <select id="wpda-add-panel-position">
1806 <option value="prepend" selected>Before</option>
1807 <option value="append">After</option>
1808 </select>
1809 </div>
1810 </fieldset>
1811 <div class="wpda-panel-buttons">
1812 <span class="wpda-panel-buttons">
1813 <button id="wpda-add-panel-button" class="button button-primary">
1814 <i class="fas fa-check wpda_icon_on_button"></i>
1815 Create
1816 </button>
1817 <button id="wpda-add-panel-button-back" class="button">
1818 <i class="fas fa-angle-left wpda_icon_on_button"></i>
1819 Back
1820 </button>
1821 <button id="wpda-add-panel-button-cancel" class="button button-secondary">
1822 <i class="fas fa-times-circle wpda_icon_on_button"></i>
1823 Cancel
1824 </button>
1825 </span>
1826 </div>
1827 </div>
1828 </form>
1829 <script type="application/javascript">
1830 jQuery(function() {
1831 jQuery("#wpda-select-panel-type-button").on("click", function() {
1832 jQuery("#wpda-panel-code").hide();
1833 jQuery("#wpda-panel-project").hide();
1834 jQuery("#wpda-panel-publication").hide();
1835 jQuery("#wpda-panel-dbms").hide();
1836
1837 jQuery("#wpda-add-panel-type-show").val(jQuery("#wpda-select-panel-type-choice option:selected").text());
1838 jQuery("#wpda-add-panel-type").val(jQuery("#wpda-select-panel-type-choice").val());
1839
1840 switch (jQuery("#wpda-select-panel-type-choice").val()) {
1841 case "code":
1842 jQuery("#wpda-panel-code").show();
1843 break;
1844 case "dbs":
1845 jQuery("#wpda-panel-dbms").show();
1846 break;
1847 case "project":
1848 jQuery("#wpda-panel-project").show();
1849 break;
1850 case "pub":
1851 jQuery("#wpda-panel-publication").show();
1852 break;
1853 }
1854
1855 jQuery("#wpda-select-panel-type").hide();
1856 jQuery("#wpda-add-panel").show();
1857
1858 return false;
1859 });
1860
1861 jQuery("#wpda-select-panel-type-button-cancel").on("click", function() {
1862 jQuery("#wpda-select-panel-type").hide();
1863
1864 return false;
1865 });
1866
1867 jQuery("#wpda-add-panel-button").on("click", function () {
1868 panelName = jQuery("#wpda-add-panel-name").val();
1869
1870 if (panelName=="") {
1871 alert("Widget name is required");
1872 } else {
1873 switch (jQuery("#wpda-add-panel-type").val()) {
1874 case "chart":
1875 addPanelChartToDashboard(
1876 "<?php
1877 echo esc_attr( $this->wp_nonce_add );
1878 ?>",
1879 panelName,
1880 null,
1881 null,
1882 jQuery("#wpda-add-panel-column").val(),
1883 jQuery("#wpda-add-panel-position").val(),
1884 );
1885 break;
1886 case "code":
1887 addPanelCodeToDashboard(
1888 "<?php
1889 echo esc_attr( $this->wp_nonce_add );
1890 ?>",
1891 panelName,
1892 jQuery("#wpda-add-panel-code").val(),
1893 jQuery("#wpda-add-panel-column").val(),
1894 jQuery("#wpda-add-panel-position").val(),
1895 );
1896 break;
1897 case "dbs":
1898 addPanelDbmsToDashboard(
1899 "<?php
1900 echo esc_attr( $this->wp_nonce_add );
1901 ?>",
1902 panelName,
1903 jQuery("#wpda-add-panel-dbms").val(),
1904 jQuery("#wpda-add-panel-column").val(),
1905 jQuery("#wpda-add-panel-position").val(),
1906 );
1907 break;
1908 case "project":
1909 addPanelProjectToDashboard(
1910 "<?php
1911 echo esc_attr( $this->wp_nonce_add );
1912 ?>",
1913 panelName,
1914 jQuery("#wpda-add-panel-project").val(),
1915 jQuery("#wpda-add-panel-column").val(),
1916 jQuery("#wpda-add-panel-position").val(),
1917 );
1918 break;
1919 case "pub":
1920 addPanelPublicationToDashboard(
1921 "<?php
1922 echo esc_attr( $this->wp_nonce_add );
1923 ?>",
1924 panelName,
1925 jQuery("#wpda-add-panel-publication").val(),
1926 jQuery("#wpda-add-panel-column").val(),
1927 jQuery("#wpda-add-panel-position").val(),
1928 );
1929 break;
1930 default:
1931 alert("Unknown panel type");
1932 }
1933 }
1934
1935 return false;
1936 });
1937
1938 jQuery("#wpda-add-panel-button-back").on("click", function() {
1939 jQuery("#wpda-add-panel").hide();
1940 jQuery("#wpda-select-panel-type").show();
1941
1942 return false;
1943 });
1944
1945 jQuery("#wpda-add-panel-button-cancel").on("click", function () {
1946 closePanel();
1947
1948 return false;
1949 });
1950 });
1951 </script>
1952 <?php
1953 }
1954
1955 /**
1956 * Add dashboard columns
1957 *
1958 * @return void
1959 */
1960 protected function columns() {
1961 ?>
1962 <div id="wpda-dashboard-content" class="wpda-dashboard-content">
1963 <?php
1964 // Following line requires PHP 7.
1965 // $last_key = array_key_last($this->dashboard_positions[0]); .
1966 $last_key = 1;
1967 if ( is_array( $this->dashboard_positions ) && count( $this->dashboard_positions ) > 0 ) {
1968 // phpcs:ignore -- 8.1 proof
1969 foreach ( $this->dashboard_positions[0] as $key => $val ) {
1970 $last_key = $key;
1971 }
1972 }
1973 $this->number_of_columns = $last_key;
1974 for ($i = 1; $i <= $this->number_of_columns; $i++) {
1975 ?>
1976 <div id="wpda-dashboard-column-<?php
1977 echo esc_attr( $i );
1978 ?>" class="wpda-dashboard-column wpda-dashboard-column-<?php
1979 echo esc_attr( $this->number_of_columns );
1980 ?>">
1981 </div>
1982 <?php
1983 }
1984 ?>
1985 </div>
1986 <?php
1987 }
1988
1989 /**
1990 * Add panels to dashboard
1991 *
1992 * @return void
1993 */
1994 protected function add_panels() {
1995 }
1996
1997 /**
1998 * Add panel
1999 *
2000 * @param string $dashboard_widget Widget name.
2001 * @param string $column Column name.
2002 * @param string $position Position.
2003 * @param string $widget_id Widget ID.
2004 * @return void
2005 */
2006 protected static function add_panel(
2007 $dashboard_widget,
2008 $column,
2009 $position,
2010 $widget_id = null
2011 ) {
2012 }
2013
2014 /**
2015 * Get available databases as option list
2016 *
2017 * @return string
2018 */
2019 private function get_databases() {
2020 // Get available databases.
2021 $dbs = WPDA_Dictionary_Lists::get_db_schemas();
2022 foreach ( $dbs as $db ) {
2023 $databases[] = $db['schema_name'];
2024 }
2025 global $wpdb;
2026 $database_options = '';
2027 foreach ( $databases as $database ) {
2028 $selected = ( WPDA::get_user_default_scheme() === $database ? 'selected' : '' );
2029 if ( $database === $wpdb->dbname ) {
2030 $database_text = "WordPress database ({$database})";
2031 } else {
2032 $database_text = $database;
2033 }
2034 $database_options .= '<option value="' . esc_attr( $database ) . '" ' . esc_attr( $selected ) . '>' . esc_attr( $database_text ) . '</option>';
2035 }
2036 // Return available databases as option list.
2037 return $database_options;
2038 }
2039
2040 /**
2041 * Add javascript functions
2042 *
2043 * @return void
2044 */
2045 public function dashboard_js() {
2046 ?>
2047 <script type="application/javascript">
2048 let wpda_wpnonce_save = "<?php
2049 echo esc_attr( wp_create_nonce( static::DASHBOARD_SAVE . WPDA::get_current_user_login() ) );
2050 ?>";
2051 let wpda_wpnonce_add = "<?php
2052 echo esc_attr( wp_create_nonce( WPDA_Widget::WIDGET_ADD . WPDA::get_current_user_login() ) );
2053 ?>";
2054 let wpda_wpnonce_qb = "<?php
2055 echo esc_attr( wp_create_nonce( 'wpda-query-builder-' . WPDA::get_current_user_id() ) );
2056 ?>";
2057 let wpda_wpnonce_refresh = "<?php
2058 echo esc_attr( wp_create_nonce( WPDA_Widget::WIDGET_REFRESH . WPDA::get_current_user_login() ) );
2059 ?>";
2060 let wpda_ajaxurl = "<?php
2061 echo esc_url( admin_url( 'admin-ajax.php' ) );
2062 ?>";
2063 let wpda_databases = '<?php
2064 // phpcs:disable WordPress.Security.EscapeOutput
2065 echo $this->get_databases();
2066 // phpcs:enable WordPress.Security.EscapeOutput
2067 ?>';
2068 let wpda_shared_dashboards = <?php
2069 echo json_encode( $this->shared_dashboards );
2070 // phpcs:ignore
2071 ?>;
2072
2073 function saveWidgetPositions() {} // Implemented in the premium version
2074 function saveDashBoard(callback) {
2075 saveWidgetPositions();
2076 jQuery.ajax({
2077 type: "POST",
2078 url: wpda_ajaxurl + "?action=wpda_save_dashboard",
2079 data: {
2080 wp_nonce: wpda_wpnonce_save,
2081 wpda_widgets: dashboardWidgets,
2082 wpda_positions: dashboardWidgetPosition,
2083 wpda_deleted: dashboardWidgetDeleted,
2084 wpda_tabname: "<?php
2085 echo esc_attr( $this->tab_name );
2086 ?>"
2087 }
2088 }).done(
2089 function(data) {
2090 dashboardWidgetDeleted = [];
2091 if (callback!==undefined) {
2092 callback();
2093 }
2094 }
2095 ).fail(
2096 function (msg) {
2097 console.log("WP Data Access error (saveDashBoard):", msg);
2098 }
2099 );
2100 }
2101 <?php
2102 ?>
2103 </script>
2104 <?php
2105 }
2106
2107 /**
2108 * Save dashboard and widgets
2109 *
2110 * @return void
2111 */
2112 public static function save() {
2113 $wp_nonce = ( isset( $_POST['wp_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wp_nonce'] ) ) : '' );
2114 if ( !wp_verify_nonce( $wp_nonce, static::DASHBOARD_SAVE . WPDA::get_current_user_login() ) ) {
2115 WPDA::sent_header( 'application/json' );
2116 static::msg( 'ERROR', 'Token expired, please refresh page' );
2117 wp_die();
2118 }
2119 // phpcs:disable WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
2120 $widgets = ( isset( $_POST['wpda_widgets'] ) ? WPDA::sanitize_text_field_array( $_POST['wpda_widgets'] ) : array() );
2121 // phpcs:enable WordPress.Security.ValidatedSanitizedInput.MissingUnslash, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
2122 $save = array();
2123 foreach ( $widgets as $widget ) {
2124 $save[$widget['widgetName']] = $widget;
2125 }
2126 update_user_meta( WPDA::get_current_user_id(), self::USER_DASHBOARD, $save );
2127 self::msg( 'SUCCESS', 'Widget succesfully saved' );
2128 wp_die();
2129 }
2130
2131 /**
2132 * Get list of all widgets
2133 *
2134 * @return void
2135 */
2136 public static function get_list() {
2137 $wp_nonce = ( isset( $_POST['wpda_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wpda_wpnonce'] ) ) : '' );
2138 if ( !wp_verify_nonce( $wp_nonce, WPDA_Widget::WIDGET_REFRESH . WPDA::get_current_user_login() ) ) {
2139 WPDA::sent_header( 'application/json' );
2140 static::msg( 'ERROR', 'Token expired, please refresh page' );
2141 wp_die();
2142 }
2143 // Placeholder: implemented in the premium version.
2144 echo '';
2145 wp_die();
2146 }
2147
2148 /**
2149 * Delete widget
2150 *
2151 * @return void
2152 */
2153 public static function delete_widget() {
2154 $wp_nonce = ( isset( $_POST['wpda_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wpda_wpnonce'] ) ) : '' );
2155 if ( !wp_verify_nonce( $wp_nonce, self::DASHBOARD_SAVE . WPDA::get_current_user_login() ) ) {
2156 WPDA::sent_header( 'application/json' );
2157 static::msg( 'ERROR', 'Token expired, please refresh page' );
2158 wp_die();
2159 }
2160 // Placeholder: implemented in the premium version.
2161 echo '';
2162 wp_die();
2163 }
2164
2165 /**
2166 * Edit chart
2167 *
2168 * @return void
2169 */
2170 public static function edit_chart() {
2171 $wp_nonce = ( isset( $_POST['wpda_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wpda_wpnonce'] ) ) : '' );
2172 if ( !wp_verify_nonce( $wp_nonce, WPDA_Widget::WIDGET_REFRESH . WPDA::get_current_user_login() ) ) {
2173 WPDA::sent_header( 'application/json' );
2174 static::msg( 'ERROR', 'Token expired, please refresh page' );
2175 wp_die();
2176 }
2177 // Placeholder: implemented in the premium version.
2178 echo '';
2179 wp_die();
2180 }
2181
2182 /**
2183 * Load widget via ajax
2184 *
2185 * @return void
2186 */
2187 public static function load_widget() {
2188 $wp_nonce = ( isset( $_POST['wpda_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wpda_wpnonce'] ) ) : '' );
2189 if ( !wp_verify_nonce( $wp_nonce, WPDA_Widget::WIDGET_REFRESH . WPDA::get_current_user_login() ) ) {
2190 WPDA::sent_header( 'application/json' );
2191 static::msg( 'ERROR', 'Token expired, please refresh page' );
2192 wp_die();
2193 }
2194 // Placeholder: implemented in the premium version.
2195 echo '';
2196 wp_die();
2197 }
2198
2199 /**
2200 * Construct tab name
2201 *
2202 * @param string $tab_name Original tab name.
2203 * @return string
2204 */
2205 public static function get_tab_name( $tab_name ) {
2206 return '_' . str_replace( ' ', '_', $tab_name );
2207 }
2208
2209 /**
2210 * Permanently remove plugin info message from dashboard
2211 *
2212 * @return void
2213 */
2214 public static function remove_new_dashboard_message() {
2215 WPDA::sent_header( 'text/html; charset=UTF-8' );
2216 $wp_nonce = ( isset( $_POST['wp_nonce'] ) ? sanitize_text_field( wp_unslash( $_POST['wp_nonce'] ) ) : '' );
2217 if ( wp_verify_nonce( $wp_nonce, self::DASHBOARD_SAVE . WPDA::get_current_user_login() ) ) {
2218 // Permanently remove message from dashboard toolbar.
2219 update_user_meta( WPDA::get_current_user_id(), self::USER_NEW_MESSAGE, 'removed' );
2220 echo 'OK';
2221 } else {
2222 echo 'FAILED';
2223 }
2224 wp_die();
2225 }
2226
2227 /**
2228 * Construct ajax message
2229 *
2230 * @param string $status Status.
2231 * @param string $msg Message.
2232 * @return false|string
2233 */
2234 public static function msg( $status, $msg ) {
2235 $error = array(
2236 'status' => esc_attr( $status ),
2237 'msg' => $msg,
2238 );
2239 echo json_encode( $error );
2240 // phpcs:ignore WordPress.Security.EscapeOutput
2241 }
2242
2243 private function get_promotions( $tool ) {
2244 switch ( $tool ) {
2245 case 'publisher':
2246 case 'projects':
2247 case 'templates':
2248 case 'charts':
2249 $promotions = array(array(
2250 'This tool will be transitioned to the new App Builder. Please migrate on time.' => array(null, 'fa-lightbulb'),
2251 ));
2252 break;
2253 default:
2254 $promotions = array();
2255 }
2256 if ( count( $promotions ) > 0 ) {
2257 // phpcs:ignore -- 8.1 proof
2258 $promotion_index = random_int( 0, count( $promotions ) - 1 );
2259 $promotion = $promotions[$promotion_index];
2260 $promotion_text = key( $promotion );
2261 $promotion_url = $promotion[$promotion_text][0];
2262 $promotion_icon = $promotion[$promotion_text][1];
2263 ?>
2264 <div class="wpda-promotion">
2265 <span><i class="fas <?php
2266 echo esc_attr( $promotion_icon );
2267 ?>"></i></span>
2268 <?php
2269 echo esc_attr( $promotion_text );
2270 ?>
2271 <?php
2272 if ( null !== $promotion_url ) {
2273 ?>
2274 <a href="<?php
2275 echo esc_url( $promotion_url );
2276 ?>" target="_blank">Read more...</a>
2277 <?php
2278 }
2279 ?>
2280 </div>
2281 <?php
2282 }
2283 }
2284
2285 }
2286
2287 // phpcs:enable WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing