mirror of
https://fast.feibisi.com/https://github.com/lubusIN/visual-blueprint-builder.git
synced 2025-10-04 04:11:06 +08:00
wip
This commit is contained in:
parent
50ccbcb373
commit
d1697a6bc6
24 changed files with 19961 additions and 0 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -128,3 +128,6 @@ dist
|
||||||
.yarn/build-state.yml
|
.yarn/build-state.yml
|
||||||
.yarn/install-state.gz
|
.yarn/install-state.gz
|
||||||
.pnp.*
|
.pnp.*
|
||||||
|
|
||||||
|
/vendor/
|
||||||
|
/build
|
||||||
|
|
106
block-editor-playground-blueprint.php
Normal file
106
block-editor-playground-blueprint.php
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plugin Name: Block editor for playground blueprint
|
||||||
|
* Description: Design playground blueprints with a specialized block editor interface in WordPress.
|
||||||
|
* Version: 1.0.0
|
||||||
|
* Requires PHP: 7.4
|
||||||
|
* Author: Lubus
|
||||||
|
* Author URI: https://lubus.in/
|
||||||
|
* Contributor: Lubus, https://lubus.in/
|
||||||
|
* Text Domain: block-editor-for-playground-blueprint
|
||||||
|
*
|
||||||
|
* @package block-editor-for-playground-blueprint
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Lubus\BlockEditorForPlaygroundBlueprint;
|
||||||
|
|
||||||
|
use Lubus\Admin\BlockEditorForPlaygroundBlueprint\BlueprintPostType;
|
||||||
|
use Lubus\Admin\BlockEditorForPlaygroundBlueprint\BlueprintSteps;
|
||||||
|
use Lubus\Admin\BlockEditorForPlaygroundBlueprint\EnqueueScripts;
|
||||||
|
|
||||||
|
defined('ABSPATH') || exit;
|
||||||
|
|
||||||
|
require_once 'vendor/autoload.php';
|
||||||
|
require_once 'inc/functions.php';
|
||||||
|
|
||||||
|
if (!class_exists('BlockEditorForPlaygroundBlueprint')) {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Block editor for playground blueprint Main Class
|
||||||
|
*/
|
||||||
|
class BlockEditorForPlaygroundBlueprint
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The single instance of the class.
|
||||||
|
*
|
||||||
|
* @var BlockEditorForPlaygroundBlueprint
|
||||||
|
*/
|
||||||
|
protected static $_instance = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Singleton instance method.
|
||||||
|
*
|
||||||
|
* @return self
|
||||||
|
*/
|
||||||
|
public static function instance()
|
||||||
|
{
|
||||||
|
if (is_null(self::$_instance)) {
|
||||||
|
self::$_instance = new self();
|
||||||
|
}
|
||||||
|
return self::$_instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor to initialize the plugin.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->setup_constants();
|
||||||
|
$this->bootstrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup plugin constants.
|
||||||
|
*/
|
||||||
|
private function setup_constants()
|
||||||
|
{
|
||||||
|
// Plugin version.
|
||||||
|
if (!defined('BEPB_VERSION')) {
|
||||||
|
define('BEPB_VERSION', '0.1.0');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plugin Root File.
|
||||||
|
if (!defined('BEPB_PLUGIN_FILE')) {
|
||||||
|
define('BEPB_PLUGIN_FILE', __FILE__);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plugin Folder Path.
|
||||||
|
if (!defined('BEPB_PLUGIN_DIR')) {
|
||||||
|
define('BEPB_PLUGIN_DIR', plugin_dir_path(BEPB_PLUGIN_FILE));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plugin Folder URL.
|
||||||
|
if (!defined('BEPB_PLUGIN_URL')) {
|
||||||
|
define('BEPB_PLUGIN_URL', plugin_dir_url(BEPB_PLUGIN_FILE));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plugin Basename aka: "block-editor-for-playground-blueprint/block-editor-playground-blueprint.php".
|
||||||
|
if (!defined('BEPB_PLUGIN_BASENAME')) {
|
||||||
|
define('BEPB_PLUGIN_BASENAME', plugin_basename(BEPB_PLUGIN_FILE));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bootstraps the plugin.
|
||||||
|
*/
|
||||||
|
private function bootstrap()
|
||||||
|
{
|
||||||
|
new BlueprintPostType();
|
||||||
|
new BlueprintSteps();
|
||||||
|
new EnqueueScripts();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return BlockEditorForPlaygroundBlueprint::instance();
|
15
composer.json
Normal file
15
composer.json
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"name": "lubus/block-editor-for-playground-blueprint",
|
||||||
|
"description": "Design playground blueprints with a specialized block editor interface in WordPress.",
|
||||||
|
"autoload": {
|
||||||
|
"classmap": [
|
||||||
|
"inc/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "lubus"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require": {}
|
||||||
|
}
|
18
composer.lock
generated
Normal file
18
composer.lock
generated
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
{
|
||||||
|
"_readme": [
|
||||||
|
"This file locks the dependencies of your project to a known state",
|
||||||
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
|
"This file is @generated automatically"
|
||||||
|
],
|
||||||
|
"content-hash": "512d1fc7cf86404d62e199ad668cfb65",
|
||||||
|
"packages": [],
|
||||||
|
"packages-dev": [],
|
||||||
|
"aliases": [],
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"stability-flags": [],
|
||||||
|
"prefer-stable": false,
|
||||||
|
"prefer-lowest": false,
|
||||||
|
"platform": [],
|
||||||
|
"platform-dev": [],
|
||||||
|
"plugin-api-version": "2.6.0"
|
||||||
|
}
|
67
inc/admin/class-enqueue-scripts.php
Normal file
67
inc/admin/class-enqueue-scripts.php
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class handles registering and enqueueing scripts and styles.
|
||||||
|
*
|
||||||
|
* @package wordpress-popup-builder
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Lubus\Admin\BlockEditorForPlaygroundBlueprint;
|
||||||
|
|
||||||
|
class EnqueueScripts
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Constructor to initialize WordPress hooks.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
add_action('enqueue_block_editor_assets', [$this, 'enqueue_editor_scripts']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enqueues scripts and styles for the block editor based on a specific post type.
|
||||||
|
*/
|
||||||
|
public function enqueue_editor_scripts()
|
||||||
|
{
|
||||||
|
$screen = get_current_screen();
|
||||||
|
|
||||||
|
// Only enqueue scripts/styles for the 'blueprint' post type in the editor
|
||||||
|
if ('blueprint' !== $screen->post_type) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->enqueue_editor_js_scripts();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Enqueues the editor-specific js scripts.
|
||||||
|
*/
|
||||||
|
private function enqueue_editor_js_scripts()
|
||||||
|
{
|
||||||
|
$assetFile = $this->get_asset_file();
|
||||||
|
|
||||||
|
wp_enqueue_script(
|
||||||
|
'blueprint-editor',
|
||||||
|
BEPB_PLUGIN_URL . 'build/settings.js',
|
||||||
|
$assetFile['dependencies'],
|
||||||
|
$assetFile['version'],
|
||||||
|
true
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the asset file containing dependencies and version information.
|
||||||
|
*
|
||||||
|
* @return array|false The asset file array or false on failure.
|
||||||
|
*/
|
||||||
|
private function get_asset_file()
|
||||||
|
{
|
||||||
|
$assetFilePath = BEPB_PLUGIN_DIR . 'build/settings.asset.php';
|
||||||
|
|
||||||
|
if (file_exists($assetFilePath)) {
|
||||||
|
return require $assetFilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
60
inc/admin/class-register-post-type.php
Normal file
60
inc/admin/class-register-post-type.php
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class defines a custom post type for creating and managing blueprint.
|
||||||
|
*
|
||||||
|
* @package block-editor-for-playground-blueprint
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Lubus\Admin\BlockEditorForPlaygroundBlueprint;
|
||||||
|
|
||||||
|
class BlueprintPostType
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Construct that hooks into WordPress to initialize the post type and add custom columns.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
add_action('init', [$this, 'register_blueprint_post_type']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers the 'blueprint' post type with necessary arguments and labels.
|
||||||
|
*/
|
||||||
|
public function register_blueprint_post_type()
|
||||||
|
{
|
||||||
|
$labels = [
|
||||||
|
'name' => __('Blueprints'),
|
||||||
|
'singular_name' => __('Blueprint'),
|
||||||
|
'menu_name' => __('Blueprints'),
|
||||||
|
'name_admin_bar' => __('Blueprint'),
|
||||||
|
'add_new' => __('Add New Blueprint', 'blueprint'),
|
||||||
|
'add_new_item' => __('Add New Blueprint'),
|
||||||
|
'new_item' => __('New Blueprint'),
|
||||||
|
'edit_item' => __('Edit Blueprint'),
|
||||||
|
'view_item' => __('View Blueprint'),
|
||||||
|
'all_items' => __('All Blueprints'),
|
||||||
|
'search_items' => __('Search Blueprints'),
|
||||||
|
'parent_item_colon' => __('Parent Blueprints:'),
|
||||||
|
'not_found' => __('No blueprints found.'),
|
||||||
|
'not_found_in_trash' => __('No blueprints found in Trash.')
|
||||||
|
];
|
||||||
|
|
||||||
|
$args = [
|
||||||
|
'labels' => $labels,
|
||||||
|
'public' => true,
|
||||||
|
'publicly_queryable' => true,
|
||||||
|
'show_ui' => true,
|
||||||
|
'show_in_menu' => true,
|
||||||
|
'show_in_rest' => true,
|
||||||
|
'query_var' => true,
|
||||||
|
'rewrite' => ['slug' => 'blueprint'],
|
||||||
|
'has_archive' => false,
|
||||||
|
'hierarchical' => false,
|
||||||
|
'menu_icon' => 'dashicons-format-aside',
|
||||||
|
'supports' => ['title', 'author', 'editor'],
|
||||||
|
];
|
||||||
|
|
||||||
|
register_post_type('blueprint', $args);
|
||||||
|
}
|
||||||
|
}
|
29
inc/admin/class-register-steps.php
Normal file
29
inc/admin/class-register-steps.php
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class defines a custom blueprint steps.
|
||||||
|
*
|
||||||
|
* @package block-editor-for-playground-blueprint
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Lubus\Admin\BlockEditorForPlaygroundBlueprint;
|
||||||
|
|
||||||
|
class BlueprintSteps
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Construct that hooks into WordPress to initialize a blueprint steps.
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
add_action('init', [$this, 'register_blueprint_steps']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers the 'blueprint steps' with necessary arguments and labels.
|
||||||
|
*/
|
||||||
|
public function register_blueprint_steps()
|
||||||
|
{
|
||||||
|
register_block_type(BEPB_PLUGIN_DIR . 'build/steps/login');
|
||||||
|
register_block_type(BEPB_PLUGIN_DIR . 'build/steps/install-plugin');
|
||||||
|
}
|
||||||
|
}
|
43
inc/functions.php
Normal file
43
inc/functions.php
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filters the list of allowed block types in the block editor.
|
||||||
|
*
|
||||||
|
* This function restricts the available block types to Heading, List, Image, and Paragraph only.
|
||||||
|
*
|
||||||
|
* @param array|bool $allowed_block_types Array of block type slugs, or boolean to enable/disable all.
|
||||||
|
* @param object $block_editor_context The current block editor context.
|
||||||
|
*
|
||||||
|
* @return array The array of allowed block types.
|
||||||
|
*/
|
||||||
|
function example_allowed_block_types($allowed_block_types, $block_editor_context)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (get_current_screen()->post_type == 'blueprint') {
|
||||||
|
$allowed_block_types = [
|
||||||
|
'lubus/login',
|
||||||
|
'lubus/install-plugin',
|
||||||
|
];
|
||||||
|
|
||||||
|
return $allowed_block_types;
|
||||||
|
};
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
add_filter('allowed_block_types_all', 'example_allowed_block_types', 10000, 2);
|
||||||
|
|
||||||
|
function add_new_block_category($block_categories, $block_editor_context)
|
||||||
|
{
|
||||||
|
// Unshift the new category to the beginning of the array
|
||||||
|
array_unshift(
|
||||||
|
$block_categories,
|
||||||
|
[
|
||||||
|
'slug' => 'steps',
|
||||||
|
'title' => esc_html__('Steps', 'text-domain'),
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
return $block_categories;
|
||||||
|
}
|
||||||
|
|
||||||
|
add_filter('block_categories_all', 'add_new_block_category', 10, 2);
|
19038
package-lock.json
generated
Normal file
19038
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
20
package.json
Normal file
20
package.json
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
"name": "block-editor-for-playground-blueprint",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Design playground blueprints with a specialized block editor interface in WordPress.",
|
||||||
|
"main": "build/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "wp-scripts build",
|
||||||
|
"start": "wp-scripts start",
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "lubus",
|
||||||
|
"license": "ISC",
|
||||||
|
"devDependencies": {
|
||||||
|
"@wordpress/scripts": "^28.6.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@wordpress/blocks": "^13.7.0",
|
||||||
|
"@wordpress/icons": "^10.6.0"
|
||||||
|
}
|
||||||
|
}
|
134
src/settings/index.js
Normal file
134
src/settings/index.js
Normal file
|
@ -0,0 +1,134 @@
|
||||||
|
/**
|
||||||
|
* WordPress dependencies.
|
||||||
|
*/
|
||||||
|
import { __ } from '@wordpress/i18n';
|
||||||
|
import { registerPlugin } from '@wordpress/plugins';
|
||||||
|
import { PluginDocumentSettingPanel } from '@wordpress/editor';
|
||||||
|
import { __experimentalInspectorPopoverHeader as InspectorPopoverHeader } from '@wordpress/block-editor';
|
||||||
|
import {
|
||||||
|
Dropdown,
|
||||||
|
Button,
|
||||||
|
SelectControl,
|
||||||
|
__experimentalHStack as HStack,
|
||||||
|
__experimentalVStack as VStack,
|
||||||
|
__experimentalText as Text
|
||||||
|
} from '@wordpress/components';
|
||||||
|
import { copy, download, globe } from '@wordpress/icons';
|
||||||
|
import { useSelect } from '@wordpress/data';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PHP and WordPress version options for dropdowns.
|
||||||
|
*/
|
||||||
|
const PHP_VERSIONS = [
|
||||||
|
{ label: 'Latest', value: 'latest' },
|
||||||
|
{ label: '8.2', value: '8.2' },
|
||||||
|
{ label: '8.1', value: '8.1' },
|
||||||
|
{ label: '8.0', value: '8.0' },
|
||||||
|
{ label: '7.4', value: '7.4' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const WP_VERSIONS = [
|
||||||
|
{ label: 'Latest', value: 'latest' },
|
||||||
|
{ label: '6.2', value: '6.2' },
|
||||||
|
{ label: '6.1', value: '6.1' },
|
||||||
|
{ label: '6.0', value: '6.0' },
|
||||||
|
{ label: '5.6', value: '5.6' },
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reusable Dropdown component for version control.
|
||||||
|
* @param {string} label - The label for the dropdown.
|
||||||
|
* @param {Array} versions - List of versions for the dropdown.
|
||||||
|
* @param {string} defaultValue - The default selected version.
|
||||||
|
*/
|
||||||
|
const DropdownVersionControl = ({ label, versions, defaultValue }) => (
|
||||||
|
<HStack justify='left'>
|
||||||
|
<Text style={{ width: '30%' }}>{label}</Text>
|
||||||
|
<Dropdown
|
||||||
|
popoverProps={{
|
||||||
|
placement: 'left-start',
|
||||||
|
offset: 118,
|
||||||
|
shift: true,
|
||||||
|
}}
|
||||||
|
renderToggle={({ isOpen, onToggle }) => (
|
||||||
|
<Button
|
||||||
|
variant="tertiary"
|
||||||
|
onClick={onToggle}
|
||||||
|
aria-expanded={isOpen}
|
||||||
|
>
|
||||||
|
{defaultValue}
|
||||||
|
</Button>
|
||||||
|
)}
|
||||||
|
renderContent={({ onClose }) => (
|
||||||
|
<VStack style={{ minWidth: '240px', margin: '8px' }} spacing={0}>
|
||||||
|
<InspectorPopoverHeader
|
||||||
|
title={__(label)}
|
||||||
|
onClose={onClose}
|
||||||
|
/>
|
||||||
|
<SelectControl
|
||||||
|
label={label}
|
||||||
|
hideLabelFromVision
|
||||||
|
value={defaultValue}
|
||||||
|
options={versions}
|
||||||
|
onChange={() => { }} // Placeholder for actual change handling
|
||||||
|
/>
|
||||||
|
</VStack>
|
||||||
|
)}
|
||||||
|
/>
|
||||||
|
</HStack>
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main component for displaying version control in post status info.
|
||||||
|
*/
|
||||||
|
function BlueprintVersionControl() {
|
||||||
|
// const playgroundBase = "https://playground.wordpress.net/#";
|
||||||
|
|
||||||
|
// const blocks = useSelect((select) => select('core/block-editor').getBlocks(), []);
|
||||||
|
|
||||||
|
// const handleDownloadClick = () => {
|
||||||
|
// const blockAttributes = blocks.map(block => ({
|
||||||
|
// name: block.name,
|
||||||
|
// attributes: block.attributes,
|
||||||
|
// }));
|
||||||
|
// console.log(blockAttributes);
|
||||||
|
// };
|
||||||
|
|
||||||
|
return (
|
||||||
|
<PluginDocumentSettingPanel name='playground-settings' title='Playground Settings'>
|
||||||
|
<HStack justify='left'>
|
||||||
|
<Button variant="secondary" icon={globe} href={''} target='_new'>
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="secondary"
|
||||||
|
icon={copy}
|
||||||
|
onClick={() => { }}>
|
||||||
|
</Button>
|
||||||
|
<Button
|
||||||
|
variant="secondary"
|
||||||
|
icon={download}
|
||||||
|
href={''}
|
||||||
|
onClick={handleDownloadClick}
|
||||||
|
>
|
||||||
|
</Button>
|
||||||
|
</HStack>
|
||||||
|
<VStack spacing={1} style={{ width: '100%' }}>
|
||||||
|
<DropdownVersionControl
|
||||||
|
label="PHP version"
|
||||||
|
versions={PHP_VERSIONS}
|
||||||
|
defaultValue="8.0"
|
||||||
|
/>
|
||||||
|
<DropdownVersionControl
|
||||||
|
label="WP version"
|
||||||
|
versions={WP_VERSIONS}
|
||||||
|
defaultValue="Latest"
|
||||||
|
/>
|
||||||
|
</VStack>
|
||||||
|
</PluginDocumentSettingPanel>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers the 'blueprint-version-control' plugin.
|
||||||
|
*/
|
||||||
|
registerPlugin('blueprint-version-control', { render: BlueprintVersionControl });
|
52
src/steps/install-plugin/block.json
Normal file
52
src/steps/install-plugin/block.json
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://schemas.wp.org/trunk/block.json",
|
||||||
|
"apiVersion": 3,
|
||||||
|
"name": "lubus/install-plugin",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"title": "Install Plugin",
|
||||||
|
"category": "steps",
|
||||||
|
"icon": "admin-plugins",
|
||||||
|
"description": "Installs a WordPress plugin in the Playground",
|
||||||
|
"example": {},
|
||||||
|
"supports": {
|
||||||
|
"html": false
|
||||||
|
},
|
||||||
|
"attributes": {
|
||||||
|
"step": {
|
||||||
|
"type": "string",
|
||||||
|
"default": "install-plugin"
|
||||||
|
},
|
||||||
|
"pluginZipFile": {
|
||||||
|
"type": "object",
|
||||||
|
"default": {
|
||||||
|
"resource": "url",
|
||||||
|
"url": ""
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"resource": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"url",
|
||||||
|
"wordpress.org/plugins",
|
||||||
|
"vfs"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"type": "object",
|
||||||
|
"default": {
|
||||||
|
"activate": true
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"activate": {
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"textdomain": "install-plugin",
|
||||||
|
"editorScript": "file:./index.js",
|
||||||
|
"editorStyle": "file:./index.css",
|
||||||
|
"style": "file:./style-index.css"
|
||||||
|
}
|
113
src/steps/install-plugin/edit.js
Normal file
113
src/steps/install-plugin/edit.js
Normal file
|
@ -0,0 +1,113 @@
|
||||||
|
/**
|
||||||
|
* WordPress dependencies.
|
||||||
|
*/
|
||||||
|
import { __ } from '@wordpress/i18n';
|
||||||
|
import {
|
||||||
|
InspectorControls,
|
||||||
|
useBlockProps
|
||||||
|
} from '@wordpress/block-editor';
|
||||||
|
import {
|
||||||
|
PanelBody,
|
||||||
|
TextControl,
|
||||||
|
ToggleControl,
|
||||||
|
__experimentalToggleGroupControl as ToggleGroupControl,
|
||||||
|
__experimentalToggleGroupControlOption as ToggleGroupControlOption,
|
||||||
|
} from '@wordpress/components';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal dependencies.
|
||||||
|
*/
|
||||||
|
import './editor.scss';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Edit function for the plugin installation block.
|
||||||
|
*
|
||||||
|
* @param {Object} props Component properties.
|
||||||
|
* @return {Element} Element to render.
|
||||||
|
*/
|
||||||
|
export default function Edit({ attributes, setAttributes }) {
|
||||||
|
const { pluginZipFile, options } = attributes;
|
||||||
|
const { resource, path, url, slug } = pluginZipFile;
|
||||||
|
const { activate } = options;
|
||||||
|
|
||||||
|
const handleResourceChange = (newResource) => {
|
||||||
|
let newAttributes = {
|
||||||
|
resource: newResource
|
||||||
|
};
|
||||||
|
|
||||||
|
// Conditionally add attributes based on the selected resource
|
||||||
|
if (newResource === 'vfs') {
|
||||||
|
newAttributes.path = pluginZipFile.path || '';
|
||||||
|
} else if (newResource === 'url') {
|
||||||
|
newAttributes.url = pluginZipFile.url || '';
|
||||||
|
} else if (newResource === 'wordpress.org/plugins') {
|
||||||
|
newAttributes.slug = pluginZipFile.slug || '';
|
||||||
|
}
|
||||||
|
|
||||||
|
setAttributes({
|
||||||
|
pluginZipFile: newAttributes
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleInputChange = (field, value) => {
|
||||||
|
setAttributes({
|
||||||
|
pluginZipFile: {
|
||||||
|
...pluginZipFile,
|
||||||
|
[field]: value
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<InspectorControls>
|
||||||
|
<PanelBody title={__('Install Plugin Step', 'install-plugin')}>
|
||||||
|
<ToggleGroupControl
|
||||||
|
label="Resource"
|
||||||
|
value={resource}
|
||||||
|
isBlock
|
||||||
|
onChange={handleResourceChange}
|
||||||
|
>
|
||||||
|
<ToggleGroupControlOption value="url" label="URL" />
|
||||||
|
<ToggleGroupControlOption value="wordpress.org/plugins" label="Plugin" />
|
||||||
|
<ToggleGroupControlOption value="vfs" label="VFS" />
|
||||||
|
</ToggleGroupControl>
|
||||||
|
|
||||||
|
{resource === 'vfs' && (
|
||||||
|
<TextControl
|
||||||
|
label={__('Path', 'install-plugin')}
|
||||||
|
value={path}
|
||||||
|
onChange={(newPath) => handleInputChange('path', newPath)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{resource === 'url' && (
|
||||||
|
<TextControl
|
||||||
|
label={__('Url', 'install-plugin')}
|
||||||
|
value={url}
|
||||||
|
onChange={(newPath) => handleInputChange('url', newPath)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
{resource === 'wordpress.org/plugins' && (
|
||||||
|
<TextControl
|
||||||
|
label={__('Slug', 'install-plugin')}
|
||||||
|
value={slug}
|
||||||
|
onChange={(newPath) => handleInputChange('slug', newPath)}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
|
|
||||||
|
<ToggleControl
|
||||||
|
label="Activate"
|
||||||
|
checked={activate}
|
||||||
|
onChange={() => setAttributes({
|
||||||
|
options: { activate: !activate }
|
||||||
|
})}
|
||||||
|
/>
|
||||||
|
</PanelBody>
|
||||||
|
</InspectorControls>
|
||||||
|
|
||||||
|
<div {...useBlockProps()}>
|
||||||
|
{__('Install Plugin Step', 'install-plugin')}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
9
src/steps/install-plugin/editor.scss
Normal file
9
src/steps/install-plugin/editor.scss
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
/**
|
||||||
|
* The following styles get applied inside the editor only.
|
||||||
|
*
|
||||||
|
* Replace them with your own styles or remove the file completely.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.wp-block-create-block-install-plugin {
|
||||||
|
border: 1px dotted #f00;
|
||||||
|
}
|
40
src/steps/install-plugin/index.js
Normal file
40
src/steps/install-plugin/index.js
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/**
|
||||||
|
* Registers a new block provided a unique name and an object defining its behavior.
|
||||||
|
*
|
||||||
|
* @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/
|
||||||
|
*/
|
||||||
|
import { registerBlockType } from '@wordpress/blocks';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lets webpack process CSS, SASS or SCSS files referenced in JavaScript files.
|
||||||
|
* All files containing `style` keyword are bundled together. The code used
|
||||||
|
* gets applied both to the front of your site and to the editor.
|
||||||
|
*
|
||||||
|
* @see https://www.npmjs.com/package/@wordpress/scripts#using-css
|
||||||
|
*/
|
||||||
|
import './style.scss';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal dependencies
|
||||||
|
*/
|
||||||
|
import Edit from './edit';
|
||||||
|
import save from './save';
|
||||||
|
import metadata from './block.json';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Every block starts by registering a new block type definition.
|
||||||
|
*
|
||||||
|
* @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/
|
||||||
|
*/
|
||||||
|
registerBlockType(metadata.name, {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ./edit.js
|
||||||
|
*/
|
||||||
|
edit: Edit,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ./save.js
|
||||||
|
*/
|
||||||
|
save,
|
||||||
|
});
|
24
src/steps/install-plugin/save.js
Normal file
24
src/steps/install-plugin/save.js
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/**
|
||||||
|
* React hook that is used to mark the block wrapper element.
|
||||||
|
* It provides all the necessary props like the class name.
|
||||||
|
*
|
||||||
|
* @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-block-editor/#useblockprops
|
||||||
|
*/
|
||||||
|
import { useBlockProps } from '@wordpress/block-editor';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The save function defines the way in which the different attributes should
|
||||||
|
* be combined into the final markup, which is then serialized by the block
|
||||||
|
* editor into `post_content`.
|
||||||
|
*
|
||||||
|
* @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#save
|
||||||
|
*
|
||||||
|
* @return {Element} Element to render.
|
||||||
|
*/
|
||||||
|
export default function save() {
|
||||||
|
return (
|
||||||
|
<p { ...useBlockProps.save() }>
|
||||||
|
{ 'Install Plugin Block – hello from the saved content!' }
|
||||||
|
</p>
|
||||||
|
);
|
||||||
|
}
|
12
src/steps/install-plugin/style.scss
Normal file
12
src/steps/install-plugin/style.scss
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
/**
|
||||||
|
* The following styles get applied both on the front of your site
|
||||||
|
* and in the editor.
|
||||||
|
*
|
||||||
|
* Replace them with your own styles or remove the file completely.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.wp-block-create-block-install-plugin {
|
||||||
|
background-color: #21759b;
|
||||||
|
color: #fff;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
31
src/steps/login/block.json
Normal file
31
src/steps/login/block.json
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
"$schema": "https://schemas.wp.org/trunk/block.json",
|
||||||
|
"apiVersion": 3,
|
||||||
|
"name": "lubus/login",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"title": "Login",
|
||||||
|
"category": "steps",
|
||||||
|
"description": "Logs in to Playground",
|
||||||
|
"example": {},
|
||||||
|
"supports": {
|
||||||
|
"html": false
|
||||||
|
},
|
||||||
|
"attributes": {
|
||||||
|
"step": {
|
||||||
|
"type": "string",
|
||||||
|
"default": "login"
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"type": "string",
|
||||||
|
"default": ""
|
||||||
|
},
|
||||||
|
"password": {
|
||||||
|
"type": "string",
|
||||||
|
"default": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"textdomain": "login",
|
||||||
|
"editorScript": "file:./index.js",
|
||||||
|
"editorStyle": "file:./index.css",
|
||||||
|
"style": "file:./style-index.css"
|
||||||
|
}
|
54
src/steps/login/edit.js
Normal file
54
src/steps/login/edit.js
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/**
|
||||||
|
* Wordpress dependencies.
|
||||||
|
*/
|
||||||
|
import { __ } from '@wordpress/i18n';
|
||||||
|
import { InspectorControls, useBlockProps } from '@wordpress/block-editor';
|
||||||
|
import { PanelBody, TextControl} from '@wordpress/components';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal dependencies.
|
||||||
|
*/
|
||||||
|
import './editor.scss';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The edit function describes the structure of your block in the context of the
|
||||||
|
* editor. This represents what the editor will render when the block is used.
|
||||||
|
*
|
||||||
|
* @return {Element} Element to render.
|
||||||
|
*/
|
||||||
|
export default function Edit({ attributes, setAttributes }) {
|
||||||
|
const { username, password } = attributes;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<InspectorControls>
|
||||||
|
<PanelBody title={__('Login Step', 'login')}>
|
||||||
|
<TextControl
|
||||||
|
label={__(
|
||||||
|
'Username',
|
||||||
|
'login'
|
||||||
|
)}
|
||||||
|
value={username || ''}
|
||||||
|
onChange={(value) =>
|
||||||
|
setAttributes({ username: value })
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
<TextControl
|
||||||
|
label={__(
|
||||||
|
'Password',
|
||||||
|
'login'
|
||||||
|
)}
|
||||||
|
value={password || ''}
|
||||||
|
onChange={(value) =>
|
||||||
|
setAttributes({ password: value })
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</PanelBody>
|
||||||
|
</InspectorControls>
|
||||||
|
|
||||||
|
<p {...useBlockProps()}>
|
||||||
|
{__('Login Step', 'login')}
|
||||||
|
</p>
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
}
|
9
src/steps/login/editor.scss
Normal file
9
src/steps/login/editor.scss
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
/**
|
||||||
|
* The following styles get applied inside the editor only.
|
||||||
|
*
|
||||||
|
* Replace them with your own styles or remove the file completely.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.wp-block-create-block-login {
|
||||||
|
border: 1px dotted #f00;
|
||||||
|
}
|
31
src/steps/login/index.js
Normal file
31
src/steps/login/index.js
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
/**
|
||||||
|
* Wordpress dependencies.
|
||||||
|
*/
|
||||||
|
import { registerBlockType } from '@wordpress/blocks';
|
||||||
|
import { login } from '@wordpress/icons';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal dependencies.
|
||||||
|
*/
|
||||||
|
import Edit from './edit';
|
||||||
|
import save from './save';
|
||||||
|
import metadata from './block.json';
|
||||||
|
import './style.scss';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Every block starts by registering a new block type definition.
|
||||||
|
*/
|
||||||
|
registerBlockType(metadata.name, {
|
||||||
|
|
||||||
|
icon: login,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ./edit.js
|
||||||
|
*/
|
||||||
|
edit: Edit,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ./save.js
|
||||||
|
*/
|
||||||
|
save,
|
||||||
|
});
|
24
src/steps/login/save.js
Normal file
24
src/steps/login/save.js
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/**
|
||||||
|
* React hook that is used to mark the block wrapper element.
|
||||||
|
* It provides all the necessary props like the class name.
|
||||||
|
*
|
||||||
|
* @see https://developer.wordpress.org/block-editor/reference-guides/packages/packages-block-editor/#useblockprops
|
||||||
|
*/
|
||||||
|
import { useBlockProps } from '@wordpress/block-editor';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The save function defines the way in which the different attributes should
|
||||||
|
* be combined into the final markup, which is then serialized by the block
|
||||||
|
* editor into `post_content`.
|
||||||
|
*
|
||||||
|
* @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-edit-save/#save
|
||||||
|
*
|
||||||
|
* @return {Element} Element to render.
|
||||||
|
*/
|
||||||
|
export default function save() {
|
||||||
|
return (
|
||||||
|
<p { ...useBlockProps.save() }>
|
||||||
|
{ 'Login Block – hello from the saved content!' }
|
||||||
|
</p>
|
||||||
|
);
|
||||||
|
}
|
12
src/steps/login/style.scss
Normal file
12
src/steps/login/style.scss
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
/**
|
||||||
|
* The following styles get applied both on the front of your site
|
||||||
|
* and in the editor.
|
||||||
|
*
|
||||||
|
* Replace them with your own styles or remove the file completely.
|
||||||
|
*/
|
||||||
|
|
||||||
|
.wp-block-create-block-login {
|
||||||
|
background-color: #21759b;
|
||||||
|
color: #fff;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
17
webpack.config.js
Normal file
17
webpack.config.js
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
const defaultConfig = require('@wordpress/scripts/config/webpack.config');
|
||||||
|
const { getWebpackEntryPoints } = require('@wordpress/scripts/utils/config');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
...defaultConfig,
|
||||||
|
entry: {
|
||||||
|
...getWebpackEntryPoints(),
|
||||||
|
'settings': './src/settings/index.js',
|
||||||
|
'steps/install-plugin/index': './src/steps/install-plugin/index.js',
|
||||||
|
'steps/login/index': './src/steps/login/index.js'
|
||||||
|
},
|
||||||
|
output: {
|
||||||
|
path: path.resolve(__dirname, 'build'),
|
||||||
|
filename: '[name].js'
|
||||||
|
}
|
||||||
|
};
|
Loading…
Add table
Add a link
Reference in a new issue