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.

288 lines (287 loc) 18.5 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. */ var /** @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> * ``` */ var CodemirrorComponent = /** @class */ (function () { /** * Constructor * * @param _zone NgZone injected for Initialization */ function CodemirrorComponent(_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 = ''; } Object.defineProperty(CodemirrorComponent.prototype, "value", { /** Implements ControlValueAccessor.value */ get: /** * Implements ControlValueAccessor.value * @return {?} */ function () { return this._value; }, set: /** * Implements ControlValueAccessor.value * @param {?} v * @return {?} */ function (v) { if (v !== this._value) { this._value = v; this.onChange(v); } }, enumerable: true, configurable: true }); /** * On component destroy * @return {?} */ CodemirrorComponent.prototype.ngOnDestroy = /** * On component destroy * @return {?} */ function () { }; /** * On component view init * @return {?} */ CodemirrorComponent.prototype.ngAfterViewInit = /** * On component view init * @return {?} */ function () { this.config = this.config || {}; this.codemirrorInit(this.config); }; /** * Value update process * @param {?} value * @return {?} */ CodemirrorComponent.prototype.updateValue = /** * Value update process * @param {?} value * @return {?} */ function (value) { this.value = value; this.onTouched(); this.change.emit(value); }; /** * Implements ControlValueAccessor * @param {?} value * @return {?} */ CodemirrorComponent.prototype.writeValue = /** * Implements ControlValueAccessor * @param {?} value * @return {?} */ function (value) { this._value = value || ''; if (this._instance) { this._instance.setValue(this._value); } }; /** * Change event trigger * @param {?} _ * @return {?} */ CodemirrorComponent.prototype.onChange = /** * Change event trigger * @param {?} _ * @return {?} */ function (_) { }; /** * Dirty/touched event trigger * @return {?} */ CodemirrorComponent.prototype.onTouched = /** * Dirty/touched event trigger * @return {?} */ function () { }; /** * Implements ControlValueAccessor.registerOnChange * @param {?} fn * @return {?} */ CodemirrorComponent.prototype.registerOnChange = /** * Implements ControlValueAccessor.registerOnChange * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** * Implements ControlValueAccessor.registerOnTouched * @param {?} fn * @return {?} */ CodemirrorComponent.prototype.registerOnTouched = /** * Implements ControlValueAccessor.registerOnTouched * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** * Initialize codemirror * @param {?} config * @return {?} */ CodemirrorComponent.prototype.codemirrorInit = /** * Initialize codemirror * @param {?} config * @return {?} */ function (config) { var _this = this; if (CodeMirror) { this._zone.runOutsideAngular(function () { _this._instance = CodeMirror.fromTextArea(_this.host.nativeElement, config); _this._instance.setValue(_this._value); }); this._instance.on('change', function () { _this.updateValue(_this._instance.getValue()); }); this._instance.on('focus', function (instance, event) { _this.focus.emit({ instance: instance, event: event }); }); this._instance.on('cursorActivity', function (instance) { _this.cursorActivity.emit({ instance: instance }); }); this._instance.on('blur', function (instance, event) { _this.blur.emit({ instance: instance, event: 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(function () { return CodemirrorComponent; }), multi: true } ], template: '<textarea #host></textarea>', },] }, ]; /** @nocollapse */ CodemirrorComponent.ctorParameters = function () { return [ { 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 },], }; return CodemirrorComponent; }()); export { CodemirrorComponent }; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Abm9tYWRyZXNlcnZhdGlvbnMvbmd4LWNvZGVtaXJyb3IvIiwic291cmNlcyI6WyJuZ3gtY29kZW1pcnJvci9jb2RlbWlycm9yLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFVBQVUsRUFDVixTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFHVixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFJbkQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFNekQscUJBQU0sVUFBVSxHQUNkLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssV0FBVztJQUN4RSxDQUFDLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztJQUN2QixDQUFDLENBQUMsU0FBUyxDQUFDOzs7Ozs7Ozs7O0lBNENaOzs7O09BSUc7SUFDSCw2QkFDVSxhQUNBO1FBREEsZ0JBQVcsR0FBWCxXQUFXO1FBQ1gsVUFBSyxHQUFMLEtBQUs7Ozs7c0JBdkJXLElBQUksWUFBWSxFQUFFOzs7O3FCQUVuQixJQUFJLFlBQVksRUFBRTs7OztvQkFFbkIsSUFBSSxZQUFZLEVBQUU7Ozs7OEJBRVIsSUFBSSxZQUFZLEVBQUU7Ozs7c0JBUW5DLEVBQUU7S0FVZjtJQUdKLHNCQUFJLHNDQUFLO1FBRFQsNENBQTRDOzs7OztRQUM1QyxjQUFjLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7Ozs7OztrQkFHaEIsQ0FBQztZQUNsQixFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxNQUFN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VyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsbUJBQW1CLEVBQW5CLENBQW1CLENBQUM7NEJBQ2xELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO29CQUNELFFBQVEsRUFBRSw2QkFBNkI7aUJBQ3hDOzs7O2dCQS9CUSxpQkFBaUI7Z0JBTnhCLE1BQU07OzsyQkF5Q0wsS0FBSzsyQkFFTCxNQUFNOzBCQUVOLE1BQU07eUJBRU4sTUFBTTttQ0FFTixNQUFNO3lCQUVOLFNBQVMsU0FBQyxNQUFNOzBCQXNCaEIsS0FBSzs7OEJBcEZSOztTQWlEYSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBJbXBvcnRzXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBBZnRlclZpZXdJbml0LFxuICBPbkRlc3Ryb3ksXG4gIE5nWm9uZSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnY29kZW1pcnJvcic7XG5pbXBvcnQgeyBDb2RlbWlycm9yU2VydmljZSB9IGZyb20gJy4vY29kZW1pcnJvci5zZXJ2aWNlJztcblxuLyoqXG4gKiBNYWluIENvZGVtaXJyb3IgaW1wb3J0LCB1dGlsaXppbmcgd2luZG93J3MgZXhpc3RlbmNlIHRvIGRldGVybWluZSBpZiB3ZSdyZSBzZXJ2ZXIgc2lkZSBvciBub3QuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG5jb25zdCBDb2RlTWlycm9yOiBhbnkgPVxuICB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2Ygd2luZG93Lm5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCdcbiAgPyByZXF1aXJlKCdjb2RlbWlycm9yJylcbiAgOiB1bmRlZmluZWQ7XG5cbi8qKlxuICogQ29kZU1pcnJvciBjb21wb25lbnRcbiAqXG4gKiAqKlVzYWdlKiogOlxuICogYGBgaHRtbFxuICogICA8bmd4LWNvZGVtaXJyb3IgWyhuZ01vZGVsKV09XCJkYXRhXCIgW2NvbmZpZ109XCJ7Li4ufVwiIChpbml0KT1cIm9uSW5pdFwiIChibHVyKT1cIm9uQmx1clwiIChmb2N1cyk9XCJvbkZvY3VzXCIgLi4uPjwvbmd4LWNvZGVtaXJyb3I+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICduZ3gtY29kZW1pcnJvcicsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWZvcndhcmQtcmVmXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb2RlbWlycm9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogJzx0ZXh0YXJlYSAjaG9zdD48L3RleHRhcmVhPicsXG59KVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gIC8qKiBDb2RlbWlycm9yIGNvbmZpZyBvYmplY3QgKHNlZSBbZGV0YWlsc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNjb25maWcpKSAqL1xuICBASW5wdXQoKSBwdWJsaWMgY29uZmlnOiBhbnk7XG4gIC8qKiBjaGFuZ2Ugb3V0cHV0IGV2ZW50LCBwYXNzIHRocm91Z2ggZnJvbSBjb2RlbWlycm9yICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogZm9jdXMgb3V0cHV0IGV2ZW50LCBwYXNzIHRocm91Z2ggZnJvbSBjb2RlbWlycm9yICovXG4gIEBPdXRwdXQoKSBwdWJsaWMgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiBibHVyIG91dHB1dCBldmVudCwgcGFzcyB0aHJvdWdoIGZyb20gY29kZW1pcnJvciAqL1xuICBAT3V0cHV0KCkgcHVibGljIGJsdXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiBjdXJzb3JBY3Rpdml0eSBvdXRwdXQgZXZlbnQsIHBhc3MgdGhyb3VnaCBmcm9tIGNvZGVtaXJyb3IgKi9cbiAgQE91dHB1dCgpIHB1YmxpYyBjdXJzb3JBY3Rpdml0eSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqIEhvc3QgZWxlbWVudCBmb3IgY29kZW1pcnJvciB0byBhdHRhY2ggdG8gKi9cbiAgQFZpZXdDaGlsZCgnaG9zdCcpIHB1YmxpYyBob3N0OiBFbGVtZW50UmVmO1xuXG4gIC8qKiBDdXJyZW50IGVkaXRvciBpbnN0YW5jZSAqL1xuICBwcml2YXRlIF9pbnN0YW5jZTogYW55O1xuXG4gIC8qKiBWYWx1ZSBzdG9yYWdlICovXG4gIHByaXZhdGUgX3ZhbHVlID0gJyc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yXG4gICAqXG4gICAqIEBwYXJhbSBfem9uZSBOZ1pvbmUgaW5qZWN0ZWQgZm9yIEluaXRpYWxpemF0aW9uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9jb2RlTWlycm9yOiBDb2RlbWlycm9yU2VydmljZSxcbiAgICBwcml2YXRlIF96b25lOiBOZ1pvbmVcbiAgKSB7fVxuXG4gIC8qKiBJbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLnZhbHVlICovXG4gIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG5cbiAgLyoqIEltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IudmFsdWUgKi9cbiAgQElucHV0KCkgc2V0IHZhbHVlKHYpIHtcbiAgICBpZiAodiAhPT0gdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICAgIHRoaXMub25DaGFuZ2Uodik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9uIGNvbXBvbmVudCBkZXN0cm95XG4gICAqL1xuICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBPbiBjb21wb25lbnQgdmlldyBpbml0XG4gICAqL1xuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuY29uZmlnID0gdGhpcy5jb25maWcgfHwge307XG4gICAgdGhpcy5jb2RlbWlycm9ySW5pdCh0aGlzLmNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsdWUgdXBkYXRlIHByb2Nlc3NcbiAgICovXG4gIHB1YmxpYyB1cGRhdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5jaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogSW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvclxuICAgKi9cbiAgcHVibGljIHdyaXRlVmFsdWUodmFsdWU6IGFueSkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWUgfHwgJyc7XG4gICAgaWYgKHRoaXMuX2luc3RhbmNlKSB7XG4gICAgICB0aGlzLl9pbnN0YW5jZS5zZXRWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIENoYW5nZSBldmVudCB0cmlnZ2VyICovXG4gIHB1YmxpYyAgb25DaGFuZ2UoXzogYW55KSB7fVxuICAvKiogRGlydHkvdG91Y2hlZCBldmVudCB0cmlnZ2VyICovXG4gIHB1YmxpYyBvblRvdWNoZWQoKSB7fVxuICAvKiogSW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3Nvci5yZWdpc3Rlck9uQ2hhbmdlICovXG4gIHB1YmxpYyByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XG4gIC8qKiBJbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkICovXG4gIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBjb2RlbWlycm9yXG4gICAqL1xuICBwcml2YXRlIGNvZGVtaXJyb3JJbml0KGNvbmZpZzogYW55KSB7XG4gICAgaWYgKENvZGVNaXJyb3IpIHtcbiAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLl9pbnN0YW5jZSA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LCBjb25maWcpO1xuICAgICAgICB0aGlzLl9pbnN0YW5jZS5zZXRWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5faW5zdGFuY2Uub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aGlzLl9pbnN0YW5jZS5nZXRWYWx1ZSgpKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9pbnN0YW5jZS5vbignZm9jdXMnLCAoaW5zdGFuY2U6IGFueSwgZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmZvY3VzLmVtaXQoe2luc3RhbmNlLCBldmVudH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2luc3RhbmNlLm9uKCdjdXJzb3JBY3Rpdml0eScsIChpbnN0YW5jZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuY3Vyc29yQWN0aXZpdHkuZW1pdCh7aW5zdGFuY2V9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9pbnN0YW5jZS5vbignYmx1cicsIChpbnN0YW5jZTogYW55LCBldmVudDogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuYmx1ci5lbWl0KHtpbnN0YW5jZSwgZXZlbnR9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9jb2RlTWlycm9yLmluc3RhbmNlJC5uZXh0KHRoaXMuX2luc3RhbmNlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==