rehance-forms
Version:
Form utilities for React
208 lines (207 loc) • 7.47 kB
TypeScript
import * as React from "react";
import { EventBus, EventBusSubscriber, FormEventSignal } from "./EventBus";
import { FieldMap, IScopeChild, ErrorMap } from "./types";
import { FieldContext } from "./FieldContext";
export declare type ScopeChild = ListScopeContext | FieldContext | ScopeContext;
export declare const FormScopeConsumer: React.ExoticComponent<React.ConsumerProps<ScopeContext | null>>, FormScopeProvider: React.ProviderExoticComponent<React.ProviderProps<ScopeContext | null>>;
export declare abstract class BaseContext implements IScopeChild {
protected _parent: null | BaseContext;
protected _events: EventBus;
protected _id: string;
constructor(parentScope?: null | BaseContext);
/**
* Returns the top level or root scope of the hierarchy that this scope belongs to.
* Essentially, this will return the form scope.
*/
readonly root: BaseContext;
/**
* Returns the parent scope of this scope or null if no parent scope exists and this
* is the top level scope.
*/
readonly parent: null | BaseContext;
/**
* Returns the event bus that this scope is using. If this scope is nested inside
* of another scope, it will use the parent scope's event bus (all the way up the
* scope tree to the root scope).
*/
readonly events: EventBus;
/**
* Returns the ID for the scope. The scope ID is a combination of its own internal
* ID and the IDs of its parents.
*/
readonly id: string;
/**
* Returns true if the scope is the parent (or ancestor) of the given scope.
*/
isAncestorOf(scope: BaseContext): boolean;
/**
* Returns true if the scope is the child (or descendent) of the given scope.
*/
isDescendentOf(scope: BaseContext): boolean;
/**
* Subscribe to all events occurring within the hierarchy that this scope belongs to.
*/
listen(sub: EventBusSubscriber): Function;
/**
* Triggers an update that will be broadcasted to all scopes within the hierarchy that
* this scope belongs to.
*/
broadcast(signal: FormEventSignal, field?: string): this;
/**
* Submits the form that the scope belongs to.
*/
submit(): this;
abstract readonly touched: boolean;
abstract readonly value: any;
abstract readonly valid: boolean;
abstract readonly changed: boolean;
abstract reset(): void;
abstract clear(): void;
abstract commit(): void;
}
export declare class ScopeContext extends BaseContext implements IScopeChild {
protected _initialValues: FieldMap;
children: {
[key: string]: ScopeChild;
};
constructor(initialValues?: FieldMap, parentScope?: null | BaseContext);
/**
* Returns the initial values for the scope.
*/
readonly initialValues: FieldMap;
/**
* Returns a child scope or field of this scope. Returns null if a
* valid child cannot be found.
*/
getChild(name: string): ScopeChild | null;
/**
* Register a child scope or field to this scope.
*/
setChild(name: string, child: ScopeChild): this;
/**
* Unregister a child scope or field from this scope.
*/
clearChild(name: string): this;
/**
* Builds and returns a map of key/value pairs with the data managed by this
* scope, and the child scopes.
*/
readonly value: FieldMap;
/**
* Returns the errors for this scope and its descendents.
*/
readonly error: null | ErrorMap;
/**
* Returns the errors for the requested fields or null if no errors were found in
* the specified fields.
*/
getErrors(fields: string[]): null | ErrorMap;
/**
* Returns an existing field or creates a new field context is one does not
* exist. The field is automatically added as a child to the scope.
*/
field(name: string): FieldContext;
/**
* Returns true if none of the fields in the current scope have an error.
*/
readonly valid: boolean;
/**
* Returns true if all of the specified children of this scope are considered valid.
*/
areValid(fields: string[]): boolean;
/**
* Returns true if any of the fields have in the current scope have changed.
*/
readonly changed: boolean;
/**
* Returns true if any of the fields have in the current scope have been touched.
*/
readonly touched: boolean;
/**
* Returns true if any of the specified children of this scope have changed.
*/
hasChanges(fields: string[]): boolean;
/**
* Resets the values of the all fields and scopes with in the current scope
* back to their initial values.
*/
reset(): this;
/**
* Clears the values of all fields and scopes within the current scope.
*/
clear(): this;
/**
* Convenience method for getting a single value from the scope.
*/
get(field: string, fallback?: any): any;
/**
* Adopts the current values for each field as the new initial value, setting the
* changed state for the scope to `false`. If you want to commit changes for a full
* form from a sub scope, use `scope.root.commit()`. Once you've committed the changes
* you'll want to run the `.update()` method to broadcast the update.
*/
commit(): this;
/**
* Convenience method that broadcasts the scope update event.
*/
update(): this;
}
export declare class ListScopeContext extends BaseContext {
children: ScopeContext[];
protected _initialValues: FieldMap[];
constructor(initialValues?: FieldMap[], parentScope?: null | BaseContext);
/**
* Returns the initial values for the list scope.
*/
readonly initialValues: FieldMap[];
/**
* Adds a new child context to the list scope.
*/
addChildScope(values?: FieldMap): this;
/**
* Splices a specific child by index.
*/
removeChildScope(index: number): this | undefined;
/**
* Builds and returns an array with the data managed by this scope,
* and the child scopes.
*/
readonly value: FieldMap[];
/**
* Returns the errors for all of the scopes within this list scope as an array or
* null if no errors are found in any of the nested scopes.
*/
readonly error: null | ErrorMap[];
/**
* Returns true if none of the fields in the current scope have an error.
*/
readonly valid: boolean;
/**
* Returns true if any of the fields have in the current scope have changed.
*/
readonly changed: boolean;
/**
* Returns true if any of the fields have in the current scope have been touched.
*/
readonly touched: boolean;
/**
* Resets the values of the all fields and scopes with in the current scope
* back to their initial values.
*/
reset(): this;
/**
* Clears the values of all fields and scopes within the current scope.
*/
clear(): this;
/**
* Adopts the current values for each field as the new initial value, setting the
* changed state for the scope to `false`. If you want to commit changes for a full
* form from a sub scope, use `scope.root.commit()`. Once you've committed the changes
* you'll want to run the `.update()` method to broadcast the update.
*/
commit(): this;
/**
* Convenience method that broadcasts the scope update event.
*/
update(): this;
}