0.3.0 • Published 5 years ago

@lyra/form-builder v0.3.0

Weekly downloads
1
License
MIT
Repository
github
Last release
5 years ago

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