@tmdjr/ngx-editor-js2 0.0.7 → 0.0.9
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
CHANGED
|
@@ -20,7 +20,7 @@ Ngx-EditorJs2 is an Angular-based, highly extensible block-style editor inspired
|
|
|
20
20
|
To install Ngx-EditorJs2, run:
|
|
21
21
|
|
|
22
22
|
```sh
|
|
23
|
-
npm install @tmdjr/ngx-
|
|
23
|
+
npm install @tmdjr/ngx-editor-js2
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
## Usage
|
|
@@ -41,7 +41,7 @@ import { NgxEditorJs2Component } from '@tmdjr/ngx-editor-js2';
|
|
|
41
41
|
`,
|
|
42
42
|
})
|
|
43
43
|
```
|
|
44
|
-
- Implementation found in the [Demo Src](https://github.com/Ba5ik7/ngx-
|
|
44
|
+
- Implementation found in the [Demo Src](https://github.com/Ba5ik7/ngx-editor-js2-blocks/blob/main/projects/demo/src/app/app.component.ts)
|
|
45
45
|
|
|
46
46
|
Css is required for the editor to function properly. Add the following to your global styles:
|
|
47
47
|
|
|
@@ -91,10 +91,6 @@ Ngx-EditorJs2 comes with built-in block components:
|
|
|
91
91
|
|
|
92
92
|
You can also add custom blocks by implementing the `NGX_EDITORJS_OPTIONS` provider:
|
|
93
93
|
|
|
94
|
-
```sh
|
|
95
|
-
npm install @tmdjr/ngx-editor-js2-image
|
|
96
|
-
```
|
|
97
|
-
|
|
98
94
|
```ts
|
|
99
95
|
import { NGX_EDITORJS_OPTIONS } from '@tmdjr/ngx-editor-js2';
|
|
100
96
|
import { NgxEditorJs2ImageComponent } from '@tmdjr/ngx-editor-js2-image';
|
|
@@ -119,6 +115,50 @@ export const appConfig: ApplicationConfig = {
|
|
|
119
115
|
};
|
|
120
116
|
```
|
|
121
117
|
|
|
118
|
+
## 📦 Custom Blocks for Ngx-EditorJs2
|
|
119
|
+
|
|
120
|
+
Ngx-EditorJs2 allows you to extend its functionality with custom blocks. Below are some additional components that can be installed separately to enhance the editor with images, blockquotes, and code blocks.
|
|
121
|
+
|
|
122
|
+
### 🖼️ Image Block
|
|
123
|
+
Easily add and manage images within the editor.
|
|
124
|
+
|
|
125
|
+
- **Component:** `NgxEditorJs2ImageComponent`
|
|
126
|
+
- **Install:**
|
|
127
|
+
```sh
|
|
128
|
+
npm install @tmdjr/ngx-editor-js2-image
|
|
129
|
+
```
|
|
130
|
+
- **Package:** [@tmdjr/ngx-editor-js2-image](https://www.npmjs.com/package/@tmdjr/ngx-editor-js2-image)
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
### 📝 Blockquotes Block
|
|
135
|
+
Insert styled blockquotes to emphasize key points in the content.
|
|
136
|
+
|
|
137
|
+
- **Component:** `NgxEditorJs2BlockquotesComponent`
|
|
138
|
+
- **Install:**
|
|
139
|
+
```sh
|
|
140
|
+
npm install @tmdjr/ngx-editor-js2-blockquotes
|
|
141
|
+
```
|
|
142
|
+
- **Package:** [@tmdjr/ngx-editor-js2-blockquotes](https://www.npmjs.com/package/@tmdjr/ngx-editor-js2-blockquotes)
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
### 💻 Code Block
|
|
147
|
+
Embed syntax-highlighted code snippets using CodeMirror.
|
|
148
|
+
|
|
149
|
+
- **Component:** `NgxEditorJs2CodemirrorComponent`
|
|
150
|
+
- **Install:**
|
|
151
|
+
```sh
|
|
152
|
+
npm install @tmdjr/ngx-editor-js2-codemirror
|
|
153
|
+
```
|
|
154
|
+
- **Package:** [@tmdjr/ngx-editor-js2-codemirror](https://www.npmjs.com/package/@tmdjr/ngx-editor-js2-codemirror)
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
For more details and documentation, visit the official repository.
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
122
162
|
## Development
|
|
123
163
|
To contribute, clone the repository and install dependencies:
|
|
124
164
|
|
|
@@ -134,29 +174,17 @@ Build the library:
|
|
|
134
174
|
npm run build-ngx-editor-js2
|
|
135
175
|
```
|
|
136
176
|
|
|
137
|
-
Build Customs Blocks:
|
|
138
|
-
|
|
139
|
-
```sh
|
|
140
|
-
npm run build-ngx-editor-js2-image
|
|
141
|
-
// etc...
|
|
142
|
-
```
|
|
143
|
-
|
|
144
177
|
Run the development server:
|
|
145
|
-
|
|
146
|
-
```sh
|
|
147
|
-
npm run start-demo
|
|
148
|
-
```
|
|
149
|
-
|
|
150
178
|
If you want to live reload the library, run the following commands in succession:
|
|
151
179
|
|
|
152
180
|
```sh
|
|
153
181
|
npm run watch-ngx-editor-js2 // Important to run 1st
|
|
154
|
-
npm run watch-ngx-editor-js2-image
|
|
155
|
-
// etc...
|
|
156
|
-
|
|
157
182
|
npm run start-demo
|
|
158
183
|
```
|
|
159
184
|
|
|
185
|
+
*Custom Block development should be done in the [Ngx-Editor-Js2-Blocks](https://github.com/Ba5ik7/ngx-editor-js2-blocks) MonoRepo.*
|
|
186
|
+
|
|
187
|
+
|
|
160
188
|
## Architecture Overview
|
|
161
189
|
Ngx-EditorJs2 is built on Angular's reactive architecture, using RxJS to manage state and data streams. The library is composed of several Services and Directives that handle different aspects of the editor:
|
|
162
190
|
```mermaid
|
|
@@ -196,6 +224,8 @@ Each block in Ngx-EditorJs2 is part of a larger **`formGroup`**, allowing seamle
|
|
|
196
224
|
- The **editor-level formGroup** acts as a centralized store, making it easier to retrieve or modify block data.
|
|
197
225
|
- Blocks can **interact with services and directives**, enhancing their capabilities dynamically.
|
|
198
226
|
|
|
227
|
+
*Custom Block development should be done in the [Ngx-Editor-Js2-Blocks](https://github.com/Ba5ik7/ngx-editor-js2-blocks) MonoRepo.*
|
|
228
|
+
|
|
199
229
|
## License
|
|
200
230
|
MIT License © 2025 [Wesley DuSell](https://github.com/ba5ik7)
|
|
201
231
|
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { inject, ElementRef, input, forwardRef, Directive, HostListener, output, Component, signal, Injectable, ViewContainerRef, effect, InjectionToken, viewChild, EventEmitter,
|
|
2
|
+
import { inject, ElementRef, input, forwardRef, Directive, HostListener, output, Component, signal, Injectable, ViewContainerRef, effect, InjectionToken, viewChild, EventEmitter, Renderer2, Output } from '@angular/core';
|
|
3
3
|
import * as i2 from '@angular/forms';
|
|
4
4
|
import { NG_VALUE_ACCESSOR, FormControl, ReactiveFormsModule, FormBuilder, FormsModule } from '@angular/forms';
|
|
5
5
|
import { startWith, combineLatest, map, firstValueFrom, of, from, tap, filter, defaultIfEmpty, Observable, lastValueFrom, forkJoin, iif, switchMap, mergeMap, BehaviorSubject, distinctUntilChanged, delay, exhaustMap, merge, fromEvent, debounceTime } from 'rxjs';
|
|
6
|
-
import
|
|
7
|
-
import { MatRipple, MatRippleModule } from '@angular/material/core';
|
|
6
|
+
import { MatRipple } from '@angular/material/core';
|
|
8
7
|
import * as i1$1 from '@angular/cdk/drag-drop';
|
|
9
8
|
import { CdkDragHandle, CdkDrag, CdkDropList } from '@angular/cdk/drag-drop';
|
|
10
9
|
import * as i1 from '@angular/cdk/overlay';
|
|
11
10
|
import { OverlayModule, Overlay } from '@angular/cdk/overlay';
|
|
12
11
|
import * as i1$2 from '@angular/material/icon';
|
|
13
12
|
import { MatIcon, MatIconModule } from '@angular/material/icon';
|
|
14
|
-
import { AsyncPipe, NgSwitch, NgSwitchCase, NgTemplateOutlet, NgClass
|
|
13
|
+
import { AsyncPipe, NgSwitch, NgSwitchCase, NgTemplateOutlet, NgClass } from '@angular/common';
|
|
15
14
|
import { toObservable } from '@angular/core/rxjs-interop';
|
|
16
15
|
import { MatFormField, MatLabel } from '@angular/material/form-field';
|
|
17
16
|
import { MatInput } from '@angular/material/input';
|
|
@@ -24,7 +23,7 @@ class ControlAccessorDirective {
|
|
|
24
23
|
onChange = () => { };
|
|
25
24
|
onTouched = () => { };
|
|
26
25
|
writeValue() {
|
|
27
|
-
this.elementRef.nativeElement.
|
|
26
|
+
this.elementRef.nativeElement.innerHTML = this.defaultValue() || '';
|
|
28
27
|
}
|
|
29
28
|
registerOnChange(fn) {
|
|
30
29
|
this.onChange = fn;
|
|
@@ -36,7 +35,7 @@ class ControlAccessorDirective {
|
|
|
36
35
|
this.onTouched();
|
|
37
36
|
}
|
|
38
37
|
onInput() {
|
|
39
|
-
this.onChange(this.elementRef.nativeElement.
|
|
38
|
+
this.onChange(this.elementRef.nativeElement.innerHTML);
|
|
40
39
|
}
|
|
41
40
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ControlAccessorDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
42
41
|
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.1.5", type: ControlAccessorDirective, isStandalone: true, selector: "[controlAccessor]", inputs: { defaultValue: { classPropertyName: "defaultValue", publicName: "defaultValue", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "blur": "onBlur()", "input": "onInput()" } }, providers: [
|
|
@@ -936,291 +935,134 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImpor
|
|
|
936
935
|
}], ctorParameters: () => [] });
|
|
937
936
|
|
|
938
937
|
class ToolbarInlineComponent {
|
|
939
|
-
|
|
940
|
-
selection;
|
|
941
|
-
|
|
938
|
+
// @Input() selection!: Selection;
|
|
939
|
+
selection = input.required();
|
|
940
|
+
closeOverlayEmitter = new EventEmitter();
|
|
941
|
+
renderer = inject(Renderer2);
|
|
942
942
|
url = '';
|
|
943
|
-
showURLInputField = false;
|
|
943
|
+
showURLInputField = signal(false);
|
|
944
944
|
savedRanges = [];
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
945
|
+
options = [
|
|
946
|
+
{ icon: 'format_bold', action: 'bold' },
|
|
947
|
+
{ icon: 'format_italic', action: 'italic' },
|
|
948
|
+
{ icon: 'format_underlined', action: 'underline' },
|
|
949
|
+
{ icon: 'strikethrough_s', action: 'strikethrough' },
|
|
950
|
+
{ icon: 'format_list_bulleted', action: 'insertUnorderedList' },
|
|
951
|
+
{ icon: 'format_list_numbered', action: 'insertOrderedList' },
|
|
952
|
+
{ icon: 'highlight', action: 'highlightColor' },
|
|
953
|
+
{ icon: 'format_align_left', action: 'justifyLeft' },
|
|
954
|
+
{ icon: 'format_align_center', action: 'justifyCenter' },
|
|
955
|
+
{ icon: 'format_align_right', action: 'justifyRight' },
|
|
956
|
+
{ icon: 'format_align_justify', action: 'justifyFull' },
|
|
957
|
+
];
|
|
958
|
+
addInlineTag(tag) {
|
|
953
959
|
// https://stackoverflow.com/questions/60581285/execcommand-is-now-obsolete-whats-the-alternative
|
|
954
|
-
document.execCommand(tag
|
|
955
|
-
this.
|
|
960
|
+
document.execCommand(tag);
|
|
961
|
+
this.closeOverlayEmitter.emit();
|
|
956
962
|
}
|
|
957
|
-
|
|
958
|
-
const range = this.selection.getRangeAt(0);
|
|
963
|
+
addClassTag(tag, className) {
|
|
964
|
+
const range = this.selection().getRangeAt(0);
|
|
959
965
|
const element = this.renderer.createElement(tag);
|
|
960
966
|
element.className = className ?? '';
|
|
961
967
|
element.innerHTML = range.toString();
|
|
962
968
|
range.deleteContents();
|
|
963
969
|
range.insertNode(element);
|
|
964
|
-
this.
|
|
970
|
+
this.closeOverlayEmitter.emit();
|
|
965
971
|
}
|
|
966
972
|
clearTags() {
|
|
967
973
|
document.execCommand('removeFormat');
|
|
968
974
|
document.execCommand('unlink');
|
|
969
|
-
this.
|
|
975
|
+
this.closeOverlayEmitter.emit();
|
|
970
976
|
}
|
|
971
977
|
openUrlInput() {
|
|
972
|
-
this.savedRanges.push(this.selection.getRangeAt(0));
|
|
973
|
-
this.showURLInputField
|
|
978
|
+
this.savedRanges.push(this.selection().getRangeAt(0));
|
|
979
|
+
this.showURLInputField.set(true);
|
|
974
980
|
}
|
|
975
981
|
createLink() {
|
|
976
|
-
this.selection.removeAllRanges();
|
|
977
|
-
this.selection.addRange(this.savedRanges.pop());
|
|
982
|
+
this.selection().removeAllRanges();
|
|
983
|
+
this.selection().addRange(this.savedRanges.pop());
|
|
978
984
|
document.execCommand('createLink', false, this.url);
|
|
979
|
-
this.
|
|
985
|
+
this.closeOverlayEmitter.emit();
|
|
980
986
|
}
|
|
981
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ToolbarInlineComponent, deps: [
|
|
982
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
983
|
-
<div class="
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
matRipple
|
|
988
|
-
(click)="addInlineTag('bold')"
|
|
989
|
-
>
|
|
990
|
-
<mat-icon>format_bold</mat-icon>
|
|
991
|
-
</div>
|
|
992
|
-
<div
|
|
993
|
-
class="block-option-list-item"
|
|
994
|
-
matRipple
|
|
995
|
-
(click)="addInlineTag('italic')"
|
|
996
|
-
>
|
|
997
|
-
<mat-icon>format_italic</mat-icon>
|
|
998
|
-
</div>
|
|
999
|
-
<div
|
|
1000
|
-
class="block-option-list-item"
|
|
1001
|
-
matRipple
|
|
1002
|
-
(click)="addInlineTag('underlined')"
|
|
1003
|
-
>
|
|
1004
|
-
<mat-icon>format_underlined</mat-icon>
|
|
1005
|
-
</div>
|
|
1006
|
-
<div
|
|
1007
|
-
class="block-option-list-item"
|
|
1008
|
-
matRipple
|
|
1009
|
-
(click)="addInlineTag('strikethrough')"
|
|
1010
|
-
>
|
|
1011
|
-
<mat-icon>strikethrough_s</mat-icon>
|
|
1012
|
-
</div>
|
|
1013
|
-
<!-- <div class="block-option-list-item"
|
|
1014
|
-
matRipple
|
|
1015
|
-
(click)="addInlineTag('hiliteColor', 'red')">
|
|
1016
|
-
<mat-icon>highlight</mat-icon>
|
|
1017
|
-
</div> -->
|
|
1018
|
-
<div
|
|
1019
|
-
class="block-option-list-item"
|
|
1020
|
-
matRipple
|
|
1021
|
-
(click)="addCustomInlineTag('code', 'inline-code-example')"
|
|
1022
|
-
>
|
|
1023
|
-
<mat-icon>code</mat-icon>
|
|
1024
|
-
</div>
|
|
1025
|
-
<div class="block-option-list-item" matRipple (click)="openUrlInput()">
|
|
1026
|
-
<mat-icon>insert_link</mat-icon>
|
|
1027
|
-
</div>
|
|
1028
|
-
<div class="block-option-list-item" matRipple (click)="clearTags()">
|
|
1029
|
-
<mat-icon>format_clear</mat-icon>
|
|
1030
|
-
</div>
|
|
1031
|
-
|
|
1032
|
-
<div
|
|
1033
|
-
class="block-option-list-item"
|
|
1034
|
-
matRipple
|
|
1035
|
-
(click)="addInlineTag('justifyLeft')"
|
|
1036
|
-
>
|
|
1037
|
-
<mat-icon>format_align_left</mat-icon>
|
|
1038
|
-
</div>
|
|
1039
|
-
<div
|
|
1040
|
-
class="block-option-list-item"
|
|
1041
|
-
matRipple
|
|
1042
|
-
(click)="addInlineTag('justifyCenter')"
|
|
1043
|
-
>
|
|
1044
|
-
<mat-icon>format_align_center</mat-icon>
|
|
1045
|
-
</div>
|
|
1046
|
-
<div
|
|
1047
|
-
class="block-option-list-item"
|
|
1048
|
-
matRipple
|
|
1049
|
-
(click)="addInlineTag('justifyRight')"
|
|
1050
|
-
>
|
|
1051
|
-
<mat-icon>format_align_right</mat-icon>
|
|
1052
|
-
</div>
|
|
1053
|
-
<div
|
|
1054
|
-
class="block-option-list-item"
|
|
1055
|
-
matRipple
|
|
1056
|
-
(click)="addInlineTag('justifyFull')"
|
|
1057
|
-
>
|
|
1058
|
-
<mat-icon>format_align_justify</mat-icon>
|
|
1059
|
-
</div>
|
|
1060
|
-
<div
|
|
1061
|
-
class="block-option-list-item"
|
|
1062
|
-
matRipple
|
|
1063
|
-
(click)="addInlineTag('insertUnorderedList')"
|
|
1064
|
-
>
|
|
1065
|
-
<mat-icon>format_list_bulleted</mat-icon>
|
|
1066
|
-
</div>
|
|
1067
|
-
<div
|
|
1068
|
-
class="block-option-list-item"
|
|
1069
|
-
matRipple
|
|
1070
|
-
(click)="addInlineTag('insertOrderedList')"
|
|
1071
|
-
>
|
|
1072
|
-
<mat-icon>format_list_numbered</mat-icon>
|
|
1073
|
-
</div>
|
|
1074
|
-
<div
|
|
1075
|
-
class="block-option-list-item"
|
|
1076
|
-
matRipple
|
|
1077
|
-
(click)="addInlineTag('hiliteColor', 'yellow')"
|
|
1078
|
-
>
|
|
1079
|
-
<mat-icon>highlight</mat-icon>
|
|
1080
|
-
</div>
|
|
987
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ToolbarInlineComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
988
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.5", type: ToolbarInlineComponent, isStandalone: true, selector: "toolbar-inline", inputs: { selection: { classPropertyName: "selection", publicName: "selection", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { closeOverlayEmitter: "closeOverlay" }, host: { classAttribute: "mat-elevation-z24" }, ngImport: i0, template: `
|
|
989
|
+
<div class="panel">
|
|
990
|
+
@for (item of options; track $index) {
|
|
991
|
+
<div class="inline-option" (click)="addInlineTag(item.action)">
|
|
992
|
+
<mat-icon>{{ item.icon }}</mat-icon>
|
|
1081
993
|
</div>
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
994
|
+
}
|
|
995
|
+
<div class="inline-option" (click)="addClassTag('code', 'inline-code')">
|
|
996
|
+
<mat-icon>code</mat-icon>
|
|
997
|
+
</div>
|
|
998
|
+
<div class="inline-option" (click)="openUrlInput()">
|
|
999
|
+
<mat-icon>insert_link</mat-icon>
|
|
1000
|
+
</div>
|
|
1001
|
+
<div class="inline-option" (click)="clearTags()">
|
|
1002
|
+
<mat-icon>format_clear</mat-icon>
|
|
1003
|
+
</div>
|
|
1004
|
+
</div>
|
|
1005
|
+
|
|
1006
|
+
@if(showURLInputField()) {
|
|
1007
|
+
<div class="panel">
|
|
1008
|
+
<input
|
|
1009
|
+
type="text"
|
|
1010
|
+
placeholder="Enter URL"
|
|
1011
|
+
class="block-option-input"
|
|
1012
|
+
[(ngModel)]="url"
|
|
1013
|
+
/>
|
|
1014
|
+
<div class="inline-option" (click)="createLink()">
|
|
1015
|
+
<mat-icon>add</mat-icon>
|
|
1092
1016
|
</div>
|
|
1093
1017
|
</div>
|
|
1094
|
-
|
|
1018
|
+
}
|
|
1019
|
+
`, isInline: true, styles: [":host{color:var(--mat-sys-on-secondary);background:var(--mat-sys-secondary);border-radius:8px}:host .panel{display:flex;width:230px;flex-wrap:wrap;gap:1px}:host .inline-option{cursor:pointer;width:32px;height:32px;display:flex;align-items:center;justify-content:center}:host .block-option-input{width:197px;height:32px;border:none;outline:none;color:var(--mat-sys-on-secondary);background-color:transparent;box-sizing:border-box}\n"], dependencies: [{ kind: "ngmodule", type: MatListModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
|
|
1095
1020
|
}
|
|
1096
1021
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.5", ngImport: i0, type: ToolbarInlineComponent, decorators: [{
|
|
1097
1022
|
type: Component,
|
|
1098
|
-
args: [{ selector: 'toolbar-inline', imports: [MatListModule, MatIconModule,
|
|
1099
|
-
<div class="
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
matRipple
|
|
1104
|
-
(click)="addInlineTag('bold')"
|
|
1105
|
-
>
|
|
1106
|
-
<mat-icon>format_bold</mat-icon>
|
|
1107
|
-
</div>
|
|
1108
|
-
<div
|
|
1109
|
-
class="block-option-list-item"
|
|
1110
|
-
matRipple
|
|
1111
|
-
(click)="addInlineTag('italic')"
|
|
1112
|
-
>
|
|
1113
|
-
<mat-icon>format_italic</mat-icon>
|
|
1114
|
-
</div>
|
|
1115
|
-
<div
|
|
1116
|
-
class="block-option-list-item"
|
|
1117
|
-
matRipple
|
|
1118
|
-
(click)="addInlineTag('underlined')"
|
|
1119
|
-
>
|
|
1120
|
-
<mat-icon>format_underlined</mat-icon>
|
|
1121
|
-
</div>
|
|
1122
|
-
<div
|
|
1123
|
-
class="block-option-list-item"
|
|
1124
|
-
matRipple
|
|
1125
|
-
(click)="addInlineTag('strikethrough')"
|
|
1126
|
-
>
|
|
1127
|
-
<mat-icon>strikethrough_s</mat-icon>
|
|
1128
|
-
</div>
|
|
1129
|
-
<!-- <div class="block-option-list-item"
|
|
1130
|
-
matRipple
|
|
1131
|
-
(click)="addInlineTag('hiliteColor', 'red')">
|
|
1132
|
-
<mat-icon>highlight</mat-icon>
|
|
1133
|
-
</div> -->
|
|
1134
|
-
<div
|
|
1135
|
-
class="block-option-list-item"
|
|
1136
|
-
matRipple
|
|
1137
|
-
(click)="addCustomInlineTag('code', 'inline-code-example')"
|
|
1138
|
-
>
|
|
1139
|
-
<mat-icon>code</mat-icon>
|
|
1140
|
-
</div>
|
|
1141
|
-
<div class="block-option-list-item" matRipple (click)="openUrlInput()">
|
|
1142
|
-
<mat-icon>insert_link</mat-icon>
|
|
1143
|
-
</div>
|
|
1144
|
-
<div class="block-option-list-item" matRipple (click)="clearTags()">
|
|
1145
|
-
<mat-icon>format_clear</mat-icon>
|
|
1146
|
-
</div>
|
|
1147
|
-
|
|
1148
|
-
<div
|
|
1149
|
-
class="block-option-list-item"
|
|
1150
|
-
matRipple
|
|
1151
|
-
(click)="addInlineTag('justifyLeft')"
|
|
1152
|
-
>
|
|
1153
|
-
<mat-icon>format_align_left</mat-icon>
|
|
1154
|
-
</div>
|
|
1155
|
-
<div
|
|
1156
|
-
class="block-option-list-item"
|
|
1157
|
-
matRipple
|
|
1158
|
-
(click)="addInlineTag('justifyCenter')"
|
|
1159
|
-
>
|
|
1160
|
-
<mat-icon>format_align_center</mat-icon>
|
|
1161
|
-
</div>
|
|
1162
|
-
<div
|
|
1163
|
-
class="block-option-list-item"
|
|
1164
|
-
matRipple
|
|
1165
|
-
(click)="addInlineTag('justifyRight')"
|
|
1166
|
-
>
|
|
1167
|
-
<mat-icon>format_align_right</mat-icon>
|
|
1168
|
-
</div>
|
|
1169
|
-
<div
|
|
1170
|
-
class="block-option-list-item"
|
|
1171
|
-
matRipple
|
|
1172
|
-
(click)="addInlineTag('justifyFull')"
|
|
1173
|
-
>
|
|
1174
|
-
<mat-icon>format_align_justify</mat-icon>
|
|
1175
|
-
</div>
|
|
1176
|
-
<div
|
|
1177
|
-
class="block-option-list-item"
|
|
1178
|
-
matRipple
|
|
1179
|
-
(click)="addInlineTag('insertUnorderedList')"
|
|
1180
|
-
>
|
|
1181
|
-
<mat-icon>format_list_bulleted</mat-icon>
|
|
1182
|
-
</div>
|
|
1183
|
-
<div
|
|
1184
|
-
class="block-option-list-item"
|
|
1185
|
-
matRipple
|
|
1186
|
-
(click)="addInlineTag('insertOrderedList')"
|
|
1187
|
-
>
|
|
1188
|
-
<mat-icon>format_list_numbered</mat-icon>
|
|
1189
|
-
</div>
|
|
1190
|
-
<div
|
|
1191
|
-
class="block-option-list-item"
|
|
1192
|
-
matRipple
|
|
1193
|
-
(click)="addInlineTag('hiliteColor', 'yellow')"
|
|
1194
|
-
>
|
|
1195
|
-
<mat-icon>highlight</mat-icon>
|
|
1196
|
-
</div>
|
|
1023
|
+
args: [{ selector: 'toolbar-inline', imports: [MatListModule, MatIconModule, FormsModule], host: { class: 'mat-elevation-z24' }, template: `
|
|
1024
|
+
<div class="panel">
|
|
1025
|
+
@for (item of options; track $index) {
|
|
1026
|
+
<div class="inline-option" (click)="addInlineTag(item.action)">
|
|
1027
|
+
<mat-icon>{{ item.icon }}</mat-icon>
|
|
1197
1028
|
</div>
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
</div>
|
|
1029
|
+
}
|
|
1030
|
+
<div class="inline-option" (click)="addClassTag('code', 'inline-code')">
|
|
1031
|
+
<mat-icon>code</mat-icon>
|
|
1032
|
+
</div>
|
|
1033
|
+
<div class="inline-option" (click)="openUrlInput()">
|
|
1034
|
+
<mat-icon>insert_link</mat-icon>
|
|
1035
|
+
</div>
|
|
1036
|
+
<div class="inline-option" (click)="clearTags()">
|
|
1037
|
+
<mat-icon>format_clear</mat-icon>
|
|
1208
1038
|
</div>
|
|
1209
1039
|
</div>
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1040
|
+
|
|
1041
|
+
@if(showURLInputField()) {
|
|
1042
|
+
<div class="panel">
|
|
1043
|
+
<input
|
|
1044
|
+
type="text"
|
|
1045
|
+
placeholder="Enter URL"
|
|
1046
|
+
class="block-option-input"
|
|
1047
|
+
[(ngModel)]="url"
|
|
1048
|
+
/>
|
|
1049
|
+
<div class="inline-option" (click)="createLink()">
|
|
1050
|
+
<mat-icon>add</mat-icon>
|
|
1051
|
+
</div>
|
|
1052
|
+
</div>
|
|
1053
|
+
}
|
|
1054
|
+
`, styles: [":host{color:var(--mat-sys-on-secondary);background:var(--mat-sys-secondary);border-radius:8px}:host .panel{display:flex;width:230px;flex-wrap:wrap;gap:1px}:host .inline-option{cursor:pointer;width:32px;height:32px;display:flex;align-items:center;justify-content:center}:host .block-option-input{width:197px;height:32px;border:none;outline:none;color:var(--mat-sys-on-secondary);background-color:transparent;box-sizing:border-box}\n"] }]
|
|
1055
|
+
}], propDecorators: { closeOverlayEmitter: [{
|
|
1214
1056
|
type: Output,
|
|
1215
|
-
args: ['
|
|
1057
|
+
args: ['closeOverlay']
|
|
1216
1058
|
}] } });
|
|
1217
1059
|
|
|
1218
1060
|
class ToolbarInlineService {
|
|
1219
1061
|
overlay = inject(Overlay);
|
|
1220
1062
|
overlayRef;
|
|
1221
1063
|
determineToDisplayInlineToolbarBlock(_event) {
|
|
1222
|
-
this.overlayRef?.hasAttached() && this.overlayRef.dispose()
|
|
1223
|
-
|
|
1064
|
+
return of(window.getSelection()).pipe(filter((selection) => selection !== null), filter((selection) => selection.rangeCount > 0), filter((selection) => selection.toString().length > 0), filter((selection) => selection.toString() !== ''), tap(() => this.overlayRef?.hasAttached() && this.overlayRef.dispose()), // So hacky tired to do this properly
|
|
1065
|
+
map((selection) => ({
|
|
1224
1066
|
selection,
|
|
1225
1067
|
parant: this.getSelectionParent(selection),
|
|
1226
1068
|
})), filter(({ parant }) => this.isSelectionInABlock(parant)), exhaustMap(({ selection }) => this.attachInlineToolbar(selection)));
|
|
@@ -1232,17 +1074,25 @@ class ToolbarInlineService {
|
|
|
1232
1074
|
: range.commonAncestorContainer.parentElement;
|
|
1233
1075
|
}
|
|
1234
1076
|
isSelectionInABlock(target) {
|
|
1235
|
-
|
|
1077
|
+
// ! TODO: This is a hacky way to determine if the selection is in a block
|
|
1078
|
+
// ! Need to also check if the block wants to display the inline toolbar
|
|
1079
|
+
return (!!target &&
|
|
1080
|
+
(target.closest('.no-toolbar-inline') !== null
|
|
1081
|
+
? false
|
|
1082
|
+
: target.closest('ngx-editor-js2') !== null
|
|
1083
|
+
? true
|
|
1084
|
+
: false));
|
|
1236
1085
|
}
|
|
1237
1086
|
attachInlineToolbar(selection) {
|
|
1238
|
-
return of(selection.getRangeAt(0)).pipe(map((range) => range.getBoundingClientRect()), map((selectionRect) => this.createOverlay(selectionRect)),
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
inlineToolbar
|
|
1245
|
-
|
|
1087
|
+
return of(selection.getRangeAt(0)).pipe(map((range) => range.getBoundingClientRect()), map((selectionRect) => this.createOverlay(selectionRect)),
|
|
1088
|
+
// So hacky tired to do this properly
|
|
1089
|
+
// passing the refs down the pipe adds a bug
|
|
1090
|
+
// user selects text with a drag
|
|
1091
|
+
// (mousedown → mousemove → wait → mousemove → mouseup)
|
|
1092
|
+
tap((overlayRef) => (this.overlayRef = overlayRef)), map((overlayRef) => {
|
|
1093
|
+
const inlineToolbar = overlayRef.attach(new ComponentPortal(ToolbarInlineComponent));
|
|
1094
|
+
inlineToolbar.setInput('selection', selection);
|
|
1095
|
+
lastValueFrom(merge(overlayRef.backdropClick(), inlineToolbar.instance.closeOverlayEmitter).pipe(tap(() => overlayRef.dispose()), tap(() => selection.removeAllRanges())));
|
|
1246
1096
|
return true;
|
|
1247
1097
|
}));
|
|
1248
1098
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tmdjr-ngx-editor-js2.mjs","sources":["../../../projects/ngx-editor-js2/src/lib/directives/control-accessor.directive.ts","../../../projects/ngx-editor-js2/src/lib/directives/autofocus.directive.ts","../../../projects/ngx-editor-js2/src/lib/ngx-editor-js2.interface.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar-block-options.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar-blocks.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar.component.ts","../../../projects/ngx-editor-js2/src/lib/services/block-movement.service.ts","../../../projects/ngx-editor-js2/src/lib/services/editor-js.service.ts","../../../projects/ngx-editor-js2/src/lib/services/tool-fab.service.ts","../../../projects/ngx-editor-js2/src/lib/directives/toolbar-fab.directive.ts","../../../projects/ngx-editor-js2/src/lib/directives/clean-paste-data.directive.ts","../../../projects/ngx-editor-js2/src/lib/components/blocks/header-block.component.ts","../../../projects/ngx-editor-js2/src/lib/components/blocks/paragraph-block.component.ts","../../../projects/ngx-editor-js2/src/lib/services/ngx-editor-js2.service.ts","../../../projects/ngx-editor-js2/src/lib/components/editor-js.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar-inline/toolbar-inline.component.ts","../../../projects/ngx-editor-js2/src/lib/services/toolbar-inline.service.ts","../../../projects/ngx-editor-js2/src/lib/ngx-editor-js2.component.ts","../../../projects/ngx-editor-js2/src/public-api.ts","../../../projects/ngx-editor-js2/src/tmdjr-ngx-editor-js2.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n forwardRef,\n HostListener,\n inject,\n input,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\n\n@Directive({\n selector: '[controlAccessor]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ControlAccessorDirective),\n multi: true,\n },\n ],\n})\nexport class ControlAccessorDirective implements ControlValueAccessor {\n elementRef = inject(ElementRef);\n\n defaultValue = input<string>();\n\n onChange: (value: any) => void = () => {};\n onTouched: () => void = () => {};\n\n writeValue(): void {\n this.elementRef.nativeElement.innerText = this.defaultValue() || '';\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n @HostListener('blur')\n onBlur(): void {\n this.onTouched();\n }\n\n @HostListener('input')\n onInput(): void {\n this.onChange(this.elementRef.nativeElement.innerText);\n }\n}\n","import {\n AfterContentInit,\n Directive,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\n\n@Directive({\n selector: '[autofocus]',\n})\nexport class AutofocusDirective implements AfterContentInit {\n elementRef = inject(ElementRef);\n\n autofocus = input<boolean>(false);\n\n ngAfterContentInit() {\n this.autofocus() && this.elementRef.nativeElement.focus?.();\n }\n}\n","import { InjectionToken, InputSignal, Signal, Type } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\n\nexport interface NgxEditorjsOptions {\n consumerSupportedBlocks?: SupportedBlock[];\n}\nexport interface SupportedBlock {\n name: string;\n componentInstanceName: string;\n component: Type<BlockComponent>;\n}\n\nexport interface NgxEditorJsBlock {\n blockId: string;\n sortIndex: number;\n componentInstanceName: string;\n dataClean: string;\n savedAction?: string;\n}\nexport interface NgxEditorJsBlockWithComponent extends NgxEditorJsBlock {\n component: Type<BlockComponent>;\n autofocus?: boolean;\n}\n\nexport interface BlockComponent {\n sortIndex: InputSignal<number>;\n componentInstanceName: string;\n formControlName: InputSignal<string>;\n formGroup: InputSignal<FormGroup>;\n blockOptionActions: InputSignal<BlockOptionAction[]>;\n savedAction: Signal<string>;\n actionCallback?: (string: string) => void;\n}\n\nexport interface BlockOptionAction {\n action: string;\n icon?: string;\n text?: string;\n}\n\nexport enum MovePositionActions {\n UP = 'UP',\n DOWN = 'DOWN',\n DELETE = 'DELETE',\n}\n\nexport type TAddBlockCallback = (\n block: Type<BlockComponent>,\n index: number\n) => Observable<unknown>;\n\nexport type TMoveBlockPositionCallback = (\n action: MovePositionActions,\n index: number\n) => Observable<unknown>;\n","import { Component, input, output } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatRipple } from '@angular/material/core';\nimport {\n BlockOptionAction,\n MovePositionActions,\n} from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar-block-options',\n imports: [MatIcon, MatRipple],\n template: `\n <div class=\"actions-panel mat-elevation-z24\">\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.UP)\">\n <mat-icon>arrow_upward</mat-icon>\n </div>\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.DELETE)\">\n <mat-icon>delete</mat-icon>\n </div>\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.DOWN)\">\n <mat-icon>arrow_downward</mat-icon>\n </div>\n @for(blockOptionAction of blockOptionActions(); track $index) {\n <div\n class=\"action-btn\"\n (click)=\"handleAction(blockOptionAction.action)\"\n matRipple\n >\n @if (blockOptionAction.text) {\n {{ blockOptionAction.text }}\n } @else {\n <mat-icon>{{ blockOptionAction.icon }}</mat-icon>\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n .actions-panel {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 1px;\n width: 128px;\n max-height: 128px;\n border-radius: 4px;\n overflow: auto;\n background: var(--mat-sys-secondary);\n .action-btn {\n cursor: pointer;\n width: 42px;\n height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n\n color: var(--mat-sys-on-secondary);\n background: var(--mat-sys-secondary);\n &:hover,\n &:focus {\n color: var(--mat-sys-secondary);\n background: var(--mat-sys-on-secondary);\n }\n }\n }\n }\n `,\n ],\n})\nexport class ToolbarBlockOptionsComponent {\n readonly Position = MovePositionActions;\n\n blockOptionActions = input<BlockOptionAction[]>();\n\n handleActionEmitter = output<string>({ alias: 'handleAction' });\n moveBlockPositionEmitter = output<MovePositionActions>({\n alias: 'moveBlockPosition',\n });\n\n movePosition(action: MovePositionActions) {\n this.moveBlockPositionEmitter.emit(action);\n }\n\n handleAction(action: string) {\n this.handleActionEmitter.emit(action);\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input, output, Type } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatRipple } from '@angular/material/core';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\nimport { MatList, MatListItem } from '@angular/material/list';\nimport { combineLatest, map, startWith } from 'rxjs';\nimport { BlockComponent, SupportedBlock } from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar-blocks',\n imports: [\n MatFormField,\n MatInput,\n MatList,\n MatListItem,\n MatRipple,\n MatLabel,\n ReactiveFormsModule,\n AsyncPipe,\n ],\n template: `\n <div class=\"block-list-container mat-elevation-z24\">\n <mat-form-field appearance=\"fill\" color=\"accent\">\n <mat-label>Filter</mat-label>\n <input\n class=\"filter-text\"\n matInput\n [formControl]=\"blockCtrl\"\n [autofocus]=\"true\"\n />\n </mat-form-field>\n @if(filteredBlocks$ | async; as filteredBlocks) {\n <mat-list class=\"block-list-panel\">\n @if (filteredBlocks.length <= 0) {\n <mat-list-item matRipple mat-list-item> No Results </mat-list-item>\n } @else { @for(block of filteredBlocks; track $index) {\n <mat-list-item matRipple mat-list-item (click)=\"addBlock(block)\">\n {{ block.name }}\n </mat-list-item>\n } }\n </mat-list>\n }\n </div>\n `,\n styles: [\n `\n :host {\n .mat-mdc-list-base {\n padding-top: 0px;\n margin-top: -14px;\n }\n\n .block-list-container {\n background: var(--mat-sys-secondary-container);\n border-radius: 4px;\n }\n\n .block-list-panel {\n max-width: 280px;\n max-height: 240px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n overflow: auto;\n color: var(--mat-sys-on-secondary-container);\n }\n\n mat-list-item {\n cursor: pointer;\n user-select: none;\n &:hover,\n &:focus {\n background: var(--mat-sys-surface-bright);\n }\n }\n }\n `,\n ],\n})\nexport class ToolbarBlocksComponent {\n addBlockEmitter = output<Type<BlockComponent>>({ alias: 'addBlock' });\n supportedBlocks = input<SupportedBlock[]>([]);\n supportedBlocks$ = toObservable(this.supportedBlocks);\n\n blockCtrl = new FormControl([]);\n filter$ = this.blockCtrl.valueChanges.pipe(startWith(''));\n\n filteredBlocks$ = combineLatest([this.supportedBlocks$, this.filter$]).pipe(\n map(([blocks, filterString]) => {\n if (typeof filterString !== 'string') filterString = '';\n filterString = filterString.replace(/\\\\/g, '');\n const pattern = filterString\n ?.split('')\n .map((v: string) => `(?=.*${v})`)\n .join('');\n const regex = new RegExp(`${pattern}`, 'gi');\n\n // return blocks.filter(block => regex.exec(block));\n return blocks.filter((block) => block.name.match(regex));\n })\n );\n\n addBlock(block: SupportedBlock) {\n this.addBlockEmitter.emit(block?.component);\n }\n}\n","import { Component, input, signal, Type } from '@angular/core';\nimport { MatRipple } from '@angular/material/core';\nimport { CdkDragHandle } from '@angular/cdk/drag-drop';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { ToolbarBlockOptionsComponent } from './toolbar-block-options.component';\nimport { ToolbarBlocksComponent } from './toolbar-blocks.component';\nimport { firstValueFrom } from 'rxjs';\nimport {\n BlockComponent,\n BlockOptionAction,\n MovePositionActions,\n SupportedBlock,\n TAddBlockCallback,\n TMoveBlockPositionCallback,\n} from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar',\n imports: [\n CdkDragHandle,\n MatRipple,\n OverlayModule,\n ToolbarBlockOptionsComponent,\n ToolbarBlocksComponent,\n ],\n template: `\n <div class=\"toolbar-buttons-container\">\n <div\n class=\"toolbar-buttons mat-elevation-z4\"\n #blockListTigger=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n matRipple\n (click)=\"openBlocksList()\"\n >\n <span class=\"material-icons\">add</span>\n </div>\n <div\n class=\"toolbar-buttons mat-elevation-z4\"\n #blockOptionListTigger=\"cdkOverlayOrigin\"\n cdkDragHandle\n cdkOverlayOrigin\n matRipple\n (click)=\"openBlockOptionList()\"\n >\n <span class=\"material-icons\">drag_indicator</span>\n </div>\n </div>\n\n <!-- Block type search list -->\n <ng-template\n cdkConnectedOverlay\n (overlayOutsideClick)=\"openBlocks.set(false)\"\n [cdkConnectedOverlayOrigin]=\"blockListTigger\"\n [cdkConnectedOverlayOpen]=\"openBlocks()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOffsetY]=\"15\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n >\n <toolbar-blocks\n [supportedBlocks]=\"supportedBlocks()\"\n (addBlock)=\"addBlock($event)\"\n ></toolbar-blocks>\n </ng-template>\n\n <!-- Options List-->\n <ng-template\n cdkConnectedOverlay\n (overlayOutsideClick)=\"openBlocksOption.set(false)\"\n [cdkConnectedOverlayOrigin]=\"blockOptionListTigger\"\n [cdkConnectedOverlayOpen]=\"openBlocksOption()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOffsetX]=\"-49\"\n [cdkConnectedOverlayOffsetY]=\"15\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n >\n <toolbar-block-options\n [blockOptionActions]=\"blockOptionActions()\"\n (handleAction)=\"handleAction($event)\"\n (moveBlockPosition)=\"moveBlockPosition($event)\"\n ></toolbar-block-options>\n </ng-template>\n `,\n styles: [\n `\n :host {\n .toolbar-buttons-container {\n position: relative;\n display: flex;\n gap: 10px;\n }\n .toolbar-buttons {\n cursor: pointer;\n width: 30px;\n height: 30px;\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 4px;\n margin-bottom: 14px;\n user-select: none;\n color: var(--mat-sys-on-tertiary-container);\n background: var(--mat-sys-tertiary-container);\n }\n .toolbar-buttons {\n &:hover,\n &:focus {\n background: var(--mat-sys-surface-bright);\n }\n }\n }\n @media (min-width: 768px) {\n :host {\n position: absolute;\n margin-left: -80px;\n top: 0;\n }\n }\n `,\n ],\n})\nexport class ToolbarComponent {\n componentContextPositionIndex = input.required<number>();\n supportedBlocks = input.required<SupportedBlock[]>();\n blockOptionActions = input<BlockOptionAction[]>();\n actionCallback = input<(action: string) => void>(() => () => {});\n formControlName = input<string>();\n addBlockCallback = input.required<TAddBlockCallback>();\n moveBlockPositionCallback = input.required<TMoveBlockPositionCallback>();\n\n openBlocks = signal<boolean>(false);\n openBlocksOption = signal<boolean>(false);\n\n openBlocksList() {\n this.openBlocks.update((prev) => !prev);\n }\n\n openBlockOptionList() {\n this.openBlocksOption.update((prev) => !prev);\n }\n\n moveBlockPosition(action: MovePositionActions) {\n this.closeLists();\n this.moveBlockPositionCallback()(\n action,\n this.componentContextPositionIndex()\n );\n }\n\n handleAction(action: string) {\n this.closeLists();\n this.actionCallback()(action);\n }\n\n addBlock(block: Type<BlockComponent>) {\n this.closeLists();\n firstValueFrom(\n this.addBlockCallback()(block, this.componentContextPositionIndex())\n );\n }\n\n closeLists() {\n this.openBlocks.set(false);\n this.openBlocksOption.set(false);\n }\n}\n","import { ComponentRef, Injectable, ViewContainerRef } from '@angular/core';\nimport { defaultIfEmpty, filter, from, map, of, tap } from 'rxjs';\nimport {\n BlockComponent,\n MovePositionActions,\n} from '../ngx-editor-js2.interface';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BlockMovementService {\n componentRefMap = new Map<object, ComponentRef<BlockComponent>>();\n\n clearComponentRefs() {\n this.componentRefMap.clear();\n }\n\n getNgxEditorJsBlocks() {\n return of(Array.from(this.componentRefMap.values()));\n }\n\n newComponentAttached(componentRef: ComponentRef<BlockComponent>) {\n this.componentRefMap.set(componentRef.instance, componentRef);\n }\n\n updateComponentIndices(ngxEditor: ViewContainerRef) {\n return from(this.componentRefMap.values()).pipe(\n tap((componentRef: any) =>\n componentRef.setInput(\n 'sortIndex',\n ngxEditor.indexOf(componentRef.hostView)\n )\n )\n );\n }\n\n moveBlockComponentPosition(\n ngxEditor: ViewContainerRef,\n action: MovePositionActions,\n index: number\n ) {\n return of(Array.from(this.componentRefMap.values())).pipe(\n map((componentRefs) =>\n componentRefs.find(\n (componentRef) =>\n ngxEditor.indexOf(componentRef.hostView) === index - 1\n )\n ),\n filter((componentRef) => !!componentRef),\n map((componentRef) => ({\n componentRef,\n totalComponents: ngxEditor.length - 1,\n currentIndex: ngxEditor.indexOf(componentRef.hostView),\n newIndex: (index: number) =>\n action === MovePositionActions.UP ? index - 1 : index + 1,\n })),\n map(({ componentRef, totalComponents, currentIndex, newIndex }) => ({\n componentRef,\n currentIndex,\n newIndex: Math.max(\n 0,\n Math.min(newIndex(currentIndex), totalComponents)\n ),\n })),\n filter(({ currentIndex, newIndex }) => currentIndex !== newIndex),\n tap(({ componentRef, newIndex }) => {\n ngxEditor.move(componentRef.hostView, newIndex);\n componentRef.setInput('sortIndex', newIndex);\n componentRef.setInput('autofocus', true);\n }),\n defaultIfEmpty(false)\n );\n }\n\n removeBlockComponent(\n ngxEditor: ViewContainerRef,\n index: number,\n clear = false\n ) {\n return of(Array.from(this.componentRefMap.values())).pipe(\n filter((componentRefs) => clear || componentRefs.length !== 1),\n map((componentRefs) =>\n componentRefs.find(\n (componentRef) =>\n ngxEditor.indexOf(componentRef.hostView) === index - 1\n )\n ),\n map((componentRef) =>\n this.componentRefMap.delete(componentRef?.instance ?? {})\n ),\n tap((successful) => successful && ngxEditor.remove(index - 1)),\n defaultIfEmpty(false)\n );\n }\n}\n","import { inject, Injectable, Type, ViewContainerRef } from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport {\n combineLatest,\n defaultIfEmpty,\n filter,\n forkJoin,\n iif,\n lastValueFrom,\n map,\n mergeMap,\n Observable,\n of,\n switchMap,\n tap,\n} from 'rxjs';\nimport {\n BlockComponent,\n MovePositionActions,\n NgxEditorJsBlock,\n NgxEditorJsBlockWithComponent,\n} from '../ngx-editor-js2.interface';\nimport { BlockMovementService } from './block-movement.service';\n\nconst createUID = () => Math.random().toString(36).substring(7);\n@Injectable({\n providedIn: 'root',\n})\nexport class EditorJsService {\n formBuilder = inject(FormBuilder);\n blockMovementService = inject(BlockMovementService);\n\n componentRefMap = new Map<object, unknown>();\n\n ngxEditor!: ViewContainerRef;\n formGroup = this.formBuilder.group({});\n\n // TODO - Handle this idiomatically\n setNgxEditor(ngxEditor: ViewContainerRef) {\n this.ngxEditor = ngxEditor;\n }\n\n getBlocks$(): Observable<NgxEditorJsBlock[]> {\n return new Observable<NgxEditorJsBlock[]>((observer) => {\n lastValueFrom(\n this.blockMovementService.getNgxEditorJsBlocks().pipe(\n map((componentRefs) =>\n componentRefs.map<NgxEditorJsBlock>(({ instance }) => ({\n blockId: instance.formControlName(),\n sortIndex: instance.sortIndex(),\n componentInstanceName: instance.componentInstanceName,\n savedAction: instance.savedAction(),\n dataClean: instance.formGroup().get(instance.formControlName())\n ?.value,\n }))\n ),\n map((blocks) => blocks.sort((a, b) => a.sortIndex - b.sortIndex))\n )\n ).then((blocks) => {\n observer.next(blocks);\n observer.complete();\n });\n });\n }\n\n createNgxEditorJsBlockWithComponent(\n blockComponent: Type<BlockComponent>,\n componentContextPositionIndex: number\n ) {\n return of<NgxEditorJsBlockWithComponent>({\n blockId: createUID(),\n sortIndex: componentContextPositionIndex,\n componentInstanceName: blockComponent.name,\n component: blockComponent,\n // TODO - Force content-type for dataClean? JSON, HTML, etc.\n // TODO - And maybe rename dataClean to just data?\n dataClean: '',\n autofocus: true,\n });\n }\n\n addBlockComponent(\n ngxEditorJsBlock: NgxEditorJsBlockWithComponent\n ): Observable<void> {\n return forkJoin([\n this.createFormGroupControl(ngxEditorJsBlock),\n this.attachComponent(ngxEditorJsBlock),\n this.blockMovementService.updateComponentIndices(this.ngxEditor),\n ]).pipe(map(() => void 0));\n }\n\n createFormGroupControl({\n blockId,\n dataClean,\n }: NgxEditorJsBlockWithComponent) {\n return of(this.formBuilder.control(dataClean, [])).pipe(\n tap((formControl) => this.formGroup.addControl(blockId, formControl))\n );\n }\n\n attachComponent({\n component,\n blockId,\n autofocus,\n savedAction,\n sortIndex: index,\n }: NgxEditorJsBlockWithComponent) {\n return of(blockId).pipe(\n map((controlName) => {\n const componentRef = this.ngxEditor.createComponent(component, {\n index,\n });\n componentRef.setInput('sortIndex', index);\n componentRef.setInput('formGroup', this.formGroup);\n componentRef.setInput('formControlName', controlName);\n componentRef.setInput('autofocus', autofocus);\n\n savedAction && componentRef.instance.actionCallback?.(savedAction);\n\n this.blockMovementService.newComponentAttached(componentRef);\n return componentRef;\n })\n );\n }\n\n determineMovePositionAction(\n action: MovePositionActions,\n index: number,\n formControlName: string\n ) {\n return iif(\n () => action === MovePositionActions.DELETE,\n this.removeBlockComponent(index, formControlName),\n this.blockMovementService.moveBlockComponentPosition(\n this.ngxEditor,\n action,\n index\n )\n ).pipe(\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n )\n );\n }\n\n moveBlockComponentPosition(previousIndex: number, currentIndex: number) {\n return of(this.ngxEditor.get(previousIndex)).pipe(\n filter((viewRef) => !!viewRef),\n tap((viewRef) => {\n this.ngxEditor.move(viewRef, currentIndex);\n }),\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n ),\n defaultIfEmpty(false)\n );\n }\n\n removeBlockComponent(index: number, formControlName: string, clear = false) {\n return combineLatest([\n this.blockMovementService.removeBlockComponent(\n this.ngxEditor,\n index,\n clear\n ),\n of(this.formGroup.removeControl(formControlName)),\n ]);\n }\n\n clearBlocks() {\n return this.blockMovementService.getNgxEditorJsBlocks().pipe(\n filter((componentRefs) => componentRefs.length > 0),\n map((componentRefs) =>\n componentRefs.sort(\n (a, b) => a.instance.sortIndex() - b.instance.sortIndex()\n )\n ),\n mergeMap((componentRefs) =>\n forkJoin(\n Array.from(componentRefs.values()).map((componentRef) =>\n this.removeBlockComponent(\n componentRef.instance.sortIndex() + 1,\n componentRef.instance.formControlName(),\n true\n )\n )\n )\n ),\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n ),\n tap(() => {\n this.blockMovementService.clearComponentRefs();\n this.ngxEditor.clear();\n }),\n defaultIfEmpty(false)\n );\n }\n}\n","import { inject, Injectable, Type, ViewContainerRef } from '@angular/core';\nimport {\n BehaviorSubject,\n combineLatest,\n distinctUntilChanged,\n filter,\n lastValueFrom,\n map,\n switchMap,\n tap,\n} from 'rxjs';\nimport { ToolbarComponent } from '../components/toolbar/toolbar.component';\nimport { EditorJsService } from './editor-js.service';\nimport { NgxEditorJs2Service } from './ngx-editor-js2.service';\nimport {\n BlockOptionAction,\n BlockComponent,\n MovePositionActions,\n} from '../ngx-editor-js2.interface';\n\ntype ComponentContext = {\n index: number;\n viewContainerRef: ViewContainerRef;\n blockOptionActions: BlockOptionAction[];\n actionCallback: (v: string) => void;\n formControlName: string;\n} | null;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ToolFabService {\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n editorJsService = inject(EditorJsService);\n // I need to explain this in detail so the future me can understand this.\n componentContext = new BehaviorSubject<ComponentContext>(null);\n toolbarComponentRef$ = combineLatest({\n componentContext: this.componentContext.asObservable(),\n supportedBlocks: this.ngxEditorJs2Service.supportedBlocks$,\n }).pipe(\n filter(({ componentContext }) => componentContext !== null),\n distinctUntilChanged(\n ({ componentContext: previous }, { componentContext: current }) =>\n previous!.index !== current!.index ||\n previous!.viewContainerRef !== current!.viewContainerRef\n ? (previous!.viewContainerRef.clear(), false)\n : true\n ),\n map(({ componentContext, supportedBlocks }) => {\n const {\n index,\n viewContainerRef,\n blockOptionActions,\n actionCallback,\n formControlName,\n } = componentContext!;\n // TODO We will need to create a ToolbarBottomRailComponent to handle the mobile view\n const componentRef = viewContainerRef.createComponent(ToolbarComponent);\n componentRef.setInput('componentContextPositionIndex', index + 1);\n componentRef.setInput('supportedBlocks', supportedBlocks);\n componentRef.setInput('blockOptionActions', blockOptionActions);\n componentRef.setInput('actionCallback', actionCallback);\n componentRef.setInput('formControlName', formControlName);\n componentRef.setInput('addBlockCallback', this.addBlock.bind(this));\n componentRef.setInput(\n 'moveBlockPositionCallback',\n this.movePositionAction.bind(this)\n );\n return componentRef;\n }),\n );\n\n addBlock(block: Type<BlockComponent>, index: number) {\n return this.editorJsService\n .createNgxEditorJsBlockWithComponent(block, index)\n .pipe(\n switchMap((block) => this.editorJsService.addBlockComponent(block))\n );\n }\n\n movePositionAction(\n action: MovePositionActions,\n index: number,\n formControlName: string\n ) {\n return lastValueFrom(\n this.editorJsService.determineMovePositionAction(\n action,\n index,\n formControlName\n )\n );\n }\n}\n","import {\n ComponentRef,\n Directive,\n effect,\n HostListener,\n inject,\n input,\n ViewContainerRef,\n} from '@angular/core';\nimport { ToolFabService } from '../services/tool-fab.service';\nimport { Observable } from 'rxjs';\nimport { ToolbarComponent } from '../components/toolbar/toolbar.component';\nimport { BlockOptionAction } from '../ngx-editor-js2.interface';\n\nexport type ToolbarComponentRef = Observable<ComponentRef<ToolbarComponent>>;\n\n@Directive({\n selector: '[toolbarFab]',\n})\nexport class ToolbarFabDirective {\n toolFabService = inject(ToolFabService);\n viewContainerRef = inject(ViewContainerRef);\n\n autofocus = input<boolean>();\n blockOptionActions = input<BlockOptionAction[]>();\n actionCallback = input.required<(action: string) => void>();\n componentContextPositionIndex = input.required<number>();\n formControlName = input.required<string>();\n\n @HostListener('mouseenter') onMouseEnter() {\n this.toolFabService.componentContext.next({\n viewContainerRef: this.viewContainerRef,\n blockOptionActions: this.blockOptionActions() ?? [],\n actionCallback: this.actionCallback(),\n index: this.componentContextPositionIndex(),\n formControlName: this.formControlName(),\n });\n }\n\n constructor() {\n effect(() => {\n this.autofocus() && this.onMouseEnter();\n });\n }\n}\n","import {\n Directive,\n HostListener,\n} from '@angular/core';\n\n@Directive({\n selector: '[cleanPasteData]',\n})\nexport class CleanPasteDataDirective {\n @HostListener('paste', ['$event'])\n onPaste(event: Event) {\n event.preventDefault();\n const text = (event as ClipboardEvent).clipboardData?.getData('text/plain');\n document.execCommand('insertText', false, text);\n }\n}\n","import { Component, input, signal } from '@angular/core';\nimport { ControlAccessorDirective } from '../../directives/control-accessor.directive';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { AutofocusDirective } from '../../directives/autofocus.directive';\nimport { ToolbarFabDirective } from '../../directives/toolbar-fab.directive';\nimport { CleanPasteDataDirective } from '../../directives/clean-paste-data.directive';\nimport {\n BlockComponent,\n BlockOptionAction,\n} from '../../ngx-editor-js2.interface';\nimport { NgSwitch, NgSwitchCase, NgTemplateOutlet } from '@angular/common';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\n\n@Component({\n selector: 'header-block',\n host: { class: 'cdk-drag-animating' },\n hostDirectives: [CdkDrag],\n imports: [\n ReactiveFormsModule,\n ControlAccessorDirective,\n AutofocusDirective,\n ToolbarFabDirective,\n CleanPasteDataDirective,\n NgSwitch,\n NgSwitchCase,\n NgTemplateOutlet,\n ],\n template: `\n <ng-container [ngSwitch]=\"savedAction()\">\n <h1 *ngSwitchCase=\"'h1'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h1>\n <h2 *ngSwitchCase=\"'h2'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h2>\n <h3 *ngSwitchCase=\"'h3'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h3>\n <h4 *ngSwitchCase=\"'h4'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h4>\n <h5 *ngSwitchCase=\"'h5'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h5>\n <h6 *ngSwitchCase=\"'h6'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h6>\n </ng-container>\n\n <ng-template [formGroup]=\"formGroup()\" #sharedHeaderTemplate>\n <span\n controlAccessor\n cleanPasteData\n contentEditable\n toolbarFab\n [defaultValue]=\"formGroup().get(formControlName())?.value\"\n [actionCallback]=\"actionCallbackBind\"\n [blockOptionActions]=\"blockOptionActions()\"\n [autofocus]=\"autofocus()\"\n [formControlName]=\"formControlName()\"\n [componentContextPositionIndex]=\"sortIndex()\"\n ></span>\n </ng-template>\n `,\n styles: [\n `\n :host {\n display: block;\n position: relative;\n :is(h1, h2, h3, h4, h5, h6) {\n margin: 0;\n span {\n display: block;\n line-height: inherit;\n }\n }\n\n h1 > * {\n font: var(--mat-sys-display-large);\n }\n h2 > * {\n font: var(--mat-sys-display-medium);\n }\n h3 > * {\n font: var(--mat-sys-display-small);\n }\n h4 > * {\n font: var(--mat-sys-headline-large);\n }\n h5 > * {\n font: var(--mat-sys-headline-medium);\n }\n h6 > * {\n font: var(--mat-sys-headline-small);\n }\n }\n `,\n ],\n})\nexport class HeaderBlockComponent implements BlockComponent {\n sortIndex = input<number>(0);\n componentInstanceName = 'HeaderBlockComponent';\n autofocus = input<boolean>(true);\n formGroup = input.required<FormGroup>();\n formControlName = input.required<string>();\n blockOptionActions = input<BlockOptionAction[]>([\n { action: 'h1', text: 'H1' },\n { action: 'h2', text: 'H2' },\n { action: 'h3', text: 'H3' },\n { action: 'h4', text: 'H4' },\n { action: 'h5', text: 'H5' },\n { action: 'h6', text: 'H6' },\n ]);\n\n savedAction = signal<string>('h1');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(selectedAction: string) {\n this.savedAction.set(selectedAction);\n }\n}\n","import { Component, input, signal } from '@angular/core';\nimport { ControlAccessorDirective } from '../../directives/control-accessor.directive';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { AutofocusDirective } from '../../directives/autofocus.directive';\nimport { ToolbarFabDirective } from '../../directives/toolbar-fab.directive';\nimport { CleanPasteDataDirective } from '../../directives/clean-paste-data.directive';\nimport {\n BlockComponent,\n BlockOptionAction,\n} from '../../ngx-editor-js2.interface';\nimport { NgClass } from '@angular/common';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\n\n\n@Component({\n selector: 'paragraph-block',\n host: { class: 'cdk-drag-animating' },\n hostDirectives: [CdkDrag],\n imports: [\n ReactiveFormsModule,\n ControlAccessorDirective,\n AutofocusDirective,\n ToolbarFabDirective,\n CleanPasteDataDirective,\n NgClass,\n ],\n template: `\n <ng-container [formGroup]=\"formGroup()\">\n <p\n controlAccessor\n contentEditable\n toolbarFab\n cleanPasteData\n [ngClass]=\"savedAction()\"\n [defaultValue]=\"formGroup().get(formControlName())?.value\"\n [actionCallback]=\"actionCallbackBind\"\n [autofocus]=\"autofocus()\"\n [blockOptionActions]=\"blockOptionActions()\"\n [formControlName]=\"formControlName()\"\n [componentContextPositionIndex]=\"sortIndex()\"\n ></p>\n </ng-container>\n `,\n styles: [\n `\n :host {\n display: block;\n position: relative;\n .small {\n font: var(--mat-sys-body-small);\n }\n .medium {\n font: var(--mat-sys-body-medium);\n }\n .large {\n font: var(--mat-sys-body-large);\n }\n .title-small {\n font: var(--mat-sys-title-small);\n }\n .title-medium {\n font: var(--mat-sys-title-medium);\n }\n .title-large {\n font: var(--mat-sys-title-large);\n }\n }\n `,\n ],\n})\nexport class ParagraphBlockComponent implements BlockComponent {\n sortIndex = input<number>(0);\n componentInstanceName = 'ParagraphBlockComponent';\n autofocus = input<boolean>(true);\n formGroup = input.required<FormGroup>();\n formControlName = input.required<string>();\n blockOptionActions = input<BlockOptionAction[]>([\n { action: 'small', icon: 'density_small' },\n { action: 'medium', icon: 'density_medium' },\n { action: 'large', icon: 'density_large' },\n { action: 'title-small', text: 'TS' },\n { action: 'title-medium', text: 'TM' },\n { action: 'title-large', text: 'TL' },\n ]);\n\n savedAction = signal<string>('medium');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(action: string) {\n this.savedAction.update(() => action);\n }\n}\n","import { inject, Injectable, InjectionToken, Type } from '@angular/core';\nimport { HeaderBlockComponent } from '../components/blocks/header-block.component';\nimport { ParagraphBlockComponent } from '../components/blocks/paragraph-block.component';\nimport {\n BehaviorSubject,\n combineLatest,\n delay,\n exhaustMap,\n forkJoin,\n map,\n mergeMap,\n of,\n switchMap,\n} from 'rxjs';\nimport { EditorJsService } from './editor-js.service';\nimport {\n NgxEditorjsOptions,\n NgxEditorJsBlock,\n NgxEditorJsBlockWithComponent,\n SupportedBlock,\n BlockComponent,\n} from '../ngx-editor-js2.interface';\n\nexport const NGX_EDITORJS_OPTIONS = new InjectionToken<NgxEditorjsOptions>(\n 'NGX_EDITORJS_OPTIONS'\n);\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgxEditorJs2Service {\n editorJsService = inject(EditorJsService);\n\n consumerSupportedBlocks = new BehaviorSubject<SupportedBlock[]>(\n inject(NGX_EDITORJS_OPTIONS, { optional: true })?.consumerSupportedBlocks ??\n []\n );\n\n internalSupportedBlocks = new BehaviorSubject<SupportedBlock[]>([\n {\n name: 'Paragraph',\n component: ParagraphBlockComponent,\n componentInstanceName: 'ParagraphBlockComponent',\n },\n {\n name: 'Header',\n component: HeaderBlockComponent,\n componentInstanceName: 'HeaderBlockComponent',\n },\n ]);\n\n supportedBlocks$ = combineLatest([\n this.internalSupportedBlocks.asObservable(),\n this.consumerSupportedBlocks.asObservable(),\n ]).pipe(map(([internal, consumer]) => [...internal, ...consumer]));\n\n blocksToLoad = new BehaviorSubject<NgxEditorJsBlock[]>([]);\n\n loadBlocks$ = this.blocksToLoad.asObservable().pipe(\n delay(0),\n exhaustMap((blocks) => this.clearBlocksFromEditorJs(blocks)),\n map(([blocks]) => this.determineToloadDefaultBlocks(blocks)),\n map((blocks) => this.removeDuplicateBlocksWithSameIds(blocks)),\n map((blocks) => this.sortBlocks(blocks)),\n switchMap((blocks) => this.combineSupportBlocks(blocks)),\n map(([blocks, supportedBlocks]) =>\n this.createALookupMapForSupportedBlocks(blocks, supportedBlocks)\n ),\n map(({ blocks, supportedBlocksMap }) =>\n this.findAndMarshalBlocksComponent(blocks, supportedBlocksMap)\n ),\n mergeMap((blocks) =>\n this.addBlocksToEditorJs(blocks).pipe(map(() => blocks))\n )\n );\n\n clearBlocksFromEditorJs(blocks: NgxEditorJsBlock[]) {\n return forkJoin([of(blocks), this.editorJsService.clearBlocks()]);\n }\n\n determineToloadDefaultBlocks(blocks: NgxEditorJsBlock[]) {\n return blocks.length > 0 ? blocks : this.loadDefaultBlocks();\n }\n\n loadDefaultBlocks() {\n return [\n {\n blockId: 'tmdjr',\n sortIndex: 0,\n componentInstanceName: 'HeaderBlockComponent',\n dataClean: \"Let's get started... 🚀\",\n savedAction: 'h1',\n },\n ];\n }\n\n removeDuplicateBlocksWithSameIds(blocks: NgxEditorJsBlock[]) {\n return Array.from(\n new Map(blocks.map((block) => [block.blockId, block])).values()\n );\n }\n\n sortBlocks(blocks: NgxEditorJsBlock[]) {\n return blocks.sort((a, b) => a.sortIndex - b.sortIndex);\n }\n\n combineSupportBlocks(blocks: NgxEditorJsBlock[]) {\n return combineLatest([of(blocks), this.supportedBlocks$]);\n }\n\n createALookupMapForSupportedBlocks(\n blocks: NgxEditorJsBlock[],\n supportedBlocks: SupportedBlock[]\n ) {\n return {\n blocks,\n supportedBlocksMap: new Map(\n supportedBlocks.map((sb) => [sb.componentInstanceName, sb.component])\n ),\n };\n }\n\n findAndMarshalBlocksComponent(\n blocks: NgxEditorJsBlock[],\n supportedBlocksMap: Map<string, Type<BlockComponent>>\n ) {\n return blocks.map((block) => ({\n ...block,\n component:\n supportedBlocksMap.get(block.componentInstanceName) ??\n HeaderBlockComponent,\n }));\n }\n\n addBlocksToEditorJs(blocks: NgxEditorJsBlockWithComponent[]) {\n return combineLatest(\n blocks.map((block: NgxEditorJsBlockWithComponent) =>\n this.editorJsService.addBlockComponent(block)\n )\n );\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { EditorJsService } from '../services/editor-js.service';\nimport { NgxEditorJs2Service } from '../services/ngx-editor-js2.service';\nimport { NgxEditorJsBlock } from '../ngx-editor-js2.interface';\nimport { CdkDropList, CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { lastValueFrom } from 'rxjs';\n\n@Component({\n selector: 'editor-js',\n imports: [CdkDropList],\n template: `\n <div cdkDropList class=\"block-list\" (cdkDropListDropped)=\"drop($event)\">\n <ng-container #ngxEditor></ng-container>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n .block-list {\n min-height: 60px;\n }\n }\n `,\n ],\n})\nexport class EditorJsComponent {\n editorJsService = inject(EditorJsService);\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n\n bootstrapEditorJs = input();\n blocks = input.required({\n transform: (value: NgxEditorJsBlock[]) =>\n this.ngxEditorJs2Service.blocksToLoad.next(value),\n });\n\n ngxEditor = viewChild.required('ngxEditor', { read: ViewContainerRef });\n\n constructor() {\n effect(() => {\n this.editorJsService.setNgxEditor(this.ngxEditor());\n });\n }\n\n // * DEBUGGING\n // ngOnInit() {\n // this.editorJsService.formGroup.valueChanges.subscribe((value) => {\n // console.log('[formGroup.value] : ', value);\n // });\n // this.editorJsService.blockComponents$.subscribe((components) => {\n // console.log('[components] : ', components);\n // });\n // }\n\n drop(event: CdkDragDrop<string[]>) {\n lastValueFrom(\n this.editorJsService.moveBlockComponentPosition(\n event.previousIndex,\n event.currentIndex\n )\n ).then(() => {\n // DRAG ANIMATION HOT FIX\n // Wait for Angular to update the DOM, then remove the animation class\n requestAnimationFrame(() => {\n document.querySelectorAll('.cdk-drag-animating').forEach((el) => {\n const element = el as HTMLElement;\n element.classList.remove('cdk-drag-animating'); // Ensure old class is removed\n void element.offsetWidth; // Force reflow\n element.classList.add('cdk-drag-animating'); // Re-add for next drag\n });\n });\n });\n }\n}\n","import { NgIf } from '@angular/common';\nimport { Component, EventEmitter, Input, Output, Renderer2 } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatRippleModule } from '@angular/material/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatListModule } from '@angular/material/list';\n\n@Component({\n selector: 'toolbar-inline',\n imports: [MatListModule, MatIconModule, MatRippleModule, FormsModule, NgIf],\n template: `\n <div class=\"block-list-container mat-elevation-z8\">\n <div class=\"block-option-list-panel\">\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('bold')\"\n >\n <mat-icon>format_bold</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('italic')\"\n >\n <mat-icon>format_italic</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('underlined')\"\n >\n <mat-icon>format_underlined</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('strikethrough')\"\n >\n <mat-icon>strikethrough_s</mat-icon>\n </div>\n <!-- <div class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('hiliteColor', 'red')\">\n <mat-icon>highlight</mat-icon>\n </div> -->\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addCustomInlineTag('code', 'inline-code-example')\"\n >\n <mat-icon>code</mat-icon>\n </div>\n <div class=\"block-option-list-item\" matRipple (click)=\"openUrlInput()\">\n <mat-icon>insert_link</mat-icon>\n </div>\n <div class=\"block-option-list-item\" matRipple (click)=\"clearTags()\">\n <mat-icon>format_clear</mat-icon>\n </div>\n\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('justifyLeft')\"\n >\n <mat-icon>format_align_left</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('justifyCenter')\"\n >\n <mat-icon>format_align_center</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('justifyRight')\"\n >\n <mat-icon>format_align_right</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('justifyFull')\"\n >\n <mat-icon>format_align_justify</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('insertUnorderedList')\"\n >\n <mat-icon>format_list_bulleted</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('insertOrderedList')\"\n >\n <mat-icon>format_list_numbered</mat-icon>\n </div>\n <div\n class=\"block-option-list-item\"\n matRipple\n (click)=\"addInlineTag('hiliteColor', 'yellow')\"\n >\n <mat-icon>highlight</mat-icon>\n </div>\n </div>\n <div *ngIf=\"showURLInputField\" class=\"block-option-list-panel\">\n <input\n type=\"text\"\n placeholder=\"Enter URL\"\n class=\"block-option-input\"\n [(ngModel)]=\"url\"\n />\n <div class=\"block-option-list-item\" matRipple (click)=\"createLink()\">\n <mat-icon>add</mat-icon>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n :host {\n color: var(--mat-sys-on-secondary);\n background: var(--mat-sys-secondary);\n .block-list-container {\n border-radius: 4px;\n }\n\n .block-option-list-panel {\n display: flex;\n width: 230px;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 1px;\n border-radius: 4px;\n overflow: auto;\n }\n\n .block-option-list-item {\n cursor: pointer;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n }\n\n .block-option-input {\n width: 197px;\n height: 32px;\n border: none;\n outline: none;\n background-color: transparent;\n color: #000;\n font-size: 14px;\n font-weight: 400;\n padding: 0 0 0 5px;\n margin: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n box-sizing: border-box;\n }\n\n .block-option-list-item-text {\n font-size: 16px;\n }\n\n .block-option-list-item-text {\n user-select: none;\n }\n }\n `,\n ],\n})\nexport class ToolbarInlineComponent {\n @Input() selection!: Selection;\n\n @Output('closeInlineToobarOverlay') closeInlineToobarOverlayEmitter =\n new EventEmitter();\n\n url: string = '';\n showURLInputField: boolean = false;\n savedRanges: Range[] = [];\n\n constructor(private readonly renderer: Renderer2) {}\n\n ngOnInit(): void {}\n\n closeInlineToobarOverlay() {\n this.closeInlineToobarOverlayEmitter.emit();\n }\n\n addInlineTag(tag: string, optionValue?: string | null) {\n // https://stackoverflow.com/questions/60581285/execcommand-is-now-obsolete-whats-the-alternative\n document.execCommand(tag, true, optionValue!);\n this.closeInlineToobarOverlay();\n }\n\n addCustomInlineTag(tag: string, className?: string | null) {\n const range = this.selection.getRangeAt(0);\n const element = this.renderer.createElement(tag);\n element.className = className ?? '';\n element.innerHTML = range.toString();\n range.deleteContents();\n range.insertNode(element);\n this.closeInlineToobarOverlay();\n }\n\n clearTags() {\n document.execCommand('removeFormat');\n document.execCommand('unlink');\n this.closeInlineToobarOverlay();\n }\n\n openUrlInput() {\n this.savedRanges.push(this.selection.getRangeAt(0));\n this.showURLInputField = true;\n }\n\n createLink() {\n this.selection.removeAllRanges();\n this.selection.addRange(this.savedRanges.pop()!);\n document.execCommand('createLink', false, this.url);\n this.closeInlineToobarOverlay();\n }\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { inject, Injectable } from '@angular/core';\nimport { exhaustMap, filter, lastValueFrom, map, merge, of, tap } from 'rxjs';\nimport { ToolbarInlineComponent } from '../components/toolbar-inline/toolbar-inline.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ToolbarInlineService {\n overlay = inject(Overlay);\n overlayRef!: OverlayRef;\n\n determineToDisplayInlineToolbarBlock(_event: Event) {\n this.overlayRef?.hasAttached() && this.overlayRef.dispose(); // So hacky\n return of(window.getSelection()).pipe(\n filter((selection) => selection !== null),\n filter((selection) => selection.rangeCount > 0),\n filter((selection) => selection.toString().length > 0),\n filter((selection) => selection.toString() !== ''),\n map((selection) => ({\n selection,\n parant: this.getSelectionParent(selection),\n })),\n filter(({ parant }) => this.isSelectionInABlock(parant as HTMLElement)),\n exhaustMap(({ selection }) => this.attachInlineToolbar(selection))\n );\n }\n\n getSelectionParent(selection: Selection): HTMLElement | null {\n const range = selection.getRangeAt(0);\n return range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\n ? (range.commonAncestorContainer as HTMLElement)\n : range.commonAncestorContainer.parentElement;\n }\n\n isSelectionInABlock(target: HTMLElement | null) {\n return !!target && target.closest('ngx-editor-js2') !== null;\n }\n\n attachInlineToolbar(selection: Selection) {\n return of(selection.getRangeAt(0)).pipe(\n map((range) => range.getBoundingClientRect()),\n map((selectionRect) => this.createOverlay(selectionRect)),\n tap((overlayRef) => (this.overlayRef = overlayRef)),\n map((overlayRef) => {\n // To tired to do this properly right now\n // passing the refs down the pipe adds a bug\n // user selects text with a drag\n // (mousedown → mousemove → wait → mousemove → mouseup)\n const { instance: inlineToolbar } = overlayRef.attach(\n new ComponentPortal(ToolbarInlineComponent)\n );\n inlineToolbar.selection = selection;\n lastValueFrom(\n merge(\n overlayRef.backdropClick(),\n inlineToolbar.closeInlineToobarOverlayEmitter\n ).pipe(\n tap(() => overlayRef.dispose()),\n tap(() => selection.removeAllRanges())\n )\n );\n return true;\n })\n );\n }\n\n createOverlay(selectionRect: DOMRect) {\n return this.overlay.create({\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(selectionRect)\n .withPositions([\n {\n offsetY: 8,\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]),\n });\n }\n}\n","import { Component, inject, input, output } from '@angular/core';\nimport { EditorJsComponent } from './components/editor-js.component';\nimport { AsyncPipe } from '@angular/common';\nimport {\n combineLatest,\n debounceTime,\n fromEvent,\n Observable,\n switchMap,\n} from 'rxjs';\nimport { ToolFabService } from './services/tool-fab.service';\nimport { NgxEditorJsBlock } from './ngx-editor-js2.interface';\nimport { ToolbarInlineService } from './services/toolbar-inline.service';\nimport { EditorJsService } from './services/editor-js.service';\nimport { NgxEditorJs2Service } from './services/ngx-editor-js2.service';\n\n@Component({\n selector: 'ngx-editor-js2',\n imports: [EditorJsComponent, AsyncPipe],\n template: `\n <editor-js\n [blocks]=\"blocks()\"\n [bootstrapEditorJs]=\"bootstrapEditorJs$ | async\"\n ></editor-js>\n `,\n})\nexport class NgxEditorJs2Component {\n inlineToolbarSerivce = inject(ToolbarInlineService);\n editorJsService = inject(EditorJsService);\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n\n blocks = input<NgxEditorJsBlock[]>([]);\n blocksRequested = output<Observable<NgxEditorJsBlock[]>>();\n requestBlocks = input.required({\n transform: (_v: unknown) =>\n this.blocksRequested.emit(this.editorJsService.getBlocks$()),\n });\n\n bootstrapEditorJs$ = combineLatest([\n inject(ToolFabService).toolbarComponentRef$,\n this.ngxEditorJs2Service.loadBlocks$,\n fromEvent(document, 'selectionchange').pipe(\n debounceTime(200),\n switchMap((event) =>\n this.inlineToolbarSerivce.determineToDisplayInlineToolbarBlock(event)\n )\n )\n ]);\n}\n","/*\n * Public API Surface of ngx-editor-js2\n */\n\nexport * from './lib/services/ngx-editor-js2.service';\nexport * from './lib/ngx-editor-js2.component';\nexport type * from './lib/ngx-editor-js2.interface';\nexport * from './lib/directives/autofocus.directive';\nexport * from './lib/directives/toolbar-fab.directive';\nexport * from './lib/directives/control-accessor.directive';\nexport * from './lib/directives/clean-paste-data.directive';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tmdjr-ngx-editor-js2.mjs","sources":["../../../projects/ngx-editor-js2/src/lib/directives/control-accessor.directive.ts","../../../projects/ngx-editor-js2/src/lib/directives/autofocus.directive.ts","../../../projects/ngx-editor-js2/src/lib/ngx-editor-js2.interface.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar-block-options.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar-blocks.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar/toolbar.component.ts","../../../projects/ngx-editor-js2/src/lib/services/block-movement.service.ts","../../../projects/ngx-editor-js2/src/lib/services/editor-js.service.ts","../../../projects/ngx-editor-js2/src/lib/services/tool-fab.service.ts","../../../projects/ngx-editor-js2/src/lib/directives/toolbar-fab.directive.ts","../../../projects/ngx-editor-js2/src/lib/directives/clean-paste-data.directive.ts","../../../projects/ngx-editor-js2/src/lib/components/blocks/header-block.component.ts","../../../projects/ngx-editor-js2/src/lib/components/blocks/paragraph-block.component.ts","../../../projects/ngx-editor-js2/src/lib/services/ngx-editor-js2.service.ts","../../../projects/ngx-editor-js2/src/lib/components/editor-js.component.ts","../../../projects/ngx-editor-js2/src/lib/components/toolbar-inline/toolbar-inline.component.ts","../../../projects/ngx-editor-js2/src/lib/services/toolbar-inline.service.ts","../../../projects/ngx-editor-js2/src/lib/ngx-editor-js2.component.ts","../../../projects/ngx-editor-js2/src/public-api.ts","../../../projects/ngx-editor-js2/src/tmdjr-ngx-editor-js2.ts"],"sourcesContent":["import {\n Directive,\n ElementRef,\n forwardRef,\n HostListener,\n inject,\n input,\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\n\n@Directive({\n selector: '[controlAccessor]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ControlAccessorDirective),\n multi: true,\n },\n ],\n})\nexport class ControlAccessorDirective implements ControlValueAccessor {\n elementRef = inject(ElementRef);\n\n defaultValue = input<string>();\n\n onChange: (value: any) => void = () => {};\n onTouched: () => void = () => {};\n\n writeValue(): void {\n this.elementRef.nativeElement.innerHTML = this.defaultValue() || '';\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn;\n }\n\n @HostListener('blur')\n onBlur(): void {\n this.onTouched();\n }\n\n @HostListener('input')\n onInput(): void {\n this.onChange(this.elementRef.nativeElement.innerHTML);\n }\n}\n","import {\n AfterContentInit,\n Directive,\n ElementRef,\n inject,\n input,\n} from '@angular/core';\n\n@Directive({\n selector: '[autofocus]',\n})\nexport class AutofocusDirective implements AfterContentInit {\n elementRef = inject(ElementRef);\n\n autofocus = input<boolean>(false);\n\n ngAfterContentInit() {\n this.autofocus() && this.elementRef.nativeElement.focus?.();\n }\n}\n","import { InjectionToken, InputSignal, Signal, Type } from '@angular/core';\nimport { FormGroup } from '@angular/forms';\nimport { Observable } from 'rxjs';\n\nexport interface NgxEditorjsOptions {\n consumerSupportedBlocks?: SupportedBlock[];\n}\nexport interface SupportedBlock {\n name: string;\n componentInstanceName: string;\n component: Type<BlockComponent>;\n}\n\nexport interface NgxEditorJsBlock {\n blockId: string;\n sortIndex: number;\n componentInstanceName: string;\n dataClean: string;\n savedAction?: string;\n}\nexport interface NgxEditorJsBlockWithComponent extends NgxEditorJsBlock {\n component: Type<BlockComponent>;\n autofocus?: boolean;\n}\n\nexport interface BlockComponent {\n sortIndex: InputSignal<number>;\n componentInstanceName: string;\n formControlName: InputSignal<string>;\n formGroup: InputSignal<FormGroup>;\n blockOptionActions: InputSignal<BlockOptionAction[]>;\n savedAction: Signal<string>;\n actionCallback?: (string: string) => void;\n}\n\nexport interface BlockOptionAction {\n action: string;\n icon?: string;\n text?: string;\n}\n\nexport enum MovePositionActions {\n UP = 'UP',\n DOWN = 'DOWN',\n DELETE = 'DELETE',\n}\n\nexport type TAddBlockCallback = (\n block: Type<BlockComponent>,\n index: number\n) => Observable<unknown>;\n\nexport type TMoveBlockPositionCallback = (\n action: MovePositionActions,\n index: number\n) => Observable<unknown>;\n","import { Component, input, output } from '@angular/core';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatRipple } from '@angular/material/core';\nimport {\n BlockOptionAction,\n MovePositionActions,\n} from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar-block-options',\n imports: [MatIcon, MatRipple],\n template: `\n <div class=\"actions-panel mat-elevation-z24\">\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.UP)\">\n <mat-icon>arrow_upward</mat-icon>\n </div>\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.DELETE)\">\n <mat-icon>delete</mat-icon>\n </div>\n <div class=\"action-btn\" matRipple (click)=\"movePosition(Position.DOWN)\">\n <mat-icon>arrow_downward</mat-icon>\n </div>\n @for(blockOptionAction of blockOptionActions(); track $index) {\n <div\n class=\"action-btn\"\n (click)=\"handleAction(blockOptionAction.action)\"\n matRipple\n >\n @if (blockOptionAction.text) {\n {{ blockOptionAction.text }}\n } @else {\n <mat-icon>{{ blockOptionAction.icon }}</mat-icon>\n }\n </div>\n }\n </div>\n `,\n styles: [\n `\n :host {\n .actions-panel {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 1px;\n width: 128px;\n max-height: 128px;\n border-radius: 4px;\n overflow: auto;\n background: var(--mat-sys-secondary);\n .action-btn {\n cursor: pointer;\n width: 42px;\n height: 42px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n\n color: var(--mat-sys-on-secondary);\n background: var(--mat-sys-secondary);\n &:hover,\n &:focus {\n color: var(--mat-sys-secondary);\n background: var(--mat-sys-on-secondary);\n }\n }\n }\n }\n `,\n ],\n})\nexport class ToolbarBlockOptionsComponent {\n readonly Position = MovePositionActions;\n\n blockOptionActions = input<BlockOptionAction[]>();\n\n handleActionEmitter = output<string>({ alias: 'handleAction' });\n moveBlockPositionEmitter = output<MovePositionActions>({\n alias: 'moveBlockPosition',\n });\n\n movePosition(action: MovePositionActions) {\n this.moveBlockPositionEmitter.emit(action);\n }\n\n handleAction(action: string) {\n this.handleActionEmitter.emit(action);\n }\n}\n","import { AsyncPipe } from '@angular/common';\nimport { Component, input, output, Type } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { MatRipple } from '@angular/material/core';\nimport { MatFormField, MatLabel } from '@angular/material/form-field';\nimport { MatInput } from '@angular/material/input';\nimport { MatList, MatListItem } from '@angular/material/list';\nimport { combineLatest, map, startWith } from 'rxjs';\nimport { BlockComponent, SupportedBlock } from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar-blocks',\n imports: [\n MatFormField,\n MatInput,\n MatList,\n MatListItem,\n MatRipple,\n MatLabel,\n ReactiveFormsModule,\n AsyncPipe,\n ],\n template: `\n <div class=\"block-list-container mat-elevation-z24\">\n <mat-form-field appearance=\"fill\" color=\"accent\">\n <mat-label>Filter</mat-label>\n <input\n class=\"filter-text\"\n matInput\n [formControl]=\"blockCtrl\"\n [autofocus]=\"true\"\n />\n </mat-form-field>\n @if(filteredBlocks$ | async; as filteredBlocks) {\n <mat-list class=\"block-list-panel\">\n @if (filteredBlocks.length <= 0) {\n <mat-list-item matRipple mat-list-item> No Results </mat-list-item>\n } @else { @for(block of filteredBlocks; track $index) {\n <mat-list-item matRipple mat-list-item (click)=\"addBlock(block)\">\n {{ block.name }}\n </mat-list-item>\n } }\n </mat-list>\n }\n </div>\n `,\n styles: [\n `\n :host {\n .mat-mdc-list-base {\n padding-top: 0px;\n margin-top: -14px;\n }\n\n .block-list-container {\n background: var(--mat-sys-secondary-container);\n border-radius: 4px;\n }\n\n .block-list-panel {\n max-width: 280px;\n max-height: 240px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n overflow: auto;\n color: var(--mat-sys-on-secondary-container);\n }\n\n mat-list-item {\n cursor: pointer;\n user-select: none;\n &:hover,\n &:focus {\n background: var(--mat-sys-surface-bright);\n }\n }\n }\n `,\n ],\n})\nexport class ToolbarBlocksComponent {\n addBlockEmitter = output<Type<BlockComponent>>({ alias: 'addBlock' });\n supportedBlocks = input<SupportedBlock[]>([]);\n supportedBlocks$ = toObservable(this.supportedBlocks);\n\n blockCtrl = new FormControl([]);\n filter$ = this.blockCtrl.valueChanges.pipe(startWith(''));\n\n filteredBlocks$ = combineLatest([this.supportedBlocks$, this.filter$]).pipe(\n map(([blocks, filterString]) => {\n if (typeof filterString !== 'string') filterString = '';\n filterString = filterString.replace(/\\\\/g, '');\n const pattern = filterString\n ?.split('')\n .map((v: string) => `(?=.*${v})`)\n .join('');\n const regex = new RegExp(`${pattern}`, 'gi');\n\n // return blocks.filter(block => regex.exec(block));\n return blocks.filter((block) => block.name.match(regex));\n })\n );\n\n addBlock(block: SupportedBlock) {\n this.addBlockEmitter.emit(block?.component);\n }\n}\n","import { Component, input, signal, Type } from '@angular/core';\nimport { MatRipple } from '@angular/material/core';\nimport { CdkDragHandle } from '@angular/cdk/drag-drop';\nimport { OverlayModule } from '@angular/cdk/overlay';\nimport { ToolbarBlockOptionsComponent } from './toolbar-block-options.component';\nimport { ToolbarBlocksComponent } from './toolbar-blocks.component';\nimport { firstValueFrom } from 'rxjs';\nimport {\n BlockComponent,\n BlockOptionAction,\n MovePositionActions,\n SupportedBlock,\n TAddBlockCallback,\n TMoveBlockPositionCallback,\n} from '../../ngx-editor-js2.interface';\n\n@Component({\n selector: 'toolbar',\n imports: [\n CdkDragHandle,\n MatRipple,\n OverlayModule,\n ToolbarBlockOptionsComponent,\n ToolbarBlocksComponent,\n ],\n template: `\n <div class=\"toolbar-buttons-container\">\n <div\n class=\"toolbar-buttons mat-elevation-z4\"\n #blockListTigger=\"cdkOverlayOrigin\"\n cdkOverlayOrigin\n matRipple\n (click)=\"openBlocksList()\"\n >\n <span class=\"material-icons\">add</span>\n </div>\n <div\n class=\"toolbar-buttons mat-elevation-z4\"\n #blockOptionListTigger=\"cdkOverlayOrigin\"\n cdkDragHandle\n cdkOverlayOrigin\n matRipple\n (click)=\"openBlockOptionList()\"\n >\n <span class=\"material-icons\">drag_indicator</span>\n </div>\n </div>\n\n <!-- Block type search list -->\n <ng-template\n cdkConnectedOverlay\n (overlayOutsideClick)=\"openBlocks.set(false)\"\n [cdkConnectedOverlayOrigin]=\"blockListTigger\"\n [cdkConnectedOverlayOpen]=\"openBlocks()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOffsetY]=\"15\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n >\n <toolbar-blocks\n [supportedBlocks]=\"supportedBlocks()\"\n (addBlock)=\"addBlock($event)\"\n ></toolbar-blocks>\n </ng-template>\n\n <!-- Options List-->\n <ng-template\n cdkConnectedOverlay\n (overlayOutsideClick)=\"openBlocksOption.set(false)\"\n [cdkConnectedOverlayOrigin]=\"blockOptionListTigger\"\n [cdkConnectedOverlayOpen]=\"openBlocksOption()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayOffsetX]=\"-49\"\n [cdkConnectedOverlayOffsetY]=\"15\"\n [cdkConnectedOverlayBackdropClass]=\"'cdk-overlay-transparent-backdrop'\"\n >\n <toolbar-block-options\n [blockOptionActions]=\"blockOptionActions()\"\n (handleAction)=\"handleAction($event)\"\n (moveBlockPosition)=\"moveBlockPosition($event)\"\n ></toolbar-block-options>\n </ng-template>\n `,\n styles: [\n `\n :host {\n .toolbar-buttons-container {\n position: relative;\n display: flex;\n gap: 10px;\n }\n .toolbar-buttons {\n cursor: pointer;\n width: 30px;\n height: 30px;\n display: flex;\n justify-content: center;\n align-items: center;\n border-radius: 4px;\n margin-bottom: 14px;\n user-select: none;\n color: var(--mat-sys-on-tertiary-container);\n background: var(--mat-sys-tertiary-container);\n }\n .toolbar-buttons {\n &:hover,\n &:focus {\n background: var(--mat-sys-surface-bright);\n }\n }\n }\n @media (min-width: 768px) {\n :host {\n position: absolute;\n margin-left: -80px;\n top: 0;\n }\n }\n `,\n ],\n})\nexport class ToolbarComponent {\n componentContextPositionIndex = input.required<number>();\n supportedBlocks = input.required<SupportedBlock[]>();\n blockOptionActions = input<BlockOptionAction[]>();\n actionCallback = input<(action: string) => void>(() => () => {});\n formControlName = input<string>();\n addBlockCallback = input.required<TAddBlockCallback>();\n moveBlockPositionCallback = input.required<TMoveBlockPositionCallback>();\n\n openBlocks = signal<boolean>(false);\n openBlocksOption = signal<boolean>(false);\n\n openBlocksList() {\n this.openBlocks.update((prev) => !prev);\n }\n\n openBlockOptionList() {\n this.openBlocksOption.update((prev) => !prev);\n }\n\n moveBlockPosition(action: MovePositionActions) {\n this.closeLists();\n this.moveBlockPositionCallback()(\n action,\n this.componentContextPositionIndex()\n );\n }\n\n handleAction(action: string) {\n this.closeLists();\n this.actionCallback()(action);\n }\n\n addBlock(block: Type<BlockComponent>) {\n this.closeLists();\n firstValueFrom(\n this.addBlockCallback()(block, this.componentContextPositionIndex())\n );\n }\n\n closeLists() {\n this.openBlocks.set(false);\n this.openBlocksOption.set(false);\n }\n}\n","import { ComponentRef, Injectable, ViewContainerRef } from '@angular/core';\nimport { defaultIfEmpty, filter, from, map, of, tap } from 'rxjs';\nimport {\n BlockComponent,\n MovePositionActions,\n} from '../ngx-editor-js2.interface';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class BlockMovementService {\n componentRefMap = new Map<object, ComponentRef<BlockComponent>>();\n\n clearComponentRefs() {\n this.componentRefMap.clear();\n }\n\n getNgxEditorJsBlocks() {\n return of(Array.from(this.componentRefMap.values()));\n }\n\n newComponentAttached(componentRef: ComponentRef<BlockComponent>) {\n this.componentRefMap.set(componentRef.instance, componentRef);\n }\n\n updateComponentIndices(ngxEditor: ViewContainerRef) {\n return from(this.componentRefMap.values()).pipe(\n tap((componentRef: any) =>\n componentRef.setInput(\n 'sortIndex',\n ngxEditor.indexOf(componentRef.hostView)\n )\n )\n );\n }\n\n moveBlockComponentPosition(\n ngxEditor: ViewContainerRef,\n action: MovePositionActions,\n index: number\n ) {\n return of(Array.from(this.componentRefMap.values())).pipe(\n map((componentRefs) =>\n componentRefs.find(\n (componentRef) =>\n ngxEditor.indexOf(componentRef.hostView) === index - 1\n )\n ),\n filter((componentRef) => !!componentRef),\n map((componentRef) => ({\n componentRef,\n totalComponents: ngxEditor.length - 1,\n currentIndex: ngxEditor.indexOf(componentRef.hostView),\n newIndex: (index: number) =>\n action === MovePositionActions.UP ? index - 1 : index + 1,\n })),\n map(({ componentRef, totalComponents, currentIndex, newIndex }) => ({\n componentRef,\n currentIndex,\n newIndex: Math.max(\n 0,\n Math.min(newIndex(currentIndex), totalComponents)\n ),\n })),\n filter(({ currentIndex, newIndex }) => currentIndex !== newIndex),\n tap(({ componentRef, newIndex }) => {\n ngxEditor.move(componentRef.hostView, newIndex);\n componentRef.setInput('sortIndex', newIndex);\n componentRef.setInput('autofocus', true);\n }),\n defaultIfEmpty(false)\n );\n }\n\n removeBlockComponent(\n ngxEditor: ViewContainerRef,\n index: number,\n clear = false\n ) {\n return of(Array.from(this.componentRefMap.values())).pipe(\n filter((componentRefs) => clear || componentRefs.length !== 1),\n map((componentRefs) =>\n componentRefs.find(\n (componentRef) =>\n ngxEditor.indexOf(componentRef.hostView) === index - 1\n )\n ),\n map((componentRef) =>\n this.componentRefMap.delete(componentRef?.instance ?? {})\n ),\n tap((successful) => successful && ngxEditor.remove(index - 1)),\n defaultIfEmpty(false)\n );\n }\n}\n","import { inject, Injectable, Type, ViewContainerRef } from '@angular/core';\nimport { FormBuilder } from '@angular/forms';\nimport {\n combineLatest,\n defaultIfEmpty,\n filter,\n forkJoin,\n iif,\n lastValueFrom,\n map,\n mergeMap,\n Observable,\n of,\n switchMap,\n tap,\n} from 'rxjs';\nimport {\n BlockComponent,\n MovePositionActions,\n NgxEditorJsBlock,\n NgxEditorJsBlockWithComponent,\n} from '../ngx-editor-js2.interface';\nimport { BlockMovementService } from './block-movement.service';\n\nconst createUID = () => Math.random().toString(36).substring(7);\n@Injectable({\n providedIn: 'root',\n})\nexport class EditorJsService {\n formBuilder = inject(FormBuilder);\n blockMovementService = inject(BlockMovementService);\n\n componentRefMap = new Map<object, unknown>();\n\n ngxEditor!: ViewContainerRef;\n formGroup = this.formBuilder.group({});\n\n // TODO - Handle this idiomatically\n setNgxEditor(ngxEditor: ViewContainerRef) {\n this.ngxEditor = ngxEditor;\n }\n\n getBlocks$(): Observable<NgxEditorJsBlock[]> {\n return new Observable<NgxEditorJsBlock[]>((observer) => {\n lastValueFrom(\n this.blockMovementService.getNgxEditorJsBlocks().pipe(\n map((componentRefs) =>\n componentRefs.map<NgxEditorJsBlock>(({ instance }) => ({\n blockId: instance.formControlName(),\n sortIndex: instance.sortIndex(),\n componentInstanceName: instance.componentInstanceName,\n savedAction: instance.savedAction(),\n dataClean: instance.formGroup().get(instance.formControlName())\n ?.value,\n }))\n ),\n map((blocks) => blocks.sort((a, b) => a.sortIndex - b.sortIndex))\n )\n ).then((blocks) => {\n observer.next(blocks);\n observer.complete();\n });\n });\n }\n\n createNgxEditorJsBlockWithComponent(\n blockComponent: Type<BlockComponent>,\n componentContextPositionIndex: number\n ) {\n return of<NgxEditorJsBlockWithComponent>({\n blockId: createUID(),\n sortIndex: componentContextPositionIndex,\n componentInstanceName: blockComponent.name,\n component: blockComponent,\n // TODO - Force content-type for dataClean? JSON, HTML, etc.\n // TODO - And maybe rename dataClean to just data?\n dataClean: '',\n autofocus: true,\n });\n }\n\n addBlockComponent(\n ngxEditorJsBlock: NgxEditorJsBlockWithComponent\n ): Observable<void> {\n return forkJoin([\n this.createFormGroupControl(ngxEditorJsBlock),\n this.attachComponent(ngxEditorJsBlock),\n this.blockMovementService.updateComponentIndices(this.ngxEditor),\n ]).pipe(map(() => void 0));\n }\n\n createFormGroupControl({\n blockId,\n dataClean,\n }: NgxEditorJsBlockWithComponent) {\n return of(this.formBuilder.control(dataClean, [])).pipe(\n tap((formControl) => this.formGroup.addControl(blockId, formControl))\n );\n }\n\n attachComponent({\n component,\n blockId,\n autofocus,\n savedAction,\n sortIndex: index,\n }: NgxEditorJsBlockWithComponent) {\n return of(blockId).pipe(\n map((controlName) => {\n const componentRef = this.ngxEditor.createComponent(component, {\n index,\n });\n componentRef.setInput('sortIndex', index);\n componentRef.setInput('formGroup', this.formGroup);\n componentRef.setInput('formControlName', controlName);\n componentRef.setInput('autofocus', autofocus);\n\n savedAction && componentRef.instance.actionCallback?.(savedAction);\n\n this.blockMovementService.newComponentAttached(componentRef);\n return componentRef;\n })\n );\n }\n\n determineMovePositionAction(\n action: MovePositionActions,\n index: number,\n formControlName: string\n ) {\n return iif(\n () => action === MovePositionActions.DELETE,\n this.removeBlockComponent(index, formControlName),\n this.blockMovementService.moveBlockComponentPosition(\n this.ngxEditor,\n action,\n index\n )\n ).pipe(\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n )\n );\n }\n\n moveBlockComponentPosition(previousIndex: number, currentIndex: number) {\n return of(this.ngxEditor.get(previousIndex)).pipe(\n filter((viewRef) => !!viewRef),\n tap((viewRef) => {\n this.ngxEditor.move(viewRef, currentIndex);\n }),\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n ),\n defaultIfEmpty(false)\n );\n }\n\n removeBlockComponent(index: number, formControlName: string, clear = false) {\n return combineLatest([\n this.blockMovementService.removeBlockComponent(\n this.ngxEditor,\n index,\n clear\n ),\n of(this.formGroup.removeControl(formControlName)),\n ]);\n }\n\n clearBlocks() {\n return this.blockMovementService.getNgxEditorJsBlocks().pipe(\n filter((componentRefs) => componentRefs.length > 0),\n map((componentRefs) =>\n componentRefs.sort(\n (a, b) => a.instance.sortIndex() - b.instance.sortIndex()\n )\n ),\n mergeMap((componentRefs) =>\n forkJoin(\n Array.from(componentRefs.values()).map((componentRef) =>\n this.removeBlockComponent(\n componentRef.instance.sortIndex() + 1,\n componentRef.instance.formControlName(),\n true\n )\n )\n )\n ),\n switchMap(() =>\n this.blockMovementService.updateComponentIndices(this.ngxEditor)\n ),\n tap(() => {\n this.blockMovementService.clearComponentRefs();\n this.ngxEditor.clear();\n }),\n defaultIfEmpty(false)\n );\n }\n}\n","import { inject, Injectable, Type, ViewContainerRef } from '@angular/core';\nimport {\n BehaviorSubject,\n combineLatest,\n distinctUntilChanged,\n filter,\n lastValueFrom,\n map,\n switchMap,\n tap,\n} from 'rxjs';\nimport { ToolbarComponent } from '../components/toolbar/toolbar.component';\nimport { EditorJsService } from './editor-js.service';\nimport { NgxEditorJs2Service } from './ngx-editor-js2.service';\nimport {\n BlockOptionAction,\n BlockComponent,\n MovePositionActions,\n} from '../ngx-editor-js2.interface';\n\ntype ComponentContext = {\n index: number;\n viewContainerRef: ViewContainerRef;\n blockOptionActions: BlockOptionAction[];\n actionCallback: (v: string) => void;\n formControlName: string;\n} | null;\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ToolFabService {\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n editorJsService = inject(EditorJsService);\n // I need to explain this in detail so the future me can understand this.\n componentContext = new BehaviorSubject<ComponentContext>(null);\n toolbarComponentRef$ = combineLatest({\n componentContext: this.componentContext.asObservable(),\n supportedBlocks: this.ngxEditorJs2Service.supportedBlocks$,\n }).pipe(\n filter(({ componentContext }) => componentContext !== null),\n distinctUntilChanged(\n ({ componentContext: previous }, { componentContext: current }) =>\n previous!.index !== current!.index ||\n previous!.viewContainerRef !== current!.viewContainerRef\n ? (previous!.viewContainerRef.clear(), false)\n : true\n ),\n map(({ componentContext, supportedBlocks }) => {\n const {\n index,\n viewContainerRef,\n blockOptionActions,\n actionCallback,\n formControlName,\n } = componentContext!;\n // TODO We will need to create a ToolbarBottomRailComponent to handle the mobile view\n const componentRef = viewContainerRef.createComponent(ToolbarComponent);\n componentRef.setInput('componentContextPositionIndex', index + 1);\n componentRef.setInput('supportedBlocks', supportedBlocks);\n componentRef.setInput('blockOptionActions', blockOptionActions);\n componentRef.setInput('actionCallback', actionCallback);\n componentRef.setInput('formControlName', formControlName);\n componentRef.setInput('addBlockCallback', this.addBlock.bind(this));\n componentRef.setInput(\n 'moveBlockPositionCallback',\n this.movePositionAction.bind(this)\n );\n return componentRef;\n }),\n );\n\n addBlock(block: Type<BlockComponent>, index: number) {\n return this.editorJsService\n .createNgxEditorJsBlockWithComponent(block, index)\n .pipe(\n switchMap((block) => this.editorJsService.addBlockComponent(block))\n );\n }\n\n movePositionAction(\n action: MovePositionActions,\n index: number,\n formControlName: string\n ) {\n return lastValueFrom(\n this.editorJsService.determineMovePositionAction(\n action,\n index,\n formControlName\n )\n );\n }\n}\n","import {\n ComponentRef,\n Directive,\n effect,\n HostListener,\n inject,\n input,\n ViewContainerRef,\n} from '@angular/core';\nimport { ToolFabService } from '../services/tool-fab.service';\nimport { Observable } from 'rxjs';\nimport { ToolbarComponent } from '../components/toolbar/toolbar.component';\nimport { BlockOptionAction } from '../ngx-editor-js2.interface';\n\nexport type ToolbarComponentRef = Observable<ComponentRef<ToolbarComponent>>;\n\n@Directive({\n selector: '[toolbarFab]',\n})\nexport class ToolbarFabDirective {\n toolFabService = inject(ToolFabService);\n viewContainerRef = inject(ViewContainerRef);\n\n autofocus = input<boolean>();\n blockOptionActions = input<BlockOptionAction[]>();\n actionCallback = input.required<(action: string) => void>();\n componentContextPositionIndex = input.required<number>();\n formControlName = input.required<string>();\n\n @HostListener('mouseenter') onMouseEnter() {\n this.toolFabService.componentContext.next({\n viewContainerRef: this.viewContainerRef,\n blockOptionActions: this.blockOptionActions() ?? [],\n actionCallback: this.actionCallback(),\n index: this.componentContextPositionIndex(),\n formControlName: this.formControlName(),\n });\n }\n\n constructor() {\n effect(() => {\n this.autofocus() && this.onMouseEnter();\n });\n }\n}\n","import {\n Directive,\n HostListener,\n} from '@angular/core';\n\n@Directive({\n selector: '[cleanPasteData]',\n})\nexport class CleanPasteDataDirective {\n @HostListener('paste', ['$event'])\n onPaste(event: Event) {\n event.preventDefault();\n const text = (event as ClipboardEvent).clipboardData?.getData('text/plain');\n document.execCommand('insertText', false, text);\n }\n}\n","import { Component, input, signal } from '@angular/core';\nimport { ControlAccessorDirective } from '../../directives/control-accessor.directive';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { AutofocusDirective } from '../../directives/autofocus.directive';\nimport { ToolbarFabDirective } from '../../directives/toolbar-fab.directive';\nimport { CleanPasteDataDirective } from '../../directives/clean-paste-data.directive';\nimport {\n BlockComponent,\n BlockOptionAction,\n} from '../../ngx-editor-js2.interface';\nimport { NgSwitch, NgSwitchCase, NgTemplateOutlet } from '@angular/common';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\n\n@Component({\n selector: 'header-block',\n host: { class: 'cdk-drag-animating' },\n hostDirectives: [CdkDrag],\n imports: [\n ReactiveFormsModule,\n ControlAccessorDirective,\n AutofocusDirective,\n ToolbarFabDirective,\n CleanPasteDataDirective,\n NgSwitch,\n NgSwitchCase,\n NgTemplateOutlet,\n ],\n template: `\n <ng-container [ngSwitch]=\"savedAction()\">\n <h1 *ngSwitchCase=\"'h1'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h1>\n <h2 *ngSwitchCase=\"'h2'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h2>\n <h3 *ngSwitchCase=\"'h3'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h3>\n <h4 *ngSwitchCase=\"'h4'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h4>\n <h5 *ngSwitchCase=\"'h5'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h5>\n <h6 *ngSwitchCase=\"'h6'\">\n <ng-container *ngTemplateOutlet=\"sharedHeaderTemplate\"></ng-container>\n </h6>\n </ng-container>\n\n <ng-template [formGroup]=\"formGroup()\" #sharedHeaderTemplate>\n <span\n controlAccessor\n cleanPasteData\n contentEditable\n toolbarFab\n [defaultValue]=\"formGroup().get(formControlName())?.value\"\n [actionCallback]=\"actionCallbackBind\"\n [blockOptionActions]=\"blockOptionActions()\"\n [autofocus]=\"autofocus()\"\n [formControlName]=\"formControlName()\"\n [componentContextPositionIndex]=\"sortIndex()\"\n ></span>\n </ng-template>\n `,\n styles: [\n `\n :host {\n display: block;\n position: relative;\n :is(h1, h2, h3, h4, h5, h6) {\n margin: 0;\n span {\n display: block;\n line-height: inherit;\n }\n }\n\n h1 > * {\n font: var(--mat-sys-display-large);\n }\n h2 > * {\n font: var(--mat-sys-display-medium);\n }\n h3 > * {\n font: var(--mat-sys-display-small);\n }\n h4 > * {\n font: var(--mat-sys-headline-large);\n }\n h5 > * {\n font: var(--mat-sys-headline-medium);\n }\n h6 > * {\n font: var(--mat-sys-headline-small);\n }\n }\n `,\n ],\n})\nexport class HeaderBlockComponent implements BlockComponent {\n sortIndex = input<number>(0);\n componentInstanceName = 'HeaderBlockComponent';\n autofocus = input<boolean>(true);\n formGroup = input.required<FormGroup>();\n formControlName = input.required<string>();\n blockOptionActions = input<BlockOptionAction[]>([\n { action: 'h1', text: 'H1' },\n { action: 'h2', text: 'H2' },\n { action: 'h3', text: 'H3' },\n { action: 'h4', text: 'H4' },\n { action: 'h5', text: 'H5' },\n { action: 'h6', text: 'H6' },\n ]);\n\n savedAction = signal<string>('h1');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(selectedAction: string) {\n this.savedAction.set(selectedAction);\n }\n}\n","import { Component, input, signal } from '@angular/core';\nimport { ControlAccessorDirective } from '../../directives/control-accessor.directive';\nimport { FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { AutofocusDirective } from '../../directives/autofocus.directive';\nimport { ToolbarFabDirective } from '../../directives/toolbar-fab.directive';\nimport { CleanPasteDataDirective } from '../../directives/clean-paste-data.directive';\nimport {\n BlockComponent,\n BlockOptionAction,\n} from '../../ngx-editor-js2.interface';\nimport { NgClass } from '@angular/common';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\n\n\n@Component({\n selector: 'paragraph-block',\n host: { class: 'cdk-drag-animating' },\n hostDirectives: [CdkDrag],\n imports: [\n ReactiveFormsModule,\n ControlAccessorDirective,\n AutofocusDirective,\n ToolbarFabDirective,\n CleanPasteDataDirective,\n NgClass,\n ],\n template: `\n <ng-container [formGroup]=\"formGroup()\">\n <p\n controlAccessor\n contentEditable\n toolbarFab\n cleanPasteData\n [ngClass]=\"savedAction()\"\n [defaultValue]=\"formGroup().get(formControlName())?.value\"\n [actionCallback]=\"actionCallbackBind\"\n [autofocus]=\"autofocus()\"\n [blockOptionActions]=\"blockOptionActions()\"\n [formControlName]=\"formControlName()\"\n [componentContextPositionIndex]=\"sortIndex()\"\n ></p>\n </ng-container>\n `,\n styles: [\n `\n :host {\n display: block;\n position: relative;\n .small {\n font: var(--mat-sys-body-small);\n }\n .medium {\n font: var(--mat-sys-body-medium);\n }\n .large {\n font: var(--mat-sys-body-large);\n }\n .title-small {\n font: var(--mat-sys-title-small);\n }\n .title-medium {\n font: var(--mat-sys-title-medium);\n }\n .title-large {\n font: var(--mat-sys-title-large);\n }\n }\n `,\n ],\n})\nexport class ParagraphBlockComponent implements BlockComponent {\n sortIndex = input<number>(0);\n componentInstanceName = 'ParagraphBlockComponent';\n autofocus = input<boolean>(true);\n formGroup = input.required<FormGroup>();\n formControlName = input.required<string>();\n blockOptionActions = input<BlockOptionAction[]>([\n { action: 'small', icon: 'density_small' },\n { action: 'medium', icon: 'density_medium' },\n { action: 'large', icon: 'density_large' },\n { action: 'title-small', text: 'TS' },\n { action: 'title-medium', text: 'TM' },\n { action: 'title-large', text: 'TL' },\n ]);\n\n savedAction = signal<string>('medium');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(action: string) {\n this.savedAction.update(() => action);\n }\n}\n","import { inject, Injectable, InjectionToken, Type } from '@angular/core';\nimport { HeaderBlockComponent } from '../components/blocks/header-block.component';\nimport { ParagraphBlockComponent } from '../components/blocks/paragraph-block.component';\nimport {\n BehaviorSubject,\n combineLatest,\n delay,\n exhaustMap,\n forkJoin,\n map,\n mergeMap,\n of,\n switchMap,\n} from 'rxjs';\nimport { EditorJsService } from './editor-js.service';\nimport {\n NgxEditorjsOptions,\n NgxEditorJsBlock,\n NgxEditorJsBlockWithComponent,\n SupportedBlock,\n BlockComponent,\n} from '../ngx-editor-js2.interface';\n\nexport const NGX_EDITORJS_OPTIONS = new InjectionToken<NgxEditorjsOptions>(\n 'NGX_EDITORJS_OPTIONS'\n);\n\n@Injectable({\n providedIn: 'root',\n})\nexport class NgxEditorJs2Service {\n editorJsService = inject(EditorJsService);\n\n consumerSupportedBlocks = new BehaviorSubject<SupportedBlock[]>(\n inject(NGX_EDITORJS_OPTIONS, { optional: true })?.consumerSupportedBlocks ??\n []\n );\n\n internalSupportedBlocks = new BehaviorSubject<SupportedBlock[]>([\n {\n name: 'Paragraph',\n component: ParagraphBlockComponent,\n componentInstanceName: 'ParagraphBlockComponent',\n },\n {\n name: 'Header',\n component: HeaderBlockComponent,\n componentInstanceName: 'HeaderBlockComponent',\n },\n ]);\n\n supportedBlocks$ = combineLatest([\n this.internalSupportedBlocks.asObservable(),\n this.consumerSupportedBlocks.asObservable(),\n ]).pipe(map(([internal, consumer]) => [...internal, ...consumer]));\n\n blocksToLoad = new BehaviorSubject<NgxEditorJsBlock[]>([]);\n\n loadBlocks$ = this.blocksToLoad.asObservable().pipe(\n delay(0),\n exhaustMap((blocks) => this.clearBlocksFromEditorJs(blocks)),\n map(([blocks]) => this.determineToloadDefaultBlocks(blocks)),\n map((blocks) => this.removeDuplicateBlocksWithSameIds(blocks)),\n map((blocks) => this.sortBlocks(blocks)),\n switchMap((blocks) => this.combineSupportBlocks(blocks)),\n map(([blocks, supportedBlocks]) =>\n this.createALookupMapForSupportedBlocks(blocks, supportedBlocks)\n ),\n map(({ blocks, supportedBlocksMap }) =>\n this.findAndMarshalBlocksComponent(blocks, supportedBlocksMap)\n ),\n mergeMap((blocks) =>\n this.addBlocksToEditorJs(blocks).pipe(map(() => blocks))\n )\n );\n\n clearBlocksFromEditorJs(blocks: NgxEditorJsBlock[]) {\n return forkJoin([of(blocks), this.editorJsService.clearBlocks()]);\n }\n\n determineToloadDefaultBlocks(blocks: NgxEditorJsBlock[]) {\n return blocks.length > 0 ? blocks : this.loadDefaultBlocks();\n }\n\n loadDefaultBlocks() {\n return [\n {\n blockId: 'tmdjr',\n sortIndex: 0,\n componentInstanceName: 'HeaderBlockComponent',\n dataClean: \"Let's get started... 🚀\",\n savedAction: 'h1',\n },\n ];\n }\n\n removeDuplicateBlocksWithSameIds(blocks: NgxEditorJsBlock[]) {\n return Array.from(\n new Map(blocks.map((block) => [block.blockId, block])).values()\n );\n }\n\n sortBlocks(blocks: NgxEditorJsBlock[]) {\n return blocks.sort((a, b) => a.sortIndex - b.sortIndex);\n }\n\n combineSupportBlocks(blocks: NgxEditorJsBlock[]) {\n return combineLatest([of(blocks), this.supportedBlocks$]);\n }\n\n createALookupMapForSupportedBlocks(\n blocks: NgxEditorJsBlock[],\n supportedBlocks: SupportedBlock[]\n ) {\n return {\n blocks,\n supportedBlocksMap: new Map(\n supportedBlocks.map((sb) => [sb.componentInstanceName, sb.component])\n ),\n };\n }\n\n findAndMarshalBlocksComponent(\n blocks: NgxEditorJsBlock[],\n supportedBlocksMap: Map<string, Type<BlockComponent>>\n ) {\n return blocks.map((block) => ({\n ...block,\n component:\n supportedBlocksMap.get(block.componentInstanceName) ??\n HeaderBlockComponent,\n }));\n }\n\n addBlocksToEditorJs(blocks: NgxEditorJsBlockWithComponent[]) {\n return combineLatest(\n blocks.map((block: NgxEditorJsBlockWithComponent) =>\n this.editorJsService.addBlockComponent(block)\n )\n );\n }\n}\n","import {\n Component,\n effect,\n inject,\n input,\n viewChild,\n ViewContainerRef,\n} from '@angular/core';\nimport { EditorJsService } from '../services/editor-js.service';\nimport { NgxEditorJs2Service } from '../services/ngx-editor-js2.service';\nimport { NgxEditorJsBlock } from '../ngx-editor-js2.interface';\nimport { CdkDropList, CdkDragDrop } from '@angular/cdk/drag-drop';\nimport { lastValueFrom } from 'rxjs';\n\n@Component({\n selector: 'editor-js',\n imports: [CdkDropList],\n template: `\n <div cdkDropList class=\"block-list\" (cdkDropListDropped)=\"drop($event)\">\n <ng-container #ngxEditor></ng-container>\n </div>\n `,\n styles: [\n `\n :host {\n display: block;\n .block-list {\n min-height: 60px;\n }\n }\n `,\n ],\n})\nexport class EditorJsComponent {\n editorJsService = inject(EditorJsService);\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n\n bootstrapEditorJs = input();\n blocks = input.required({\n transform: (value: NgxEditorJsBlock[]) =>\n this.ngxEditorJs2Service.blocksToLoad.next(value),\n });\n\n ngxEditor = viewChild.required('ngxEditor', { read: ViewContainerRef });\n\n constructor() {\n effect(() => {\n this.editorJsService.setNgxEditor(this.ngxEditor());\n });\n }\n\n // * DEBUGGING\n // ngOnInit() {\n // this.editorJsService.formGroup.valueChanges.subscribe((value) => {\n // console.log('[formGroup.value] : ', value);\n // });\n // this.editorJsService.blockComponents$.subscribe((components) => {\n // console.log('[components] : ', components);\n // });\n // }\n\n drop(event: CdkDragDrop<string[]>) {\n lastValueFrom(\n this.editorJsService.moveBlockComponentPosition(\n event.previousIndex,\n event.currentIndex\n )\n ).then(() => {\n // DRAG ANIMATION HOT FIX\n // Wait for Angular to update the DOM, then remove the animation class\n requestAnimationFrame(() => {\n document.querySelectorAll('.cdk-drag-animating').forEach((el) => {\n const element = el as HTMLElement;\n element.classList.remove('cdk-drag-animating'); // Ensure old class is removed\n void element.offsetWidth; // Force reflow\n element.classList.add('cdk-drag-animating'); // Re-add for next drag\n });\n });\n });\n }\n}\n","import {\n Component,\n EventEmitter,\n inject,\n input,\n Input,\n Output,\n Renderer2,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatListModule } from '@angular/material/list';\n\n@Component({\n selector: 'toolbar-inline',\n imports: [MatListModule, MatIconModule, FormsModule],\n host: { class: 'mat-elevation-z24' },\n template: `\n <div class=\"panel\">\n @for (item of options; track $index) {\n <div class=\"inline-option\" (click)=\"addInlineTag(item.action)\">\n <mat-icon>{{ item.icon }}</mat-icon>\n </div>\n }\n <div class=\"inline-option\" (click)=\"addClassTag('code', 'inline-code')\">\n <mat-icon>code</mat-icon>\n </div>\n <div class=\"inline-option\" (click)=\"openUrlInput()\">\n <mat-icon>insert_link</mat-icon>\n </div>\n <div class=\"inline-option\" (click)=\"clearTags()\">\n <mat-icon>format_clear</mat-icon>\n </div>\n </div>\n\n @if(showURLInputField()) {\n <div class=\"panel\">\n <input\n type=\"text\"\n placeholder=\"Enter URL\"\n class=\"block-option-input\"\n [(ngModel)]=\"url\"\n />\n <div class=\"inline-option\" (click)=\"createLink()\">\n <mat-icon>add</mat-icon>\n </div>\n </div>\n }\n `,\n styles: [\n `\n :host {\n color: var(--mat-sys-on-secondary);\n background: var(--mat-sys-secondary);\n border-radius: 8px;\n .panel {\n display: flex;\n width: 230px;\n flex-wrap: wrap;\n gap: 1px;\n }\n .inline-option {\n cursor: pointer;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n .block-option-input {\n width: 197px;\n height: 32px;\n border: none;\n outline: none;\n color: var(--mat-sys-on-secondary);\n background-color: transparent;\n box-sizing: border-box;\n }\n }\n `,\n ],\n})\nexport class ToolbarInlineComponent {\n // @Input() selection!: Selection;\n selection = input.required<Selection>();\n @Output('closeOverlay') closeOverlayEmitter = new EventEmitter();\n\n renderer = inject(Renderer2);\n\n url = '';\n showURLInputField = signal(false);\n savedRanges: Range[] = [];\n options = [\n { icon: 'format_bold', action: 'bold' },\n { icon: 'format_italic', action: 'italic' },\n { icon: 'format_underlined', action: 'underline' },\n { icon: 'strikethrough_s', action: 'strikethrough' },\n { icon: 'format_list_bulleted', action: 'insertUnorderedList' },\n { icon: 'format_list_numbered', action: 'insertOrderedList' },\n { icon: 'highlight', action: 'highlightColor' },\n { icon: 'format_align_left', action: 'justifyLeft' },\n { icon: 'format_align_center', action: 'justifyCenter' },\n { icon: 'format_align_right', action: 'justifyRight' },\n { icon: 'format_align_justify', action: 'justifyFull' },\n ];\n\n addInlineTag(tag: string) {\n // https://stackoverflow.com/questions/60581285/execcommand-is-now-obsolete-whats-the-alternative\n document.execCommand(tag);\n this.closeOverlayEmitter.emit();\n }\n\n addClassTag(tag: string, className: string) {\n const range = this.selection().getRangeAt(0);\n const element = this.renderer.createElement(tag);\n element.className = className ?? '';\n element.innerHTML = range.toString();\n range.deleteContents();\n range.insertNode(element);\n this.closeOverlayEmitter.emit();\n }\n\n clearTags() {\n document.execCommand('removeFormat');\n document.execCommand('unlink');\n this.closeOverlayEmitter.emit();\n }\n\n openUrlInput() {\n this.savedRanges.push(this.selection().getRangeAt(0));\n this.showURLInputField.set(true);\n }\n\n createLink() {\n this.selection().removeAllRanges();\n this.selection().addRange(this.savedRanges.pop()!);\n document.execCommand('createLink', false, this.url);\n this.closeOverlayEmitter.emit();\n }\n}\n","import { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { ComponentPortal } from '@angular/cdk/portal';\nimport { inject, Injectable } from '@angular/core';\nimport { exhaustMap, filter, lastValueFrom, map, merge, of, tap } from 'rxjs';\nimport { ToolbarInlineComponent } from '../components/toolbar-inline/toolbar-inline.component';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class ToolbarInlineService {\n overlay = inject(Overlay);\n overlayRef!: OverlayRef;\n\n determineToDisplayInlineToolbarBlock(_event: Event) {\n return of(window.getSelection()).pipe(\n filter((selection) => selection !== null),\n filter((selection) => selection.rangeCount > 0),\n filter((selection) => selection.toString().length > 0),\n filter((selection) => selection.toString() !== ''),\n tap(() => this.overlayRef?.hasAttached() && this.overlayRef.dispose()), // So hacky tired to do this properly\n map((selection) => ({\n selection,\n parant: this.getSelectionParent(selection),\n })),\n filter(({ parant }) => this.isSelectionInABlock(parant as HTMLElement)),\n exhaustMap(({ selection }) => this.attachInlineToolbar(selection))\n );\n }\n\n getSelectionParent(selection: Selection): HTMLElement | null {\n const range = selection.getRangeAt(0);\n return range.commonAncestorContainer.nodeType === Node.ELEMENT_NODE\n ? (range.commonAncestorContainer as HTMLElement)\n : range.commonAncestorContainer.parentElement;\n }\n\n isSelectionInABlock(target: HTMLElement | null) {\n // ! TODO: This is a hacky way to determine if the selection is in a block\n // ! Need to also check if the block wants to display the inline toolbar\n return (\n !!target &&\n (target.closest('.no-toolbar-inline') !== null\n ? false\n : target.closest('ngx-editor-js2') !== null\n ? true\n : false)\n );\n }\n\n attachInlineToolbar(selection: Selection) {\n return of(selection.getRangeAt(0)).pipe(\n map((range) => range.getBoundingClientRect()),\n map((selectionRect) => this.createOverlay(selectionRect)),\n // So hacky tired to do this properly\n // passing the refs down the pipe adds a bug\n // user selects text with a drag\n // (mousedown → mousemove → wait → mousemove → mouseup)\n tap((overlayRef) => (this.overlayRef = overlayRef)),\n map((overlayRef) => {\n const inlineToolbar = overlayRef.attach(\n new ComponentPortal(ToolbarInlineComponent)\n );\n inlineToolbar.setInput('selection', selection);\n\n lastValueFrom(\n merge(\n overlayRef.backdropClick(),\n inlineToolbar.instance.closeOverlayEmitter\n ).pipe(\n tap(() => overlayRef.dispose()),\n tap(() => selection.removeAllRanges())\n )\n );\n return true;\n })\n );\n }\n\n createOverlay(selectionRect: DOMRect) {\n return this.overlay.create({\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(selectionRect)\n .withPositions([\n {\n offsetY: 8,\n originX: 'start',\n originY: 'bottom',\n overlayX: 'start',\n overlayY: 'top',\n },\n ]),\n });\n }\n}\n","import { Component, inject, input, output } from '@angular/core';\nimport { EditorJsComponent } from './components/editor-js.component';\nimport { AsyncPipe } from '@angular/common';\nimport {\n combineLatest,\n debounceTime,\n fromEvent,\n Observable,\n switchMap,\n} from 'rxjs';\nimport { ToolFabService } from './services/tool-fab.service';\nimport { NgxEditorJsBlock } from './ngx-editor-js2.interface';\nimport { ToolbarInlineService } from './services/toolbar-inline.service';\nimport { EditorJsService } from './services/editor-js.service';\nimport { NgxEditorJs2Service } from './services/ngx-editor-js2.service';\n\n@Component({\n selector: 'ngx-editor-js2',\n imports: [EditorJsComponent, AsyncPipe],\n template: `\n <editor-js\n [blocks]=\"blocks()\"\n [bootstrapEditorJs]=\"bootstrapEditorJs$ | async\"\n ></editor-js>\n `,\n})\nexport class NgxEditorJs2Component {\n inlineToolbarSerivce = inject(ToolbarInlineService);\n editorJsService = inject(EditorJsService);\n ngxEditorJs2Service = inject(NgxEditorJs2Service);\n\n blocks = input<NgxEditorJsBlock[]>([]);\n blocksRequested = output<Observable<NgxEditorJsBlock[]>>();\n requestBlocks = input.required({\n transform: (_v: unknown) =>\n this.blocksRequested.emit(this.editorJsService.getBlocks$()),\n });\n\n bootstrapEditorJs$ = combineLatest([\n inject(ToolFabService).toolbarComponentRef$,\n this.ngxEditorJs2Service.loadBlocks$,\n fromEvent(document, 'selectionchange').pipe(\n debounceTime(200),\n switchMap((event) =>\n this.inlineToolbarSerivce.determineToDisplayInlineToolbarBlock(event)\n )\n )\n ]);\n}\n","/*\n * Public API Surface of ngx-editor-js2\n */\n\nexport * from './lib/services/ngx-editor-js2.service';\nexport * from './lib/ngx-editor-js2.component';\nexport type * from './lib/ngx-editor-js2.interface';\nexport * from './lib/directives/autofocus.directive';\nexport * from './lib/directives/toolbar-fab.directive';\nexport * from './lib/directives/control-accessor.directive';\nexport * from './lib/directives/clean-paste-data.directive';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { EventEmitter, Renderer2 } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
export declare class ToolbarInlineComponent {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
selection: import("@angular/core").InputSignal<Selection>;
|
|
5
|
+
closeOverlayEmitter: EventEmitter<any>;
|
|
6
|
+
renderer: Renderer2;
|
|
7
7
|
url: string;
|
|
8
|
-
showURLInputField: boolean
|
|
8
|
+
showURLInputField: import("@angular/core").WritableSignal<boolean>;
|
|
9
9
|
savedRanges: Range[];
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
options: {
|
|
11
|
+
icon: string;
|
|
12
|
+
action: string;
|
|
13
|
+
}[];
|
|
14
|
+
addInlineTag(tag: string): void;
|
|
15
|
+
addClassTag(tag: string, className: string): void;
|
|
15
16
|
clearTags(): void;
|
|
16
17
|
openUrlInput(): void;
|
|
17
18
|
createLink(): void;
|
|
18
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<ToolbarInlineComponent, never>;
|
|
19
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ToolbarInlineComponent, "toolbar-inline", never, { "selection": { "alias": "selection"; "required":
|
|
20
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ToolbarInlineComponent, "toolbar-inline", never, { "selection": { "alias": "selection"; "required": true; "isSignal": true; }; }, { "closeOverlayEmitter": "closeOverlay"; }, never, never, true, never>;
|
|
20
21
|
}
|