Package Exports
- @lyra/form-builder
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (@lyra/form-builder) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
Form Builder
Big fat disclaimer: Work in progress
There is an example of a consumer app in the ./example
that can be started with npm start
Limitations
Polymorphic arrays may only contain elements of one primitive type. Thus, this is invalid:
{
"types": [
{
"name": "myType",
"type": "array",
"of": [
{"type": "string", "title": "Street"},
{"type": "string", "title": "E-mail"}
]
}
]
}
Terminology
Type
Types are the building blocks for your schema. A type defines the structure and behavior of your data model.
There is a distiction between primitive types and container types.
A container type is a type that contains data of other types, e.g. array
or object
. A primitive type only represents one simple value, like the number 3
or the string foobar
Field
If you define an object type, you must also define its fields. E.g. if you are defining a person
type, it may look like this:
{
"name": "person",
"type": "object",
"fields": [
{
"name": "firstName",
"title": "First name",
"type": "string"
},
{
"name": "lastName",
"title": "Last name",
"type": "string"
}
]
}
You cannot create an object type that has no fields. We haven't yet had the need for a hash
type that can have arbitrary key => value pairs (where keys are strings and value can be anything), but will consider supporting it in the future.
Input widgets
All input fields must follow a simple convention based protocol. Every input field must:
- Accept a
value
prop which is the field's value - Accept an
onChange
function as prop which is called whenever a value changes
Schema
When writing a schema, type
is implicitly object
, unless otherwise specified. You're not allowed to set type: 'object' (redundant definition).
Only built-in types can take options. Below, email.placeholder
is an option to string
and versions.of
is an option to list
.
const schema = {
name: 'someSchema',
types: [
{
name: 'user',
fields: [
{
name: 'email',
type: 'string',
title: 'E-mail address',
placeholder: 'murgh@example.com'
},
{
name: 'profilePicture',
type: 'image'
}
]
},
{
name: 'image',
fields: [
{
name: 'fullSizeUrl',
type: 'string'
},
{
name: 'aspectRatio',
type: 'number'
},
{
name: 'versions',
type: 'list',
of: [{type: 'imageVersion'}]
}
]
},
{
name: 'imageVersion',
fields: [
{
name: 'width',
type: 'number'
},
{
name: 'square',
type: 'boolean'
},
{
name: 'url',
type: 'string'
}
]
}
]
}
Considerations / todo
- Support for collaborative editing
- Powerful validation rules
- i18n
- List item edit modality
- Styling