@tmdjr/ngx-editor-js2 0.0.1 → 0.0.2
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
|
@@ -1,63 +1,201 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Ngx-EditorJs2
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
DEMO: [https://ba5ik7.github.io/ngx-editorjs2](https://ba5ik7.github.io/ngx-editorjs2)
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Overview
|
|
6
|
+
Ngx-EditorJs2 is an Angular-based, highly extensible block-style editor inspired by Editor.js. It allows users to create and manage rich text content using a variety of customizable blocks while leveraging Angular's reactive capabilities.
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
### Supports
|
|
9
|
+
- Angular 19+
|
|
10
|
+
- For legacy Angular support, use [ngx-editorjs](https://github.com/Ba5ik7/ngx-editorjs)
|
|
8
11
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
## Features
|
|
13
|
+
- 📝 **Modular Block System** – Supports paragraph, header, and other content blocks.
|
|
14
|
+
- 🔄 **Reactive Data Streams** – Uses RxJS for efficient state management.
|
|
15
|
+
- 🎛 **Drag & Drop** – Easily reorder blocks with smooth animations.
|
|
16
|
+
- ✍ **Inline Toolbar** – Provides text formatting options when selecting text.
|
|
17
|
+
- 🔧 **Customizable** – Easily extendable with new block types and actions.
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
To install Ngx-EditorJs2, run:
|
|
12
21
|
|
|
13
|
-
|
|
22
|
+
```sh
|
|
23
|
+
npm install @tmdjr/ngx-editorjs2
|
|
24
|
+
```
|
|
14
25
|
|
|
15
|
-
|
|
16
|
-
|
|
26
|
+
## Usage
|
|
27
|
+
Import the Component into your Angular Standalone Component:
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
import { NgxEditorJs2Component } from '@tmdjr/ngx-editor-js2';
|
|
31
|
+
|
|
32
|
+
@Component({
|
|
33
|
+
selector: 'some-component',
|
|
34
|
+
imports: [NgxEditorJs2Component],
|
|
35
|
+
template: `
|
|
36
|
+
<ngx-editor-js2
|
|
37
|
+
[blocks]="initialBlocks"
|
|
38
|
+
[requestBlocks]="requestBlocks"
|
|
39
|
+
(blocksRequested)="handleBlocks($event)">
|
|
40
|
+
</ngx-editor-js2>
|
|
41
|
+
`,
|
|
42
|
+
})
|
|
43
|
+
```
|
|
44
|
+
- Implementation found in the [Demo Src](https://github.com/Ba5ik7/ngx-editorjs2/blob/main/projects/ngx-editorjs2-demo/src/app/components/document.component.ts#L9)
|
|
45
|
+
|
|
46
|
+
Css is required for the editor to function properly. Add the following to your global styles:
|
|
47
|
+
|
|
48
|
+
```css
|
|
49
|
+
// ! I Need to fix this!!
|
|
50
|
+
// The consumer should not have to incude this in their styles.scss
|
|
51
|
+
.cdk-drag-preview {
|
|
52
|
+
color: var(--mat-sys-on-secondary-container);
|
|
53
|
+
background-color: var(--mat-sys-secondary-container);
|
|
54
|
+
border-radius: 8px;
|
|
55
|
+
box-sizing: border-box;
|
|
56
|
+
overflow: visible;
|
|
57
|
+
box-shadow: var(--mat-sys-level4);
|
|
58
|
+
|
|
59
|
+
& *:not(toolbar) {
|
|
60
|
+
padding: 0 !important;
|
|
61
|
+
margin: 0 !important;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.cdk-drag-placeholder {
|
|
66
|
+
opacity: 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.cdk-drag-animating {
|
|
70
|
+
transition: transform 250ms cubic-bezier(0, 0, 0.2, 1);
|
|
71
|
+
}
|
|
17
72
|
```
|
|
18
73
|
|
|
19
|
-
## Building
|
|
20
74
|
|
|
21
|
-
|
|
75
|
+
## API
|
|
76
|
+
### **Inputs**
|
|
77
|
+
| Property | Type | Description |
|
|
78
|
+
|--------------|----------------------------|-------------|
|
|
79
|
+
| `blocks` | `NgxEditorJsBlock[]` \| `null` | List of blocks to initialize the editor with. |
|
|
80
|
+
| `requestBlocks` | `any` | When the value changes `blocksRequested` will emit the current state of the blocks. |
|
|
81
|
+
|
|
82
|
+
### **Outputs**
|
|
83
|
+
| Property | Type | Description |
|
|
84
|
+
|--------------|----------------------------|-------------|
|
|
85
|
+
| `blocksRequested` | `NgxEditorJsBlock[]` | Emits the current state of blocks in the Form Group. Trigger when the `requestBlocks` value changes
|
|
86
|
+
|
|
87
|
+
## Block Components
|
|
88
|
+
Ngx-EditorJs2 comes with built-in block components:
|
|
89
|
+
- **ParagraphBlockComponent** – Standard text block.
|
|
90
|
+
- **HeaderBlockComponent** – Allows different heading levels.
|
|
91
|
+
|
|
92
|
+
You can also add custom blocks by implementing the `NGX_EDITORJS_OPTIONS` provider:
|
|
22
93
|
|
|
23
|
-
```
|
|
24
|
-
|
|
94
|
+
```sh
|
|
95
|
+
npm install @tmdjr/ngx-editor-js2-image
|
|
25
96
|
```
|
|
26
97
|
|
|
27
|
-
|
|
98
|
+
```ts
|
|
99
|
+
import { NGX_EDITORJS_OPTIONS } from '@tmdjr/ngx-editor-js2';
|
|
100
|
+
import { NgxEditorJs2ImageComponent } from '@tmdjr/ngx-editor-js2-image';
|
|
101
|
+
|
|
102
|
+
export const appConfig: ApplicationConfig = {
|
|
103
|
+
providers: [
|
|
104
|
+
{
|
|
105
|
+
provide: NGX_EDITORJS_OPTIONS,
|
|
106
|
+
useValue: {
|
|
107
|
+
consumerSupportedBlocks: [
|
|
108
|
+
{
|
|
109
|
+
// Customize the block name.
|
|
110
|
+
name: 'Image',
|
|
111
|
+
component: NgxEditorJs2ImageComponent,
|
|
112
|
+
// Must match the component name.
|
|
113
|
+
componentInstanceName: 'NgxEditorJs2ImageComponent',
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
};
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Development
|
|
123
|
+
To contribute, clone the repository and install dependencies:
|
|
28
124
|
|
|
29
|
-
|
|
125
|
+
```sh
|
|
126
|
+
git clone git@github.com:Ba5ik7/ngx-editorjs2.git
|
|
127
|
+
cd ngx-editorjs2
|
|
128
|
+
npm i
|
|
129
|
+
```
|
|
30
130
|
|
|
31
|
-
|
|
131
|
+
Build the library:
|
|
32
132
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
```
|
|
133
|
+
```sh
|
|
134
|
+
npm run build-ngx-editor-js2
|
|
135
|
+
```
|
|
37
136
|
|
|
38
|
-
|
|
39
|
-
```bash
|
|
40
|
-
npm publish
|
|
41
|
-
```
|
|
137
|
+
Build Customs Blocks:
|
|
42
138
|
|
|
43
|
-
|
|
139
|
+
```sh
|
|
140
|
+
npm run build-ngx-editor-js2-image
|
|
141
|
+
// etc...
|
|
142
|
+
```
|
|
44
143
|
|
|
45
|
-
|
|
144
|
+
Run the development server:
|
|
46
145
|
|
|
47
|
-
```
|
|
48
|
-
|
|
146
|
+
```sh
|
|
147
|
+
npm run start-demo
|
|
49
148
|
```
|
|
50
149
|
|
|
51
|
-
|
|
150
|
+
If you want to live reload the library, run the following commands in succession:
|
|
52
151
|
|
|
53
|
-
|
|
152
|
+
```sh
|
|
153
|
+
npm run watch-ngx-editor-js2 // Important to run 1st
|
|
154
|
+
npm run watch-ngx-editor-js2-image
|
|
155
|
+
// etc...
|
|
54
156
|
|
|
55
|
-
|
|
56
|
-
ng e2e
|
|
157
|
+
npm run start-demo
|
|
57
158
|
```
|
|
58
159
|
|
|
59
|
-
|
|
160
|
+
## Architecture Overview
|
|
161
|
+
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
|
+
```mermaid
|
|
163
|
+
graph TD;
|
|
164
|
+
NgxEditorJs2Component -->|Contains| EditorJsComponent;
|
|
165
|
+
EditorJsComponent -->|Handles Blocks| ParagraphBlockComponent;
|
|
166
|
+
EditorJsComponent -->|Handles Blocks| HeaderBlockComponent;
|
|
167
|
+
NgxEditorJs2Component -->|Uses Service| NgxEditorJs2Service;
|
|
168
|
+
EditorJsComponent -->|Uses Service| EditorJsService;
|
|
169
|
+
EditorJsService -->|Manages| BlockMovementService;
|
|
170
|
+
EditorJsService -->|Manages| ToolFabService;
|
|
171
|
+
EditorJsComponent -->|Uses Toolbar| ToolbarComponent;
|
|
172
|
+
ToolbarComponent -->|Has| ToolbarBlocksComponent;
|
|
173
|
+
ToolbarComponent -->|Has| ToolbarBlockOptionsComponent;
|
|
174
|
+
EditorJsComponent -->|Uses| ToolbarInlineComponent;
|
|
175
|
+
```
|
|
60
176
|
|
|
61
|
-
##
|
|
177
|
+
## Services
|
|
178
|
+
| Service | Purpose |
|
|
179
|
+
|---------------------------|---------|
|
|
180
|
+
| `NgxEditorJs2Service` | Manages available block types and loaded blocks. |
|
|
181
|
+
| `EditorJsService` | Handles block rendering and form controls. |
|
|
182
|
+
| `BlockMovementService` | Manages drag-and-drop & reordering. |
|
|
183
|
+
| `ToolbarInlineService` | Manages inline text formatting. |
|
|
184
|
+
| `ToolFabService` | Provides contextual toolbars for block actions. |
|
|
185
|
+
|
|
186
|
+
## Creating a Custom Block Component
|
|
187
|
+
Ngx-EditorJs2 follows a structured approach where each block component:
|
|
188
|
+
- **Implements the `BlockComponent` interface** to ensure consistency.
|
|
189
|
+
- **Uses `hostDirectives`** to inherit required behaviors such as drag-and-drop.
|
|
190
|
+
- **Uses `host` CSS classes** to apply styling and animations.
|
|
191
|
+
- **Uses a `formGroup`**, which integrates with the larger form structure that holds all blocks.
|
|
192
|
+
|
|
193
|
+
### **How Blocks Work in Ngx-EditorJs2**
|
|
194
|
+
Each block in Ngx-EditorJs2 is part of a larger **`formGroup`**, allowing seamless state management across the entire editor. This design ensures that:
|
|
195
|
+
- Each block maintains its own **FormControl**, enabling real-time data binding.
|
|
196
|
+
- The **editor-level formGroup** acts as a centralized store, making it easier to retrieve or modify block data.
|
|
197
|
+
- Blocks can **interact with services and directives**, enhancing their capabilities dynamically.
|
|
198
|
+
|
|
199
|
+
## License
|
|
200
|
+
MIT License © 2025 [Wesley DuSell](https://github.com/ba5ik7)
|
|
62
201
|
|
|
63
|
-
For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
|
|
@@ -652,7 +652,7 @@ class HeaderBlockComponent {
|
|
|
652
652
|
this.selectedHeaderTag.set(selectedAction);
|
|
653
653
|
}
|
|
654
654
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.1", ngImport: i0, type: HeaderBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
655
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.1", type: HeaderBlockComponent, isStandalone: true, selector: "header-block", inputs: { sortIndex: { classPropertyName: "sortIndex", publicName: "sortIndex", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null }, formControlName: { classPropertyName: "formControlName", publicName: "formControlName", isSignal: true, isRequired: true, transformFunction: null }, blockOptionActions: { classPropertyName: "blockOptionActions", publicName: "blockOptionActions", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "
|
|
655
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.1", type: HeaderBlockComponent, isStandalone: true, selector: "header-block", inputs: { sortIndex: { classPropertyName: "sortIndex", publicName: "sortIndex", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null }, formControlName: { classPropertyName: "formControlName", publicName: "formControlName", isSignal: true, isRequired: true, transformFunction: null }, blockOptionActions: { classPropertyName: "blockOptionActions", publicName: "blockOptionActions", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "cdk-drag-animating" }, hostDirectives: [{ directive: i1$1.CdkDrag }], ngImport: i0, template: `
|
|
656
656
|
<ng-container [ngSwitch]="selectedHeaderTag()">
|
|
657
657
|
<h1 *ngSwitchCase="'h1'">
|
|
658
658
|
<ng-container *ngTemplateOutlet="sharedHeaderTemplate"></ng-container>
|
|
@@ -688,11 +688,11 @@ class HeaderBlockComponent {
|
|
|
688
688
|
[componentContextPositionIndex]="sortIndex()"
|
|
689
689
|
></span>
|
|
690
690
|
</ng-template>
|
|
691
|
-
`, isInline: true, styles: [":host :is(h1,h2,h3,h4,h5,h6){margin:0}:host :is(h1,h2,h3,h4,h5,h6) span{display:block;line-height:inherit}:host h1>*{font:var(--mat-sys-display-large)}:host h2>*{font:var(--mat-sys-display-medium)}:host h3>*{font:var(--mat-sys-display-small)}:host h4>*{font:var(--mat-sys-headline-large)}:host h5>*{font:var(--mat-sys-headline-medium)}:host h6>*{font:var(--mat-sys-headline-small)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: ControlAccessorDirective, selector: "[controlAccessor]", inputs: ["defaultValue"] }, { kind: "directive", type: AutofocusDirective, selector: "[autofocus]", inputs: ["autofocus"] }, { kind: "directive", type: ToolbarFabDirective, selector: "[toolbarFab]", inputs: ["autofocus", "blockOptionActions", "actionCallback", "componentContextPositionIndex", "formControlName"] }, { kind: "directive", type: CleanPasteDataDirective, selector: "[cleanPasteData]" }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
691
|
+
`, isInline: true, styles: [":host{display:block;position:relative}:host :is(h1,h2,h3,h4,h5,h6){margin:0}:host :is(h1,h2,h3,h4,h5,h6) span{display:block;line-height:inherit}:host h1>*{font:var(--mat-sys-display-large)}:host h2>*{font:var(--mat-sys-display-medium)}:host h3>*{font:var(--mat-sys-display-small)}:host h4>*{font:var(--mat-sys-headline-large)}:host h5>*{font:var(--mat-sys-headline-medium)}:host h6>*{font:var(--mat-sys-headline-small)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: ControlAccessorDirective, selector: "[controlAccessor]", inputs: ["defaultValue"] }, { kind: "directive", type: AutofocusDirective, selector: "[autofocus]", inputs: ["autofocus"] }, { kind: "directive", type: ToolbarFabDirective, selector: "[toolbarFab]", inputs: ["autofocus", "blockOptionActions", "actionCallback", "componentContextPositionIndex", "formControlName"] }, { kind: "directive", type: CleanPasteDataDirective, selector: "[cleanPasteData]" }, { kind: "directive", type: NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
692
692
|
}
|
|
693
693
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.1", ngImport: i0, type: HeaderBlockComponent, decorators: [{
|
|
694
694
|
type: Component,
|
|
695
|
-
args: [{ selector: 'header-block', host: { class: '
|
|
695
|
+
args: [{ selector: 'header-block', host: { class: 'cdk-drag-animating' }, hostDirectives: [CdkDrag], imports: [
|
|
696
696
|
ReactiveFormsModule,
|
|
697
697
|
ControlAccessorDirective,
|
|
698
698
|
AutofocusDirective,
|
|
@@ -737,7 +737,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.1", ngImpor
|
|
|
737
737
|
[componentContextPositionIndex]="sortIndex()"
|
|
738
738
|
></span>
|
|
739
739
|
</ng-template>
|
|
740
|
-
`, styles: [":host :is(h1,h2,h3,h4,h5,h6){margin:0}:host :is(h1,h2,h3,h4,h5,h6) span{display:block;line-height:inherit}:host h1>*{font:var(--mat-sys-display-large)}:host h2>*{font:var(--mat-sys-display-medium)}:host h3>*{font:var(--mat-sys-display-small)}:host h4>*{font:var(--mat-sys-headline-large)}:host h5>*{font:var(--mat-sys-headline-medium)}:host h6>*{font:var(--mat-sys-headline-small)}\n"] }]
|
|
740
|
+
`, styles: [":host{display:block;position:relative}:host :is(h1,h2,h3,h4,h5,h6){margin:0}:host :is(h1,h2,h3,h4,h5,h6) span{display:block;line-height:inherit}:host h1>*{font:var(--mat-sys-display-large)}:host h2>*{font:var(--mat-sys-display-medium)}:host h3>*{font:var(--mat-sys-display-small)}:host h4>*{font:var(--mat-sys-headline-large)}:host h5>*{font:var(--mat-sys-headline-medium)}:host h6>*{font:var(--mat-sys-headline-small)}\n"] }]
|
|
741
741
|
}] });
|
|
742
742
|
|
|
743
743
|
class ParagraphBlockComponent {
|
|
@@ -759,7 +759,7 @@ class ParagraphBlockComponent {
|
|
|
759
759
|
this.className.update(() => action);
|
|
760
760
|
}
|
|
761
761
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.1", ngImport: i0, type: ParagraphBlockComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
762
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.1", type: ParagraphBlockComponent, isStandalone: true, selector: "paragraph-block", inputs: { sortIndex: { classPropertyName: "sortIndex", publicName: "sortIndex", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null }, formControlName: { classPropertyName: "formControlName", publicName: "formControlName", isSignal: true, isRequired: true, transformFunction: null }, blockOptionActions: { classPropertyName: "blockOptionActions", publicName: "blockOptionActions", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "
|
|
762
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.1.1", type: ParagraphBlockComponent, isStandalone: true, selector: "paragraph-block", inputs: { sortIndex: { classPropertyName: "sortIndex", publicName: "sortIndex", isSignal: true, isRequired: false, transformFunction: null }, autofocus: { classPropertyName: "autofocus", publicName: "autofocus", isSignal: true, isRequired: false, transformFunction: null }, formGroup: { classPropertyName: "formGroup", publicName: "formGroup", isSignal: true, isRequired: true, transformFunction: null }, formControlName: { classPropertyName: "formControlName", publicName: "formControlName", isSignal: true, isRequired: true, transformFunction: null }, blockOptionActions: { classPropertyName: "blockOptionActions", publicName: "blockOptionActions", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "cdk-drag-animating" }, hostDirectives: [{ directive: i1$1.CdkDrag }], ngImport: i0, template: `
|
|
763
763
|
<ng-container [formGroup]="formGroup()">
|
|
764
764
|
<p
|
|
765
765
|
controlAccessor
|
|
@@ -774,11 +774,11 @@ class ParagraphBlockComponent {
|
|
|
774
774
|
[componentContextPositionIndex]="sortIndex()"
|
|
775
775
|
></p>
|
|
776
776
|
</ng-container>
|
|
777
|
-
`, isInline: true, styles: [":host .small{font:var(--mat-sys-body-small)}:host .medium{font:var(--mat-sys-body-medium)}:host .large{font:var(--mat-sys-body-large)}:host .title-small{font:var(--mat-sys-title-small)}:host .title-medium{font:var(--mat-sys-title-medium)}:host .title-large{font:var(--mat-sys-title-large)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: ControlAccessorDirective, selector: "[controlAccessor]", inputs: ["defaultValue"] }, { kind: "directive", type: AutofocusDirective, selector: "[autofocus]", inputs: ["autofocus"] }, { kind: "directive", type: ToolbarFabDirective, selector: "[toolbarFab]", inputs: ["autofocus", "blockOptionActions", "actionCallback", "componentContextPositionIndex", "formControlName"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
777
|
+
`, isInline: true, styles: [":host{display:block;position:relative}:host .small{font:var(--mat-sys-body-small)}:host .medium{font:var(--mat-sys-body-medium)}:host .large{font:var(--mat-sys-body-large)}:host .title-small{font:var(--mat-sys-title-small)}:host .title-medium{font:var(--mat-sys-title-medium)}:host .title-large{font:var(--mat-sys-title-large)}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: ControlAccessorDirective, selector: "[controlAccessor]", inputs: ["defaultValue"] }, { kind: "directive", type: AutofocusDirective, selector: "[autofocus]", inputs: ["autofocus"] }, { kind: "directive", type: ToolbarFabDirective, selector: "[toolbarFab]", inputs: ["autofocus", "blockOptionActions", "actionCallback", "componentContextPositionIndex", "formControlName"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
778
778
|
}
|
|
779
779
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.1", ngImport: i0, type: ParagraphBlockComponent, decorators: [{
|
|
780
780
|
type: Component,
|
|
781
|
-
args: [{ selector: 'paragraph-block', host: { class: '
|
|
781
|
+
args: [{ selector: 'paragraph-block', host: { class: 'cdk-drag-animating' }, hostDirectives: [CdkDrag], imports: [
|
|
782
782
|
ReactiveFormsModule,
|
|
783
783
|
ControlAccessorDirective,
|
|
784
784
|
AutofocusDirective,
|
|
@@ -799,7 +799,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.1", ngImpor
|
|
|
799
799
|
[componentContextPositionIndex]="sortIndex()"
|
|
800
800
|
></p>
|
|
801
801
|
</ng-container>
|
|
802
|
-
`, styles: [":host .small{font:var(--mat-sys-body-small)}:host .medium{font:var(--mat-sys-body-medium)}:host .large{font:var(--mat-sys-body-large)}:host .title-small{font:var(--mat-sys-title-small)}:host .title-medium{font:var(--mat-sys-title-medium)}:host .title-large{font:var(--mat-sys-title-large)}\n"] }]
|
|
802
|
+
`, styles: [":host{display:block;position:relative}:host .small{font:var(--mat-sys-body-small)}:host .medium{font:var(--mat-sys-body-medium)}:host .large{font:var(--mat-sys-body-large)}:host .title-small{font:var(--mat-sys-title-small)}:host .title-medium{font:var(--mat-sys-title-medium)}:host .title-large{font:var(--mat-sys-title-large)}\n"] }]
|
|
803
803
|
}] });
|
|
804
804
|
|
|
805
805
|
const NGX_EDITORJS_OPTIONS = new InjectionToken('NGX_EDITORJS_OPTIONS');
|
|
@@ -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, 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 formControlName: InputSignal<string>;\n formGroup: InputSignal<FormGroup>;\n blockOptionActions: InputSignal<BlockOptionAction[]>;\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.constructor.name.slice(1),\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: 'position-relative block 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]=\"selectedHeaderTag()\">\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 :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 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 selectedHeaderTag = signal<string>('h1');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(selectedAction: string) {\n this.selectedHeaderTag.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 {\n BlockComponent,\n BlockOptionAction,\n} from '../../ngx-editor-js2.interface';\nimport { NgClass } from '@angular/common';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\n\n@Component({\n selector: 'paragraph-block',\n host: { class: 'position-relative block cdk-drag-animating' },\n hostDirectives: [CdkDrag],\n imports: [\n ReactiveFormsModule,\n ControlAccessorDirective,\n AutofocusDirective,\n ToolbarFabDirective,\n NgClass,\n ],\n template: `\n <ng-container [formGroup]=\"formGroup()\">\n <p\n controlAccessor\n contentEditable\n toolbarFab\n [ngClass]=\"className()\"\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 .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 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 className = signal<string>('medium');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(action: string) {\n this.className.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 defaultIfEmpty,\n fromEvent,\n Observable,\n startWith,\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';","/**\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.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, 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 formControlName: InputSignal<string>;\n formGroup: InputSignal<FormGroup>;\n blockOptionActions: InputSignal<BlockOptionAction[]>;\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.constructor.name.slice(1),\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]=\"selectedHeaderTag()\">\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 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 selectedHeaderTag = signal<string>('h1');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(selectedAction: string) {\n this.selectedHeaderTag.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 {\n BlockComponent,\n BlockOptionAction,\n} from '../../ngx-editor-js2.interface';\nimport { NgClass } from '@angular/common';\nimport { CdkDrag } from '@angular/cdk/drag-drop';\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 NgClass,\n ],\n template: `\n <ng-container [formGroup]=\"formGroup()\">\n <p\n controlAccessor\n contentEditable\n toolbarFab\n [ngClass]=\"className()\"\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 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 className = signal<string>('medium');\n actionCallbackBind = this.actionCallback.bind(this);\n\n actionCallback(action: string) {\n this.className.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';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tmdjr/ngx-editor-js2",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"peerDependencies": {
|
|
5
|
+
"@angular/animations": "^19.0.0",
|
|
6
|
+
"@angular/cdk": "^19.1.0",
|
|
5
7
|
"@angular/common": "^19.1.0",
|
|
6
|
-
"@angular/core": "^19.1.0"
|
|
8
|
+
"@angular/core": "^19.1.0",
|
|
9
|
+
"@angular/forms": "^19.0.0",
|
|
10
|
+
"@angular/material": "^19.1.0"
|
|
7
11
|
},
|
|
8
12
|
"dependencies": {
|
|
9
13
|
"tslib": "^2.3.0"
|