@jsonforms/core
Version:
Core module of JSON Forms
253 lines (252 loc) • 7.25 kB
TypeScript
import type { JsonSchema } from './jsonSchema';
/**
* Interface for describing an UI schema element that is referencing
* a subschema. The value of the scope may be a JSON Pointer.
*/
export interface Scopable {
/**
* The scope that determines to which part this element should be bound to.
*/
scope?: string;
}
/**
* Interface for describing an UI schema element that is referencing
* a subschema. The value of the scope must be a JSON Pointer.
*/
export interface Scoped extends Scopable {
/**
* The scope that determines to which part this element should be bound to.
*/
scope: string;
}
/**
* Interface for describing an UI schema element that may be labeled.
*/
export interface Labelable<T = string> {
/**
* Label for UI schema element.
*/
label?: string | T;
}
/**
* Interface for describing an UI schema element that is labeled.
*/
export interface Labeled<T = string> extends Labelable<T> {
label: string | T;
}
export interface Internationalizable {
i18n?: string;
}
/**
* A rule that may be attached to any UI schema element.
*/
export interface Rule {
/**
* The effect of the rule
*/
effect: RuleEffect;
/**
* The condition of the rule that must evaluate to true in order
* to trigger the effect.
*/
condition: Condition;
}
/**
* The different rule effects.
*/
export declare enum RuleEffect {
/**
* Effect that hides the associated element.
*/
HIDE = "HIDE",
/**
* Effect that shows the associated element.
*/
SHOW = "SHOW",
/**
* Effect that enables the associated element.
*/
ENABLE = "ENABLE",
/**
* Effect that disables the associated element.
*/
DISABLE = "DISABLE"
}
/**
* Represents a condition to be evaluated.
*/
export interface BaseCondition {
/**
* The type of condition.
*/
readonly type?: string;
}
/**
* A leaf condition.
*/
export interface LeafCondition extends BaseCondition, Scoped {
type: 'LEAF';
/**
* The expected value when evaluating the condition
*/
expectedValue: any;
}
export interface SchemaBasedCondition extends BaseCondition, Scoped {
schema: JsonSchema;
/**
* When the scope resolves to undefined and `failWhenUndefined` is set to `true`, the condition
* will fail. Therefore the reverse effect will be applied.
*
* Background:
* Most JSON Schemas will successfully validate against `undefined` data. Specifying that a
* condition shall fail when data is `undefined` requires to lift the scope to being able to use
* JSON Schema's `required`.
*
* Using `failWhenUndefined` allows to more conveniently express this condition.
*/
failWhenUndefined?: boolean;
}
/** A condition using a validation function to determine its fulfillment. */
export interface ValidateFunctionCondition extends BaseCondition, Scoped {
/**
* Validates whether the condition is fulfilled.
*
* @param data The data as resolved via the scope.
* @returns `true` if the condition is fulfilled */
validate: (context: ValidateFunctionContext) => boolean;
}
export interface ValidateFunctionContext {
/** The resolved data scoped to the `ValidateFunctionCondition`'s scope. */
data: unknown;
/** The full data of the form. */
fullData: unknown;
/** Optional instance path. Necessary when the actual data path can not be inferred via the scope alone as it is the case with nested controls. */
path: string | undefined;
/** The `UISchemaElement` containing the rule that uses the ValidateFunctionCondition, e.g. a `ControlElement` */
uischemaElement: UISchemaElement;
}
/**
* A composable condition.
*/
export interface ComposableCondition extends BaseCondition {
conditions: Condition[];
}
/**
* An or condition.
*/
export interface OrCondition extends ComposableCondition {
type: 'OR';
}
/**
* An and condition.
*/
export interface AndCondition extends ComposableCondition {
type: 'AND';
}
/**
* A union of all available conditions.
*/
export type Condition = BaseCondition | LeafCondition | OrCondition | AndCondition | SchemaBasedCondition | ValidateFunctionCondition;
/**
* Common base interface for any UI schema element.
*/
export interface BaseUISchemaElement {
/**
* The type of this UI schema element.
*/
type: string;
/**
* An optional rule.
*/
rule?: Rule;
/**
* Any additional options.
*/
options?: {
[key: string]: any;
};
}
/**
* Represents a layout element which can order its children
* in a specific way.
*/
export interface Layout extends BaseUISchemaElement {
/**
* The child elements of this layout.
*/
elements: UISchemaElement[];
}
/**
* A layout which orders its child elements vertically (i.e. from top to bottom).
*/
export interface VerticalLayout extends Layout {
type: 'VerticalLayout';
}
/**
* A layout which orders its children horizontally (i.e. from left to right).
*/
export interface HorizontalLayout extends Layout {
type: 'HorizontalLayout';
}
/**
* A group resembles a vertical layout, but additionally might have a label.
* This layout is useful when grouping different elements by a certain criteria.
*/
export interface GroupLayout extends Layout, Labelable, Internationalizable {
type: 'Group';
}
/**
* Represents an object that can be used to configure a label.
*/
export interface LabelDescription {
/**
* An optional text to be displayed.
*/
text?: string;
/**
* Optional property that determines whether to show this label.
*/
show?: boolean;
}
/**
* A label element.
*/
export interface LabelElement extends BaseUISchemaElement, Internationalizable {
type: 'Label';
/**
* The text of label.
*/
text: string;
}
/**
* A control element. The scope property of the control determines
* to which part of the schema the control should be bound.
*/
export interface ControlElement extends BaseUISchemaElement, Scoped, Labelable<string | boolean | LabelDescription>, Internationalizable {
type: 'Control';
}
/**
* The category layout.
*/
export interface Category extends Layout, Labeled, Internationalizable {
type: 'Category';
}
/**
* The categorization element, which may have children elements.
* A child element may either be itself a Categorization or a Category, hence
* the categorization element can be used to represent recursive structures like trees.
*/
export interface Categorization extends BaseUISchemaElement, Labeled, Internationalizable {
type: 'Categorization';
/**
* The child elements of this categorization which are either of type
* {@link Category} or {@link Categorization}.
*/
elements: (Category | Categorization)[];
}
/**
* A union of all available UI schema elements.
* This includes all layout elements, control elements, label elements,
* group elements, category elements and categorization elements.
*/
export type UISchemaElement = BaseUISchemaElement | ControlElement | Layout | LabelElement | GroupLayout | Category | Categorization | VerticalLayout | HorizontalLayout;