Repository URL to install this package:
|
Version:
1.0.0 ▾
|
/**
* @license
* FOURBURNER CONFIDENTIAL
* Unpublished Copyright (C) 2021 FourBurner Technologies, Inc. All Rights Reserved.
*
* NOTICE: All information contained herein is, and remains the property of FOURBURNER TECHNOLOGIES,
* INC. The intellectual and technical concepts contained herein are proprietary to FOURBURNER
* TECHNOLOGIES, INC. and may be covered by U.S. and Foreign Patents, patents in process, and are
* protected by trade secret or copyright law. Dissemination of this information or reproduction of
* this material is strictly forbidden unless prior written permission is obtained from FOURBURNER
* TECHNOLOGIES, INC. Access to the source code contained herein is hereby forbidden to anyone
* except current FOURBURNER TECHNOLOGIES, INC. employees, managers or contractors who have executed
* Confidentiality and Non-disclosure agreements explicitly covering such access.
*
* The copyright notice above does not evidence any actual or intended publication or disclosure of
* this source code, which includes information that is confidential and/or proprietary, and is a
* trade secret, of FOURBURNER TECHNOLOGIES, INC. ANY REPRODUCTION, MODIFICATION, DISTRIBUTION,
* PUBLIC PERFORMANCE, OR PUBLIC DISPLAY OF OR THROUGH USE OF THIS SOURCE CODE WITHOUT THE EXPRESS
* WRITTEN CONSENT OF FOURBURNER TECHNOLOGIES, INC. IS STRICTLY PROHIBITED, AND IN VIOLATION OF
* APPLICABLE LAWS AND INTERNATIONAL TREATIES. THE RECEIPT OR POSSESSION OF THIS SOURCE CODE AND/OR
* RELATED INFORMATION DOES NOT CONVEY OR IMPLY ANY RIGHTS TO REPRODUCE, DISCLOSE OR DISTRIBUTE ITS
* CONTENTS, OR TO MANUFACTURE, USE, OR SELL ANYTHING THAT IT MAY DESCRIBE, IN WHOLE OR IN PART.
*/
import {FormControl, FormGroupDirective, NgControl, NgForm} from '@angular/forms';
import {Subject} from 'rxjs';
import {ErrorStateMatcher} from '../error/error.options';
import {AbstractConstructor, Constructor} from './constructor';
/** @docs-private */
export interface CanUpdateErrorState {
/** Emits whenever the component state changes. */
readonly stateChanges: Subject<void>;
/** Updates the error state based on the provided error state matcher. */
updateErrorState(): void;
/** Whether the component is in an error state. */
errorState: boolean;
/** An object used to control the error state of the component. */
errorStateMatcher: ErrorStateMatcher;
}
type CanUpdateErrorStateCtor = Constructor<CanUpdateErrorState>&
AbstractConstructor<CanUpdateErrorState>;
/** @docs-private */
export interface HasErrorState {
_parentFormGroup: FormGroupDirective;
_parentForm: NgForm;
_defaultErrorStateMatcher: ErrorStateMatcher;
ngControl: NgControl;
}
/**
* Mixin to augment a directive with updateErrorState method.
* For component with `errorState` and need to update `errorState`.
*/
export function mixinErrorState<T extends AbstractConstructor<HasErrorState>>(
base: T,
): CanUpdateErrorStateCtor&T;
export function mixinErrorState<T extends Constructor<HasErrorState>>(
base: T,
): CanUpdateErrorStateCtor&T
{
return class extends base
{
// This class member exists as an interop with `TWNDFormFieldControl` which expects
// a public `stateChanges` observable to emit whenever the form field should be updated.
// The description is not specifically mentioning the error state, as classes using this
// mixin can/should emit an event in other cases too.
/** Emits whenever the component state changes. */
readonly stateChanges = new Subject<void>();
/** Whether the component is in an error state. */
errorState: boolean = false;
/** An object used to control the error state of the component. */
errorStateMatcher: ErrorStateMatcher;
/** Updates the error state based on the provided error state matcher. */
updateErrorState()
{
const oldState = this.errorState;
const parent = this._parentFormGroup || this._parentForm;
const matcher = this.errorStateMatcher || this._defaultErrorStateMatcher;
const control = this.ngControl ? (this.ngControl.control as FormControl) : null;
const newState = matcher.isErrorState(control, parent);
if (newState !== oldState) {
this.errorState = newState;
this.stateChanges.next();
}
}
constructor(...args: any[])
{
super(...args);
}
};
}