diff --git a/packages/strapi-admin/admin/src/utils/Plugin.js b/packages/strapi-admin/admin/src/utils/Plugin.js index 60885276fb..0863eb692d 100644 --- a/packages/strapi-admin/admin/src/utils/Plugin.js +++ b/packages/strapi-admin/admin/src/utils/Plugin.js @@ -5,13 +5,13 @@ class Plugin { injectedComponents = {}; - internals = {}; + apis = {}; constructor(pluginConf) { this.pluginId = pluginConf.id; this.decorators = pluginConf.decorators || {}; this.injectedComponents = pluginConf.injectedComponents || {}; - this.internals = pluginConf.internals || {}; + this.apis = pluginConf.apis || {}; } decorate(compoName, compo) { diff --git a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/forms/index.js b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/forms/index.js index 060137a375..45b3c6e831 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/forms/index.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/forms/index.js @@ -22,59 +22,34 @@ const forms = { return attr !== options.initialData.name; }); - const validators = []; - const attributeFormExtensions = extensions.attribute[attributeType]; - - if (attributeFormExtensions) { - attributeFormExtensions.forEach(({ validator }) => { - if (validator) { - validators.push(validator); - } - }); - } - try { - let shape = attributeTypes[attributeType]( + let attributeShape = attributeTypes[attributeType]( usedAttributeNames, reservedNames.attributes, alreadyTakenTargetContentTypeAttributes, options ); - validators.forEach(validator => { - console.log({ validator }); - shape = shape.shape(validator); - }); - - return shape; + return extensions.makeValidator( + ['attribute', attributeType], + attributeShape, + usedAttributeNames, + reservedNames.attributes, + alreadyTakenTargetContentTypeAttributes, + options + ); } catch (err) { - console.error('form', err); + console.error('Error yup build schema', err); return attributeTypes.default(usedAttributeNames, reservedNames.attributes); } }, form: { advanced(data, type, step, actionType, attributes, extensions) { - const attributeFormExtensions = extensions.attribute[type]; - - let customForms = []; - - if (attributeFormExtensions) { - attributeFormExtensions.forEach(({ form }) => { - if (form.advanced) { - const blocksToAdd = form.advanced(data, type, step, actionType, attributes); - - blocksToAdd.forEach(block => { - customForms.push(block); - }); - } - }); - } - try { const baseForm = attributesForm.advanced[type](data, step).items; - return { items: [...baseForm, ...customForms] }; + return extensions.makeAdvancedForm(['attribute', type], baseForm, data, step); } catch (err) { console.error(err); @@ -91,12 +66,19 @@ const forms = { }, }, contentType: { - schema(alreadyTakenNames, isEditing, ctUid, reservedNames) { + schema(alreadyTakenNames, isEditing, ctUid, reservedNames, extensions) { const takenNames = isEditing ? alreadyTakenNames.filter(uid => uid !== ctUid) : alreadyTakenNames; - return createContentTypeSchema(takenNames, reservedNames.models); + const contentTypeShape = createContentTypeSchema(takenNames, reservedNames.models); + + return extensions.makeValidator( + ['contentType'], + contentTypeShape, + takenNames, + reservedNames.models + ); }, form: { base(data = {}, type, step, actionType) { @@ -110,19 +92,8 @@ const forms = { }, advanced(data, type, step, actionType, attributes, extensions) { const baseForm = contentTypeForm.advanced.default().items; - const customForms = []; - extensions.contentType.forEach(({ form }) => { - if (form.advanced) { - const blocksToAdd = form.advanced(data, type, step, actionType, attributes); - - blocksToAdd.forEach(block => { - customForms.push(block); - }); - } - }); - - return { items: [...baseForm, ...customForms] }; + return extensions.makeAdvancedForm(['contentType'], baseForm); }, }, }, diff --git a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js index a98e44a580..9b1a4ee547 100644 --- a/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js +++ b/packages/strapi-plugin-content-type-builder/admin/src/containers/FormModal/index.js @@ -75,8 +75,8 @@ const FormModal = () => { strapi: { getPlugin }, } = useStrapi(); const ctbPlugin = getPlugin(pluginId); - const types = ctbPlugin.internals.forms.types; - const inputsFromPlugins = ctbPlugin.internals.forms.components.inputs; + const ctbFormsAPI = ctbPlugin.apis.forms; + const inputsFromPlugins = ctbFormsAPI.components.inputs; const query = useQuery(); const attributeOptionRef = useRef(); @@ -404,7 +404,8 @@ const FormModal = () => { state.actionType === 'edit', // currentUID get(allDataSchema, [...state.pathToSchema, 'uid'], null), - reservedNames + reservedNames, + ctbFormsAPI ); // Check form validity for component @@ -415,7 +416,8 @@ const FormModal = () => { modifiedData.category || '', reservedNames, state.actionType === 'edit', - get(allDataSchema, [...state.pathToSchema, 'uid'], null) + get(allDataSchema, [...state.pathToSchema, 'uid'], null), + ctbFormsAPI ); // Check for validity for creating a component @@ -426,7 +428,8 @@ const FormModal = () => { schema = forms.component.schema( Object.keys(components), get(modifiedData, 'componentToCreate.category', ''), - reservedNames + reservedNames, + ctbFormsAPI ); // Check form validity for creating a 'common attribute' @@ -465,10 +468,10 @@ const FormModal = () => { reservedNames, alreadyTakenTargetContentTypeAttributes, { modifiedData, initialData }, - types + ctbFormsAPI ); } else if (isEditingCategory) { - schema = forms.editCategory.schema(allComponentsCategories, initialData); + schema = forms.editCategory.schema(allComponentsCategories, initialData, ctbFormsAPI); } else { // The user is either in the addComponentToDynamicZone modal or // in step 1 of the add component (modalType=attribute&attributeType=component) but not creating a component @@ -478,7 +481,8 @@ const FormModal = () => { schema = forms.component.schema( Object.keys(components), get(modifiedData, 'componentToCreate.category', ''), - reservedNames + reservedNames, + ctbFormsAPI ); } else { // The form is valid @@ -1208,7 +1212,7 @@ const FormModal = () => { state.step, state.actionType, attributes, - types + ctbFormsAPI ).items.map((row, index) => { return (