From fe51e5e38c17d59a3a072b93c5248907e0895f7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jakes=CC=8C?= Date: Mon, 13 May 2019 14:36:55 +0200 Subject: [PATCH] Add admin page for experimental features [MAILPOET-2008] --- .../experimental_features.jsx | 92 +++++++++++++++++++ assets/js/src/webpack_admin_index.jsx | 1 + lib/Config/Menu.php | 15 +++ views/experimental-features.html | 24 +++++ 4 files changed, 132 insertions(+) create mode 100644 assets/js/src/experimental_features/experimental_features.jsx create mode 100644 views/experimental-features.html diff --git a/assets/js/src/experimental_features/experimental_features.jsx b/assets/js/src/experimental_features/experimental_features.jsx new file mode 100644 index 0000000000..d67b479e58 --- /dev/null +++ b/assets/js/src/experimental_features/experimental_features.jsx @@ -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

Loading experimental features...

; + } + + if (Object.values(flags).length === 0) { + return

There are no experimental features at the moment.

; + } + + return ( + <> + { + Object.values(flags).map((flag) => { + const id = `experimental-feature-${flag.name}`; + return ( +
+ +
+ ); + }) + } + + ); +}; + +const experimentalFeaturesContainer = document.getElementById('experimental_features_container'); +if (experimentalFeaturesContainer) { + ReactDOM.render( + React.createElement(ExperimentalFeatures, {}), + experimentalFeaturesContainer + ); +} diff --git a/assets/js/src/webpack_admin_index.jsx b/assets/js/src/webpack_admin_index.jsx index 19f04b4f9c..fb73046cd4 100644 --- a/assets/js/src/webpack_admin_index.jsx +++ b/assets/js/src/webpack_admin_index.jsx @@ -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/export.js'; // side effect - executes on doc ready import 'wizard/wizard.jsx'; // side effect - renders ReactDOM to document +import 'experimental_features/experimental_features.jsx'; // side effect - renders ReactDOM to document diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 7d47ffaa18..34f72da156 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -385,6 +385,17 @@ class Menu { 'migration' ) ); + + // Settings page + $this->wp->addSubmenuPage( + true, + $this->setPageTitle('Experimental Features'), + '', + AccessControl::PERMISSION_MANAGE_FEATURES, + 'mailpoet-experimental', + [$this, 'experimentalFeatures'] + ); + // } function disableWPEmojis() { @@ -542,6 +553,10 @@ class Menu { ); } + function experimentalFeatures() { + $this->displayPage('experimental-features.html', []); + } + private function _getFlags() { // flags (available features on WP install) $flags = array(); diff --git a/views/experimental-features.html b/views/experimental-features.html new file mode 100644 index 0000000000..fccde30265 --- /dev/null +++ b/views/experimental-features.html @@ -0,0 +1,24 @@ +<% extends 'layout.html' %> + +<% block content %> + +
+

Experimental features

+ +
+

+ These features are not finished, they are not meant to be used yet. +

+

+ If you enable them anything can happen: your website may go down, + all your data can be deleted. +

+

+ We are not liable. +

+
+ +
+
+ +<% endblock %>