@pepperi/components
Version:
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 10.0.1.
211 lines (184 loc) • 7.08 kB
text/typescript
import { Component, OnInit, OnChanges, Input, Output, EventEmitter,
ChangeDetectionStrategy, ElementRef, ViewChild, Renderer2, OnDestroy } from '@angular/core';
import { FormGroup, FormBuilder } from '@angular/forms';
import { SessionService, LAYOUT_TYPE, CustomizationService } from '@pepperi/lib';
export class PepperiTextboxComponent implements OnChanges, OnInit, OnDestroy {
key = '';
value = '';
formattedValue = '';
label = '';
placeholder = '';
type = 'text';
required = false;
disabled = false;
readonly = false;
maxFieldCharacters: number;
textColor = '';
xAlignment = '0';
rowSpan = 1;
lastFocusField: any;
controlType = 'textbox';
form: FormGroup = null;
isActive = false;
showTitle = true;
layoutType: LAYOUT_TYPE = LAYOUT_TYPE.PepperiForm;
parentField: any = null;
valueChanged: EventEmitter<any> = new EventEmitter<any>();
formValidationChanged: EventEmitter<boolean> = new EventEmitter<boolean>();
input: ElementRef;
LAYOUT_TYPE = LAYOUT_TYPE;
standAlone = false;
isInEditMode = false;
isFocus = false;
constructor(
public sessionService: SessionService,
private customizationService: CustomizationService,
public fb: FormBuilder,
private renderer: Renderer2,
public _eref: ElementRef
) { }
ngOnInit() {
if (this.form === null) {
this.standAlone = true;
this.form = this.customizationService
.getDefaultFromGroup(this.key, this.value, this.required, this.readonly, this.disabled, this.maxFieldCharacters, this.type);
this.formattedValue = this.formattedValue || this.value;
this.renderer.addClass(this._eref.nativeElement, CustomizationService.STAND_ALONE_FIELD_CLASS_NAME);
}
this.readonly = this.type === 'duration' ? true : this.readonly; // Hack until we develop Timer UI for editing Duration field
}
ngOnChanges(changes: any) {
this.readonly = this.type === 'duration' ? true : this.readonly; // Hack until we develop Timer UI for editing Duration field
const self = this;
setTimeout(() => {
if (self.lastFocusField) {
self.lastFocusField.focus();
self.lastFocusField = null;
} else {
}
}, 100);
}
ngOnDestroy() {
if (this.valueChanged) {
this.valueChanged.unsubscribe();
}
if (this.formValidationChanged) {
this.formValidationChanged.unsubscribe();
}
}
onFocus(e: any) {
this.isFocus = true;
}
onBlur(e: any) {
this.isFocus = false;
const value = e.target ? e.target.value : e;
if (value !== this.value) {
this.formattedValue = this.value = value;
// There is formControl.setValue in the onKeyUp so we don't need it here.
// this.propagateChange(value, e.relatedTarget);
this.valueChanged.emit({
apiName: this.key,
value,
lastFocusedField: e.relatedTarget
});
// return true; // What this is for? Tomer.p comment this in 16.4.
}
if (this.isInEditMode) {
this.isInEditMode = false;
}
}
onKeyUp(event: any) {
const value = event.target ? event.target.value : event;
this.customizationService.updateFormFieldValue(this.form, this.key, value, this.parentField);
this.formValidationChanged.emit(this.form.valid);
}
onKeyPress(event: any) {
let inputChar = String.fromCharCode(event.charCode);
const e = event as KeyboardEvent;
if (
[8, 9, 13, 27, 190].indexOf(e.which) !== -1 ||
// Allow: Ctrl+A
(e.which === 65 && e.ctrlKey === true) ||
// Allow: Ctrl+C
(e.which === 67 && e.ctrlKey === true) ||
// Allow: Ctrl+V
(e.which === 86 && e.ctrlKey === true) ||
// Allow: Ctrl+X
(e.which === 88 && e.ctrlKey === true) /*||
// Allow: home, end, left, right
(e.which >= 35 && e.which <= 39)*/
) {
// let it happen, don't do anything
return true;
}
switch (this.type) {
case 'int': {
const pattern = /[0-9\+\-\ ]/;
if (!pattern.test(inputChar)) {
e.preventDefault();
}
break;
}
case 'currency':
case 'real': {
const decPoint = '.';
const thousandSeparator = ',';
const pattern = /^\d+(\.\d{1,9})?$/;
if (e.which === 46) {
inputChar = inputChar + '0';
} else if (e.which === 44) {
inputChar = inputChar + '000';
}
if (!pattern.test(event.target.value + inputChar)) {
e.preventDefault();
}
break;
}
case 'phone': {
const pattern = /^[\d\.\-\+\(\)\*\#]+$/;
if (!pattern.test(event.target.value + inputChar)) {
e.preventDefault();
}
break;
}
case 'text': {
// if (this.maxFieldCharacters !== 0 && event.target.value.length >= this.maxFieldCharacters) {
// e.preventDefault();
// }
break;
}
}
}
anchorClicked() {
const currentValue = this.value;
if (currentValue.trim().length > 0) {
switch (this.type) {
case 'email':
window.open('mailto:' + currentValue, 'email');
break;
case 'phone':
window.open('tel:' + currentValue, 'tel');
break;
case 'link':
window.open(currentValue);
break;
default:
break;
}
}
}
cardTemplateClicked(event: any) {
const self = this;
this.isInEditMode = true;
setTimeout(() => {
self.input.nativeElement.focus();
}, 0);
}
}