UNPKG

@ionic/angular

Version:

Angular specific wrappers for @ionic/core

141 lines 16.5 kB
import { Directive, HostListener } from '@angular/core'; import { NgControl } from '@angular/forms'; import { raf } from '../../util/util'; import * as i0 from "@angular/core"; // TODO(FW-2827): types export class ValueAccessor { constructor(injector, el) { this.injector = injector; this.el = el; this.onChange = () => { /**/ }; this.onTouched = () => { /**/ }; } writeValue(value) { this.el.nativeElement.value = this.lastValue = value; setIonicClasses(this.el); } /** * Notifies the ControlValueAccessor of a change in the value of the control. * * This is called by each of the ValueAccessor directives when we want to update * the status and validity of the form control. For example with text components this * is called when the ionInput event is fired. For select components this is called * when the ionChange event is fired. * * This also updates the Ionic form status classes on the element. * * @param el The component element. * @param value The new value of the control. */ handleValueChange(el, value) { if (el === this.el.nativeElement) { if (value !== this.lastValue) { this.lastValue = value; this.onChange(value); } setIonicClasses(this.el); } } _handleBlurEvent(el) { if (el === this.el.nativeElement) { this.onTouched(); setIonicClasses(this.el); } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.el.nativeElement.disabled = isDisabled; } ngOnDestroy() { if (this.statusChanges) { this.statusChanges.unsubscribe(); } } ngAfterViewInit() { let ngControl; try { ngControl = this.injector.get(NgControl); } catch { /* No FormControl or ngModel binding */ } if (!ngControl) { return; } // Listen for changes in validity, disabled, or pending states if (ngControl.statusChanges) { this.statusChanges = ngControl.statusChanges.subscribe(() => setIonicClasses(this.el)); } /** * TODO FW-2787: Remove this in favor of https://github.com/angular/angular/issues/10887 * whenever it is implemented. */ const formControl = ngControl.control; if (formControl) { const methodsToPatch = ['markAsTouched', 'markAllAsTouched', 'markAsUntouched', 'markAsDirty', 'markAsPristine']; methodsToPatch.forEach((method) => { if (typeof formControl[method] !== 'undefined') { const oldFn = formControl[method].bind(formControl); formControl[method] = (...params) => { oldFn(...params); setIonicClasses(this.el); }; } }); } } } /** @nocollapse */ ValueAccessor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ValueAccessor, deps: [{ token: i0.Injector }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); /** @nocollapse */ ValueAccessor.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: ValueAccessor, host: { listeners: { "ionBlur": "_handleBlurEvent($event.target)" } }, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: ValueAccessor, decorators: [{ type: Directive }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ElementRef }]; }, propDecorators: { _handleBlurEvent: [{ type: HostListener, args: ['ionBlur', ['$event.target']] }] } }); export const setIonicClasses = (element) => { raf(() => { const input = element.nativeElement; const hasValue = input.value != null && input.value.toString().length > 0; const classes = getClasses(input); setClasses(input, classes); const item = input.closest('ion-item'); if (item) { if (hasValue) { setClasses(item, [...classes, 'item-has-value']); } else { setClasses(item, classes); } } }); }; const getClasses = (element) => { const classList = element.classList; const classes = []; for (let i = 0; i < classList.length; i++) { const item = classList.item(i); if (item !== null && startsWith(item, 'ng-')) { classes.push(`ion-${item.substring(3)}`); } } return classes; }; const setClasses = (element, classes) => { const classList = element.classList; classList.remove('ion-valid', 'ion-invalid', 'ion-touched', 'ion-untouched', 'ion-dirty', 'ion-pristine'); classList.add(...classes); }; const startsWith = (input, search) => { return input.substring(0, search.length) === search; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsdWUtYWNjZXNzb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGlyZWN0aXZlcy9jb250cm9sLXZhbHVlLWFjY2Vzc29ycy92YWx1ZS1hY2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWtELFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEcsT0FBTyxFQUF3QixTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdqRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0saUJBQWlCLENBQUM7O0FBRXRDLHVCQUF1QjtBQUd2QixNQUFNLE9BQU8sYUFBYTtJQVV4QixZQUFzQixRQUFrQixFQUFZLEVBQWM7UUFBNUMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUFZLE9BQUUsR0FBRixFQUFFLENBQVk7UUFUMUQsYUFBUSxHQUF5QixHQUFHLEVBQUU7WUFDNUMsSUFBSTtRQUNOLENBQUMsQ0FBQztRQUNNLGNBQVMsR0FBZSxHQUFHLEVBQUU7WUFDbkMsSUFBSTtRQUNOLENBQUMsQ0FBQztJQUltRSxDQUFDO0lBRXRFLFVBQVUsQ0FBQyxLQUFVO1FBQ25CLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztRQUNyRCxlQUFlLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxpQkFBaUIsQ0FBQyxFQUFlLEVBQUUsS0FBVTtRQUMzQyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRTtZQUNoQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsU0FBUyxFQUFFO2dCQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FB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YyxDQUFDLENBQUM7SUFDMUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHLENBQUMsS0FBYSxFQUFFLE1BQWMsRUFBVyxFQUFFO0lBQzVELE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLE1BQU0sQ0FBQztBQUN0RCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBFbGVtZW50UmVmLCBJbmplY3RvciwgT25EZXN0cm95LCBEaXJlY3RpdmUsIEhvc3RMaXN0ZW5lciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyByYWYgfSBmcm9tICcuLi8uLi91dGlsL3V0aWwnO1xuXG4vLyBUT0RPKEZXLTI4MjcpOiB0eXBlc1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogYW55KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIC8qKi9cbiAgfTtcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgLyoqL1xuICB9O1xuICBwcm90ZWN0ZWQgbGFzdFZhbHVlOiBhbnk7XG4gIHByaXZhdGUgc3RhdHVzQ2hhbmdlcz86IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yLCBwcm90ZWN0ZWQgZWw6IEVsZW1lbnRSZWYpIHt9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdGhpcy5sYXN0VmFsdWUgPSB2YWx1ZTtcbiAgICBzZXRJb25pY0NsYXNzZXModGhpcy5lbCk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgdGhlIENvbnRyb2xWYWx1ZUFjY2Vzc29yIG9mIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbC5cbiAgICpcbiAgICogVGhpcyBpcyBjYWxsZWQgYnkgZWFjaCBvZiB0aGUgVmFsdWVBY2Nlc3NvciBkaXJlY3RpdmVzIHdoZW4gd2Ugd2FudCB0byB1cGRhdGVcbiAgICogdGhlIHN0YXR1cyBhbmQgdmFsaWRpdHkgb2YgdGhlIGZvcm0gY29udHJvbC4gRm9yIGV4YW1wbGUgd2l0aCB0ZXh0IGNvbXBvbmVudHMgdGhpc1xuICAgKiBpcyBjYWxsZWQgd2hlbiB0aGUgaW9uSW5wdXQgZXZlbnQgaXMgZmlyZWQuIEZvciBzZWxlY3QgY29tcG9uZW50cyB0aGlzIGlzIGNhbGxlZFxuICAgKiB3aGVuIHRoZSBpb25DaGFuZ2UgZXZlbnQgaXMgZmlyZWQuXG4gICAqXG4gICAqIFRoaXMgYWxzbyB1cGRhdGVzIHRoZSBJb25pYyBmb3JtIHN0YXR1cyBjbGFzc2VzIG9uIHRoZSBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gZWwgVGhlIGNvbXBvbmVudCBlbGVtZW50LlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgY29udHJvbC5cbiAgICovXG4gIGhhbmRsZVZhbHVlQ2hhbmdlKGVsOiBIVE1MRWxlbWVudCwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmIChlbCA9PT0gdGhpcy5lbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBpZiAodmFsdWUgIT09IHRoaXMubGFzdFZhbHVlKSB7XG4gICAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgfVxuICAgICAgc2V0SW9uaWNDbGFzc2VzKHRoaXMuZWwpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2lvbkJsdXInLCBbJyRldmVudC50YXJnZXQnXSlcbiAgX2hhbmRsZUJsdXJFdmVudChlbDogYW55KTogdm9pZCB7XG4gICAgaWYgKGVsID09PSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICBzZXRJb25pY0NsYXNzZXModGhpcy5lbCk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc3RhdHVzQ2hhbmdlcykge1xuICAgICAgdGhpcy5zdGF0dXNDaGFuZ2VzLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGxldCBuZ0NvbnRyb2w7XG4gICAgdHJ5IHtcbiAgICAgIG5nQ29udHJvbCA9IHRoaXMuaW5qZWN0b3IuZ2V0PE5nQ29udHJvbD4oTmdDb250cm9sKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8qIE5vIEZvcm1Db250cm9sIG9yIG5nTW9kZWwgYmluZGluZyAqL1xuICAgIH1cblxuICAgIGlmICghbmdDb250cm9sKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIGZvciBjaGFuZ2VzIGluIHZhbGlkaXR5LCBkaXNhYmxlZCwgb3IgcGVuZGluZyBzdGF0ZXNcbiAgICBpZiAobmdDb250cm9sLnN0YXR1c0NoYW5nZXMpIHtcbiAgICAgIHRoaXMuc3RhdHVzQ2hhbmdlcyA9IG5nQ29udHJvbC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiBzZXRJb25pY0NsYXNzZXModGhpcy5lbCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRPRE8gRlctMjc4NzogUmVtb3ZlIHRoaXMgaW4gZmF2b3Igb2YgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTA4ODdcbiAgICAgKiB3aGVuZXZlciBpdCBpcyBpbXBsZW1lbnRlZC5cbiAgICAgKi9cbiAgICBjb25zdCBmb3JtQ29udHJvbCA9IG5nQ29udHJvbC5jb250cm9sIGFzIGFueTtcbiAgICBpZiAoZm9ybUNvbnRyb2wpIHtcbiAgICAgIGNvbnN0IG1ldGhvZHNUb1BhdGNoID0gWydtYXJrQXNUb3VjaGVkJywgJ21hcmtBbGxBc1RvdWNoZWQnLCAnbWFya0FzVW50b3VjaGVkJywgJ21hcmtBc0RpcnR5JywgJ21hcmtBc1ByaXN0aW5lJ107XG4gICAgICBtZXRob2RzVG9QYXRjaC5mb3JFYWNoKChtZXRob2QpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmb3JtQ29udHJvbFttZXRob2RdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIGNvbnN0IG9sZEZuID0gZm9ybUNvbnRyb2xbbWV0aG9kXS5iaW5kKGZvcm1Db250cm9sKTtcbiAgICAgICAgICBmb3JtQ29udHJvbFttZXRob2RdID0gKC4uLnBhcmFtczogYW55W10pID0+IHtcbiAgICAgICAgICAgIG9sZEZuKC4uLnBhcmFtcyk7XG4gICAgICAgICAgICBzZXRJb25pY0NsYXNzZXModGhpcy5lbCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBzZXRJb25pY0NsYXNzZXMgPSAoZWxlbWVudDogRWxlbWVudFJlZik6IHZvaWQgPT4ge1xuICByYWYoKCkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgaGFzVmFsdWUgPSBpbnB1dC52YWx1ZSAhPSBudWxsICYmIGlucHV0LnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBjbGFzc2VzID0gZ2V0Q2xhc3NlcyhpbnB1dCk7XG4gICAgc2V0Q2xhc3NlcyhpbnB1dCwgY2xhc3Nlcyk7XG4gICAgY29uc3QgaXRlbSA9IGlucHV0LmNsb3Nlc3QoJ2lvbi1pdGVtJyk7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGlmIChoYXNWYWx1ZSkge1xuICAgICAgICBzZXRDbGFzc2VzKGl0ZW0sIFsuLi5jbGFzc2VzLCAnaXRlbS1oYXMtdmFsdWUnXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDbGFzc2VzKGl0ZW0sIGNsYXNzZXMpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5jb25zdCBnZXRDbGFzc2VzID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICBjb25zdCBjbGFzc2VzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2xhc3NMaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IGNsYXNzTGlzdC5pdGVtKGkpO1xuICAgIGlmIChpdGVtICE9PSBudWxsICYmIHN0YXJ0c1dpdGgoaXRlbSwgJ25nLScpKSB7XG4gICAgICBjbGFzc2VzLnB1c2goYGlvbi0ke2l0ZW0uc3Vic3RyaW5nKDMpfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY2xhc3Nlcztcbn07XG5cbmNvbnN0IHNldENsYXNzZXMgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzZXM6IHN0cmluZ1tdKSA9PiB7XG4gIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0O1xuICBjbGFzc0xpc3QucmVtb3ZlKCdpb24tdmFsaWQnLCAnaW9uLWludmFsaWQnLCAnaW9uLXRvdWNoZWQnLCAnaW9uLXVudG91Y2hlZCcsICdpb24tZGlydHknLCAnaW9uLXByaXN0aW5lJyk7XG4gIGNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XG59O1xuXG5jb25zdCBzdGFydHNXaXRoID0gKGlucHV0OiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBpbnB1dC5zdWJzdHJpbmcoMCwgc2VhcmNoLmxlbmd0aCkgPT09IHNlYXJjaDtcbn07XG4iXX0=