@tangential/input-widgets
Version:
Input Widgets with persistable, dynamic configuration.
161 lines (159 loc) • 18 kB
JavaScript
import { ChangeDetectorRef, Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Hacks } from '@tangential/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "@angular/material/form-field";
import * as i4 from "@angular/material/input";
import * as i5 from "./slide-toggle-widget.component";
/**
* Provider Expression that allows IconRatingWidget to register as a ControlValueAccessor.
* This allows it to support [(ngModel)].
* @docs-private
*/
export const TANJ_SLIDE_TOGGLE_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => SlideToggleWidgetConfigureComponent),
multi: true
};
export class SlideToggleWidgetConfigureChange {
constructor(source, value) {
this.source = source;
this.value = value;
}
}
export class SlideToggleWidgetConfigureComponent {
constructor(changeDetectorRef) {
this.changeDetectorRef = changeDetectorRef;
this.flex = '';
this.flexLayout = 'column';
this.flexLayoutAlign = 'start';
this.value = false;
this.valueChange = new EventEmitter(false);
this.labelPosition = 'before';
this.disabled = false;
/**
* Configuration Fields
*/
this.label = '';
this.defaultValue = false;
this.labelChange = new EventEmitter(false);
this.defaultValueChange = new EventEmitter(false);
/* end Configuration Fields */
this.change = new EventEmitter(false);
/**
* Called when the spinner is blurred. Needed to properly implement ControlValueAccessor.
* @docs-private
*/
this.onTouched = () => { };
this.controlValueAccessorChangeFn = (value) => { };
}
ngOnInit() {
Hacks.materialDesignPlaceholderText(this.changeDetectorRef);
}
ngOnChanges(changes) {
}
emitChangeEvent(value, label) {
this.controlValueAccessorChangeFn(this.value);
this.change.emit(new SlideToggleWidgetConfigureChange(this, this.value));
if (value) {
this.valueChange.emit(this.value);
this.defaultValueChange.emit(this.defaultValue);
}
if (label) {
this.labelChange.emit(this.label);
}
}
/**
* Boilerplate / required for Angular
*
*/
writeValue(value) {
this.value = value;
}
registerOnChange(fn) {
this.controlValueAccessorChangeFn = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* Sets the input's disabled state. Implemented as a part of ControlValueAccessor.
* @param isDisabled Whether the input should be disabled.
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
}
SlideToggleWidgetConfigureComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: SlideToggleWidgetConfigureComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
SlideToggleWidgetConfigureComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.10", type: SlideToggleWidgetConfigureComponent, selector: "tanj-slide-toggle-widget-configure", inputs: { value: "value", labelPosition: "labelPosition", disabled: "disabled", label: "label", defaultValue: "defaultValue" }, outputs: { valueChange: "valueChange", labelChange: "labelChange", defaultValueChange: "defaultValueChange", change: "change" }, host: { properties: { "attr.flex": "this.flex", "attr.layout": "this.flexLayout", "attr.layout-align": "this.flexLayoutAlign" } }, providers: [TANJ_SLIDE_TOGGLE_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR], usesOnChanges: true, ngImport: i0, template: `<!-- -->
<div class="tanj-input-template tanj-mode-configure" flex layout="column" layout-align="start">
<mat-form-field dividerColor="accent">
<input matInput class="tanj-input" type="text" maxlength="50" placeholder="Enter a label for this input"
(change)="emitChangeEvent(false, true)"
[(ngModel)]="label"/>
</mat-form-field>
<ng-container *ngIf="label">
<tanj-slide-toggle-widget [(value)]="defaultValue"
(valueChange)="value = defaultValue; emitChangeEvent(true, false)"
[defaultValue]="defaultValue"
label="Default Value"
[labelPosition]="'before'">
</tanj-slide-toggle-widget>
</ng-container>
</div>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i5.SlideToggleWidgetComponent, selector: "tanj-slide-toggle-widget", inputs: ["value", "labelPosition", "disabled", "hideLabel", "onlyLabel", "label", "defaultValue"], outputs: ["valueChange", "change"] }], encapsulation: i0.ViewEncapsulation.None });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.10", ngImport: i0, type: SlideToggleWidgetConfigureComponent, decorators: [{
type: Component,
args: [{
selector: 'tanj-slide-toggle-widget-configure',
template: `<!-- -->
<div class="tanj-input-template tanj-mode-configure" flex layout="column" layout-align="start">
<mat-form-field dividerColor="accent">
<input matInput class="tanj-input" type="text" maxlength="50" placeholder="Enter a label for this input"
(change)="emitChangeEvent(false, true)"
[(ngModel)]="label"/>
</mat-form-field>
<ng-container *ngIf="label">
<tanj-slide-toggle-widget [(value)]="defaultValue"
(valueChange)="value = defaultValue; emitChangeEvent(true, false)"
[defaultValue]="defaultValue"
label="Default Value"
[labelPosition]="'before'">
</tanj-slide-toggle-widget>
</ng-container>
</div>
`,
providers: [TANJ_SLIDE_TOGGLE_WIDGET_CONFIG_CONTROL_VALUE_ACCESSOR],
encapsulation: ViewEncapsulation.None
}]
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { flex: [{
type: HostBinding,
args: ['attr.flex']
}], flexLayout: [{
type: HostBinding,
args: ['attr.layout']
}], flexLayoutAlign: [{
type: HostBinding,
args: ['attr.layout-align']
}], value: [{
type: Input
}], valueChange: [{
type: Output
}], labelPosition: [{
type: Input
}], disabled: [{
type: Input
}], label: [{
type: Input
}], defaultValue: [{
type: Input
}], labelChange: [{
type: Output
}], defaultValueChange: [{
type: Output
}], change: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpZGUtdG9nZ2xlLXdpZGdldC1jb25maWd1cmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdGFuZ2VudGlhbC9pbnB1dC13aWRnZXRzL3NyYy9saWIvc2xpZGUtdG9nZ2xlLXdpZGdldC9zbGlkZS10b2dnbGUtd2lkZ2V0LWNvbmZpZ3VyZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUdMLE1BQU0sRUFFTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUF1QixpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFBO0FBQ3RFLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTs7Ozs7OztBQUd0Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0RBQXNELEdBQVE7SUFDekUsT0FBTyxFQUFNLGlCQUFpQjtJQUM5QixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1DQUFtQyxDQUFDO0lBQ2xFLEtBQUssRUFBUSxJQUFJO0NBQ2xCLENBQUM7QUFFRixNQUFNLE9BQU8sZ0NBQWdDO0lBQzNDLFlBQW1CLE1BQTJDLEVBQVMsS0FBYztRQUFsRSxXQUFNLEdBQU4sTUFBTSxDQUFxQztRQUFTLFVBQUssR0FBTCxLQUFLLENBQVM7SUFDckYsQ0FBQztDQUNGO0FBMEJELE1BQU0sT0FBTyxtQ0FBbUM7SUFnQzlDLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBOUI5QixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1IsZUFBVSxHQUFHLFFBQVEsQ0FBQztRQUNoQixvQkFBZSxHQUFHLE9BQU8sQ0FBQztRQUVuRCxVQUFLLEdBQVksS0FBSyxD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a0JBQWtCO3NCQUEzQixNQUFNO2dCQUdHLE1BQU07c0JBQWYsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBTaW1wbGVDaGFuZ2UsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQge0hhY2tzfSBmcm9tICdAdGFuZ2VudGlhbC9jb3JlJ1xuXG5cbi8qKlxuICogUHJvdmlkZXIgRXhwcmVzc2lvbiB0aGF0IGFsbG93cyBJY29uUmF0aW5nV2lkZ2V0IHRvIHJlZ2lzdGVyIGFzIGEgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gKiBUaGlzIGFsbG93cyBpdCB0byBzdXBwb3J0IFsobmdNb2RlbCldLlxuICogQGRvY3MtcHJpdmF0ZVxuICovXG5leHBvcnQgY29uc3QgVEFOSl9TTElERV9UT0dHTEVfV0lER0VUX0NPTkZJR19DT05UUk9MX1ZBTFVFX0FDQ0VTU09SOiBhbnkgPSB7XG4gIHByb3ZpZGU6ICAgICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gU2xpZGVUb2dnbGVXaWRnZXRDb25maWd1cmVDb21wb25lbnQpLFxuICBtdWx0aTogICAgICAgdHJ1ZVxufTtcblxuZXhwb3J0IGNsYXNzIFNsaWRlVG9nZ2xlV2lkZ2V0Q29uZmlndXJlQ2hhbmdlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHNvdXJjZTogU2xpZGVUb2dnbGVXaWRnZXRDb25maWd1cmVDb21wb25lbnQsIHB1YmxpYyB2YWx1ZTogYm9vbGVhbikge1xuICB9XG59XG5cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAgICAgICd0YW5qLXNsaWRlLXRvZ2dsZS13aWRnZXQtY29uZmlndXJlJyxcbiAgdGVtcGxhdGU6ICAgICAgYDwhLS0gLS0+XG4gIDxkaXYgY2xhc3M9XCJ0YW5qLWlucHV0LXRlbXBsYXRlIHRhbmotbW9kZS1jb25maWd1cmVcIiBmbGV4IGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cInN0YXJ0XCI+XG4gICAgPG1hdC1mb3JtLWZpZWxkIGRpdmlkZXJDb2xvcj1cImFjY2VudFwiPlxuICAgICAgPGlucHV0IG1hdElucHV0IGNsYXNzPVwidGFuai1pbnB1dFwiIHR5cGU9XCJ0ZXh0XCIgbWF4bGVuZ3RoPVwiNTBcIiBwbGFjZWhvbGRlcj1cIkVudGVyIGEgbGFiZWwgZm9yIHRoaXMgaW5wdXRcIlxuICAgICAgICAgICAgIChjaGFuZ2UpPVwiZW1pdENoYW5nZUV2ZW50KGZhbHNlLCB0cnVlKVwiXG4gICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJsYWJlbFwiLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYWJlbFwiPlxuICAgICAgPHRhbmotc2xpZGUtdG9nZ2xlLXdpZGdldCBbKHZhbHVlKV09XCJkZWZhdWx0VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJ2YWx1ZSA9IGRlZmF1bHRWYWx1ZTsgZW1pdENoYW5nZUV2ZW50KHRydWUsIGZhbHNlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHRWYWx1ZV09XCJkZWZhdWx0VmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPVwiRGVmYXVsdCBWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsUG9zaXRpb25dPVwiJ2JlZm9yZSdcIj5cblxuICAgICAgPC90YW5qLXNsaWRlLXRvZ2dsZS13aWRnZXQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvZGl2PlxuICAgICAgICAgICAgICAgICBgLFxuICBwcm92aWRlcnM6ICAgICBbVEFOSl9TTElERV9UT0dHTEVfV0lER0VUX0NPTkZJR19DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBTbGlkZVRvZ2dsZVdpZGdldENvbmZpZ3VyZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmZsZXgnKSBmbGV4ID0gJyc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQnKSBmbGV4TGF5b3V0ID0gJ2NvbHVtbic7XG4gIEBIb3N0QmluZGluZygnYXR0ci5sYXlvdXQtYWxpZ24nKSBmbGV4TGF5b3V0QWxpZ24gPSAnc3RhcnQnO1xuXG4gIEBJbnB1dCgpIHZhbHVlOiBib29sZWFuID0gZmFsc2VcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246ICdiZWZvcmUnIHwgJ2FmdGVyJyB8ICdiZWxvdycgPSAnYmVmb3JlJ1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gRmllbGRzXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJydcbiAgQElucHV0KCkgZGVmYXVsdFZhbHVlOiBib29sZWFuID0gZmFsc2VcblxuXG4gIEBPdXRwdXQoKSBsYWJlbENoYW5nZTogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuICBAT3V0cHV0KCkgZGVmYXVsdFZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4gPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKVxuICAvKiBlbmQgQ29uZmlndXJhdGlvbiBGaWVsZHMgKi9cblxuICBAT3V0cHV0KCkgY2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpXG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBzcGlubmVyIGlzIGJsdXJyZWQuIE5lZWRlZCB0byBwcm9wZXJseSBpbXBsZW1lbnQgQ29udHJvbFZhbHVlQWNjZXNzb3IuXG4gICAqIEBkb2NzLXByaXZhdGVcbiAgICovXG4gIG9uVG91Y2hlZDogKCkgPT4gYW55ID0gKCkgPT4geyB9O1xuICBwcml2YXRlIGNvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm46ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKHZhbHVlKSA9PiB7IH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIEhhY2tzLm1hdGVyaWFsRGVzaWduUGxhY2Vob2xkZXJUZXh0KHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYpXG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7IGNvbmZpZzogU2ltcGxlQ2hhbmdlLCBpdmFsOiBTaW1wbGVDaGFuZ2UgfSkge1xuICB9XG5cbiAgZW1pdENoYW5nZUV2ZW50KHZhbHVlOiBib29sZWFuLCBsYWJlbDogYm9vbGVhbikge1xuICAgIHRoaXMuY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKTtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KG5ldyBTbGlkZVRvZ2dsZVdpZGdldENvbmZpZ3VyZUNoYW5nZSh0aGlzLCB0aGlzLnZhbHVlKSlcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMuZGVmYXVsdFZhbHVlQ2hhbmdlLmVtaXQodGhpcy5kZWZhdWx0VmFsdWUpXG4gICAgfVxuICAgIGlmIChsYWJlbCkge1xuICAgICAgdGhpcy5sYWJlbENoYW5nZS5lbWl0KHRoaXMubGFiZWwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJvaWxlcnBsYXRlIC8gcmVxdWlyZWQgZm9yIEFuZ3VsYXJcbiAgICpcbiAgICovXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlXG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuID0gZm47XG4gIH1cblxuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgaW5wdXQncyBkaXNhYmxlZCBzdGF0ZS4gSW1wbGVtZW50ZWQgYXMgYSBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLlxuICAgKiBAcGFyYW0gaXNEaXNhYmxlZCBXaGV0aGVyIHRoZSBpbnB1dCBzaG91bGQgYmUgZGlzYWJsZWQuXG4gICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxufVxuIl19