rapid-text-editor 1.0.4 → 1.0.6

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.
@@ -7,6 +7,7 @@ import * as i2 from '@angular/material/icon';
7
7
  import { MatIconModule } from '@angular/material/icon';
8
8
  import * as i3 from '@angular/common';
9
9
  import { CommonModule } from '@angular/common';
10
+ import { MatButtonModule } from '@angular/material/button';
10
11
 
11
12
  class RapidTextEditorService {
12
13
  constructor() { }
@@ -21,10 +22,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
21
22
  }], ctorParameters: function () { return []; } });
22
23
 
23
24
  class RapidTextEditorComponent {
24
- constructor(dialog, el) {
25
+ constructor(dialog, el, renderer, elRef) {
25
26
  this.dialog = dialog;
26
27
  this.el = el;
28
+ this.renderer = renderer;
29
+ this.elRef = elRef;
27
30
  this.contentCapture = false;
31
+ this.height = "300px";
32
+ this.width = "auto";
28
33
  this.contentChange = new EventEmitter();
29
34
  this.editorContent = '';
30
35
  this.rows = 1;
@@ -45,6 +50,20 @@ class RapidTextEditorComponent {
45
50
  console.log('Content capture is disabled.');
46
51
  }
47
52
  }
53
+ ngOnChanges(changes) {
54
+ if (changes['height'] || changes['width']) {
55
+ this.applyDimensions();
56
+ }
57
+ }
58
+ applyDimensions() {
59
+ const editorElement = this.elRef.nativeElement.querySelector('.dimension');
60
+ if (this.height) {
61
+ this.renderer.setStyle(editorElement, 'height', this.height);
62
+ }
63
+ if (this.width) {
64
+ this.renderer.setStyle(editorElement, 'width', this.width);
65
+ }
66
+ }
48
67
  ngAfterViewInit() {
49
68
  const editor = this.el.nativeElement.querySelector('.editor');
50
69
  if (!editor) {
@@ -134,7 +153,7 @@ class RapidTextEditorComponent {
134
153
  // });
135
154
  // } -> for PNG
136
155
  removeImage(index) {
137
- this.uploadedImages.splice(index, 1); // Remove the image from the array
156
+ this.uploadedImages.splice(index, 1);
138
157
  }
139
158
  insertImageInEditor(imageUrl) {
140
159
  const editor = document.querySelector('.editor');
@@ -545,24 +564,28 @@ class RapidTextEditorComponent {
545
564
  // this.yourService.submitContent({ content }); // Replace with your service call
546
565
  }
547
566
  }
548
- RapidTextEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, deps: [{ token: i1.MatDialog }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
549
- RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: RapidTextEditorComponent, selector: "rich-text-editor", inputs: { contentCapture: "contentCapture" }, outputs: { contentChange: "contentChange" }, providers: [
567
+ RapidTextEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, deps: [{ token: i1.MatDialog }, { token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
568
+ RapidTextEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.12", type: RapidTextEditorComponent, selector: "app-rich-text-editor", inputs: { contentCapture: "contentCapture", height: "height", width: "width" }, outputs: { contentChange: "contentChange" }, providers: [
550
569
  {
551
570
  provide: NG_VALUE_ACCESSOR,
552
571
  useExisting: forwardRef(() => RapidTextEditorComponent),
553
572
  multi: true
554
573
  }
555
- ], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, static: true }, { propertyName: "tableDialog", first: true, predicate: ["tableDialog"], descendants: true }], ngImport: i0, template: "<div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n \r\n <select class=\"select-wrapper\" (change)=\"setHeading($event)\">\r\n <option value=\"P\">Paragraph</option>\r\n <option value=\"H1\">H1</option>\r\n <option value=\"H2\">H2</option>\r\n <option value=\"H3\">H3</option>\r\n <option value=\"H4\">H4</option>\r\n <option value=\"H5\">H5</option>\r\n <option value=\"H6\">H6</option>\r\n </select>\r\n <button (click)=\"format('bold')\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('italic')\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('underline')\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('strikethrough')\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyLeft')\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyCenter')\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyRight')\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyFull')\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertUnorderedList')\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertOrderedList')\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n \r\n \r\n \r\n <button color=\"secondary\" aria-label=\"Insert Image\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\" \r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" \r\n />\r\n \r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n \r\n \r\n <button (click)=\"openTableDialog($event)\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"makeFirstRowHeader()\" color=\"secondary\" aria-label=\"Make Header\">\r\n <img style=\"width: 26px; height: 46px; margin-bottom: 3px;\" src=\"../../../assets/H.svg\" alt=\"Apply Header to table\">\r\n </button>\r\n \r\n </div>\r\n \r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here --> \r\n </div>\r\n \r\n </div>\r\n \r\n <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button>\r\n \r\n \r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n \r\n \r\n <input type=\"file\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n \r\n \r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\" \r\n draggable=\"true\" \r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n \r\n <button class=\"remove-btn\" (click)=\"removeImage(i)\">Remove</button>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px}.editor{min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri;outline:none!important;font-size:14px}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:150px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;border-radius:5px;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;border-radius:5px;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}button:active{background-color:#0056b3}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}\n"], components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
574
+ ], viewQueries: [{ propertyName: "editor", first: true, predicate: ["editor"], descendants: true, static: true }, { propertyName: "tableDialog", first: true, predicate: ["tableDialog"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"dimension\">\r\n\r\n\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n \r\n <select class=\"select-wrapper\" (change)=\"setHeading($event)\">\r\n <option value=\"P\">Paragraph</option>\r\n <option value=\"H1\">H1</option>\r\n <option value=\"H2\">H2</option>\r\n <option value=\"H3\">H3</option>\r\n <option value=\"H4\">H4</option>\r\n <option value=\"H5\">H5</option>\r\n <option value=\"H6\">H6</option>\r\n </select>\r\n <button (click)=\"format('bold')\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('italic')\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('underline')\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('strikethrough')\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyLeft')\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyCenter')\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyRight')\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyFull')\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertUnorderedList')\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertOrderedList')\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n \r\n \r\n \r\n <button color=\"secondary\" aria-label=\"Insert Image\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\" \r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" \r\n />\r\n \r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n \r\n \r\n <button (click)=\"openTableDialog($event)\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon >border_all</mat-icon>\r\n </button>\r\n \r\n <button class=\"ms-1\" style=\"all: unset;margin-bottom: 6px;\" (click)=\"makeFirstRowHeader()\" color=\"secondary\" aria-label=\"Make Header\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 -960 960 960\" width=\"20px\" fill=\"#6C757D\"><path d=\"M120-760v-80h720v80H120Zm640 80q33 0 56.5 23.5T840-600v400q0 33-23.5 56.5T760-120H200q-33 0-56.5-23.5T120-200v-400q0-33 23.5-56.5T200-680h560Zm0 80H200v400h560v-400Zm-560 0v400-400Z\"/></svg>\r\n </button>\r\n <!-- <mat-icon>page_header</mat-icon> -->\r\n \r\n \r\n \r\n \r\n </div>\r\n \r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here --> \r\n </div>\r\n \r\n </div>\r\n \r\n <!-- <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button> -->\r\n \r\n \r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n \r\n <div>\r\n <input class=\"mt-2\" type=\"file\" placeholder=\"Upload your images here...\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\" \r\n draggable=\"true\" width=\"100px\" height=\"100px\"\r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n <mat-icon style=\"color: red;\r\n position: absolute\" (click)=\"removeImage(i)\">cancel</mat-icon>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px}.editor{position:relative;min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri;outline:none!important;font-size:14px}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:150px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;border-radius:5px;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;border-radius:5px;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}button:active{background-color:#0056b3}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}.remove_btn{position:relative;top:10px}\n"], components: [{ type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], directives: [{ type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
556
575
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorComponent, decorators: [{
557
576
  type: Component,
558
- args: [{ selector: 'rich-text-editor', providers: [
577
+ args: [{ selector: 'app-rich-text-editor', providers: [
559
578
  {
560
579
  provide: NG_VALUE_ACCESSOR,
561
580
  useExisting: forwardRef(() => RapidTextEditorComponent),
562
581
  multi: true
563
582
  }
564
- ], template: "<div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n \r\n <select class=\"select-wrapper\" (change)=\"setHeading($event)\">\r\n <option value=\"P\">Paragraph</option>\r\n <option value=\"H1\">H1</option>\r\n <option value=\"H2\">H2</option>\r\n <option value=\"H3\">H3</option>\r\n <option value=\"H4\">H4</option>\r\n <option value=\"H5\">H5</option>\r\n <option value=\"H6\">H6</option>\r\n </select>\r\n <button (click)=\"format('bold')\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('italic')\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('underline')\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('strikethrough')\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyLeft')\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyCenter')\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyRight')\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyFull')\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertUnorderedList')\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertOrderedList')\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n \r\n \r\n \r\n <button color=\"secondary\" aria-label=\"Insert Image\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\" \r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" \r\n />\r\n \r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n \r\n \r\n <button (click)=\"openTableDialog($event)\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"makeFirstRowHeader()\" color=\"secondary\" aria-label=\"Make Header\">\r\n <img style=\"width: 26px; height: 46px; margin-bottom: 3px;\" src=\"../../../assets/H.svg\" alt=\"Apply Header to table\">\r\n </button>\r\n \r\n </div>\r\n \r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here --> \r\n </div>\r\n \r\n </div>\r\n \r\n <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button>\r\n \r\n \r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n \r\n \r\n <input type=\"file\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n \r\n \r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\" \r\n draggable=\"true\" \r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n \r\n <button class=\"remove-btn\" (click)=\"removeImage(i)\">Remove</button>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px}.editor{min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri;outline:none!important;font-size:14px}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:150px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;border-radius:5px;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;border-radius:5px;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}button:active{background-color:#0056b3}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}\n"] }]
565
- }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i0.ElementRef }]; }, propDecorators: { contentCapture: [{
583
+ ], template: "<div class=\"dimension\">\r\n\r\n\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n \r\n <select class=\"select-wrapper\" (change)=\"setHeading($event)\">\r\n <option value=\"P\">Paragraph</option>\r\n <option value=\"H1\">H1</option>\r\n <option value=\"H2\">H2</option>\r\n <option value=\"H3\">H3</option>\r\n <option value=\"H4\">H4</option>\r\n <option value=\"H5\">H5</option>\r\n <option value=\"H6\">H6</option>\r\n </select>\r\n <button (click)=\"format('bold')\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('italic')\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('underline')\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('strikethrough')\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyLeft')\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyCenter')\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyRight')\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyFull')\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertUnorderedList')\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertOrderedList')\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n \r\n \r\n \r\n <button color=\"secondary\" aria-label=\"Insert Image\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\" \r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" \r\n />\r\n \r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n \r\n \r\n <button (click)=\"openTableDialog($event)\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon >border_all</mat-icon>\r\n </button>\r\n \r\n <button class=\"ms-1\" style=\"all: unset;margin-bottom: 6px;\" (click)=\"makeFirstRowHeader()\" color=\"secondary\" aria-label=\"Make Header\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 -960 960 960\" width=\"20px\" fill=\"#6C757D\"><path d=\"M120-760v-80h720v80H120Zm640 80q33 0 56.5 23.5T840-600v400q0 33-23.5 56.5T760-120H200q-33 0-56.5-23.5T120-200v-400q0-33 23.5-56.5T200-680h560Zm0 80H200v400h560v-400Zm-560 0v400-400Z\"/></svg>\r\n </button>\r\n <!-- <mat-icon>page_header</mat-icon> -->\r\n \r\n \r\n \r\n \r\n </div>\r\n \r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here --> \r\n </div>\r\n \r\n </div>\r\n \r\n <!-- <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button> -->\r\n \r\n \r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n \r\n <div>\r\n <input class=\"mt-2\" type=\"file\" placeholder=\"Upload your images here...\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\" \r\n draggable=\"true\" width=\"100px\" height=\"100px\"\r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n <mat-icon style=\"color: red;\r\n position: absolute\" (click)=\"removeImage(i)\">cancel</mat-icon>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ", styles: ["@charset \"UTF-8\";.rich-text-editor{border:1px solid #ccc;border-radius:5px}.editor{position:relative;min-height:300px;border:1px solid #ccc;padding:5px;overflow-y:auto;font-family:Calibri;outline:none!important;font-size:14px}button{width:20px;height:20px;background:none;border:none;margin-left:5px;cursor:pointer}button[mat-icon-button]{margin:0 4px;width:20px!important;height:20px;background:none;border:none}.small-icon-button{width:30px;height:30px;padding:4px}.small-icon-button mat-icon{font-size:16px}button[mat-icon-button]{position:relative;overflow:hidden}input[type=file]{padding:5px;cursor:pointer;margin-left:10px}.fileInput{display:flex;justify-content:center;align-items:center}.select-wrapper{display:inline-block;position:relative;width:150px}.select-wrapper select{appearance:none;width:100%;padding:10px 40px 10px 15px;font-size:16px;color:#333;background-color:#f4f4f4;border:1px solid #ddd;border-radius:5px;cursor:pointer;outline:none}.select-wrapper:after{content:\"\\25bc\";position:absolute;top:50%;right:15px;transform:translateY(-50%);pointer-events:none;color:#777;font-size:12px}.select-wrapper select:hover{background-color:#e9e9e9;border-color:#bbb}.select-wrapper select:focus{border-color:#007bff;background-color:#fff}.select-wrapper option{padding:8px;font-size:16px;color:#333;background-color:#fff}.toolbar{display:flex;flex-wrap:wrap;align-items:center;background-color:#f4f4f4;padding:10px;border-radius:8px;box-shadow:0 2px 8px #0000001a;gap:10px}.select-wrapper{padding:8px;font-size:14px;border:1px solid #ddd;border-radius:5px;cursor:pointer;background-color:#fff}.select-wrapper:focus{outline:none;border-color:#007bff}button{border:none;border-radius:5px;padding:8px;cursor:pointer;display:flex;align-items:center;justify-content:center}button:hover{color:#007bff}button:active{background-color:#0056b3}mat-icon{font-size:20px;color:inherit}input[type=number]{width:60px;padding:5px;font-size:14px;border:1px solid #ddd;border-radius:5px;text-align:center}input[type=file]{border:1px solid #ddd;border-radius:5px;padding:5px;font-size:14px;background-color:#fff;cursor:pointer}input[type=file]:hover{border-color:#007bff}.table{width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.table:hover{background-color:#0056b3;color:#fff!important}.submit{margin-top:10px;width:100px;height:30px;color:#007bff!important;font-weight:700;border:1px solid #007bff}.submit:hover{border:none;background-color:#0056b3;color:#fff!important}.custom-dialog-container{width:auto;max-width:200px}.grid-container{display:grid;grid-template-columns:repeat(7,20px);grid-gap:5px;gap:5px}.grid-item{width:20px;height:20px;border:1px solid #ddd}.highlighted{background-color:#2196f3}div[contenteditable=false]{display:inline-block;position:relative;resize:both;overflow:hidden;border:1px dashed #ccc;margin:5px}div[contenteditable=false]:hover{border-color:#007bff}div[contenteditable=false] img{display:block;width:100%;height:auto}.uploaded-images{display:flex;flex-wrap:wrap;margin-bottom:20px}.image-preview{margin:10px;padding:5px;border:1px dashed #ccc;cursor:pointer}.image-preview img{max-width:100px;max-height:100px;object-fit:cover}.editor{border:1px solid #ccc;min-height:300px;padding:20px;position:relative}.remove_btn{position:relative;top:10px}\n"] }]
584
+ }], ctorParameters: function () { return [{ type: i1.MatDialog }, { type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { contentCapture: [{
585
+ type: Input
586
+ }], height: [{
587
+ type: Input
588
+ }], width: [{
566
589
  type: Input
567
590
  }], contentChange: [{
568
591
  type: Output
@@ -578,13 +601,13 @@ class RapidTextEditorModule {
578
601
  }
579
602
  RapidTextEditorModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
580
603
  RapidTextEditorModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorModule, declarations: [RapidTextEditorComponent], imports: [CommonModule,
581
- MatDialogModule,
582
604
  MatIconModule,
605
+ MatButtonModule,
583
606
  MatDialogModule], exports: [RapidTextEditorComponent] });
584
607
  RapidTextEditorModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorModule, imports: [[
585
608
  CommonModule,
586
- MatDialogModule,
587
609
  MatIconModule,
610
+ MatButtonModule,
588
611
  MatDialogModule
589
612
  ]] });
590
613
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImport: i0, type: RapidTextEditorModule, decorators: [{
@@ -595,8 +618,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.12", ngImpo
595
618
  ],
596
619
  imports: [
597
620
  CommonModule,
598
- MatDialogModule,
599
621
  MatIconModule,
622
+ MatButtonModule,
600
623
  MatDialogModule
601
624
  ],
602
625
  exports: [
@@ -1 +1 @@
1
- {"version":3,"file":"rapid-text-editor.mjs","sources":["../../../projects/rapid-text-editor/src/lib/rapid-text-editor.service.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.html","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.module.ts","../../../projects/rapid-text-editor/src/public-api.ts","../../../projects/rapid-text-editor/src/rapid-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RapidTextEditorService {\n\n constructor() { }\n}\n","import { Component, ElementRef, Input, Output, OnInit, ViewChild, TemplateRef, forwardRef, EventEmitter, AfterViewInit} from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'rich-text-editor',\n templateUrl: './rapid-text-editor.component.html',\n styleUrls: ['./rapid-text-editor.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RapidTextEditorComponent),\n multi: true\n }\n ]\n \n})\nexport class RapidTextEditorComponent implements ControlValueAccessor, OnInit, AfterViewInit {\n\n\n @Input() contentCapture: boolean = false;\n @Output() contentChange = new EventEmitter<string>();\n @ViewChild('editor', { static: true }) editor!: ElementRef;\n @ViewChild('tableDialog') tableDialog!: TemplateRef<any>;\n private editorContent: string = '';\n rows: number = 1;\n cols: number = 1;\n grid = Array(49).fill(0);\n Math = Math;\n uploadedImages: string[] = [];\n\n\n\n constructor(private dialog: MatDialog, private el: ElementRef) {\n console.log('Build -1')\n }\n \n ngOnInit(): void {\n if (this.contentCapture) {\n console.log('Content capture is enabled.');\n } else {\n console.log('Content capture is disabled.');\n }\n }\n\n ngAfterViewInit(): void {\n const editor = this.el.nativeElement.querySelector('.editor');\n if (!editor) {\n console.error('Editor element not found.');\n }\n }\n\n onContentChange(): void {\n if (this.contentCapture) {\n const editor = this.el.nativeElement.querySelector('.editor');\n if (editor) {\n this.editorContent = editor.innerHTML;\n console.log('Captured Content (Child):', this.editorContent);\n this.contentChange.emit(this.editorContent);\n } else {\n console.error('Editor element not found.');\n }\n }\n }\n\n \n\n getContent(): string {\n return this.editorContent;\n }\n\n //Two Way Data Binding Functionality\n\n private onChange = (content: string) => {};\n private onTouched = () => {};\n\n // Called by Angular to update the value programmatically\n writeValue(content: string): void {\n if (this.editor && this.editor.nativeElement) {\n this.editor.nativeElement.innerHTML = content || '';\n }\n }\n\n // Registers the onChange callback to notify Angular of content changes\n registerOnChange(fn: (content: string) => void): void {\n this.onChange = fn;\n }\n\n // Registers the onTouched callback for blur events\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n\n onBlur() {\n this.onTouched();\n }\n\n\n\n format(command: string): void {\n document.execCommand(command, false, '');\n }\n\n setHeading(event: Event): void {\n const value = (event.target as HTMLSelectElement).value;\n document.execCommand('formatBlock', false, value);\n }\n\n //Image Section\n \n allowDrop(event: DragEvent): void {\n event.preventDefault(); \n }\n\n // Handle image drag start\n drag(event: DragEvent, imageUrl: string): void {\n event.dataTransfer?.setData(\"text\", imageUrl); \n }\n\n // Handle drop event in the editor\n drop(event: DragEvent): void {\n event.preventDefault(); \n const imageUrl = event.dataTransfer?.getData(\"text\"); \n if (imageUrl) {\n this.insertImageInEditor(imageUrl); \n }\n }\n\n // insertImage(event: any): void {\n // const files: FileList = event.target.files;\n \n // if (!files || files.length === 0) {\n // console.error('No files selected.');\n // return;\n // }\n \n // Array.from(files).forEach((file) => {\n // // Check file type\n // if (file.type !== 'image/png' && !file.type.startsWith('image/')) {\n // console.error('Unsupported file type:', file.type);\n // return;\n // }\n \n // // Read the image file\n // const reader = new FileReader();\n // reader.onload = (e: any) => {\n // const imageUrl = e.target.result;\n \n // // Add image to the uploaded images list\n // this.uploadedImages.push(imageUrl);\n \n // // Call insertImageInEditor to add the image to the editor\n // this.insertImageInEditor(imageUrl);\n // };\n // reader.readAsDataURL(file);\n // });\n // } -> for PNG\n\n removeImage(index: number): void {\n this.uploadedImages.splice(index, 1); // Remove the image from the array\n }\n \n insertImageInEditor(imageUrl: string): void {\n const editor = document.querySelector('.editor') as HTMLElement;\n if (!editor) {\n console.error('Editor element not found.');\n return;\n }\n \n // Create image element\n const img = document.createElement('img');\n img.src = imageUrl;\n img.style.maxWidth = '100%';\n img.style.display = 'block';\n img.style.width = '300px'; \n img.style.height = 'auto';\n \n // Create a wrapper around the image to allow resizing\n const wrapper = document.createElement('div');\n wrapper.style.position = 'relative';\n wrapper.style.display = 'inline-block'; // Ensures the wrapper only takes up space for the image\n wrapper.style.margin = '10px';\n wrapper.style.padding = '5px';\n wrapper.style.border = '1px dashed #ccc'; // Optional border to indicate the image area\n \n // Append the image to the wrapper\n wrapper.appendChild(img);\n \n // Append the wrapper to the editor\n editor.appendChild(wrapper);\n \n // Make the image resizable\n this.makeImageResizable(wrapper, img);\n \n // Optionally, add a text node to maintain cursor position after appending the image\n const textNode = document.createTextNode('\\u200B'); // Invisible character to maintain position\n editor.appendChild(textNode);\n \n const range = document.createRange();\n range.setStartAfter(wrapper);\n range.collapse(true);\n \n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n \n makeImageResizable(wrapper: HTMLElement, img: HTMLImageElement): void {\n let isResizing = false;\n let startX = 0;\n let startY = 0;\n let startWidth = 0;\n let startHeight = 0;\n \n // Create resize handles for the image\n const createResizeHandle = (\n cursor: string,\n positionStyles: Record<string, string>,\n resizeCallback: (deltaX: number, deltaY: number) => void\n ) => {\n const handle = document.createElement('div');\n handle.style.position = 'absolute';\n handle.style.width = '10px';\n handle.style.height = '10px';\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\n handle.style.cursor = cursor;\n Object.assign(handle.style, positionStyles);\n \n handle.addEventListener('mousedown', (resizeEvent) => {\n isResizing = true;\n startX = resizeEvent.clientX;\n startY = resizeEvent.clientY;\n startWidth = img.offsetWidth;\n startHeight = img.offsetHeight;\n \n const onMouseMove = (moveEvent: MouseEvent) => {\n if (isResizing) {\n const deltaX = moveEvent.clientX - startX;\n const deltaY = moveEvent.clientY - startY;\n resizeCallback(deltaX, deltaY);\n }\n };\n \n const onMouseUp = () => {\n isResizing = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n \n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n \n wrapper.appendChild(handle);\n };\n \n // Add resizing handles to the wrapper for the image\n createResizeHandle(\n 'nw-resize',\n { top: '-5px', left: '-5px' },\n (deltaX, deltaY) => {\n img.style.width = `${startWidth - deltaX}px`;\n img.style.height = `${startHeight - deltaY}px`;\n }\n );\n createResizeHandle(\n 'se-resize',\n { bottom: '-5px', right: '-5px' },\n (deltaX, deltaY) => {\n img.style.width = `${startWidth + deltaX}px`;\n img.style.height = `${startHeight + deltaY}px`;\n }\n );\n }\n \n\n insertImage(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input?.files) {\n Array.from(input.files).forEach(file => {\n const reader = new FileReader();\n reader.onload = (e: any) => {\n const imageUrl = e.target.result;\n this.uploadedImages.push(imageUrl); // Store image URL in the array\n };\n reader.readAsDataURL(file);\n });\n }\n }\n \n\n convertImage(file: File): Promise<File> {\n return new Promise((resolve, reject) => {\n if (file.type !== 'image/png') {\n resolve(file); // Return the original file if it's not a PNG\n return;\n }\n \n const img = new Image();\n const reader = new FileReader();\n \n reader.onload = (e: any) => {\n img.src = e.target.result;\n \n img.onload = () => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) {\n reject(new Error('Failed to get canvas context'));\n return;\n }\n \n canvas.width = img.width;\n canvas.height = img.height;\n \n ctx.drawImage(img, 0, 0);\n canvas.toBlob(\n blob => {\n if (blob) {\n const jpgFile = new File([blob], file.name.replace(/\\.png$/, '.jpg'), { type: 'image/jpeg' });\n resolve(jpgFile);\n } else {\n reject(new Error('Failed to convert PNG to JPG'));\n }\n },\n 'image/jpeg',\n 0.95 // Quality factor for JPEG\n );\n };\n };\n \n reader.onerror = () => reject(new Error('Failed to read the file'));\n reader.readAsDataURL(file);\n });\n }\n \n \n \n\n // insertImageByDrag(imageUrl: string): void {\n // const editor = document.querySelector('.editor') as HTMLElement;\n // if (!editor) {\n // console.error('Editor element not found.');\n // return;\n // }\n\n // const img = document.createElement('img');\n // img.src = imageUrl;\n // img.style.maxWidth = '100%';\n // img.style.display = 'block';\n // img.style.width = '300px'; \n // img.style.height = 'auto';\n\n // editor.appendChild(img);\n // }\n \n\n insertImageToEditor(event: any): void {\n const file = event.target.files[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (e: any) => {\n const imageUrl = e.target.result;\n const editor = document.querySelector('.editor') as HTMLElement;\n \n if (!editor) {\n console.error('Editor element not found.');\n return;\n }\n \n \n const wrapper = document.createElement('div');\n wrapper.contentEditable = 'false'; \n wrapper.style.position = 'relative';\n wrapper.style.display = 'inline-block';\n wrapper.style.border = '1px dashed #ccc'; \n wrapper.style.margin = '10px';\n wrapper.style.padding = '5px';\n wrapper.style.borderBlockColor = '#007BFF';\n \n \n const img = document.createElement('img');\n img.src = imageUrl;\n img.style.maxWidth = '100%';\n img.style.display = 'block';\n img.style.width = '300px'; \n img.style.height = 'auto';\n wrapper.appendChild(img);\n \n \n let isResizing = false;\n let startX = 0;\n let startY = 0;\n let startWidth = 0;\n let startHeight = 0;\n \n const createResizeHandle = (\n cursor: string,\n positionStyles: Record<string, string>,\n resizeCallback: (deltaX: number, deltaY: number) => void\n ) => {\n const handle = document.createElement('div');\n handle.style.position = 'absolute';\n handle.style.width = '10px';\n handle.style.height = '10px';\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\n handle.style.cursor = cursor;\n Object.assign(handle.style, positionStyles);\n \n handle.addEventListener('mousedown', (resizeEvent) => {\n isResizing = true;\n startX = resizeEvent.clientX;\n startY = resizeEvent.clientY;\n startWidth = img.offsetWidth;\n startHeight = img.offsetHeight;\n \n const onMouseMove = (moveEvent: MouseEvent) => {\n if (isResizing) {\n const deltaX = moveEvent.clientX - startX;\n const deltaY = moveEvent.clientY - startY;\n resizeCallback(deltaX, deltaY);\n }\n };\n \n const onMouseUp = () => {\n isResizing = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n \n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n \n wrapper.appendChild(handle);\n };\n \n \n createResizeHandle(\n 'nw-resize',\n { top: '-5px', left: '-5px' },\n (deltaX, deltaY) => {\n img.style.width = `${startWidth - deltaX}px`;\n img.style.height = `${startHeight - deltaY}px`;\n }\n );\n createResizeHandle(\n 'se-resize',\n { bottom: '-5px', right: '-5px' },\n (deltaX, deltaY) => {\n img.style.width = `${startWidth + deltaX}px`;\n img.style.height = `${startHeight + deltaY}px`;\n }\n );\n \n \n editor.appendChild(wrapper);\n \n \n const textNode = document.createTextNode('\\u200B'); \n editor.appendChild(textNode);\n const range = document.createRange();\n range.setStartAfter(wrapper);\n range.collapse(true);\n \n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n };\n reader.readAsDataURL(file);\n }\n }\n \n \n\n \n\n\n openTableDialog(event: MouseEvent): void {\n this.rows = 1; \n this.cols = 1;\n\n const dialogRef = this.dialog.open(this.tableDialog, {\n position: {\n top: `${event.clientY}px`,\n left: `${event.clientX}px`,\n },\n panelClass: 'custom-dialog-container'\n });\n\n dialogRef.afterClosed().subscribe((result) => {\n if (result) {\n this.insertTable(result.rows, result.cols);\n }\n });\n }\n\n updatePreview(cols: number, rows: number) {\n this.cols = cols;\n this.rows = rows;\n }\n\n updateSelection(colIndex: number, rowIndex: number, dialogRef: any) {\n this.cols = colIndex;\n this.rows = rowIndex;\n dialogRef.close({ rows: this.rows, cols: this.cols }); // Close dialog with selection\n }\n \n \n\n makeFirstRowHeader(): void {\n const editor = this.editor.nativeElement;\n const selection = window.getSelection();\n \n // Check if selection is inside the editor\n if (!this.isSelectionInsideEditor(editor, selection)) {\n alert('Please place the cursor inside the table to make the first row a header.');\n return;\n }\n \n // Find the closest table to the selection\n const range = selection.getRangeAt(0);\n const selectedNode = range.startContainer;\n const table = this.findClosestTable(selectedNode);\n \n if (!table) {\n alert('No table found near the cursor.');\n return;\n }\n \n // Convert the first row cells to header cells\n const firstRow = table.rows[0];\n if (firstRow) {\n for (let i = 0; i < firstRow.cells.length; i++) {\n const cell = firstRow.cells[i];\n const th = document.createElement('th');\n th.innerHTML = cell.innerHTML;\n th.style.textAlign = 'center';\n th.style.backgroundColor = '#F1F1F0';\n th.style.border = '1px solid black';\n th.style.borderCollapse = 'collapse';\n th.style.padding = window.getComputedStyle(cell).padding; // Retain padding\n th.style.width = window.getComputedStyle(cell).width; // Retain width\n th.style.height = window.getComputedStyle(cell).height;\n firstRow.replaceChild(th, cell);\n }\n }\n \n editor.focus();\n }\n \n private findClosestTable(node: Node): HTMLTableElement | null {\n while (node && node !== document) {\n if (node.nodeName === 'TABLE') {\n return node as HTMLTableElement;\n }\n node = node.parentNode!;\n }\n return null;\n }\n \n \n insertTable(rows: string, cols: string): void {\n const rowCount = parseInt(rows, 10);\n const colCount = parseInt(cols, 10);\n \n if (isNaN(rowCount) || isNaN(colCount) || rowCount < 1 || colCount < 1) {\n alert('Please enter valid numbers for rows and columns.');\n return;\n }\n \n const editor = this.editor.nativeElement;\n const selection = window.getSelection();\n \n // Ensure selection is inside the editor\n if (!this.isSelectionInsideEditor(editor, selection)) {\n // Append the table at the end if selection is outside editor\n this.appendTable(editor, rowCount, colCount);\n return;\n }\n \n // Proceed to insert the table if selection is valid\n const tableHTML = this.createTableHTML(rowCount, colCount);\n const range = selection.getRangeAt(0);\n range.deleteContents(); // Remove any selected content\n \n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = tableHTML;\n \n range.insertNode(tempDiv.firstChild!); // Insert the table\n \n // Move the cursor to the first cell of the new table\n this.setCursorToFirstCell(tempDiv.firstChild as HTMLElement);\n editor.focus();\n }\n \n // Helper function: Create table HTML\n private createTableHTML(rowCount: number, colCount: number): string {\n let tableHTML = '<table border=\"1\" style=\"border-collapse: collapse; margin:5px\">';\n for (let i = 0; i < rowCount; i++) {\n tableHTML += '<tr>';\n for (let j = 0; j < colCount; j++) {\n tableHTML += `<td style=\"font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black\" \n role=\"textbox\" contenteditable=\"true\"></td>`;\n }\n tableHTML += '</tr>';\n }\n tableHTML += '</table>';\n return tableHTML;\n }\n \n \n // Helper function: Append a table at the end of the editor\n private appendTable(editor: HTMLElement, rowCount: number, colCount: number): void {\n const tableHTML = this.createTableHTML(rowCount, colCount);\n editor.innerHTML += tableHTML;\n \n // Set cursor inside the first cell of the new table\n const lastInsertedTable = editor.querySelector('table:last-child') as HTMLElement;\n this.setCursorToFirstCell(lastInsertedTable);\n editor.focus();\n }\n \n // Helper function: Check if selection is inside the editor\n private isSelectionInsideEditor(editor: HTMLElement, selection: Selection): boolean {\n if (!selection.rangeCount) return false;\n let node = selection.getRangeAt(0).commonAncestorContainer;\n \n // Traverse up to see if the node belongs to the editor\n while (node) {\n if (node === editor) return true;\n node = node.parentNode!;\n }\n return false;\n }\n \n // Helper function: Move cursor to the first cell\n // private setCursorToFirstCell(table: HTMLElement) {\n // const firstCell = table.querySelector('tr:first-child td:first-child') as HTMLElement;\n \n // if (firstCell) {\n // const newRange = document.createRange();\n // newRange.setStart(firstCell, 0); // Start at the beginning of the cell\n // newRange.collapse(true);\n \n // const selection = window.getSelection();\n // selection!.removeAllRanges();\n // selection!.addRange(newRange);\n // }\n // }\n\n private setCursorToFirstCell(table: HTMLElement): void {\n const firstCell = table.querySelector('tr:first-child td:first-child, tr:first-child th:first-child') as HTMLElement;\n\n if (firstCell) {\n // Ensure the cell is contenteditable\n firstCell.setAttribute('contenteditable', 'true');\n\n // Focus the cell\n firstCell.focus();\n\n // Create a range and place the cursor at the start of the cell\n const newRange = document.createRange();\n newRange.selectNodeContents(firstCell); // Select the contents of the cell\n newRange.collapse(true); // Collapse to the start\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n }\n }\n\n \n \n\n insertPageBreak(): void {\n const pageBreak = `<div style=\"page-break-after: always;\"><br /></div>`;\n document.execCommand('insertHTML', false, pageBreak);\n }\n\n submitContent(): void {\n const editor = this.editor.nativeElement;\n const content = editor.innerHTML; // Get the HTML content from the editor\n const plainTextContent = editor.innerText; // Optionally, get plain text content\n\n // For demonstration, you can log it or process it as needed\n this.onChange(content);\n\n // Example: You could send this data to a server or use it elsewhere in your application\n // this.yourService.submitContent({ content }); // Replace with your service call\n }\n\n}\n\n\n","<div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n \r\n <select class=\"select-wrapper\" (change)=\"setHeading($event)\">\r\n <option value=\"P\">Paragraph</option>\r\n <option value=\"H1\">H1</option>\r\n <option value=\"H2\">H2</option>\r\n <option value=\"H3\">H3</option>\r\n <option value=\"H4\">H4</option>\r\n <option value=\"H5\">H5</option>\r\n <option value=\"H6\">H6</option>\r\n </select>\r\n <button (click)=\"format('bold')\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('italic')\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('underline')\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('strikethrough')\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyLeft')\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyCenter')\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyRight')\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyFull')\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertUnorderedList')\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertOrderedList')\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n \r\n \r\n \r\n <button color=\"secondary\" aria-label=\"Insert Image\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\" \r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" \r\n />\r\n \r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n \r\n \r\n <button (click)=\"openTableDialog($event)\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon>border_all</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"makeFirstRowHeader()\" color=\"secondary\" aria-label=\"Make Header\">\r\n <img style=\"width: 26px; height: 46px; margin-bottom: 3px;\" src=\"../../../assets/H.svg\" alt=\"Apply Header to table\">\r\n </button>\r\n \r\n </div>\r\n \r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here --> \r\n </div>\r\n \r\n </div>\r\n \r\n <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button>\r\n \r\n \r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n \r\n \r\n <input type=\"file\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n \r\n \r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\" \r\n draggable=\"true\" \r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n \r\n <button class=\"remove-btn\" (click)=\"removeImage(i)\">Remove</button>\r\n </div>\r\n </div>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ","import { NgModule } from '@angular/core';\nimport { RapidTextEditorComponent } from './rapid-text-editor.component';\n\n//Mat Modules\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [\n RapidTextEditorComponent\n ],\n imports: [\n CommonModule,\n MatDialogModule,\n MatIconModule,\n MatDialogModule\n ],\n exports: [\n RapidTextEditorComponent\n ]\n})\nexport class RapidTextEditorModule { }\n","/*\n * Public API Surface of rapid-text-editor\n */\n\nexport * from './lib/rapid-text-editor.service';\nexport * from './lib/rapid-text-editor.component';\nexport * from './lib/rapid-text-editor.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rapid-text-editor.mjs","sources":["../../../projects/rapid-text-editor/src/lib/rapid-text-editor.service.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.ts","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.component.html","../../../projects/rapid-text-editor/src/lib/rapid-text-editor.module.ts","../../../projects/rapid-text-editor/src/public-api.ts","../../../projects/rapid-text-editor/src/rapid-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class RapidTextEditorService {\n\n constructor() { }\n}\n","import { Component, ElementRef, Input, Output, OnInit, ViewChild, OnChanges, TemplateRef, forwardRef, EventEmitter, AfterViewInit, SimpleChange, SimpleChanges, Renderer2} from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'app-rich-text-editor',\n templateUrl: './rapid-text-editor.component.html',\n styleUrls: ['./rapid-text-editor.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => RapidTextEditorComponent),\n multi: true\n }\n ]\n \n})\nexport class RapidTextEditorComponent implements ControlValueAccessor, OnInit, AfterViewInit, OnChanges {\n\n\n @Input() contentCapture: boolean = false;\n @Input() height: string = \"300px\";\n @Input() width: string = \"auto\";\n @Output() contentChange = new EventEmitter<string>();\n @ViewChild('editor', { static: true }) editor!: ElementRef;\n @ViewChild('tableDialog') tableDialog!: TemplateRef<any>;\n private editorContent: string = '';\n rows: number = 1;\n cols: number = 1;\n grid = Array(49).fill(0);\n Math = Math;\n uploadedImages: string[] = [];\n\n\n\n constructor(private dialog: MatDialog, private el: ElementRef,private renderer: Renderer2, private elRef: ElementRef) {\n console.log('Build -1')\n }\n \n ngOnInit(): void {\n if (this.contentCapture) {\n console.log('Content capture is enabled.');\n } else {\n console.log('Content capture is disabled.');\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['height'] || changes['width']) {\n this.applyDimensions();\n }\n }\n\n private applyDimensions(): void {\n const editorElement = this.elRef.nativeElement.querySelector('.dimension');\n if (this.height) {\n this.renderer.setStyle(editorElement, 'height', this.height);\n }\n if (this.width) {\n this.renderer.setStyle(editorElement, 'width', this.width);\n }\n }\n\n ngAfterViewInit(): void {\n const editor = this.el.nativeElement.querySelector('.editor');\n if (!editor) {\n console.error('Editor element not found.');\n }\n }\n\n \n\n onContentChange(): void {\n if (this.contentCapture) {\n const editor = this.el.nativeElement.querySelector('.editor');\n if (editor) {\n this.editorContent = editor.innerHTML;\n console.log('Captured Content (Child):', this.editorContent);\n this.contentChange.emit(this.editorContent);\n } else {\n console.error('Editor element not found.');\n }\n }\n }\n\n \n\n getContent(): string {\n return this.editorContent;\n }\n\n //Two Way Data Binding Functionality\n\n private onChange = (content: string) => {};\n private onTouched = () => {};\n\n // Called by Angular to update the value programmatically\n writeValue(content: string): void {\n if (this.editor && this.editor.nativeElement) {\n this.editor.nativeElement.innerHTML = content || '';\n }\n }\n\n // Registers the onChange callback to notify Angular of content changes\n registerOnChange(fn: (content: string) => void): void {\n this.onChange = fn;\n }\n\n // Registers the onTouched callback for blur events\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n\n onBlur() {\n this.onTouched();\n }\n\n\n\n format(command: string): void {\n document.execCommand(command, false, '');\n }\n\n setHeading(event: Event): void {\n const value = (event.target as HTMLSelectElement).value;\n document.execCommand('formatBlock', false, value);\n }\n\n //Image Section\n \n allowDrop(event: DragEvent): void {\n event.preventDefault(); \n }\n\n // Handle image drag start\n drag(event: DragEvent, imageUrl: string): void {\n event.dataTransfer?.setData(\"text\", imageUrl); \n }\n\n // Handle drop event in the editor\n drop(event: DragEvent): void {\n event.preventDefault(); \n const imageUrl = event.dataTransfer?.getData(\"text\"); \n if (imageUrl) {\n this.insertImageInEditor(imageUrl); \n }\n }\n\n // insertImage(event: any): void {\n // const files: FileList = event.target.files;\n \n // if (!files || files.length === 0) {\n // console.error('No files selected.');\n // return;\n // }\n \n // Array.from(files).forEach((file) => {\n // // Check file type\n // if (file.type !== 'image/png' && !file.type.startsWith('image/')) {\n // console.error('Unsupported file type:', file.type);\n // return;\n // }\n \n // // Read the image file\n // const reader = new FileReader();\n // reader.onload = (e: any) => {\n // const imageUrl = e.target.result;\n \n // // Add image to the uploaded images list\n // this.uploadedImages.push(imageUrl);\n \n // // Call insertImageInEditor to add the image to the editor\n // this.insertImageInEditor(imageUrl);\n // };\n // reader.readAsDataURL(file);\n // });\n // } -> for PNG\n\n removeImage(index: number): void {\n this.uploadedImages.splice(index, 1);\n }\n \n insertImageInEditor(imageUrl: string): void {\n const editor = document.querySelector('.editor') as HTMLElement;\n if (!editor) {\n console.error('Editor element not found.');\n return;\n }\n \n // Create image element\n const img = document.createElement('img');\n img.src = imageUrl;\n img.style.maxWidth = '100%';\n img.style.display = 'block';\n img.style.width = '300px'; \n img.style.height = 'auto';\n \n // Create a wrapper around the image to allow resizing\n const wrapper = document.createElement('div');\n wrapper.style.position = 'relative';\n wrapper.style.display = 'inline-block'; // Ensures the wrapper only takes up space for the image\n wrapper.style.margin = '10px';\n wrapper.style.padding = '5px';\n wrapper.style.border = '1px dashed #ccc'; // Optional border to indicate the image area\n \n // Append the image to the wrapper\n wrapper.appendChild(img);\n \n // Append the wrapper to the editor\n editor.appendChild(wrapper);\n \n // Make the image resizable\n this.makeImageResizable(wrapper, img);\n \n // Optionally, add a text node to maintain cursor position after appending the image\n const textNode = document.createTextNode('\\u200B'); // Invisible character to maintain position\n editor.appendChild(textNode);\n \n const range = document.createRange();\n range.setStartAfter(wrapper);\n range.collapse(true);\n \n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n }\n \n makeImageResizable(wrapper: HTMLElement, img: HTMLImageElement): void {\n let isResizing = false;\n let startX = 0;\n let startY = 0;\n let startWidth = 0;\n let startHeight = 0;\n \n // Create resize handles for the image\n const createResizeHandle = (\n cursor: string,\n positionStyles: Record<string, string>,\n resizeCallback: (deltaX: number, deltaY: number) => void\n ) => {\n const handle = document.createElement('div');\n handle.style.position = 'absolute';\n handle.style.width = '10px';\n handle.style.height = '10px';\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\n handle.style.cursor = cursor;\n Object.assign(handle.style, positionStyles);\n \n handle.addEventListener('mousedown', (resizeEvent) => {\n isResizing = true;\n startX = resizeEvent.clientX;\n startY = resizeEvent.clientY;\n startWidth = img.offsetWidth;\n startHeight = img.offsetHeight;\n \n const onMouseMove = (moveEvent: MouseEvent) => {\n if (isResizing) {\n const deltaX = moveEvent.clientX - startX;\n const deltaY = moveEvent.clientY - startY;\n resizeCallback(deltaX, deltaY);\n }\n };\n \n const onMouseUp = () => {\n isResizing = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n \n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n \n wrapper.appendChild(handle);\n };\n \n // Add resizing handles to the wrapper for the image\n createResizeHandle(\n 'nw-resize',\n { top: '-5px', left: '-5px' },\n (deltaX, deltaY) => {\n img.style.width = `${startWidth - deltaX}px`;\n img.style.height = `${startHeight - deltaY}px`;\n }\n );\n createResizeHandle(\n 'se-resize',\n { bottom: '-5px', right: '-5px' },\n (deltaX, deltaY) => {\n img.style.width = `${startWidth + deltaX}px`;\n img.style.height = `${startHeight + deltaY}px`;\n }\n );\n }\n \n\n insertImage(event: Event): void {\n const input = event.target as HTMLInputElement;\n if (input?.files) {\n Array.from(input.files).forEach(file => {\n const reader = new FileReader();\n reader.onload = (e: any) => {\n const imageUrl = e.target.result;\n this.uploadedImages.push(imageUrl); // Store image URL in the array\n };\n reader.readAsDataURL(file);\n });\n }\n }\n \n\n convertImage(file: File): Promise<File> {\n return new Promise((resolve, reject) => {\n if (file.type !== 'image/png') {\n resolve(file); // Return the original file if it's not a PNG\n return;\n }\n \n const img = new Image();\n const reader = new FileReader();\n \n reader.onload = (e: any) => {\n img.src = e.target.result;\n \n img.onload = () => {\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n \n if (!ctx) {\n reject(new Error('Failed to get canvas context'));\n return;\n }\n \n canvas.width = img.width;\n canvas.height = img.height;\n \n ctx.drawImage(img, 0, 0);\n canvas.toBlob(\n blob => {\n if (blob) {\n const jpgFile = new File([blob], file.name.replace(/\\.png$/, '.jpg'), { type: 'image/jpeg' });\n resolve(jpgFile);\n } else {\n reject(new Error('Failed to convert PNG to JPG'));\n }\n },\n 'image/jpeg',\n 0.95 // Quality factor for JPEG\n );\n };\n };\n \n reader.onerror = () => reject(new Error('Failed to read the file'));\n reader.readAsDataURL(file);\n });\n }\n \n \n \n\n // insertImageByDrag(imageUrl: string): void {\n // const editor = document.querySelector('.editor') as HTMLElement;\n // if (!editor) {\n // console.error('Editor element not found.');\n // return;\n // }\n\n // const img = document.createElement('img');\n // img.src = imageUrl;\n // img.style.maxWidth = '100%';\n // img.style.display = 'block';\n // img.style.width = '300px'; \n // img.style.height = 'auto';\n\n // editor.appendChild(img);\n // }\n \n\n insertImageToEditor(event: any): void {\n const file = event.target.files[0];\n if (file) {\n const reader = new FileReader();\n reader.onload = (e: any) => {\n const imageUrl = e.target.result;\n const editor = document.querySelector('.editor') as HTMLElement;\n \n if (!editor) {\n console.error('Editor element not found.');\n return;\n }\n \n \n const wrapper = document.createElement('div');\n wrapper.contentEditable = 'false'; \n wrapper.style.position = 'relative';\n wrapper.style.display = 'inline-block';\n wrapper.style.border = '1px dashed #ccc'; \n wrapper.style.margin = '10px';\n wrapper.style.padding = '5px';\n wrapper.style.borderBlockColor = '#007BFF';\n \n \n const img = document.createElement('img');\n img.src = imageUrl;\n img.style.maxWidth = '100%';\n img.style.display = 'block';\n img.style.width = '300px'; \n img.style.height = 'auto';\n wrapper.appendChild(img);\n \n \n let isResizing = false;\n let startX = 0;\n let startY = 0;\n let startWidth = 0;\n let startHeight = 0;\n \n const createResizeHandle = (\n cursor: string,\n positionStyles: Record<string, string>,\n resizeCallback: (deltaX: number, deltaY: number) => void\n ) => {\n const handle = document.createElement('div');\n handle.style.position = 'absolute';\n handle.style.width = '10px';\n handle.style.height = '10px';\n handle.style.background = 'rgba(0, 0, 0, 0.5)';\n handle.style.cursor = cursor;\n Object.assign(handle.style, positionStyles);\n \n handle.addEventListener('mousedown', (resizeEvent) => {\n isResizing = true;\n startX = resizeEvent.clientX;\n startY = resizeEvent.clientY;\n startWidth = img.offsetWidth;\n startHeight = img.offsetHeight;\n \n const onMouseMove = (moveEvent: MouseEvent) => {\n if (isResizing) {\n const deltaX = moveEvent.clientX - startX;\n const deltaY = moveEvent.clientY - startY;\n resizeCallback(deltaX, deltaY);\n }\n };\n \n const onMouseUp = () => {\n isResizing = false;\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n };\n \n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n });\n \n wrapper.appendChild(handle);\n };\n \n \n createResizeHandle(\n 'nw-resize',\n { top: '-5px', left: '-5px' },\n (deltaX, deltaY) => {\n img.style.width = `${startWidth - deltaX}px`;\n img.style.height = `${startHeight - deltaY}px`;\n }\n );\n createResizeHandle(\n 'se-resize',\n { bottom: '-5px', right: '-5px' },\n (deltaX, deltaY) => {\n img.style.width = `${startWidth + deltaX}px`;\n img.style.height = `${startHeight + deltaY}px`;\n }\n );\n \n \n editor.appendChild(wrapper);\n \n \n const textNode = document.createTextNode('\\u200B'); \n editor.appendChild(textNode);\n const range = document.createRange();\n range.setStartAfter(wrapper);\n range.collapse(true);\n \n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(range);\n }\n };\n reader.readAsDataURL(file);\n }\n }\n \n \n\n \n\n\n openTableDialog(event: MouseEvent): void {\n this.rows = 1; \n this.cols = 1;\n\n const dialogRef = this.dialog.open(this.tableDialog, {\n position: {\n top: `${event.clientY}px`,\n left: `${event.clientX}px`,\n },\n panelClass: 'custom-dialog-container'\n });\n\n dialogRef.afterClosed().subscribe((result) => {\n if (result) {\n this.insertTable(result.rows, result.cols);\n }\n });\n }\n\n updatePreview(cols: number, rows: number) {\n this.cols = cols;\n this.rows = rows;\n }\n\n updateSelection(colIndex: number, rowIndex: number, dialogRef: any) {\n this.cols = colIndex;\n this.rows = rowIndex;\n dialogRef.close({ rows: this.rows, cols: this.cols }); // Close dialog with selection\n }\n \n \n\n makeFirstRowHeader(): void {\n const editor = this.editor.nativeElement;\n const selection = window.getSelection();\n \n // Check if selection is inside the editor\n if (!this.isSelectionInsideEditor(editor, selection)) {\n alert('Please place the cursor inside the table to make the first row a header.');\n return;\n }\n \n // Find the closest table to the selection\n const range = selection.getRangeAt(0);\n const selectedNode = range.startContainer;\n const table = this.findClosestTable(selectedNode);\n \n if (!table) {\n alert('No table found near the cursor.');\n return;\n }\n \n // Convert the first row cells to header cells\n const firstRow = table.rows[0];\n if (firstRow) {\n for (let i = 0; i < firstRow.cells.length; i++) {\n const cell = firstRow.cells[i];\n const th = document.createElement('th');\n th.innerHTML = cell.innerHTML;\n th.style.textAlign = 'center';\n th.style.backgroundColor = '#F1F1F0';\n th.style.border = '1px solid black';\n th.style.borderCollapse = 'collapse';\n th.style.padding = window.getComputedStyle(cell).padding; // Retain padding\n th.style.width = window.getComputedStyle(cell).width; // Retain width\n th.style.height = window.getComputedStyle(cell).height;\n firstRow.replaceChild(th, cell);\n }\n }\n \n editor.focus();\n }\n \n private findClosestTable(node: Node): HTMLTableElement | null {\n while (node && node !== document) {\n if (node.nodeName === 'TABLE') {\n return node as HTMLTableElement;\n }\n node = node.parentNode!;\n }\n return null;\n }\n \n \n insertTable(rows: string, cols: string): void {\n const rowCount = parseInt(rows, 10);\n const colCount = parseInt(cols, 10);\n \n if (isNaN(rowCount) || isNaN(colCount) || rowCount < 1 || colCount < 1) {\n alert('Please enter valid numbers for rows and columns.');\n return;\n }\n \n const editor = this.editor.nativeElement;\n const selection = window.getSelection();\n \n // Ensure selection is inside the editor\n if (!this.isSelectionInsideEditor(editor, selection)) {\n // Append the table at the end if selection is outside editor\n this.appendTable(editor, rowCount, colCount);\n return;\n }\n \n // Proceed to insert the table if selection is valid\n const tableHTML = this.createTableHTML(rowCount, colCount);\n const range = selection.getRangeAt(0);\n range.deleteContents(); // Remove any selected content\n \n const tempDiv = document.createElement('div');\n tempDiv.innerHTML = tableHTML;\n \n range.insertNode(tempDiv.firstChild!); // Insert the table\n \n // Move the cursor to the first cell of the new table\n this.setCursorToFirstCell(tempDiv.firstChild as HTMLElement);\n editor.focus();\n }\n \n // Helper function: Create table HTML\n private createTableHTML(rowCount: number, colCount: number): string {\n let tableHTML = '<table border=\"1\" style=\"border-collapse: collapse; margin:5px\">';\n for (let i = 0; i < rowCount; i++) {\n tableHTML += '<tr>';\n for (let j = 0; j < colCount; j++) {\n tableHTML += `<td style=\"font-size: 14px; min-width: 1.5em; height: 2em; padding: .4em; border: 1px solid black\" \n role=\"textbox\" contenteditable=\"true\"></td>`;\n }\n tableHTML += '</tr>';\n }\n tableHTML += '</table>';\n return tableHTML;\n }\n \n \n // Helper function: Append a table at the end of the editor\n private appendTable(editor: HTMLElement, rowCount: number, colCount: number): void {\n const tableHTML = this.createTableHTML(rowCount, colCount);\n editor.innerHTML += tableHTML;\n \n // Set cursor inside the first cell of the new table\n const lastInsertedTable = editor.querySelector('table:last-child') as HTMLElement;\n this.setCursorToFirstCell(lastInsertedTable);\n editor.focus();\n }\n \n // Helper function: Check if selection is inside the editor\n private isSelectionInsideEditor(editor: HTMLElement, selection: Selection): boolean {\n if (!selection.rangeCount) return false;\n let node = selection.getRangeAt(0).commonAncestorContainer;\n \n // Traverse up to see if the node belongs to the editor\n while (node) {\n if (node === editor) return true;\n node = node.parentNode!;\n }\n return false;\n }\n \n // Helper function: Move cursor to the first cell\n // private setCursorToFirstCell(table: HTMLElement) {\n // const firstCell = table.querySelector('tr:first-child td:first-child') as HTMLElement;\n \n // if (firstCell) {\n // const newRange = document.createRange();\n // newRange.setStart(firstCell, 0); // Start at the beginning of the cell\n // newRange.collapse(true);\n \n // const selection = window.getSelection();\n // selection!.removeAllRanges();\n // selection!.addRange(newRange);\n // }\n // }\n\n private setCursorToFirstCell(table: HTMLElement): void {\n const firstCell = table.querySelector('tr:first-child td:first-child, tr:first-child th:first-child') as HTMLElement;\n\n if (firstCell) {\n // Ensure the cell is contenteditable\n firstCell.setAttribute('contenteditable', 'true');\n\n // Focus the cell\n firstCell.focus();\n\n // Create a range and place the cursor at the start of the cell\n const newRange = document.createRange();\n newRange.selectNodeContents(firstCell); // Select the contents of the cell\n newRange.collapse(true); // Collapse to the start\n\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n selection.addRange(newRange);\n }\n }\n }\n\n \n \n\n insertPageBreak(): void {\n const pageBreak = `<div style=\"page-break-after: always;\"><br /></div>`;\n document.execCommand('insertHTML', false, pageBreak);\n }\n\n submitContent(): void {\n const editor = this.editor.nativeElement;\n const content = editor.innerHTML; // Get the HTML content from the editor\n const plainTextContent = editor.innerText; // Optionally, get plain text content\n\n // For demonstration, you can log it or process it as needed\n this.onChange(content);\n\n // Example: You could send this data to a server or use it elsewhere in your application\n // this.yourService.submitContent({ content }); // Replace with your service call\n }\n\n}\n","<div class=\"dimension\">\r\n\r\n\r\n <div class=\"rich-text-editor\">\r\n <!-- Toolbar -->\r\n <div class=\"toolbar\">\r\n \r\n <select class=\"select-wrapper\" (change)=\"setHeading($event)\">\r\n <option value=\"P\">Paragraph</option>\r\n <option value=\"H1\">H1</option>\r\n <option value=\"H2\">H2</option>\r\n <option value=\"H3\">H3</option>\r\n <option value=\"H4\">H4</option>\r\n <option value=\"H5\">H5</option>\r\n <option value=\"H6\">H6</option>\r\n </select>\r\n <button (click)=\"format('bold')\" aria-label=\"Bold\">\r\n <mat-icon>format_bold</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('italic')\" aria-label=\"Italic\">\r\n <mat-icon>format_italic</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('underline')\" aria-label=\"Underline\">\r\n <mat-icon>format_underline</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('strikethrough')\" aria-label=\"Strikethrough\">\r\n <mat-icon>strikethrough_s</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyLeft')\" aria-label=\"Align Left\">\r\n <mat-icon>format_align_left</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyCenter')\" aria-label=\"Center\">\r\n <mat-icon>format_align_center</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyRight')\" aria-label=\"Align Right\">\r\n <mat-icon>format_align_right</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('justifyFull')\" aria-label=\"Justify\">\r\n <mat-icon>format_align_justify</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertUnorderedList')\" aria-label=\"Unordered List\">\r\n <mat-icon>format_list_bulleted</mat-icon>\r\n </button>\r\n \r\n <button (click)=\"format('insertOrderedList')\" aria-label=\"Ordered List\">\r\n <mat-icon>format_list_numbered</mat-icon>\r\n </button>\r\n \r\n \r\n \r\n <button color=\"secondary\" aria-label=\"Insert Image\" style=\"position: relative; display: inline-flex; align-items: center; justify-content: center;\">\r\n <input\r\n type=\"file\" \r\n (change)=\"insertImageToEditor($event)\"\r\n style=\"position: absolute; left: -50%; top: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer;\"\r\n aria-hidden=\"true\" \r\n />\r\n \r\n <mat-icon style=\"pointer-events: none;\">insert_photo_outlined</mat-icon>\r\n </button>\r\n \r\n \r\n <button (click)=\"openTableDialog($event)\" color=\"secondary\" aria-label=\"Choose table rows and columns\">\r\n <mat-icon >border_all</mat-icon>\r\n </button>\r\n \r\n <button class=\"ms-1\" style=\"all: unset;margin-bottom: 6px;\" (click)=\"makeFirstRowHeader()\" color=\"secondary\" aria-label=\"Make Header\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"20px\" viewBox=\"0 -960 960 960\" width=\"20px\" fill=\"#6C757D\"><path d=\"M120-760v-80h720v80H120Zm640 80q33 0 56.5 23.5T840-600v400q0 33-23.5 56.5T760-120H200q-33 0-56.5-23.5T120-200v-400q0-33 23.5-56.5T200-680h560Zm0 80H200v400h560v-400Zm-560 0v400-400Z\"/></svg>\r\n </button>\r\n <!-- <mat-icon>page_header</mat-icon> -->\r\n \r\n \r\n \r\n \r\n </div>\r\n \r\n <!-- Editable Area -->\r\n <!-- (keypress)=\"onContentChange()\" need to be included -->\r\n <div class=\"editor\" id=\"editor\" contenteditable=\"true\" #editor (input)=\"submitContent()\" (blur)=\"onBlur()\" (drop)=\"drop($event)\" (dragover)=\"allowDrop($event)\" >\r\n <!-- Your content goes here --> \r\n </div>\r\n \r\n </div>\r\n \r\n <!-- <button mat-stroked-button class=\"submit\" (click)=\"submitContent()\">Submit</button> -->\r\n \r\n \r\n <ng-template #tableDialog let-dialogRef=\"dialogRef\">\r\n <h2 mat-dialog-title>Choose Table Size</h2>\r\n <mat-dialog-content>\r\n <div class=\"grid-container\">\r\n <div\r\n *ngFor=\"let cell of grid; let i = index\"\r\n [ngClass]=\"{\r\n 'grid-item': true,\r\n 'highlighted': i % 7 < cols && Math.floor(i / 7) < rows\r\n }\"\r\n (mouseenter)=\"updatePreview(i % 7 + 1, Math.floor(i / 7) + 1)\"\r\n (click)=\"updateSelection(i % 7 + 1, Math.floor(i / 7) + 1, dialogRef)\"\r\n ></div>\r\n </div>\r\n <p>{{ rows }} x {{ cols }} </p>\r\n </mat-dialog-content>\r\n </ng-template>\r\n \r\n <div>\r\n <input class=\"mt-2\" type=\"file\" placeholder=\"Upload your images here...\" (change)=\"insertImage($event)\" accept=\"image/png,image/*\" multiple />\r\n <div class=\"uploaded-images\" *ngIf=\"uploadedImages.length > 0\">\r\n <div *ngFor=\"let imageUrl of uploadedImages; let i = index\" class=\"image-preview\">\r\n <img [src]=\"imageUrl\" alt=\"Uploaded Image\" \r\n draggable=\"true\" width=\"100px\" height=\"100px\"\r\n (dragstart)=\"drag($event, imageUrl)\" />\r\n <mat-icon style=\"color: red;\r\n position: absolute\" (click)=\"removeImage(i)\">cancel</mat-icon>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n \r\n </div>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n ","import { NgModule } from '@angular/core';\nimport { RapidTextEditorComponent } from './rapid-text-editor.component';\n\n//Mat Modules\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n declarations: [\n RapidTextEditorComponent\n ],\n imports: [\n CommonModule,\n MatIconModule,\n MatButtonModule,\n MatDialogModule\n ],\n exports: [\n RapidTextEditorComponent\n ]\n})\nexport class RapidTextEditorModule { }\n","/*\n * Public API Surface of rapid-text-editor\n */\n\nexport * from './lib/rapid-text-editor.service';\nexport * from './lib/rapid-text-editor.component';\nexport * from './lib/rapid-text-editor.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}