PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.7.9
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.7.9
4.0.7 4.0.6 4.0.5 4.0.4 4.0.3 3.0.5 3.0.6 3.0.7 3.0.8 3.0.9 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.10.1 3.10.10 3.10.11 3.10.12 3.10.13 3.10.14 3.10.15 3.10.2 3.10.3 3.10.4 All 148 releases
← All changes | classes/Visualizer/Render/Layout.php +221 -482 4.0.73.7.9 View file →
@@ -27,15 +27,8 @@
27 27 */
28 28 class Visualizer_Render_Layout extends Visualizer_Render {
29 29
30 30 /**
31 - * Fallback time for live update option.
32 - *
33 - * @var float
34 - */
35 - public static $live_option_fallback_hour = 0.16; // 10 minutes
36 -
37 - /**
38 31 * Renders template.
39 32 *
40 33 * @since 1.0.0
41 34 *
@@ -60,19 +53,9 @@
60 53 *
61 54 * @access public
62 55 */
63 56 public static function _renderDbQuery( $args ) {
64 - global $wpdb;
65 57 $query = $args[1];
66 - if ( ! $query ) {
67 - $query = '
68 -/* List Posts published per. month */
69 -SELECT CONCAT( YEAR(post_date), "/", MONTH(post_date) ) as date, COUNT(*) AS post_count
70 -FROM ' . $wpdb->prefix . 'posts
71 -WHERE post_type = "post" AND post_status = "publish"
72 -GROUP BY YEAR(post_date), MONTH(post_date)
73 -ORDER BY YEAR(post_date) DESC, MONTH(post_date) DESC;';
74 - }
75 58 ?>
76 59 <div id='visualizer-db-query' style="display: none">
77 60 <div class="visualizer-db-query-form">
78 61 <div>
@@ -88,29 +71,10 @@
88 71 </div>
89 72 </div>
90 73 <div class='db-wizard-hints'>
91 74 <ul>
92 - <li><?php echo __( 'Your database prefix is:', 'visualizer' ); ?> <span class="visualizer-emboss"><?php echo $wpdb->prefix; ?></span></li>
93 - <li>
94 - <?php
95 - echo sprintf(
96 - // translators: %1$s - HTML link tag, %2$s - HTML closing link tag.
97 - __( 'For examples of queries and links to resources that you can use with this feature, please click %1$shere%2$s', 'visualizer' ),
98 - '<a href="' . VISUALIZER_DB_QUERY_DOC_URL . '" target="_blank">',
99 - '</a>'
100 - );
101 - ?>
102 - </li>
103 - <li>
104 - <?php
105 - echo sprintf(
106 - // translators: %1$s - HTML link tag, %2$s - HTML closing link tag.
107 - __( 'Use %1$sShift+Space%2$s for autocompleting keywords or table names.', 'visualizer' ),
108 - '<span class="visualizer-emboss">',
109 - '</span>'
110 - );
111 - ?>
112 - </li>
75 + <li><?php echo sprintf( __( 'For examples of queries and links to resources that you can use with this feature, please click %1$shere%2$s', 'visualizer' ), '<a href="' . VISUALIZER_DB_QUERY_DOC_URL . '" target="_blank">', '</a>' ); ?></li>
76 + <li><?php echo sprintf( __( 'Use %1$sControl+Space%2$s for autocompleting keywords or table names.', 'visualizer' ), '<span class="visualizer-emboss">', '</span>' ); ?></li>
113 77 <?php do_action( 'visualizer_db_query_add_hints', $args ); ?>
114 78 </ul>
115 79 </div>
116 80 <div class='db-wizard-results'></div>
@@ -140,9 +104,9 @@
140 104 </tr>
141 105 </thead>
142 106 <tfoot>
143 107 </tfoot>
144 - <tbody>
108 + <tbody>
145 109 <?php
146 110 foreach ( $results as $result ) {
147 111 echo '<tr>';
148 112 foreach ( $result as $r ) {
@@ -174,9 +138,8 @@
174 138 admin_url( 'admin-ajax.php' )
175 139 )
176 140 );
177 141
178 - $is_wc_source = get_post_meta( $id, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE, true );
179 142 $url = get_post_meta( $id, Visualizer_Plugin::CF_JSON_URL, true );
180 143 $root = get_post_meta( $id, Visualizer_Plugin::CF_JSON_ROOT, true );
181 144 $paging = get_post_meta( $id, Visualizer_Plugin::CF_JSON_PAGING, true );
182 145 $headers = get_post_meta( $id, Visualizer_Plugin::CF_JSON_HEADERS, true );
@@ -197,18 +160,9 @@
197 160 <div>
198 161 <form id="json-endpoint-form">
199 162 <div class="json-wizard-hints">
200 163 <ul class="info">
201 - <li>
202 - <?php
203 - echo sprintf(
204 - // translators: %1$s - HTML link tag, %2$s - HTML closing link tag.
205 - __( 'If you want to add authentication or headers to the endpoint or change the request in any way, please refer to our document %1$shere%2$s.', 'visualizer' ),
206 - '<a href="https://docs.themeisle.com/article/1043-visualizer-how-to-extend-rest-endpoints-with-json-response" target="_blank">',
207 - '</a>'
208 - );
209 - ?>
210 - </li>
164 + <li><?php echo sprintf( __( 'If you want to add authentication or headers to the endpoint or change the request in any way, please refer to our document %1$shere%2$s.', 'visualizer' ), '<a href="https://docs.themeisle.com/article/1043-visualizer-how-to-extend-rest-endpoints-with-json-response" target="_blank">', '</a>' ); ?></li>
211 165 </ul>
212 166 </div>
213 167
214 168 <input
@@ -216,13 +170,11 @@
216 170 id="vz-import-json-url"
217 171 name="url"
218 172 value="<?php echo esc_url( $url ); ?>"
219 173 placeholder="<?php esc_html_e( 'Please enter the URL', 'visualizer' ); ?>"
220 - class="visualizer-input json-form-element"
221 - <?php echo $is_wc_source ? 'readonly' : ''; ?>
222 - >
174 + class="visualizer-input json-form-element">
223 175 <button class="button button-secondary button-small" id="visualizer-json-fetch"><?php esc_html_e( 'Fetch Endpoint', 'visualizer' ); ?></button>
224 -
176 +
225 177 <div class="visualizer-json-subform">
226 178 <h3 class="viz-substep <?php echo $headers_open ? 'open' : ''; ?>"><?php _e( 'Headers', 'visualizer' ); ?></h3>
227 179 <div class="json-wizard-headers">
228 180 <div class="json-wizard-header">
@@ -243,9 +195,9 @@
243 195 id="vz-import-json-username"
244 196 name="username"
245 197 value="<?php echo ( array_key_exists( 'auth', $headers ) && array_key_exists( 'username', $headers['auth'] ) ? $headers['auth']['username'] : '' ); ?>"
246 198 placeholder="<?php esc_html_e( 'Username/Access Key', 'visualizer' ); ?>"
247 - class="json-form-element">
199 + class="json-form-element">
248 200 &
249 201 <input
250 202 type="password"
251 203 id="vz-import-json-password"
@@ -251,9 +203,9 @@
251 203 id="vz-import-json-password"
252 204 name="password"
253 205 value="<?php echo ( array_key_exists( 'auth', $headers ) && array_key_exists( 'password', $headers['auth'] ) ? $headers['auth']['password'] : '' ); ?>"
254 206 placeholder="<?php esc_html_e( 'Password/Secret Key', 'visualizer' ); ?>"
255 - class="json-form-element">
207 + class="json-form-element">
256 208 </div>
257 209 </div>
258 210 <div class="json-wizard-header">
259 211 <div></div>
@@ -359,9 +311,9 @@
359 311 $action = esc_url(
360 312 add_query_arg(
361 313 array(
362 314 'action' => Visualizer_Plugin::ACTION_UPLOAD_DATA,
363 - 'nonce' => wp_create_nonce( 'visualizer-upload-data' ),
315 + 'nonce' => wp_create_nonce(),
364 316 'chart' => $chart_id,
365 317 ),
366 318 admin_url( 'admin-ajax.php' )
367 319 )
@@ -389,8 +341,9 @@
389 341 <?php Visualizer_Render_Layout::show( 'text-editor', $chart_id ); ?>
390 342
391 343 </div>
392 344 <?php
345 +
393 346 }
394 347
395 348 /**
396 349 * Show the text area editor.
@@ -463,9 +416,9 @@
463 416 }
464 417 ?>
465 418 </tr>
466 419 </thead>
467 - <tbody>
420 + <tbody>
468 421 <tr>
469 422 <th><?php _e( 'Data Type', 'visualizer' ); ?></th>
470 423 <?php
471 424 $index = 0;
@@ -530,9 +483,9 @@
530 483 private static function _renderPermissions( $args ) {
531 484 $chart_id = $args[1];
532 485
533 486 // ignore for unit tests because Travis throws the error "Indirect modification of overloaded property Visualizer_Render_Page_Data::$permissions has no effect".
534 - if ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) {
487 + if ( defined( 'WP_TESTS_DOMAIN' ) ) {
535 488 return;
536 489 }
537 490
538 491 $permissions = apply_filters( 'visualizer_pro_get_permissions', null, $chart_id );
@@ -615,9 +568,9 @@
615 568 true,
616 569 array( 'visualizer-permission', 'visualizer-permission-specific', 'visualizer-permission-edit-specific' )
617 570 );
618 571 Visualizer_Render_Sidebar::_renderSectionEnd();
619 - echo apply_filters( 'visualizer_pro_upsell', '', 'chart-permissions', 'https://docs.themeisle.com/article/1280-how-to-customize-permissions' );
572 + echo apply_filters( 'visualizer_pro_upsell', '', 'chart-permissions' );
620 573 echo '</div>';
621 574 Visualizer_Render_Sidebar::_renderGroupEnd();
622 575 }
623 576
@@ -626,14 +579,9 @@
626 579 *
627 580 * @access public
628 581 */
629 582 public static function _renderTabAdvanced( $args ) {
630 - $chart_id = $args[1];
631 - $sidebar = $args[2];
632 -
633 - $chart_options = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true );
634 - $backend_title = isset( $chart_options['backend-title'] ) && ! empty( $chart_options['backend-title'] ) ? $chart_options['backend-title'] : '';
635 -
583 + $sidebar = $args[2];
636 584 ?>
637 585 <ul class="viz-group-wrapper full-height">
638 586 <li class="viz-group open" id="vz-chart-settings">
639 587 <ul class="viz-group-content">
@@ -639,9 +587,8 @@
639 587 <ul class="viz-group-content">
640 588 <ul class="viz-group-wrapper">
641 589 <form id="settings-form" action="<?php echo esc_url( add_query_arg( 'nonce', wp_create_nonce() ) ); ?>" method="post">
642 590 <input type="hidden" id="chart-img" name="chart-img">
643 - <input type="hidden" id="backend-title" name="backend-title" value="<?php echo esc_html( $backend_title ); ?>">
644 591 <?php echo $sidebar; ?>
645 592 <?php self::_renderPermissions( $args ); ?>
646 593 <input type="hidden" name="save" value="1">
647 594 </form>
@@ -687,22 +634,12 @@
687 634 <h4><span class="dashicons dashicons-editor-help"></span><a href="<?php echo VISUALIZER_MAIN_DOC; ?>" target="_blank"><?php _e( 'Main documentation page', 'visualizer' ); ?></a></h4>
688 635 <h4><span class="dashicons dashicons-media-code"></span><a href="<?php echo VISUALIZER_CODE_SNIPPETS_URL; ?>" target="_blank"><?php _e( 'Custom code snippets', 'visualizer' ); ?></a></h4>
689 636 <?php
690 637 Visualizer_Render_Sidebar::_renderSectionEnd();
691 - // translators: %s - the chart type.
692 638 Visualizer_Render_Sidebar::_renderSectionStart( sprintf( __( '%s chart', 'visualizer' ), ucwords( $displayType ) ), true );
693 639 ?>
694 640 <h4><span class="dashicons dashicons-video-alt2"></span>&nbsp;<a href="<?php echo str_replace( '#', "$type-chart", VISUALIZER_DEMO_URL ); ?>" target="_blank"><?php _e( 'View demo', 'visualizer' ); ?></a></h4>
695 - <h4><span class="dashicons dashicons-search"></span><a href="<?php echo str_replace( '#', $type, VISUALIZER_DOC_COLLECTION ); ?>" target="_blank">
696 - <?php
697 - echo sprintf(
698 - // translators: %s - the chart type.
699 - __( 'Articles containing "%s"', 'visualizer' ),
700 - $displayType
701 - );
702 - ?>
703 - </a>
704 - </h4>
641 + <h4><span class="dashicons dashicons-search"></span><a href="<?php echo str_replace( '#', $type, VISUALIZER_DOC_COLLECTION ); ?>" target="_blank"><?php echo sprintf( __( 'Articles containing "%s"', 'visualizer' ), $displayType ); ?></a></h4>
705 642 <?php
706 643 Visualizer_Render_Sidebar::_renderSectionEnd();
707 644 Visualizer_Render_Sidebar::_renderGroupEnd();
708 645 ?>
@@ -724,9 +661,9 @@
724 661 $upload_link = esc_url(
725 662 add_query_arg(
726 663 array(
727 664 'action' => Visualizer_Plugin::ACTION_UPLOAD_DATA,
728 - 'nonce' => wp_create_nonce( 'visualizer-upload-data' ),
665 + 'nonce' => wp_create_nonce(),
729 666 'chart' => $chart_id,
730 667 ),
731 668 admin_url( 'admin-ajax.php' )
732 669 )
@@ -732,14 +669,9 @@
732 669 )
733 670 );
734 671
735 672 // this will allow us to open the correct source tab by default.
736 - $source_of_chart = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true ) );
737 - // Import from woocommerce report.
738 - $is_woocommerce_source = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE, true ) );
739 - if ( ! empty( $is_woocommerce_source ) ) {
740 - $source_of_chart .= '_wc';
741 - }
673 + $source_of_chart = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true ) );
742 674 // both import from wp and import from db have the same source so we need to differentiate.
743 675 $filter_config = get_post_meta( $chart_id, Visualizer_Plugin::CF_FILTER_CONFIG, true );
744 676 // if filter config is present, then its import from wp.
745 677 if ( ! empty( $filter_config ) ) {
@@ -745,12 +677,9 @@
745 677 if ( ! empty( $filter_config ) ) {
746 678 $source_of_chart .= '_wp';
747 679 }
748 680 $editor_type = get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITOR, true );
749 - if (
750 - $editor_type ||
751 - ! Visualizer_Module::is_pro() // Use Manual Source for non-pro users since it is the only unlocked source.
752 - ) {
681 + if ( $editor_type ) {
753 682 $source_of_chart = 'visualizer_source_manual';
754 683 }
755 684
756 685 $type = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true );
@@ -759,208 +688,125 @@
759 688 <ul class="viz-group-wrapper full-height">
760 689 <li class="viz-group open" id="vz-chart-source">
761 690 <ul class="viz-group-content">
762 691 <ul class="viz-group-wrapper">
763 - <!-- manual -->
764 - <li class="viz-group visualizer_source_manual">
765 - <h2 class="viz-group-title viz-sub-group visualizer-editor-tab" data-current="chart" role="button" tabindex="0"><?php _e( 'Manual Data', 'visualizer' ); ?></h2>
766 - <div class="viz-group-content edit-data-content">
767 - <form id="editor-form" action="<?php echo $upload_link; ?>" method="post" target="thehole">
768 - <input type="hidden" id="chart-data" name="chart_data">
769 - <input type="hidden" id="chart-data-src" name="chart_data_src">
770 -
771 - <?php if ( Visualizer_Module::can_show_feature( 'simple-editor' ) ) { ?>
772 - <div>
773 - <p class="viz-group-description viz-editor-selection">
774 - <?php _e( 'Use the', 'visualizer' ); ?>
775 - <select name="editor-type" id="viz-editor-type">
776 - <?php
777 - if ( empty( $editor_type ) ) {
778 - $editor_type = Visualizer_Module::is_pro() ? 'excel' : 'text';
779 - }
780 - foreach ( apply_filters( 'visualizer_editors', array( 'text' => __( 'Text', 'visualizer' ), 'table' => __( 'Simple', 'visualizer' ) ) ) as $e_type => $e_label ) {
781 - ?>
782 - <option value="<?php echo $e_type; ?>" <?php selected( $editor_type, $e_type ); ?> ><?php echo $e_label; ?></option>
783 - <?php } ?>
784 - </select>
785 - <?php _e( 'editor to manually edit the chart data.', 'visualizer' ); ?>
786 - </p>
787 - <input type="button" id="editor-undo" class="button button-secondary" style="display: none" value="<?php _e( 'Undo Changes', 'visualizer' ); ?>">
788 - <input type="button" id="editor-button" class="button button-primary "
789 - value="<?php _e( 'Edit Data', 'visualizer' ); ?>" data-current="chart"
790 - data-t-editor="<?php _e( 'Show Chart', 'visualizer' ); ?>"
791 - data-t-chart="<?php _e( 'Edit Data', 'visualizer' ); ?>"
792 - >
793 - <p class="viz-group-description viz-info-msg" style="display:none"><?php echo sprintf( __( 'Please make sure you click \'Show Chart\' before you save the chart.', 'visualizer' ) ); ?></p>
692 + <!-- import from file -->
693 + <li class="viz-group visualizer_source_csv">
694 + <h2 class="viz-group-title viz-sub-group visualizer-src-tab"><?php _e( 'Import data from file', 'visualizer' ); ?></h2>
695 + <div class="viz-group-content">
696 + <p class="viz-group-description"><?php esc_html_e( 'Select and upload your data CSV file here. The first row of the CSV file should contain the column headings. The second one should contain series type (string, number, boolean, date, datetime, timeofday).', 'visualizer' ); ?></p>
697 + <p class="viz-group-description viz-info-msg"><b><?php echo sprintf( __( 'If you are unsure about how to format your data CSV then please take a look at this sample: %1$s %2$s%3$s. If you are using non-English characters, please make sure you save the file in UTF-8 encoding.', 'visualizer' ), '<a href="' . VISUALIZER_ABSURL . 'samples/' . $type . '.csv" target="_blank">', $type, '.csv</a>' ); ?></b></p>
698 + <form id="vz-csv-file-form" action="<?php echo $upload_link; ?>" method="post"
699 + target="thehole" enctype="multipart/form-data">
700 + <input type="hidden" id="remote-data" name="remote_data">
701 + <div class="">
702 + <input type="file" id="csv-file" name="local_data">
794 703 </div>
795 - <?php } else { ?>
796 - <input type="button" id="editor-undo" class="button button-secondary" style="display: none" value="<?php _e( 'Undo Changes', 'visualizer' ); ?>">
797 - <input type="button" id="editor-chart-button" class="button button-primary "
798 - value="<?php _e( 'View Editor', 'visualizer' ); ?>" data-current="chart"
799 - data-t-editor="<?php _e( 'Show Chart', 'visualizer' ); ?>"
800 - data-t-chart="<?php _e( 'View Editor', 'visualizer' ); ?>"
801 - >
802 - <p class="viz-group-description viz-info-msg" style="display:none"><?php echo sprintf( __( 'Please make sure you click \'Show Chart\' before you save the chart.', 'visualizer' ) ); ?></p>
803 - <?php } ?>
704 + <input type="button" class="button button-primary" id="vz-import-file"
705 + value="<?php _e( 'Import', 'visualizer' ); ?>">
804 706 </form>
805 707 </div>
806 708 </li>
807 -
808 - <!-- import from file -->
809 - <li class="viz-group visualizer_source_csv <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'import-file' ); ?> ">
810 - <h2 class="viz-group-title viz-sub-group visualizer-src-tab" role="button" tabindex="0"><?php _e( 'Import data from file', 'visualizer' ); ?><span class="dashicons dashicons-lock"></span></h2>
811 - <div class="viz-group-content">
812 - <div>
813 - <p class="viz-group-description"><?php esc_html_e( 'Select and upload your data file here. Supported formats: CSV, XLSX. The first row should contain the column headings. The second row should contain the series type (string, number, boolean, date, datetime, timeofday).', 'visualizer' ); ?></p>
814 - <p class="viz-group-description viz-info-msg">
815 - <b>
816 - <?php
817 - echo sprintf(
818 - // translators: $s - the chart type with the link attached.
819 - __( 'If you are unsure about how to format your data CSV then please take a look at this sample: %s. If you are using non-English characters, please make sure you save the file in UTF-8 encoding.', 'visualizer' ),
820 - '<a href="' . VISUALIZER_ABSURL . 'samples/' . $type . '.csv" target="_blank">' . $type . '.csv</a>'
821 - );
822 - ?>
823 - </b>
824 - </p>
825 - <form id="vz-csv-file-form" action="<?php echo $upload_link; ?>" method="post"
826 - target="thehole" enctype="multipart/form-data">
827 - <input type="hidden" id="remote-data" name="remote_data">
828 - <div class="">
829 - <input type="file" id="csv-file" name="local_data" accept=".csv,.xlsx">
830 - </div>
831 - <input type="button" class="button button-primary" id="vz-import-file"
832 - value="<?php _e( 'Import', 'visualizer' ); ?>">
833 - </form>
834 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-file' ); ?>
835 - </div>
836 - </div>
837 - </li>
838 709 <!-- import from url -->
839 - <li class="viz-group visualizer-import-url visualizer_source_csv_remote visualizer_source_json <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'import-url' ); ?> ">
840 - <h2 class="viz-group-title viz-sub-group visualizer-src-tab" role="button" tabindex="0"><?php _e( 'Import data from URL', 'visualizer' ); ?><span class="dashicons dashicons-lock"></span></h2>
710 + <li class="viz-group visualizer-import-url visualizer_source_csv_remote visualizer_source_json">
711 + <h2 class="viz-group-title viz-sub-group visualizer-src-tab"><?php _e( 'Import data from URL', 'visualizer' ); ?></h2>
841 712 <ul class="viz-group-content">
842 713 <!-- import from csv url -->
843 714 <li class="viz-subsection">
844 - <span class="viz-section-title" role="button" tabindex="0"><?php _e( 'Import from CSV / XLSX', 'visualizer' ); ?></span>
845 - <div class="only-pro-anchor">
846 - <div class="viz-section-items section-items">
847 - <p class="viz-group-description">
715 + <span class="viz-section-title"><?php _e( 'Import from CSV', 'visualizer' ); ?></span>
716 + <div class="viz-section-items section-items">
717 + <p class="viz-group-description"><?php echo sprintf( __( 'You can use this to import data from a remote CSV file or %1$sGoogle Spreadsheet%2$s.', 'visualizer' ), '<a href="https://docs.themeisle.com/article/607-how-can-i-populate-data-from-google-spreadsheet" target="_blank" >', '</a>' ); ?> </p>
718 + <p class="viz-group-description viz-info-msg"><b><?php echo sprintf( __( 'If you are unsure about how to format your data CSV then please take a look at this sample: %1$s %2$s%3$s. If you are using non-English characters, please make sure you save the file in UTF-8 encoding.', 'visualizer' ), '<a href="' . VISUALIZER_ABSURL . 'samples/' . $type . '.csv" target="_blank">', $type, '.csv</a>' ); ?></b></p>
719 + <form id="vz-one-time-import" action="<?php echo $upload_link; ?>" method="post"
720 + target="thehole" enctype="multipart/form-data">
721 + <div class="remote-file-section">
722 + <input type="url" id="vz-schedule-url" name="remote_data" value="<?php echo esc_attr( get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_URL, true ) ); ?>" placeholder="<?php esc_html_e( 'Please enter the URL of CSV file', 'visualizer' ); ?>" class="visualizer-input visualizer-remote-url">
723 + </div>
724 + <select name="vz-import-time" id="vz-import-time" class="visualizer-select">
725 + <?php
726 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_SCHEDULE, true );
727 + $schedules = apply_filters(
728 + 'visualizer_chart_schedules', array(
729 + '-1' => __( 'One-time', 'visualizer' ),
730 + ),
731 + 'csv',
732 + $chart_id
733 + );
734 + foreach ( $schedules as $num => $name ) {
735 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
736 + $extra = $num == $hours ? 'selected' : '';
737 + ?>
738 + <option value="<?php echo $num; ?>" <?php echo $extra; ?>><?php echo $name; ?></option>
848 739 <?php
849 - echo sprintf(
850 - // translators: %1$s - HTML link tag, %2$s - HTML closing link tag.
851 - __( 'You can use this to import data from a remote CSV or Excel (XLSX) file, or %1$sGoogle Spreadsheet%2$s.', 'visualizer' ),
852 - '<a href="https://docs.themeisle.com/article/607-how-can-i-populate-data-from-google-spreadsheet" target="_blank" >',
853 - '</a>'
854 - );
740 + }
741 + do_action( 'visualizer_chart_schedules_spl', 'csv', $chart_id, 1 );
742 + ?>
743 + </select>
744 +
745 + <?php
746 + if ( ! Visualizer_Module::is_pro() ) {
855 747 ?>
856 - </p>
857 - <p class="viz-group-description viz-info-msg">
858 - <b>
859 - <?php
860 - echo sprintf(
861 - // translators: %s - the chart type with the link attached.
862 - __( 'If you are unsure about how to format your data CSV then please take a look at this sample: %s. If you are using non-English characters, please make sure you save the file in UTF-8 encoding.', 'visualizer' ),
863 - '<a href="' . VISUALIZER_ABSURL . 'samples/' . $type . '.csv" target="_blank">' . $type . '.csv</a>'
864 - );
865 - ?>
866 - </b>
867 - </p>
868 - <form id="vz-one-time-import" action="<?php echo $upload_link; ?>" method="post"
869 - target="thehole" enctype="multipart/form-data">
870 - <div class="remote-file-section">
871 - <input type="url" id="vz-schedule-url" name="remote_data" value="<?php echo esc_attr( get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_URL, true ) ); ?>" placeholder="<?php esc_html_e( 'Please enter the URL of a CSV or XLSX file', 'visualizer' ); ?>" class="visualizer-input visualizer-remote-url">
872 - </div>
873 - <select name="vz-import-time" id="vz-import-time" class="visualizer-select">
748 + <input type="button" id="view-remote-file" class="button button-primary" value="<?php _e( 'Import', 'visualizer' ); ?>">
874 749 <?php
875 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_SCHEDULE, true );
876 - $schedules = apply_filters(
877 - 'visualizer_chart_schedules', array(
878 - '-1' => __( 'One-time', 'visualizer' ),
879 - ),
880 - 'csv',
881 - $chart_id
882 - );
883 - foreach ( $schedules as $num => $name ) {
884 - // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
885 - $extra = self::is_hour_selected( $hours, $num ) ? 'selected' : '';
886 - ?>
887 - <option value="<?php echo esc_attr( $num ); ?>" <?php echo esc_attr( $extra ); ?>><?php echo esc_html( $name ); ?></option>
888 - <?php
889 - }
890 - do_action( 'visualizer_chart_schedules_spl', 'csv', $chart_id, 1 );
750 + } else {
891 751 ?>
892 - </select>
893 -
752 + <input type="button" id="vz-save-schedule" class="button button-primary" value="<?php _e( 'Import & Save schedule', 'visualizer' ); ?>">
894 753 <?php
895 - if ( ! Visualizer_Module::is_pro() ) {
896 - ?>
897 - <input type="button" id="view-remote-file" class="button button-primary" value="<?php _e( 'Import', 'visualizer' ); ?>">
898 - <?php
899 - } else {
900 - ?>
901 - <input type="button" id="vz-save-schedule" class="button button-primary" value="<?php _e( 'Import & Save schedule', 'visualizer' ); ?>">
902 - <?php
903 - }
904 - ?>
905 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-url' ); ?>
906 - </form>
907 - </div>
754 + }
755 + ?>
756 + </form>
908 757 </div>
909 758 </li>
910 759 <!-- import from json url -->
911 760 <li class="viz-subsection">
912 - <span class="viz-section-title visualizer_source_json" role="button" tabindex="0"><?php _e( 'Import from JSON', 'visualizer' ); ?></span>
913 - <div class="only-pro-anchor">
914 - <div class="viz-section-items section-items">
915 - <p class="viz-group-description"><?php _e( 'You can choose here to import/synchronize your chart data with a remote JSON source. For more info check <a href="https://docs.themeisle.com/article/1052-how-to-generate-charts-from-json-data-rest-endpoints" target="_blank" >this</a> tutorial', 'visualizer' ); ?></p>
916 - <form id="vz-import-json" action="<?php echo $upload_link; ?>" method="post" target="thehole" enctype="multipart/form-data">
917 - <div class="remote-file-section">
761 + <span class="viz-section-title visualizer_source_json"><?php _e( 'Import from JSON', 'visualizer' ); ?></span>
762 + <div class="viz-section-items section-items">
763 + <p class="viz-group-description"><?php _e( 'You can choose here to import/synchronize your chart data with a remote JSON source. For more info check <a href="https://docs.themeisle.com/article/1052-how-to-generate-charts-from-json-data-rest-endpoints" target="_blank" >this</a> tutorial', 'visualizer' ); ?></p>
764 + <form id="vz-import-json" action="<?php echo $upload_link; ?>" method="post" target="thehole" enctype="multipart/form-data">
765 + <div class="remote-file-section">
766 + <?php
767 + $bttn_label = 'visualizer_source_json' === $source_of_chart ? __( 'Modify Parameters', 'visualizer' ) : __( 'Create Parameters', 'visualizer' );
768 + if ( Visualizer_Module::is_pro() ) {
769 + ?>
770 + <p class="viz-group-description"><?php _e( 'How often do you want to check the URL', 'visualizer' ); ?></p>
771 + <select name="time" id="vz-json-time" class="visualizer-select json-form-element" data-chart="<?php echo $chart_id; ?>">
918 772 <?php
919 - $bttn_label = 'visualizer_source_json' === $source_of_chart ? __( 'Modify Parameters', 'visualizer' ) : __( 'Create Parameters', 'visualizer' );
920 - if ( Visualizer_Module::is_pro() ) {
773 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
774 + $schedules = apply_filters(
775 + 'visualizer_chart_schedules', array(
776 + '-1' => __( 'One-time', 'visualizer' ),
777 + ),
778 + 'json',
779 + $chart_id
780 + );
781 + foreach ( $schedules as $num => $name ) {
782 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
783 + $extra = $num == $hours ? 'selected' : '';
921 784 ?>
922 - <p class="viz-group-description"><?php _e( 'How often do you want to check the URL', 'visualizer' ); ?></p>
923 - <select name="time" id="vz-json-time" class="visualizer-select json-form-element" data-chart="<?php echo $chart_id; ?>">
785 + <option value="<?php echo $num; ?>" <?php echo $extra; ?>><?php echo $name; ?></option>
924 786 <?php
925 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
926 - $schedules = apply_filters(
927 - 'visualizer_chart_schedules', array(
928 - '-1' => __( 'One-time', 'visualizer' ),
929 - ),
930 - 'json',
931 - $chart_id
932 - );
933 - foreach ( $schedules as $num => $name ) {
934 - // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
935 - $extra = self::is_hour_selected( $hours, $num ) ? 'selected' : '';
936 - ?>
937 - <option value="<?php echo esc_attr( $num ); ?>" <?php echo esc_attr( $extra ); ?>><?php echo esc_html( $name ); ?></option>
938 - <?php
939 - }
940 - do_action( 'visualizer_chart_schedules_spl', 'json', $chart_id, 1 );
941 - ?>
942 - </select>
943 - <?php
944 787 }
788 + do_action( 'visualizer_chart_schedules_spl', 'json', $chart_id, 1 );
945 789 ?>
946 - </div>
790 + </select>
791 + <?php
792 + }
793 + ?>
794 + </div>
947 795
948 - <input type="button" id="json-chart-button" class="button button-secondary show-chart-toggle"
949 - value="<?php echo $bttn_label; ?>" data-current="chart"
950 - data-t-filter="<?php _e( 'Show Chart', 'visualizer' ); ?>"
951 - data-t-chart="<?php echo $bttn_label; ?>">
796 + <input type="button" id="json-chart-button" class="button button-secondary show-chart-toggle"
797 + value="<?php echo $bttn_label; ?>" data-current="chart"
798 + data-t-filter="<?php _e( 'Show Chart', 'visualizer' ); ?>"
799 + data-t-chart="<?php echo $bttn_label; ?>">
800 + <?php
801 + if ( Visualizer_Module::is_pro() ) {
802 + ?>
803 + <input type="button" id="json-chart-save-button" class="button button-primary "
804 + value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
952 805 <?php
953 - if ( Visualizer_Module::is_pro() ) {
954 - ?>
955 - <input type="button" id="json-chart-save-button" class="button button-primary "
956 - value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
957 - <?php
958 - }
959 - ?>
960 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-url' ); ?>
961 - </form>
962 - </div>
806 + }
807 + ?>
808 + </form>
963 809 </div>
964 810 </li>
965 811 </ul>
966 812 </li>
@@ -966,9 +812,9 @@
966 812 </li>
967 813 <!-- import from chart -->
968 814 <li class="viz-group viz-import-from-other <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature' ); ?>">
969 815 <h2 class="viz-group-title viz-sub-group"
970 - data-current="chart" role="button" tabindex="0"><?php _e( 'Import from other chart', 'visualizer' ); ?><span
816 + data-current="chart"><?php _e( 'Import from other chart', 'visualizer' ); ?><span
971 817 class="dashicons dashicons-lock"></span></h2>
972 818 <div class="viz-group-content edit-data-content">
973 819 <div>
974 820 <p class="viz-group-description"><?php _e( 'You can import here data from your previously created charts', 'visualizer' ); ?></p>
@@ -978,9 +824,9 @@
978 824 $fetch_link = esc_url(
979 825 add_query_arg(
980 826 array(
981 827 'action' => Visualizer_Module::is_pro() ? Visualizer_Pro::ACTION_FETCH_DATA : '',
982 - 'nonce' => Visualizer_Module::is_pro() ? wp_create_nonce( Visualizer_Pro::ACTION_FETCH_DATA ) : wp_create_nonce(),
828 + 'nonce' => wp_create_nonce(),
983 829 ),
984 830 admin_url( 'admin-ajax.php' )
985 831 )
986 832 );
@@ -1015,15 +861,11 @@
1015 861
1016 862 </select>
1017 863 </form>
1018 864 <input type="button" id="existing-chart" class="button button-primary"
1019 - value="<?php _e( 'Import Chart', 'visualizer' ); ?>"
1020 - data-viz-link="<?php echo $fetch_link; ?>">
1021 - <?php
1022 - if ( ! Visualizer_Module_Admin::proFeaturesEnabled() ) {
1023 - echo apply_filters( 'visualizer_pro_upsell', '', 'import-chart' );
1024 - }
1025 - ?>
865 + value="<?php _e( 'Import Chart', 'visualizer' ); ?>"
866 + data-viz-link="<?php echo $fetch_link; ?>">
867 + <?php echo apply_filters( 'visualizer_pro_upsell', '' ); ?>
1026 868 </div>
1027 869 </div>
1028 870 </li>
1029 871
@@ -1038,156 +880,48 @@
1038 880 )
1039 881 );
1040 882 ?>
1041 883 <!-- import from WordPress -->
1042 - <li class="viz-group visualizer_source_query_wp <?php echo esc_attr( apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'import-wp' ) ); ?> ">
1043 - <h2 class="viz-group-title viz-sub-group" role="button" tabindex="0"><?php _e( 'Import from WordPress', 'visualizer' ); ?><span
884 + <li class="viz-group visualizer_source_query_wp <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'import-wp' ); ?> ">
885 + <h2 class="viz-group-title viz-sub-group"><?php _e( 'Import from WordPress', 'visualizer' ); ?><span
1044 886 class="dashicons dashicons-lock"></span></h2>
1045 887 <div class="viz-group-content edit-data-content">
1046 888 <div>
1047 889 <p class="viz-group-description"><?php _e( 'You can import data from WordPress here.', 'visualizer' ); ?></p>
1048 - <form id="vz-filter-wizard" action="<?php echo esc_url( $save_filter ); ?>" method="post" target="thehole">
890 + <form id="vz-filter-wizard" action="<?php echo $save_filter; ?>" method="post" target="thehole">
891 + <p class="viz-group-description"><?php _e( 'How often do you want to refresh the data from WordPress.', 'visualizer' ); ?></p>
892 + <select name="refresh" id="vz-filter-import-time" class="visualizer-select">
1049 893 <?php
1050 - $is_wp_source = 'visualizer_source_query_wp' === $source_of_chart;
1051 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
1052 - $bttn_label = $is_wp_source ? '1. ' . __( 'Modify Data Source', 'visualizer' ) : '1. ' . __( 'Choose Data Source', 'visualizer' );
894 + $bttn_label = 'visualizer_source_query_wp' === $source_of_chart ? __( 'Modify Filter', 'visualizer' ) : __( 'Create Filter', 'visualizer' );
895 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
896 + $schedules = apply_filters(
897 + 'visualizer_chart_schedules', array(
898 + '-1' => __( 'One-time', 'visualizer' ),
899 + ),
900 + 'wp',
901 + $chart_id
902 + );
903 + foreach ( $schedules as $num => $name ) {
904 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
905 + $extra = $num == $hours ? 'selected' : '';
906 + ?>
907 + <option value="<?php echo $num; ?>" <?php echo $extra; ?>><?php echo $name; ?></option>
908 + <?php
909 + }
910 + do_action( 'visualizer_chart_schedules_spl', 'wp', $chart_id, 1 );
1053 911 ?>
912 + </select>
1054 913
1055 - <!-- Step 1: Choose / modify data source -->
1056 - <input type="button" id="filter-chart-button" class="button button-secondary show-chart-toggle vz-import-step-btn" value="<?php echo esc_attr( $bttn_label ); ?>" data-current="chart" data-t-filter="<?php esc_attr_e( 'Show Chart', 'visualizer' ); ?>" data-t-chart="<?php echo esc_attr( $bttn_label ); ?>">
1057 -
1058 - <!-- Step 2: Sync schedule toggle -->
1059 - <div id="vz-wp-sync-step">
1060 - <button type="button" id="vz-wp-sync-btn" class="vz-import-step-toggle" aria-expanded="<?php echo $is_wp_source ? 'true' : 'false'; ?>">
1061 - <?php echo '2. ' . __( 'Set Sync Schedule', 'visualizer' ); ?>
1062 - <span class="dashicons dashicons-arrow-down-alt2"></span>
1063 - </button>
1064 - <div id="vz-wp-sync-options"<?php echo $is_wp_source ? '' : ' style="display:none"'; ?>>
1065 - <select name="refresh" id="vz-filter-import-time" class="visualizer-select">
1066 - <?php
1067 - $schedules = apply_filters(
1068 - 'visualizer_chart_schedules', array(
1069 - '-1' => __( 'One-time', 'visualizer' ),
1070 - ),
1071 - 'wp',
1072 - $chart_id
1073 - );
1074 - foreach ( $schedules as $num => $name ) {
1075 - $extra = self::is_hour_selected( $hours, $num ) ? 'selected' : '';
1076 - ?>
1077 - <option value="<?php echo esc_attr( $num ); ?>" <?php echo esc_attr( $extra ); ?>><?php echo esc_html( $name ); ?></option>
1078 - <?php
1079 - }
1080 - do_action( 'visualizer_chart_schedules_spl', 'wp', $chart_id, 1 );
1081 - ?>
1082 - </select>
1083 - <input type="button" id="db-filter-save-button" class="button button-primary" value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
1084 - </div>
1085 - </div>
914 + <input type="button" id="filter-chart-button" class="button button-secondary show-chart-toggle" value="<?php echo $bttn_label; ?>" data-current="chart" data-t-filter="<?php _e( 'Show Chart', 'visualizer' ); ?>" data-t-chart="<?php echo $bttn_label; ?>">
915 + <input type="button" id="db-filter-save-button" class="button button-primary" value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
916 + <?php echo apply_filters( 'visualizer_pro_upsell', '', 'db-query' ); ?>
1086 917 </form>
1087 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-wp', 'https://docs.themeisle.com/article/1278-how-to-import-data-from-wordpress' ); ?>
918 + <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-wp' ); ?>
1088 919 </div>
1089 920 </div>
1090 921 </li>
1091 922
1092 - <!-- import from WooCommerce -->
1093 923 <?php
1094 - if ( class_exists( 'WooCommerce', false ) ) :
1095 - $wc_source = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_WOOCOMMERCE_SOURCE, true ) );
1096 - $wc_source_list = apply_filters(
1097 - 'visualizer_woocommerce_report_endpoints',
1098 - array(
1099 - array(
1100 - 'name' => esc_html__( 'Sales', 'visualizer' ),
1101 - 'endpoint' => esc_attr( 'sales' ),
1102 - ),
1103 - array(
1104 - 'name' => esc_html__( 'Top Sellers', 'visualizer' ),
1105 - 'endpoint' => esc_attr( 'top_sellers' ),
1106 - ),
1107 - array(
1108 - 'name' => esc_html__( 'Coupons Totals', 'visualizer' ),
1109 - 'endpoint' => esc_attr( 'coupons/totals' ),
1110 - ),
1111 - array(
1112 - 'name' => esc_html__( 'Customers Totals', 'visualizer' ),
1113 - 'endpoint' => esc_attr( 'customers/totals' ),
1114 - ),
1115 - array(
1116 - 'name' => esc_html__( 'Orders Totals', 'visualizer' ),
1117 - 'endpoint' => esc_attr( 'orders/totals' ),
1118 - ),
1119 - array(
1120 - 'name' => esc_html__( 'Products Totals', 'visualizer' ),
1121 - 'endpoint' => esc_attr( 'products/totals' ),
1122 - ),
1123 - array(
1124 - 'name' => esc_html__( 'Reviews Totals', 'visualizer' ),
1125 - 'endpoint' => esc_attr( 'reviews/totals' ),
1126 - ),
1127 - )
1128 - );
1129 - ?>
1130 - <li class="viz-group visualizer_woocommerce_source<?php echo 'visualizer_source_json_wc' === $source_of_chart ? ' open' : ''; ?> <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'import-wc-report' ); ?> ">
1131 - <h2 class="viz-group-title viz-sub-group" role="button" tabindex="0"><?php _e( 'Import from WooCommerce Reports', 'visualizer' ); ?><span class="dashicons dashicons-lock"></span></h2>
1132 - <div class="viz-group-content edit-data-content">
1133 - <div>
1134 - <p class="viz-group-description"><?php _e( 'You can choose here to import/synchronize your chart data with a WooCommerce report API. For more info check <a href="https://woocommerce.github.io/woocommerce-rest-api-docs/?shell#reports" target="_blank" >this</a> tutorial', 'visualizer' ); ?></p>
1135 - <form id="vz-import-woo-report" action="<?php echo $upload_link; ?>" method="post" target="thehole" enctype="multipart/form-data">
1136 - <div class="remote-file-section">
1137 - <?php
1138 - $bttn_label = 'visualizer_source_json_wc' === $source_of_chart ? __( 'Modify Parameters', 'visualizer' ) : __( 'Create Parameters', 'visualizer' );
1139 - ?>
1140 - <p class="viz-group-description"><?php _e( 'How often do you want to check the URL', 'visualizer' ); ?></p>
1141 - <select name="time" id="vz-woo-time" class="visualizer-select json-form-element" data-chart="<?php echo $chart_id; ?>">
1142 - <?php
1143 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
1144 - $schedules = apply_filters(
1145 - 'visualizer_chart_schedules', array(
1146 - '-1' => __( 'One-time', 'visualizer' ),
1147 - ),
1148 - 'json',
1149 - $chart_id
1150 - );
1151 - foreach ( $schedules as $num => $name ) {
1152 - $extra = self::is_hour_selected( $hours, $num ) ? 'selected' : '';
1153 - ?>
1154 - <option value="<?php echo esc_attr( $num ); ?>" <?php echo esc_attr( $extra ); ?>><?php echo esc_html( $name ); ?></option>
1155 - <?php
1156 - }
1157 - do_action( 'visualizer_chart_schedules_spl', 'json', $chart_id, 1 );
1158 - ?>
1159 - </select>
1160 - <p class="viz-group-description"><?php _e( 'Select report endpoint', 'visualizer' ); ?></p>
1161 - <select name="vz_woo_source" id="vz-woo-source" class="visualizer-select json-form-element" data-chart="<?php echo $chart_id; ?>">
1162 - <option value=""></option>
1163 - <?php
1164 - if ( ! empty( $wc_source_list ) ) {
1165 - foreach ( $wc_source_list as $api ) {
1166 - if ( isset( $api['name'] ) && $api['endpoint'] ) {
1167 - echo sprintf( '<option value="%2$s" %3$s>%1$s</option>', $api['name'], $api['endpoint'], selected( $wc_source, $api['endpoint'], false ) ); // phpcs:ignore
1168 - }
1169 - }
1170 - }
1171 - ?>
1172 - </select>
1173 - </div>
1174 -
1175 - <input type="button" id="woo-chart-button" class="button button-secondary show-chart-toggle"
1176 - value="<?php echo $bttn_label; ?>" data-current="chart"
1177 - data-t-filter="<?php _e( 'Show Chart', 'visualizer' ); ?>"
1178 - data-t-chart="<?php echo $bttn_label; ?>"
1179 - <?php empty( $wc_source ) ? 'disabled' : ''; ?>
1180 - >
1181 - <input type="button" id="woo-chart-save-button" class="button button-primary "
1182 - value="<?php _e( 'Save Schedule', 'visualizer' ); ?>" <?php empty( $wc_source ) ? 'disabled' : ''; ?>>
1183 - </form>
1184 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-wc-report' ); ?>
1185 - </div>
1186 - </div>
1187 - </li>
1188 - <?php endif; ?>
1189 - <?php
1190 924 $save_query = esc_url(
1191 925 add_query_arg(
1192 926 array(
1193 927 'action' => Visualizer_Plugin::ACTION_SAVE_DB_QUERY,
@@ -1197,57 +931,97 @@
1197 931 )
1198 932 );
1199 933 ?>
1200 934 <!-- import from db -->
1201 - <li class="viz-group visualizer_source_query <?php echo esc_attr( apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'db-query' ) ); ?>">
1202 - <h2 class="viz-group-title viz-sub-group" role="button" tabindex="0"><?php _e( 'Import from database', 'visualizer' ); ?><span
935 + <li class="viz-group visualizer_source_query <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'db-query' ); ?>">
936 + <h2 class="viz-group-title viz-sub-group"><?php _e( 'Import from database', 'visualizer' ); ?><span
1203 937 class="dashicons dashicons-lock"></span></h2>
1204 938 <div class="viz-group-content edit-data-content">
1205 939 <div>
1206 940 <p class="viz-group-description"><?php _e( 'You can import data from the database here.', 'visualizer' ); ?></p>
1207 - <form id="vz-db-wizard" action="<?php echo esc_url( $save_query ); ?>" method="post" target="thehole">
941 + <form id="vz-db-wizard" action="<?php echo $save_query; ?>" method="post" target="thehole">
942 + <p class="viz-group-description"><?php _e( 'How often do you want to refresh the data from the database.', 'visualizer' ); ?></p>
943 + <select name="refresh" id="vz-db-import-time" class="visualizer-select">
1208 944 <?php
1209 - $is_db_source = 'visualizer_source_query' === $source_of_chart;
1210 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
1211 - $bttn_label = $is_db_source ? __( '1. Modify Data Source', 'visualizer' ) : __( '1. Choose Data Source', 'visualizer' );
945 + $bttn_label = 'visualizer_source_query' === $source_of_chart ? __( 'Modify Query', 'visualizer' ) : __( 'Create Query', 'visualizer' );
946 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
947 + $schedules = apply_filters(
948 + 'visualizer_chart_schedules', array(
949 + '-1' => __( 'One-time', 'visualizer' ),
950 + ),
951 + 'db',
952 + $chart_id
953 + );
954 + foreach ( $schedules as $num => $name ) {
955 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
956 + $extra = $num == $hours ? 'selected' : '';
957 + ?>
958 + <option value="<?php echo $num; ?>" <?php echo $extra; ?>><?php echo $name; ?></option>
959 + <?php
960 + }
961 + do_action( 'visualizer_chart_schedules_spl', 'db', $chart_id, 1 );
1212 962 ?>
963 + </select>
964 + <input type="hidden" name="params" id="viz-db-wizard-params">
1213 965
1214 - <!-- Step 1: Choose / modify data source -->
1215 - <input type="hidden" name="params" id="viz-db-wizard-params">
1216 - <input type="button" id="db-chart-button" class="button button-secondary show-chart-toggle vz-import-step-btn" value="<?php echo esc_attr( $bttn_label ); ?>" data-current="chart" data-t-filter="<?php esc_attr_e( 'Show Chart', 'visualizer' ); ?>" data-t-chart="<?php echo esc_attr( $bttn_label ); ?>">
966 + <input type="button" id="db-chart-button" class="button button-secondary show-chart-toggle" value="<?php echo $bttn_label; ?>" data-current="chart" data-t-filter="<?php _e( 'Show Chart', 'visualizer' ); ?>" data-t-chart="<?php echo $bttn_label; ?>">
967 + <input type="button" id="db-chart-save-button" class="button button-primary" value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
968 + <?php echo apply_filters( 'visualizer_pro_upsell', '', 'db-query' ); ?>
969 + </form>
970 + </div>
971 + </div>
972 + </li>
1217 973
1218 - <!-- Step 2: Sync schedule toggle -->
1219 - <div id="vz-db-sync-step">
1220 - <button type="button" id="vz-db-sync-btn" class="vz-import-step-toggle" aria-expanded="<?php echo $is_db_source ? 'true' : 'false'; ?>">
1221 - <?php echo '2. ' . __( 'Set Sync Schedule', 'visualizer' ); ?>
1222 - <span class="dashicons dashicons-arrow-down-alt2"></span>
1223 - </button>
1224 - <div id="vz-db-sync-options"<?php echo $is_db_source ? '' : ' style="display:none"'; ?>>
1225 - <select name="refresh" id="vz-db-import-time" class="visualizer-select">
974 + <!-- manual -->
975 + <li class="viz-group visualizer_source_manual <?php echo ! Visualizer_Module_Admin::proFeaturesLocked() ? apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'db-query' ) : ''; ?>">
976 + <h2 class="viz-group-title viz-sub-group visualizer-editor-tab" data-current="chart"><?php _e( 'Manual Data', 'visualizer' ); ?>
977 + <span class="dashicons dashicons-lock"></span>
978 + </h2>
979 + <div class="viz-group-content edit-data-content">
980 + <form id="editor-form" action="<?php echo $upload_link; ?>" method="post" target="thehole">
981 + <input type="hidden" id="chart-data" name="chart_data">
982 + <input type="hidden" id="chart-data-src" name="chart_data_src">
983 +
984 + <?php if ( Visualizer_Module::can_show_feature( 'simple-editor' ) ) { ?>
985 + <div>
986 + <p class="viz-group-description viz-editor-selection">
987 + <?php _e( 'Use the', 'visualizer' ); ?>
988 + <select name="editor-type" id="viz-editor-type">
989 + <?php
990 + if ( empty( $editor_type ) ) {
991 + $editor_type = Visualizer_Module::is_pro() ? 'excel' : 'text';
992 + }
993 + foreach ( apply_filters( 'visualizer_editors', array( 'text' => __( 'Text', 'visualizer' ), 'table' => __( 'Simple', 'visualizer' ) ) ) as $e_type => $e_label ) {
994 + ?>
995 + <option value="<?php echo $e_type; ?>" <?php selected( $editor_type, $e_type ); ?> ><?php echo $e_label; ?></option>
996 + <?php } ?>
997 + </select>
998 + <?php _e( 'editor to manually edit the chart data.', 'visualizer' ); ?>
999 + </p>
1000 + <input type="button" id="editor-undo" class="button button-secondary" style="display: none" value="<?php _e( 'Undo Changes', 'visualizer' ); ?>">
1001 + <input type="button" id="editor-button" class="button button-primary "
1002 + value="<?php _e( 'Edit Data', 'visualizer' ); ?>" data-current="chart"
1003 + data-t-editor="<?php _e( 'Show Chart', 'visualizer' ); ?>"
1004 + data-t-chart="<?php _e( 'Edit Data', 'visualizer' ); ?>"
1005 + >
1006 + <p class="viz-group-description viz-info-msg"><?php echo sprintf( __( 'Please make sure you click \'Show Chart\' before you save the chart.', 'visualizer' ) ); ?></p>
1007 + </div>
1008 + <?php } else { ?>
1009 + <input type="button" id="editor-undo" class="button button-secondary" style="display: none" value="<?php _e( 'Undo Changes', 'visualizer' ); ?>">
1010 + <input type="button" id="editor-chart-button" class="button button-primary "
1011 + value="<?php _e( 'View Editor', 'visualizer' ); ?>" data-current="chart"
1012 + data-t-editor="<?php _e( 'Show Chart', 'visualizer' ); ?>"
1013 + data-t-chart="<?php _e( 'View Editor', 'visualizer' ); ?>"
1014 + >
1015 + <p class="viz-group-description viz-info-msg"><?php echo sprintf( __( 'Please make sure you click \'Show Chart\' before you save the chart.', 'visualizer' ) ); ?></p>
1016 + <?php } ?>
1226 1017 <?php
1227 - $schedules = apply_filters(
1228 - 'visualizer_chart_schedules', array(
1229 - '-1' => __( 'One-time', 'visualizer' ),
1230 - ),
1231 - 'db',
1232 - $chart_id
1233 - );
1234 - foreach ( $schedules as $num => $name ) {
1235 - $extra = self::is_hour_selected( $hours, $num ) ? 'selected' : '';
1236 - ?>
1237 - <option value="<?php echo esc_attr( $num ); ?>" <?php echo esc_attr( $extra ); ?>><?php echo esc_html( $name ); ?></option>
1238 - <?php
1018 + if ( ! Visualizer_Module_Admin::proFeaturesLocked() ) {
1019 + echo apply_filters( 'visualizer_pro_upsell', '', 'db-query' );
1239 1020 }
1240 - do_action( 'visualizer_chart_schedules_spl', 'db', $chart_id, 1 );
1241 1021 ?>
1242 - </select>
1243 - <input type="button" id="db-chart-save-button" class="button button-primary" value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
1244 - </div>
1245 - </div>
1246 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'db-query', 'https://docs.themeisle.com/article/1279-how-to-import-data-from-a-database' ); ?>
1247 - </form>
1248 - </div>
1249 - </div>
1022 + </form>
1023 + </div>
1250 1024 </li>
1251 1025 </ul>
1252 1026 </li>
1253 1027 </ul>
@@ -1255,41 +1029,6 @@
1255 1029
1256 1030 <span id="visualizer-chart-id" data-id="<?php echo $chart_id; ?>" data-chart-source="<?php echo esc_attr( $source_of_chart ); ?>" data-chart-type="<?php echo esc_attr( $type ); ?>" data-chart-lib="<?php echo esc_attr( $lib ); ?>"></span>
1257 1031 <iframe id="thehole" name="thehole"></iframe>
1258 1032 <?php
1259 - }
1260 -
1261 - /**
1262 - * Check if the given hour is selected.
1263 - *
1264 - * @param int|float|string $hour The hour.
1265 - * @param int|float|string $reference The number.
1266 - *
1267 - * @return bool
1268 - */
1269 - public static function is_hour_selected( $hour, $reference ) {
1270 -
1271 - if ( ! is_numeric( $hour ) || ! is_numeric( $reference ) ) {
1272 - return false;
1273 - }
1274 -
1275 - $hour = floatval( $hour );
1276 - $reference = floatval( $reference );
1277 -
1278 - if ( self::is_live_update_option( $reference ) ) {
1279 - $reference = self::$live_option_fallback_hour;
1280 - }
1281 -
1282 - return abs( $hour - $reference ) < 0.000001;
1283 - }
1284 -
1285 - /**
1286 - * Check if the reference option is deprecated live update option.
1287 - *
1288 - * @param float $reference_hour The reference hour.
1289 - *
1290 - * @return bool
1291 - */
1292 - public static function is_live_update_option( $reference_hour ) {
1293 - return abs( $reference_hour ) < 0.000001;
1294 1033 }
1295 1034 }