bpmn-io / form-js

View and visually edit JSON-based forms.
https://bpmn.io/toolkit/form-js/
Other
413 stars 106 forks source link

Refactor Form Viewer and Editor for Extensibility and Testability #59

Closed philippfromme closed 3 years ago

philippfromme commented 3 years ago

The current structure of both the form viewer and editor doesn't allow any extensibility and makes testing features in isolation impossible.

┌──────────────────────────┐            ┌───────────────────────────┐
│  API                     │            │  API                      │
│                          │            │                           │
│  #createForm             │            │  #createFormEditor        │
│                          │            │                           │
└──────────────────────────┘            └───────────────────────────┘

┌──────────────────────────┐            ┌───────────────────────────┐
│  form-js-viewer          │            │  form-js-editor           │
│                          │            │                           │
│ ┌──────────────────────┐ │            │ ┌───────────────────────┐ │
│ │Rendering             │ │            │ │Rendering              │ │
│ └──────────────────────┘ │            │ └───────────────────────┘ │
│                          │            │                           │
│ ┌──────────────────────┐ │            │ ┌───────────────────────┐ │
│ │Event Bus             │ │            │ │Event Bus              │ │
│ └──────────────────────┘ │  Contains  │ └───────────────────────┘ │
│                          ├───────────►│                           │
│ ┌──────────────────────┐ │            │ ┌───────────────────────┐ │
│ │Element Registry      │ │            │ │Element Registry       │ │
│ └──────────────────────┘ │            │ └───────────────────────┘ │
│                          │            │                           │
│ ┌──────────────────────┐ │            │ ┌───────────────────────┐ │
│ │Data Mapping          │ │            │ │Data Mapping           │ │
│ └──────────────────────┘ │            │ └───────────────────────┘ │
│                          │            │                           │
└──────────────────────────┘            │ ┌───────────────────────┐ │
                                        │ │Modeling               │ │
                                        │ └───────────────────────┘ │
                                        │                           │
                                        │ ┌───────────────────────┐ │
                                        │ │Palette                │ │
                                        │ └───────────────────────┘ │
                                        │                           │
                                        │ ┌───────────────────────┐ │
                                        │ │Properties Panel       │ │
                                        │ └───────────────────────┘ │
                                        │                           │
                                        │ ┌───────────────────────┐ │
                                        │ │Selection              │ │
                                        │ └───────────────────────┘ │
                                        │                           │
                                        └───────────────────────────┘

With the diagram-js-based bpmn-js and the table-js-based dmn-js we have solved these issues using dependency injection. Separating the features into individual DI services makes extensibility and testability possible.

Steps

Additional questions:

Follow-up issues:

philippfromme commented 3 years ago

Closed via https://github.com/bpmn-io/form-js/pull/75.