@encoreskytech/ng-char-limit-hint
Version:
To initialize the char limit feature on text input
115 lines • 16.1 kB
JavaScript
import { Component, ViewChild, Input, ViewEncapsulation } from '@angular/core';
export class CharLimitHintComponent {
constructor() {
this.maxCharLimit = 100;
this.format = "";
this.parentClass = "";
this.hintTextClass = "";
}
ngOnInit() {
this.remainingCharCount = this.maxCharLimit;
this.getFormattedResult();
}
ngAfterViewInit() {
if (this.content.nativeElement.hasChildNodes('input')) {
this.content.nativeElement.firstElementChild.addEventListener('paste', (event) => {
let clipboardText = event.clipboardData.getData('text');
if (clipboardText.length > this.remainingCharCount) {
event.target.value += clipboardText.substring(0, event.target.value.length > 0 ? this.remainingCharCount : this.maxCharLimit);
this.remainingCharCount = 0;
}
else {
event.target.value += clipboardText;
this.remainingCharCount = this.remainingCharCount - clipboardText.length;
}
this.getFormattedResult();
event.preventDefault();
});
this.content.nativeElement.firstElementChild.addEventListener('keydown', (event) => {
this.remainCount(event);
});
}
else {
throw "Valid input element not found.";
}
}
remainCount(event) {
if (!(event.getModifierState && (event.getModifierState('Control') || event.getModifierState('Meta')))) {
if (this.isValidKey(event.keyCode)) {
let text = event.target.value;
let charLength = parseInt(text.length);
let selection = event.target.selectionEnd - event.target.selectionStart;
if ((event.keyCode == 8 || event.keyCode == 127)) {
if (selection > 0) {
charLength = text.length - selection;
}
else if (text.length <= 0) {
charLength = 0;
}
else if (text.length >= 1) {
charLength = text.length - 1;
}
}
else if (selection > 0) {
event.target.value = text.substr(0, event.target.selectionStart) + String.fromCharCode(event.keyCode) + text.substr(event.target.selectionEnd);
charLength = event.target.value.length;
this.remainingCharCount = this.maxCharLimit - charLength;
this.getFormattedResult();
event.preventDefault();
event.target.setSelectionRange(event.target.selectionStart, event.target.selectionStart);
}
else if (text.length == this.maxCharLimit) {
event.preventDefault();
}
else if (text.length >= 0) {
charLength = text.length + 1;
}
this.remainingCharCount = this.maxCharLimit - charLength;
this.getFormattedResult();
}
}
}
getFormattedResult() {
var result = this.format;
if (this.format.length) {
result = result.replace("REMAIN", this.remainingCharCount.toString());
result = result.replace("TOTAL", this.maxCharLimit.toString());
this.formattedRemainCharCount = result;
}
else {
this.formattedRemainCharCount = this.remainingCharCount.toString();
}
}
isValidKey(keycode) {
var valid = (keycode > 47 && keycode < 58) || // number keys
keycode == 32 || keycode == 13 || // spacebar & return key(s) (if you want to allow carriage returns)
(keycode > 64 && keycode < 91) || // letter keys
(keycode > 95 && keycode < 112) || // numpad keys
(keycode > 185 && keycode < 193) || // ;=,-./` (in order)
(keycode > 218 && keycode < 223) ||
(keycode == 8) ||
(keycode == 127); // [\]' (in order)
return valid;
}
}
CharLimitHintComponent.decorators = [
{ type: Component, args: [{
selector: 'ng-char-limit-hint',
template: `
<div #content [ngClass]="parentClass">
<ng-content></ng-content>
<p [ngClass]="hintTextClass"> {{formattedRemainCharCount}}</p>
</div>
`,
encapsulation: ViewEncapsulation.None
},] }
];
CharLimitHintComponent.ctorParameters = () => [];
CharLimitHintComponent.propDecorators = {
content: [{ type: ViewChild, args: ['content', { static: false },] }],
maxCharLimit: [{ type: Input }],
format: [{ type: Input }],
parentClass: [{ type: Input }],
hintTextClass: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhci1saW1pdC1oaW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvYXBwbGUvRG9jdW1lbnRzL2VuY29yZXNreS9wcm9qZWN0cy9jaGFyLWxpbWl0LWhpbnQvc3JjLyIsInNvdXJjZXMiOlsibGliL2NoYXItbGltaXQtaGludC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQWMsS0FBSyxFQUFDLGlCQUFpQixFQUFpQixNQUFNLGVBQWUsQ0FBQztBQVlqSCxNQUFNLE9BQU8sc0JBQXNCO0lBVWpDO1FBUFMsaUJBQVksR0FBVyxHQUFHLENBQUM7UUFDM0IsV0FBTSxHQUFXLEVBQUUsQ0FBQTtRQUNuQixnQkFBVyxHQUFVLEVBQUUsQ0FBQztRQUN4QixrQkFBYSxHQUFVLEVBQUUsQ0FBQztJQUtsQyxDQUFDO0lBRUYsUUFBUTtRQUNOLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzVDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUM7WUFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQy9FLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN4RCxJQUFHLGFBQWEsQ0FBQyxNQUFNLEdBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFDO29CQUMvQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FB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RyxFQUFFLENBQUMsSUFBTSxjQUFjO1lBQ2xELENBQUMsT0FBTyxHQUFHLEVBQUUsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUssY0FBYztZQUNsRCxDQUFDLE9BQU8sR0FBRyxHQUFHLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLHFCQUFxQjtZQUN6RCxDQUFDLE9BQU8sR0FBRyxHQUFHLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQztZQUNoQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUM7WUFDZCxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFHLGtCQUFrQjtRQUMxQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7OztZQTlHRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtnQkFDOUIsUUFBUSxFQUFFOzs7OztHQUtUO2dCQUNELGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO2FBQ3RDOzs7O3NCQUdFLFNBQVMsU0FBQyxTQUFTLEVBQUUsRUFBQyxNQUFNLEVBQUcsS0FBSyxFQUFDOzJCQUNyQyxLQUFLO3FCQUNMLEtBQUs7MEJBQ0wsS0FBSzs0QkFDTCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQsVmlld0VuY2Fwc3VsYXRpb24sIEFmdGVyVmlld0luaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmctY2hhci1saW1pdC1oaW50JyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2ICNjb250ZW50IFtuZ0NsYXNzXT1cInBhcmVudENsYXNzXCI+XG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8cCBbbmdDbGFzc109XCJoaW50VGV4dENsYXNzXCI+IHt7Zm9ybWF0dGVkUmVtYWluQ2hhckNvdW50fX08L3A+XG4gICAgPC9kaXY+XG4gIGAsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgQ2hhckxpbWl0SGludENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgQFZpZXdDaGlsZCgnY29udGVudCcsIHtzdGF0aWMgOiBmYWxzZX0pIGNvbnRlbnQ6IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIG1heENoYXJMaW1pdDogbnVtYmVyID0gMTAwO1xuICBASW5wdXQoKSBmb3JtYXQ6IHN0cmluZyA9IFwiXCJcbiAgQElucHV0KCkgcGFyZW50Q2xhc3M6c3RyaW5nID0gXCJcIjtcbiAgQElucHV0KCkgaGludFRleHRDbGFzczpzdHJpbmcgPSBcIlwiO1xuICBmb3JtYXR0ZWRSZW1haW5DaGFyQ291bnQgOnN0cmluZyA7XG4gIHJlbWFpbmluZ0NoYXJDb3VudDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMucmVtYWluaW5nQ2hhckNvdW50ID0gdGhpcy5tYXhDaGFyTGltaXQ7XG4gICAgdGhpcy5nZXRGb3JtYXR0ZWRSZXN1bHQoKTtcbiAgfVxuICBuZ0FmdGVyVmlld0luaXQoKXtcbiAgICBpZih0aGlzLmNvbnRlbnQubmF0aXZlRWxlbWVudC5oYXNDaGlsZE5vZGVzKCdpbnB1dCcpKXtcbiAgICAgIHRoaXMuY29udGVudC5uYXRpdmVFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkLmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGxldCBjbGlwYm9hcmRUZXh0ID0gZXZlbnQuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCd0ZXh0Jyk7XG4gICAgICAgIGlmKGNsaXBib2FyZFRleHQubGVuZ3RoID50aGlzLnJlbWFpbmluZ0NoYXJDb3VudCl7XG4gICAgICAgICAgZXZlbnQudGFyZ2V0LnZhbHVlICs9IGNsaXBib2FyZFRleHQuc3Vic3RyaW5nKDAsZXZlbnQudGFyZ2V0LnZhbHVlLmxlbmd0aD4wID8gdGhpcy5yZW1haW5pbmdDaGFyQ291bnQ6IHRoaXMubWF4Q2hhckxpbWl0KTtcbiAgICAgICAgICB0aGlzLnJlbWFpbmluZ0NoYXJDb3VudCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZXtcbiAgICAgICAgICBldmVudC50YXJnZXQudmFsdWUgKz0gY2xpcGJvYXJkVGV4dDtcbiAgICAgICAgICB0aGlzLnJlbWFpbmluZ0NoYXJDb3VudCA9IHRoaXMucmVtYWluaW5nQ2hhckNvdW50IC0gY2xpcGJvYXJkVGV4dC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nZXRGb3JtYXR0ZWRSZXN1bHQoKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb250ZW50Lm5hdGl2ZUVsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudCkgPT4ge1xuICAgICAgICB0aGlzLnJlbWFpbkNvdW50KGV2ZW50KVxuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2V7XG4gICAgICB0aHJvdyBcIlZhbGlkIGlucHV0IGVsZW1lbnQgbm90IGZvdW5kLlwiXG4gICAgfVxuICB9XG4gIHJlbWFpbkNvdW50KGV2ZW50KXtcbiAgICBpZighKGV2ZW50LmdldE1vZGlmaWVyU3RhdGUgJiYgKGV2ZW50LmdldE1vZGlmaWVyU3RhdGUoJ0NvbnRyb2wnKXx8IGV2ZW50LmdldE1vZGlmaWVyU3RhdGUoJ01ldGEnKSkpKXtcbiAgICAgIGlmKHRoaXMuaXNWYWxpZEtleShldmVudC5rZXlDb2RlKSl7XG4gICAgICAgIGxldCB0ZXh0ID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xuICAgICAgICBsZXQgY2hhckxlbmd0aCA9IHBhcnNlSW50KHRleHQubGVuZ3RoKVxuICAgICAgICBsZXQgc2VsZWN0aW9uID0gZXZlbnQudGFyZ2V0LnNlbGVjdGlvbkVuZCAtIGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydFxuICAgICAgICBpZigoZXZlbnQua2V5Q29kZSA9PSA4IHx8IGV2ZW50LmtleUNvZGUgPT0gMTI3KSkge1xuICAgICAgICAgIGlmKHNlbGVjdGlvbiA+MCl7XG4gICAgICAgICAgICBjaGFyTGVuZ3RoID0gdGV4dC5sZW5ndGggLSBzZWxlY3Rpb247XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYgKHRleHQubGVuZ3RoPD0wKXtcbiAgICAgICAgICAgIGNoYXJMZW5ndGggPTA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2UgaWYodGV4dC5sZW5ndGg+PTEpIHtcbiAgICAgICAgICAgIGNoYXJMZW5ndGggPSB0ZXh0Lmxlbmd0aCAtMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZihzZWxlY3Rpb24gPjApe1xuICAgICAgICAgIGV2ZW50LnRhcmdldC52YWx1ZSA9IHRleHQuc3Vic3RyKDAsIGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCkgK1N0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQua2V5Q29kZSkrIHRleHQuc3Vic3RyKGV2ZW50LnRhcmdldC5zZWxlY3Rpb25FbmQpO1xuICAgICAgICAgIGNoYXJMZW5ndGggPSBldmVudC50YXJnZXQudmFsdWUubGVuZ3RoO1xuICAgICAgICAgIHRoaXMucmVtYWluaW5nQ2hhckNvdW50ID0gdGhpcy5tYXhDaGFyTGltaXQgLSBjaGFyTGVuZ3RoO1xuICAgICAgICAgIHRoaXMuZ2V0Rm9ybWF0dGVkUmVzdWx0KCk7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC50YXJnZXQuc2V0U2VsZWN0aW9uUmFuZ2UoZXZlbnQudGFyZ2V0LnNlbGVjdGlvblN0YXJ0LGV2ZW50LnRhcmdldC5zZWxlY3Rpb25TdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZih0ZXh0Lmxlbmd0aCA9PSB0aGlzLm1heENoYXJMaW1pdCl7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmKHRleHQubGVuZ3RoPj0wKSB7XG4gICAgICAgICAgY2hhckxlbmd0aCA9IHRleHQubGVuZ3RoICsxO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVtYWluaW5nQ2hhckNvdW50ID0gdGhpcy5tYXhDaGFyTGltaXQgLSBjaGFyTGVuZ3RoO1xuICAgICAgICB0aGlzLmdldEZvcm1hdHRlZFJlc3VsdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldEZvcm1hdHRlZFJlc3VsdCgpIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5mb3JtYXQ7XG4gICAgaWYodGhpcy5mb3JtYXQubGVuZ3RoKXtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFwiUkVNQUlOXCIsdGhpcy5yZW1haW5pbmdDaGFyQ291bnQudG9TdHJpbmcoKSlcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFwiVE9UQUxcIiwgdGhpcy5tYXhDaGFyTGltaXQudG9TdHJpbmcoKSlcbiAgICAgIHRoaXMuZm9ybWF0dGVkUmVtYWluQ2hhckNvdW50ID0gIHJlc3VsdDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmZvcm1hdHRlZFJlbWFpbkNoYXJDb3VudCA9IHRoaXMucmVtYWluaW5nQ2hhckNvdW50LnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgaXNWYWxpZEtleShrZXljb2RlKXtcbiAgICB2YXIgdmFsaWQgPSBcbiAgICAgICAgKGtleWNvZGUgPiA0NyAmJiBrZXljb2RlIDwgNTgpICAgfHwgLy8gbnVtYmVyIGtleXNcbiAgICAgICAga2V5Y29kZSA9PSAzMiB8fCBrZXljb2RlID09IDEzICAgfHwgLy8gc3BhY2ViYXIgJiByZXR1cm4ga2V5KHMpIChpZiB5b3Ugd2FudCB0byBhbGxvdyBjYXJyaWFnZSByZXR1cm5zKVxuICAgICAgICAoa2V5Y29kZSA+IDY0ICYmIGtleWNvZGUgPCA5MSkgICB8fCAvLyBsZXR0ZXIga2V5c1xuICAgICAgICAoa2V5Y29kZSA+IDk1ICYmIGtleWNvZGUgPCAxMTIpICB8fCAvLyBudW1wYWQga2V5c1xuICAgICAgICAoa2V5Y29kZSA+IDE4NSAmJiBrZXljb2RlIDwgMTkzKSB8fCAvLyA7PSwtLi9gIChpbiBvcmRlcilcbiAgICAgICAgKGtleWNvZGUgPiAyMTggJiYga2V5Y29kZSA8IDIyMykgfHxcbiAgICAgICAgKGtleWNvZGUgPT0gOCkgfHwgXG4gICAgICAgIChrZXljb2RlID09IDEyNyk7ICAgLy8gW1xcXScgKGluIG9yZGVyKVxuICAgIHJldHVybiB2YWxpZDtcbiAgfVxuXG59XG4iXX0=