Add admin page for experimental features
[MAILPOET-2008]
This commit is contained in:
@ -0,0 +1,92 @@
|
|||||||
|
import React, { useState, useEffect } from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
import MailPoet from 'mailpoet';
|
||||||
|
|
||||||
|
const ExperimentalFeatures = () => {
|
||||||
|
const [flags, setFlags] = useState(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
MailPoet.Ajax.post({
|
||||||
|
api_version: window.mailpoet_api_version,
|
||||||
|
endpoint: 'featureFlags',
|
||||||
|
action: 'getAll',
|
||||||
|
}).done((response) => {
|
||||||
|
const flagsMap = response.data.reduce((obj, item) => ({ ...obj, [item.name]: item }), {});
|
||||||
|
setFlags(flagsMap);
|
||||||
|
}).fail((response) => {
|
||||||
|
if (response.errors.length > 0) {
|
||||||
|
MailPoet.Notice.error(
|
||||||
|
response.errors.map(error => error.message),
|
||||||
|
{ scroll: true }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
function handleChange(event) {
|
||||||
|
const name = event.target.name;
|
||||||
|
const value = event.target.checked;
|
||||||
|
|
||||||
|
MailPoet.Ajax.post({
|
||||||
|
api_version: window.mailpoet_api_version,
|
||||||
|
endpoint: 'featureFlags',
|
||||||
|
action: 'set',
|
||||||
|
data: {
|
||||||
|
[name]: value ? 1 : 0,
|
||||||
|
},
|
||||||
|
}).done(() => {
|
||||||
|
const flag = flags[name];
|
||||||
|
flag.value = value;
|
||||||
|
setFlags({ ...flags, [name]: flag });
|
||||||
|
MailPoet.Notice.success(`Feature '${name}' was ${value ? 'enabled' : 'disabled'}.`);
|
||||||
|
}).fail((response) => {
|
||||||
|
if (response.errors.length > 0) {
|
||||||
|
MailPoet.Notice.error(
|
||||||
|
response.errors.map(error => error.message),
|
||||||
|
{ scroll: true }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags === null) {
|
||||||
|
return <p>Loading experimental features...</p>;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.values(flags).length === 0) {
|
||||||
|
return <p>There are no experimental features at the moment.</p>;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{
|
||||||
|
Object.values(flags).map((flag) => {
|
||||||
|
const id = `experimental-feature-${flag.name}`;
|
||||||
|
return (
|
||||||
|
<div key={flag.name}>
|
||||||
|
<label htmlFor={id}>
|
||||||
|
<input
|
||||||
|
id={id}
|
||||||
|
type="checkbox"
|
||||||
|
name={flag.name}
|
||||||
|
defaultChecked={flag.value}
|
||||||
|
onChange={handleChange}
|
||||||
|
/>
|
||||||
|
{' '}
|
||||||
|
{flag.name}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
</>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
const experimentalFeaturesContainer = document.getElementById('experimental_features_container');
|
||||||
|
if (experimentalFeaturesContainer) {
|
||||||
|
ReactDOM.render(
|
||||||
|
React.createElement(ExperimentalFeatures, {}),
|
||||||
|
experimentalFeaturesContainer
|
||||||
|
);
|
||||||
|
}
|
@ -17,3 +17,4 @@ import 'settings/reinstall_from_scratch.js'; // side effect - adds event handler
|
|||||||
import 'subscribers/importExport/import.jsx'; // side effect - executes on doc ready, adds events
|
import 'subscribers/importExport/import.jsx'; // side effect - executes on doc ready, adds events
|
||||||
import 'subscribers/importExport/export.js'; // side effect - executes on doc ready
|
import 'subscribers/importExport/export.js'; // side effect - executes on doc ready
|
||||||
import 'wizard/wizard.jsx'; // side effect - renders ReactDOM to document
|
import 'wizard/wizard.jsx'; // side effect - renders ReactDOM to document
|
||||||
|
import 'experimental_features/experimental_features.jsx'; // side effect - renders ReactDOM to document
|
||||||
|
@ -385,6 +385,17 @@ class Menu {
|
|||||||
'migration'
|
'migration'
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Settings page
|
||||||
|
$this->wp->addSubmenuPage(
|
||||||
|
true,
|
||||||
|
$this->setPageTitle('Experimental Features'),
|
||||||
|
'',
|
||||||
|
AccessControl::PERMISSION_MANAGE_FEATURES,
|
||||||
|
'mailpoet-experimental',
|
||||||
|
[$this, 'experimentalFeatures']
|
||||||
|
);
|
||||||
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
function disableWPEmojis() {
|
function disableWPEmojis() {
|
||||||
@ -542,6 +553,10 @@ class Menu {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function experimentalFeatures() {
|
||||||
|
$this->displayPage('experimental-features.html', []);
|
||||||
|
}
|
||||||
|
|
||||||
private function _getFlags() {
|
private function _getFlags() {
|
||||||
// flags (available features on WP install)
|
// flags (available features on WP install)
|
||||||
$flags = array();
|
$flags = array();
|
||||||
|
24
views/experimental-features.html
Normal file
24
views/experimental-features.html
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<% extends 'layout.html' %>
|
||||||
|
|
||||||
|
<% block content %>
|
||||||
|
|
||||||
|
<div class="wrap">
|
||||||
|
<h1>Experimental features</h1>
|
||||||
|
|
||||||
|
<div class="mailpoet_notice notice notice-error">
|
||||||
|
<p>
|
||||||
|
<strong>These features are not finished, they are not meant to be used yet.</strong>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
If you enable them anything can happen: your website may go down,
|
||||||
|
all your data can be deleted.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
We are not liable.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="experimental_features_container"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<% endblock %>
|
Reference in New Issue
Block a user