openmct/platform/forms
Aaron Doubek-Kraft 4b07930305 Summary Widgets (#1668)
* [ViewAPI] Update view API with more support

Update view provider to allow metadata definitions and to play
nicely with old style views.

Spec out some updates to ViewProviders and ViewRegistry to
support further use of views.

* [Summary Widgets] Add summary widgets

Add a summary widget domain object type

Implement basic interface and style configuration for rules

* [Summary Widgets] Implementation for Rules

Add rule configuration inputs, populated with domain objects, metadata,
and appropriate operations for a given type

* [Inputs] Add implementation for icon palette

Issue #1644

Wire up icon palette inputs to widget, and make icon class a persistable
property of a rule

* [Summary Widgets] Implementation for conditions

Support configuring and persisting multiple conditions per rule

Issue #1644

* [Summary Widgets] Generate Rule Descriptions

Dynamically update the rule description based on the current state
of the rules' conditions

* [Summary Widgets] 'Any/All Telemetry' in conditions

Add UI and implemenetion for evaluating any telemetry or all telemetry
in an individual condition. Add related unit tests.

* [Summary Widgets] Rule Reorders

Implement drag and drop rule reorders using the native HTML5 API

* [Summary Widget] Test Data

Issue #1644

Add user-configurable mock data to test rules. Modify evaluator to
gracefully handle uninitialzed test data points.

* [Summary Widgets] Edit Mode

Enable edit mode for summary widgets, and make configuration interface
visible only when the user has entered edit mode

Fix collision between widget palettes and other interfaces where
palettes would permanently hide other menus

* [Summary Widgets] UI for scripted conditions

* [Sumamry Widgets] Destroy
Implement destroy

* [Summary Widgets] Cleanup
Remove unnecessary persist calls in Rule.js.
Remove generateDescription from refreshConditions and add it after refreshConditions to initCondition and deleteCondition
Throw error when unsupported callback is passed in condition.js, return summary widget instance in plugin.js instead of wrapping in new object for view
Add request properties to telemetry request for providers that support it
Remove check for editing when persisting, in SummaryWidget.js
2017-11-28 13:23:15 -08:00
..
res/templates Summary Widgets (#1668) 2017-11-28 13:23:15 -08:00
src [Import/Export] Adds Import and Export functionality 2017-08-25 19:28:29 -04:00
test [Import/Export] Adds Import and Export functionality 2017-08-25 19:28:29 -04:00
bundle.js [Import/Export] Adds Import and Export functionality 2017-08-25 19:28:29 -04:00
README.md [Documentation] Add number input 2017-06-23 14:32:21 -07:00

Overview

This bundle contains a general implementation of forms in Open MCT. This allows forms to be expressed using a reasonably concise declarative syntax, and rendered as Angular templates in a consistent fashion.

Usage

To include a form with a declarative definition, use the mct-form directive, e.g.:

<mct-form ng-model="myModel" structure="myStructure" name="myForm">
</mct-form>

Using toolbars is similar:

<mct-toolbar ng-model="myModel" structure="myStructure" name="myToolbar">
</mct-toolbar>

The attributes utilized by this form are as follows:

  • ng-model: The object which should contain the full form input. Individual fields in this model are bound to individual controls; the names used for these fields are provided in the form structure (see below).
  • structure: The structure of the form; e.g. sections, rows, their names, and so forth. The value of this attribute should be an Angular expression.
  • name: The name in the containing scope under which to publish form "meta-state", e.g. $valid, $dirty, etc. This is as the behavior of ng-form. Passed as plain text in the attribute.

Form structure

A form's structure is described as a JavaScript object in the following form:

{
    "name": ... title to display for the form, as a string ...,
    "sections": [
        {
            "name": ... title to display for the section ...,
            "rows": [
                {
                    "name": ... title to display for this row ...,
                    "control": ... symbolic key for the control ...,
                    "key": ... field name in ng-model ...
                    "pattern": ... optional, reg exp to match against ...
                    "required": ... optional boolean ...
                    "options": [
                        "name": ... name to display (e.g. in a select) ...,
                        "value": ... value to store in the model ...
                    ]
                },
                ... and other rows ...
            ]
        },
        ... and other sections ...
    ]
}

Note that pattern may be specified as a string, to simplify storing for structures as JSON when necessary. The string should be given in a form appropriate to pass to a RegExp constructor.

Toolbar structure

A toolbar's structure is described similarly to forms, except that there is no notion of rows; instead, there are items.

{
    "name": ... title to display for the form, as a string ...,
    "sections": [
        {
            "name": ... title to display for the section ...,
            "items": [
                {
                    "name": ... title to display for this row ...,
                    "control": ... symbolic key for the control ...,
                    "key": ... field name in ng-model ...
                    "pattern": ... optional, reg exp to match against ...
                    "required": ... optional boolean ...
                    "options": [
                        "name": ... name to display (e.g. in a select) ...,
                        "value": ... value to store in the model ...
                    ],
                    "disabled": ... true if control should be disabled ...
                    "size": ... size of the control (for textfields) ...
                    "click": ... function to invoke (for buttons) ...
                    "glyph": ... glyph to display (for buttons) ...
                    "text": ... text withiin control (for buttons) ...
                },
                ... and other rows ...
            ]
        },
        ... and other sections ...
    ]
}

Note that pattern may be specified as a string, to simplify storing for structures as JSON when necessary. The string should be given in a form appropriate to pass to a RegExp constructor.

Adding controls

These control types are included in the forms bundle:

  • textfield: A text input to enter plain text.
  • numberfield: A text input to enter numbers.
  • select: A drop-down list of options.
  • checkbox: A box which may be checked/unchecked.
  • color: A color picker.
  • button: A button.
  • datetime: An input for UTC date/time entry; gives result as a UNIX timestamp, in milliseconds since start of 1970, UTC.

New controls may be added as extensions of the controls category. Extensions of this category have two properites:

  • key: The symbolic name for this control (matched against the control field in rows of the form structure).
  • templateUrl: The URL to the control's Angular template, relative to the resources directory of the bundle which exposes the extension.

Within the template for a control, the following variables will be included in scope:

  • ngModel: The model where form input will be stored. Notably we also need to look at field (see below) to determine which field in the model should be modified.
  • ngRequired: True if input is required.
  • ngPattern: The pattern to match against (for text entry.)
  • options: The options for this control, as passed from the options property of an individual row.
  • field: Name of the field in ngModel which will hold the value for this control.