@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
JavaScript
/**
* @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=