revise field types and type buildSchema
This commit is contained in:
@@ -34,6 +34,7 @@ type FieldBase = {
|
||||
style?: CSSProperties;
|
||||
readOnly?: boolean;
|
||||
disabled?: boolean;
|
||||
condition?: (...args: any[]) => any | void;
|
||||
components?: { [key: string]: JSX.Element | (() => JSX.Element) };
|
||||
};
|
||||
access?: {
|
||||
@@ -56,7 +57,7 @@ export type EmailField = StandardField & { type: 'email'; };
|
||||
export type TextareaField = StandardField & { type: 'textarea'; };
|
||||
export type CodeField = StandardField & { type: 'code'; };
|
||||
export type CheckboxField = StandardField & { type: 'checkbox'; };
|
||||
export type DateboxField = StandardField & { type: 'date'; };
|
||||
export type DateField = StandardField & { type: 'date'; };
|
||||
export type GroupField = StandardField & { type: 'group'; };
|
||||
export type RowField = StandardField & { type: 'row'; };
|
||||
|
||||
@@ -78,11 +79,20 @@ export type SelectManyField = SelectField & {
|
||||
hasMany: true;
|
||||
}
|
||||
|
||||
export type RelationshipField = FieldBase & {
|
||||
type RelationShipSingleField = FieldBase & {
|
||||
type: 'relationship';
|
||||
relationTo: string | string[];
|
||||
relationTo: string;
|
||||
hasMany?: false;
|
||||
}
|
||||
|
||||
type RelationShipManyField = FieldBase & {
|
||||
type: 'relationship';
|
||||
relationTo: string[] | string;
|
||||
hasMany: true;
|
||||
}
|
||||
|
||||
export type RelationshipField = RelationShipSingleField | RelationShipManyField;
|
||||
|
||||
type RichTextElements = 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'blockquote' | 'ul' | 'ol' | 'link';
|
||||
type RichTextLeaves = 'bold' | 'italic' | 'underline' | 'strikethrough';
|
||||
export type RichTextField = FieldBase & {
|
||||
@@ -124,4 +134,4 @@ export type BlockField = FieldBase & {
|
||||
blocks?: Block[];
|
||||
};
|
||||
|
||||
export type Field = NumberField | TextField | EmailField | TextareaField | CodeField | CheckboxField | DateboxField | BlockField | RadioField | RelationshipField | ArrayField | RichTextField | GroupField | RowField | SelectField | SelectManyField | UploadField;
|
||||
export type Field = NumberField | TextField | EmailField | TextareaField | CodeField | CheckboxField | DateField | BlockField | RadioField | RelationshipField | ArrayField | RichTextField | GroupField | RowField | SelectField | SelectManyField | UploadField;
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
/* eslint-disable no-use-before-define */
|
||||
import { Schema } from 'mongoose';
|
||||
import { MissingFieldInputOptions } from '../errors';
|
||||
import { ArrayField, BlockField, CheckboxField, CodeField, DateField, EmailField, Field, GroupField, NumberField, RadioField, RelationshipField, RichTextField, RowField, SelectField, TextareaField, TextField, UploadField } from '../fields/config/types';
|
||||
|
||||
const setBlockDiscriminators = (fields, schema) => {
|
||||
const setBlockDiscriminators = (fields: Field[], schema) => {
|
||||
fields.forEach((field) => {
|
||||
if (field.type === 'blocks' && field.blocks && field.blocks.length > 0) {
|
||||
field.blocks.forEach((block) => {
|
||||
@@ -24,7 +25,7 @@ const setBlockDiscriminators = (fields, schema) => {
|
||||
});
|
||||
};
|
||||
|
||||
const formatBaseSchema = (field) => {
|
||||
const formatBaseSchema = (field: Field) => {
|
||||
const createAccess = field.access && field.access.create;
|
||||
|
||||
const condition = field.admin && field.admin.condition;
|
||||
@@ -38,7 +39,7 @@ const formatBaseSchema = (field) => {
|
||||
};
|
||||
};
|
||||
|
||||
const buildSchema = (configFields, options = {}) => {
|
||||
const buildSchema = (configFields: Field[], options = {}): Schema => {
|
||||
let fields = {};
|
||||
|
||||
configFields.forEach((field) => {
|
||||
@@ -57,31 +58,31 @@ const buildSchema = (configFields, options = {}) => {
|
||||
};
|
||||
|
||||
const fieldToSchemaMap = {
|
||||
number: (field, fields) => ({
|
||||
number: (field: NumberField, fields: Field[]) => ({
|
||||
...fields,
|
||||
[field.name]: { ...formatBaseSchema(field), type: Number },
|
||||
}),
|
||||
text: (field, fields) => ({
|
||||
text: (field: TextField, fields: Field[]) => ({
|
||||
...fields,
|
||||
[field.name]: { ...formatBaseSchema(field), type: String },
|
||||
}),
|
||||
email: (field, fields) => ({
|
||||
email: (field: EmailField, fields: Field[]) => ({
|
||||
...fields,
|
||||
[field.name]: { ...formatBaseSchema(field), type: String },
|
||||
}),
|
||||
textarea: (field, fields) => ({
|
||||
textarea: (field: TextareaField, fields: Field[]) => ({
|
||||
...fields,
|
||||
[field.name]: { ...formatBaseSchema(field), type: String },
|
||||
}),
|
||||
richText: (field, fields) => ({
|
||||
richText: (field: RichTextField, fields: Field[]) => ({
|
||||
...fields,
|
||||
[field.name]: { ...formatBaseSchema(field), type: Schema.Types.Mixed },
|
||||
}),
|
||||
code: (field, fields) => ({
|
||||
code: (field: CodeField, fields: Field[]) => ({
|
||||
...fields,
|
||||
[field.name]: { ...formatBaseSchema(field), type: String },
|
||||
}),
|
||||
radio: (field, fields) => {
|
||||
radio: (field: RadioField, fields: Field[]) => {
|
||||
if (!field.options || field.options.length === 0) {
|
||||
throw new MissingFieldInputOptions(field);
|
||||
}
|
||||
@@ -97,18 +98,18 @@ const fieldToSchemaMap = {
|
||||
|
||||
return {
|
||||
...fields,
|
||||
[field.name]: field.hasMany ? [schema] : schema,
|
||||
[field.name]: field.hasMany ? [schema] : schema, // TODO: radio group with hasMany??
|
||||
};
|
||||
},
|
||||
checkbox: (field, fields) => ({
|
||||
checkbox: (field: CheckboxField, fields: Field[]) => ({
|
||||
...fields,
|
||||
[field.name]: { ...formatBaseSchema(field), type: Boolean },
|
||||
}),
|
||||
date: (field, fields) => ({
|
||||
date: (field: DateField, fields: Field[]) => ({
|
||||
...fields,
|
||||
[field.name]: { ...formatBaseSchema(field), type: Date },
|
||||
}),
|
||||
upload: (field, fields) => ({
|
||||
upload: (field: UploadField, fields: Field[]) => ({
|
||||
...fields,
|
||||
[field.name]: {
|
||||
...formatBaseSchema(field),
|
||||
@@ -116,8 +117,8 @@ const fieldToSchemaMap = {
|
||||
ref: field.relationTo,
|
||||
},
|
||||
}),
|
||||
relationship: (field, fields) => {
|
||||
let schema = {};
|
||||
relationship: (field: RelationshipField, fields: Field[]) => {
|
||||
let schema: { [key: string]: any } = {};
|
||||
|
||||
if (Array.isArray(field.relationTo)) {
|
||||
schema.value = {
|
||||
@@ -146,7 +147,7 @@ const fieldToSchemaMap = {
|
||||
[field.name]: schema,
|
||||
};
|
||||
},
|
||||
row: (field, fields) => {
|
||||
row: (field: RowField, fields: Field[]) => {
|
||||
const newFields = { ...fields };
|
||||
|
||||
field.fields.forEach((rowField) => {
|
||||
@@ -160,7 +161,7 @@ const fieldToSchemaMap = {
|
||||
|
||||
return newFields;
|
||||
},
|
||||
array: (field, fields) => {
|
||||
array: (field: ArrayField, fields: Field[]) => {
|
||||
const schema = buildSchema(field.fields, { _id: false, id: false });
|
||||
|
||||
return {
|
||||
@@ -171,7 +172,7 @@ const fieldToSchemaMap = {
|
||||
},
|
||||
};
|
||||
},
|
||||
group: (field, fields) => {
|
||||
group: (field: GroupField, fields: Field[]) => {
|
||||
const schema = buildSchema(field.fields, { _id: false, id: false });
|
||||
|
||||
return {
|
||||
@@ -183,7 +184,7 @@ const fieldToSchemaMap = {
|
||||
},
|
||||
};
|
||||
},
|
||||
select: (field, fields) => {
|
||||
select: (field: SelectField, fields: Field[]) => {
|
||||
if (!field.options || field.options.length === 0) {
|
||||
throw new MissingFieldInputOptions(field);
|
||||
}
|
||||
@@ -202,7 +203,7 @@ const fieldToSchemaMap = {
|
||||
[field.name]: field.hasMany ? [schema] : schema,
|
||||
};
|
||||
},
|
||||
blocks: (field, fields) => {
|
||||
blocks: (field: BlockField, fields: Field[]) => {
|
||||
const flexibleSchema = new Schema({ blockName: String }, { discriminatorKey: 'blockType', _id: false, id: false });
|
||||
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user