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'],