diff --git a/.distignore b/.distignore
index e76a78f8d..b212b148f 100755
--- a/.distignore
+++ b/.distignore
@@ -32,4 +32,4 @@ phpstan-baseline.neon
AGENTS.md
.wp-env.json
.claude
-
+classes/Visualizer/Gutenberg/src
diff --git a/.github/workflows/build-dev-artifacts.yml b/.github/workflows/build-dev-artifacts.yml
index 61b2c634a..54722a208 100755
--- a/.github/workflows/build-dev-artifacts.yml
+++ b/.github/workflows/build-dev-artifacts.yml
@@ -30,6 +30,7 @@ jobs:
- name: Create zip
run: |
npm ci
+ npm run gutenberg:build
CURRENT_VERSION=$(node -p -e "require('./package.json').version")
COMMIT_HASH=$(git rev-parse --short HEAD)
DEV_VERSION="${CURRENT_VERSION}-dev.${COMMIT_HASH}"
diff --git a/.github/workflows/deploy-wporg.yml b/.github/workflows/deploy-wporg.yml
index 2eba591cb..2c4d342cf 100644
--- a/.github/workflows/deploy-wporg.yml
+++ b/.github/workflows/deploy-wporg.yml
@@ -15,6 +15,7 @@ jobs:
- name: Build
run: |
npm ci
+ npm run gutenberg:build
composer install --no-dev --prefer-dist --no-progress --no-suggest
- name: WordPress Plugin Deploy
uses: 10up/action-wordpress-plugin-deploy@master
diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml
index c44e03ab0..08808862e 100755
--- a/.github/workflows/test-e2e.yml
+++ b/.github/workflows/test-e2e.yml
@@ -24,6 +24,7 @@ jobs:
- name: Install npm deps
run: |
npm ci
+ npm run gutenberg:build
npm install -g playwright-cli
npx playwright install --with-deps chromium
- name: Install composer deps
diff --git a/.gitignore b/.gitignore
index c4c9a71c3..ca03439b9 100755
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@ vendor
.DS_Store
artifacts
.phpunit.result.cache
+classes/Visualizer/Gutenberg/build
diff --git a/classes/Visualizer/Gutenberg/.eslintrc b/classes/Visualizer/Gutenberg/.eslintrc
deleted file mode 100644
index c578589bd..000000000
--- a/classes/Visualizer/Gutenberg/.eslintrc
+++ /dev/null
@@ -1,36 +0,0 @@
-{
- "env": {
- "browser": true,
- "es6": true
- },
- "extends": "wordpress",
- "parserOptions": {
- "ecmaFeatures": {
- "jsx": true
- },
- "ecmaVersion": 2018,
- "sourceType": "module"
- },
- "plugins": [
- "react"
- ],
- "rules": {
- "indent": [
- "off",
- "tab"
- ],
- "linebreak-style": [
- "off",
- "unix"
- ],
- "quotes": [
- "error",
- "single"
- ],
- "semi": [
- "error",
- "always"
- ],
- "no-cond-assign": "off"
- }
-}
\ No newline at end of file
diff --git a/classes/Visualizer/Gutenberg/Block.php b/classes/Visualizer/Gutenberg/Block.php
index 38b479ee9..a77cce4d6 100644
--- a/classes/Visualizer/Gutenberg/Block.php
+++ b/classes/Visualizer/Gutenberg/Block.php
@@ -64,20 +64,26 @@ private function __construct() {
}
/**
- * Enqueue front end and editor JavaScript and CSS
+ * Enqueue Gutenberg block assets.
*/
public function enqueue_gutenberg_scripts() {
- global $wp_version, $pagenow;
-
- $blockPath = VISUALIZER_ABSURL . 'classes/Visualizer/Gutenberg/build/block.js';
- $handsontableJS = VISUALIZER_ABSURL . 'classes/Visualizer/Gutenberg/build/handsontable.js';
- $stylePath = VISUALIZER_ABSURL . 'classes/Visualizer/Gutenberg/build/block.css';
- $handsontableCSS = VISUALIZER_ABSURL . 'classes/Visualizer/Gutenberg/build/handsontable.css';
+ global $pagenow;
+
+ $blockPath = VISUALIZER_ABSURL . 'classes/Visualizer/Gutenberg/build/index.js';
+ $stylePath = VISUALIZER_ABSURL . 'classes/Visualizer/Gutenberg/build/style-index.css';
+ $asset_path = VISUALIZER_ABSPATH . '/classes/Visualizer/Gutenberg/build/index.asset.php';
+ if ( file_exists( $asset_path ) ) {
+ // @phpstan-ignore-next-line
+ $asset = require $asset_path;
+ } else {
+ $asset = array(
+ 'dependencies' => array(),
+ 'version' => $this->version,
+ );
+ }
if ( VISUALIZER_TEST_JS_CUSTOMIZATION ) {
- $version = filemtime( VISUALIZER_ABSPATH . '/classes/Visualizer/Gutenberg/build/block.js' );
- } else {
- $version = $this->version;
+ $asset['version'] = filemtime( VISUALIZER_ABSPATH . '/classes/Visualizer/Gutenberg/build/index.js' );
}
if ( ! wp_script_is( 'visualizer-datatables', 'registered' ) ) {
@@ -89,32 +95,30 @@ public function enqueue_gutenberg_scripts() {
}
// Enqueue the bundled block JS file
- wp_enqueue_script( 'handsontable', $handsontableJS );
- wp_enqueue_script( 'visualizer-gutenberg-block', $blockPath, array( 'wp-api', 'handsontable', 'visualizer-datatables', 'moment', 'lodash' ), $version, true );
-
- $type = 'community';
-
- if ( Visualizer_Module::is_pro() ) {
- $type = 'pro';
- if ( apply_filters( 'visualizer_is_business', false ) ) {
- $type = 'business';
- }
+ $script_deps = array(
+ 'wp-api',
+ 'wp-blocks',
+ 'wp-block-editor',
+ 'wp-components',
+ 'wp-editor',
+ 'wp-element',
+ 'wp-i18n',
+ 'lodash',
+ 'moment',
+ 'react',
+ 'visualizer-datatables',
+ );
+ if ( isset( $asset['dependencies'] ) && is_array( $asset['dependencies'] ) ) {
+ $script_deps = array_merge( $script_deps, $asset['dependencies'] );
}
-
- $table_col_mapping = Visualizer_Source_Query_Params::get_all_db_tables_column_mapping( null, false );
+ $script_deps = array_values( array_unique( $script_deps ) );
+ wp_enqueue_script( 'visualizer-gutenberg-block', $blockPath, $script_deps, $asset['version'], true );
$translation_array = array(
- 'isPro' => $type,
- 'proTeaser' => tsdk_utmify( Visualizer_Plugin::PRO_TEASER_URL, 'blockupsell'),
- 'absurl' => VISUALIZER_ABSURL,
- 'charts' => Visualizer_Module_Admin::_getChartTypesLocalized(),
'adminPage' => menu_page_url( 'visualizer', false ),
'createChart' => add_query_arg( array( 'action' => 'visualizer-create-chart', 'library' => 'yes', 'type' => '', 'chart-library' => '', 'tab' => 'visualizer' ), admin_url( 'admin-ajax.php' ) ),
- 'sqlTable' => $table_col_mapping,
'chartsPerPage' => defined( 'TI_E2E_TESTING' ) ? 20 : 6,
- 'proFeaturesLocked' => Visualizer_Module_Admin::proFeaturesLocked(),
'isFullSiteEditor' => 'site-editor.php' === $pagenow,
- 'legacyBlockEdit' => apply_filters( 'visualizer_legacy_block_edit', false ),
/* translators: %1$s: opening tag, %2$s: closing tag */
'blockEditDoc' => sprintf( __( 'The editor for managing chart settings has been removed from the block editor. You can find more information in this %1$sdocumentation%2$s', 'visualizer' ), '', '' ),
'chartEditUrl' => admin_url( 'admin-ajax.php' ),
@@ -122,26 +126,7 @@ public function enqueue_gutenberg_scripts() {
wp_localize_script( 'visualizer-gutenberg-block', 'visualizerLocalize', $translation_array );
// Enqueue frontend and editor block styles
- wp_enqueue_style( 'handsontable', $handsontableCSS );
- wp_enqueue_style( 'visualizer-gutenberg-block', $stylePath, array( 'visualizer-datatables' ), $version );
-
- if ( version_compare( $wp_version, '4.9.0', '>' ) ) {
-
- wp_enqueue_code_editor(
- array(
- 'type' => 'sql',
- 'codemirror' => array(
- 'autofocus' => true,
- 'lineWrapping' => true,
- 'dragDrop' => false,
- 'matchBrackets' => true,
- 'autoCloseBrackets' => true,
- 'extraKeys' => array( 'Shift-Space' => 'autocomplete' ),
- 'hintOptions' => array( 'tables' => $table_col_mapping ),
- ),
- )
- );
- }
+ wp_enqueue_style( 'visualizer-gutenberg-block', $stylePath, array( 'visualizer-datatables' ), $asset['version'] );
}
/**
* Hook server side rendering into render callback
@@ -215,123 +200,6 @@ public function register_rest_endpoints() {
'get_callback' => array( $this, 'get_visualizer_data' ),
)
);
-
- register_rest_route(
- 'visualizer/v' . VISUALIZER_REST_VERSION,
- '/get-query-data',
- array(
- 'methods' => 'GET',
- 'callback' => array( $this, 'get_query_data' ),
- 'permission_callback' => function () {
- return current_user_can( 'edit_posts' );
- },
- )
- );
-
- register_rest_route(
- 'visualizer/v' . VISUALIZER_REST_VERSION,
- '/get-json-root',
- array(
- 'methods' => 'GET',
- 'callback' => array( $this, 'get_json_root_data' ),
- 'args' => array(
- 'url' => array(
- 'sanitize_callback' => 'esc_url_raw',
- ),
- ),
- 'permission_callback' => function () {
- return current_user_can( 'edit_posts' );
- },
- )
- );
-
- register_rest_route(
- 'visualizer/v' . VISUALIZER_REST_VERSION,
- '/get-json-data',
- array(
- 'methods' => 'GET',
- 'callback' => array( $this, 'get_json_data' ),
- 'args' => array(
- 'url' => array(
- 'sanitize_callback' => 'esc_url_raw',
- ),
- 'chart' => array(
- 'sanitize_callback' => 'absint',
- ),
- ),
- 'permission_callback' => function () {
- return current_user_can( 'edit_posts' );
- },
- )
- );
-
- register_rest_route(
- 'visualizer/v' . VISUALIZER_REST_VERSION,
- '/set-json-data',
- array(
- 'methods' => 'GET',
- 'callback' => array( $this, 'set_json_data' ),
- 'args' => array(
- 'url' => array(
- 'sanitize_callback' => 'esc_url_raw',
- ),
- ),
- 'permission_callback' => function () {
- return current_user_can( 'edit_posts' );
- },
- )
- );
-
- register_rest_route(
- 'visualizer/v' . VISUALIZER_REST_VERSION,
- '/update-chart',
- array(
- 'methods' => 'POST',
- 'callback' => array( $this, 'update_chart_data' ),
- 'args' => array(
- 'id' => array(
- 'sanitize_callback' => 'absint',
- ),
- ),
- 'permission_callback' => function () {
- return current_user_can( 'edit_posts' );
- },
- )
- );
-
- register_rest_route(
- 'visualizer/v' . VISUALIZER_REST_VERSION,
- '/upload-data',
- array(
- 'methods' => 'POST',
- 'callback' => array( $this, 'upload_csv_data' ),
- 'args' => array(
- 'url' => array(
- 'sanitize_callback' => 'esc_url_raw',
- ),
- ),
- 'permission_callback' => function () {
- return current_user_can( 'edit_posts' );
- },
- )
- );
-
- register_rest_route(
- 'visualizer/v' . VISUALIZER_REST_VERSION,
- '/get-permission-data',
- array(
- 'methods' => 'GET',
- 'callback' => array( $this, 'get_permission_data' ),
- 'args' => array(
- 'type' => array(
- 'sanitize_callback' => 'sanitize_text_field',
- ),
- ),
- 'permission_callback' => function () {
- return current_user_can( 'edit_posts' );
- },
- )
- );
}
/**
@@ -486,227 +354,6 @@ public function get_visualizer_data( $post ) {
return $data;
}
- /**
- * Returns the data for the query.
- *
- * @access public
- */
- public function get_query_data( $data ) {
- if ( ! current_user_can( 'administrator' ) || ( is_multisite() && ! is_super_admin() ) ) {
- return false;
- }
-
- $source = new Visualizer_Source_Query( stripslashes( $data['query'] ) );
- $html = $source->fetch( true );
- $source->fetch( false );
- $name = $source->getSourceName();
- $series = $source->getSeries();
- $data = $source->getRawData();
- $error = '';
- if ( empty( $html ) ) {
- $error = $source->get_error();
- wp_send_json_error( array( 'msg' => $error ) );
- }
- wp_send_json_success( array( 'table' => $html, 'name' => $name, 'series' => $series, 'data' => $data ) );
- }
-
- /**
- * Returns the JSON root.
- *
- * @access public
- */
- public function get_json_root_data( $data ) {
- if ( ! current_user_can( 'edit_posts' ) ) {
- return false;
- }
-
- $source = new Visualizer_Source_Json( $data );
-
- $roots = $source->fetchRoots();
- if ( empty( $roots ) ) {
- wp_send_json_error( array( 'msg' => $source->get_error() ) );
- }
-
- wp_send_json_success( array( 'url' => $data['url'], 'roots' => $roots ) );
- }
-
- /**
- * Returns the JSON data.
- *
- * @access public
- */
- public function get_json_data( $data ) {
- if ( ! current_user_can( 'edit_posts' ) ) {
- return false;
- }
-
- $chart_id = $data['chart'];
-
- if ( empty( $chart_id ) ) {
- wp_die();
- }
-
- $source = new Visualizer_Source_Json( $data );
- $source->fetch();
- $table = $source->getRawData();
-
- if ( empty( $table ) ) {
- wp_send_json_error( array( 'msg' => esc_html__( 'Unable to fetch data from the endpoint. Please try again.', 'visualizer' ) ) );
- }
-
- $table = Visualizer_Render_Layout::show( 'editor-table', $table, $chart_id, 'viz-json-table', false, false );
- wp_send_json_success( array( 'table' => $table, 'root' => $data['root'], 'url' => $data['url'], 'paging' => $source->getPaginationElements() ) );
- }
-
- /**
- * Set the JSON data.
- *
- * @access public
- */
- public function set_json_data( $data ) {
- if ( ! current_user_can( 'edit_posts' ) ) {
- return false;
- }
-
- $source = new Visualizer_Source_Json( $data );
-
- $table = $source->fetch();
- if ( empty( $table ) ) {
- wp_send_json_error( array( 'msg' => esc_html__( 'Unable to fetch data from the endpoint. Please try again.', 'visualizer' ) ) );
- }
-
- $source->fetchFromEditableTable();
- $name = $source->getSourceName();
- $series = json_encode( $source->getSeries() );
- $data = json_encode( $source->getRawData() );
- wp_send_json_success( array( 'name' => $name, 'series' => $series, 'data' => $data ) );
- }
-
- /**
- * Rest Callback Method
- */
- public function update_chart_data( $data ) {
- if ( ! current_user_can( 'edit_posts' ) ) {
- return false;
- }
-
- if ( $data['id'] && ! is_wp_error( $data['id'] ) ) {
- if ( get_post_type( $data['id'] ) !== Visualizer_Plugin::CPT_VISUALIZER ) {
- return new WP_Error( 'invalid_post_type', 'Invalid post type.' );
- }
- $chart_type = sanitize_text_field( $data['visualizer-chart-type'] );
- $source_type = sanitize_text_field( $data['visualizer-source'] );
- $default_data = (int) $data['visualizer-default-data'];
- $series_data = map_deep( $data['visualizer-series'], array( $this, 'sanitize_value' ) );
- $settings_data = map_deep( $data['visualizer-settings'], array( $this, 'sanitize_value' ) );
-
- update_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_TYPE, $chart_type );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_SOURCE, $source_type );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_DEFAULT_DATA, $default_data );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_SERIES, $series_data );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_SETTINGS, $settings_data );
-
- if ( $data['visualizer-chart-url'] && $data['visualizer-chart-schedule'] >= 0 ) {
- $chart_url = esc_url_raw( $data['visualizer-chart-url'] );
- $chart_schedule = intval( $data['visualizer-chart-schedule'] );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_URL, $chart_url );
- apply_filters( 'visualizer_pro_chart_schedule', $data['id'], $chart_url, $chart_schedule );
- } else {
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_URL );
- apply_filters( 'visualizer_pro_remove_schedule', $data['id'] );
- }
-
- // let's check if this is not an external db chart
- // as there is no support for that in the block editor interface
- $external_params = get_post_meta( $data['id'], Visualizer_Plugin::CF_REMOTE_DB_PARAMS, true );
- if ( empty( $external_params ) ) {
- if ( $source_type === 'Visualizer_Source_Query' ) {
- $db_schedule = intval( $data['visualizer-db-schedule'] );
- $db_query = $data['visualizer-db-query'];
- update_post_meta( $data['id'], Visualizer_Plugin::CF_DB_SCHEDULE, $db_schedule );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_DB_QUERY, stripslashes( $db_query ) );
- } else {
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_DB_SCHEDULE );
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_DB_QUERY );
- }
-
- if ( 'Visualizer_Source_Csv_Remote' === $source_type ) {
- $schedule_url = esc_url_raw( $data['visualizer-chart-url'] );
- $schedule_id = intval( $data['visualizer-chart-schedule'] );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_URL, $schedule_url );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_SCHEDULE, $schedule_id );
- } else {
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_URL );
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_CHART_SCHEDULE );
- }
- }
-
- if ( $source_type === 'Visualizer_Source_Json' ) {
- $json_schedule = intval( $data['visualizer-json-schedule'] );
- $json_url = esc_url_raw( $data['visualizer-json-url'] );
- $json_headers = esc_url_raw( $data['visualizer-json-headers'] );
- $json_root = sanitize_text_field( $data['visualizer-json-root'] );
- $json_paging = sanitize_text_field( $data['visualizer-json-paging'] );
-
- update_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_SCHEDULE, $json_schedule );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_URL, $json_url );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_HEADERS, $json_headers );
- update_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_ROOT, $json_root );
-
- if ( ! empty( $json_paging ) ) {
- update_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_PAGING, $json_paging );
- } else {
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_PAGING );
- }
- } else {
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_SCHEDULE );
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_URL );
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_HEADERS );
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_ROOT );
- delete_post_meta( $data['id'], Visualizer_Plugin::CF_JSON_PAGING );
- }
-
- if ( Visualizer_Module::is_pro() ) {
- $permissions_data = map_deep( $data['visualizer-permissions'], array( $this, 'sanitize_value' ) );
- update_post_meta( $data['id'], Visualizer_Pro::CF_PERMISSIONS, $permissions_data );
- }
-
- if ( $data['visualizer-chart-url'] ) {
- $chart_url = esc_url_raw( $data['visualizer-chart-url'] );
- $content['source'] = $chart_url;
- $content['data'] = $this->format_chart_data( $data['visualizer-data'], $data['visualizer-series'] );
- } else {
- $content = $this->format_chart_data( $data['visualizer-data'], $data['visualizer-series'] );
- }
-
- $chart = array(
- 'ID' => $data['id'],
- 'post_content' => serialize( $content ),
- );
-
- wp_update_post( $chart );
-
- // Clear existing chart cache.
- $cache_key = Visualizer_Plugin::CF_CHART_CACHE . '_' . $data['id'];
- if ( get_transient( $cache_key ) ) {
- delete_transient( $cache_key );
- }
-
- $revisions = wp_get_post_revisions( $data['id'], array( 'order' => 'ASC' ) );
-
- if ( count( $revisions ) > 1 ) {
- $revision_ids = array_keys( $revisions );
-
- // delete all revisions.
- foreach ( $revision_ids as $id ) {
- wp_delete_post_revision( $id );
- }
- }
-
- return new \WP_REST_Response( array( 'success' => sprintf( 'Chart updated' ) ) );
- }
- }
-
/**
* Format chart data.
*
@@ -714,7 +361,7 @@ public function update_chart_data( $data ) {
*/
public function format_chart_data( $data, $series ) {
foreach ( $series as $i => $row ) {
- // if no value exists for the seires, then add null
+ // if no value exists for the series, then add null
if ( ! isset( $series[ $i ] ) ) {
$series[ $i ] = null;
}
@@ -768,84 +415,6 @@ public function toUTF8( $datum ) {
return $datum;
}
- /**
- * Handle remote CSV data
- */
- public function upload_csv_data( $data ) {
- if ( ! current_user_can( 'edit_posts' ) ) {
- return false;
- }
-
- $remote_data = false;
- if ( isset( $data['url'] ) && function_exists( 'wp_http_validate_url' ) ) {
- $remote_data = wp_http_validate_url( $data['url'] );
- }
- if ( false !== $remote_data && ! is_wp_error( $remote_data ) ) {
- $source = new Visualizer_Source_Csv_Remote( $remote_data );
- if ( $source->fetch() ) {
- $temp = $source->getData();
- if ( is_string( $temp ) && is_array( unserialize( $temp ) ) ) {
- $content['series'] = $source->getSeries();
- $content['data'] = $source->getRawData();
- return $content;
- } else {
- return new \WP_REST_Response( array( 'failed' => sprintf( 'Invalid CSV URL' ) ) );
- }
- } else {
- return new \WP_REST_Response( array( 'failed' => sprintf( 'Invalid CSV URL' ) ) );
- }
- } else {
- return new \WP_REST_Response( array( 'failed' => sprintf( 'Invalid CSV URL' ) ) );
- }
- }
-
- /**
- * Get permission data
- */
- public function get_permission_data( $data ) {
- if ( ! current_user_can( 'edit_posts' ) ) {
- return false;
- }
-
- $options = array();
- switch ( $data['type'] ) {
- case 'users':
- $query = new WP_User_Query(
- array(
- 'number' => 1000,
- 'orderby' => 'display_name',
- 'fields' => array( 'ID', 'display_name' ),
- 'count_total' => false,
- )
- );
- $users = $query->get_results();
- if ( ! empty( $users ) ) {
- $i = 0;
- foreach ( $users as $user ) {
- $options[ $i ]['value'] = $user->ID;
- $options[ $i ]['label'] = $user->display_name;
- ++$i;
- }
- }
- break;
- case 'roles':
- if ( ! function_exists( 'get_editable_roles' ) ) {
- require_once ABSPATH . 'wp-admin/includes/user.php';
- }
- $roles = get_editable_roles();
- if ( ! empty( $roles ) ) {
- $i = 0;
- foreach ( get_editable_roles() as $name => $info ) {
- $options[ $i ]['value'] = $name;
- $options[ $i ]['label'] = $name;
- ++$i;
- }
- }
- break;
- }
- return $options;
- }
-
/**
* Filter Rest Query
*/
@@ -867,18 +436,4 @@ public function add_rest_query_vars( $args, \WP_REST_Request $request ) {
}
return $args;
}
-
- /**
- * Sanitize value.
- *
- * @param mixed $value The value to sanitize.
- * @return mixed Sanitized value.
- */
- public function sanitize_value( $value ) {
- if ( is_string( $value ) ) {
- return sanitize_text_field( $value );
- }
-
- return $value;
- }
}
diff --git a/classes/Visualizer/Gutenberg/build/block.css b/classes/Visualizer/Gutenberg/build/block.css
deleted file mode 100644
index a5a300aed..000000000
--- a/classes/Visualizer/Gutenberg/build/block.css
+++ /dev/null
@@ -1 +0,0 @@
-.visualizer-settings{background-color:#f8f9f9;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:13px;position:relative}.visualizer-settings .visualizer-settings__title{margin:0;padding:1.5rem 0;text-align:center;border-bottom:1px solid #e6eaee}.visualizer-settings .visualizer-settings__title .dashicon{vertical-align:top;margin-right:.25em}.visualizer-settings .visualizer-settings__content{padding:2.5em 0}.visualizer-settings .visualizer-settings__content .visualizer-settings__content-description{margin:0 0 1.5em 0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;font-size:18px;text-align:center}.visualizer-settings .visualizer-settings__content .visualizer-settings__content-option{display:flex;align-items:flex-start;flex-wrap:wrap;margin:0 auto;padding:1.25em 1.5em;max-width:80%;background:#fff;border-width:1px 1px 0;border-style:solid;border-color:#e6eaee;cursor:pointer}.visualizer-settings .visualizer-settings__content .visualizer-settings__content-option.locked{cursor:default}.visualizer-settings .visualizer-settings__content .visualizer-settings__content-option.locked:hover{background:#fff}.visualizer-settings .visualizer-settings__content .visualizer-settings__content-option:hover{background:#f5f5f5}.visualizer-settings .visualizer-settings__content .visualizer-settings__content-option:last-of-type{border-bottom-width:1px}.visualizer-settings .visualizer-settings__content .visualizer-settings__content-option .visualizer-settings__content-option-title{max-width:80%;display:block;font-size:1.25em}.visualizer-settings .visualizer-settings__content .visualizer-settings__content-option .visualizer-settings__content-option-icon{align-self:center;margin-left:auto;color:#b9bcc2}.visualizer-settings .visualizer-settings__content .visualizer-settings__content-option .visualizer-settings__content-option-icon .dashicon{height:25px;width:25px}.visualizer-settings .visualizer-settings__charts{text-align:center;padding-bottom:25px}.visualizer-settings .visualizer-settings__charts .visualizer-settings__charts-grid{display:grid;grid-template-columns:50% 50%}.visualizer-settings .visualizer-settings__charts .visualizer-settings__charts-grid .visualizer-settings__charts-single{margin:25px;padding-bottom:50px;background-color:#efefef;position:relative}.visualizer-settings .visualizer-settings__charts .visualizer-settings__charts-grid .visualizer-settings__charts-single .visualizer-settings__charts-title{padding:10px;font-weight:bold;text-align:center}.visualizer-settings .visualizer-settings__charts .visualizer-settings__charts-grid .visualizer-settings__charts-single .visualizer-settings__charts-footer{font-size:small}.visualizer-settings .visualizer-settings__charts .visualizer-settings__charts-grid .visualizer-settings__charts-single .visualizer-settings__charts-controls{width:100%;position:absolute;bottom:0;padding:10px;font-weight:bold;text-align:center;cursor:pointer}.visualizer-settings .visualizer-settings__charts .dataTables_wrapper{background:#fff;padding:10px}.visualizer-settings .visualizer-settings__charts .visualizer-no-charts{padding-top:25px}.visualizer-settings .visualizer-settings__chart{text-align:center}.visualizer-settings .visualizer-settings__chart .dataTables_wrapper{background:#fff;padding:10px}.visualizer-settings .visualizer-settings__controls{margin:0;padding:1.5rem 0;text-align:center;border-top:1px solid #e6eaee}.visualizer-advanced-panel.components-panel__body.is-opened>.components-panel__body-title{margin-bottom:0}.visualizer-inner-sections{background:#f8f9f9}.visualizer-inner-sections .components-panel__body-toggle:hover{background:#eee}.visualizer-inner-sections ul.visualizer-list{list-style:disc;margin-left:15px}.components-panel__body-button .components-panel__body-toggle.components-button .dashicons-admin-tools{margin:-2px 6px -2px 0}.components-panel__body-button .components-panel__body-toggle.components-button .dashicons-admin-users{margin:-2px 6px -2px 0}.components-panel__body-button .components-panel__body-toggle.components-button .components-panel__arrow{width:48px;height:48px;right:0;border-top:1px solid #ddd;transform:translateY(-50%) rotate(270deg)}.components-panel__body-button.visualizer-panel-back .components-panel__body-title{background:#f3f3f3}.components-panel__body-button.visualizer-panel-back .components-panel__body-title:hover{background:#f3f3f3}.components-panel__body-button.visualizer-panel-back .components-panel__body-title .components-panel__body-toggle{margin:10px 0;background:#fff}.components-panel__body-button.visualizer-panel-back .components-panel__body-title .components-panel__body-toggle.components-button{padding-left:60px}.components-panel__body-button.visualizer-panel-back .components-panel__body-title .components-panel__body-toggle.components-button:hover .components-panel__arrow{background:#f3f3f3;border-width:1px 1px 0 1px;border-color:#ddd;border-style:solid}.components-panel__body-button.visualizer-panel-back .components-panel__body-title .components-panel__body-toggle.components-button .components-panel__arrow{left:0;transform:translateY(-50%) rotate(90deg)}.visualizer-chart-editor{max-width:100%;margin:25px 25px 0}.visualizer-chart-editor .htEditor{margin-bottom:20px}.visualizer-chart-editor .htEditor .htRowHeaders{height:auto !important;width:auto !important}.visualizer-chart-editor .htEditor .ht_master .wtHolder{height:auto !important;width:auto !important}.visualizer-json-query-modal .components-modal__content{padding-left:0;padding-right:0}.visualizer-json-query-modal .components-modal__content .components-modal__header{margin:0}.visualizer-json-query-modal .components-icon-button{margin:10px 0}.visualizer-json-query-modal .visualizer-json-query-modal-headers-panel{padding:0 0 1em 2.2em}.visualizer-json-query-modal .visualizer-json-query-modal-headers-panel .components-base-control{display:inline-block}.visualizer-json-query-modal .visualizer-json-query-modal-headers-panel .visualizer-json-query-modal-field-separator{padding:0 10px}.visualizer-json-query-modal .viz-editor-table tbody tr:first-child{background-color:#ececec !important}.visualizer-json-query-modal .viz-editor-table tr th{background-color:#ccc}.visualizer-json-query-modal .viz-editor-table thead tr th:nth-child(n+1){cursor:move !important}.visualizer-json-query-modal #visualizer-json-query-table{margin-bottom:10px}.visualizer-json-query-modal ul{list-style:disc;margin-left:10px}.visualizer-db-query-modal .CodeMirror-scroll{overflow:hidden !important;height:50%;margin:0;padding:0}.visualizer-db-query-modal .CodeMirror-wrap{height:200px;padding:15px;color:#fff;background:#282923;font-size:15px;margin-bottom:20px}.visualizer-db-query-modal .CodeMirror-wrap .CodeMirror-cursor{border-left:1px solid #fff !important}.visualizer-db-query-modal .CodeMirror-wrap .CodeMirror-placeholder{color:#fff}.visualizer-db-query-modal .CodeMirror-wrap pre{color:#fff !important}.visualizer-db-query-modal .CodeMirror-wrap .cm-keyword{color:#f92472 !important}.visualizer-db-query-modal .CodeMirror-wrap .cm-comment{color:#74705d !important}.visualizer-db-query-modal .CodeMirror-wrap .cm-number{color:#fff !important}.visualizer-db-query-modal .CodeMirror-wrap .cm-string{color:#fff !important}.visualizer-db-query-modal ul{list-style:disc;margin-left:10px}.visualizer-db-query-modal .db-wizard-error{color:red}.visualizer-db-query-modal .visualizer-db-query-actions .components-button:first-child{margin-right:10px}.htContextMenu:not(.htGhostTable){z-index:999999}.htDatepickerHolder,.CodeMirror-hints,.DTCR_clonedTable,.DTCR_pointer{z-index:999999 !important}.vz-permission-tab select.components-select-control__input{overflow:auto !important}.components-panel .components-select-control{height:auto !important}@media(min-width: 768px){.visualizer-json-query-modal{width:668px}.visualizer-db-query-modal .CodeMirror-wrap{min-width:550px}}@media(max-width: 768px){.visualizer-settings .visualizer-settings__charts .visualizer-settings__charts-grid{display:grid;grid-template-columns:100%}}.viz-edit-chart-new{display:flex;flex-direction:column;align-items:center;gap:12px}.viz-edit-chart-new p{padding:12px;padding-left:24px;color:#ff9901}.viz-edit-chart-new p a:hover{pointer:cursor}
diff --git a/classes/Visualizer/Gutenberg/build/block.js b/classes/Visualizer/Gutenberg/build/block.js
deleted file mode 100644
index 5e1cd447c..000000000
--- a/classes/Visualizer/Gutenberg/build/block.js
+++ /dev/null
@@ -1 +0,0 @@
-(()=>{var e,t={5644:function(e,t,n){!function(e,t,n){"use strict";t=t&&t.hasOwnProperty("default")?t.default:t,n=n&&n.hasOwnProperty("default")?n.default:n;var r=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},a=function(){function e(e,t){for(var n=0;n-1)return t}return e}}]),e}(),l=function(e){function l(){r(this,l);var e=i(this,(l.__proto__||Object.getPrototypeOf(l)).apply(this,arguments));return e.settingsMapper=new s,e.id=null,e.hotInstance=null,e.hotElementRef=null,e}return o(l,e),a(l,[{key:"setHotElementRef",value:function(e){this.hotElementRef=e}},{key:"componentDidMount",value:function(){var e=this.settingsMapper.getSettings(this.props);this.hotInstance=new t(this.hotElementRef,e)}},{key:"shouldComponentUpdate",value:function(e,t){return this.updateHot(this.settingsMapper.getSettings(e)),!1}},{key:"componentWillUnmount",value:function(){this.hotInstance.destroy()}},{key:"render",value:function(){return this.id=this.props.id||"hot-"+Math.random().toString(36).substring(5),this.className=this.props.className||"",this.style=this.props.style||{},n.createElement("div",{ref:this.setHotElementRef.bind(this),id:this.id,className:this.className,style:this.style})}},{key:"updateHot",value:function(e){this.hotInstance.updateSettings(e,!1)}}]),l}(n.Component);e.HotTable=l,Object.defineProperty(e,"__esModule",{value:!0})}(t,n(3748),n(6540))},2867:(e,t,n)=>{"use strict";var r=n(6540),a=n(9921),o=n.n(a),i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])},i(e,t)};function s(e,t){function n(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var l=function(){return l=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&a[a.length-1])||6!==o[0]&&2!==o[0])){i=0;continue}if(3===o[0]&&(!a||o[1]>a[0]&&o[1]0){var i=Array.from({length:o-1}).map((function(e,r){var o=t.getColumnID(a,r+1);return t.state.hiddenColumns.includes(o)?"#CCCCCC":void 0!==n.colors&&null!==n.colors?n.colors[r]:h[r]}));r.setOptions(l({},n,{colors:i})),r.draw()}}},t.onResize=function(){t.props.googleChartWrapper.draw()},t}return s(t,e),t.prototype.componentDidMount=function(){this.draw(this.props),window.addEventListener("resize",this.onResize),(this.props.legend_toggle||this.props.legendToggle)&&this.listenToLegendToggle()},t.prototype.componentWillUnmount=function(){var e=this.props,t=e.google,n=e.googleChartWrapper;window.removeEventListener("resize",this.onResize),t.visualization.events.removeAllListeners(n),"Timeline"===n.getChartType()&&n.getChart()&&n.getChart().clearChart()},t.prototype.componentDidUpdate=function(){this.draw(this.props)},t.prototype.render=function(){return null},t}(r.Component),L=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return s(t,e),t.prototype.componentDidMount=function(){},t.prototype.componentWillUnmount=function(){},t.prototype.shouldComponentUpdate=function(){return!1},t.prototype.render=function(){var e=this.props,t=e.google,n=e.googleChartWrapper,a=e.googleChartDashboard;return(0,r.createElement)(w,{render:function(e){return(0,r.createElement)(M,l({},e,{google:t,googleChartWrapper:n,googleChartDashboard:a}))}})},t}(r.Component),k=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return s(t,e),t.prototype.shouldComponentUpdate=function(){return!1},t.prototype.listenToEvents=function(e){var t=this,n=e.chartEvents,r=e.google,a=e.googleChartWrapper;if(null!==n){r.visualization.events.removeAllListeners(a);for(var o=function(e){var n=e.eventName,o=e.callback;r.visualization.events.addListener(a,n,(function(){for(var e=[],n=0;n1&&void 0!==arguments[1]?arguments[1]:0,n=(P[e[t+0]]+P[e[t+1]]+P[e[t+2]]+P[e[t+3]]+"-"+P[e[t+4]]+P[e[t+5]]+"-"+P[e[t+6]]+P[e[t+7]]+"-"+P[e[t+8]]+P[e[t+9]]+"-"+P[e[t+10]]+P[e[t+11]]+P[e[t+12]]+P[e[t+13]]+P[e[t+14]]+P[e[t+15]]).toLowerCase();if(!x(n))throw TypeError("Stringified UUID is invalid");return n};const z=function(e,t,n){var r=(e=e||{}).random||(e.rng||j)();if(r[6]=15&r[6]|64,r[8]=63&r[8]|128,t){n=n||0;for(var a=0;a<16;++a)t[n+a]=r[a];return t}return H(r)};function A(e){return A="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},A(e)}function N(e,t){for(var n=0;n)<[^<]*)*<\/script>/gi,""):r.series[t].format.truthy.replace(/