@ctrl/ngx-codemirror 6.1.0 → 7.0.0
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 +3 -7
- package/codemirror.component.d.ts +1 -1
- package/esm2022/codemirror.component.mjs +238 -0
- package/esm2022/codemirror.module.mjs +17 -0
- package/{fesm2020 → fesm2022}/ctrl-ngx-codemirror.mjs +55 -45
- package/{fesm2015 → fesm2022}/ctrl-ngx-codemirror.mjs.map +1 -1
- package/package.json +17 -15
- package/esm2020/codemirror.component.mjs +0 -227
- package/esm2020/codemirror.module.mjs +0 -16
- package/fesm2015/ctrl-ngx-codemirror.mjs +0 -248
- package/fesm2020/ctrl-ngx-codemirror.mjs.map +0 -1
- /package/{esm2020 → esm2022}/ctrl-ngx-codemirror.mjs +0 -0
- /package/{esm2020 → esm2022}/public_api.mjs +0 -0
package/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# ngx-codemirror [](https://www.npmjs.com/package/@ctrl/ngx-codemirror) [](https://www.npmjs.com/package/@ctrl/ngx-codemirror) [](https://codecov.io/gh/scttcper/ngx-codemirror)
|
2
2
|
|
3
3
|
DEMO: https://ngx-codemirror.vercel.app
|
4
4
|
|
@@ -13,7 +13,8 @@ Latest version available for each version of Angular
|
|
13
13
|
| 3.1.3 | 9.x | 5 |
|
14
14
|
| 4.1.1 | 10.x 11.x | 5 |
|
15
15
|
| 5.1.1 | 12.x-14x | 5 |
|
16
|
-
|
|
16
|
+
| 6.1.0 | 15.x | 5 |
|
17
|
+
| current | >= 16.x | 5 |
|
17
18
|
|
18
19
|
An Angular component wrapper for [CodeMirror](https://codemirror.net/) that extends ngModel. Based on [JedWatson/react-codemirror](https://github.com/JedWatson/react-codemirror)
|
19
20
|
|
@@ -98,8 +99,3 @@ All outputs of [ngModel](https://angular.io/api/forms/NgModel#outputs) and
|
|
98
99
|
## License
|
99
100
|
|
100
101
|
MIT
|
101
|
-
|
102
|
-
---
|
103
|
-
|
104
|
-
> GitHub [@scttcper](https://github.com/scttcper) ·
|
105
|
-
> Twitter [@scttcper](https://twitter.com/scttcper)
|
@@ -56,5 +56,5 @@ export declare class CodemirrorComponent implements AfterViewInit, OnDestroy, Co
|
|
56
56
|
/** Implemented as part of ControlValueAccessor. */
|
57
57
|
private onTouched;
|
58
58
|
static ɵfac: i0.ɵɵFactoryDeclaration<CodemirrorComponent, never>;
|
59
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<CodemirrorComponent, "ngx-codemirror", never, { "className": "className"; "name": "name"; "autoFocus": "autoFocus"; "options": "options"; "preserveScrollPosition": "preserveScrollPosition"; }, { "cursorActivity": "cursorActivity"; "focusChange": "focusChange"; "scroll": "scroll"; "drop": "drop"; "codeMirrorLoaded": "codeMirrorLoaded"; }, never, never, false, never>;
|
59
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<CodemirrorComponent, "ngx-codemirror", never, { "className": { "alias": "className"; "required": false; }; "name": { "alias": "name"; "required": false; }; "autoFocus": { "alias": "autoFocus"; "required": false; }; "options": { "alias": "options"; "required": false; }; "preserveScrollPosition": { "alias": "preserveScrollPosition"; "required": false; }; }, { "cursorActivity": "cursorActivity"; "focusChange": "focusChange"; "scroll": "scroll"; "drop": "drop"; "codeMirrorLoaded": "codeMirrorLoaded"; }, never, never, false, never>;
|
60
60
|
}
|
@@ -0,0 +1,238 @@
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Output, ViewChild, } from '@angular/core';
|
2
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
3
|
+
import * as i0 from "@angular/core";
|
4
|
+
function normalizeLineEndings(str) {
|
5
|
+
if (!str) {
|
6
|
+
return str;
|
7
|
+
}
|
8
|
+
return str.replace(/\r\n|\r/g, '\n');
|
9
|
+
}
|
10
|
+
class CodemirrorComponent {
|
11
|
+
_differs;
|
12
|
+
_ngZone;
|
13
|
+
/* class applied to the created textarea */
|
14
|
+
className = '';
|
15
|
+
/* name applied to the created textarea */
|
16
|
+
name = 'codemirror';
|
17
|
+
/* autofocus setting applied to the created textarea */
|
18
|
+
autoFocus = false;
|
19
|
+
/**
|
20
|
+
* set options for codemirror
|
21
|
+
* @link http://codemirror.net/doc/manual.html#config
|
22
|
+
*/
|
23
|
+
set options(value) {
|
24
|
+
this._options = value;
|
25
|
+
if (!this._differ && value) {
|
26
|
+
this._differ = this._differs.find(value).create();
|
27
|
+
}
|
28
|
+
}
|
29
|
+
/* preserve previous scroll position after updating value */
|
30
|
+
preserveScrollPosition = false;
|
31
|
+
/* called when the text cursor is moved */
|
32
|
+
cursorActivity = new EventEmitter();
|
33
|
+
/* called when the editor is focused or loses focus */
|
34
|
+
focusChange = new EventEmitter();
|
35
|
+
/* called when the editor is scrolled */
|
36
|
+
// eslint-disable-next-line @angular-eslint/no-output-native
|
37
|
+
scroll = new EventEmitter();
|
38
|
+
/* called when file(s) are dropped */
|
39
|
+
// eslint-disable-next-line @angular-eslint/no-output-native
|
40
|
+
drop = new EventEmitter();
|
41
|
+
/* called when codeMirror instance is initiated on the component */
|
42
|
+
codeMirrorLoaded = new EventEmitter();
|
43
|
+
ref;
|
44
|
+
value = '';
|
45
|
+
disabled = false;
|
46
|
+
isFocused = false;
|
47
|
+
codeMirror;
|
48
|
+
/**
|
49
|
+
* either global variable or required library
|
50
|
+
*/
|
51
|
+
_codeMirror;
|
52
|
+
_differ;
|
53
|
+
_options;
|
54
|
+
constructor(_differs, _ngZone) {
|
55
|
+
this._differs = _differs;
|
56
|
+
this._ngZone = _ngZone;
|
57
|
+
}
|
58
|
+
get codeMirrorGlobal() {
|
59
|
+
if (this._codeMirror) {
|
60
|
+
return this._codeMirror;
|
61
|
+
}
|
62
|
+
// in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors
|
63
|
+
this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : import('codemirror');
|
64
|
+
return this._codeMirror;
|
65
|
+
}
|
66
|
+
ngAfterViewInit() {
|
67
|
+
this._ngZone.runOutsideAngular(async () => {
|
68
|
+
const codeMirrorObj = await this.codeMirrorGlobal;
|
69
|
+
const codeMirror = codeMirrorObj?.default ? codeMirrorObj.default : codeMirrorObj;
|
70
|
+
this.codeMirror = codeMirror.fromTextArea(this.ref.nativeElement, this._options);
|
71
|
+
this.codeMirror.on('cursorActivity', cm => this._ngZone.run(() => this.cursorActive(cm)));
|
72
|
+
this.codeMirror.on('scroll', this.scrollChanged.bind(this));
|
73
|
+
this.codeMirror.on('blur', () => this._ngZone.run(() => this.focusChanged(false)));
|
74
|
+
this.codeMirror.on('focus', () => this._ngZone.run(() => this.focusChanged(true)));
|
75
|
+
this.codeMirror.on('change', (cm, change) => this._ngZone.run(() => this.codemirrorValueChanged(cm, change)));
|
76
|
+
this.codeMirror.on('drop', (cm, e) => {
|
77
|
+
this._ngZone.run(() => this.dropFiles(cm, e));
|
78
|
+
});
|
79
|
+
this.codeMirror.setValue(this.value);
|
80
|
+
this.codeMirrorLoaded.emit(this);
|
81
|
+
});
|
82
|
+
}
|
83
|
+
ngDoCheck() {
|
84
|
+
if (!this._differ) {
|
85
|
+
return;
|
86
|
+
}
|
87
|
+
// check options have not changed
|
88
|
+
const changes = this._differ.diff(this._options);
|
89
|
+
if (changes) {
|
90
|
+
changes.forEachChangedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
91
|
+
changes.forEachAddedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
92
|
+
changes.forEachRemovedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
93
|
+
}
|
94
|
+
}
|
95
|
+
ngOnDestroy() {
|
96
|
+
// is there a lighter-weight way to remove the cm instance?
|
97
|
+
if (this.codeMirror) {
|
98
|
+
this.codeMirror.toTextArea();
|
99
|
+
}
|
100
|
+
}
|
101
|
+
codemirrorValueChanged(cm, change) {
|
102
|
+
const cmVal = cm.getValue();
|
103
|
+
if (this.value !== cmVal) {
|
104
|
+
this.value = cmVal;
|
105
|
+
this.onChange(this.value);
|
106
|
+
}
|
107
|
+
}
|
108
|
+
setOptionIfChanged(optionName, newValue) {
|
109
|
+
if (!this.codeMirror) {
|
110
|
+
return;
|
111
|
+
}
|
112
|
+
// cast to any to handle strictly typed option names
|
113
|
+
// could possibly import settings strings available in the future
|
114
|
+
this.codeMirror.setOption(optionName, newValue);
|
115
|
+
}
|
116
|
+
focusChanged(focused) {
|
117
|
+
this.onTouched();
|
118
|
+
this.isFocused = focused;
|
119
|
+
this.focusChange.emit(focused);
|
120
|
+
}
|
121
|
+
scrollChanged(cm) {
|
122
|
+
this.scroll.emit(cm.getScrollInfo());
|
123
|
+
}
|
124
|
+
cursorActive(cm) {
|
125
|
+
this.cursorActivity.emit(cm);
|
126
|
+
}
|
127
|
+
dropFiles(cm, e) {
|
128
|
+
this.drop.emit([cm, e]);
|
129
|
+
}
|
130
|
+
/** Implemented as part of ControlValueAccessor. */
|
131
|
+
writeValue(value) {
|
132
|
+
if (value === null || value === undefined) {
|
133
|
+
return;
|
134
|
+
}
|
135
|
+
if (!this.codeMirror) {
|
136
|
+
this.value = value;
|
137
|
+
return;
|
138
|
+
}
|
139
|
+
const cur = this.codeMirror.getValue();
|
140
|
+
if (value !== cur && normalizeLineEndings(cur) !== normalizeLineEndings(value)) {
|
141
|
+
this.value = value;
|
142
|
+
if (this.preserveScrollPosition) {
|
143
|
+
const prevScrollPosition = this.codeMirror.getScrollInfo();
|
144
|
+
this.codeMirror.setValue(this.value);
|
145
|
+
this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top);
|
146
|
+
}
|
147
|
+
else {
|
148
|
+
this.codeMirror.setValue(this.value);
|
149
|
+
}
|
150
|
+
}
|
151
|
+
}
|
152
|
+
/** Implemented as part of ControlValueAccessor. */
|
153
|
+
registerOnChange(fn) {
|
154
|
+
this.onChange = fn;
|
155
|
+
}
|
156
|
+
/** Implemented as part of ControlValueAccessor. */
|
157
|
+
registerOnTouched(fn) {
|
158
|
+
this.onTouched = fn;
|
159
|
+
}
|
160
|
+
/** Implemented as part of ControlValueAccessor. */
|
161
|
+
setDisabledState(isDisabled) {
|
162
|
+
this.disabled = isDisabled;
|
163
|
+
this.setOptionIfChanged('readOnly', this.disabled);
|
164
|
+
}
|
165
|
+
/** Implemented as part of ControlValueAccessor. */
|
166
|
+
onChange = (_) => { };
|
167
|
+
/** Implemented as part of ControlValueAccessor. */
|
168
|
+
onTouched = () => { };
|
169
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
170
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.1", type: CodemirrorComponent, selector: "ngx-codemirror", inputs: { className: "className", name: "name", autoFocus: "autoFocus", options: "options", preserveScrollPosition: "preserveScrollPosition" }, outputs: { cursorActivity: "cursorActivity", focusChange: "focusChange", scroll: "scroll", drop: "drop", codeMirrorLoaded: "codeMirrorLoaded" }, providers: [
|
171
|
+
{
|
172
|
+
provide: NG_VALUE_ACCESSOR,
|
173
|
+
useExisting: forwardRef(() => CodemirrorComponent),
|
174
|
+
multi: true,
|
175
|
+
},
|
176
|
+
], viewQueries: [{ propertyName: "ref", first: true, predicate: ["ref"], descendants: true }], ngImport: i0, template: `
|
177
|
+
<textarea
|
178
|
+
[name]="name"
|
179
|
+
class="ngx-codemirror {{ className }}"
|
180
|
+
[class.ngx-codemirror--focused]="isFocused"
|
181
|
+
autocomplete="off"
|
182
|
+
[autofocus]="autoFocus"
|
183
|
+
#ref
|
184
|
+
>
|
185
|
+
</textarea>
|
186
|
+
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
187
|
+
}
|
188
|
+
export { CodemirrorComponent };
|
189
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorComponent, decorators: [{
|
190
|
+
type: Component,
|
191
|
+
args: [{
|
192
|
+
selector: 'ngx-codemirror',
|
193
|
+
template: `
|
194
|
+
<textarea
|
195
|
+
[name]="name"
|
196
|
+
class="ngx-codemirror {{ className }}"
|
197
|
+
[class.ngx-codemirror--focused]="isFocused"
|
198
|
+
autocomplete="off"
|
199
|
+
[autofocus]="autoFocus"
|
200
|
+
#ref
|
201
|
+
>
|
202
|
+
</textarea>
|
203
|
+
`,
|
204
|
+
providers: [
|
205
|
+
{
|
206
|
+
provide: NG_VALUE_ACCESSOR,
|
207
|
+
useExisting: forwardRef(() => CodemirrorComponent),
|
208
|
+
multi: true,
|
209
|
+
},
|
210
|
+
],
|
211
|
+
preserveWhitespaces: false,
|
212
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
213
|
+
}]
|
214
|
+
}], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i0.NgZone }]; }, propDecorators: { className: [{
|
215
|
+
type: Input
|
216
|
+
}], name: [{
|
217
|
+
type: Input
|
218
|
+
}], autoFocus: [{
|
219
|
+
type: Input
|
220
|
+
}], options: [{
|
221
|
+
type: Input
|
222
|
+
}], preserveScrollPosition: [{
|
223
|
+
type: Input
|
224
|
+
}], cursorActivity: [{
|
225
|
+
type: Output
|
226
|
+
}], focusChange: [{
|
227
|
+
type: Output
|
228
|
+
}], scroll: [{
|
229
|
+
type: Output
|
230
|
+
}], drop: [{
|
231
|
+
type: Output
|
232
|
+
}], codeMirrorLoaded: [{
|
233
|
+
type: Output
|
234
|
+
}], ref: [{
|
235
|
+
type: ViewChild,
|
236
|
+
args: ['ref']
|
237
|
+
}] } });
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2NvZGVtaXJyb3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUdULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUtMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUd6RSxTQUFTLG9CQUFvQixDQUFDLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFDRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFLRCxNQXVCYSxtQkFBbUI7SUErQ1Y7SUFBbUM7SUE1Q3ZELDJDQUEyQztJQUNsQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLDBDQUEwQztJQUNqQyxJQUFJLEdBQUcsWUFBWSxDQUFDO0lBQzdCLHVEQUF1RDtJQUM5QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQzNCOzs7T0FHRztJQUNILElBQ0ksT0FBTyxDQUFDLEtBQTZCO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLEtBQUssRUFBRTtZQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQUNELDREQUE0RDtJQUNuRCxzQkFBc0IsR0FBRyxLQUFLLENBQUM7SUFDeEMsMENBQTBDO0lBQ2hDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBQ3RELHNE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QUFiLE1BQU07Z0JBRUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNXLEdBQUc7c0JBQXBCLFNBQVM7dUJBQUMsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERvQ2hlY2ssXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIEtleVZhbHVlRGlmZmVyLFxuICBLZXlWYWx1ZURpZmZlcnMsXG4gIE5nWm9uZSxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBFZGl0b3IsIEVkaXRvckNoYW5nZSwgRWRpdG9yRnJvbVRleHRBcmVhLCBTY3JvbGxJbmZvIH0gZnJvbSAnY29kZW1pcnJvcic7XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUxpbmVFbmRpbmdzKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFzdHIpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG4gIHJldHVybiBzdHIucmVwbGFjZSgvXFxyXFxufFxcci9nLCAnXFxuJyk7XG59XG5cbmRlY2xhcmUgdmFyIHJlcXVpcmU6IGFueTtcbmRlY2xhcmUgdmFyIENvZGVNaXJyb3I6IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LWNvZGVtaXJyb3InLFxuICB0ZW1wbGF0ZTogYFxuICAgIDx0ZXh0YXJlYVxuICAgICAgW25hbWVdPVwibmFtZVwiXG4gICAgICBjbGFzcz1cIm5neC1jb2RlbWlycm9yIHt7IGNsYXNzTmFtZSB9fVwiXG4gICAgICBbY2xhc3Mubmd4LWNvZGVtaXJyb3ItLWZvY3VzZWRdPVwiaXNGb2N1c2VkXCJcbiAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICBbYXV0b2ZvY3VzXT1cImF1dG9Gb2N1c1wiXG4gICAgICAjcmVmXG4gICAgPlxuICAgIDwvdGV4dGFyZWE+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQ29kZW1pcnJvckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JDb21wb25lbnRcbiAgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBEb0NoZWNrXG57XG4gIC8qIGNsYXNzIGFwcGxpZWQgdG8gdGhlIGNyZWF0ZWQgdGV4dGFyZWEgKi9cbiAgQElucHV0KCkgY2xhc3NOYW1lID0gJyc7XG4gIC8qIG5hbWUgYXBwbGllZCB0byB0aGUgY3JlYXRlZCB0ZXh0YXJlYSAqL1xuICBASW5wdXQoKSBuYW1lID0gJ2NvZGVtaXJyb3InO1xuICAvKiBhdXRvZm9jdXMgc2V0dGluZyBhcHBsaWVkIHRvIHRoZSBjcmVhdGVkIHRleHRhcmVhICovXG4gIEBJbnB1dCgpIGF1dG9Gb2N1cyA9IGZhbHNlO1xuICAvKipcbiAgICogc2V0IG9wdGlvbnMgZm9yIGNvZGVtaXJyb3JcbiAgICogQGxpbmsgaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNjb25maWdcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNldCBvcHRpb25zKHZhbHVlOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KSB7XG4gICAgdGhpcy5fb3B0aW9ucyA9IHZhbHVlO1xuICAgIGlmICghdGhpcy5fZGlmZmVyICYmIHZhbHVlKSB7XG4gICAgICB0aGlzLl9kaWZmZXIgPSB0aGlzLl9kaWZmZXJzLmZpbmQodmFsdWUpLmNyZWF0ZSgpO1xuICAgIH1cbiAgfVxuICAvKiBwcmVzZXJ2ZSBwcmV2aW91cyBzY3JvbGwgcG9zaXRpb24gYWZ0ZXIgdXBkYXRpbmcgdmFsdWUgKi9cbiAgQElucHV0KCkgcHJlc2VydmVTY3JvbGxQb3NpdGlvbiA9IGZhbHNlO1xuICAvKiBjYWxsZWQgd2hlbiB0aGUgdGV4dCBjdXJzb3IgaXMgbW92ZWQgKi9cbiAgQE91dHB1dCgpIGN1cnNvckFjdGl2aXR5ID0gbmV3IEV2ZW50RW1pdHRlcjxFZGl0b3I+KCk7XG4gIC8qIGNhbGxlZCB3aGVuIHRoZSBlZGl0b3IgaXMgZm9jdXNlZCBvciBsb3NlcyBmb2N1cyAqL1xuICBAT3V0cHV0KCkgZm9jdXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG4gIC8qIGNhbGxlZCB3aGVuIHRoZSBlZGl0b3IgaXMgc2Nyb2xsZWQgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBzY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPFNjcm9sbEluZm8+KCk7XG4gIC8qIGNhbGxlZCB3aGVuIGZpbGUocykgYXJlIGRyb3BwZWQgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBkcm9wID0gbmV3IEV2ZW50RW1pdHRlcjxbRWRpdG9yLCBEcmFnRXZlbnRdPigpO1xuICAvKiBjYWxsZWQgd2hlbiBjb2RlTWlycm9yIGluc3RhbmNlIGlzIGluaXRpYXRlZCBvbiB0aGUgY29tcG9uZW50ICovXG4gIEBPdXRwdXQoKSBjb2RlTWlycm9yTG9hZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxDb2RlbWlycm9yQ29tcG9uZW50PigpO1xuICBAVmlld0NoaWxkKCdyZWYnKSByZWYhOiBFbGVtZW50UmVmPEhUTUxUZXh0QXJlYUVsZW1lbnQ+O1xuICB2YWx1ZSA9ICcnO1xuICBkaXNhYmxlZCA9IGZhbHNlO1xuICBpc0ZvY3VzZWQgPSBmYWxzZTtcbiAgY29kZU1pcnJvcj86IEVkaXRvckZyb21UZXh0QXJlYTtcbiAgLyoqXG4gICAqIGVpdGhlciBnbG9iYWwgdmFyaWFibGUgb3IgcmVxdWlyZWQgbGlicmFyeVxuICAgKi9cbiAgcHJpdmF0ZSBfY29kZU1pcnJvcjogYW55O1xuXG4gIHByaXZhdGUgX2RpZmZlcj86IEtleVZhbHVlRGlmZmVyPHN0cmluZywgYW55PjtcbiAgcHJpdmF0ZSBfb3B0aW9uczogYW55O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RpZmZlcnM6IEtleVZhbHVlRGlmZmVycywgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUpIHt9XG5cbiAgZ2V0IGNvZGVNaXJyb3JHbG9iYWwoKTogYW55IHtcbiAgICBpZiAodGhpcy5fY29kZU1pcnJvcikge1xuICAgICAgcmV0dXJuIHRoaXMuX2NvZGVNaXJyb3I7XG4gICAgfVxuXG4gICAgLy8gaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHVuaXZlcnNhbCByZW5kZXJpbmcsIHdlIGltcG9ydCBDb2RlbWlycm9yIHJ1bnRpbWUgd2l0aCBgcmVxdWlyZWAgdG8gcHJldmVudCBub2RlIGVycm9yc1xuICAgIHRoaXMuX2NvZGVNaXJyb3IgPSB0eXBlb2YgQ29kZU1pcnJvciAhPT0gJ3VuZGVmaW5lZCcgPyBDb2RlTWlycm9yIDogaW1wb3J0KCdjb2RlbWlycm9yJyk7XG4gICAgcmV0dXJuIHRoaXMuX2NvZGVNaXJyb3I7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvZGVNaXJyb3JPYmogPSBhd2FpdCB0aGlzLmNvZGVNaXJyb3JHbG9iYWw7XG4gICAgICBjb25zdCBjb2RlTWlycm9yID0gY29kZU1pcnJvck9iaj8uZGVmYXVsdCA/IGNvZGVNaXJyb3JPYmouZGVmYXVsdCA6IGNvZGVNaXJyb3JPYmo7XG4gICAgICB0aGlzLmNvZGVNaXJyb3IgPSBjb2RlTWlycm9yLmZyb21UZXh0QXJlYShcbiAgICAgICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5fb3B0aW9ucyxcbiAgICAgICkgYXMgRWRpdG9yRnJvbVRleHRBcmVhO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKCdjdXJzb3JBY3Rpdml0eScsIGNtID0+IHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5jdXJzb3JBY3RpdmUoY20pKSk7XG4gICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5vbignYmx1cicsICgpID0+IHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5mb2N1c0NoYW5nZWQoZmFsc2UpKSk7XG4gICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ2ZvY3VzJywgKCkgPT4gdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmZvY3VzQ2hhbmdlZCh0cnVlKSkpO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKCdjaGFuZ2UnLCAoY20sIGNoYW5nZSkgPT5cbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmNvZGVtaXJyb3JWYWx1ZUNoYW5nZWQoY20sIGNoYW5nZSkpLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5vbignZHJvcCcsIChjbSwgZSkgPT4ge1xuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuZHJvcEZpbGVzKGNtLCBlKSk7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvckxvYWRlZC5lbWl0KHRoaXMpO1xuICAgIH0pO1xuICB9XG4gIG5nRG9DaGVjaygpIHtcbiAgICBpZiAoIXRoaXMuX2RpZmZlcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBjaGVjayBvcHRpb25zIGhhdmUgbm90IGNoYW5nZWRcbiAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fb3B0aW9ucyk7XG4gICAgaWYgKGNoYW5nZXMpIHtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKG9wdGlvbiA9PlxuICAgICAgICB0aGlzLnNldE9wdGlvbklmQ2hhbmdlZChvcHRpb24ua2V5LCBvcHRpb24uY3VycmVudFZhbHVlKSxcbiAgICAgICk7XG4gICAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0ob3B0aW9uID0+IHRoaXMuc2V0T3B0aW9uSWZDaGFuZ2VkKG9wdGlvbi5rZXksIG9wdGlvbi5jdXJyZW50VmFsdWUpKTtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKG9wdGlvbiA9PlxuICAgICAgICB0aGlzLnNldE9wdGlvbklmQ2hhbmdlZChvcHRpb24ua2V5LCBvcHRpb24uY3VycmVudFZhbHVlKSxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIG5nT25EZXN0cm95KCkge1xuICAgIC8vIGlzIHRoZXJlIGEgbGlnaHRlci13ZWlnaHQgd2F5IHRvIHJlbW92ZSB0aGUgY20gaW5zdGFuY2U/XG4gICAgaWYgKHRoaXMuY29kZU1pcnJvcikge1xuICAgICAgdGhpcy5jb2RlTWlycm9yLnRvVGV4dEFyZWEoKTtcbiAgICB9XG4gIH1cbiAgY29kZW1pcnJvclZhbHVlQ2hhbmdlZChjbTogRWRpdG9yLCBjaGFuZ2U6IEVkaXRvckNoYW5nZSkge1xuICAgIGNvbnN0IGNtVmFsID0gY20uZ2V0VmFsdWUoKTtcbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gY21WYWwpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBjbVZhbDtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgfVxuICB9XG4gIHNldE9wdGlvbklmQ2hhbmdlZChvcHRpb25OYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuY29kZU1pcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNhc3QgdG8gYW55IHRvIGhhbmRsZSBzdHJpY3RseSB0eXBlZCBvcHRpb24gbmFtZXNcbiAgICAvLyBjb3VsZCBwb3NzaWJseSBpbXBvcnQgc2V0dGluZ3Mgc3RyaW5ncyBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZVxuICAgIHRoaXMuY29kZU1pcnJvci5zZXRPcHRpb24ob3B0aW9uTmFtZSBhcyBhbnksIG5ld1ZhbHVlKTtcbiAgfVxuICBmb2N1c0NoYW5nZWQoZm9jdXNlZDogYm9vbGVhbikge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmb2N1c2VkO1xuICAgIHRoaXMuZm9jdXNDaGFuZ2UuZW1pdChmb2N1c2VkKTtcbiAgfVxuICBzY3JvbGxDaGFuZ2VkKGNtOiBFZGl0b3IpIHtcbiAgICB0aGlzLnNjcm9sbC5lbWl0KGNtLmdldFNjcm9sbEluZm8oKSk7XG4gIH1cbiAgY3Vyc29yQWN0aXZlKGNtOiBFZGl0b3IpIHtcbiAgICB0aGlzLmN1cnNvckFjdGl2aXR5LmVtaXQoY20pO1xuICB9XG4gIGRyb3BGaWxlcyhjbTogRWRpdG9yLCBlOiBEcmFnRXZlbnQpIHtcbiAgICB0aGlzLmRyb3AuZW1pdChbY20sIGVdKTtcbiAgfVxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvZGVNaXJyb3IpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3VyID0gdGhpcy5jb2RlTWlycm9yLmdldFZhbHVlKCk7XG4gICAgaWYgKHZhbHVlICE9PSBjdXIgJiYgbm9ybWFsaXplTGluZUVuZGluZ3MoY3VyKSAhPT0gbm9ybWFsaXplTGluZUVuZGluZ3ModmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy5wcmVzZXJ2ZVNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHByZXZTY3JvbGxQb3NpdGlvbiA9IHRoaXMuY29kZU1pcnJvci5nZXRTY3JvbGxJbmZvKCk7XG4gICAgICAgIHRoaXMuY29kZU1pcnJvci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5jb2RlTWlycm9yLnNjcm9sbFRvKHByZXZTY3JvbGxQb3NpdGlvbi5sZWZ0LCBwcmV2U2Nyb2xsUG9zaXRpb24udG9wKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29kZU1pcnJvci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKHZhbHVlOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5zZXRPcHRpb25JZkNoYW5nZWQoJ3JlYWRPbmx5JywgdGhpcy5kaXNhYmxlZCk7XG4gIH1cbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICovXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICovXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4ge307XG59XG4iXX0=
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { NgModule } from '@angular/core';
|
2
|
+
import { CodemirrorComponent } from './codemirror.component';
|
3
|
+
import * as i0 from "@angular/core";
|
4
|
+
class CodemirrorModule {
|
5
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
6
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorModule, declarations: [CodemirrorComponent], exports: [CodemirrorComponent] });
|
7
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorModule });
|
8
|
+
}
|
9
|
+
export { CodemirrorModule };
|
10
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorModule, decorators: [{
|
11
|
+
type: NgModule,
|
12
|
+
args: [{
|
13
|
+
exports: [CodemirrorComponent],
|
14
|
+
declarations: [CodemirrorComponent],
|
15
|
+
}]
|
16
|
+
}] });
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2NvZGVtaXJyb3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBRTdELE1BSWEsZ0JBQWdCO3VHQUFoQixnQkFBZ0I7d0dBQWhCLGdCQUFnQixpQkFGWixtQkFBbUIsYUFEeEIsbUJBQW1CO3dHQUdsQixnQkFBZ0I7O1NBQWhCLGdCQUFnQjsyRkFBaEIsZ0JBQWdCO2tCQUo1QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLG1CQUFtQixDQUFDO29CQUM5QixZQUFZLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDcEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb2RlbWlycm9yQ29tcG9uZW50IH0gZnJvbSAnLi9jb2RlbWlycm9yLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGV4cG9ydHM6IFtDb2RlbWlycm9yQ29tcG9uZW50XSxcbiAgZGVjbGFyYXRpb25zOiBbQ29kZW1pcnJvckNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JNb2R1bGUge31cbiJdfQ==
|
@@ -9,37 +9,14 @@ function normalizeLineEndings(str) {
|
|
9
9
|
return str.replace(/\r\n|\r/g, '\n');
|
10
10
|
}
|
11
11
|
class CodemirrorComponent {
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
this.autoFocus = false;
|
21
|
-
/* preserve previous scroll position after updating value */
|
22
|
-
this.preserveScrollPosition = false;
|
23
|
-
/* called when the text cursor is moved */
|
24
|
-
this.cursorActivity = new EventEmitter();
|
25
|
-
/* called when the editor is focused or loses focus */
|
26
|
-
this.focusChange = new EventEmitter();
|
27
|
-
/* called when the editor is scrolled */
|
28
|
-
// eslint-disable-next-line @angular-eslint/no-output-native
|
29
|
-
this.scroll = new EventEmitter();
|
30
|
-
/* called when file(s) are dropped */
|
31
|
-
// eslint-disable-next-line @angular-eslint/no-output-native
|
32
|
-
this.drop = new EventEmitter();
|
33
|
-
/* called when codeMirror instance is initiated on the component */
|
34
|
-
this.codeMirrorLoaded = new EventEmitter();
|
35
|
-
this.value = '';
|
36
|
-
this.disabled = false;
|
37
|
-
this.isFocused = false;
|
38
|
-
/** Implemented as part of ControlValueAccessor. */
|
39
|
-
this.onChange = (_) => { };
|
40
|
-
/** Implemented as part of ControlValueAccessor. */
|
41
|
-
this.onTouched = () => { };
|
42
|
-
}
|
12
|
+
_differs;
|
13
|
+
_ngZone;
|
14
|
+
/* class applied to the created textarea */
|
15
|
+
className = '';
|
16
|
+
/* name applied to the created textarea */
|
17
|
+
name = 'codemirror';
|
18
|
+
/* autofocus setting applied to the created textarea */
|
19
|
+
autoFocus = false;
|
43
20
|
/**
|
44
21
|
* set options for codemirror
|
45
22
|
* @link http://codemirror.net/doc/manual.html#config
|
@@ -50,6 +27,35 @@ class CodemirrorComponent {
|
|
50
27
|
this._differ = this._differs.find(value).create();
|
51
28
|
}
|
52
29
|
}
|
30
|
+
/* preserve previous scroll position after updating value */
|
31
|
+
preserveScrollPosition = false;
|
32
|
+
/* called when the text cursor is moved */
|
33
|
+
cursorActivity = new EventEmitter();
|
34
|
+
/* called when the editor is focused or loses focus */
|
35
|
+
focusChange = new EventEmitter();
|
36
|
+
/* called when the editor is scrolled */
|
37
|
+
// eslint-disable-next-line @angular-eslint/no-output-native
|
38
|
+
scroll = new EventEmitter();
|
39
|
+
/* called when file(s) are dropped */
|
40
|
+
// eslint-disable-next-line @angular-eslint/no-output-native
|
41
|
+
drop = new EventEmitter();
|
42
|
+
/* called when codeMirror instance is initiated on the component */
|
43
|
+
codeMirrorLoaded = new EventEmitter();
|
44
|
+
ref;
|
45
|
+
value = '';
|
46
|
+
disabled = false;
|
47
|
+
isFocused = false;
|
48
|
+
codeMirror;
|
49
|
+
/**
|
50
|
+
* either global variable or required library
|
51
|
+
*/
|
52
|
+
_codeMirror;
|
53
|
+
_differ;
|
54
|
+
_options;
|
55
|
+
constructor(_differs, _ngZone) {
|
56
|
+
this._differs = _differs;
|
57
|
+
this._ngZone = _ngZone;
|
58
|
+
}
|
53
59
|
get codeMirrorGlobal() {
|
54
60
|
if (this._codeMirror) {
|
55
61
|
return this._codeMirror;
|
@@ -157,15 +163,18 @@ class CodemirrorComponent {
|
|
157
163
|
this.disabled = isDisabled;
|
158
164
|
this.setOptionIfChanged('readOnly', this.disabled);
|
159
165
|
}
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
166
|
+
/** Implemented as part of ControlValueAccessor. */
|
167
|
+
onChange = (_) => { };
|
168
|
+
/** Implemented as part of ControlValueAccessor. */
|
169
|
+
onTouched = () => { };
|
170
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
171
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.1", type: CodemirrorComponent, selector: "ngx-codemirror", inputs: { className: "className", name: "name", autoFocus: "autoFocus", options: "options", preserveScrollPosition: "preserveScrollPosition" }, outputs: { cursorActivity: "cursorActivity", focusChange: "focusChange", scroll: "scroll", drop: "drop", codeMirrorLoaded: "codeMirrorLoaded" }, providers: [
|
172
|
+
{
|
173
|
+
provide: NG_VALUE_ACCESSOR,
|
174
|
+
useExisting: forwardRef(() => CodemirrorComponent),
|
175
|
+
multi: true,
|
176
|
+
},
|
177
|
+
], viewQueries: [{ propertyName: "ref", first: true, predicate: ["ref"], descendants: true }], ngImport: i0, template: `
|
169
178
|
<textarea
|
170
179
|
[name]="name"
|
171
180
|
class="ngx-codemirror {{ className }}"
|
@@ -176,7 +185,8 @@ CodemirrorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ve
|
|
176
185
|
>
|
177
186
|
</textarea>
|
178
187
|
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
179
|
-
|
188
|
+
}
|
189
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorComponent, decorators: [{
|
180
190
|
type: Component,
|
181
191
|
args: [{
|
182
192
|
selector: 'ngx-codemirror',
|
@@ -227,11 +237,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImpor
|
|
227
237
|
}] } });
|
228
238
|
|
229
239
|
class CodemirrorModule {
|
240
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
241
|
+
static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorModule, declarations: [CodemirrorComponent], exports: [CodemirrorComponent] });
|
242
|
+
static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorModule });
|
230
243
|
}
|
231
|
-
|
232
|
-
CodemirrorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule, declarations: [CodemirrorComponent], exports: [CodemirrorComponent] });
|
233
|
-
CodemirrorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule });
|
234
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule, decorators: [{
|
244
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.1", ngImport: i0, type: CodemirrorModule, decorators: [{
|
235
245
|
type: NgModule,
|
236
246
|
args: [{
|
237
247
|
exports: [CodemirrorComponent],
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ctrl-ngx-codemirror.mjs","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 { Editor, EditorChange, EditorFromTextArea, ScrollInfo } 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{\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 // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() scroll = new EventEmitter<ScrollInfo>();\n /* called when file(s) are dropped */\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() drop = new EventEmitter<[Editor, DragEvent]>();\n /* called when codeMirror instance is initiated on the component */\n @Output() codeMirrorLoaded = new EventEmitter<CodemirrorComponent>();\n @ViewChild('ref') ref!: ElementRef<HTMLTextAreaElement>;\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 // in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors\n this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : import('codemirror');\n return this._codeMirror;\n }\n\n ngAfterViewInit() {\n this._ngZone.runOutsideAngular(async () => {\n const codeMirrorObj = await this.codeMirrorGlobal;\n const codeMirror = codeMirrorObj?.default ? codeMirrorObj.default : codeMirrorObj;\n this.codeMirror = codeMirror.fromTextArea(\n this.ref.nativeElement,\n this._options,\n ) as EditorFromTextArea;\n this.codeMirror.on('cursorActivity', cm => this._ngZone.run(() => this.cursorActive(cm)));\n this.codeMirror.on('scroll', this.scrollChanged.bind(this));\n this.codeMirror.on('blur', () => this._ngZone.run(() => this.focusChanged(false)));\n this.codeMirror.on('focus', () => this._ngZone.run(() => this.focusChanged(true)));\n this.codeMirror.on('change', (cm, change) =>\n this._ngZone.run(() => this.codemirrorValueChanged(cm, change)),\n );\n this.codeMirror.on('drop', (cm, e) => {\n this._ngZone.run(() => this.dropFiles(cm, e));\n });\n this.codeMirror.setValue(this.value);\n this.codeMirrorLoaded.emit(this);\n });\n }\n ngDoCheck() {\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 => this.setOptionIfChanged(option.key, option.currentValue));\n changes.forEachRemovedItem(option =>\n this.setOptionIfChanged(option.key, option.currentValue),\n );\n }\n }\n ngOnDestroy() {\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: EditorChange) {\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) {\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) {\n this.onTouched();\n this.isFocused = focused;\n this.focusChange.emit(focused);\n }\n scrollChanged(cm: Editor) {\n this.scroll.emit(cm.getScrollInfo());\n }\n cursorActive(cm: Editor) {\n this.cursorActivity.emit(cm);\n }\n dropFiles(cm: Editor, e: DragEvent) {\n this.drop.emit([cm, e]);\n }\n /** Implemented as part of ControlValueAccessor. */\n writeValue(value: string) {\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 (value !== cur && normalizeLineEndings(cur) !== normalizeLineEndings(value)) {\n this.value = value;\n if (this.preserveScrollPosition) {\n const prevScrollPosition = this.codeMirror.getScrollInfo();\n this.codeMirror.setValue(this.value);\n this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top);\n } else {\n this.codeMirror.setValue(this.value);\n }\n }\n }\n\n /** Implemented as part of ControlValueAccessor. */\n registerOnChange(fn: (value: string) => void) {\n this.onChange = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n setDisabledState(isDisabled: boolean) {\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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"}
|
1
|
+
{"version":3,"file":"ctrl-ngx-codemirror.mjs","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 { Editor, EditorChange, EditorFromTextArea, ScrollInfo } 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{\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 // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() scroll = new EventEmitter<ScrollInfo>();\n /* called when file(s) are dropped */\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() drop = new EventEmitter<[Editor, DragEvent]>();\n /* called when codeMirror instance is initiated on the component */\n @Output() codeMirrorLoaded = new EventEmitter<CodemirrorComponent>();\n @ViewChild('ref') ref!: ElementRef<HTMLTextAreaElement>;\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 // in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors\n this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : import('codemirror');\n return this._codeMirror;\n }\n\n ngAfterViewInit() {\n this._ngZone.runOutsideAngular(async () => {\n const codeMirrorObj = await this.codeMirrorGlobal;\n const codeMirror = codeMirrorObj?.default ? codeMirrorObj.default : codeMirrorObj;\n this.codeMirror = codeMirror.fromTextArea(\n this.ref.nativeElement,\n this._options,\n ) as EditorFromTextArea;\n this.codeMirror.on('cursorActivity', cm => this._ngZone.run(() => this.cursorActive(cm)));\n this.codeMirror.on('scroll', this.scrollChanged.bind(this));\n this.codeMirror.on('blur', () => this._ngZone.run(() => this.focusChanged(false)));\n this.codeMirror.on('focus', () => this._ngZone.run(() => this.focusChanged(true)));\n this.codeMirror.on('change', (cm, change) =>\n this._ngZone.run(() => this.codemirrorValueChanged(cm, change)),\n );\n this.codeMirror.on('drop', (cm, e) => {\n this._ngZone.run(() => this.dropFiles(cm, e));\n });\n this.codeMirror.setValue(this.value);\n this.codeMirrorLoaded.emit(this);\n });\n }\n ngDoCheck() {\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 => this.setOptionIfChanged(option.key, option.currentValue));\n changes.forEachRemovedItem(option =>\n this.setOptionIfChanged(option.key, option.currentValue),\n );\n }\n }\n ngOnDestroy() {\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: EditorChange) {\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) {\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) {\n this.onTouched();\n this.isFocused = focused;\n this.focusChange.emit(focused);\n }\n scrollChanged(cm: Editor) {\n this.scroll.emit(cm.getScrollInfo());\n }\n cursorActive(cm: Editor) {\n this.cursorActivity.emit(cm);\n }\n dropFiles(cm: Editor, e: DragEvent) {\n this.drop.emit([cm, e]);\n }\n /** Implemented as part of ControlValueAccessor. */\n writeValue(value: string) {\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 (value !== cur && normalizeLineEndings(cur) !== normalizeLineEndings(value)) {\n this.value = value;\n if (this.preserveScrollPosition) {\n const prevScrollPosition = this.codeMirror.getScrollInfo();\n this.codeMirror.setValue(this.value);\n this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top);\n } else {\n this.codeMirror.setValue(this.value);\n }\n }\n }\n\n /** Implemented as part of ControlValueAccessor. */\n registerOnChange(fn: (value: string) => void) {\n this.onChange = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n setDisabledState(isDisabled: boolean) {\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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"}
|
package/package.json
CHANGED
@@ -1,30 +1,34 @@
|
|
1
1
|
{
|
2
2
|
"name": "@ctrl/ngx-codemirror",
|
3
|
-
"version": "
|
3
|
+
"version": "7.0.0",
|
4
4
|
"license": "MIT",
|
5
5
|
"description": "CodeMirror wrapper for Angular",
|
6
6
|
"dependencies": {
|
7
|
-
"@types/codemirror": "^5.60.
|
7
|
+
"@types/codemirror": "^5.60.7",
|
8
8
|
"tslib": "^2.3.0"
|
9
9
|
},
|
10
10
|
"peerDependencies": {
|
11
|
-
"@angular/core": ">=
|
12
|
-
"@angular/forms": ">=
|
11
|
+
"@angular/core": ">=16.0.0-0",
|
12
|
+
"@angular/forms": ">=16.0.0-0",
|
13
13
|
"codemirror": "^5.65.9"
|
14
14
|
},
|
15
15
|
"repository": "scttcper/ngx-codemirror",
|
16
16
|
"homepage": "https://github.com/scttcper/ngx-codemirror",
|
17
|
-
"bugs": "https://github.com/scttcper/ngx-codemirror/issues",
|
18
17
|
"keywords": [
|
19
18
|
"ngx",
|
20
19
|
"angular",
|
21
20
|
"codemirror"
|
22
21
|
],
|
23
|
-
"
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
"release": {
|
23
|
+
"branches": [
|
24
|
+
"master"
|
25
|
+
]
|
26
|
+
},
|
27
|
+
"publishConfig": {
|
28
|
+
"access": "public",
|
29
|
+
"provenance": true
|
30
|
+
},
|
31
|
+
"module": "fesm2022/ctrl-ngx-codemirror.mjs",
|
28
32
|
"typings": "index.d.ts",
|
29
33
|
"exports": {
|
30
34
|
"./package.json": {
|
@@ -32,11 +36,9 @@
|
|
32
36
|
},
|
33
37
|
".": {
|
34
38
|
"types": "./index.d.ts",
|
35
|
-
"
|
36
|
-
"
|
37
|
-
"
|
38
|
-
"node": "./fesm2015/ctrl-ngx-codemirror.mjs",
|
39
|
-
"default": "./fesm2020/ctrl-ngx-codemirror.mjs"
|
39
|
+
"esm2022": "./esm2022/ctrl-ngx-codemirror.mjs",
|
40
|
+
"esm": "./esm2022/ctrl-ngx-codemirror.mjs",
|
41
|
+
"default": "./fesm2022/ctrl-ngx-codemirror.mjs"
|
40
42
|
}
|
41
43
|
},
|
42
44
|
"sideEffects": false
|
@@ -1,227 +0,0 @@
|
|
1
|
-
import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, Output, ViewChild, } from '@angular/core';
|
2
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
3
|
-
import * as i0 from "@angular/core";
|
4
|
-
function normalizeLineEndings(str) {
|
5
|
-
if (!str) {
|
6
|
-
return str;
|
7
|
-
}
|
8
|
-
return str.replace(/\r\n|\r/g, '\n');
|
9
|
-
}
|
10
|
-
export class CodemirrorComponent {
|
11
|
-
constructor(_differs, _ngZone) {
|
12
|
-
this._differs = _differs;
|
13
|
-
this._ngZone = _ngZone;
|
14
|
-
/* class applied to the created textarea */
|
15
|
-
this.className = '';
|
16
|
-
/* name applied to the created textarea */
|
17
|
-
this.name = 'codemirror';
|
18
|
-
/* autofocus setting applied to the created textarea */
|
19
|
-
this.autoFocus = false;
|
20
|
-
/* preserve previous scroll position after updating value */
|
21
|
-
this.preserveScrollPosition = false;
|
22
|
-
/* called when the text cursor is moved */
|
23
|
-
this.cursorActivity = new EventEmitter();
|
24
|
-
/* called when the editor is focused or loses focus */
|
25
|
-
this.focusChange = new EventEmitter();
|
26
|
-
/* called when the editor is scrolled */
|
27
|
-
// eslint-disable-next-line @angular-eslint/no-output-native
|
28
|
-
this.scroll = new EventEmitter();
|
29
|
-
/* called when file(s) are dropped */
|
30
|
-
// eslint-disable-next-line @angular-eslint/no-output-native
|
31
|
-
this.drop = new EventEmitter();
|
32
|
-
/* called when codeMirror instance is initiated on the component */
|
33
|
-
this.codeMirrorLoaded = new EventEmitter();
|
34
|
-
this.value = '';
|
35
|
-
this.disabled = false;
|
36
|
-
this.isFocused = false;
|
37
|
-
/** Implemented as part of ControlValueAccessor. */
|
38
|
-
this.onChange = (_) => { };
|
39
|
-
/** Implemented as part of ControlValueAccessor. */
|
40
|
-
this.onTouched = () => { };
|
41
|
-
}
|
42
|
-
/**
|
43
|
-
* set options for codemirror
|
44
|
-
* @link http://codemirror.net/doc/manual.html#config
|
45
|
-
*/
|
46
|
-
set options(value) {
|
47
|
-
this._options = value;
|
48
|
-
if (!this._differ && value) {
|
49
|
-
this._differ = this._differs.find(value).create();
|
50
|
-
}
|
51
|
-
}
|
52
|
-
get codeMirrorGlobal() {
|
53
|
-
if (this._codeMirror) {
|
54
|
-
return this._codeMirror;
|
55
|
-
}
|
56
|
-
// in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors
|
57
|
-
this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : import('codemirror');
|
58
|
-
return this._codeMirror;
|
59
|
-
}
|
60
|
-
ngAfterViewInit() {
|
61
|
-
this._ngZone.runOutsideAngular(async () => {
|
62
|
-
const codeMirrorObj = await this.codeMirrorGlobal;
|
63
|
-
const codeMirror = codeMirrorObj?.default ? codeMirrorObj.default : codeMirrorObj;
|
64
|
-
this.codeMirror = codeMirror.fromTextArea(this.ref.nativeElement, this._options);
|
65
|
-
this.codeMirror.on('cursorActivity', cm => this._ngZone.run(() => this.cursorActive(cm)));
|
66
|
-
this.codeMirror.on('scroll', this.scrollChanged.bind(this));
|
67
|
-
this.codeMirror.on('blur', () => this._ngZone.run(() => this.focusChanged(false)));
|
68
|
-
this.codeMirror.on('focus', () => this._ngZone.run(() => this.focusChanged(true)));
|
69
|
-
this.codeMirror.on('change', (cm, change) => this._ngZone.run(() => this.codemirrorValueChanged(cm, change)));
|
70
|
-
this.codeMirror.on('drop', (cm, e) => {
|
71
|
-
this._ngZone.run(() => this.dropFiles(cm, e));
|
72
|
-
});
|
73
|
-
this.codeMirror.setValue(this.value);
|
74
|
-
this.codeMirrorLoaded.emit(this);
|
75
|
-
});
|
76
|
-
}
|
77
|
-
ngDoCheck() {
|
78
|
-
if (!this._differ) {
|
79
|
-
return;
|
80
|
-
}
|
81
|
-
// check options have not changed
|
82
|
-
const changes = this._differ.diff(this._options);
|
83
|
-
if (changes) {
|
84
|
-
changes.forEachChangedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
85
|
-
changes.forEachAddedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
86
|
-
changes.forEachRemovedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
87
|
-
}
|
88
|
-
}
|
89
|
-
ngOnDestroy() {
|
90
|
-
// is there a lighter-weight way to remove the cm instance?
|
91
|
-
if (this.codeMirror) {
|
92
|
-
this.codeMirror.toTextArea();
|
93
|
-
}
|
94
|
-
}
|
95
|
-
codemirrorValueChanged(cm, change) {
|
96
|
-
const cmVal = cm.getValue();
|
97
|
-
if (this.value !== cmVal) {
|
98
|
-
this.value = cmVal;
|
99
|
-
this.onChange(this.value);
|
100
|
-
}
|
101
|
-
}
|
102
|
-
setOptionIfChanged(optionName, newValue) {
|
103
|
-
if (!this.codeMirror) {
|
104
|
-
return;
|
105
|
-
}
|
106
|
-
// cast to any to handle strictly typed option names
|
107
|
-
// could possibly import settings strings available in the future
|
108
|
-
this.codeMirror.setOption(optionName, newValue);
|
109
|
-
}
|
110
|
-
focusChanged(focused) {
|
111
|
-
this.onTouched();
|
112
|
-
this.isFocused = focused;
|
113
|
-
this.focusChange.emit(focused);
|
114
|
-
}
|
115
|
-
scrollChanged(cm) {
|
116
|
-
this.scroll.emit(cm.getScrollInfo());
|
117
|
-
}
|
118
|
-
cursorActive(cm) {
|
119
|
-
this.cursorActivity.emit(cm);
|
120
|
-
}
|
121
|
-
dropFiles(cm, e) {
|
122
|
-
this.drop.emit([cm, e]);
|
123
|
-
}
|
124
|
-
/** Implemented as part of ControlValueAccessor. */
|
125
|
-
writeValue(value) {
|
126
|
-
if (value === null || value === undefined) {
|
127
|
-
return;
|
128
|
-
}
|
129
|
-
if (!this.codeMirror) {
|
130
|
-
this.value = value;
|
131
|
-
return;
|
132
|
-
}
|
133
|
-
const cur = this.codeMirror.getValue();
|
134
|
-
if (value !== cur && normalizeLineEndings(cur) !== normalizeLineEndings(value)) {
|
135
|
-
this.value = value;
|
136
|
-
if (this.preserveScrollPosition) {
|
137
|
-
const prevScrollPosition = this.codeMirror.getScrollInfo();
|
138
|
-
this.codeMirror.setValue(this.value);
|
139
|
-
this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top);
|
140
|
-
}
|
141
|
-
else {
|
142
|
-
this.codeMirror.setValue(this.value);
|
143
|
-
}
|
144
|
-
}
|
145
|
-
}
|
146
|
-
/** Implemented as part of ControlValueAccessor. */
|
147
|
-
registerOnChange(fn) {
|
148
|
-
this.onChange = fn;
|
149
|
-
}
|
150
|
-
/** Implemented as part of ControlValueAccessor. */
|
151
|
-
registerOnTouched(fn) {
|
152
|
-
this.onTouched = fn;
|
153
|
-
}
|
154
|
-
/** Implemented as part of ControlValueAccessor. */
|
155
|
-
setDisabledState(isDisabled) {
|
156
|
-
this.disabled = isDisabled;
|
157
|
-
this.setOptionIfChanged('readOnly', this.disabled);
|
158
|
-
}
|
159
|
-
}
|
160
|
-
CodemirrorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
161
|
-
CodemirrorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: CodemirrorComponent, selector: "ngx-codemirror", inputs: { className: "className", name: "name", autoFocus: "autoFocus", options: "options", preserveScrollPosition: "preserveScrollPosition" }, outputs: { cursorActivity: "cursorActivity", focusChange: "focusChange", scroll: "scroll", drop: "drop", codeMirrorLoaded: "codeMirrorLoaded" }, providers: [
|
162
|
-
{
|
163
|
-
provide: NG_VALUE_ACCESSOR,
|
164
|
-
useExisting: forwardRef(() => CodemirrorComponent),
|
165
|
-
multi: true,
|
166
|
-
},
|
167
|
-
], viewQueries: [{ propertyName: "ref", first: true, predicate: ["ref"], descendants: true }], ngImport: i0, template: `
|
168
|
-
<textarea
|
169
|
-
[name]="name"
|
170
|
-
class="ngx-codemirror {{ className }}"
|
171
|
-
[class.ngx-codemirror--focused]="isFocused"
|
172
|
-
autocomplete="off"
|
173
|
-
[autofocus]="autoFocus"
|
174
|
-
#ref
|
175
|
-
>
|
176
|
-
</textarea>
|
177
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
178
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorComponent, decorators: [{
|
179
|
-
type: Component,
|
180
|
-
args: [{
|
181
|
-
selector: 'ngx-codemirror',
|
182
|
-
template: `
|
183
|
-
<textarea
|
184
|
-
[name]="name"
|
185
|
-
class="ngx-codemirror {{ className }}"
|
186
|
-
[class.ngx-codemirror--focused]="isFocused"
|
187
|
-
autocomplete="off"
|
188
|
-
[autofocus]="autoFocus"
|
189
|
-
#ref
|
190
|
-
>
|
191
|
-
</textarea>
|
192
|
-
`,
|
193
|
-
providers: [
|
194
|
-
{
|
195
|
-
provide: NG_VALUE_ACCESSOR,
|
196
|
-
useExisting: forwardRef(() => CodemirrorComponent),
|
197
|
-
multi: true,
|
198
|
-
},
|
199
|
-
],
|
200
|
-
preserveWhitespaces: false,
|
201
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
202
|
-
}]
|
203
|
-
}], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i0.NgZone }]; }, propDecorators: { className: [{
|
204
|
-
type: Input
|
205
|
-
}], name: [{
|
206
|
-
type: Input
|
207
|
-
}], autoFocus: [{
|
208
|
-
type: Input
|
209
|
-
}], options: [{
|
210
|
-
type: Input
|
211
|
-
}], preserveScrollPosition: [{
|
212
|
-
type: Input
|
213
|
-
}], cursorActivity: [{
|
214
|
-
type: Output
|
215
|
-
}], focusChange: [{
|
216
|
-
type: Output
|
217
|
-
}], scroll: [{
|
218
|
-
type: Output
|
219
|
-
}], drop: [{
|
220
|
-
type: Output
|
221
|
-
}], codeMirrorLoaded: [{
|
222
|
-
type: Output
|
223
|
-
}], ref: [{
|
224
|
-
type: ViewChild,
|
225
|
-
args: ['ref']
|
226
|
-
}] } });
|
227
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2NvZGVtaXJyb3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUdULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUtMLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUd6RSxTQUFTLG9CQUFvQixDQUFDLEdBQVc7SUFDdkMsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFDRCxPQUFPLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUE0QkQsTUFBTSxPQUFPLG1CQUFtQjtJQStDOUIsWUFBb0IsUUFBeUIsRUFBVSxPQUFlO1FBQWxELGFBQVEsR0FBUixRQUFRLENBQWlCO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQTVDdEUsMkNBQTJDO1FBQ2xDLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFDeEIsMENBQTBDO1FBQ2pDLFNBQUksR0FBRyxZQUFZLENBQUM7UUFDN0IsdURBQXVEO1FBQzlDLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFZM0IsNERBQTREO1FBQ25ELDJCQUFzQixHQUFHLEtBQUssQ0FBQztRQUN4QywwQ0FBMEM7UUFDaEMsbUJBQWMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3RELHNEQUFzRDtRQUM1QyxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDcEQsd0NBQXdDO1FBQ3hDLDREQUE0RDtRQUNsRCxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQWMsQ0FBQztRQUNsRCxxQ0FBcUM7UUFDckMsNERBQTREO1FBQ2xELFNBQUksR0FBRyxJ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SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgS2V5VmFsdWVEaWZmZXIsXG4gIEtleVZhbHVlRGlmZmVycyxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEVkaXRvciwgRWRpdG9yQ2hhbmdlLCBFZGl0b3JGcm9tVGV4dEFyZWEsIFNjcm9sbEluZm8gfSBmcm9tICdjb2RlbWlycm9yJztcblxuZnVuY3Rpb24gbm9ybWFsaXplTGluZUVuZGluZ3Moc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHJcXG58XFxyL2csICdcXG4nKTtcbn1cblxuZGVjbGFyZSB2YXIgcmVxdWlyZTogYW55O1xuZGVjbGFyZSB2YXIgQ29kZU1pcnJvcjogYW55O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtY29kZW1pcnJvcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHRleHRhcmVhXG4gICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgIGNsYXNzPVwibmd4LWNvZGVtaXJyb3Ige3sgY2xhc3NOYW1lIH19XCJcbiAgICAgIFtjbGFzcy5uZ3gtY29kZW1pcnJvci0tZm9jdXNlZF09XCJpc0ZvY3VzZWRcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIFthdXRvZm9jdXNdPVwiYXV0b0ZvY3VzXCJcbiAgICAgICNyZWZcbiAgICA+XG4gICAgPC90ZXh0YXJlYT5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb2RlbWlycm9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ29kZW1pcnJvckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIERvQ2hlY2tcbntcbiAgLyogY2xhc3MgYXBwbGllZCB0byB0aGUgY3JlYXRlZCB0ZXh0YXJlYSAqL1xuICBASW5wdXQoKSBjbGFzc05hbWUgPSAnJztcbiAgLyogbmFtZSBhcHBsaWVkIHRvIHRoZSBjcmVhdGVkIHRleHRhcmVhICovXG4gIEBJbnB1dCgpIG5hbWUgPSAnY29kZW1pcnJvcic7XG4gIC8qIGF1dG9mb2N1cyBzZXR0aW5nIGFwcGxpZWQgdG8gdGhlIGNyZWF0ZWQgdGV4dGFyZWEgKi9cbiAgQElucHV0KCkgYXV0b0ZvY3VzID0gZmFsc2U7XG4gIC8qKlxuICAgKiBzZXQgb3B0aW9ucyBmb3IgY29kZW1pcnJvclxuICAgKiBAbGluayBodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2NvbmZpZ1xuICAgKi9cbiAgQElucHV0KClcbiAgc2V0IG9wdGlvbnModmFsdWU6IHsgW2tleTogc3RyaW5nXTogYW55IH0pIHtcbiAgICB0aGlzLl9vcHRpb25zID0gdmFsdWU7XG4gICAgaWYgKCF0aGlzLl9kaWZmZXIgJiYgdmFsdWUpIHtcbiAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2RpZmZlcnMuZmluZCh2YWx1ZSkuY3JlYXRlKCk7XG4gICAgfVxuICB9XG4gIC8qIHByZXNlcnZlIHByZXZpb3VzIHNjcm9sbCBwb3NpdGlvbiBhZnRlciB1cGRhdGluZyB2YWx1ZSAqL1xuICBASW5wdXQoKSBwcmVzZXJ2ZVNjcm9sbFBvc2l0aW9uID0gZmFsc2U7XG4gIC8qIGNhbGxlZCB3aGVuIHRoZSB0ZXh0IGN1cnNvciBpcyBtb3ZlZCAqL1xuICBAT3V0cHV0KCkgY3Vyc29yQWN0aXZpdHkgPSBuZXcgRXZlbnRFbWl0dGVyPEVkaXRvcj4oKTtcbiAgLyogY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBmb2N1c2VkIG9yIGxvc2VzIGZvY3VzICovXG4gIEBPdXRwdXQoKSBmb2N1c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgLyogY2FsbGVkIHdoZW4gdGhlIGVkaXRvciBpcyBzY3JvbGxlZCAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpIHNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8U2Nyb2xsSW5mbz4oKTtcbiAgLyogY2FsbGVkIHdoZW4gZmlsZShzKSBhcmUgZHJvcHBlZCAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpIGRyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPFtFZGl0b3IsIERyYWdFdmVudF0+KCk7XG4gIC8qIGNhbGxlZCB3aGVuIGNvZGVNaXJyb3IgaW5zdGFuY2UgaXMgaW5pdGlhdGVkIG9uIHRoZSBjb21wb25lbnQgKi9cbiAgQE91dHB1dCgpIGNvZGVNaXJyb3JMb2FkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPENvZGVtaXJyb3JDb21wb25lbnQ+KCk7XG4gIEBWaWV3Q2hpbGQoJ3JlZicpIHJlZiE6IEVsZW1lbnRSZWY8SFRNTFRleHRBcmVhRWxlbWVudD47XG4gIHZhbHVlID0gJyc7XG4gIGRpc2FibGVkID0gZmFsc2U7XG4gIGlzRm9jdXNlZCA9IGZhbHNlO1xuICBjb2RlTWlycm9yPzogRWRpdG9yRnJvbVRleHRBcmVhO1xuICAvKipcbiAgICogZWl0aGVyIGdsb2JhbCB2YXJpYWJsZSBvciByZXF1aXJlZCBsaWJyYXJ5XG4gICAqL1xuICBwcml2YXRlIF9jb2RlTWlycm9yOiBhbnk7XG5cbiAgcHJpdmF0ZSBfZGlmZmVyPzogS2V5VmFsdWVEaWZmZXI8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIF9vcHRpb25zOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlmZmVyczogS2V5VmFsdWVEaWZmZXJzLCBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSkge31cblxuICBnZXQgY29kZU1pcnJvckdsb2JhbCgpOiBhbnkge1xuICAgIGlmICh0aGlzLl9jb2RlTWlycm9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29kZU1pcnJvcjtcbiAgICB9XG5cbiAgICAvLyBpbiBvcmRlciB0byBhbGxvdyBmb3IgdW5pdmVyc2FsIHJlbmRlcmluZywgd2UgaW1wb3J0IENvZGVtaXJyb3IgcnVudGltZSB3aXRoIGByZXF1aXJlYCB0byBwcmV2ZW50IG5vZGUgZXJyb3JzXG4gICAgdGhpcy5fY29kZU1pcnJvciA9IHR5cGVvZiBDb2RlTWlycm9yICE9PSAndW5kZWZpbmVkJyA/IENvZGVNaXJyb3IgOiBpbXBvcnQoJ2NvZGVtaXJyb3InKTtcbiAgICByZXR1cm4gdGhpcy5fY29kZU1pcnJvcjtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgY29kZU1pcnJvck9iaiA9IGF3YWl0IHRoaXMuY29kZU1pcnJvckdsb2JhbDtcbiAgICAgIGNvbnN0IGNvZGVNaXJyb3IgPSBjb2RlTWlycm9yT2JqPy5kZWZhdWx0ID8gY29kZU1pcnJvck9iai5kZWZhdWx0IDogY29kZU1pcnJvck9iajtcbiAgICAgIHRoaXMuY29kZU1pcnJvciA9IGNvZGVNaXJyb3IuZnJvbVRleHRBcmVhKFxuICAgICAgICB0aGlzLnJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICB0aGlzLl9vcHRpb25zLFxuICAgICAgKSBhcyBFZGl0b3JGcm9tVGV4dEFyZWE7XG4gICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ2N1cnNvckFjdGl2aXR5JywgY20gPT4gdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmN1cnNvckFjdGl2ZShjbSkpKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5vbignc2Nyb2xsJywgdGhpcy5zY3JvbGxDaGFuZ2VkLmJpbmQodGhpcykpO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKCdibHVyJywgKCkgPT4gdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmZvY3VzQ2hhbmdlZChmYWxzZSkpKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5vbignZm9jdXMnLCAoKSA9PiB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuZm9jdXNDaGFuZ2VkKHRydWUpKSk7XG4gICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ2NoYW5nZScsIChjbSwgY2hhbmdlKSA9PlxuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuY29kZW1pcnJvclZhbHVlQ2hhbmdlZChjbSwgY2hhbmdlKSksXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKCdkcm9wJywgKGNtLCBlKSA9PiB7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5kcm9wRmlsZXMoY20sIGUpKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLnNldFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgdGhpcy5jb2RlTWlycm9yTG9hZGVkLmVtaXQodGhpcyk7XG4gICAgfSk7XG4gIH1cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmICghdGhpcy5fZGlmZmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGNoZWNrIG9wdGlvbnMgaGF2ZSBub3QgY2hhbmdlZFxuICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9vcHRpb25zKTtcbiAgICBpZiAoY2hhbmdlcykge1xuICAgICAgY2hhbmdlcy5mb3JFYWNoQ2hhbmdlZEl0ZW0ob3B0aW9uID0+XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uSWZDaGFuZ2VkKG9wdGlvbi5rZXksIG9wdGlvbi5jdXJyZW50VmFsdWUpLFxuICAgICAgKTtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbShvcHRpb24gPT4gdGhpcy5zZXRPcHRpb25JZkNoYW5nZWQob3B0aW9uLmtleSwgb3B0aW9uLmN1cnJlbnRWYWx1ZSkpO1xuICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0ob3B0aW9uID0+XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uSWZDaGFuZ2VkKG9wdGlvbi5rZXksIG9wdGlvbi5jdXJyZW50VmFsdWUpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgLy8gaXMgdGhlcmUgYSBsaWdodGVyLXdlaWdodCB3YXkgdG8gcmVtb3ZlIHRoZSBjbSBpbnN0YW5jZT9cbiAgICBpZiAodGhpcy5jb2RlTWlycm9yKSB7XG4gICAgICB0aGlzLmNvZGVNaXJyb3IudG9UZXh0QXJlYSgpO1xuICAgIH1cbiAgfVxuICBjb2RlbWlycm9yVmFsdWVDaGFuZ2VkKGNtOiBFZGl0b3IsIGNoYW5nZTogRWRpdG9yQ2hhbmdlKSB7XG4gICAgY29uc3QgY21WYWwgPSBjbS5nZXRWYWx1ZSgpO1xuICAgIGlmICh0aGlzLnZhbHVlICE9PSBjbVZhbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IGNtVmFsO1xuICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gIH1cbiAgc2V0T3B0aW9uSWZDaGFuZ2VkKG9wdGlvbk5hbWU6IHN0cmluZywgbmV3VmFsdWU6IGFueSkge1xuICAgIGlmICghdGhpcy5jb2RlTWlycm9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gY2FzdCB0byBhbnkgdG8gaGFuZGxlIHN0cmljdGx5IHR5cGVkIG9wdGlvbiBuYW1lc1xuICAgIC8vIGNvdWxkIHBvc3NpYmx5IGltcG9ydCBzZXR0aW5ncyBzdHJpbmdzIGF2YWlsYWJsZSBpbiB0aGUgZnV0dXJlXG4gICAgdGhpcy5jb2RlTWlycm9yLnNldE9wdGlvbihvcHRpb25OYW1lIGFzIGFueSwgbmV3VmFsdWUpO1xuICB9XG4gIGZvY3VzQ2hhbmdlZChmb2N1c2VkOiBib29sZWFuKSB7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLmlzRm9jdXNlZCA9IGZvY3VzZWQ7XG4gICAgdGhpcy5mb2N1c0NoYW5nZS5lbWl0KGZvY3VzZWQpO1xuICB9XG4gIHNjcm9sbENoYW5nZWQoY206IEVkaXRvcikge1xuICAgIHRoaXMuc2Nyb2xsLmVtaXQoY20uZ2V0U2Nyb2xsSW5mbygpKTtcbiAgfVxuICBjdXJzb3JBY3RpdmUoY206IEVkaXRvcikge1xuICAgIHRoaXMuY3Vyc29yQWN0aXZpdHkuZW1pdChjbSk7XG4gIH1cbiAgZHJvcEZpbGVzKGNtOiBFZGl0b3IsIGU6IERyYWdFdmVudCkge1xuICAgIHRoaXMuZHJvcC5lbWl0KFtjbSwgZV0pO1xuICB9XG4gIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY29kZU1pcnJvcikge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjdXIgPSB0aGlzLmNvZGVNaXJyb3IuZ2V0VmFsdWUoKTtcbiAgICBpZiAodmFsdWUgIT09IGN1ciAmJiBub3JtYWxpemVMaW5lRW5kaW5ncyhjdXIpICE9PSBub3JtYWxpemVMaW5lRW5kaW5ncyh2YWx1ZSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLnByZXNlcnZlU2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgY29uc3QgcHJldlNjcm9sbFBvc2l0aW9uID0gdGhpcy5jb2RlTWlycm9yLmdldFNjcm9sbEluZm8oKTtcbiAgICAgICAgdGhpcy5jb2RlTWlycm9yLnNldFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgICB0aGlzLmNvZGVNaXJyb3Iuc2Nyb2xsVG8ocHJldlNjcm9sbFBvc2l0aW9uLmxlZnQsIHByZXZTY3JvbGxQb3NpdGlvbi50b3ApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb2RlTWlycm9yLnNldFZhbHVlKHRoaXMudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG4gIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB0aGlzLnNldE9wdGlvbklmQ2hhbmdlZCgncmVhZE9ubHknLCB0aGlzLmRpc2FibGVkKTtcbiAgfVxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiB7fTtcbn1cbiJdfQ==
|
@@ -1,16 +0,0 @@
|
|
1
|
-
import { NgModule } from '@angular/core';
|
2
|
-
import { CodemirrorComponent } from './codemirror.component';
|
3
|
-
import * as i0 from "@angular/core";
|
4
|
-
export class CodemirrorModule {
|
5
|
-
}
|
6
|
-
CodemirrorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
7
|
-
CodemirrorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule, declarations: [CodemirrorComponent], exports: [CodemirrorComponent] });
|
8
|
-
CodemirrorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule });
|
9
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule, decorators: [{
|
10
|
-
type: NgModule,
|
11
|
-
args: [{
|
12
|
-
exports: [CodemirrorComponent],
|
13
|
-
declarations: [CodemirrorComponent],
|
14
|
-
}]
|
15
|
-
}] });
|
16
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2NvZGVtaXJyb3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7O0FBTTdELE1BQU0sT0FBTyxnQkFBZ0I7OzZHQUFoQixnQkFBZ0I7OEdBQWhCLGdCQUFnQixpQkFGWixtQkFBbUIsYUFEeEIsbUJBQW1COzhHQUdsQixnQkFBZ0I7MkZBQWhCLGdCQUFnQjtrQkFKNUIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztvQkFDOUIsWUFBWSxFQUFFLENBQUMsbUJBQW1CLENBQUM7aUJBQ3BDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ29kZW1pcnJvckNvbXBvbmVudCB9IGZyb20gJy4vY29kZW1pcnJvci5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBleHBvcnRzOiBbQ29kZW1pcnJvckNvbXBvbmVudF0sXG4gIGRlY2xhcmF0aW9uczogW0NvZGVtaXJyb3JDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBDb2RlbWlycm9yTW9kdWxlIHt9XG4iXX0=
|
@@ -1,248 +0,0 @@
|
|
1
|
-
import { __awaiter } from 'tslib';
|
2
|
-
import * as i0 from '@angular/core';
|
3
|
-
import { EventEmitter, forwardRef, Component, ChangeDetectionStrategy, Input, Output, ViewChild, NgModule } from '@angular/core';
|
4
|
-
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
5
|
-
|
6
|
-
function normalizeLineEndings(str) {
|
7
|
-
if (!str) {
|
8
|
-
return str;
|
9
|
-
}
|
10
|
-
return str.replace(/\r\n|\r/g, '\n');
|
11
|
-
}
|
12
|
-
class CodemirrorComponent {
|
13
|
-
constructor(_differs, _ngZone) {
|
14
|
-
this._differs = _differs;
|
15
|
-
this._ngZone = _ngZone;
|
16
|
-
/* class applied to the created textarea */
|
17
|
-
this.className = '';
|
18
|
-
/* name applied to the created textarea */
|
19
|
-
this.name = 'codemirror';
|
20
|
-
/* autofocus setting applied to the created textarea */
|
21
|
-
this.autoFocus = false;
|
22
|
-
/* preserve previous scroll position after updating value */
|
23
|
-
this.preserveScrollPosition = false;
|
24
|
-
/* called when the text cursor is moved */
|
25
|
-
this.cursorActivity = new EventEmitter();
|
26
|
-
/* called when the editor is focused or loses focus */
|
27
|
-
this.focusChange = new EventEmitter();
|
28
|
-
/* called when the editor is scrolled */
|
29
|
-
// eslint-disable-next-line @angular-eslint/no-output-native
|
30
|
-
this.scroll = new EventEmitter();
|
31
|
-
/* called when file(s) are dropped */
|
32
|
-
// eslint-disable-next-line @angular-eslint/no-output-native
|
33
|
-
this.drop = new EventEmitter();
|
34
|
-
/* called when codeMirror instance is initiated on the component */
|
35
|
-
this.codeMirrorLoaded = new EventEmitter();
|
36
|
-
this.value = '';
|
37
|
-
this.disabled = false;
|
38
|
-
this.isFocused = false;
|
39
|
-
/** Implemented as part of ControlValueAccessor. */
|
40
|
-
this.onChange = (_) => { };
|
41
|
-
/** Implemented as part of ControlValueAccessor. */
|
42
|
-
this.onTouched = () => { };
|
43
|
-
}
|
44
|
-
/**
|
45
|
-
* set options for codemirror
|
46
|
-
* @link http://codemirror.net/doc/manual.html#config
|
47
|
-
*/
|
48
|
-
set options(value) {
|
49
|
-
this._options = value;
|
50
|
-
if (!this._differ && value) {
|
51
|
-
this._differ = this._differs.find(value).create();
|
52
|
-
}
|
53
|
-
}
|
54
|
-
get codeMirrorGlobal() {
|
55
|
-
if (this._codeMirror) {
|
56
|
-
return this._codeMirror;
|
57
|
-
}
|
58
|
-
// in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors
|
59
|
-
this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : import('codemirror');
|
60
|
-
return this._codeMirror;
|
61
|
-
}
|
62
|
-
ngAfterViewInit() {
|
63
|
-
this._ngZone.runOutsideAngular(() => __awaiter(this, void 0, void 0, function* () {
|
64
|
-
const codeMirrorObj = yield this.codeMirrorGlobal;
|
65
|
-
const codeMirror = (codeMirrorObj === null || codeMirrorObj === void 0 ? void 0 : codeMirrorObj.default) ? codeMirrorObj.default : codeMirrorObj;
|
66
|
-
this.codeMirror = codeMirror.fromTextArea(this.ref.nativeElement, this._options);
|
67
|
-
this.codeMirror.on('cursorActivity', cm => this._ngZone.run(() => this.cursorActive(cm)));
|
68
|
-
this.codeMirror.on('scroll', this.scrollChanged.bind(this));
|
69
|
-
this.codeMirror.on('blur', () => this._ngZone.run(() => this.focusChanged(false)));
|
70
|
-
this.codeMirror.on('focus', () => this._ngZone.run(() => this.focusChanged(true)));
|
71
|
-
this.codeMirror.on('change', (cm, change) => this._ngZone.run(() => this.codemirrorValueChanged(cm, change)));
|
72
|
-
this.codeMirror.on('drop', (cm, e) => {
|
73
|
-
this._ngZone.run(() => this.dropFiles(cm, e));
|
74
|
-
});
|
75
|
-
this.codeMirror.setValue(this.value);
|
76
|
-
this.codeMirrorLoaded.emit(this);
|
77
|
-
}));
|
78
|
-
}
|
79
|
-
ngDoCheck() {
|
80
|
-
if (!this._differ) {
|
81
|
-
return;
|
82
|
-
}
|
83
|
-
// check options have not changed
|
84
|
-
const changes = this._differ.diff(this._options);
|
85
|
-
if (changes) {
|
86
|
-
changes.forEachChangedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
87
|
-
changes.forEachAddedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
88
|
-
changes.forEachRemovedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
|
89
|
-
}
|
90
|
-
}
|
91
|
-
ngOnDestroy() {
|
92
|
-
// is there a lighter-weight way to remove the cm instance?
|
93
|
-
if (this.codeMirror) {
|
94
|
-
this.codeMirror.toTextArea();
|
95
|
-
}
|
96
|
-
}
|
97
|
-
codemirrorValueChanged(cm, change) {
|
98
|
-
const cmVal = cm.getValue();
|
99
|
-
if (this.value !== cmVal) {
|
100
|
-
this.value = cmVal;
|
101
|
-
this.onChange(this.value);
|
102
|
-
}
|
103
|
-
}
|
104
|
-
setOptionIfChanged(optionName, newValue) {
|
105
|
-
if (!this.codeMirror) {
|
106
|
-
return;
|
107
|
-
}
|
108
|
-
// cast to any to handle strictly typed option names
|
109
|
-
// could possibly import settings strings available in the future
|
110
|
-
this.codeMirror.setOption(optionName, newValue);
|
111
|
-
}
|
112
|
-
focusChanged(focused) {
|
113
|
-
this.onTouched();
|
114
|
-
this.isFocused = focused;
|
115
|
-
this.focusChange.emit(focused);
|
116
|
-
}
|
117
|
-
scrollChanged(cm) {
|
118
|
-
this.scroll.emit(cm.getScrollInfo());
|
119
|
-
}
|
120
|
-
cursorActive(cm) {
|
121
|
-
this.cursorActivity.emit(cm);
|
122
|
-
}
|
123
|
-
dropFiles(cm, e) {
|
124
|
-
this.drop.emit([cm, e]);
|
125
|
-
}
|
126
|
-
/** Implemented as part of ControlValueAccessor. */
|
127
|
-
writeValue(value) {
|
128
|
-
if (value === null || value === undefined) {
|
129
|
-
return;
|
130
|
-
}
|
131
|
-
if (!this.codeMirror) {
|
132
|
-
this.value = value;
|
133
|
-
return;
|
134
|
-
}
|
135
|
-
const cur = this.codeMirror.getValue();
|
136
|
-
if (value !== cur && normalizeLineEndings(cur) !== normalizeLineEndings(value)) {
|
137
|
-
this.value = value;
|
138
|
-
if (this.preserveScrollPosition) {
|
139
|
-
const prevScrollPosition = this.codeMirror.getScrollInfo();
|
140
|
-
this.codeMirror.setValue(this.value);
|
141
|
-
this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top);
|
142
|
-
}
|
143
|
-
else {
|
144
|
-
this.codeMirror.setValue(this.value);
|
145
|
-
}
|
146
|
-
}
|
147
|
-
}
|
148
|
-
/** Implemented as part of ControlValueAccessor. */
|
149
|
-
registerOnChange(fn) {
|
150
|
-
this.onChange = fn;
|
151
|
-
}
|
152
|
-
/** Implemented as part of ControlValueAccessor. */
|
153
|
-
registerOnTouched(fn) {
|
154
|
-
this.onTouched = fn;
|
155
|
-
}
|
156
|
-
/** Implemented as part of ControlValueAccessor. */
|
157
|
-
setDisabledState(isDisabled) {
|
158
|
-
this.disabled = isDisabled;
|
159
|
-
this.setOptionIfChanged('readOnly', this.disabled);
|
160
|
-
}
|
161
|
-
}
|
162
|
-
CodemirrorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorComponent, deps: [{ token: i0.KeyValueDiffers }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
163
|
-
CodemirrorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.2", type: CodemirrorComponent, selector: "ngx-codemirror", inputs: { className: "className", name: "name", autoFocus: "autoFocus", options: "options", preserveScrollPosition: "preserveScrollPosition" }, outputs: { cursorActivity: "cursorActivity", focusChange: "focusChange", scroll: "scroll", drop: "drop", codeMirrorLoaded: "codeMirrorLoaded" }, providers: [
|
164
|
-
{
|
165
|
-
provide: NG_VALUE_ACCESSOR,
|
166
|
-
useExisting: forwardRef(() => CodemirrorComponent),
|
167
|
-
multi: true,
|
168
|
-
},
|
169
|
-
], viewQueries: [{ propertyName: "ref", first: true, predicate: ["ref"], descendants: true }], ngImport: i0, template: `
|
170
|
-
<textarea
|
171
|
-
[name]="name"
|
172
|
-
class="ngx-codemirror {{ className }}"
|
173
|
-
[class.ngx-codemirror--focused]="isFocused"
|
174
|
-
autocomplete="off"
|
175
|
-
[autofocus]="autoFocus"
|
176
|
-
#ref
|
177
|
-
>
|
178
|
-
</textarea>
|
179
|
-
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
180
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorComponent, decorators: [{
|
181
|
-
type: Component,
|
182
|
-
args: [{
|
183
|
-
selector: 'ngx-codemirror',
|
184
|
-
template: `
|
185
|
-
<textarea
|
186
|
-
[name]="name"
|
187
|
-
class="ngx-codemirror {{ className }}"
|
188
|
-
[class.ngx-codemirror--focused]="isFocused"
|
189
|
-
autocomplete="off"
|
190
|
-
[autofocus]="autoFocus"
|
191
|
-
#ref
|
192
|
-
>
|
193
|
-
</textarea>
|
194
|
-
`,
|
195
|
-
providers: [
|
196
|
-
{
|
197
|
-
provide: NG_VALUE_ACCESSOR,
|
198
|
-
useExisting: forwardRef(() => CodemirrorComponent),
|
199
|
-
multi: true,
|
200
|
-
},
|
201
|
-
],
|
202
|
-
preserveWhitespaces: false,
|
203
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
204
|
-
}]
|
205
|
-
}], ctorParameters: function () { return [{ type: i0.KeyValueDiffers }, { type: i0.NgZone }]; }, propDecorators: { className: [{
|
206
|
-
type: Input
|
207
|
-
}], name: [{
|
208
|
-
type: Input
|
209
|
-
}], autoFocus: [{
|
210
|
-
type: Input
|
211
|
-
}], options: [{
|
212
|
-
type: Input
|
213
|
-
}], preserveScrollPosition: [{
|
214
|
-
type: Input
|
215
|
-
}], cursorActivity: [{
|
216
|
-
type: Output
|
217
|
-
}], focusChange: [{
|
218
|
-
type: Output
|
219
|
-
}], scroll: [{
|
220
|
-
type: Output
|
221
|
-
}], drop: [{
|
222
|
-
type: Output
|
223
|
-
}], codeMirrorLoaded: [{
|
224
|
-
type: Output
|
225
|
-
}], ref: [{
|
226
|
-
type: ViewChild,
|
227
|
-
args: ['ref']
|
228
|
-
}] } });
|
229
|
-
|
230
|
-
class CodemirrorModule {
|
231
|
-
}
|
232
|
-
CodemirrorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
233
|
-
CodemirrorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule, declarations: [CodemirrorComponent], exports: [CodemirrorComponent] });
|
234
|
-
CodemirrorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule });
|
235
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.2", ngImport: i0, type: CodemirrorModule, decorators: [{
|
236
|
-
type: NgModule,
|
237
|
-
args: [{
|
238
|
-
exports: [CodemirrorComponent],
|
239
|
-
declarations: [CodemirrorComponent],
|
240
|
-
}]
|
241
|
-
}] });
|
242
|
-
|
243
|
-
/**
|
244
|
-
* Generated bundle index. Do not edit.
|
245
|
-
*/
|
246
|
-
|
247
|
-
export { CodemirrorComponent, CodemirrorModule };
|
248
|
-
//# sourceMappingURL=ctrl-ngx-codemirror.mjs.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"ctrl-ngx-codemirror.mjs","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 { Editor, EditorChange, EditorFromTextArea, ScrollInfo } 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{\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 // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() scroll = new EventEmitter<ScrollInfo>();\n /* called when file(s) are dropped */\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() drop = new EventEmitter<[Editor, DragEvent]>();\n /* called when codeMirror instance is initiated on the component */\n @Output() codeMirrorLoaded = new EventEmitter<CodemirrorComponent>();\n @ViewChild('ref') ref!: ElementRef<HTMLTextAreaElement>;\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 // in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors\n this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : import('codemirror');\n return this._codeMirror;\n }\n\n ngAfterViewInit() {\n this._ngZone.runOutsideAngular(async () => {\n const codeMirrorObj = await this.codeMirrorGlobal;\n const codeMirror = codeMirrorObj?.default ? codeMirrorObj.default : codeMirrorObj;\n this.codeMirror = codeMirror.fromTextArea(\n this.ref.nativeElement,\n this._options,\n ) as EditorFromTextArea;\n this.codeMirror.on('cursorActivity', cm => this._ngZone.run(() => this.cursorActive(cm)));\n this.codeMirror.on('scroll', this.scrollChanged.bind(this));\n this.codeMirror.on('blur', () => this._ngZone.run(() => this.focusChanged(false)));\n this.codeMirror.on('focus', () => this._ngZone.run(() => this.focusChanged(true)));\n this.codeMirror.on('change', (cm, change) =>\n this._ngZone.run(() => this.codemirrorValueChanged(cm, change)),\n );\n this.codeMirror.on('drop', (cm, e) => {\n this._ngZone.run(() => this.dropFiles(cm, e));\n });\n this.codeMirror.setValue(this.value);\n this.codeMirrorLoaded.emit(this);\n });\n }\n ngDoCheck() {\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 => this.setOptionIfChanged(option.key, option.currentValue));\n changes.forEachRemovedItem(option =>\n this.setOptionIfChanged(option.key, option.currentValue),\n );\n }\n }\n ngOnDestroy() {\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: EditorChange) {\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) {\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) {\n this.onTouched();\n this.isFocused = focused;\n this.focusChange.emit(focused);\n }\n scrollChanged(cm: Editor) {\n this.scroll.emit(cm.getScrollInfo());\n }\n cursorActive(cm: Editor) {\n this.cursorActivity.emit(cm);\n }\n dropFiles(cm: Editor, e: DragEvent) {\n this.drop.emit([cm, e]);\n }\n /** Implemented as part of ControlValueAccessor. */\n writeValue(value: string) {\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 (value !== cur && normalizeLineEndings(cur) !== normalizeLineEndings(value)) {\n this.value = value;\n if (this.preserveScrollPosition) {\n const prevScrollPosition = this.codeMirror.getScrollInfo();\n this.codeMirror.setValue(this.value);\n this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top);\n } else {\n this.codeMirror.setValue(this.value);\n }\n }\n }\n\n /** Implemented as part of ControlValueAccessor. */\n registerOnChange(fn: (value: string) => void) {\n this.onChange = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n registerOnTouched(fn: () => void) {\n this.onTouched = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n setDisabledState(isDisabled: boolean) {\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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"}
|
File without changes
|
File without changes
|