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