UNPKG

@nomadreservations/ngx-codemirror

Version:

`@nomadreservations/ngx-codemirror` [CodeMirror (5.x)](http://codemirror.net/) code editor in your Angular application. Server Side Rendering(SSR) compliant and @angular 6+ Ready.

239 lines (238 loc) 16.6 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import { Component, Input, Output, ElementRef, ViewChild, EventEmitter, forwardRef, NgZone, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { CodemirrorService } from './codemirror.service'; /** * Main Codemirror import, utilizing window's existence to determine if we're server side or not. */ const /** @type {?} */ CodeMirror = typeof window !== 'undefined' && typeof window.navigator !== 'undefined' ? require('codemirror') : undefined; /** * CodeMirror component * * **Usage** : * ```html * <ngx-codemirror [(ngModel)]="data" [config]="{...}" (init)="onInit" (blur)="onBlur" (focus)="onFocus" ...></ngx-codemirror> * ``` */ export class CodemirrorComponent { /** * Constructor * * @param {?} _codeMirror * @param {?} _zone NgZone injected for Initialization */ constructor(_codeMirror, _zone) { this._codeMirror = _codeMirror; this._zone = _zone; /** * change output event, pass through from codemirror */ this.change = new EventEmitter(); /** * focus output event, pass through from codemirror */ this.focus = new EventEmitter(); /** * blur output event, pass through from codemirror */ this.blur = new EventEmitter(); /** * cursorActivity output event, pass through from codemirror */ this.cursorActivity = new EventEmitter(); /** * Value storage */ this._value = ''; } /** * Implements ControlValueAccessor.value * @return {?} */ get value() { return this._value; } /** * Implements ControlValueAccessor.value * @param {?} v * @return {?} */ set value(v) { if (v !== this._value) { this._value = v; this.onChange(v); } } /** * On component destroy * @return {?} */ ngOnDestroy() { } /** * On component view init * @return {?} */ ngAfterViewInit() { this.config = this.config || {}; this.codemirrorInit(this.config); } /** * Value update process * @param {?} value * @return {?} */ updateValue(value) { this.value = value; this.onTouched(); this.change.emit(value); } /** * Implements ControlValueAccessor * @param {?} value * @return {?} */ writeValue(value) { this._value = value || ''; if (this._instance) { this._instance.setValue(this._value); } } /** * Change event trigger * @param {?} _ * @return {?} */ onChange(_) { } /** * Dirty/touched event trigger * @return {?} */ onTouched() { } /** * Implements ControlValueAccessor.registerOnChange * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChange = fn; } /** * Implements ControlValueAccessor.registerOnTouched * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * Initialize codemirror * @param {?} config * @return {?} */ codemirrorInit(config) { if (CodeMirror) { this._zone.runOutsideAngular(() => { this._instance = CodeMirror.fromTextArea(this.host.nativeElement, config); this._instance.setValue(this._value); }); this._instance.on('change', () => { this.updateValue(this._instance.getValue()); }); this._instance.on('focus', (instance, event) => { this.focus.emit({ instance, event }); }); this._instance.on('cursorActivity', (instance) => { this.cursorActivity.emit({ instance }); }); this._instance.on('blur', (instance, event) => { this.blur.emit({ instance, event }); }); this._codeMirror.instance$.next(this._instance); } } } CodemirrorComponent.decorators = [ { type: Component, args: [{ // tslint:disable-next-line:component-selector selector: 'ngx-codemirror', providers: [ { provide: NG_VALUE_ACCESSOR, // tslint:disable-next-line:no-forward-ref useExisting: forwardRef(() => CodemirrorComponent), multi: true } ], template: '<textarea #host></textarea>', },] }, ]; /** @nocollapse */ CodemirrorComponent.ctorParameters = () => [ { type: CodemirrorService, }, { type: NgZone, }, ]; CodemirrorComponent.propDecorators = { "config": [{ type: Input },], "change": [{ type: Output },], "focus": [{ type: Output },], "blur": [{ type: Output },], "cursorActivity": [{ type: Output },], "host": [{ type: ViewChild, args: ['host',] },], "value": [{ type: Input },], }; function CodemirrorComponent_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ CodemirrorComponent.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ CodemirrorComponent.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ CodemirrorComponent.propDecorators; /** * Codemirror config object (see [details](http://codemirror.net/doc/manual.html#config)) * @type {?} */ CodemirrorComponent.prototype.config; /** * change output event, pass through from codemirror * @type {?} */ CodemirrorComponent.prototype.change; /** * focus output event, pass through from codemirror * @type {?} */ CodemirrorComponent.prototype.focus; /** * blur output event, pass through from codemirror * @type {?} */ CodemirrorComponent.prototype.blur; /** * cursorActivity output event, pass through from codemirror * @type {?} */ CodemirrorComponent.prototype.cursorActivity; /** * Host element for codemirror to attach to * @type {?} */ CodemirrorComponent.prototype.host; /** * Current editor instance * @type {?} */ CodemirrorComponent.prototype._instance; /** * Value storage * @type {?} */ CodemirrorComponent.prototype._value; /** @type {?} */ CodemirrorComponent.prototype._codeMirror; /** @type {?} */ CodemirrorComponent.prototype._zone; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abm9tYWRyZXNlcnZhdGlvbnMvbmd4LWNvZGVtaXJyb3IvIiwic291cmNlcyI6WyJuZ3gtY29kZW1pcnJvci9jb2RlbWlycm9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFDVixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFHVixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFNekQsdUJBQU0sVUFBVSxHQUNkLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssV0FBVztJQUN4RSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztJQUN2QixDQUFDLENBQUMsU0FBUyxDQUFDOzs7Ozs7Ozs7QUF1QmQsTUFBTTs7Ozs7OztJQTBCSixZQUNVLGFBQ0E7UUFEQSxnQkFBVyxHQUFYLFdBQVc7UUFDWCxVQUFLLEdBQUwsS0FBSzs7OztzQkF2QlcsSUFBSSxZQUFZLEVBQUU7Ozs7cUJBRW5CLElBQUksWUFBWSxFQUFFOzs7O29CQUVuQixJQUFJLFlBQVksRUFBRTs7Ozs4QkFFUixJQUFJLFlBQVksRUFBRTs7OztzQkFRbkMsRUFBRTtLQVVmOzs7OztJQUdKLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Ozs7OztRQUd0QixLQUFLLENBQUMsQ0FBQztRQUNsQixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFD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Q0FBQzt3QkFDbEQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7Z0JBQ0QsUUFBUSxFQUFFLDZCQUE2QjthQUN4Qzs7OztZQS9CUSxpQkFBaUI7WUFOeEIsTUFBTTs7O3VCQXlDTCxLQUFLO3VCQUVMLE1BQU07c0JBRU4sTUFBTTtxQkFFTixNQUFNOytCQUVOLE1BQU07cUJBRU4sU0FBUyxTQUFDLE1BQU07c0JBc0JoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBFbGVtZW50UmVmLFxuICBWaWV3Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgT25EZXN0cm95LFxuICBOZ1pvbmUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBSZXBsYXlTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJ2NvZGVtaXJyb3InO1xuaW1wb3J0IHsgQ29kZW1pcnJvclNlcnZpY2UgfSBmcm9tICcuL2NvZGVtaXJyb3Iuc2VydmljZSc7XG5cbi8qKlxuICogTWFpbiBDb2RlbWlycm9yIGltcG9ydCwgdXRpbGl6aW5nIHdpbmRvdydzIGV4aXN0ZW5jZSB0byBkZXRlcm1pbmUgaWYgd2UncmUgc2VydmVyIHNpZGUgb3Igbm90LlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxuY29uc3QgQ29kZU1pcnJvcjogYW55ID1cbiAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHdpbmRvdy5uYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnXG4gID8gcmVxdWlyZSgnY29kZW1pcnJvcicpXG4gIDogdW5kZWZpbmVkO1xuXG4vKipcbiAqIENvZGVNaXJyb3IgY29tcG9uZW50XG4gKlxuICogKipVc2FnZSoqIDpcbiAqIGBgYGh0bWxcbiAqICAgPG5neC1jb2RlbWlycm9yIFsobmdNb2RlbCldPVwiZGF0YVwiIFtjb25maWddPVwiey4uLn1cIiAoaW5pdCk9XCJvbkluaXRcIiAoYmx1cik9XCJvbkJsdXJcIiAoZm9jdXMpPVwib25Gb2N1c1wiIC4uLj48L25neC1jb2RlbWlycm9yPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbmd4LWNvZGVtaXJyb3InLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1mb3J3YXJkLXJlZlxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29kZW1pcnJvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXSxcbiAgdGVtcGxhdGU6ICc8dGV4dGFyZWEgI2hvc3Q+PC90ZXh0YXJlYT4nLFxufSlcbmV4cG9ydCBjbGFzcyBDb2RlbWlycm9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAvKiogQ29kZW1pcnJvciBjb25maWcgb2JqZWN0IChzZWUgW2RldGFpbHNdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjY29uZmlnKSkgKi9cbiAgQElucHV0KCkgcHVibGljIGNvbmZpZzogYW55O1xuICAvKiogY2hhbmdlIG91dHB1dCBldmVudCwgcGFzcyB0aHJvdWdoIGZyb20gY29kZW1pcnJvciAqL1xuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIGZvY3VzIG91dHB1dCBldmVudCwgcGFzcyB0aHJvdWdoIGZyb20gY29kZW1pcnJvciAqL1xuICBAT3V0cHV0KCkgcHVibGljIGZvY3VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogYmx1ciBvdXRwdXQgZXZlbnQsIHBhc3MgdGhyb3VnaCBmcm9tIGNvZGVtaXJyb3IgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBibHVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogY3Vyc29yQWN0aXZpdHkgb3V0cHV0IGV2ZW50LCBwYXNzIHRocm91Z2ggZnJvbSBjb2RlbWlycm9yICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgY3Vyc29yQWN0aXZpdHkgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiBIb3N0IGVsZW1lbnQgZm9yIGNvZGVtaXJyb3IgdG8gYXR0YWNoIHRvICovXG4gIEBWaWV3Q2hpbGQoJ2hvc3QnKSBwdWJsaWMgaG9zdDogRWxlbWVudFJlZjtcblxuICAvKiogQ3VycmVudCBlZGl0b3IgaW5zdGFuY2UgKi9cbiAgcHJpdmF0ZSBfaW5zdGFuY2U6IGFueTtcblxuICAvKiogVmFsdWUgc3RvcmFnZSAqL1xuICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKlxuICAgKiBAcGFyYW0gX3pvbmUgTmdab25lIGluamVjdGVkIGZvciBJbml0aWFsaXphdGlvblxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfY29kZU1pcnJvcjogQ29kZW1pcnJvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBfem9uZTogTmdab25lXG4gICkge31cblxuICAvKiogSW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3Nvci52YWx1ZSAqL1xuICBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfVxuXG4gIC8qKiBJbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLnZhbHVlICovXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2KSB7XG4gICAgaWYgKHYgIT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHYpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21wb25lbnQgZGVzdHJveVxuICAgKi9cbiAgcHVibGljIG5nT25EZXN0cm95KCkge1xuXG4gIH1cblxuICAvKipcbiAgICogT24gY29tcG9uZW50IHZpZXcgaW5pdFxuICAgKi9cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuY29uZmlnIHx8IHt9O1xuICAgIHRoaXMuY29kZW1pcnJvckluaXQodGhpcy5jb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZhbHVlIHVwZGF0ZSBwcm9jZXNzXG4gICAqL1xuICBwdWJsaWMgdXBkYXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIHRoaXMuY2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3JcbiAgICovXG4gIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpIHtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlIHx8ICcnO1xuICAgIGlmICh0aGlzLl9pbnN0YW5jZSkge1xuICAgICAgdGhpcy5faW5zdGFuY2Uuc2V0VmFsdWUodGhpcy5fdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDaGFuZ2UgZXZlbnQgdHJpZ2dlciAqL1xuICBwdWJsaWMgIG9uQ2hhbmdlKF86IGFueSkge31cbiAgLyoqIERpcnR5L3RvdWNoZWQgZXZlbnQgdHJpZ2dlciAqL1xuICBwdWJsaWMgb25Ub3VjaGVkKCkge31cbiAgLyoqIEltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZSAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7IHRoaXMub25DaGFuZ2UgPSBmbjsgfVxuICAvKiogSW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3Nvci5yZWdpc3Rlck9uVG91Y2hlZCAqL1xuICBwdWJsaWMgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkgeyB0aGlzLm9uVG91Y2hlZCA9IGZuOyB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemUgY29kZW1pcnJvclxuICAgKi9cbiAgcHJpdmF0ZSBjb2RlbWlycm9ySW5pdChjb25maWc6IGFueSkge1xuICAgIGlmIChDb2RlTWlycm9yKSB7XG4gICAgICB0aGlzLl96b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5faW5zdGFuY2UgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSh0aGlzLmhvc3QubmF0aXZlRWxlbWVudCwgY29uZmlnKTtcbiAgICAgICAgdGhpcy5faW5zdGFuY2Uuc2V0VmFsdWUodGhpcy5fdmFsdWUpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2luc3RhbmNlLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWUodGhpcy5faW5zdGFuY2UuZ2V0VmFsdWUoKSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5faW5zdGFuY2Uub24oJ2ZvY3VzJywgKGluc3RhbmNlOiBhbnksIGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5mb2N1cy5lbWl0KHtpbnN0YW5jZSwgZXZlbnR9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9pbnN0YW5jZS5vbignY3Vyc29yQWN0aXZpdHknLCAoaW5zdGFuY2U6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmN1cnNvckFjdGl2aXR5LmVtaXQoe2luc3RhbmNlfSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5faW5zdGFuY2Uub24oJ2JsdXInLCAoaW5zdGFuY2U6IGFueSwgZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmJsdXIuZW1pdCh7aW5zdGFuY2UsIGV2ZW50fSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fY29kZU1pcnJvci5pbnN0YW5jZSQubmV4dCh0aGlzLl9pbnN0YW5jZSk7XG4gICAgfVxuICB9XG59XG4iXX0=