diff --git a/npm/ng-packs/packages/cms-kit/src/components/code-mirror-editor/code-mirror-editor.component.ts b/npm/ng-packs/packages/cms-kit/src/components/code-mirror-editor/code-mirror-editor.component.ts new file mode 100644 index 0000000000..5792a9971d --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/components/code-mirror-editor/code-mirror-editor.component.ts @@ -0,0 +1,70 @@ +import { Component, ElementRef, AfterViewInit, ViewChild, forwardRef } from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import { EditorState } from '@codemirror/state'; +import { EditorView, lineNumbers } from '@codemirror/view'; +import { basicSetup } from 'codemirror'; + +@Component({ + selector: 'abp-codemirror-editor', + template: `
`, + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => CodeMirrorEditorComponent), + multi: true, + }, + ], +}) +export class CodeMirrorEditorComponent implements AfterViewInit, ControlValueAccessor { + @ViewChild('cmHost', { static: true }) + host!: ElementRef; + + private view!: EditorView; + private value = ''; + + private onChange = (value: string) => {}; + private onTouched = () => {}; + + writeValue(value: string): void { + this.value = value || ''; + + if (this.view) { + this.view.dispatch({ + changes: { + from: 0, + to: this.view.state.doc.length, + insert: this.value, + }, + }); + } + } + + registerOnChange(fn: any): void { + this.onChange = fn; + } + + registerOnTouched(fn: any): void { + this.onTouched = fn; + } + + ngAfterViewInit(): void { + const startState = EditorState.create({ + doc: this.value, + extensions: [ + basicSetup, + EditorView.updateListener.of(update => { + if (update.docChanged) { + const text = update.state.doc.toString(); + this.onChange(text); + } + }), + lineNumbers(), + ], + }); + + this.view = new EditorView({ + state: startState, + parent: this.host.nativeElement, + }); + } +} diff --git a/npm/ng-packs/packages/cms-kit/src/components/index.ts b/npm/ng-packs/packages/cms-kit/src/components/index.ts new file mode 100644 index 0000000000..3c9eb8b53f --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/components/index.ts @@ -0,0 +1,2 @@ +export * from './code-mirror-editor/code-mirror-editor.component'; +export * from './toast-ui/toastui-editor.component'; diff --git a/npm/ng-packs/packages/cms-kit/src/components/toast-ui/toastui-editor.component.ts b/npm/ng-packs/packages/cms-kit/src/components/toast-ui/toastui-editor.component.ts new file mode 100644 index 0000000000..00095ef5ce --- /dev/null +++ b/npm/ng-packs/packages/cms-kit/src/components/toast-ui/toastui-editor.component.ts @@ -0,0 +1,86 @@ +import { AbpLocalStorageService } from '@abp/ng.core'; +import { isPlatformBrowser } from '@angular/common'; +import { + Component, + AfterViewInit, + ViewChild, + ElementRef, + forwardRef, + inject, + DOCUMENT, + PLATFORM_ID, +} from '@angular/core'; +import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'; +import Editor from '@toast-ui/editor'; + +@Component({ + selector: 'abp-toastui-editor', + template: ``, + providers: [ + { + provide: NG_VALUE_ACCESSOR, + useExisting: forwardRef(() => ToastuiEditorComponent), + multi: true, + }, + ], +}) +export class ToastuiEditorComponent implements AfterViewInit, ControlValueAccessor { + @ViewChild('editorContainer', { static: true }) + editorContainer!: ElementRef