import { Observable } from "rxjs/Observable";
import "rxjs/add/operator/zip";
import "rxjs/add/operator/do";
import "rxjs/add/operator/debounceTime";
import "rxjs/add/operator/distinct";
import "rxjs/add/operator/switch";
import "rxjs/add/operator/finally";
import "rxjs/add/operator/share";
import { NgForm } from "@angular/forms";
import { NgrxJsonApiService, NgrxJsonApiStoreData, NgrxJsonApiZoneService, ResourceError, StoreResource } from 'ngrx-json-api';
import { Store } from "@ngrx/store";
export interface FormBindingConfig {
/**
* Reference to the forFormElement instance to hook into.
*/
form: NgForm;
/**
* Reference to a query from the store to get notified about validation errors.
* FormBinding implementation assumes that the query has already been executed
* (typically when performing the route to a new page).
*/
queryId: string;
/**
* By default a denormalized selectOneResults is used to fetch resources. Any update of those
* resources triggers an update of the FormControl states. Set this flag to true to listen to all store changes.
*/
mapNonResultResources?: boolean;
/**
* Zone to use within ngrx-json-api.
*/
zoneId?: string;
}
/**
* Binding between ngrx-jsonapi and angular forms. It serves two purposes:
*
*
* - Updates the JSON API store when forFormElement controls changes their values.
* - Updates the validation state of forFormElement controls in case of JSON API errors. JSON API errors that cannot be
* mapped to a forFormElement control are hold in the errors property
*
*
*
* The binding between resources in the store and forFormElement controls happens trough the naming of the forFormElement
* controls. Two naming patterns are supported:
*
*
* - basic binding for all forFormElement controls that start with "attributes." or "relationships.". A forFormElement
* control with label "attributes.title" is mapped to the "title" attribute of the JSON API resource in the store. The id of the
* resource is obtained from the FormBindingConfig.resource$.
*
* - (not yet supported) advanced binding with the naming pattern
* "resource.{type}.{id}.{attributes/relationships}.{label}".
* It allows to edit multiple resources in the same forFormElement.
*
*
*
* Similarly, JSON API errors are mapped back to forFormElement controls trougth the source pointer of the error. If such a
* mapping is not found, the error is added to the errors attribute of this class. Usually applications show such errors above
* all fields in the config.
*
* You may also have a look at the CrnkExpressionModule. Its ExpressionDirective provides an alternative to NgModel
* that binds both a value and sets the label of forFormElement control with a single (type-safe) attribute.
*/
export declare class FormBinding {
private config;
private store;
/**
* Observable to the resource to be edited. The forFormElement binding is active as long as there is
* at least one subscriber to this Observable.
*/
resource$: Observable;
/**
* Contains all errors that cannot be assigned to a forFormElement control. Usually such errors are shown on top above
* all controls.
*/
unmappedErrors: Array;
/**
* the forFormElement also sends out valueChanges upon initialization, we do not want that and filter them out with this flag
*/
private wasDirty;
/**
* id of the main resource to be edited.
*/
private primaryResourceId;
/**
* list of resources edited by this binding. May include related resources next to the primary one.
*/
private editResourceIds;
/**
* Subscription to forFormElement changes. Gets automatically cancelled if there are no subscriptions anymore to
* resource$.
*/
private formSubscription;
private storeSubscription;
private formControlsInitialized;
private _storeDataSnapshot?;
private validSubject;
private dirtySubject;
valid: Observable;
dirty: Observable;
readonly zone: NgrxJsonApiZoneService;
constructor(ngrxJsonApiService: NgrxJsonApiService, config: FormBindingConfig, store: Store);
protected cancelSubscriptions(): void;
protected checkSubscriptions(): void;
protected mapResourceToControlErrors(data: NgrxJsonApiStoreData): void;
protected updateDirtyState(data: NgrxJsonApiStoreData): void;
protected toResourceFormName(resource: StoreResource, basicFormName: string): string;
protected toPath(sourcePointer: string): string;
save(): void;
delete(): void;
/**
* computes type, id and field path from formName.
*/
private parseResourceFieldRef(formName);
updateStoreFromFormValues(values: any): void;
/**
* Prime NG has to annoying habit of adding _$visited. Cleaned up here. Needs to be further investigated
* and preferably avoided.
*
* FIXME move to HTTP layer or fix PrimeNG, preferably the later.
*/
private clearPrimeNgMarkers(resource);
}