woocommerce/plugins/woocommerce-admin/client/blueprint/settings/slotfill.js

225 lines
5.2 KiB
JavaScript
Raw Normal View History

blueprint - add php package and cli commands (#49763) * Add blueprint package * Add blueprint to composer * Register blueprint cli commands * Add feature flag * Add changefile(s) from automation for the following project(s): woocommerce * Update packages/php/blueprint/src/Exporters/HasAlias.php Co-authored-by: Ilyas Foo <foo.ilyas@gmail.com> * Update packages/php/blueprint/src/Exporters/ExportInstallThemeSteps.php Co-authored-by: Ilyas Foo <foo.ilyas@gmail.com> * Update packages/php/blueprint/src/UseWPFunctions.php Co-authored-by: Ilyas Foo <foo.ilyas@gmail.com> * Set destination correctly * Make sure the given path is within wp content dir * Remove debug code * Fix typo * Fix typo * Fix lint errors with README * Move READMD.md from src to the root directory and add development.md * Add run-unit-tests.sh * Setup test env * Create dirs recursively * Remove debug code * Update packages/php/blueprint/src/Util.php Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Update packages/php/blueprint/src/ZipExportedSchema.php Co-authored-by: Ilyas Foo <foo.ilyas@gmail.com> * Check for steps key * Use if statement * Add hook comment for wooblueprint_exporters and wooblueprint_importers * Fix plugin activation condition * Check for download_link -- it can be empty * Check to make sure a file was written * Plugin must be deactivated before attemping to delete it * Lint fixes * Lint fixes * blueprint - add rest api (#49765) * Add blueprint rest api endpoint * Rename process to import * Add changefile(s) from automation for the following project(s): woocommerce * Update plugins/woocommerce/src/Admin/Features/Blueprint/Init.php Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Update plugins/woocommerce/src/Admin/Features/Blueprint/RestApi.php Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Update plugins/woocommerce/src/Admin/Features/Blueprint/RestApi.php Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Update plugins/woocommerce/src/Admin/Features/Blueprint/RestApi.php Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Update plugins/woocommerce/src/Admin/Features/Blueprint/RestApi.php Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Remove unavailable 2nd argument from get_param -- default values are already set from the rest api def. * blueprint - add builder page (#49774) * Add blueprint builder page * Change to the correct endpoint * Add changefile(s) from automation for the following project(s): woocommerce * Note that the builder intro page is temporary * Remove unused code --------- Co-authored-by: github-actions <github-actions@github.com> * blueprint - add blueprint settings page (#49775) * Add blueprint settings page * Add changefile(s) from automation for the following project(s): woocommerce --------- Co-authored-by: github-actions <github-actions@github.com> * Fix broken test * Lint fixes --------- Co-authored-by: github-actions <github-actions@github.com> Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Update unit test env * Added composer scripts to setup and run tests * Moved tests to Unit dir to make space for Integration tests later * WIP Add tests * Use full if statement * Use the correct step names * Use activate_plugin and wp_get_thmes from wp functions trait * Skip inactive plugins * Use plural for collections * Add a comment for StepExporter * Remove unused construct code * Correct function return types * Update packages/php/blueprint/src/Importers/ImportActivateTheme.php Co-authored-by: Ilyas Foo <foo.ilyas@gmail.com> * Use full if statement * Make sure plugin is installed * Use functions from trait * Remove unused functions * Pass $force_convert correctly * Correctly assign $this->validator * Fix lint issues * Rename setOptions to setSiteOptions * Do not use die() -- throw an exception instead * Make sure slug is a valid WP plugin slug * Remove hardcoded string with get_step_name() * Fix lint issues * Update json example files * Removed woo-specific examples -- these should be placed in the core * Updated the built-in steps to reflect the recent changes * Update packages/php/blueprint/src/docs/json-examples/deletePlugin.json Co-authored-by: Ilyas Foo <foo.ilyas@gmail.com> * Update plugins/woocommerce/src/Admin/Features/Blueprint/RestApi.php Co-authored-by: Ilyas Foo <foo.ilyas@gmail.com> * Rename to correct filename * Set version number * Use mime_content_type for checking mime type * Catch all exceptions * Only allow zip and json * Remove unused function * Remove unused functions * Add PHPCS command and ruleset * PHP lint fixes * Update plugins/woocommerce/src/Admin/Features/Blueprint/Init.php Co-authored-by: Ilyas Foo <foo.ilyas@gmail.com> * Add back removed functions * blueprint - Add woo blueprint exporters and importers (#50057) * Add woo blueprint exporters and importers * Comment fix * Update plugins/woocommerce/src/Admin/Features/Blueprint/Exporters/ExportWCSettings.php Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Update plugins/woocommerce/src/Admin/Features/Blueprint/Exporters/ExportWCSettings.php Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Update plugins/woocommerce/src/Admin/Features/Blueprint/Exporters/ExportWCSettings.php Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Update plugins/woocommerce/src/Admin/Features/Blueprint/Exporters/ExportWCSettings.php Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Add a test for ImportSetWCTaxRates * Lint fixes * Lint fixes * Fix setWCShipping schema and data format * Add woocommerce_default_country option * Lint fixes * Fix typo -- it should be decode, not encode * Fix incorrect argument order * Fix typo * Export and import shipping method settings * Lint fixes * Lint fixes * Type functions -- base PR has changed --------- Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com> * Require admin for import and export * Use mime type from $_FILES -- mime_content_type can return incorrect mime type depending on the system configuration * Enable export button when backend errors out * Enable export button when backend errors out * Allow WooCommerce export * Change copy text * Remove redundant check * Fix lint issues * Fix lint issues --------- Co-authored-by: github-actions <github-actions@github.com> Co-authored-by: Ilyas Foo <foo.ilyas@gmail.com> Co-authored-by: Chi-Hsuan Huang <chihsuan.tw@gmail.com>
2024-08-12 23:33:05 +00:00
/**
* External dependencies
*/
import { createSlotFill, Button, Notice } from '@wordpress/components';
import { getAdminLink } from '@woocommerce/settings';
import apiFetch from '@wordpress/api-fetch';
import { useState, createElement, useEffect } from '@wordpress/element';
import { registerPlugin } from '@wordpress/plugins';
import { __ } from '@wordpress/i18n';
/**
* Internal dependencies
*/
import { SETTINGS_SLOT_FILL_CONSTANT } from '../../settings/settings-slots';
import './style.scss';
const { Fill } = createSlotFill( SETTINGS_SLOT_FILL_CONSTANT );
const Blueprint = () => {
const [ exportEnabled, setExportEnabled ] = useState( true );
const [ exportAsZip, setExportAsZip ] = useState( false );
const [ error, setError ] = useState( null );
const steps = {
Settings: 'setWCSettings',
'Core Profiler Options': 'setWCCoreProfilerOptions',
'Payment Gateways': 'setWCPaymentGateways',
Shipping: 'setWCShipping',
'Tax rates': 'setWCTaxRates',
Plugins: 'installPlugin',
Themes: 'installTheme',
'Task Options': 'setWCTaskOptions',
};
// Initialize state to keep track of checkbox values
const [ checkedState, setCheckedState ] = useState(
Object.keys( steps ).reduce( ( acc, key ) => {
acc[ key ] = true;
return acc;
}, {} )
);
const exportBlueprint = async ( _steps ) => {
setExportEnabled( false );
const linkContainer = document.getElementById(
'download-link-container'
);
linkContainer.innerHTML = '';
try {
const response = await apiFetch( {
path: '/blueprint/export',
method: 'POST',
data: {
steps: _steps,
export_as_zip: exportAsZip,
},
} );
const link = document.createElement( 'a' );
link.innerHTML =
'Click here in case download does not start automatically';
let url = null;
if ( response.type === 'zip' ) {
link.href = response.data;
link.target = '_blank';
} else {
// Create a link element and trigger the download
url = window.URL.createObjectURL(
new Blob( [ JSON.stringify( response.data, null, 2 ) ] )
);
link.href = url;
link.setAttribute( 'download', 'woo-blueprint.json' );
}
linkContainer.appendChild( link );
link.click();
if ( url ) {
window.URL.revokeObjectURL( url );
}
} catch ( e ) {
setError( e.message );
}
setExportEnabled( true );
};
// Handle checkbox change
const handleOnChange = ( key ) => {
setCheckedState( ( prevState ) => ( {
...prevState,
[ key ]: ! prevState[ key ],
} ) );
};
useEffect( () => {
const saveButton = document.getElementsByClassName(
'woocommerce-save-button'
)[ 0 ];
if ( saveButton ) {
saveButton.style.display = 'none';
}
} );
return (
<div className="blueprint-settings-slotfill">
{ error && (
<Notice
status="error"
onRemove={ () => {
setError( null );
} }
isDismissible
>
{ error }
</Notice>
) }
<p className="blueprint-settings-slotfill-description">
{ __( 'Import/Export your Blueprint schema.', 'woocommerce' ) }
</p>
<Button
isLink
onClick={ () => {
setCheckedState( ( prevState ) => {
const newState = {};
Object.entries( prevState ).forEach(
( [ key, value ] ) => {
newState[ key ] = ! value;
}
);
return newState;
} );
} }
>
Toggle selections
</Button>
<br />
<br />
{ Object.entries( steps ).map( ( [ key, value ] ) => (
<div key={ key }>
<input
type="checkbox"
id={ key }
name={ key }
value={ value }
checked={ checkedState[ key ] }
onChange={ () => handleOnChange( key ) }
/>
<label htmlFor={ key }>{ key }</label>
</div>
) ) }
<br />
<p>Export may take some time depending on your network speed.</p>
<div id="download-link-container"></div>
<Button
isPrimary
onClick={ () => {
const selectedSteps = [];
Object.entries( checkedState ).forEach(
( [ key, value ] ) => {
if ( value ) {
selectedSteps.push( steps[ key ] );
}
}
);
exportBlueprint( selectedSteps );
} }
disabled={ ! exportEnabled }
isBusy={ ! exportEnabled }
>
{ __( 'Export', 'woocommerce' ) }
</Button>
<div>
<input
type="checkbox"
id="export-as-zip"
name={ 'export-as-zip' }
value={ 'yes' }
checked={ exportAsZip }
onChange={ () => {
setExportAsZip( ! exportAsZip );
} }
/>
<label htmlFor="export-as-zip">
Export as a zip (Experimental)
</label>
</div>
<p>
You can import the schema on the{ ' ' }
<a
href={ getAdminLink(
'admin.php?page=wc-admin&path=%2Fsetup-wizard&step=intro-builder'
) }
>
builder setup page
</a>{ ' ' }
or use the import WP CLI command.
</p>
<h3>WP CLI Commands</h3>
<b>Import:</b>{ ' ' }
<code>wp wc blueprint import path-to-woo-blueprint.json</code>
<br /> <br />
<b>Export:</b> <code>wp wc blueprint export save-to-path.json</code>
</div>
);
};
const BlueprintSlotfill = () => {
return (
<Fill>
<Blueprint />
</Fill>
);
};
export const registerBlueprintSlotfill = () => {
registerPlugin( 'woocommerce-admin-blueprint-settings-slotfill', {
scope: 'woocommerce-blueprint-settings',
render: BlueprintSlotfill,
} );
};