Skip to content

Commit

Permalink
Merge branch 'main' into main
Browse files Browse the repository at this point in the history
  • Loading branch information
arielk authored Nov 9, 2023
2 parents 3a4eada + d442801 commit 46c2566
Show file tree
Hide file tree
Showing 17 changed files with 3,940 additions and 182 deletions.
3 changes: 3 additions & 0 deletions .grunt-config/webpack.js
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ const entry = {
'responsive-bar': path.resolve( __dirname, '../assets/dev/js/editor/regions/responsive-bar/index.js' ),
'ai': path.resolve( __dirname, '../modules/ai/assets/js/editor/index.js' ),
'ai-layout': path.resolve( __dirname, '../modules/ai/assets/js/editor/layout-module.js' ),
'element-manager-admin': path.resolve( __dirname, '../modules/element-manager/assets/js/admin.js' ),
// Temporary solution for the AI App in the Admin.
'ai-admin': path.resolve( __dirname, '../modules/ai/assets/js/admin/index.js' ),
'styleguide': path.resolve( __dirname, '../modules/styleguide/assets/js/styleguide.js' ),
Expand All @@ -146,6 +147,8 @@ const externals = {
'@elementor/router': 'elementorAppPackages.router',
'@elementor/ui': 'elementorV2.ui',
'@elementor/icons': 'elementorV2.icons',
'@wordpress/dom-ready': 'wp.domReady',
'@wordpress/components': 'wp.components',
};

const plugins = [
Expand Down
4 changes: 4 additions & 0 deletions assets/dev/scss/admin/_system_info.scss
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@
tbody td:first-child {
width: 300px;
}

td {
white-space: break-spaces;
}
}
}

Expand Down
8 changes: 7 additions & 1 deletion bin/install-wp-tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,6 @@ install_wp() {
fi

mkdir -p $WP_CORE_DIR

if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then
mkdir -p /tmp/wordpress-nightly
download https://wordpress.org/nightly-builds/wordpress-latest.zip /tmp/wordpress-nightly/wordpress-nightly.zip
Expand All @@ -60,6 +59,13 @@ install_wp() {
tar --strip-components=1 -zxmf /tmp/wordpress.tar.gz -C $WP_CORE_DIR
fi

if [ -z "$(ls -A $WP_CORE_DIR/wp-content/themes/twentytwentyone)" ]; then
mkdir -p /tmp/twentytwentyone
download https://downloads.wordpress.org/theme/twentytwentyone.2.0.zip /tmp/twentytwentyone/twentytwentyone.zip
unzip -q /tmp/twentytwentyone/twentytwentyone.zip -d /tmp/twentytwentyone/
mv /tmp/twentytwentyone/twentytwentyone $WP_CORE_DIR/wp-content/themes
fi

download https://raw.github.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php
}

Expand Down
6 changes: 6 additions & 0 deletions core/common/modules/finder/categories/settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Elementor\Core\Common\Modules\Finder\Categories;

use Elementor\Core\Common\Modules\Finder\Base_Category;
use Elementor\Modules\ElementManager\Module as ElementManagerModule;
use Elementor\Settings as ElementorSettings;

if ( ! defined( 'ABSPATH' ) ) {
Expand Down Expand Up @@ -61,6 +62,11 @@ public function get_category_items( array $options = [] ) {
'url' => $settings_url . '#tab-experiments',
'keywords' => [ 'settings', 'elementor', 'experiments' ],
],
'element-manager' => [
'title' => esc_html__( 'Element Manager', 'elementor' ),
'url' => admin_url( 'admin.php?page=' . ElementManagerModule::PAGE_ID ),
'keywords' => [ 'settings', 'elements', 'widgets', 'manager' ],
],
];
}
}
1 change: 1 addition & 0 deletions core/modules-manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ public function get_modules_names() {
'shapes',
'favorites',
'admin-top-bar',
'element-manager',
'nested-elements',
// Depends on Nested Elements module
'nested-tabs',
Expand Down
17 changes: 15 additions & 2 deletions includes/managers/widgets.php
Original file line number Diff line number Diff line change
Expand Up @@ -234,16 +234,29 @@ public function register_widget_type( Widget_Base $widget ) {
*
* @param \Elementor\Widget_Base $widget_instance Elementor Widget.
*
* @return true True if the widget was registered.
* @return bool True if the widget was registered.
* @since 3.5.0
* @access public
*
*/
public function register( Widget_Base $widget_instance ) {
if ( is_null( $this->_widget_types ) ) {
$this->init_widgets();
}

/**
* Should widget be registered.
*
* @since 3.18.0
*
* @param bool $should_register Should widget be registered. Default is `true`.
* @param \Elementor\Widget_Base $widget_instance Widget instance.
*/
$should_register = apply_filters( 'elementor/widgets/is_widget_enabled', true, $widget_instance );

if ( ! $should_register ) {
return false;
}

$this->_widget_types[ $widget_instance->get_name() ] = $widget_instance;

return true;
Expand Down
39 changes: 39 additions & 0 deletions modules/element-manager/admin-menu-app.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
namespace Elementor\Modules\ElementManager;

use Elementor\Core\Admin\Menu\Interfaces\Admin_Menu_Item_With_Page;
use Elementor\Settings;

if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}

class Admin_Menu_App implements Admin_Menu_Item_With_Page {

public function is_visible() {
return true;
}

public function get_parent_slug() {
return Settings::PAGE_ID;
}

public function get_label() {
return esc_html__( 'Element Manager', 'elementor' );
}

public function get_page_title() {
return esc_html__( 'Element Manager', 'elementor' );
}

public function get_capability() {
return 'manage_options';
}

public function render() {
echo '<div class="wrap">';
echo '<h3 class="wp-heading-inline">' . esc_html__( 'Element Manager', 'elementor' ) . '</h3>';
echo '<div id="elementor-element-manager-wrap"></div>';
echo '</div>';
}
}
128 changes: 128 additions & 0 deletions modules/element-manager/ajax.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
<?php
namespace Elementor\Modules\ElementManager;

use Elementor\Modules\Usage\Module as Usage_Module;
use Elementor\Api;
use Elementor\Plugin;
use Elementor\Utils;

if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
}

class Ajax {

public function register_endpoints() {
add_action( 'wp_ajax_elementor_element_manager_get_admin_app_data', [ $this, 'ajax_get_admin_page_data' ] );
add_action( 'wp_ajax_elementor_element_manager_save_disabled_elements', [ $this, 'ajax_save_disabled_elements' ] );
add_action( 'wp_ajax_elementor_element_manager_get_widgets_usage', [ $this, 'ajax_get_widgets_usage' ] );
}

public function ajax_get_admin_page_data() {
$this->verify_permission();
$this->force_enabled_all_elements();

$widgets = [];
$plugins = [];

foreach ( Plugin::$instance->widgets_manager->get_widget_types() as $widget ) {
if ( ! $widget->show_in_panel() ) {
continue;
}

$plugin_name = $this->get_plugin_name_from_widget_instance( $widget );

if ( ! in_array( $plugin_name, $plugins ) ) {
$plugins[] = $plugin_name;
}

$widgets[] = [
'name' => $widget->get_name(),
'plugin' => $plugin_name,
'title' => $widget->get_title(),
];
}

$data = [
'disabled_elements' => Options::get_disabled_elements(),
'promotion_widgets' => [],
'widgets' => $widgets,
'plugins' => $plugins,
];

if ( ! Utils::has_pro() ) {
$data['promotion_widgets'] = Api::get_promotion_widgets();
}

wp_send_json_success( $data );
}

private function verify_permission() {
if ( ! current_user_can( 'manage_options' ) ) {
wp_send_json_error( esc_html__( 'You do not have permission to edit these settings.', 'elementor' ) );
}

$nonce = Utils::get_super_global_value( $_POST, 'nonce' ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
if ( empty( $nonce ) || ! wp_verify_nonce( $nonce, 'e-element-manager-app' ) ) {
wp_send_json_error( esc_html__( 'Invalid nonce.', 'elementor' ) );
}
}

private function force_enabled_all_elements() {
remove_all_filters( 'elementor/widgets/is_widget_enabled' );
}

private function get_plugin_name_from_widget_instance( $widget ) {
$class_reflection = new \ReflectionClass( $widget );

$plugin_basename = plugin_basename( $class_reflection->getFileName() );

$plugin_directory = strtok( $plugin_basename, '/' );

$plugins_data = get_plugins( '/' . $plugin_directory );
$plugin_data = array_shift( $plugins_data );

return $plugin_data['Name'] ?? esc_html__( 'Unknown', 'elementor' );
}

public function ajax_save_disabled_elements() {
$this->verify_permission();

$elements = Utils::get_super_global_value( $_POST, 'widgets' ); // phpcs:ignore WordPress.Security.NonceVerification.Missing

if ( empty( $elements ) ) {
wp_send_json_error( esc_html__( 'No elements to save.', 'elementor' ) );
}

$disabled_elements = json_decode( $elements );

if ( ! is_array( $disabled_elements ) ) {
wp_send_json_error( esc_html__( 'Unexpected elements data.', 'elementor' ) );
}

Options::update_disabled_elements( $disabled_elements );

wp_send_json_success();
}

public function ajax_get_widgets_usage() {
$this->verify_permission();

/** @var Usage_Module $usage_module */
$usage_module = Usage_Module::instance();
$usage_module->recalc_usage();

$widgets_usage = [];
foreach ( $usage_module->get_formatted_usage( 'raw' ) as $data ) {
foreach ( $data['elements'] as $element => $count ) {
if ( ! isset( $widgets_usage[ $element ] ) ) {
$widgets_usage[ $element ] = 0;
}

$widgets_usage[ $element ] += $count;
}
}

wp_send_json_success( $widgets_usage );
}
}
12 changes: 12 additions & 0 deletions modules/element-manager/assets/js/admin.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { render } from '@wordpress/element';
import domReady from '@wordpress/dom-ready';

import { App } from './app';

domReady( () => {
const htmlOutput = document.getElementById( 'elementor-element-manager-wrap' );

if ( htmlOutput ) {
render( <App />, htmlOutput );
}
} );
63 changes: 63 additions & 0 deletions modules/element-manager/assets/js/api.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
export const saveDisabledWidgets = async ( widgetsDisabled ) => {
try {
const response = await fetch( eElementManagerConfig.ajaxurl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams( {
action: 'elementor_element_manager_save_disabled_elements',
nonce: eElementManagerConfig.nonce,
widgets: JSON.stringify( widgetsDisabled ),
} ),
} );

const data = await response.json();
} catch ( error ) {
console.error( error );
}
};

export const getAdminAppData = async () => {
try {
const response = await fetch( eElementManagerConfig.ajaxurl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams( {
action: 'elementor_element_manager_get_admin_app_data',
nonce: eElementManagerConfig.nonce,
} ),
} );

const data = await response.json();
if ( data.success ) {
return data.data;
}
} catch ( error ) {
console.error( error );
}
};

export const getUsageWidgets = async () => {
try {
const response = await fetch( eElementManagerConfig.ajaxurl, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
body: new URLSearchParams( {
action: 'elementor_element_manager_get_widgets_usage',
nonce: eElementManagerConfig.nonce,
} ),
} );

const data = await response.json();
if ( data.success ) {
return data.data;
}
} catch ( error ) {
console.error( error );
}
};
Loading

0 comments on commit 46c2566

Please sign in to comment.