PluginProbe
Visualizer – Tables & Charts Manager with Built-in AI Generator / 3.7.2
Visualizer – Tables & Charts Manager with Built-in AI Generator v3.7.2
4.0.8 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 All 149 releases
← All changes | classes/Visualizer/Render/Layout.php +260 -543 4.0.83.7.2 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 ) {
@@ -163,20 +127,17 @@
163 127 * @access public
164 128 */
165 129 public static function _renderJsonScreen( $args ) {
166 130 $id = $args[1];
167 - $action = esc_url(
168 - add_query_arg(
169 - array(
170 - 'action' => Visualizer_Plugin::ACTION_JSON_SET_DATA,
171 - 'security' => wp_create_nonce( Visualizer_Plugin::ACTION_JSON_SET_DATA . Visualizer_Plugin::VERSION ),
172 - 'chart' => $id,
173 - ),
174 - admin_url( 'admin-ajax.php' )
175 - )
131 + $action = add_query_arg(
132 + array(
133 + 'action' => Visualizer_Plugin::ACTION_JSON_SET_DATA,
134 + 'security' => wp_create_nonce( Visualizer_Plugin::ACTION_JSON_SET_DATA . Visualizer_Plugin::VERSION ),
135 + 'chart' => $id,
136 + ),
137 + admin_url( 'admin-ajax.php' )
176 138 );
177 139
178 - $is_wc_source = get_post_meta( $id, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE, true );
179 140 $url = get_post_meta( $id, Visualizer_Plugin::CF_JSON_URL, true );
180 141 $root = get_post_meta( $id, Visualizer_Plugin::CF_JSON_ROOT, true );
181 142 $paging = get_post_meta( $id, Visualizer_Plugin::CF_JSON_PAGING, true );
182 143 $headers = get_post_meta( $id, Visualizer_Plugin::CF_JSON_HEADERS, true );
@@ -187,15 +148,10 @@
187 148 $headers['method'] = 'get';
188 149 }
189 150 $methods = apply_filters( 'visualizer_json_request_methods', array( 'GET', 'POST' ) );
190 151
191 - $auth = isset( $headers['auth'] ) ? $headers['auth'] : '';
192 - $auth_username = is_array( $auth ) && isset( $auth['username'] ) ? $auth['username'] : '';
193 - $auth_password = is_array( $auth ) && isset( $auth['password'] ) ? $auth['password'] : '';
194 - $auth_string = is_string( $auth ) ? $auth : '';
195 -
196 152 // open the headers by default?
197 - $headers_open = ! empty( $auth_username ) || ! empty( $auth_string );
153 + $headers_open = $headers && array_key_exists( 'auth', $headers ) && ( array_key_exists( 'username', $headers['auth'] ) && ! empty( $headers['auth']['username'] ) ) || ( ! empty( $headers['auth'] ) && is_string( $headers['auth'] ) );
198 154 ?>
199 155 <div id="visualizer-json-screen" style="display: none">
200 156 <div class="visualizer-json-form">
201 157 <h3 class="viz-step step1"><?php _e( 'STEP 1: Specify the JSON endpoint/URL', 'visualizer' ); ?></h3>
@@ -202,18 +158,9 @@
202 158 <div>
203 159 <form id="json-endpoint-form">
204 160 <div class="json-wizard-hints">
205 161 <ul class="info">
206 - <li>
207 - <?php
208 - echo sprintf(
209 - // translators: %1$s - HTML link tag, %2$s - HTML closing link tag.
210 - __( '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' ),
211 - '<a href="https://docs.themeisle.com/article/1043-visualizer-how-to-extend-rest-endpoints-with-json-response" target="_blank">',
212 - '</a>'
213 - );
214 - ?>
215 - </li>
162 + <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>
216 163 </ul>
217 164 </div>
218 165
219 166 <input
@@ -221,13 +168,11 @@
221 168 id="vz-import-json-url"
222 169 name="url"
223 170 value="<?php echo esc_url( $url ); ?>"
224 171 placeholder="<?php esc_html_e( 'Please enter the URL', 'visualizer' ); ?>"
225 - class="visualizer-input json-form-element"
226 - <?php echo $is_wc_source ? 'readonly' : ''; ?>
227 - >
172 + class="visualizer-input json-form-element">
228 173 <button class="button button-secondary button-small" id="visualizer-json-fetch"><?php esc_html_e( 'Fetch Endpoint', 'visualizer' ); ?></button>
229 -
174 +
230 175 <div class="visualizer-json-subform">
231 176 <h3 class="viz-substep <?php echo $headers_open ? 'open' : ''; ?>"><?php _e( 'Headers', 'visualizer' ); ?></h3>
232 177 <div class="json-wizard-headers">
233 178 <div class="json-wizard-header">
@@ -246,19 +191,19 @@
246 191 <input
247 192 type="text"
248 193 id="vz-import-json-username"
249 194 name="username"
250 - value="<?php echo esc_attr( $auth_username ); ?>"
195 + value="<?php echo ( array_key_exists( 'auth', $headers ) && array_key_exists( 'username', $headers['auth'] ) ? $headers['auth']['username'] : '' ); ?>"
251 196 placeholder="<?php esc_html_e( 'Username/Access Key', 'visualizer' ); ?>"
252 - class="json-form-element">
197 + class="json-form-element">
253 198 &
254 199 <input
255 200 type="password"
256 201 id="vz-import-json-password"
257 202 name="password"
258 - value="<?php echo esc_attr( $auth_password ); ?>"
203 + value="<?php echo ( array_key_exists( 'auth', $headers ) && array_key_exists( 'password', $headers['auth'] ) ? $headers['auth']['password'] : '' ); ?>"
259 204 placeholder="<?php esc_html_e( 'Password/Secret Key', 'visualizer' ); ?>"
260 - class="json-form-element">
205 + class="json-form-element">
261 206 </div>
262 207 </div>
263 208 <div class="json-wizard-header">
264 209 <div></div>
@@ -270,9 +215,9 @@
270 215 <input
271 216 type="text"
272 217 id="vz-import-json-auth"
273 218 name="auth"
274 - value="<?php echo esc_attr( $auth_string ); ?>"
219 + value="<?php echo ( array_key_exists( 'auth', $headers ) && is_string( $headers['auth'] ) ? $headers['auth'] : '' ); ?>"
275 220 placeholder="<?php esc_html_e( 'e.g. SharedKey <AccountName>:<Signature>', 'visualizer' ); ?>"
276 221 class="visualizer-input json-form-element">
277 222 </div>
278 223 </div>
@@ -278,9 +223,9 @@
278 223 </div>
279 224 <div class="json-wizard-header">
280 225 <div class="field-title"><?php esc_html_e( 'Additional headers', 'visualizer' ); ?></div>
281 226 <div>
282 - <textarea name="additional_headers" class="visualizer-input" placeholder="<?php esc_html_e( 'Key:Value, Key2:Value2,...', 'visualizer' ); ?>"><?php echo esc_textarea( isset( $headers['additional_headers'] ) ? $headers['additional_headers'] : '' ); ?></textarea>
227 + <textarea name="additional_headers" class="visualizer-input" placeholder="<?php esc_html_e( 'Key:Value, Key2:Value2,...', 'visualizer' ); ?>"><?php echo isset( $headers['additional_headers'] ) ? $headers['additional_headers'] : ''; ?></textarea>
283 228 </div>
284 229 </div>
285 230 </div>
286 231 </div>
@@ -293,9 +238,9 @@
293 238 <select name="root" id="vz-import-json-root" class="json-form-element">
294 239 <?php
295 240 if ( ! empty( $root ) ) {
296 241 ?>
297 - <option value="<?php echo esc_attr( $root ); ?>"><?php echo esc_html( str_replace( Visualizer_Source_Json::TAG_SEPARATOR, Visualizer_Source_Json::TAG_SEPARATOR_VIEW, $root ) ); ?></option>
242 + <option value="<?php echo esc_attr( $root ); ?>"><?php echo str_replace( Visualizer_Source_Json::TAG_SEPARATOR, Visualizer_Source_Json::TAG_SEPARATOR_VIEW, $root ); ?></option>
298 243 <?php
299 244 }
300 245 ?>
301 246 </select>
@@ -311,9 +256,9 @@
311 256 <option value="0" class="static"><?php _e( 'Get results from the first page only', 'visualizer' ); ?></option>
312 257 <?php
313 258 if ( ! empty( $paging ) ) {
314 259 ?>
315 - <option value="<?php echo esc_attr( $paging ); ?>"><?php echo esc_html( sprintf( 'Get results from the first %d pages using %s', apply_filters( 'visualizer_json_fetch_pages', 5, $url ), str_replace( Visualizer_Source_Json::TAG_SEPARATOR, Visualizer_Source_Json::TAG_SEPARATOR_VIEW, $paging ) ) ); ?></option>
260 + <option value="<?php echo esc_attr( $paging ); ?>"><?php echo sprintf( 'Get results from the first %d pages using %s', apply_filters( 'visualizer_json_fetch_pages', 5, $url ), str_replace( Visualizer_Source_Json::TAG_SEPARATOR, Visualizer_Source_Json::TAG_SEPARATOR_VIEW, $paging ) ); ?></option>
316 261 <?php
317 262 }
318 263 ?>
319 264 </select>
@@ -360,17 +305,15 @@
360 305 * @access public
361 306 */
362 307 public static function _renderSimpleEditorScreen( $args ) {
363 308 $chart_id = $args[1];
364 - $action = esc_url(
365 - add_query_arg(
366 - array(
367 - 'action' => Visualizer_Plugin::ACTION_UPLOAD_DATA,
368 - 'nonce' => wp_create_nonce( 'visualizer-upload-data' ),
369 - 'chart' => $chart_id,
370 - ),
371 - admin_url( 'admin-ajax.php' )
372 - )
309 + $action = add_query_arg(
310 + array(
311 + 'action' => Visualizer_Plugin::ACTION_UPLOAD_DATA,
312 + 'nonce' => wp_create_nonce(),
313 + 'chart' => $chart_id,
314 + ),
315 + admin_url( 'admin-ajax.php' )
373 316 );
374 317 ?>
375 318 <div class="viz-simple-editor">
376 319 <div class="viz-simple-editor-type viz-table-editor">
@@ -394,8 +337,9 @@
394 337 <?php Visualizer_Render_Layout::show( 'text-editor', $chart_id ); ?>
395 338
396 339 </div>
397 340 <?php
341 +
398 342 }
399 343
400 344 /**
401 345 * Show the text area editor.
@@ -468,9 +412,9 @@
468 412 }
469 413 ?>
470 414 </tr>
471 415 </thead>
472 - <tbody>
416 + <tbody>
473 417 <tr>
474 418 <th><?php _e( 'Data Type', 'visualizer' ); ?></th>
475 419 <?php
476 420 $index = 0;
@@ -535,9 +479,9 @@
535 479 private static function _renderPermissions( $args ) {
536 480 $chart_id = $args[1];
537 481
538 482 // ignore for unit tests because Travis throws the error "Indirect modification of overloaded property Visualizer_Render_Page_Data::$permissions has no effect".
539 - if ( defined( 'WP_TESTS_DOMAIN' ) && function_exists( 'tests_add_filter' ) ) {
483 + if ( defined( 'WP_TESTS_DOMAIN' ) ) {
540 484 return;
541 485 }
542 486
543 487 $permissions = apply_filters( 'visualizer_pro_get_permissions', null, $chart_id );
@@ -620,9 +564,9 @@
620 564 true,
621 565 array( 'visualizer-permission', 'visualizer-permission-specific', 'visualizer-permission-edit-specific' )
622 566 );
623 567 Visualizer_Render_Sidebar::_renderSectionEnd();
624 - echo apply_filters( 'visualizer_pro_upsell', '', 'chart-permissions', 'https://docs.themeisle.com/article/1280-how-to-customize-permissions' );
568 + echo apply_filters( 'visualizer_pro_upsell', '', 'chart-permissions' );
625 569 echo '</div>';
626 570 Visualizer_Render_Sidebar::_renderGroupEnd();
627 571 }
628 572
@@ -631,27 +575,21 @@
631 575 *
632 576 * @access public
633 577 */
634 578 public static function _renderTabAdvanced( $args ) {
635 - $chart_id = $args[1];
636 - $sidebar = $args[2];
637 -
638 - $chart_options = get_post_meta( $chart_id, Visualizer_Plugin::CF_SETTINGS, true );
639 - $backend_title = isset( $chart_options['backend-title'] ) && ! empty( $chart_options['backend-title'] ) ? $chart_options['backend-title'] : '';
640 -
579 + $sidebar = $args[2];
641 580 ?>
642 581 <ul class="viz-group-wrapper full-height">
643 582 <li class="viz-group open" id="vz-chart-settings">
644 583 <ul class="viz-group-content">
645 584 <ul class="viz-group-wrapper">
646 - <form id="settings-form" action="<?php echo esc_url( add_query_arg( 'nonce', wp_create_nonce() ) ); ?>" method="post">
585 + <form id="settings-form" action="<?php echo add_query_arg( 'nonce', wp_create_nonce() ); ?>" method="post">
647 586 <input type="hidden" id="chart-img" name="chart-img">
648 - <input type="hidden" id="backend-title" name="backend-title" value="<?php echo esc_html( $backend_title ); ?>">
649 587 <?php echo $sidebar; ?>
650 588 <?php self::_renderPermissions( $args ); ?>
651 589 <input type="hidden" name="save" value="1">
652 590 </form>
653 - <form id="cancel-form" action="<?php echo esc_url( add_query_arg( 'nonce', wp_create_nonce() ) ); ?>" method="post">
591 + <form id="cancel-form" action="<?php echo add_query_arg( 'nonce', wp_create_nonce() ); ?>" method="post">
654 592 <input type="hidden" name="cancel" value="1">
655 593 </form>
656 594 </ul>
657 595 </ul>
@@ -692,22 +630,12 @@
692 630 <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>
693 631 <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>
694 632 <?php
695 633 Visualizer_Render_Sidebar::_renderSectionEnd();
696 - // translators: %s - the chart type.
697 634 Visualizer_Render_Sidebar::_renderSectionStart( sprintf( __( '%s chart', 'visualizer' ), ucwords( $displayType ) ), true );
698 635 ?>
699 636 <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>
700 - <h4><span class="dashicons dashicons-search"></span><a href="<?php echo str_replace( '#', $type, VISUALIZER_DOC_COLLECTION ); ?>" target="_blank">
701 - <?php
702 - echo sprintf(
703 - // translators: %s - the chart type.
704 - __( 'Articles containing "%s"', 'visualizer' ),
705 - $displayType
706 - );
707 - ?>
708 - </a>
709 - </h4>
637 + <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>
710 638 <?php
711 639 Visualizer_Render_Sidebar::_renderSectionEnd();
712 640 Visualizer_Render_Sidebar::_renderGroupEnd();
713 641 ?>
@@ -725,26 +653,19 @@
725 653 */
726 654 public static function _renderTabBasic( $args ) {
727 655 $chart_id = $args[1];
728 656
729 - $upload_link = esc_url(
730 - add_query_arg(
731 - array(
732 - 'action' => Visualizer_Plugin::ACTION_UPLOAD_DATA,
733 - 'nonce' => wp_create_nonce( 'visualizer-upload-data' ),
734 - 'chart' => $chart_id,
735 - ),
736 - admin_url( 'admin-ajax.php' )
737 - )
657 + $upload_link = add_query_arg(
658 + array(
659 + 'action' => Visualizer_Plugin::ACTION_UPLOAD_DATA,
660 + 'nonce' => wp_create_nonce(),
661 + 'chart' => $chart_id,
662 + ),
663 + admin_url( 'admin-ajax.php' )
738 664 );
739 665
740 666 // this will allow us to open the correct source tab by default.
741 - $source_of_chart = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true ) );
742 - // Import from woocommerce report.
743 - $is_woocommerce_source = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_IS_WOOCOMMERCE_SOURCE, true ) );
744 - if ( ! empty( $is_woocommerce_source ) ) {
745 - $source_of_chart .= '_wc';
746 - }
667 + $source_of_chart = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_SOURCE, true ) );
747 668 // both import from wp and import from db have the same source so we need to differentiate.
748 669 $filter_config = get_post_meta( $chart_id, Visualizer_Plugin::CF_FILTER_CONFIG, true );
749 670 // if filter config is present, then its import from wp.
750 671 if ( ! empty( $filter_config ) ) {
@@ -750,12 +671,9 @@
750 671 if ( ! empty( $filter_config ) ) {
751 672 $source_of_chart .= '_wp';
752 673 }
753 674 $editor_type = get_post_meta( $chart_id, Visualizer_Plugin::CF_EDITOR, true );
754 - if (
755 - $editor_type ||
756 - ! Visualizer_Module::is_pro() // Use Manual Source for non-pro users since it is the only unlocked source.
757 - ) {
675 + if ( $editor_type ) {
758 676 $source_of_chart = 'visualizer_source_manual';
759 677 }
760 678
761 679 $type = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_TYPE, true );
@@ -764,208 +682,125 @@
764 682 <ul class="viz-group-wrapper full-height">
765 683 <li class="viz-group open" id="vz-chart-source">
766 684 <ul class="viz-group-content">
767 685 <ul class="viz-group-wrapper">
768 - <!-- manual -->
769 - <li class="viz-group visualizer_source_manual">
770 - <h2 class="viz-group-title viz-sub-group visualizer-editor-tab" data-current="chart" role="button" tabindex="0"><?php _e( 'Manual Data', 'visualizer' ); ?></h2>
771 - <div class="viz-group-content edit-data-content">
772 - <form id="editor-form" action="<?php echo $upload_link; ?>" method="post" target="thehole">
773 - <input type="hidden" id="chart-data" name="chart_data">
774 - <input type="hidden" id="chart-data-src" name="chart_data_src">
775 -
776 - <?php if ( Visualizer_Module::can_show_feature( 'simple-editor' ) ) { ?>
777 - <div>
778 - <p class="viz-group-description viz-editor-selection">
779 - <?php _e( 'Use the', 'visualizer' ); ?>
780 - <select name="editor-type" id="viz-editor-type">
781 - <?php
782 - if ( empty( $editor_type ) ) {
783 - $editor_type = Visualizer_Module::is_pro() ? 'excel' : 'text';
784 - }
785 - foreach ( apply_filters( 'visualizer_editors', array( 'text' => __( 'Text', 'visualizer' ), 'table' => __( 'Simple', 'visualizer' ) ) ) as $e_type => $e_label ) {
786 - ?>
787 - <option value="<?php echo $e_type; ?>" <?php selected( $editor_type, $e_type ); ?> ><?php echo $e_label; ?></option>
788 - <?php } ?>
789 - </select>
790 - <?php _e( 'editor to manually edit the chart data.', 'visualizer' ); ?>
791 - </p>
792 - <input type="button" id="editor-undo" class="button button-secondary" style="display: none" value="<?php _e( 'Undo Changes', 'visualizer' ); ?>">
793 - <input type="button" id="editor-button" class="button button-primary "
794 - value="<?php _e( 'Edit Data', 'visualizer' ); ?>" data-current="chart"
795 - data-t-editor="<?php _e( 'Show Chart', 'visualizer' ); ?>"
796 - data-t-chart="<?php _e( 'Edit Data', 'visualizer' ); ?>"
797 - >
798 - <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>
686 + <!-- import from file -->
687 + <li class="viz-group visualizer_source_csv">
688 + <h2 class="viz-group-title viz-sub-group visualizer-src-tab"><?php _e( 'Import data from file', 'visualizer' ); ?></h2>
689 + <div class="viz-group-content">
690 + <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>
691 + <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>
692 + <form id="vz-csv-file-form" action="<?php echo $upload_link; ?>" method="post"
693 + target="thehole" enctype="multipart/form-data">
694 + <input type="hidden" id="remote-data" name="remote_data">
695 + <div class="">
696 + <input type="file" id="csv-file" name="local_data">
799 697 </div>
800 - <?php } else { ?>
801 - <input type="button" id="editor-undo" class="button button-secondary" style="display: none" value="<?php _e( 'Undo Changes', 'visualizer' ); ?>">
802 - <input type="button" id="editor-chart-button" class="button button-primary "
803 - value="<?php _e( 'View Editor', 'visualizer' ); ?>" data-current="chart"
804 - data-t-editor="<?php _e( 'Show Chart', 'visualizer' ); ?>"
805 - data-t-chart="<?php _e( 'View Editor', 'visualizer' ); ?>"
806 - >
807 - <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>
808 - <?php } ?>
698 + <input type="button" class="button button-primary" id="vz-import-file"
699 + value="<?php _e( 'Import', 'visualizer' ); ?>">
809 700 </form>
810 701 </div>
811 702 </li>
812 -
813 - <!-- import from file -->
814 - <li class="viz-group visualizer_source_csv <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'import-file' ); ?> ">
815 - <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>
816 - <div class="viz-group-content">
817 - <div>
818 - <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>
819 - <p class="viz-group-description viz-info-msg">
820 - <b>
821 - <?php
822 - echo sprintf(
823 - // translators: $s - the chart type with the link attached.
824 - __( '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' ),
825 - '<a href="' . VISUALIZER_ABSURL . 'samples/' . $type . '.csv" target="_blank">' . $type . '.csv</a>'
826 - );
827 - ?>
828 - </b>
829 - </p>
830 - <form id="vz-csv-file-form" action="<?php echo $upload_link; ?>" method="post"
831 - target="thehole" enctype="multipart/form-data">
832 - <input type="hidden" id="remote-data" name="remote_data">
833 - <div class="">
834 - <input type="file" id="csv-file" name="local_data" accept=".csv,.xlsx">
835 - </div>
836 - <input type="button" class="button button-primary" id="vz-import-file"
837 - value="<?php _e( 'Import', 'visualizer' ); ?>">
838 - </form>
839 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-file' ); ?>
840 - </div>
841 - </div>
842 - </li>
843 703 <!-- import from url -->
844 - <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' ); ?> ">
845 - <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>
704 + <li class="viz-group visualizer-import-url visualizer_source_csv_remote visualizer_source_json">
705 + <h2 class="viz-group-title viz-sub-group visualizer-src-tab"><?php _e( 'Import data from URL', 'visualizer' ); ?></h2>
846 706 <ul class="viz-group-content">
847 707 <!-- import from csv url -->
848 708 <li class="viz-subsection">
849 - <span class="viz-section-title" role="button" tabindex="0"><?php _e( 'Import from CSV / XLSX', 'visualizer' ); ?></span>
850 - <div class="only-pro-anchor">
851 - <div class="viz-section-items section-items">
852 - <p class="viz-group-description">
709 + <span class="viz-section-title"><?php _e( 'Import from CSV', 'visualizer' ); ?></span>
710 + <div class="viz-section-items section-items">
711 + <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>
712 + <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>
713 + <form id="vz-one-time-import" action="<?php echo $upload_link; ?>" method="post"
714 + target="thehole" enctype="multipart/form-data">
715 + <div class="remote-file-section">
716 + <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">
717 + </div>
718 + <select name="vz-import-time" id="vz-import-time" class="visualizer-select">
719 + <?php
720 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_SCHEDULE, true );
721 + $schedules = apply_filters(
722 + 'visualizer_chart_schedules', array(
723 + '-1' => __( 'One-time', 'visualizer' ),
724 + ),
725 + 'csv',
726 + $chart_id
727 + );
728 + foreach ( $schedules as $num => $name ) {
729 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
730 + $extra = $num == $hours ? 'selected' : '';
731 + ?>
732 + <option value="<?php echo $num; ?>" <?php echo $extra; ?>><?php echo $name; ?></option>
853 733 <?php
854 - echo sprintf(
855 - // translators: %1$s - HTML link tag, %2$s - HTML closing link tag.
856 - __( 'You can use this to import data from a remote CSV or Excel (XLSX) file, or %1$sGoogle Spreadsheet%2$s.', 'visualizer' ),
857 - '<a href="https://docs.themeisle.com/article/607-how-can-i-populate-data-from-google-spreadsheet" target="_blank" >',
858 - '</a>'
859 - );
734 + }
735 + do_action( 'visualizer_chart_schedules_spl', 'csv', $chart_id, 1 );
736 + ?>
737 + </select>
738 +
739 + <?php
740 + if ( ! Visualizer_Module::is_pro() ) {
860 741 ?>
861 - </p>
862 - <p class="viz-group-description viz-info-msg">
863 - <b>
864 - <?php
865 - echo sprintf(
866 - // translators: %s - the chart type with the link attached.
867 - __( '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' ),
868 - '<a href="' . VISUALIZER_ABSURL . 'samples/' . $type . '.csv" target="_blank">' . $type . '.csv</a>'
869 - );
870 - ?>
871 - </b>
872 - </p>
873 - <form id="vz-one-time-import" action="<?php echo $upload_link; ?>" method="post"
874 - target="thehole" enctype="multipart/form-data">
875 - <div class="remote-file-section">
876 - <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">
877 - </div>
878 - <select name="vz-import-time" id="vz-import-time" class="visualizer-select">
742 + <input type="button" id="view-remote-file" class="button button-primary" value="<?php _e( 'Import', 'visualizer' ); ?>">
879 743 <?php
880 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_CHART_SCHEDULE, true );
881 - $schedules = apply_filters(
882 - 'visualizer_chart_schedules', array(
883 - '-1' => __( 'One-time', 'visualizer' ),
884 - ),
885 - 'csv',
886 - $chart_id
887 - );
888 - foreach ( $schedules as $num => $name ) {
889 - // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
890 - $extra = self::is_hour_selected( $hours, $num ) ? 'selected' : '';
891 - ?>
892 - <option value="<?php echo esc_attr( $num ); ?>" <?php echo esc_attr( $extra ); ?>><?php echo esc_html( $name ); ?></option>
893 - <?php
894 - }
895 - do_action( 'visualizer_chart_schedules_spl', 'csv', $chart_id, 1 );
744 + } else {
896 745 ?>
897 - </select>
898 -
746 + <input type="button" id="vz-save-schedule" class="button button-primary" value="<?php _e( 'Import & Save schedule', 'visualizer' ); ?>">
899 747 <?php
900 - if ( ! Visualizer_Module::is_pro() ) {
901 - ?>
902 - <input type="button" id="view-remote-file" class="button button-primary" value="<?php _e( 'Import', 'visualizer' ); ?>">
903 - <?php
904 - } else {
905 - ?>
906 - <input type="button" id="vz-save-schedule" class="button button-primary" value="<?php _e( 'Import & Save schedule', 'visualizer' ); ?>">
907 - <?php
908 - }
909 - ?>
910 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-url' ); ?>
911 - </form>
912 - </div>
748 + }
749 + ?>
750 + </form>
913 751 </div>
914 752 </li>
915 753 <!-- import from json url -->
916 754 <li class="viz-subsection">
917 - <span class="viz-section-title visualizer_source_json" role="button" tabindex="0"><?php _e( 'Import from JSON', 'visualizer' ); ?></span>
918 - <div class="only-pro-anchor">
919 - <div class="viz-section-items section-items">
920 - <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>
921 - <form id="vz-import-json" action="<?php echo $upload_link; ?>" method="post" target="thehole" enctype="multipart/form-data">
922 - <div class="remote-file-section">
755 + <span class="viz-section-title visualizer_source_json"><?php _e( 'Import from JSON', 'visualizer' ); ?></span>
756 + <div class="viz-section-items section-items">
757 + <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>
758 + <form id="vz-import-json" action="<?php echo $upload_link; ?>" method="post" target="thehole" enctype="multipart/form-data">
759 + <div class="remote-file-section">
760 + <?php
761 + $bttn_label = 'visualizer_source_json' === $source_of_chart ? __( 'Modify Parameters', 'visualizer' ) : __( 'Create Parameters', 'visualizer' );
762 + if ( Visualizer_Module::is_pro() ) {
763 + ?>
764 + <p class="viz-group-description"><?php _e( 'How often do you want to check the URL', 'visualizer' ); ?></p>
765 + <select name="time" id="vz-json-time" class="visualizer-select json-form-element" data-chart="<?php echo $chart_id; ?>">
923 766 <?php
924 - $bttn_label = 'visualizer_source_json' === $source_of_chart ? __( 'Modify Parameters', 'visualizer' ) : __( 'Create Parameters', 'visualizer' );
925 - if ( Visualizer_Module::is_pro() ) {
767 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
768 + $schedules = apply_filters(
769 + 'visualizer_chart_schedules', array(
770 + '-1' => __( 'One-time', 'visualizer' ),
771 + ),
772 + 'json',
773 + $chart_id
774 + );
775 + foreach ( $schedules as $num => $name ) {
776 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
777 + $extra = $num == $hours ? 'selected' : '';
926 778 ?>
927 - <p class="viz-group-description"><?php _e( 'How often do you want to check the URL', 'visualizer' ); ?></p>
928 - <select name="time" id="vz-json-time" class="visualizer-select json-form-element" data-chart="<?php echo $chart_id; ?>">
779 + <option value="<?php echo $num; ?>" <?php echo $extra; ?>><?php echo $name; ?></option>
929 780 <?php
930 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
931 - $schedules = apply_filters(
932 - 'visualizer_chart_schedules', array(
933 - '-1' => __( 'One-time', 'visualizer' ),
934 - ),
935 - 'json',
936 - $chart_id
937 - );
938 - foreach ( $schedules as $num => $name ) {
939 - // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
940 - $extra = self::is_hour_selected( $hours, $num ) ? 'selected' : '';
941 - ?>
942 - <option value="<?php echo esc_attr( $num ); ?>" <?php echo esc_attr( $extra ); ?>><?php echo esc_html( $name ); ?></option>
943 - <?php
944 - }
945 - do_action( 'visualizer_chart_schedules_spl', 'json', $chart_id, 1 );
946 - ?>
947 - </select>
948 - <?php
949 781 }
782 + do_action( 'visualizer_chart_schedules_spl', 'json', $chart_id, 1 );
950 783 ?>
951 - </div>
784 + </select>
785 + <?php
786 + }
787 + ?>
788 + </div>
952 789
953 - <input type="button" id="json-chart-button" class="button button-secondary show-chart-toggle"
954 - value="<?php echo $bttn_label; ?>" data-current="chart"
955 - data-t-filter="<?php _e( 'Show Chart', 'visualizer' ); ?>"
956 - data-t-chart="<?php echo $bttn_label; ?>">
790 + <input type="button" id="json-chart-button" class="button button-secondary show-chart-toggle"
791 + value="<?php echo $bttn_label; ?>" data-current="chart"
792 + data-t-filter="<?php _e( 'Show Chart', 'visualizer' ); ?>"
793 + data-t-chart="<?php echo $bttn_label; ?>">
794 + <?php
795 + if ( Visualizer_Module::is_pro() ) {
796 + ?>
797 + <input type="button" id="json-chart-save-button" class="button button-primary "
798 + value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
957 799 <?php
958 - if ( Visualizer_Module::is_pro() ) {
959 - ?>
960 - <input type="button" id="json-chart-save-button" class="button button-primary "
961 - value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
962 - <?php
963 - }
964 - ?>
965 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-url' ); ?>
966 - </form>
967 - </div>
800 + }
801 + ?>
802 + </form>
968 803 </div>
969 804 </li>
970 805 </ul>
971 806 </li>
@@ -971,9 +806,9 @@
971 806 </li>
972 807 <!-- import from chart -->
973 808 <li class="viz-group viz-import-from-other <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature' ); ?>">
974 809 <h2 class="viz-group-title viz-sub-group"
975 - data-current="chart" role="button" tabindex="0"><?php _e( 'Import from other chart', 'visualizer' ); ?><span
810 + data-current="chart"><?php _e( 'Import from other chart', 'visualizer' ); ?><span
976 811 class="dashicons dashicons-lock"></span></h2>
977 812 <div class="viz-group-content edit-data-content">
978 813 <div>
979 814 <p class="viz-group-description"><?php _e( 'You can import here data from your previously created charts', 'visualizer' ); ?></p>
@@ -979,16 +814,14 @@
979 814 <p class="viz-group-description"><?php _e( 'You can import here data from your previously created charts', 'visualizer' ); ?></p>
980 815 <form>
981 816 <select name="vz-import-from-chart" id="chart-id" class="visualizer-select">
982 817 <?php
983 - $fetch_link = esc_url(
984 - add_query_arg(
985 - array(
986 - 'action' => Visualizer_Module::is_pro() ? Visualizer_Pro::ACTION_FETCH_DATA : '',
987 - 'nonce' => Visualizer_Module::is_pro() ? wp_create_nonce( Visualizer_Pro::ACTION_FETCH_DATA ) : wp_create_nonce(),
988 - ),
989 - admin_url( 'admin-ajax.php' )
990 - )
818 + $fetch_link = add_query_arg(
819 + array(
820 + 'action' => Visualizer_Module::is_pro() ? Visualizer_Pro::ACTION_FETCH_DATA : '',
821 + 'nonce' => wp_create_nonce(),
822 + ),
823 + admin_url( 'admin-ajax.php' )
991 824 );
992 825 $query_args_charts = array(
993 826 'post_type' => Visualizer_Plugin::CPT_VISUALIZER,
994 827 'posts_per_page' => 300,
@@ -1020,240 +853,159 @@
1020 853
1021 854 </select>
1022 855 </form>
1023 856 <input type="button" id="existing-chart" class="button button-primary"
1024 - value="<?php _e( 'Import Chart', 'visualizer' ); ?>"
1025 - data-viz-link="<?php echo $fetch_link; ?>">
1026 - <?php
1027 - if ( ! Visualizer_Module_Admin::proFeaturesEnabled() ) {
1028 - echo apply_filters( 'visualizer_pro_upsell', '', 'import-chart' );
1029 - }
1030 - ?>
857 + value="<?php _e( 'Import Chart', 'visualizer' ); ?>"
858 + data-viz-link="<?php echo $fetch_link; ?>">
859 + <?php echo apply_filters( 'visualizer_pro_upsell', '' ); ?>
1031 860 </div>
1032 861 </div>
1033 862 </li>
1034 863
1035 864 <?php
1036 - $save_filter = esc_url(
1037 - add_query_arg(
1038 - array(
1039 - 'action' => Visualizer_Plugin::ACTION_SAVE_FILTER_QUERY,
1040 - 'security' => wp_create_nonce( Visualizer_Plugin::ACTION_SAVE_FILTER_QUERY . Visualizer_Plugin::VERSION ),
1041 - 'chart' => $chart_id,
1042 - ), admin_url( 'admin-ajax.php' )
1043 - )
865 + $save_filter = add_query_arg(
866 + array(
867 + 'action' => Visualizer_Plugin::ACTION_SAVE_FILTER_QUERY,
868 + 'security' => wp_create_nonce( Visualizer_Plugin::ACTION_SAVE_FILTER_QUERY . Visualizer_Plugin::VERSION ),
869 + 'chart' => $chart_id,
870 + ), admin_url( 'admin-ajax.php' )
1044 871 );
1045 872 ?>
1046 873 <!-- import from WordPress -->
1047 - <li class="viz-group visualizer_source_query_wp <?php echo esc_attr( apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'import-wp' ) ); ?> ">
1048 - <h2 class="viz-group-title viz-sub-group" role="button" tabindex="0"><?php _e( 'Import from WordPress', 'visualizer' ); ?><span
874 + <li class="viz-group visualizer_source_query_wp <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'import-wp' ); ?> ">
875 + <h2 class="viz-group-title viz-sub-group"><?php _e( 'Import from WordPress', 'visualizer' ); ?><span
1049 876 class="dashicons dashicons-lock"></span></h2>
1050 877 <div class="viz-group-content edit-data-content">
1051 878 <div>
1052 879 <p class="viz-group-description"><?php _e( 'You can import data from WordPress here.', 'visualizer' ); ?></p>
1053 - <form id="vz-filter-wizard" action="<?php echo esc_url( $save_filter ); ?>" method="post" target="thehole">
880 + <form id="vz-filter-wizard" action="<?php echo $save_filter; ?>" method="post" target="thehole">
881 + <p class="viz-group-description"><?php _e( 'How often do you want to refresh the data from WordPress.', 'visualizer' ); ?></p>
882 + <select name="refresh" id="vz-filter-import-time" class="visualizer-select">
1054 883 <?php
1055 - $is_wp_source = 'visualizer_source_query_wp' === $source_of_chart;
1056 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
1057 - $bttn_label = $is_wp_source ? '1. ' . __( 'Modify Data Source', 'visualizer' ) : '1. ' . __( 'Choose Data Source', 'visualizer' );
884 + $bttn_label = 'visualizer_source_query_wp' === $source_of_chart ? __( 'Modify Filter', 'visualizer' ) : __( 'Create Filter', 'visualizer' );
885 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
886 + $schedules = apply_filters(
887 + 'visualizer_chart_schedules', array(
888 + '-1' => __( 'One-time', 'visualizer' ),
889 + ),
890 + 'wp',
891 + $chart_id
892 + );
893 + foreach ( $schedules as $num => $name ) {
894 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
895 + $extra = $num == $hours ? 'selected' : '';
896 + ?>
897 + <option value="<?php echo $num; ?>" <?php echo $extra; ?>><?php echo $name; ?></option>
898 + <?php
899 + }
900 + do_action( 'visualizer_chart_schedules_spl', 'wp', $chart_id, 1 );
1058 901 ?>
902 + </select>
1059 903
1060 - <!-- Step 1: Choose / modify data source -->
1061 - <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 ); ?>">
1062 -
1063 - <!-- Step 2: Sync schedule toggle -->
1064 - <div id="vz-wp-sync-step">
1065 - <button type="button" id="vz-wp-sync-btn" class="vz-import-step-toggle" aria-expanded="<?php echo $is_wp_source ? 'true' : 'false'; ?>">
1066 - <?php echo '2. ' . __( 'Set Sync Schedule', 'visualizer' ); ?>
1067 - <span class="dashicons dashicons-arrow-down-alt2"></span>
1068 - </button>
1069 - <div id="vz-wp-sync-options"<?php echo $is_wp_source ? '' : ' style="display:none"'; ?>>
1070 - <select name="refresh" id="vz-filter-import-time" class="visualizer-select">
1071 - <?php
1072 - $schedules = apply_filters(
1073 - 'visualizer_chart_schedules', array(
1074 - '-1' => __( 'One-time', 'visualizer' ),
1075 - ),
1076 - 'wp',
1077 - $chart_id
1078 - );
1079 - foreach ( $schedules as $num => $name ) {
1080 - $extra = self::is_hour_selected( $hours, $num ) ? 'selected' : '';
1081 - ?>
1082 - <option value="<?php echo esc_attr( $num ); ?>" <?php echo esc_attr( $extra ); ?>><?php echo esc_html( $name ); ?></option>
1083 - <?php
1084 - }
1085 - do_action( 'visualizer_chart_schedules_spl', 'wp', $chart_id, 1 );
1086 - ?>
1087 - </select>
1088 - <input type="button" id="db-filter-save-button" class="button button-primary" value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
1089 - </div>
1090 - </div>
904 + <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; ?>">
905 + <input type="button" id="db-filter-save-button" class="button button-primary" value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
906 + <?php echo apply_filters( 'visualizer_pro_upsell', '', 'db-query' ); ?>
1091 907 </form>
1092 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-wp', 'https://docs.themeisle.com/article/1278-how-to-import-data-from-wordpress' ); ?>
908 + <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-wp' ); ?>
1093 909 </div>
1094 910 </div>
1095 911 </li>
1096 912
1097 - <!-- import from WooCommerce -->
1098 913 <?php
1099 - if ( class_exists( 'WooCommerce', false ) ) :
1100 - $wc_source = strtolower( get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_WOOCOMMERCE_SOURCE, true ) );
1101 - $wc_source_list = apply_filters(
1102 - 'visualizer_woocommerce_report_endpoints',
914 + $save_query = add_query_arg(
1103 915 array(
1104 - array(
1105 - 'name' => esc_html__( 'Sales', 'visualizer' ),
1106 - 'endpoint' => esc_attr( 'sales' ),
1107 - ),
1108 - array(
1109 - 'name' => esc_html__( 'Top Sellers', 'visualizer' ),
1110 - 'endpoint' => esc_attr( 'top_sellers' ),
1111 - ),
1112 - array(
1113 - 'name' => esc_html__( 'Coupons Totals', 'visualizer' ),
1114 - 'endpoint' => esc_attr( 'coupons/totals' ),
1115 - ),
1116 - array(
1117 - 'name' => esc_html__( 'Customers Totals', 'visualizer' ),
1118 - 'endpoint' => esc_attr( 'customers/totals' ),
1119 - ),
1120 - array(
1121 - 'name' => esc_html__( 'Orders Totals', 'visualizer' ),
1122 - 'endpoint' => esc_attr( 'orders/totals' ),
1123 - ),
1124 - array(
1125 - 'name' => esc_html__( 'Products Totals', 'visualizer' ),
1126 - 'endpoint' => esc_attr( 'products/totals' ),
1127 - ),
1128 - array(
1129 - 'name' => esc_html__( 'Reviews Totals', 'visualizer' ),
1130 - 'endpoint' => esc_attr( 'reviews/totals' ),
1131 - ),
1132 - )
916 + 'action' => Visualizer_Plugin::ACTION_SAVE_DB_QUERY,
917 + 'security' => wp_create_nonce( Visualizer_Plugin::ACTION_SAVE_DB_QUERY . Visualizer_Plugin::VERSION ),
918 + 'chart' => $chart_id,
919 + ), admin_url( 'admin-ajax.php' )
1133 920 );
1134 - ?>
1135 - <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' ); ?> ">
1136 - <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>
1137 - <div class="viz-group-content edit-data-content">
1138 - <div>
1139 - <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>
1140 - <form id="vz-import-woo-report" action="<?php echo $upload_link; ?>" method="post" target="thehole" enctype="multipart/form-data">
1141 - <div class="remote-file-section">
1142 - <?php
1143 - $bttn_label = 'visualizer_source_json_wc' === $source_of_chart ? __( 'Modify Parameters', 'visualizer' ) : __( 'Create Parameters', 'visualizer' );
1144 - ?>
1145 - <p class="viz-group-description"><?php _e( 'How often do you want to check the URL', 'visualizer' ); ?></p>
1146 - <select name="time" id="vz-woo-time" class="visualizer-select json-form-element" data-chart="<?php echo $chart_id; ?>">
1147 - <?php
1148 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_JSON_SCHEDULE, true );
1149 - $schedules = apply_filters(
1150 - 'visualizer_chart_schedules', array(
1151 - '-1' => __( 'One-time', 'visualizer' ),
1152 - ),
1153 - 'json',
1154 - $chart_id
1155 - );
1156 - foreach ( $schedules as $num => $name ) {
1157 - $extra = self::is_hour_selected( $hours, $num ) ? 'selected' : '';
1158 - ?>
1159 - <option value="<?php echo esc_attr( $num ); ?>" <?php echo esc_attr( $extra ); ?>><?php echo esc_html( $name ); ?></option>
1160 - <?php
1161 - }
1162 - do_action( 'visualizer_chart_schedules_spl', 'json', $chart_id, 1 );
1163 - ?>
1164 - </select>
1165 - <p class="viz-group-description"><?php _e( 'Select report endpoint', 'visualizer' ); ?></p>
1166 - <select name="vz_woo_source" id="vz-woo-source" class="visualizer-select json-form-element" data-chart="<?php echo $chart_id; ?>">
1167 - <option value=""></option>
1168 - <?php
1169 - if ( ! empty( $wc_source_list ) ) {
1170 - foreach ( $wc_source_list as $api ) {
1171 - if ( isset( $api['name'] ) && $api['endpoint'] ) {
1172 - echo sprintf( '<option value="%2$s" %3$s>%1$s</option>', $api['name'], $api['endpoint'], selected( $wc_source, $api['endpoint'], false ) ); // phpcs:ignore
1173 - }
1174 - }
1175 - }
1176 - ?>
1177 - </select>
1178 - </div>
1179 -
1180 - <input type="button" id="woo-chart-button" class="button button-secondary show-chart-toggle"
1181 - value="<?php echo $bttn_label; ?>" data-current="chart"
1182 - data-t-filter="<?php _e( 'Show Chart', 'visualizer' ); ?>"
1183 - data-t-chart="<?php echo $bttn_label; ?>"
1184 - <?php empty( $wc_source ) ? 'disabled' : ''; ?>
1185 - >
1186 - <input type="button" id="woo-chart-save-button" class="button button-primary "
1187 - value="<?php _e( 'Save Schedule', 'visualizer' ); ?>" <?php empty( $wc_source ) ? 'disabled' : ''; ?>>
1188 - </form>
1189 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'import-wc-report' ); ?>
1190 - </div>
1191 - </div>
1192 - </li>
1193 - <?php endif; ?>
1194 - <?php
1195 - $save_query = esc_url(
1196 - add_query_arg(
1197 - array(
1198 - 'action' => Visualizer_Plugin::ACTION_SAVE_DB_QUERY,
1199 - 'security' => wp_create_nonce( Visualizer_Plugin::ACTION_SAVE_DB_QUERY . Visualizer_Plugin::VERSION ),
1200 - 'chart' => $chart_id,
1201 - ), admin_url( 'admin-ajax.php' )
1202 - )
1203 - );
1204 921 ?>
1205 922 <!-- import from db -->
1206 - <li class="viz-group visualizer_source_query <?php echo esc_attr( apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'db-query' ) ); ?>">
1207 - <h2 class="viz-group-title viz-sub-group" role="button" tabindex="0"><?php _e( 'Import from database', 'visualizer' ); ?><span
923 + <li class="viz-group visualizer_source_query <?php echo apply_filters( 'visualizer_pro_upsell_class', 'only-pro-feature', 'db-query' ); ?>">
924 + <h2 class="viz-group-title viz-sub-group"><?php _e( 'Import from database', 'visualizer' ); ?><span
1208 925 class="dashicons dashicons-lock"></span></h2>
1209 926 <div class="viz-group-content edit-data-content">
1210 927 <div>
1211 928 <p class="viz-group-description"><?php _e( 'You can import data from the database here.', 'visualizer' ); ?></p>
1212 - <form id="vz-db-wizard" action="<?php echo esc_url( $save_query ); ?>" method="post" target="thehole">
929 + <form id="vz-db-wizard" action="<?php echo $save_query; ?>" method="post" target="thehole">
930 + <p class="viz-group-description"><?php _e( 'How often do you want to refresh the data from the database.', 'visualizer' ); ?></p>
931 + <select name="refresh" id="vz-db-import-time" class="visualizer-select">
1213 932 <?php
1214 - $is_db_source = 'visualizer_source_query' === $source_of_chart;
1215 - $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
1216 - $bttn_label = $is_db_source ? __( '1. Modify Data Source', 'visualizer' ) : __( '1. Choose Data Source', 'visualizer' );
933 + $bttn_label = 'visualizer_source_query' === $source_of_chart ? __( 'Modify Query', 'visualizer' ) : __( 'Create Query', 'visualizer' );
934 + $hours = get_post_meta( $chart_id, Visualizer_Plugin::CF_DB_SCHEDULE, true );
935 + $schedules = apply_filters(
936 + 'visualizer_chart_schedules', array(
937 + '-1' => __( 'One-time', 'visualizer' ),
938 + ),
939 + 'db',
940 + $chart_id
941 + );
942 + foreach ( $schedules as $num => $name ) {
943 + // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison
944 + $extra = $num == $hours ? 'selected' : '';
945 + ?>
946 + <option value="<?php echo $num; ?>" <?php echo $extra; ?>><?php echo $name; ?></option>
947 + <?php
948 + }
949 + do_action( 'visualizer_chart_schedules_spl', 'db', $chart_id, 1 );
1217 950 ?>
1218 -
1219 - <!-- Step 1: Choose / modify data source -->
951 + </select>
1220 952 <input type="hidden" name="params" id="viz-db-wizard-params">
1221 - <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 ); ?>">
1222 953
1223 - <!-- Step 2: Sync schedule toggle -->
1224 - <div id="vz-db-sync-step">
1225 - <button type="button" id="vz-db-sync-btn" class="vz-import-step-toggle" aria-expanded="<?php echo $is_db_source ? 'true' : 'false'; ?>">
1226 - <?php echo '2. ' . __( 'Set Sync Schedule', 'visualizer' ); ?>
1227 - <span class="dashicons dashicons-arrow-down-alt2"></span>
1228 - </button>
1229 - <div id="vz-db-sync-options"<?php echo $is_db_source ? '' : ' style="display:none"'; ?>>
1230 - <select name="refresh" id="vz-db-import-time" class="visualizer-select">
1231 - <?php
1232 - $schedules = apply_filters(
1233 - 'visualizer_chart_schedules', array(
1234 - '-1' => __( 'One-time', 'visualizer' ),
1235 - ),
1236 - 'db',
1237 - $chart_id
1238 - );
1239 - foreach ( $schedules as $num => $name ) {
1240 - $extra = self::is_hour_selected( $hours, $num ) ? 'selected' : '';
1241 - ?>
1242 - <option value="<?php echo esc_attr( $num ); ?>" <?php echo esc_attr( $extra ); ?>><?php echo esc_html( $name ); ?></option>
1243 - <?php
1244 - }
1245 - do_action( 'visualizer_chart_schedules_spl', 'db', $chart_id, 1 );
1246 - ?>
1247 - </select>
1248 - <input type="button" id="db-chart-save-button" class="button button-primary" value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
1249 - </div>
1250 - </div>
1251 - <?php echo apply_filters( 'visualizer_pro_upsell', '', 'db-query', 'https://docs.themeisle.com/article/1279-how-to-import-data-from-a-database' ); ?>
954 + <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; ?>">
955 + <input type="button" id="db-chart-save-button" class="button button-primary" value="<?php _e( 'Save Schedule', 'visualizer' ); ?>">
956 + <?php echo apply_filters( 'visualizer_pro_upsell', '', 'db-query' ); ?>
1252 957 </form>
1253 958 </div>
1254 959 </div>
1255 960 </li>
961 +
962 + <!-- manual -->
963 + <li class="viz-group visualizer_source_manual">
964 + <h2 class="viz-group-title viz-sub-group visualizer-editor-tab" data-current="chart"><?php _e( 'Manual Data', 'visualizer' ); ?>
965 + <span class="dashicons dashicons-lock"></span>
966 + </h2>
967 + <div class="viz-group-content edit-data-content">
968 + <form id="editor-form" action="<?php echo $upload_link; ?>" method="post" target="thehole">
969 + <input type="hidden" id="chart-data" name="chart_data">
970 + <input type="hidden" id="chart-data-src" name="chart_data_src">
971 +
972 + <?php if ( Visualizer_Module::can_show_feature( 'simple-editor' ) ) { ?>
973 + <div>
974 + <p class="viz-group-description viz-editor-selection">
975 + <?php _e( 'Use the', 'visualizer' ); ?>
976 + <select name="editor-type" id="viz-editor-type">
977 + <?php
978 + if ( empty( $editor_type ) ) {
979 + $editor_type = Visualizer_Module::is_pro() ? 'excel' : 'text';
980 + }
981 + foreach ( apply_filters( 'visualizer_editors', array( 'text' => __( 'Text', 'visualizer' ), 'table' => __( 'Simple', 'visualizer' ) ) ) as $e_type => $e_label ) {
982 + ?>
983 + <option value="<?php echo $e_type; ?>" <?php selected( $editor_type, $e_type ); ?> ><?php echo $e_label; ?></option>
984 + <?php } ?>
985 + </select>
986 + <?php _e( 'editor to manually edit the chart data.', 'visualizer' ); ?>
987 + </p>
988 + <input type="button" id="editor-undo" class="button button-secondary" style="display: none" value="<?php _e( 'Undo Changes', 'visualizer' ); ?>">
989 + <input type="button" id="editor-button" class="button button-primary "
990 + value="<?php _e( 'Edit Data', 'visualizer' ); ?>" data-current="chart"
991 + data-t-editor="<?php _e( 'Show Chart', 'visualizer' ); ?>"
992 + data-t-chart="<?php _e( 'Edit Data', 'visualizer' ); ?>"
993 + >
994 + <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>
995 + </div>
996 + <?php } else { ?>
997 + <input type="button" id="editor-undo" class="button button-secondary" style="display: none" value="<?php _e( 'Undo Changes', 'visualizer' ); ?>">
998 + <input type="button" id="editor-chart-button" class="button button-primary "
999 + value="<?php _e( 'View Editor', 'visualizer' ); ?>" data-current="chart"
1000 + data-t-editor="<?php _e( 'Show Chart', 'visualizer' ); ?>"
1001 + data-t-chart="<?php _e( 'View Editor', 'visualizer' ); ?>"
1002 + >
1003 + <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>
1004 + <?php } ?>
1005 + </form>
1006 + </div>
1007 + </li>
1256 1008 </ul>
1257 1009 </li>
1258 1010 </ul>
1259 1011 </ul>
@@ -1260,41 +1012,6 @@
1260 1012
1261 1013 <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>
1262 1014 <iframe id="thehole" name="thehole"></iframe>
1263 1015 <?php
1264 - }
1265 -
1266 - /**
1267 - * Check if the given hour is selected.
1268 - *
1269 - * @param int|float|string $hour The hour.
1270 - * @param int|float|string $reference The number.
1271 - *
1272 - * @return bool
1273 - */
1274 - public static function is_hour_selected( $hour, $reference ) {
1275 -
1276 - if ( ! is_numeric( $hour ) || ! is_numeric( $reference ) ) {
1277 - return false;
1278 - }
1279 -
1280 - $hour = floatval( $hour );
1281 - $reference = floatval( $reference );
1282 -
1283 - if ( self::is_live_update_option( $reference ) ) {
1284 - $reference = self::$live_option_fallback_hour;
1285 - }
1286 -
1287 - return abs( $hour - $reference ) < 0.000001;
1288 - }
1289 -
1290 - /**
1291 - * Check if the reference option is deprecated live update option.
1292 - *
1293 - * @param float $reference_hour The reference hour.
1294 - *
1295 - * @return bool
1296 - */
1297 - public static function is_live_update_option( $reference_hour ) {
1298 - return abs( $reference_hour ) < 0.000001;
1299 1016 }
1300 1017 }