diff --git a/docs/source/configuration/settings-reference.md b/docs/source/configuration/settings-reference.md
index 7c578e7748a..28219d4552d 100644
--- a/docs/source/configuration/settings-reference.md
+++ b/docs/source/configuration/settings-reference.md
@@ -205,8 +205,11 @@ controlpanels
The group can be one of the default groups 'General', 'Content', 'Security', 'Add-on Configuration', 'Users and Groups' or a custom group.
+filterControlPanelsSchema
+ A schema factory for a control panel. It is used internally, to tweak the schemas provided by the controlpanel endpoint, to make them fit for Volto. Uses the ``unwantedControlPanelsFields`` setting.
+
unwantedControlPanelsFields
- Control panels fields that are not used on the Volto. It is used internally, to tweak the schemas provided by the controlpanel endpoint, to make them fit for Volto.
+ Control panels fields that are not used on the Volto. It is used internally by ``filterControlPanelsSchema`` function.
errorHandlers
A list of error handlers that will be called when there is an unhandled exception. Each error handler is a function that
diff --git a/packages/volto/src/components/manage/Controlpanels/Controlpanel.jsx b/packages/volto/src/components/manage/Controlpanels/Controlpanel.jsx
index 5193ac004fa..a55477d787d 100644
--- a/packages/volto/src/components/manage/Controlpanels/Controlpanel.jsx
+++ b/packages/volto/src/components/manage/Controlpanels/Controlpanel.jsx
@@ -45,39 +45,6 @@ const messages = defineMessages({
},
});
-// Filters props.controlpanel.schema to only valid/relevant fields
-const filterControlPanelsSchema = (controlpanel) => {
- const panelType = controlpanel['@id'].split('/').pop();
-
- const { unwantedControlPanelsFields } = config.settings;
-
- // Creates modified version of properties object
- const newPropertiesObj = Object.fromEntries(
- Object.entries(controlpanel.schema.properties).filter(
- ([key, _val]) =>
- !(unwantedControlPanelsFields[panelType] || []).includes(key),
- ),
- );
- // Filters props.controlpanel.schema.fieldsets.fields to only valid/relevant fields
- const filterFields = (fields) => {
- return fields.filter(
- (field) =>
- !(unwantedControlPanelsFields[panelType] || []).includes(field),
- );
- };
- // Creates modified version of fieldsets array
- const newFieldsets = controlpanel.schema.fieldsets.map((fieldset) => {
- return { ...fieldset, fields: filterFields(fieldset.fields) };
- });
-
- // Returns clone of props.controlpanel.schema, with updated properties/fieldsets
- return {
- ...controlpanel.schema,
- properties: newPropertiesObj,
- fieldsets: newFieldsets,
- };
-};
-
/**
* Controlpanel class.
* @class Controlpanel
@@ -182,6 +149,8 @@ class Controlpanel extends Component {
* @returns {string} Markup for the component.
*/
render() {
+ const { filterControlPanelsSchema } = config.settings;
+
if (this.props.controlpanel) {
return (
diff --git a/packages/volto/src/config/ControlPanels.js b/packages/volto/src/config/ControlPanels.js
index a066ffc6f89..c1ff4e20cd0 100644
--- a/packages/volto/src/config/ControlPanels.js
+++ b/packages/volto/src/config/ControlPanels.js
@@ -19,6 +19,7 @@ import rulesSVG from '@plone/volto/icons/content-existing.svg';
import undoControlPanelSVG from '@plone/volto/icons/undo-control-panel.svg';
import linkSVG from '@plone/volto/icons/link.svg';
import relationsSVG from '@plone/volto/icons/ahead.svg';
+import config from '@plone/volto/registry';
export const controlPanelsIcons = {
default: settingsSVG,
@@ -87,3 +88,36 @@ export const unwantedControlPanelsFields = {
'image_captioning',
],
};
+
+// Filters props.controlpanel.schema to only valid/relevant fields
+export const filterControlPanelsSchema = (controlpanel) => {
+ const panelType = controlpanel['@id'].split('/').pop();
+
+ const { unwantedControlPanelsFields } = config.settings;
+
+ // Creates modified version of properties object
+ const newPropertiesObj = Object.fromEntries(
+ Object.entries(controlpanel.schema.properties).filter(
+ ([key, _val]) =>
+ !(unwantedControlPanelsFields[panelType] || []).includes(key),
+ ),
+ );
+ // Filters props.controlpanel.schema.fieldsets.fields to only valid/relevant fields
+ const filterFields = (fields) => {
+ return fields.filter(
+ (field) =>
+ !(unwantedControlPanelsFields[panelType] || []).includes(field),
+ );
+ };
+ // Creates modified version of fieldsets array
+ const newFieldsets = controlpanel.schema.fieldsets.map((fieldset) => {
+ return { ...fieldset, fields: filterFields(fieldset.fields) };
+ });
+
+ // Returns clone of props.controlpanel.schema, with updated properties/fieldsets
+ return {
+ ...controlpanel.schema,
+ properties: newPropertiesObj,
+ fieldsets: newFieldsets,
+ };
+};
diff --git a/packages/volto/src/config/index.js b/packages/volto/src/config/index.js
index 32fb6bb9107..ff7447fb089 100644
--- a/packages/volto/src/config/index.js
+++ b/packages/volto/src/config/index.js
@@ -24,6 +24,7 @@ import { styleClassNameConverters, styleClassNameExtenders } from './Style';
import {
controlPanelsIcons,
filterControlPanels,
+ filterControlPanelsSchema,
unwantedControlPanelsFields,
} from './ControlPanels';
@@ -151,6 +152,7 @@ let config = {
controlpanels: [],
controlPanelsIcons,
filterControlPanels,
+ filterControlPanelsSchema,
unwantedControlPanelsFields,
externalRoutes: [
// URL to be considered as external
diff --git a/packages/volto/test-setup-config.js b/packages/volto/test-setup-config.js
index 40e85349e48..d6211f6ce16 100644
--- a/packages/volto/test-setup-config.js
+++ b/packages/volto/test-setup-config.js
@@ -19,6 +19,7 @@ import {
import {
controlPanelsIcons,
filterControlPanels,
+ filterControlPanelsSchema,
unwantedControlPanelsFields,
} from '@plone/volto/config/ControlPanels';
@@ -47,6 +48,7 @@ config.set('settings', {
},
controlPanelsIcons,
filterControlPanels,
+ filterControlPanelsSchema,
unwantedControlPanelsFields,
apiExpanders: [],
downloadableObjects: ['File'],