Merge branch 'develop' of github.com:strapi/strapi into ctm/repeatable-edit-view

This commit is contained in:
soupette 2019-07-25 12:07:01 +02:00
commit a2dc4b22d1
6 changed files with 92 additions and 75 deletions

View File

@ -106,9 +106,14 @@ module.exports = {
return ctx.notFound('contentType.notFound');
}
const schema = service.formatContentTypeSchema(contentType);
let input;
try {
input = await createModelConfigurationSchema(contentType).validate(body, {
input = await createModelConfigurationSchema(
contentType,
schema
).validate(body, {
abortEarly: false,
stripUnknown: true,
strict: true,
@ -130,7 +135,7 @@ module.exports = {
const data = {
uid,
source,
schema: service.formatContentTypeSchema(contentType),
schema,
...contentTypeConfigurations,
};

View File

@ -56,17 +56,23 @@ module.exports = {
const group = strapi.groups[uid];
const ctService = strapi.plugins['content-manager'].services.contenttypes;
if (!group) {
return ctx.notFound('group.notFound');
}
const schema = ctService.formatContentTypeSchema(group);
let input;
try {
input = await createModelConfigurationSchema(group).validate(body, {
abortEarly: false,
stripUnknown: true,
strict: true,
});
input = await createModelConfigurationSchema(group, schema).validate(
body,
{
abortEarly: false,
stripUnknown: true,
strict: true,
}
);
} catch (error) {
return ctx.badRequest(null, {
name: 'validationError',
@ -77,12 +83,11 @@ module.exports = {
const groupService = strapi.plugins['content-manager'].services.groups;
await groupService.setConfiguration(uid, input);
const ctService = strapi.plugins['content-manager'].services.contenttypes;
const configurations = await groupService.getConfiguration(uid);
const data = {
uid,
schema: ctService.formatContentTypeSchema(group),
schema,
...configurations,
};

View File

@ -1,30 +1,28 @@
'use strict';
const yup = require('yup');
const {
isListable,
hasRelationAttribute,
hasEditableAttribute,
} = require('../../services/utils/configuration/attributes');
/**
* Creates the validation schema for content-type configurations
*/
module.exports = model =>
module.exports = (model, schema) =>
yup
.object()
.shape({
settings: createSettingsSchema(model),
metadatas: createMetadasSchema(model),
layouts: createLayoutsSchema(model),
settings: createSettingsSchema(model, schema),
metadatas: createMetadasSchema(model, schema),
layouts: createLayoutsSchema(model, schema),
})
.noUnknown();
// TODO: do sth to clean the keys configurable, private etc
const createSettingsSchema = model => {
const validAttributes = Object.keys(model.allAttributes).filter(key => {
return (
model.allAttributes[key].type &&
!['json', 'password', 'group'].includes(model.allAttributes[key].type)
);
});
const attrs = ['id'].concat(validAttributes);
const createSettingsSchema = (model, schema) => {
const validAttributes = Object.keys(schema.attributes).filter(key =>
isListable(schema, key)
);
return yup
.object()
@ -41,12 +39,12 @@ const createSettingsSchema = model => {
// should be reset when the type changes
mainField: yup
.string()
.oneOf(attrs)
.oneOf(validAttributes)
.default('id'),
// should be reset when the type changes
defaultSortBy: yup
.string()
.oneOf(attrs)
.oneOf(validAttributes)
.default('id'),
defaultSortOrder: yup
.string()
@ -56,9 +54,9 @@ const createSettingsSchema = model => {
.noUnknown();
};
const createMetadasSchema = model => {
const createMetadasSchema = (model, schema) => {
return yup.object().shape(
['id'].concat(Object.keys(model.allAttributes)).reduce((acc, key) => {
Object.keys(schema.attributes).reduce((acc, key) => {
acc[key] = yup
.object()
.shape({
@ -97,18 +95,18 @@ const ARRAY_TEST = {
test: val => Array.isArray(val),
};
const createLayoutsSchema = model => {
const validAttributes = Object.keys(model.allAttributes).filter(key => {
return (
model.allAttributes[key].type &&
!['json', 'password', 'group'].includes(model.allAttributes[key].type)
);
});
const createLayoutsSchema = (model, schema) => {
const validAttributes = Object.keys(schema.attributes).filter(key =>
isListable(schema, key)
);
const attrs = ['id'].concat(validAttributes);
const relationAttributes = Array.isArray(model.associations)
? model.associations.map(assoc => assoc.alias)
: [];
const editAttributes = Object.keys(schema.attributes).filter(key =>
hasEditableAttribute(schema, key)
);
const relationAttributes = Object.keys(schema.attributes).filter(key =>
hasRelationAttribute(schema, key)
);
return yup.object().shape({
edit: yup
@ -120,11 +118,7 @@ const createLayoutsSchema = model => {
.shape({
name: yup
.string()
.oneOf(
Object.keys(model.allAttributes).filter(
key => model.allAttributes[key].type
)
)
.oneOf(editAttributes)
.required(),
size: yup
.number()
@ -138,7 +132,7 @@ const createLayoutsSchema = model => {
.test(ARRAY_TEST),
list: yup
.array()
.of(yup.string().oneOf(attrs))
.of(yup.string().oneOf(validAttributes))
.test(ARRAY_TEST),
editRelations: yup
.array()

View File

@ -3,6 +3,10 @@
const _ = require('lodash');
const NON_SORTABLES = ['group', 'json', 'relation'];
const isListable = (schema, name) =>
isSortable(schema, name) && schema.attributes[name].type != 'password';
const isSortable = (schema, name) => {
if (!_.has(schema.attributes, name)) {
return false;
@ -49,9 +53,37 @@ const isTimestamp = (schema, name) => {
const isRelation = attribute => attribute.type === 'relation';
const hasRelationAttribute = (schema, name) => {
if (!_.has(schema.attributes, name)) {
return false;
}
return isRelation(schema.attributes[name]);
};
const hasEditableAttribute = (schema, name) => {
if (!_.has(schema.attributes, name)) {
return false;
}
if (!isVisible(schema, name)) {
return false;
}
if (isRelation(schema.attributes[name])) {
if (schema.modelType === 'group') return true;
return false;
}
return true;
};
module.exports = {
isSortable,
isVisible,
isSearchable,
isRelation,
isListable,
hasEditableAttribute,
hasRelationAttribute,
};

View File

@ -1,7 +1,12 @@
'use strict';
const _ = require('lodash');
const { isSortable, isVisible, isRelation } = require('./attributes');
const {
isListable,
isVisible,
hasEditableAttribute,
hasRelationAttribute,
} = require('./attributes');
const DEFAULT_LIST_LENGTH = 4;
const MAX_ROW_SIZE = 12;
@ -37,7 +42,7 @@ async function createDefaultLayouts(schema) {
function createDefaultListLayout(schema) {
return Object.keys(schema.attributes)
.filter(name => isSortable(schema, name))
.filter(name => isListable(schema, name))
.slice(0, DEFAULT_LIST_LENGTH);
}
@ -67,7 +72,7 @@ function syncLayouts(configuration, schema) {
const { list = [], editRelations = [], edit = [] } =
configuration.layouts || {};
const cleanList = list.filter(attr => isSortable(schema, attr));
const cleanList = list.filter(attr => isListable(schema, attr));
const cleanEditRelations = editRelations.filter(attr =>
hasRelationAttribute(schema, attr)
@ -120,13 +125,13 @@ function syncLayouts(configuration, schema) {
// only add valid listable attributes
layout.list = _.uniq(
layout.list
.concat(newAttributes.filter(key => isSortable(schema, key)))
.concat(newAttributes.filter(key => isListable(schema, key)))
.slice(0, DEFAULT_LIST_LENGTH)
);
}
// add new relations to layout
if (schema.type !== 'group') {
if (schema.modelType !== 'group') {
const newRelations = newAttributes.filter(key =>
hasRelationAttribute(schema, key)
);
@ -171,31 +176,6 @@ const appendToEditLayout = (layout = [], keysToAppend, schema) => {
return layout;
};
const hasRelationAttribute = (schema, name) => {
if (!_.has(schema.attributes, name)) {
return false;
}
return isRelation(schema.attributes[name]);
};
const hasEditableAttribute = (schema, name) => {
if (!_.has(schema.attributes, name)) {
return false;
}
if (!isVisible(schema, name)) {
return false;
}
if (isRelation(schema.attributes[name])) {
if (schema.modelType === 'group') return true;
return false;
}
return true;
};
module.exports = {
createDefaultLayouts,
syncLayouts,

View File

@ -4,6 +4,7 @@ const _ = require('lodash');
const pickSchemaFields = model =>
_.pick(model, [
'modelType',
'connection',
'collectionName',
'info',