@ctrl/ngx-codemirror 4.1.1 → 5.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -8
- package/codemirror.component.d.ts +6 -3
- package/codemirror.module.d.ts +5 -0
- package/ctrl-ngx-codemirror.d.ts +1 -0
- package/esm2020/codemirror.component.mjs +222 -0
- package/esm2020/codemirror.module.mjs +16 -0
- package/{esm2015/ctrl-ngx-codemirror.js → esm2020/ctrl-ngx-codemirror.mjs} +1 -1
- package/{esm2015/public_api.js → esm2020/public_api.mjs} +1 -1
- package/fesm2015/ctrl-ngx-codemirror.mjs +243 -0
- package/fesm2015/ctrl-ngx-codemirror.mjs.map +1 -0
- package/{fesm2015/ctrl-ngx-codemirror.js → fesm2020/ctrl-ngx-codemirror.mjs} +77 -50
- package/fesm2020/ctrl-ngx-codemirror.mjs.map +1 -0
- package/package.json +24 -13
- package/bundles/ctrl-ngx-codemirror.umd.js +0 -227
- package/bundles/ctrl-ngx-codemirror.umd.js.map +0 -1
- package/bundles/ctrl-ngx-codemirror.umd.min.js +0 -2
- package/bundles/ctrl-ngx-codemirror.umd.min.js.map +0 -1
- package/ctrl-ngx-codemirror.metadata.json +0 -1
- package/esm2015/codemirror.component.js +0 -199
- package/esm2015/codemirror.module.js +0 -11
- package/fesm2015/ctrl-ngx-codemirror.js.map +0 -1
@@ -1,199 +0,0 @@
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, KeyValueDiffers, NgZone, Output, ViewChild, } from '@angular/core';
|
2
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
3
|
-
function normalizeLineEndings(str) {
|
4
|
-
if (!str) {
|
5
|
-
return str;
|
6
|
-
}
|
7
|
-
return str.replace(/\r\n|\r/g, '\n');
|
8
|
-
}
|
9
|
-
export class CodemirrorComponent {
|
10
|
-
constructor(_differs, _ngZone) {
|
11
|
-
this._differs = _differs;
|
12
|
-
this._ngZone = _ngZone;
|
13
|
-
/* class applied to the created textarea */
|
14
|
-
this.className = '';
|
15
|
-
/* name applied to the created textarea */
|
16
|
-
this.name = 'codemirror';
|
17
|
-
/* autofocus setting applied to the created textarea */
|
18
|
-
this.autoFocus = false;
|
19
|
-
/* preserve previous scroll position after updating value */
|
20
|
-
this.preserveScrollPosition = false;
|
21
|
-
/* called when the text cursor is moved */
|
22
|
-
this.cursorActivity = new EventEmitter();
|
23
|
-
/* called when the editor is focused or loses focus */
|
24
|
-
this.focusChange = new EventEmitter();
|
25
|
-
/* called when the editor is scrolled */
|
26
|
-
// tslint:disable-next-line:no-output-native
|
27
|
-
this.scroll = new EventEmitter();
|
28
|
-
/* called when file(s) are dropped */
|
29
|
-
// tslint:disable-next-line:no-output-native
|
30
|
-
this.drop = new EventEmitter();
|
31
|
-
this.value = '';
|
32
|
-
this.disabled = false;
|
33
|
-
this.isFocused = false;
|
34
|
-
/** Implemented as part of ControlValueAccessor. */
|
35
|
-
this.onChange = (_) => { };
|
36
|
-
/** Implemented as part of ControlValueAccessor. */
|
37
|
-
this.onTouched = () => { };
|
38
|
-
}
|
39
|
-
/**
|
40
|
-
* set options for codemirror
|
41
|
-
* @link http://codemirror.net/doc/manual.html#config
|
42
|
-
*/
|
43
|
-
set options(value) {
|
44
|
-
this._options = value;
|
45
|
-
if (!this._differ && value) {
|
46
|
-
this._differ = this._differs.find(value).create();
|
47
|
-
}
|
48
|
-
}
|
49
|
-
get codeMirrorGlobal() {
|
50
|
-
if (this._codeMirror) {
|
51
|
-
return this._codeMirror;
|
52
|
-
}
|
53
|
-
this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : require('codemirror');
|
54
|
-
return this._codeMirror;
|
55
|
-
}
|
56
|
-
ngAfterViewInit() {
|
57
|
-
if (!this.ref) {
|
58
|
-
return;
|
59
|
-
}
|
60
|
-
// in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors
|
61
|
-
this._ngZone.runOutsideAngular(() => {
|
62
|
-
this.codeMirror = this.codeMirrorGlobal.fromTextArea(this.ref.nativeElement, this._options);
|
63
|
-
this.codeMirror.on('cursorActivity', cm => this._ngZone.run(() => this.cursorActive(cm)));
|
64
|
-
this.codeMirror.on('scroll', this.scrollChanged.bind(this));
|
65
|
-
this.codeMirror.on('blur', () => this._ngZone.run(() => this.focusChanged(false)));
|
66
|
-
this.codeMirror.on('focus', () => this._ngZone.run(() => this.focusChanged(true)));
|
67
|
-
this.codeMirror.on('change', (cm, change) => this._ngZone.run(() => this.codemirrorValueChanged(cm, change)));
|
68
|
-
this.codeMirror.on('drop', (cm, e) => {
|
69
|
-
this._ngZone.run(() => this.dropFiles(cm, e));
|
70
|
-
});
|
71
|
-
this.codeMirror.setValue(this.value);
|
72
|
-
});
|
73
|
-
}
|
74
|
-
ngDoCheck() {
|
75
|
-
if (!this._differ) {
|
76
|
-
return;
|
77
|
-
}
|
78
|
-
// check options have not changed
|
79
|
-
const changes = this._differ.diff(this._options);
|
80
|
-
if (changes) {
|
81
|
-
changes.forEachChangedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
82
|
-
changes.forEachAddedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
83
|
-
changes.forEachRemovedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
84
|
-
}
|
85
|
-
}
|
86
|
-
ngOnDestroy() {
|
87
|
-
// is there a lighter-weight way to remove the cm instance?
|
88
|
-
if (this.codeMirror) {
|
89
|
-
this.codeMirror.toTextArea();
|
90
|
-
}
|
91
|
-
}
|
92
|
-
codemirrorValueChanged(cm, change) {
|
93
|
-
const cmVal = cm.getValue();
|
94
|
-
if (this.value !== cmVal) {
|
95
|
-
this.value = cmVal;
|
96
|
-
this.onChange(this.value);
|
97
|
-
}
|
98
|
-
}
|
99
|
-
setOptionIfChanged(optionName, newValue) {
|
100
|
-
if (!this.codeMirror) {
|
101
|
-
return;
|
102
|
-
}
|
103
|
-
// cast to any to handle strictly typed option names
|
104
|
-
// could possibly import settings strings available in the future
|
105
|
-
this.codeMirror.setOption(optionName, newValue);
|
106
|
-
}
|
107
|
-
focusChanged(focused) {
|
108
|
-
this.onTouched();
|
109
|
-
this.isFocused = focused;
|
110
|
-
this.focusChange.emit(focused);
|
111
|
-
}
|
112
|
-
scrollChanged(cm) {
|
113
|
-
this.scroll.emit(cm.getScrollInfo());
|
114
|
-
}
|
115
|
-
cursorActive(cm) {
|
116
|
-
this.cursorActivity.emit(cm);
|
117
|
-
}
|
118
|
-
dropFiles(cm, e) {
|
119
|
-
this.drop.emit([cm, e]);
|
120
|
-
}
|
121
|
-
/** Implemented as part of ControlValueAccessor. */
|
122
|
-
writeValue(value) {
|
123
|
-
if (value === null || value === undefined) {
|
124
|
-
return;
|
125
|
-
}
|
126
|
-
if (!this.codeMirror) {
|
127
|
-
this.value = value;
|
128
|
-
return;
|
129
|
-
}
|
130
|
-
const cur = this.codeMirror.getValue();
|
131
|
-
if (value !== cur &&
|
132
|
-
normalizeLineEndings(cur) !== normalizeLineEndings(value)) {
|
133
|
-
this.value = value;
|
134
|
-
if (this.preserveScrollPosition) {
|
135
|
-
const prevScrollPosition = this.codeMirror.getScrollInfo();
|
136
|
-
this.codeMirror.setValue(this.value);
|
137
|
-
this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top);
|
138
|
-
}
|
139
|
-
else {
|
140
|
-
this.codeMirror.setValue(this.value);
|
141
|
-
}
|
142
|
-
}
|
143
|
-
}
|
144
|
-
/** Implemented as part of ControlValueAccessor. */
|
145
|
-
registerOnChange(fn) {
|
146
|
-
this.onChange = fn;
|
147
|
-
}
|
148
|
-
/** Implemented as part of ControlValueAccessor. */
|
149
|
-
registerOnTouched(fn) {
|
150
|
-
this.onTouched = fn;
|
151
|
-
}
|
152
|
-
/** Implemented as part of ControlValueAccessor. */
|
153
|
-
setDisabledState(isDisabled) {
|
154
|
-
this.disabled = isDisabled;
|
155
|
-
this.setOptionIfChanged('readOnly', this.disabled);
|
156
|
-
}
|
157
|
-
}
|
158
|
-
CodemirrorComponent.decorators = [
|
159
|
-
{ type: Component, args: [{
|
160
|
-
selector: 'ngx-codemirror',
|
161
|
-
template: `
|
162
|
-
<textarea
|
163
|
-
[name]="name"
|
164
|
-
class="ngx-codemirror {{ className }}"
|
165
|
-
[class.ngx-codemirror--focused]="isFocused"
|
166
|
-
autocomplete="off"
|
167
|
-
[autofocus]="autoFocus"
|
168
|
-
#ref
|
169
|
-
>
|
170
|
-
</textarea>
|
171
|
-
`,
|
172
|
-
providers: [
|
173
|
-
{
|
174
|
-
provide: NG_VALUE_ACCESSOR,
|
175
|
-
useExisting: forwardRef(() => CodemirrorComponent),
|
176
|
-
multi: true,
|
177
|
-
},
|
178
|
-
],
|
179
|
-
preserveWhitespaces: false,
|
180
|
-
changeDetection: ChangeDetectionStrategy.OnPush
|
181
|
-
},] }
|
182
|
-
];
|
183
|
-
CodemirrorComponent.ctorParameters = () => [
|
184
|
-
{ type: KeyValueDiffers },
|
185
|
-
{ type: NgZone }
|
186
|
-
];
|
187
|
-
CodemirrorComponent.propDecorators = {
|
188
|
-
className: [{ type: Input }],
|
189
|
-
name: [{ type: Input }],
|
190
|
-
autoFocus: [{ type: Input }],
|
191
|
-
options: [{ type: Input }],
|
192
|
-
preserveScrollPosition: [{ type: Input }],
|
193
|
-
cursorActivity: [{ type: Output }],
|
194
|
-
focusChange: [{ type: Output }],
|
195
|
-
scroll: [{ type: Output }],
|
196
|
-
drop: [{ type: Output }],
|
197
|
-
ref: [{ type: ViewChild, args: ['ref', { static: true },] }]
|
198
|
-
};
|
199
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vc3JjL2xpYi8iLCJzb3VyY2VzIjpbImNvZGVtaXJyb3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUdULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUVMLGVBQWUsRUFDZixNQUFNLEVBRU4sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFRekUsU0FBUyxvQkFBb0IsQ0FBQyxHQUFXO0lBQ3ZDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUixPQUFPLEdBQUcsQ0FBQztLQUNaO0lBQ0QsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBNEJELE1BQU0sT0FBTyxtQkFBbUI7SUE0QzlCLFlBQW9CLFFBQXlCLEVBQVUsT0FBZTtRQUFsRCxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVE7UUExQ3RFLDJDQUEyQztRQUNsQyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLDBDQUEwQztRQUNqQyxTQUFJLEdBQUcsWUFBWSxDQUFDO1FBQzdCLHVEQUF1RDtRQUM5QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBWTNCLDREQUE0RDtRQUNuRCwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDeEMsMENBQTBDO1FBQ2hDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN0RCxzREFBc0Q7UUFDNUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3BELHdDQUF3QztRQUN4Qyw0Q0FBNEM7UUFDbEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7UUFDbEQscUNBQXFDO1FBQ3JDLDRDQUE0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QVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsZ0JBQWdCO2dCQUMxQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7R0FVVDtnQkFDRCxTQUFTLEVBQUU7b0JBQ1Q7d0JBQ0UsT0FBTyxFQUFFLGlCQUFpQjt3QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQzt3QkFDbEQsS0FBSyxFQUFFLElBQUk7cUJBQ1o7aUJBQ0Y7Z0JBQ0QsbUJBQW1CLEVBQUUsS0FBSztnQkFDMUIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07YUFDaEQ7OztZQTlDQyxlQUFlO1lBQ2YsTUFBTTs7O3dCQWlETCxLQUFLO21CQUVMLEtBQUs7d0JBRUwsS0FBSztzQkFLTCxLQUFLO3FDQVFMLEtBQUs7NkJBRUwsTUFBTTswQkFFTixNQUFNO3FCQUdOLE1BQU07bUJBR04sTUFBTTtrQkFDTixTQUFTLFNBQUMsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERvQ2hlY2ssXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIEtleVZhbHVlRGlmZmVyLFxuICBLZXlWYWx1ZURpZmZlcnMsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBFZGl0b3IsXG4gIEVkaXRvckNoYW5nZUxpbmtlZExpc3QsXG4gIEVkaXRvckZyb21UZXh0QXJlYSxcbiAgU2Nyb2xsSW5mbyxcbn0gZnJvbSAnY29kZW1pcnJvcic7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVFbmRpbmdzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxyXFxufFxcci9nLCAnXFxuJyk7XG59XG5cbmRlY2xhcmUgdmFyIHJlcXVpcmU6IGFueTtcbmRlY2xhcmUgdmFyIENvZGVNaXJyb3I6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWNvZGVtaXJyb3InLFxuICB0ZW1wbGF0ZTogYFxuICAgIDx0ZXh0YXJlYVxuICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICBjbGFzcz1cIm5neC1jb2RlbWlycm9yIHt7IGNsYXNzTmFtZSB9fVwiXG4gICAgICBbY2xhc3Mubmd4LWNvZGVtaXJyb3ItLWZvY3VzZWRdPVwiaXNGb2N1c2VkXCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICBbYXV0b2ZvY3VzXT1cImF1dG9Gb2N1c1wiXG4gICAgICAjcmVmXG4gICAgPlxuICAgIDwvdGV4dGFyZWE+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29kZW1pcnJvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBEb0NoZWNrIHtcbiAgLyogY2xhc3MgYXBwbGllZCB0byB0aGUgY3JlYXRlZCB0ZXh0YXJlYSAqL1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgLyogbmFtZSBhcHBsaWVkIHRvIHRoZSBjcmVhdGVkIHRleHRhcmVhICovXG4gIEBJbnB1dCgpIG5hbWUgPSAnY29kZW1pcnJvcic7XG4gIC8qIGF1dG9mb2N1cyBzZXR0aW5nIGFwcGxpZWQgdG8gdGhlIGNyZWF0ZWQgdGV4dGFyZWEgKi9cbiAgQElucHV0KCkgYXV0b0ZvY3VzID0gZmFsc2U7XG4gIC8qKlxuICAgKiBzZXQgb3B0aW9ucyBmb3IgY29kZW1pcnJvclxuICAgKiBAbGluayBodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2NvbmZpZ1xuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IG9wdGlvbnModmFsdWU6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgICB0aGlzLl9vcHRpb25zID0gdmFsdWU7XG4gICAgaWYgKCF0aGlzLl9kaWZmZXIgJiYgdmFsdWUpIHtcbiAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2RpZmZlcnMuZmluZCh2YWx1ZSkuY3JlYXRlKCk7XG4gICAgfVxuICB9XG4gIC8qIHByZXNlcnZlIHByZXZpb3VzIHNjcm9sbCBwb3NpdGlvbiBhZnRlciB1cGRhdGluZyB2YWx1ZSAqL1xuICBASW5wdXQoKSBwcmVzZXJ2ZVNjcm9sbFBvc2l0aW9uID0gZmFsc2U7XG4gIC8qIGNhbGxlZCB3aGVuIHRoZSB0ZXh0IGN1cnNvciBpcyBtb3ZlZCAqL1xuICBAT3V0cHV0KCkgY3Vyc29yQWN0aXZpdHkgPSBuZXcgRXZlbnRFbWl0dGVyPEVkaXRvcj4oKTtcbiAgLyogY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBmb2N1c2VkIG9yIGxvc2VzIGZvY3VzICovXG4gIEBPdXRwdXQoKSBmb2N1c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgLyogY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBzY3JvbGxlZCAqL1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW5hdGl2ZVxuICBAT3V0cHV0KCkgc2Nyb2xsID0gbmV3IEV2ZW50RW1pdHRlcjxTY3JvbGxJbmZvPigpO1xuICAvKiBjYWxsZWQgd2hlbiBmaWxlKHMpIGFyZSBkcm9wcGVkICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBkcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxbRWRpdG9yLCBEcmFnRXZlbnRdPigpO1xuICBAVmlld0NoaWxkKCdyZWYnLCB7IHN0YXRpYzogdHJ1ZSB9KSByZWYhOiBFbGVtZW50UmVmO1xuICB2YWx1ZSA9ICcnO1xuICBkaXNhYmxlZCA9IGZhbHNlO1xuICBpc0ZvY3VzZWQgPSBmYWxzZTtcbiAgY29kZU1pcnJvcj86IEVkaXRvckZyb21UZXh0QXJlYTtcbiAgLyoqXG4gICAqIGVpdGhlciBnbG9iYWwgdmFyaWFibGUgb3IgcmVxdWlyZWQgbGlicmFyeVxuICAgKi9cbiAgcHJpdmF0ZSBfY29kZU1pcnJvcjogYW55O1xuXG4gIHByaXZhdGUgX2RpZmZlcj86IEtleVZhbHVlRGlmZmVyPHN0cmluZywgYW55PjtcbiAgcHJpdmF0ZSBfb3B0aW9uczogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RpZmZlcnM6IEtleVZhbHVlRGlmZmVycywgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgZ2V0IGNvZGVNaXJyb3JHbG9iYWwoKTogYW55IHtcbiAgICBpZiAodGhpcy5fY29kZU1pcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvZGVNaXJyb3I7XG4gICAgfVxuXG4gICAgdGhpcy5fY29kZU1pcnJvciA9IHR5cGVvZiBDb2RlTWlycm9yICE9PSAndW5kZWZpbmVkJyA/IENvZGVNaXJyb3IgOiByZXF1aXJlKCdjb2RlbWlycm9yJyk7XG4gICAgcmV0dXJuIHRoaXMuX2NvZGVNaXJyb3I7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlZikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBpbiBvcmRlciB0byBhbGxvdyBmb3IgdW5pdmVyc2FsIHJlbmRlcmluZywgd2UgaW1wb3J0IENvZGVtaXJyb3IgcnVudGltZSB3aXRoIGByZXF1aXJlYCB0byBwcmV2ZW50IG5vZGUgZXJyb3JzXG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuY29kZU1pcnJvciA9IHRoaXMuY29kZU1pcnJvckdsb2JhbC5mcm9tVGV4dEFyZWEoXG4gICAgICAgIHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIHRoaXMuX29wdGlvbnMsXG4gICAgICApIGFzIEVkaXRvckZyb21UZXh0QXJlYTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5vbignY3Vyc29yQWN0aXZpdHknLCBjbSA9PlxuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuY3Vyc29yQWN0aXZlKGNtKSksXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKCdzY3JvbGwnLCB0aGlzLnNjcm9sbENoYW5nZWQuYmluZCh0aGlzKSk7XG4gICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ2JsdXInLCAoKSA9PlxuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuZm9jdXNDaGFuZ2VkKGZhbHNlKSksXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKCdmb2N1cycsICgpID0+XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5mb2N1c0NoYW5nZWQodHJ1ZSkpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5vbihcbiAgICAgICAgJ2NoYW5nZScsXG4gICAgICAgIChjbTogRWRpdG9yLCBjaGFuZ2U6IEVkaXRvckNoYW5nZUxpbmtlZExpc3QpID0+XG4gICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmNvZGVtaXJyb3JWYWx1ZUNoYW5nZWQoY20sIGNoYW5nZSkpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5vbihcbiAgICAgICAgJ2Ryb3AnLFxuICAgICAgICAoY206IEVkaXRvciwgZTogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmRyb3BGaWxlcyhjbSwgZSkpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLnNldFZhbHVlKHRoaXMudmFsdWUpO1xuICAgIH0pO1xuICB9XG4gIG5nRG9DaGVjaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2RpZmZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBjaGVjayBvcHRpb25zIGhhdmUgbm90IGNoYW5nZWRcbiAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fb3B0aW9ucyk7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKG9wdGlvbiA9PlxuICAgICAgICB0aGlzLnNldE9wdGlvbklmQ2hhbmdlZChvcHRpb24ua2V5LCBvcHRpb24uY3VycmVudFZhbHVlKSxcbiAgICAgICk7XG4gICAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0ob3B0aW9uID0+XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uSWZDaGFuZ2VkKG9wdGlvbi5rZXksIG9wdGlvbi5jdXJyZW50VmFsdWUpLFxuICAgICAgKTtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKG9wdGlvbiA9PlxuICAgICAgICB0aGlzLnNldE9wdGlvbklmQ2hhbmdlZChvcHRpb24ua2V5LCBvcHRpb24uY3VycmVudFZhbHVlKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIGlzIHRoZXJlIGEgbGlnaHRlci13ZWlnaHQgd2F5IHRvIHJlbW92ZSB0aGUgY20gaW5zdGFuY2U/XG4gICAgaWYgKHRoaXMuY29kZU1pcnJvcikge1xuICAgICAgdGhpcy5jb2RlTWlycm9yLnRvVGV4dEFyZWEoKTtcbiAgICB9XG4gIH1cbiAgY29kZW1pcnJvclZhbHVlQ2hhbmdlZChjbTogRWRpdG9yLCBjaGFuZ2U6IEVkaXRvckNoYW5nZUxpbmtlZExpc3QpOiB2b2lkIHtcbiAgICBjb25zdCBjbVZhbCA9IGNtLmdldFZhbHVlKCk7XG4gICAgaWYgKHRoaXMudmFsdWUgIT09IGNtVmFsKSB7XG4gICAgICB0aGlzLnZhbHVlID0gY21WYWw7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIH1cbiAgfVxuICBzZXRPcHRpb25JZkNoYW5nZWQob3B0aW9uTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNvZGVNaXJyb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjYXN0IHRvIGFueSB0byBoYW5kbGUgc3RyaWN0bHkgdHlwZWQgb3B0aW9uIG5hbWVzXG4gICAgLy8gY291bGQgcG9zc2libHkgaW1wb3J0IHNldHRpbmdzIHN0cmluZ3MgYXZhaWxhYmxlIGluIHRoZSBmdXR1cmVcbiAgICB0aGlzLmNvZGVNaXJyb3Iuc2V0T3B0aW9uKG9wdGlvbk5hbWUgYXMgYW55LCBuZXdWYWx1ZSk7XG4gIH1cbiAgZm9jdXNDaGFuZ2VkKGZvY3VzZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIHRoaXMuaXNGb2N1c2VkID0gZm9jdXNlZDtcbiAgICB0aGlzLmZvY3VzQ2hhbmdlLmVtaXQoZm9jdXNlZCk7XG4gIH1cbiAgc2Nyb2xsQ2hhbmdlZChjbTogRWRpdG9yKTogdm9pZCB7XG4gICAgdGhpcy5zY3JvbGwuZW1pdChjbS5nZXRTY3JvbGxJbmZvKCkpO1xuICB9XG4gIGN1cnNvckFjdGl2ZShjbTogRWRpdG9yKTogdm9pZCB7XG4gICAgdGhpcy5jdXJzb3JBY3Rpdml0eS5lbWl0KGNtKTtcbiAgfVxuICBkcm9wRmlsZXMoY206IEVkaXRvciwgZTogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5kcm9wLmVtaXQoW2NtLCBlXSk7XG4gIH1cbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5jb2RlTWlycm9yKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGN1ciA9IHRoaXMuY29kZU1pcnJvci5nZXRWYWx1ZSgpO1xuICAgIGlmIChcbiAgICAgIHZhbHVlICE9PSBjdXIgJiZcbiAgICAgIG5vcm1hbGl6ZUxpbmVFbmRpbmdzKGN1cikgIT09IG5vcm1hbGl6ZUxpbmVFbmRpbmdzKHZhbHVlKVxuICAgICkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgaWYgKHRoaXMucHJlc2VydmVTY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBwcmV2U2Nyb2xsUG9zaXRpb24gPSB0aGlzLmNvZGVNaXJyb3IuZ2V0U2Nyb2xsSW5mbygpO1xuICAgICAgICB0aGlzLmNvZGVNaXJyb3Iuc2V0VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICAgIHRoaXMuY29kZU1pcnJvci5zY3JvbGxUbyhcbiAgICAgICAgICBwcmV2U2Nyb2xsUG9zaXRpb24ubGVmdCxcbiAgICAgICAgICBwcmV2U2Nyb2xsUG9zaXRpb24udG9wLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb2RlTWlycm9yLnNldFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG4gIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLnNldE9wdGlvbklmQ2hhbmdlZCgncmVhZE9ubHknLCB0aGlzLmRpc2FibGVkKTtcbiAgfVxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiB7fTtcbn1cbiJdfQ==
|
@@ -1,11 +0,0 @@
|
|
1
|
-
import { NgModule } from '@angular/core';
|
2
|
-
import { CodemirrorComponent } from './codemirror.component';
|
3
|
-
export class CodemirrorModule {
|
4
|
-
}
|
5
|
-
CodemirrorModule.decorators = [
|
6
|
-
{ type: NgModule, args: [{
|
7
|
-
exports: [CodemirrorComponent],
|
8
|
-
declarations: [CodemirrorComponent],
|
9
|
-
},] }
|
10
|
-
];
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vc3JjL2xpYi8iLCJzb3VyY2VzIjpbImNvZGVtaXJyb3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFNN0QsTUFBTSxPQUFPLGdCQUFnQjs7O1lBSjVCLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDOUIsWUFBWSxFQUFFLENBQUMsbUJBQW1CLENBQUM7YUFDcEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb2RlbWlycm9yQ29tcG9uZW50IH0gZnJvbSAnLi9jb2RlbWlycm9yLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGV4cG9ydHM6IFtDb2RlbWlycm9yQ29tcG9uZW50XSxcbiAgZGVjbGFyYXRpb25zOiBbQ29kZW1pcnJvckNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JNb2R1bGUge31cbiJdfQ==
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"ctrl-ngx-codemirror.js","sources":["../../src/lib/codemirror.component.ts","../../src/lib/codemirror.module.ts","../../src/lib/ctrl-ngx-codemirror.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DoCheck,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n KeyValueDiffer,\n KeyValueDiffers,\n NgZone,\n OnDestroy,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n Editor,\n EditorChangeLinkedList,\n EditorFromTextArea,\n ScrollInfo,\n} from 'codemirror';\n\nfunction normalizeLineEndings(str: string): string {\n if (!str) {\n return str;\n }\n return str.replace(/\\r\\n|\\r/g, '\\n');\n}\n\ndeclare var require: any;\ndeclare var CodeMirror: any;\n\n@Component({\n selector: 'ngx-codemirror',\n template: `\n <textarea\n [name]=\"name\"\n class=\"ngx-codemirror {{ className }}\"\n [class.ngx-codemirror--focused]=\"isFocused\"\n autocomplete=\"off\"\n [autofocus]=\"autoFocus\"\n #ref\n >\n </textarea>\n `,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CodemirrorComponent),\n multi: true,\n },\n ],\n preserveWhitespaces: false,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CodemirrorComponent\n implements AfterViewInit, OnDestroy, ControlValueAccessor, DoCheck {\n /* class applied to the created textarea */\n @Input() className = '';\n /* name applied to the created textarea */\n @Input() name = 'codemirror';\n /* autofocus setting applied to the created textarea */\n @Input() autoFocus = false;\n /**\n * set options for codemirror\n * @link http://codemirror.net/doc/manual.html#config\n */\n @Input()\n set options(value: { [key: string]: any }) {\n this._options = value;\n if (!this._differ && value) {\n this._differ = this._differs.find(value).create();\n }\n }\n /* preserve previous scroll position after updating value */\n @Input() preserveScrollPosition = false;\n /* called when the text cursor is moved */\n @Output() cursorActivity = new EventEmitter<Editor>();\n /* called when the editor is focused or loses focus */\n @Output() focusChange = new EventEmitter<boolean>();\n /* called when the editor is scrolled */\n // tslint:disable-next-line:no-output-native\n @Output() scroll = new EventEmitter<ScrollInfo>();\n /* called when file(s) are dropped */\n // tslint:disable-next-line:no-output-native\n @Output() drop = new EventEmitter<[Editor, DragEvent]>();\n @ViewChild('ref', { static: true }) ref!: ElementRef;\n value = '';\n disabled = false;\n isFocused = false;\n codeMirror?: EditorFromTextArea;\n /**\n * either global variable or required library\n */\n private _codeMirror: any;\n\n private _differ?: KeyValueDiffer<string, any>;\n private _options: any;\n\n constructor(private _differs: KeyValueDiffers, private _ngZone: NgZone) {}\n\n get codeMirrorGlobal(): any {\n if (this._codeMirror) {\n return this._codeMirror;\n }\n\n this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : require('codemirror');\n return this._codeMirror;\n }\n\n ngAfterViewInit(): void {\n if (!this.ref) {\n return;\n }\n // in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors\n this._ngZone.runOutsideAngular(() => {\n this.codeMirror = this.codeMirrorGlobal.fromTextArea(\n this.ref.nativeElement,\n this._options,\n ) as EditorFromTextArea;\n this.codeMirror.on('cursorActivity', cm =>\n this._ngZone.run(() => this.cursorActive(cm)),\n );\n this.codeMirror.on('scroll', this.scrollChanged.bind(this));\n this.codeMirror.on('blur', () =>\n this._ngZone.run(() => this.focusChanged(false)),\n );\n this.codeMirror.on('focus', () =>\n this._ngZone.run(() => this.focusChanged(true)),\n );\n this.codeMirror.on(\n 'change',\n (cm: Editor, change: EditorChangeLinkedList) =>\n this._ngZone.run(() => this.codemirrorValueChanged(cm, change)),\n );\n this.codeMirror.on(\n 'drop',\n (cm: Editor, e: DragEvent) => {\n this._ngZone.run(() => this.dropFiles(cm, e));\n }\n );\n this.codeMirror.setValue(this.value);\n });\n }\n ngDoCheck(): void {\n if (!this._differ) {\n return;\n }\n // check options have not changed\n const changes = this._differ.diff(this._options);\n if (changes) {\n changes.forEachChangedItem(option =>\n this.setOptionIfChanged(option.key, option.currentValue),\n );\n changes.forEachAddedItem(option =>\n this.setOptionIfChanged(option.key, option.currentValue),\n );\n changes.forEachRemovedItem(option =>\n this.setOptionIfChanged(option.key, option.currentValue),\n );\n }\n }\n ngOnDestroy(): void {\n // is there a lighter-weight way to remove the cm instance?\n if (this.codeMirror) {\n this.codeMirror.toTextArea();\n }\n }\n codemirrorValueChanged(cm: Editor, change: EditorChangeLinkedList): void {\n const cmVal = cm.getValue();\n if (this.value !== cmVal) {\n this.value = cmVal;\n this.onChange(this.value);\n }\n }\n setOptionIfChanged(optionName: string, newValue: any): void {\n if (!this.codeMirror) {\n return;\n }\n\n // cast to any to handle strictly typed option names\n // could possibly import settings strings available in the future\n this.codeMirror.setOption(optionName as any, newValue);\n }\n focusChanged(focused: boolean): void {\n this.onTouched();\n this.isFocused = focused;\n this.focusChange.emit(focused);\n }\n scrollChanged(cm: Editor): void {\n this.scroll.emit(cm.getScrollInfo());\n }\n cursorActive(cm: Editor): void {\n this.cursorActivity.emit(cm);\n }\n dropFiles(cm: Editor, e: DragEvent): void {\n this.drop.emit([cm, e]);\n }\n /** Implemented as part of ControlValueAccessor. */\n writeValue(value: string): void {\n if (value === null || value === undefined) {\n return;\n }\n if (!this.codeMirror) {\n this.value = value;\n return;\n }\n const cur = this.codeMirror.getValue();\n if (\n value !== cur &&\n normalizeLineEndings(cur) !== normalizeLineEndings(value)\n ) {\n this.value = value;\n if (this.preserveScrollPosition) {\n const prevScrollPosition = this.codeMirror.getScrollInfo();\n this.codeMirror.setValue(this.value);\n this.codeMirror.scrollTo(\n prevScrollPosition.left,\n prevScrollPosition.top,\n );\n } else {\n this.codeMirror.setValue(this.value);\n }\n }\n }\n\n /** Implemented as part of ControlValueAccessor. */\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.setOptionIfChanged('readOnly', this.disabled);\n }\n /** Implemented as part of ControlValueAccessor. */\n private onChange = (_: any) => {};\n /** Implemented as part of ControlValueAccessor. */\n private onTouched = () => {};\n}\n","import { NgModule } from '@angular/core';\n\nimport { CodemirrorComponent } from './codemirror.component';\n\n@NgModule({\n exports: [CodemirrorComponent],\n declarations: [CodemirrorComponent],\n})\nexport class CodemirrorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|