ngx-trim-directive
Version:
This directive helps to trim whitespaces of an input text value.
135 lines • 16.8 kB
JavaScript
import { Directive, HostListener, Input, Optional } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
export class NgxTrimDirective {
set trim(trimOption) {
if (trimOption !== '' && trimOption !== 'blur' && trimOption !== false) {
console.warn(`Note: The value ${JSON.stringify(trimOption)} is not assignable to the trim attribute.
Only blank string (""), "blur" or false is allowed.`);
this._trim = false;
return;
}
this._trim = trimOption;
setTimeout(// fix the `Expression has changed after it was checked` error
() => {
const elem = this.elementRef.nativeElement;
const eleValue = elem.value;
if (trimOption !== false && eleValue !== eleValue.trim()) {
// initially trim the value if needed
NgxTrimDirective.dispatchEvent(elem, 'blur');
}
});
}
get trim() {
return this._trim;
}
constructor(elementRef, ngControl) {
this.elementRef = elementRef;
this.ngControl = ngControl;
this._trim = '';
this.trimOnWriteValue = true;
this._valueAccessor = null;
this._writeValue = null;
}
static getCaret(el) {
return {
start: el.selectionStart,
end: el.selectionEnd,
};
}
static setCaret(el, start, end) {
el.selectionStart = start;
el.selectionEnd = end;
el.focus();
}
static dispatchEvent(el, eventType) {
const event = new Event(eventType);
el.dispatchEvent(event);
}
static TrimOption(el, value) {
el.value = value.trim();
NgxTrimDirective.dispatchEvent(el, 'input');
}
ngOnInit() {
if (!this.ngControl) {
console.warn('Note: The trim directive should be used with one of ngModel, formControl or formControlName directives.');
return;
}
this._valueAccessor = this.ngControl.valueAccessor;
if (this._valueAccessor) {
this._writeValue = this._valueAccessor.writeValue;
this._valueAccessor.writeValue = (value) => {
const _value = this.trim === false || !value || 'function' !== typeof value.trim || !this.trimOnWriteValue
? value
: value.trim();
if (this._writeValue) {
this._writeValue.call(this._valueAccessor, _value);
}
if (value !== _value) {
if (this._valueAccessor['onChange']) {
this._valueAccessor['onChange'](_value);
}
if (this._valueAccessor['onTouched']) {
this._valueAccessor['onTouched']();
}
}
};
}
}
ngOnDestroy() {
if (this._valueAccessor && this._writeValue) {
this._valueAccessor.writeValue = this._writeValue;
}
}
onBlur(el, value) {
if (this.trim === false) {
return;
}
if ((this.trim === '' || 'blur' === this.trim) && 'function' === typeof value.trim && value.trim() !== value) {
NgxTrimDirective.TrimOption(el, value);
NgxTrimDirective.dispatchEvent(el, 'blur'); // in case updateOn is set to blur
}
}
onInput(el, value) {
if (this.trim === false) {
return;
}
if (this.trim === '' && 'function' === typeof value.trim && value.trim() !== value) {
let { start, end } = NgxTrimDirective.getCaret(el);
if (value[0] === ' ' && start === 1 && end === 1) {
start = 0;
end = 0;
}
NgxTrimDirective.TrimOption(el, value);
NgxTrimDirective.setCaret(el, start, end);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: NgxTrimDirective, deps: [{ token: i0.ElementRef }, { token: i1.NgControl, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.1.2", type: NgxTrimDirective, selector: "input[trim],textarea[trim]", inputs: { trim: "trim", trimOnWriteValue: "trimOnWriteValue" }, host: { listeners: { "blur": "onBlur($event.target,$event.target.value)", "input": "onInput($event.target,$event.target.value)" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.2", ngImport: i0, type: NgxTrimDirective, decorators: [{
type: Directive,
args: [{
selector: 'input[trim],textarea[trim]',
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.NgControl, decorators: [{
type: Optional
}] }]; }, propDecorators: { trim: [{
type: Input,
args: ['trim']
}], trimOnWriteValue: [{
type: Input
}], onBlur: [{
type: HostListener,
args: ['blur', [
'$event.target',
'$event.target.value',
]]
}], onInput: [{
type: HostListener,
args: ['input', [
'$event.target',
'$event.target.value',
]]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRyaW0uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRyaW0tZGlyZWN0aXZlL3NyYy9saWIvbmd4LXRyaW0uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBcUIsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFNeEcsTUFBTSxPQUFPLGdCQUFnQjtJQUczQixJQUNXLElBQUksQ0FBQyxVQUFzQjtRQUNwQyxJQUFJLFVBQVUsS0FBSyxFQUFFLElBQUksVUFBVSxLQUFLLE1BQU0sSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO1lBQ3RFLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDOzREQUNKLENBQUMsQ0FBQztZQUV4RCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztRQUV4QixVQUFVLENBQUUsOERBQThEO1FBRXhFLEdBQUcsRUFBRTtZQUVILE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBRTNDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFFNUIsSUFBSSxVQUFVLEtBQUssS0FBSyxJQUFJLFFBQVEsS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBRXhELHFDQUFxQztnQkFDckMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQzthQUM5QztRQUVILENBQUMsQ0FFRixDQUFDO0lBQ0osQ0FBQztJQUVELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBT0QsWUFDVSxVQUFzQixF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LENBQUM7OEdBckxVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCOzsyRkFBaEIsZ0JBQWdCO2tCQUg1QixTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSw0QkFBNEI7aUJBQ3ZDOzswQkE4Q0ksUUFBUTs0Q0F6Q0EsSUFBSTtzQkFEZCxLQUFLO3VCQUFDLE1BQU07Z0JBbUNKLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFrR04sTUFBTTtzQkFKTCxZQUFZO3VCQUFDLE1BQU0sRUFBRTt3QkFDcEIsZUFBZTt3QkFDZixxQkFBcUI7cUJBQ3RCO2dCQXFCRCxPQUFPO3NCQUpOLFlBQVk7dUJBQUMsT0FBTyxFQUFFO3dCQUNyQixlQUFlO3dCQUNmLHFCQUFxQjtxQkFDdEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnaW5wdXRbdHJpbV0sdGV4dGFyZWFbdHJpbV0nLFxufSlcbmV4cG9ydCBjbGFzcyBOZ3hUcmltRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIHByaXZhdGUgX3RyaW06IFRyaW1PcHRpb24gPSAnJztcbiAgQElucHV0KCd0cmltJylcbiAgcHVibGljIHNldCB0cmltKHRyaW1PcHRpb246IFRyaW1PcHRpb24pIHtcbiAgICBpZiAodHJpbU9wdGlvbiAhPT0gJycgJiYgdHJpbU9wdGlvbiAhPT0gJ2JsdXInICYmIHRyaW1PcHRpb24gIT09IGZhbHNlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYE5vdGU6IFRoZSB2YWx1ZSAke0pTT04uc3RyaW5naWZ5KHRyaW1PcHRpb24pfSBpcyBub3QgYXNzaWduYWJsZSB0byB0aGUgdHJpbSBhdHRyaWJ1dGUuXG4gICAgICAgIE9ubHkgYmxhbmsgc3RyaW5nIChcIlwiKSwgXCJibHVyXCIgb3IgZmFsc2UgaXMgYWxsb3dlZC5gKTtcblxuICAgICAgdGhpcy5fdHJpbSA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3RyaW0gPSB0cmltT3B0aW9uO1xuXG4gICAgc2V0VGltZW91dCggLy8gZml4IHRoZSBgRXhwcmVzc2lvbiBoYXMgY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZGAgZXJyb3JcblxuICAgICAgKCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICBjb25zdCBlbGVWYWx1ZSA9IGVsZW0udmFsdWU7XG5cbiAgICAgICAgaWYgKHRyaW1PcHRpb24gIT09IGZhbHNlICYmIGVsZVZhbHVlICE9PSBlbGVWYWx1ZS50cmltKCkpIHtcblxuICAgICAgICAgIC8vIGluaXRpYWxseSB0cmltIHRoZSB2YWx1ZSBpZiBuZWVkZWRcbiAgICAgICAgICBOZ3hUcmltRGlyZWN0aXZlLmRpc3BhdGNoRXZlbnQoZWxlbSwgJ2JsdXInKTtcbiAgICAgICAgfVxuXG4gICAgICB9LFxuXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHJpbSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdHJpbTtcbiAgfVxuXG4gIEBJbnB1dCgpIHRyaW1PbldyaXRlVmFsdWUgPSB0cnVlO1xuXG4gIHByaXZhdGUgX3ZhbHVlQWNjZXNzb3I6IENvbnRyb2xWYWx1ZUFjY2Vzc29yIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3dyaXRlVmFsdWU6ICgodmFsdWU6IGFueSkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcbiAgKSB7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRDYXJldChlbDogVHJpbUVsZW1lbnQpIHtcblxuICAgIHJldHVybiB7XG4gICAgICBzdGFydDogZWwuc2VsZWN0aW9uU3RhcnQsXG4gICAgICBlbmQ6IGVsLnNlbGVjdGlvbkVuZCxcbiAgICB9O1xuXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzZXRDYXJldChlbDogVHJpbUVsZW1lbnQsIHN0YXJ0OiBudW1iZXIgfCBudWxsLCBlbmQ6IG51bWJlciB8IG51bGwpIHtcblxuICAgIGVsLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7XG4gICAgZWwuc2VsZWN0aW9uRW5kID0gZW5kO1xuXG4gICAgZWwuZm9jdXMoKTtcblxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZGlzcGF0Y2hFdmVudChlbDogVHJpbUVsZW1lbnQsIGV2ZW50VHlwZTogc3RyaW5nKSB7XG5cbiAgICBjb25zdCBldmVudCA9IG5ldyBFdmVudChldmVudFR5cGUpO1xuICAgIGVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBUcmltT3B0aW9uKGVsOiBUcmltRWxlbWVudCwgdmFsdWU6IHN0cmluZykge1xuXG4gICAgZWwudmFsdWUgPSB2YWx1ZS50cmltKCk7XG5cbiAgICBOZ3hUcmltRGlyZWN0aXZlLmRpc3BhdGNoRXZlbnQoZWwsICdpbnB1dCcpO1xuXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuICAgIGlmICghdGhpcy5uZ0NvbnRyb2wpIHtcblxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAnTm90ZTogVGhlIHRyaW0gZGlyZWN0aXZlIHNob3VsZCBiZSB1c2VkIHdpdGggb25lIG9mIG5nTW9kZWwsIGZvcm1Db250cm9sIG9yIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmVzLicpO1xuXG4gICAgICByZXR1cm47XG5cbiAgICB9XG5cbiAgICB0aGlzLl92YWx1ZUFjY2Vzc29yID0gdGhpcy5uZ0NvbnRyb2wudmFsdWVBY2Nlc3NvcjtcblxuICAgIGlmICh0aGlzLl92YWx1ZUFjY2Vzc29yKSB7XG4gICAgICB0aGlzLl93cml0ZVZhbHVlID0gdGhpcy5fdmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlO1xuICAgICAgdGhpcy5fdmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IF92YWx1ZSA9XG4gICAgICAgICAgdGhpcy50cmltID09PSBmYWxzZSB8fCAhdmFsdWUgfHwgJ2Z1bmN0aW9uJyAhPT0gdHlwZW9mIHZhbHVlLnRyaW0gfHwgIXRoaXMudHJpbU9uV3JpdGVWYWx1ZVxuICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgOiB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuX3dyaXRlVmFsdWUpIHtcbiAgICAgICAgICB0aGlzLl93cml0ZVZhbHVlLmNhbGwodGhpcy5fdmFsdWVBY2Nlc3NvciwgX3ZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gX3ZhbHVlKSB7XG4gICAgICAgICAgaWYgKCh0aGlzLl92YWx1ZUFjY2Vzc29yIGFzIGFueSlbJ29uQ2hhbmdlJ10pIHtcbiAgICAgICAgICAgICh0aGlzLl92YWx1ZUFjY2Vzc29yIGFzIGFueSlbJ29uQ2hhbmdlJ10oX3ZhbHVlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoKHRoaXMuX3ZhbHVlQWNjZXNzb3IgYXMgYW55KVsnb25Ub3VjaGVkJ10pIHtcbiAgICAgICAgICAgICh0aGlzLl92YWx1ZUFjY2Vzc29yIGFzIGFueSlbJ29uVG91Y2hlZCddKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH07XG4gICAgfVxuXG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLl92YWx1ZUFjY2Vzc29yICYmIHRoaXMuX3dyaXRlVmFsdWUpIHtcblxuICAgICAgdGhpcy5fdmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlID0gdGhpcy5fd3JpdGVWYWx1ZTtcblxuICAgIH1cblxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFtcbiAgICAnJGV2ZW50LnRhcmdldCcsXG4gICAgJyRldmVudC50YXJnZXQudmFsdWUnLFxuICBdKVxuICBvbkJsdXIoZWw6IGFueSwgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRyaW0gPT09IGZhbHNlKSB7XG5cbiAgICAgIHJldHVybjtcblxuICAgIH1cblxuICAgIGlmICgodGhpcy50cmltID09PSAnJyB8fCAnYmx1cicgPT09IHRoaXMudHJpbSkgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIHZhbHVlLnRyaW0gJiYgdmFsdWUudHJpbSgpICE9PSB2YWx1ZSkge1xuXG4gICAgICBOZ3hUcmltRGlyZWN0aXZlLlRyaW1PcHRpb24oZWwsIHZhbHVlKTtcbiAgICAgIE5neFRyaW1EaXJlY3RpdmUuZGlzcGF0Y2hFdmVudChlbCwgJ2JsdXInKTsgLy8gaW4gY2FzZSB1cGRhdGVPbiBpcyBzZXQgdG8gYmx1clxuXG4gICAgfVxuXG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdpbnB1dCcsIFtcbiAgICAnJGV2ZW50LnRhcmdldCcsXG4gICAgJyRldmVudC50YXJnZXQudmFsdWUnLFxuICBdKVxuICBvbklucHV0KGVsOiBhbnksIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLnRyaW0gPT09IGZhbHNlKSB7XG5cbiAgICAgIHJldHVybjtcblxuICAgIH1cblxuICAgIGlmICh0aGlzLnRyaW0gPT09ICcnICYmICdmdW5jdGlvbicgPT09IHR5cGVvZiB2YWx1ZS50cmltICYmIHZhbHVlLnRyaW0oKSAhPT0gdmFsdWUpIHtcblxuICAgICAgbGV0IHsgc3RhcnQsIGVuZCB9ID0gTmd4VHJpbURpcmVjdGl2ZS5nZXRDYXJldChlbCk7XG5cbiAgICAgIGlmICh2YWx1ZVswXSA9PT0gJyAnICYmIHN0YXJ0ID09PSAxICYmIGVuZCA9PT0gMSkge1xuXG4gICAgICAgIHN0YXJ0ID0gMDtcbiAgICAgICAgZW5kID0gMDtcblxuICAgICAgfVxuXG4gICAgICBOZ3hUcmltRGlyZWN0aXZlLlRyaW1PcHRpb24oZWwsIHZhbHVlKTtcblxuICAgICAgTmd4VHJpbURpcmVjdGl2ZS5zZXRDYXJldChlbCwgc3RhcnQsIGVuZCk7XG5cbiAgICB9XG5cbiAgfVxuXG59XG5cbnR5cGUgVHJpbUVsZW1lbnQgPSBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudDtcblxuZXhwb3J0IHR5cGUgVHJpbU9wdGlvbiA9ICcnIHwgJ2JsdXInIHwgZmFsc2U7XG4iXX0=