README.md

FORM: Declarative Documents
===========================

[![Actions Status](https://github.com/synrc/form/workflows/mix/badge.svg)](https://github.com/synrc/form/actions)
[![Hex pm](https://img.shields.io/hexpm/v/form.svg?style=flat)](https://hex.pm/packages/form)

Intro
-----

```erlang
  #document { name = Name, sections = [
      #sec { name=[<<"Input the password "
                     "you have received by SMS"/utf8>>,
             nitro:to_list(Phone#phone.number)] } ],

    buttons  = [ #but { name='decline',
                        title=<<"Cancel"/utf8>>,
                        class=cancel,
                        postback={'CloseOpenedForm',Name} },

                 #but { name='proceed',
                        title = <<"Proceed"/utf8>>,
                        class = [button,sgreen],
                        sources = [otp],
                        postback = {'Spinner',{'OpenForm',Name}}}],

    fields = [ #field { name='otp',
                        type=otp,
                        title= <<"Password:"/utf8>>,
                        labelClass=label,
                        fieldClass=column3}]}.

```

Spec
----

Documents or Forms consist of set of fields grouped
in sections and a row of control buttons.
It mey also contain fields of customizable types.

```erlang
  -record(document, { ?ITERATOR(feed),
                      name,
                      base,
                      sections,
                      fields,
                      buttons,
                      access }).
```

```erlang
 -record(field,     { id, sec=1, name, pos, title,
                      layout, visible=true,
                      disabled=false, format="~w",
                      curr=[], postfun=[], desc,
                      wide=normal, type=binary,
                      etc, labelClass=label,
                      fieldClass=field,
                      boxClass=box,
                      access, tooltips=[],
                      options=[], min=0, max=1000000,
                      length=10, postback }).
```

```erlang
 -record(sec,       { id,
                      name,
                      desc="" }).
```
```erlang
 -record(but,       { id,
                      postback,
                      name,
                      title,
                      sources=[],
                      class }).
```
```erlang
  -record(sel,      { id,
                      postback,
                      name,
                      title }).
```
```erlang
 -record(opt,       { id,
                      postback,
                      name,
                      title,
                      checked=false,
                      disabled=false,
                      noRadioButton=false }).
```
```erlang
 -record(validation, { name, type, msg,
                       extract = fun(X) -> X end,
                       options=[], function,
                       field={record,pos} }).
```

KVX Data Model
--------------

The Metainformation is used to generate KVS Data Model.
The [KVS](http://github.com/synrc/kvs) layer provides persistence.

NITRO Applications
-----------------

JavaScript Web Application is generated using Metainformation and Data Model.
[N2O](http://github.com/synrc/n2o) is used as a domain specific language to generate forms.
JavaScript/OTP is used to generate form. Average rendering speed is 25 forms per second.
Erlang and JavaScript/OTP are used to define validation
rules applied to documents during workflow.

BPE Processes
-------------

Workflows are complimentary to business rules and could be specified separately.
[BPE](http://github.com/synrc/bpe) defenitions provide front API to end-user applications.

Credits
-------

* Maxim Sokhatsky

OM A HUM