el-text-editor 0.0.87 → 0.0.89
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.
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"el-text-editor.mjs","sources":["../../../projects/el-text-editor/src/lib/el-text-editor.service.ts","../../../projects/el-text-editor/src/lib/el-text-editor.component.ts","../../../projects/el-text-editor/src/lib/el-text-editor.component.html","../../../projects/el-text-editor/src/lib/el-text-editor.module.ts","../../../projects/el-text-editor/src/public-api.ts","../../../projects/el-text-editor/src/el-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ElTextEditorService {\r\n\r\n constructor() { }\r\n}\r\n","import { AfterViewInit, Component, Input, OnInit, Output, EventEmitter, forwardRef, ViewChild, ElementRef, Renderer2, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n// import { MatDialog } from '@angular/material/dialog';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { NgxFullscreenDirective } from '@ultimate/ngx-fullscreen';\r\nimport * as XLSX from 'xlsx';\r\n// import { ImageEditorModalComponent } from '../modals/image-editor-modal/image-editor-modal.component';\r\nimport { compress, decompress } from 'lz-string';\r\n\r\n\r\n@Component({\r\n selector: 'text-editor',\r\n templateUrl: './el-text-editor.component.html',\r\n styleUrls: ['./el-text-editor.component.scss'],\r\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ElTextEditorComponent),\r\n multi: true\r\n }]\r\n})\r\nexport class ElTextEditorComponent implements ControlValueAccessor, AfterViewInit, OnChanges {\r\n\r\n @Input() editorText: string = '';\r\n @Input() editorFrom: any;\r\n @Input() editorAction: any;\r\n @Input() UserRole: any;\r\n @Input() style: any;\r\n @Input() disableToolbar: any;\r\n @Input() placeHolder: any;\r\n @Input() reportId: any;\r\n @Input() backgroundImage: any;\r\n @Input() toolbarMode: 'fixed' | 'bubble' | 'none' = 'fixed';\r\n @Input() contentEditable: boolean = true; // Input for initial value\r\n @Output() contentEditableChange: EventEmitter<boolean> = new EventEmitter<boolean>(); // Output for changes\r\n @Output() editorTextChange = new EventEmitter<string>();\r\n @Output() editorActionResponse = new EventEmitter<any>();\r\n @Output() editorTextClear = new EventEmitter<any>();\r\n @Output() imageEdit = new EventEmitter<any>();\r\n @Output() imageEdit2 = new EventEmitter<any>();\r\n @Output() placeHolderRemove = new EventEmitter<any>();\r\n @Output() isOpen = new EventEmitter<any>();\r\n @Output() newImageAdded = new EventEmitter<any>();\r\n \r\n @Input() value: string = '';\r\n\r\n \r\n @ViewChild('textEditor') TextEditor!: ElementRef<Element>;\r\n @ViewChild('fullscreen') fullscreen!: NgxFullscreenDirective\r\n \r\n sanitizedContent!: SafeHtml;\r\n\r\n\r\n showToolbar = false;\r\n toolbarTop = 0;\r\n toolbarLeft = 0;\r\n\r\n fonts = ['Arial', 'Courier New', 'Georgia', 'Times New Roman', 'Verdana'];\r\n fontSizes = [10, 12, 14, 16, 18, 20, 24, 28, 32, 36];\r\n selectedFont = 'Arial';\r\n selectedFontSize = 14;\r\n isTableSelected = false;\r\n tableAdded = false;\r\n selectedTable: HTMLTableElement | null = null;\r\n isPlaceholderVisible = true;\r\n selectedCell: HTMLTableCellElement | null = null;\r\n \r\n isBoldActive: boolean = false;\r\n isItalicActive: boolean = false;\r\n isUnderlineActive: boolean = false;\r\n isStrikethroughActive: boolean = false;\r\n isSubscriptActive: boolean = false;\r\n isSuperscriptActive: boolean = false;\r\n\r\n selectedFormatBlock: string = 'normal'\r\n\r\n selectedImage: HTMLImageElement | null = null;\r\n imageEditUrl: string = '';\r\n imagePositionX = 0;\r\n imagePositionY = 0;\r\n imageResizeStartX = 0;\r\n imageResizeStartY = 0;\r\n imageResizeStartWidth = 0;\r\n imageResizeStartHeight = 0;\r\n imageResizeDirection: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | null = null;\r\n\r\n undoStack: string[] = [];\r\n redoStack: string[] = [];\r\n history: string[] = [];\r\n historyIndex = -1;\r\n // editorText1 = ``;\r\n selectedTextColor: any;\r\n onChange: any = () => {};\r\n onTouched: any = () => {};\r\n color: any = '#ddd';\r\n colorFormControl!: FormControl;\r\n backgroundColor: any;\r\n selectedItemIndex: number | null = null;\r\n\r\n parsedTable: { headers: string[], rows: string[][] } | null = null;\r\n\r\n isFullScreen: boolean = false;\r\n currentCaretPosition: any;\r\n userRole: any[] = [];\r\n showEditButton: boolean = false;\r\n tHeadBgColor: any;\r\n\r\n constructor(\r\n private router: Router,\r\n private route: ActivatedRoute,\r\n private renderer: Renderer2,\r\n private sanitizer: DomSanitizer,\r\n ) {\r\n this.getUserRoles()\r\n\r\n \r\n }\r\n\r\n themeMode() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '2px solid #403F4A !important'\r\n } else {\r\n return '2px solid #D0D0D0 !important'\r\n }\r\n }\r\n\r\n themeModeClr() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '#fff !important'\r\n } else {\r\n return '#000 !important'\r\n }\r\n }\r\n\r\n themeModeClrVerticalLine() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '2px solid #FFFFFF !important'\r\n } else {\r\n return '2px solid #D0D0D0 !important'\r\n }\r\n }\r\n\r\n themeModeBgClr() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '#282828 !important'\r\n } else {\r\n return '#F3F3F3 !important'\r\n }\r\n }\r\n\r\n themeModeBorderTop() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '2px solid #000 !important'\r\n } else {\r\n return '2px solid #fff !important'\r\n }\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['placeHolder']) {\r\n this.insertAtCaret(this.placeHolder)\r\n\r\n }\r\n\r\n if (changes['reportId']) {\r\n sessionStorage.setItem('reportId', this.reportId)\r\n } \r\n\r\n if (changes['UserRole']) { \r\n this.getUserRoles()\r\n }\r\n }\r\n ngAfterViewInit() {\r\n this.initEditor();\r\n this.checkPlaceholder();\r\n this.setupHistory();\r\n document.addEventListener('fullscreenchange', this.onFullscreenChange);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.init_Func(this.editorText)\r\n document.addEventListener('selectionchange', () => {\r\n this.checkActiveStates();\r\n this.checkFormatBlock();\r\n });\r\n this.addClickListenerToImages();\r\n this.addClickListenerToElements();\r\n // this.route.queryParams.subscribe(params => {\r\n // const data = JSON.parse(params['data']);\r\n // if (data.editedIMG) {\r\n // const imgUrl = sessionStorage.getItem('editImageFromTemp');\r\n // if (imgUrl) {\r\n // this.replaceImageSrc(imgUrl, data.index.index)\r\n // }\r\n // sessionStorage.removeItem('editImageFromTemp');\r\n // }\r\n // })\r\n }\r\n\r\n ngOnDestroy() {\r\n // Cleanup the event listener when the component is destroyed\r\n document.removeEventListener('fullscreenchange', this.onFullscreenChange);\r\n }\r\n\r\n IsOpen: boolean = false;\r\n\r\n toggleFullscreen1() {\r\n this.IsOpen = !this.IsOpen;\r\n this.isOpen.emit(this.IsOpen)\r\n if (this.IsOpen) { \r\n this.fullscreen.enter(this.TextEditor.nativeElement);\r\n } else {\r\n this.fullscreen.exit()\r\n }\r\n }\r\n \r\n private onFullscreenChange = () => {\r\n if (!document.fullscreenElement) {\r\n // When fullscreen mode is exited\r\n this.IsOpen = false;\r\n this.isOpen.emit(this.IsOpen);\r\n }\r\n };\r\n \r\n // enterFullscreenVideo() {\r\n // console.log('event:', event);\r\n // const fullscreen = event;\r\n // this.isOpen = event;\r\n // if (fullscreen) {\r\n // this.fullscreen.enter(this.TextEditor.nativeElement);\r\n // } else {\r\n // this.fullscreen.exit()\r\n // }\r\n \r\n // }\r\n\r\n writeValue(value: any): void {\r\n if (value !== undefined) {\r\n this.editorText = value;\r\n this.initEditor();\r\n this.init_Func(this.editorText);\r\n }\r\n }\r\n \r\n// private addClickListenerToImages() {\r\n// const editor = document.getElementById('editor');\r\n// if (editor) {\r\n// editor.addEventListener('click', (event) => {\r\n// const target = event.target as HTMLElement;\r\n// if (target.tagName === 'IMG') {\r\n// this.selectedImage = target as HTMLImageElement;\r\n// this.imageEditUrl = this.selectedImage.src;\r\n\r\n// let container = this.selectedImage.parentElement;\r\n// if (!container || container.className !== 'image-container') {\r\n// container = document.createElement('div');\r\n// container.className = 'image-container';\r\n// container.style.position = 'relative';\r\n// container.style.display = 'inline-block';\r\n// this.selectedImage.parentNode?.insertBefore(container, this.selectedImage);\r\n// container.appendChild(this.selectedImage);\r\n// }\r\n// const existingButton = container.querySelector('.image-edit-button');\r\n// if (existingButton) {\r\n// existingButton.remove();\r\n// }\r\n\r\n// const button = document.createElement('button');\r\n// // button.textContent = 'Edit';\r\n// button.innerText = 'Edit Image';\r\n\r\n// button.className = 'image-edit-button btn btn-sm';\r\n// button.style.position = 'absolute';\r\n// button.style.top = '50%';\r\n// button.style.left = '50%';\r\n// button.style.transform = 'translate(-50%, -50%)';\r\n// button.style.zIndex = '1000';\r\n// button.style.backgroundColor = '#fff';\r\n// button.style.border = '2px solid #fff';\r\n// // button.style.padding = '10px';\r\n// button.style.color = '#313a46';\r\n// button.style.cursor = 'pointer';\r\n\r\n// button.addEventListener('click', (e) => {\r\n// e.stopPropagation();\r\n// this.editImage();\r\n// });\r\n\r\n// container.appendChild(button);\r\n// } else {\r\n// this.selectedImage = null;\r\n// this.selectedItemIndex = null;\r\n// }\r\n// });\r\n// }\r\n // }\r\n getUserRoles() {\r\n this.userRole = this.UserRole\r\n }\r\n // roleCheck() {\r\n // for (let i = 0; i < this.userRole.length; ++i) {\r\n // const roleName = []\r\n // roleName.push(this.userRole[i]?.name);\r\n // return this.userRole[i]?.name;\r\n // }\r\n // }\r\n\r\n roleCheck() {\r\n let userRoleName: string[] = [];\r\n for (let i = 0; i <= this.userRole.length; ++i) {\r\n userRoleName.push(this.userRole[i]?.name);\r\n }\r\n return userRoleName;\r\n }\r\n\r\n\r\n// private addClickListenerToImages() {\r\n// const editor = document.getElementById('editor');\r\n// const roles = this.roleCheck(); // Get user roles dynamically\r\n// const isAdmin = roles.includes('Admin');\r\n// const isCreator = roles.includes('Creator');\r\n// const isApprover = roles.includes('Approver');\r\n \r\n// if (isCreator || isAdmin) {\r\n// if (editor) {\r\n// editor.addEventListener('click', (event) => {\r\n// const target = event.target as HTMLElement;\r\n// if (target.tagName === 'IMG') {\r\n// this.selectedImage = target as HTMLImageElement;\r\n// this.imageEditUrl = this.selectedImage.src;\r\n// let container = this.selectedImage.parentElement;\r\n// if (!container || container.className !== 'image-container') {\r\n// container = document.createElement('div');\r\n// container.className = 'image-container';\r\n// container.style.position = 'relative';\r\n// container.style.display = 'inline-block'; \r\n// this.selectedImage.parentNode?.insertBefore(container, this.selectedImage);\r\n// container.appendChild(this.selectedImage);\r\n// }\r\n\r\n// const existingButton = container.querySelector('.image-edit-button');\r\n// if (existingButton) {\r\n// existingButton.remove();\r\n// }\r\n\r\n// const button = document.createElement('button');\r\n// button.textContent = 'Edit Image';\r\n// button.className = 'image-edit-button btn btn-sm';\r\n// button.style.position = 'absolute';\r\n// button.style.top = '50%';\r\n// button.style.left = '50%';\r\n// button.style.transform = 'translate(-50%, -50%)';\r\n// button.style.zIndex = '1000';\r\n// button.style.backgroundColor = '#fff'; \r\n// button.style.border = '2px solid #fff'; \r\n// button.style.color = '#313a46';\r\n// button.style.cursor = 'pointer';\r\n// button.style.userSelect = 'none';\r\n\r\n// button.addEventListener('click', (e) => {\r\n// e.stopPropagation();\r\n// this.editImage();\r\n// });\r\n\r\n// container.appendChild(button);\r\n\r\n// } else {\r\n// this.selectedImage = null;\r\n// this.selectedItemIndex = null;\r\n// const buttons = document.querySelectorAll('.image-edit-button');\r\n// buttons.forEach(button => button.remove());\r\n// }\r\n// });\r\n// }\r\n// }\r\n // }\r\n private addClickListenerToImages() {\r\n const editor = document.getElementById('editor');\r\n const roles = this.roleCheck(); // Get user roles dynamically\r\n const isAdmin = roles.includes('Admin');\r\n const isCreator = roles.includes('Creator');\r\n\r\n if (isCreator || isAdmin) {\r\n if (editor) {\r\n editor.addEventListener('click', (event) => {\r\n const target = event.target as HTMLElement;\r\n if (target.tagName === 'IMG') {\r\n this.selectedImage = target as HTMLImageElement;\r\n this.imageEditUrl = this.selectedImage.src;\r\n const images = editor.getElementsByTagName('img');\r\n for (let i = 0; i < images.length; i++) {\r\n if (images[i] === this.selectedImage) {\r\n this.selectedItemIndex = i;\r\n break;\r\n }\r\n }\r\n let container = this.selectedImage.parentElement;\r\n if (!container || container.className !== 'image-container') {\r\n container = document.createElement('div');\r\n container.className = 'image-container';\r\n container.style.position = 'relative';\r\n container.style.display = 'inline-block';\r\n this.selectedImage.parentNode?.insertBefore(container, this.selectedImage);\r\n container.appendChild(this.selectedImage);\r\n }\r\n\r\n const existingButton = container.querySelector('.image-edit-button');\r\n if (existingButton) {\r\n existingButton.remove();\r\n }\r\n\r\n const button = document.createElement('button');\r\n button.textContent = 'Edit Image';\r\n button.className = 'image-edit-button btn btn-sm';\r\n button.style.position = 'absolute';\r\n button.style.top = '50%';\r\n button.style.left = '50%';\r\n button.style.transform = 'translate(-50%, -50%)';\r\n button.style.zIndex = '1000';\r\n button.style.backgroundColor = '#fff';\r\n button.style.border = '2px solid #fff';\r\n button.style.color = '#313a46';\r\n button.style.cursor = 'pointer';\r\n button.style.userSelect = 'none';\r\n\r\n button.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.editImage();\r\n });\r\n\r\n container.appendChild(button);\r\n } else {\r\n this.removeEditButtons();\r\n }\r\n });\r\n\r\n // Monitor editor content changes to handle image deletion\r\n const observer = new MutationObserver(() => {\r\n const buttons = editor.querySelectorAll('.image-edit-button');\r\n buttons.forEach((button) => {\r\n const container = button.parentElement;\r\n if (container && !container.querySelector('img')) {\r\n button.remove(); // Remove the button if the associated image is gone\r\n container.remove(); // Clean up the container\r\n }\r\n });\r\n });\r\n\r\n // Observe changes in the editor\r\n observer.observe(editor, { childList: true, subtree: true });\r\n }\r\n }\r\n}\r\n\r\nprivate removeEditButtons() {\r\n const buttons = document.querySelectorAll('.image-edit-button');\r\n buttons.forEach((button) => button.remove());\r\n this.selectedImage = null;\r\n this.selectedItemIndex = null;\r\n}\r\n\r\n\r\n // private addClickListenerToImages() {\r\n // const editor = document.getElementById('editor');\r\n // if (editor) {\r\n // editor.addEventListener('click', (event) => {\r\n // const target = event.target as HTMLElement;\r\n // if (target.tagName === 'IMG') {\r\n // this.selectedImage = target as HTMLImageElement;\r\n // this.imageEditUrl = this.selectedImage.src;\r\n\r\n // // Get the index of the selected image\r\n // const images = editor.getElementsByTagName('img');\r\n // for (let i = 0; i < images.length; i++) {\r\n // if (images[i] === this.selectedImage) {\r\n // this.selectedItemIndex = i;\r\n // break;\r\n // }\r\n // }\r\n\r\n // if (this.toolbarMode === 'bubble') {\r\n // this.onTextSelect();\r\n // }\r\n // } else {\r\n // this.selectedImage = null;\r\n // this.selectedItemIndex = null;\r\n // }\r\n // });\r\n // }\r\n // }\r\n \r\n private addClickListenerToElements() {\r\n const editor = document.getElementById('editor');\r\n if (editor) {\r\n editor.addEventListener('click', (event) => {\r\n const target = event.target as HTMLElement;\r\n if (target.tagName === 'IMG') {\r\n this.selectedImage = target as HTMLImageElement;\r\n this.imageEditUrl = this.selectedImage.src;\r\n const images = editor.getElementsByTagName('img');\r\n for (let i = 0; i < images.length; i++) {\r\n if (images[i] === this.selectedImage) {\r\n this.selectedItemIndex = i;\r\n break;\r\n }\r\n }\r\n } else {\r\n this.selectedImage = null;\r\n }\r\n if (target.tagName === 'TD' || target.tagName === 'TH') {\r\n this.selectedTable = target.closest('table') as HTMLTableElement;\r\n const cells = this.selectedTable.getElementsByTagName(target.tagName);\r\n for (let i = 0; i < cells.length; i++) {\r\n if (cells[i] === target) {\r\n this.selectedItemIndex = i;\r\n break;\r\n }\r\n }\r\n } else {\r\n this.selectedTable = null;\r\n }\r\n\r\n if (target.tagName === 'P' || target.tagName === 'SPAN' || target.tagName === 'DIV') {\r\n const paragraphs = editor.getElementsByTagName(target.tagName);\r\n for (let i = 0; i < paragraphs.length; i++) {\r\n if (paragraphs[i] === target) {\r\n this.selectedItemIndex = i;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\nreplaceImageSrc(newSrc: string, index: number) {\r\n const editor = document.getElementById('editor');\r\n \r\n if (editor) {\r\n editor.focus()\r\n const images = editor.getElementsByTagName('IMG');\r\n if (index >= 0 ) {\r\n images[index].setAttribute('src', newSrc);\r\n } \r\n }\r\n}\r\n\r\n\r\n\r\n private initEditor() {\r\n // Initialize editor content and listeners\r\n const editor = document.getElementById('editor');\r\n\r\n if (editor) {\r\n editor.innerHTML = this.editorText;\r\n editor.addEventListener('input', () => {\r\n this.onModelChange(editor.innerHTML);\r\n });\r\n }\r\n this.checkPlaceholder();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n // Handle the disabled state if necessary\r\n }\r\n\r\n onModelChange(value: any): void {\r\n if (value) {\r\n const VALUE = value\r\n this.editorText = VALUE;\r\n this.onChange(VALUE);\r\n this.editorTextChange.emit(VALUE);\r\n } else {\r\n this.selectedImage = null;\r\n }\r\n }\r\n\r\n applyImageStyles(content: string): string {\r\n const div = document.createElement('div');\r\n div.innerHTML = content;\r\n const images = div.querySelectorAll('img');\r\n images.forEach(img => {\r\n if (img.style.maxWidth >= '700px') {\r\n img.style.maxWidth = '700px';\r\n // img.width = 300;\r\n img.style.height = 'auto';\r\n } else {\r\n img.style.maxWidth = '100%';\r\n img.style.height = 'auto';\r\n }\r\n });\r\n return div.innerHTML;\r\n }\r\n\r\n // init_Func(html: any) {\r\n // if (html) {\r\n // let editor = document.getElementById('editor');\r\n // if (editor) { \r\n // editor.focus()\r\n // editor.innerHTML = html;\r\n // this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n // editor.innerHTML = this.sanitizedContent as string;\r\n // editor.addEventListener('input', () => {\r\n // if (editor) {\r\n // editor.focus()\r\n // this.onModelChange(editor.innerHTML);\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n // this.selectedImage = null;\r\n // }\r\n // }\r\n \r\n// init_Func(html: any) {\r\n// if (html) {\r\n// let editor = document.getElementById('editor');\r\n// if (editor) {\r\n// // Initialize the editor with sanitized content\r\n \r\n// this.setEditorContent(html);\r\n\r\n// // Set up a MutationObserver to handle content changes\r\n// this.setupMutationObserver(editor);\r\n\r\n// // Move the caret to the end after initial content setup\r\n// this.moveCaretToEnd(editor);\r\n\r\n// // Track caret position on mouse click\r\n// editor.addEventListener('click', () => {\r\n// if (editor) { // Ensure editor is not null\r\n// // this.trackCaretPosition(editor);\r\n// }\r\n// });\r\n// }\r\n// } else {\r\n// this.selectedImage = null;\r\n// }\r\n// }\r\n\r\n// private setEditorContent(html: string) {\r\n// let editor = document.getElementById('editor');\r\n// if (editor) {\r\n// // Sanitize and apply styles to the HTML\r\n// this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n// editor.innerHTML = this.sanitizedContent as string;\r\n// }\r\n// }\r\n\r\n// private setupMutationObserver(editor: HTMLElement) {\r\n// const observer = new MutationObserver(() => {\r\n// // Update model with the current content\r\n// this.onModelChange(editor.innerHTML);\r\n// });\r\n\r\n// observer.observe(editor, { childList: true, subtree: true, characterData: true });\r\n// }\r\n\r\n// This function tracks the caret position based on the mouse click\r\nprivate trackCaretPosition(editor: HTMLElement) {\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const startNode = range.startContainer;\r\n const startOffset = range.startOffset;\r\n\r\n\r\n // You can use this information to insert content or perform actions based on the caret position\r\n // Example: Save the current caret position for future use\r\n this.currentCaretPosition = { node: startNode, offset: startOffset };\r\n }\r\n }\r\n \r\n // Method to get caret position and insert new data\r\nprivate insertAtCaret(newData: string): void {\r\n const selection = window.getSelection();\r\n \r\n if (selection && selection.rangeCount > 0) {\r\n // Get the current range (caret position)\r\n const range = selection.getRangeAt(0);\r\n\r\n // Create a document fragment to insert (allows handling HTML strings)\r\n const fragment = document.createDocumentFragment();\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = newData;\r\n\r\n // Append the new data to the fragment (supports HTML insertion)\r\n while (tempDiv.firstChild) {\r\n fragment.appendChild(tempDiv.firstChild);\r\n }\r\n\r\n // Insert the fragment at the caret position\r\n range.deleteContents(); // Remove any selected content if applicable\r\n range.insertNode(fragment);\r\n\r\n // Move the caret after the inserted content\r\n const lastChild = fragment.lastChild;\r\n\r\n if (lastChild) {\r\n range.setStartAfter(lastChild);\r\n range.setEndAfter(lastChild);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n let editor = document.getElementById('editor');\r\n if (editor) {\r\n this.moveCaretToEnd(editor)\r\n }\r\n \r\n this.placeHolderRemove.emit()\r\n }\r\n}\r\n\r\n\r\n// // Move caret to the end of the editor content\r\n// private moveCaretToEnd(editor: HTMLElement) {\r\n// const selection = window.getSelection();\r\n// const range = document.createRange();\r\n \r\n// if (editor.lastChild) {\r\n// range.selectNodeContents(editor);\r\n// range.collapse(false); // Collapse to the end\r\n// selection?.removeAllRanges();\r\n// selection?.addRange(range);\r\n \r\n// }\r\n// }\r\n \r\n \r\n\r\n\r\n init_Func(html: any) {\r\n if (html) {\r\n let editor = document.getElementById('editor');\r\n if (editor) {\r\n // Initialize the editor with sanitized content\r\n this.setEditorContent(html);\r\n\r\n // Set up a MutationObserver to handle content changes\r\n this.setupMutationObserver(editor);\r\n \r\n // Move the caret to the end after initial content setup\r\n this.moveCaretToEnd(editor);\r\n // Track caret position on mouse click\r\n editor.addEventListener('click', () => {\r\n if (editor) { // Ensure editor is not null\r\n this.trackCaretPosition(editor);\r\n }\r\n });\r\n }\r\n } else {\r\n this.selectedImage = null;\r\n }\r\n}\r\n\r\n\r\nprivate setEditorContent(html: string) {\r\n let editor = document.getElementById('editor');\r\n if (editor) {\r\n // Sanitize and apply styles to the HTML\r\n this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n editor.innerHTML = this.sanitizedContent as string;\r\n }\r\n}\r\n\r\nprivate setupMutationObserver(editor: HTMLElement) {\r\n const observer = new MutationObserver(() => {\r\n // Move the caret to the end after content changes\r\n // this.moveCaretToEnd(editor);\r\n // Update model with the current content\r\n this.onModelChange(editor.innerHTML);\r\n });\r\n\r\n observer.observe(editor, { childList: true, subtree: true, characterData: true });\r\n}\r\n\r\nprivate moveCaretToEnd(editor: HTMLElement) {\r\n const selection = window.getSelection();\r\n const range = document.createRange();\r\n \r\n if (editor.lastChild) {\r\n range.selectNodeContents(editor);\r\n range.collapse(false); // Collapse to the end\r\n selection?.removeAllRanges();\r\n selection?.addRange(range);\r\n }\r\n}\r\n\r\n// init_Func(html: any) {\r\n// if (html) {\r\n// let editor = document.getElementById('editor');\r\n// if (editor) {\r\n// editor.focus();\r\n// editor.innerHTML = html;\r\n\r\n// // Sanitize the content and apply styles\r\n// this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n// editor.innerHTML = this.sanitizedContent as string;\r\n\r\n// // Place the caret at the end of the content\r\n// const range = document.createRange();\r\n// const selection = window.getSelection();\r\n \r\n// if (editor.lastChild) {\r\n// // Set the range at the end of the editor's content\r\n// range.selectNodeContents(editor);\r\n// range.collapse(false); // collapse to the end\r\n// selection?.removeAllRanges();\r\n// selection?.addRange(range);\r\n// }\r\n\r\n// editor.addEventListener('input', () => {\r\n// if (editor) {\r\n// this.onModelChange(editor.innerHTML);\r\n\r\n// // Ensure the caret remains at the end after new content is added\r\n// const range = document.createRange();\r\n// const selection = window.getSelection();\r\n \r\n// if (editor.lastChild) {\r\n// range.selectNodeContents(editor);\r\n// range.collapse(false); // collapse to the end\r\n// selection?.removeAllRanges();\r\n// selection?.addRange(range);\r\n// }\r\n// }\r\n// });\r\n// }\r\n// } else {\r\n// this.selectedImage = null;\r\n// }\r\n// }\r\n\r\n format(command: string, value?: any) {\r\n const editor = document.getElementById('editor');\r\n if (editor) {\r\n editor.focus();\r\n if (command === 'subscript') {\r\n this.isSubscriptActive = !this.isSubscriptActive;\r\n document.execCommand('subscript', false, '');\r\n } else if (command === 'superscript') {\r\n this.isSuperscriptActive = !this.isSuperscriptActive;\r\n document.execCommand('superscript', false, '');;\r\n } else {\r\n document.execCommand(command, false, value ?? '');\r\n if (value) {\r\n const tag = value.toLowerCase().replace(/[<>]/g, '')\r\n this.selectedFormatBlock = this.formatBlockDecode(tag);\r\n }\r\n }\r\n }\r\n this.checkActiveStates();\r\n this.checkFormatBlock();\r\n }\r\n\r\n checkActiveStates() {\r\n this.isBoldActive = document.queryCommandState('bold');\r\n this.isItalicActive = document.queryCommandState('italic');\r\n this.isUnderlineActive = document.queryCommandState('underline');\r\n this.isStrikethroughActive = document.queryCommandState('strikethrough');\r\n this.isSubscriptActive = document.queryCommandState('subscript');\r\n this.isSuperscriptActive = document.queryCommandState('superscript');\r\n }\r\n\r\n checkFormatBlock() {\r\n const editor = document.getElementById('editor');\r\n if (editor) {\r\n const formatBlock = document.queryCommandValue('formatBlock');\r\n this.selectedFormatBlock = this.formatBlockDecode(formatBlock);\r\n // You can further handle the formatBlock value as needed\r\n }\r\n }\r\n\r\n formatBlockDecode(data: string): any {\r\n switch (data) {\r\n case 'h1':\r\n return 'heading 1';\r\n break;\r\n case 'h2':\r\n return 'heading 2';\r\n break;\r\n case 'h3':\r\n return 'heading 3';\r\n break;\r\n case 'h4':\r\n return 'heading 4';\r\n break;\r\n case 'h5':\r\n return 'heading 5';\r\n break;\r\n case 'h6':\r\n return 'heading 6';\r\n break;\r\n case 'p':\r\n return 'normal';\r\n break;\r\n default:\r\n return 'normal';\r\n break;\r\n }\r\n }\r\n\r\n changeFont(event: any) {\r\n this.selectedFont = event;\r\n document.execCommand('fontName', false, this.selectedFont);\r\n }\r\n\r\n insertCodeBlock() {\r\n const code = `\r\n <pre style=\"font-size: 12px;\r\n color: white;\r\n background-color: black;\r\n overflow-x: auto;\r\n margin-bottom: 5px;\r\n margin-top: 5px;\r\n padding: 5px 10px;\">\r\n <code style=\"display: block;\r\n white-space: pre-wrap;\r\n height: auto;\r\n font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;\r\n font-size: 14px;\" class=\"language-html\">Insert code here...</code>\r\n </pre>\r\n `;\r\n document.execCommand('insertHTML', false, code);\r\n }\r\n\r\n // changeFontSize(event: any) {\r\n // document.execCommand('fontSize', false, '7');\r\n // let editor = document.getElementById('editor');\r\n // if (editor) {\r\n // let fontElements = editor.getElementsByTagName('font');\r\n // for (let i = 0; i < fontElements.length; i++) {\r\n // if (fontElements[i].size == \"7\") {\r\n // fontElements[i].removeAttribute(\"size\");\r\n // fontElements[i].style.fontSize = this.selectedFontSize + 'px';\r\n // }\r\n // }\r\n // }\r\n // }\r\n changeFontSize(event: any) {\r\n const selectedText = window.getSelection();\r\n \r\n if (selectedText && selectedText.rangeCount > 0) {\r\n const range = selectedText.getRangeAt(0);\r\n const span = document.createElement('span');\r\n span.style.fontSize = this.selectedFontSize + 'px';\r\n range.surroundContents(span);\r\n }\r\n }\r\n\r\n addLink() {\r\n let url = prompt(\"Enter the link here: \", \"http://\");\r\n if (url) {\r\n document.execCommand(\"createLink\", false, url);\r\n }\r\n }\r\n\r\n insertsImage() {\r\n const editor = document.getElementById('editor');\r\n if (editor) {\r\n editor.focus();\r\n let imageInput = document.getElementById('imageInput') as HTMLInputElement;\r\n if (imageInput) {\r\n imageInput.click();\r\n }\r\n }\r\n }\r\n\r\n // handleImageUpload(event: any) {\r\n // const file = event.target.files[0];\r\n // if (file) {\r\n // const reader = new FileReader();\r\n // reader.onload = (e: any) => {\r\n // const img = new Image();\r\n // img.src = e.target.result;\r\n // img.onload = () => {\r\n // // Create the HTML string with the exact width and height\r\n // const imgHTML = `<img src=\"${img.src}\" width=\"${794}\" >`;\r\n // // Insert the image into the editor\r\n // document.execCommand('insertHTML', false, imgHTML);\r\n // };\r\n // };\r\n // reader.readAsDataURL(file);\r\n // }\r\n // }\r\n\r\n handleImageUpload(event: any) {\r\n const file = event.target.files[0];\r\n const editorElement = document.getElementById('editor'); // Reference to the editor\r\n\r\n if (file && editorElement) {\r\n const editorWidth = editorElement.offsetWidth; // Get the editor's width\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n const img = new Image();\r\n img.src = e.target.result;\r\n\r\n img.onload = () => {\r\n const imgWidth = img.width;\r\n\r\n // If the image width exceeds the editor's width, fit it to the editor\r\n const imgHTML =\r\n imgWidth > editorWidth\r\n ? `<img src=\"${img.src}\" style=\" max-width: ${700}px; height: auto;\">`\r\n : `<img src=\"${img.src}\" style=\"width: ${imgWidth}px; height: auto;\">`;\r\n this.newImageAdded.emit()\r\n // Insert the image into the editor\r\n document.execCommand('insertHTML', false, imgHTML);\r\n };\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n }\r\n}\r\n\r\n\r\n\r\n // addTable() {\r\n // const tableWidth = 825; // Table width in pixels\r\n // const cols = 3; // Number of columns\r\n // const cellMinWidth = tableWidth / cols; // Calculate minimum width for each cell\r\n\r\n // let table = `<br /><table style=\"width: ${tableWidth}px;\">`;\r\n // for (let i = 0; i < 3; i++) { // Number of rows\r\n // table += '<tr >';\r\n // for (let j = 0; j < cols; j++) {\r\n // table += `<td style=\" word-wrap: break-word; word-break: break-all; white-space: normal; min-width: ${cellMinWidth}px;\"> </td>`;\r\n // }\r\n // table += '</tr>';\r\n // }\r\n // table += '</table><br/ >';\r\n // // document.execCommand('insertHTML', false, table);\r\n // const editor = document.getElementById('editor');\r\n // if (editor) {\r\n // editor.focus();\r\n // document.execCommand('insertHTML', false, table);\r\n // }\r\n // this.tableAdded = true;\r\n // this.checkTableSelection();\r\n // }\r\n\r\n\r\n handleTabKey(event: any) {\r\n if (event.key === \"Tab\") {\r\n event.preventDefault(); // Stop default tabbing behavior\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n const tabNode = document.createElement(\"span\"); // Create a span element for the tab space\r\n tabNode.innerHTML = \" \"; // Four non-breaking spaces to mimic tab\r\n \r\n range.deleteContents(); // Remove any selected text\r\n range.insertNode(tabNode); // Insert the tab space as span\r\n range.setStartAfter(tabNode); // Move cursor after the inserted span\r\n range.setEndAfter(tabNode);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n \r\n// addTable() {\r\n// const tableWidth = 825; // Table width in pixels\r\n// const cols = 3; // Number of columns\r\n// const cellMinWidth = tableWidth / cols; // Calculate minimum width for each cell\r\n\r\n// let table = `<br /><table style=\"width: ${tableWidth}px;\">`;\r\n// for (let i = 0; i < 3; i++) { // Number of rows\r\n// table += `<tr style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()}\">`; // Add border-bottom to the row\r\n// for (let j = 0; j < cols; j++) {\r\n// table += `<td style=\"word-wrap: break-word; word-break: break-all; white-space: normal; min-width: ${cellMinWidth}px;\"> </td>`;\r\n// }\r\n// table += '</tr>';\r\n// }\r\n// table += '</table><br/>';\r\n\r\n// const editor = document.getElementById('editor');\r\n// if (editor) {\r\n// editor.focus();\r\n// document.execCommand('insertHTML', false, table);\r\n// }\r\n\r\n// this.tableAdded = true;\r\n// this.checkTableSelection();\r\n// }\r\naddTable() {\r\n const tableWidth = 825;\r\n const cols = 3;\r\n const cellMinWidth = tableWidth / cols;\r\n\r\n let table = `<br /><table id=\"customTable\" style=\"width: ${tableWidth}px; border-collapse: collapse;\">`;\r\n\r\n table += `<tbody>`;\r\n table += `<tr id=\"tableHeaderRow\" style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()};\" (click)=\"checkTableSelection()\">`;\r\n for (let j = 0; j < cols; j++) {\r\n table += `<td class=\"header-cell\" \r\n style=\"border-top: 2px solid black; \r\n font-weight: bold; \r\n text-align: start; \r\n word-wrap: break-word; \r\n word-break: break-all; \r\n white-space: normal; \r\n min-width: ${cellMinWidth}px; \r\n background-color: inherit !important; \r\n // pointer-events: none !important;\r\n display: table-cell !important;\r\n position: static !important;\r\nheight:28px;\"></td>`;\r\n }\r\n table += `</tr>`;\r\n\r\n for (let i = 0; i < 3; i++) {\r\n table += `<tr style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()}\">`;\r\n for (let j = 0; j < cols; j++) {\r\n table += `<td style=\"word-wrap: break-word; \r\n word-break: break-all; \r\n white-space: normal; \r\n min-width: ${cellMinWidth}px;\r\n display: table-cell !important;\r\n position: static !important;\"> </td>`;\r\n }\r\n table += \"</tr>\";\r\n }\r\n table += `</tbody></table><br/>`;\r\n\r\n const editor = document.getElementById(\"editor\");\r\n if (editor) {\r\n editor.focus();\r\n document.execCommand(\"insertHTML\", false, table);\r\n }\r\n\r\n this.tableAdded = true;\r\n this.checkTableSelection();\r\n\r\n // Add styles to prevent table structure breaking\r\n const style = document.createElement(\"style\");\r\n style.innerHTML = `\r\n #customTable {\r\n table-layout: fixed !important;\r\n border-collapse: collapse !important;\r\n }\r\n #customTable tr {\r\n display: table-row !important;\r\n }\r\n #customTable td {\r\n display: table-cell !important;\r\n position: static !important;\r\n }\r\n #customTable .header-cell {\r\n position: static !important;\r\n }\r\n #customTable .header-cell > span {\r\n display: inline !important;\r\n position: static !important;\r\n }\r\n #customTable .header-cell:hover {\r\n cursor: default !important;\r\n }\r\n`;\r\n document.head.appendChild(style);\r\n}\r\n// Function to change the first row (thead) background color\r\nsetTheadBgColor(event: any) {\r\n const selectedColor = event.target.value;\r\n\r\n if (this.selectedTable) {\r\n const headerRow = this.selectedTable.querySelector(\"tr\") as HTMLElement;\r\n\r\n if (headerRow) {\r\n const headerCells = headerRow.querySelectorAll(\".header-cell\");\r\n headerCells.forEach((cell: Element) => {\r\n (cell as HTMLElement).style.backgroundColor = selectedColor;\r\n });\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n checkTableSelection(event?: MouseEvent) {\r\n let target = event?.target as HTMLElement;\r\n if (target && (target.tagName === 'TD' || target.tagName === 'TH')) {\r\n this.isTableSelected = true;\r\n this.selectedTable = target.closest('table') as HTMLTableElement;\r\n } else {\r\n this.isTableSelected = false;\r\n this.selectedTable = null;\r\n }\r\n \r\n // this.checkPlaceholder();\r\n }\r\n\r\n checkPlaceholder() {\r\n // let editor = document.getElementById('editor');\r\n // if (editor) {\r\n // this.isPlaceholderVisible = editor.innerHTML === '' || editor.innerHTML === '<br>';\r\n // if (this.isPlaceholderVisible) {\r\n // // editor.innerHTML = '<span class=\"placeholder\" style=\"background: transparent; color: #000000\">Insert text here ...</span>';\r\n // } else {\r\n // let placeholder = editor.querySelector('.placeholder');\r\n // if (placeholder) {\r\n // editor.removeChild(placeholder);\r\n // }\r\n // }\r\n // }\r\n }\r\n\r\n onFocus() {\r\n // let editor = document.getElementById('editor');\r\n // if (editor && this.isPlaceholderVisible) {\r\n // editor.innerHTML = '';\r\n // this.isPlaceholderVisible = false;\r\n // }\r\n }\r\n\r\n // colorChange(newColor: string) {\r\n // this.color = newColor;\r\n // }\r\n\r\n onBlur() {\r\n this.checkPlaceholder();\r\n }\r\n\r\n // addRow() {\r\n // if (this.selectedTable) {\r\n // let row = this.selectedTable.insertRow();\r\n // for (let i = 0; i < this.selectedTable.rows[0].cells.length; i++) {\r\n // let cell = row.insertCell(i);\r\n // cell.innerHTML = ' ';\r\n // cell.style.border = '1px solid black';\r\n // }\r\n // }\r\n // }\r\n\r\n addRow() {\r\n if (this.selectedTable) {\r\n let row = this.selectedTable.insertRow();\r\n\r\n // Loop through the columns of the first row to determine the number of cells\r\n for (let i = 0; i < this.selectedTable.rows[0].cells.length; i++) {\r\n let cell = row.insertCell(i);\r\n cell.innerHTML = ' ';\r\n\r\n // Apply bottom border explicitly\r\n cell.style.borderBottom = `2px solid ${this.themeModeClrVerticalLineColorForTable()}`; // You can replace 'black' with your theme color\r\n }\r\n }\r\n}\r\n\r\n// addRow() {\r\n// if (this.selectedTable) {\r\n// let row = this.selectedTable.insertRow();\r\n// row.style.borderBottom = this.themeModeClrVerticalLineForTable(); // Add bottom border to the row\r\n// for (let i = 0; i < this.selectedTable.rows[0].cells.length; i++) {\r\n// let cell = row.insertCell(i);\r\n// cell.innerHTML = ' ';\r\n// }\r\n// }\r\n// }\r\n\r\n\r\n // deleteRow() {\r\n // if (this.selectedTable) {\r\n // this.selectedTable.deleteRow(-1);\r\n // }\r\n // }\r\n\r\n// deleteRow() {\r\n// if (this.selectedTable) {\r\n// let rowIndex = this.selectedTable.rows.length - 1; \r\n// if (window.getSelection) {\r\n// let selection = window.getSelection();\r\n// if (selection) {\r\n// let row = selection.anchorNode?.parentElement?.closest('tr');\r\n// if (row) {\r\n// rowIndex = row.rowIndex;\r\n// }\r\n// }\r\n// }\r\n// this.selectedTable.deleteRow(rowIndex);\r\n// }\r\n// }\r\n\r\n deleteRow() {\r\n const selection = window.getSelection();\r\n if (selection) {\r\n if (!selection.rangeCount) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n const selectedNode = range.startContainer;\r\n const row = selectedNode.parentElement?.closest('tr');\r\n\r\n if (row) {\r\n const table = row.closest('table');\r\n if (table) {\r\n table.deleteRow(row.rowIndex);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n // addColumn() {\r\n // if (this.selectedTable) {\r\n // for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n // let cell = this.selectedTable.rows[i].insertCell(-1);\r\n // cell.innerHTML = ' ';\r\n // cell.style.border = '1px solid black';\r\n // }\r\n // }\r\n // }\r\n\r\n// addColumn() {\r\n// if (this.selectedTable) {\r\n// const columnCount = this.selectedTable.rows[0].cells.length + 1; // New column count\r\n// const tableWidth = this.selectedTable.offsetWidth;\r\n// const minWidth = tableWidth / columnCount;\r\n\r\n// for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n// let cell = this.selectedTable.rows[i].insertCell(-1);\r\n// cell.innerHTML = ' ';\r\n// cell.style.border = '1px solid black';\r\n// cell.style.minWidth = `${minWidth}px`;\r\n// cell.style.wordWrap = 'break-word';\r\n// cell.style.wordBreak = 'break-all';\r\n// cell.style.whiteSpace = 'normal';\r\n// }\r\n\r\n// // Update existing cells' minWidth\r\n// for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n// for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n// this.selectedTable.rows[i].cells[j].style.minWidth = `${minWidth}px`;\r\n// }\r\n// }\r\n// }\r\n // }\r\n \r\n addColumn() {\r\n if (this.selectedTable) {\r\n const columnCount = this.selectedTable.rows[0].cells.length + 1; // New column count\r\n const tableWidth = this.selectedTable.offsetWidth;\r\n const minWidth = tableWidth / columnCount;\r\n\r\n for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n let cell = this.selectedTable.rows[i].insertCell(-1);\r\n cell.innerHTML = ' ';\r\n cell.style.wordWrap = 'break-word';\r\n cell.style.wordBreak = 'break-all';\r\n cell.style.whiteSpace = 'normal';\r\n cell.style.minWidth = `${minWidth}px`;\r\n cell.style.borderBottom = `2px solid ${this.themeModeClrVerticalLineColorForTable()}`\r\n }\r\n\r\n // Update existing rows' bottom border\r\n for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n this.selectedTable.rows[i].style.borderBottom = this.themeModeClrVerticalLineForTable();\r\n }\r\n }\r\n }\r\n \r\n\r\n\r\n\r\n\r\n deleteColumn() {\r\n if (this.selectedTable) {\r\n if (window.getSelection) {\r\n let selection = window.getSelection();\r\n if (selection) {\r\n let cell = selection.anchorNode?.parentElement?.closest('td, th') as HTMLTableCellElement;\r\n if (cell) {\r\n let cellIndex = cell.cellIndex;\r\n for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n this.selectedTable.rows[i].deleteCell(cellIndex);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n themeModeClrVerticalLineForTable() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '2px solid #414141 !important'\r\n } else {\r\n return '2px solid #5F5F5F !important'\r\n }\r\n }\r\n\r\n themeModeClrVerticalLineColorForTable() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '#414141'\r\n } else {\r\n return '#5F5F5F'\r\n }\r\n }\r\n\r\n adjustTableWidth(event: any) {\r\n if (this.selectedTable) {\r\n this.selectedTable.style.width = event.target.value + 'px';\r\n }\r\n }\r\n\r\n adjustCellWidth(event: any) {\r\n if (this.selectedTable) {\r\n for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n this.selectedTable.rows[i].cells[j].style.width = event.target.value + 'px';\r\n }\r\n }\r\n }\r\n }\r\n\r\n adjustCellHeight(event: any) {\r\n if (this.selectedTable) {\r\n for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n this.selectedTable.rows[i].cells[j].style.height = event.target.value + 'px';\r\n }\r\n }\r\n }\r\n }\r\n\r\n private setCaretToEnd(element: HTMLElement) {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n if (sel) {\r\n range.selectNodeContents(element);\r\n range.collapse(false);\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n }\r\n }\r\n\r\n // openColorPicker(inputId: string) {\r\n // const inputElement = document.getElementById(inputId);\r\n // if (inputElement) {\r\n // inputElement.click();\r\n // }\r\n // }\r\n\r\n // setTextColor(event: any) {\r\n // const editor = document.getElementById('editor');\r\n // if (editor) {\r\n // editor.focus();\r\n // const color = event.target.value;\r\n // this.selectedTextColor = color;\r\n // document.execCommand('foreColor', false, color);\r\n // }\r\n // }\r\n\r\n // setBackgroundColor(event: any) {\r\n // const editor = document.getElementById('editor');\r\n // if (editor) {\r\n // editor.focus();\r\n // const color = event.target.value;\r\n // this.backgroundColor = color;\r\n // document.execCommand('hiliteColor', false, color);\r\n // }\r\n // }\r\n\r\n private savedSelection: Range | null = null;\r\n\r\nopenColorPicker(inputId: string) {\r\n const inputElement = document.getElementById(inputId) as HTMLInputElement;\r\n if (inputElement) {\r\n // Save the current selection\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n this.savedSelection = selection.getRangeAt(0);\r\n }\r\n inputElement.click();\r\n }\r\n}\r\n\r\n// setTextColor(event: any) {\r\n// if (this.savedSelection) {\r\n// const color = event.target.value;\r\n// this.selectedTextColor = color;\r\n\r\n// // Restore the saved selection\r\n// const selection = window.getSelection();\r\n// if (selection) {\r\n// selection.removeAllRanges();\r\n// selection.addRange(this.savedSelection);\r\n\r\n// // Apply the color using a span\r\n// const range = this.savedSelection;\r\n// const span = document.createElement('span');\r\n// span.style.color = color;\r\n// span.textContent = range.toString();\r\n\r\n// // Replace the selected text with the styled span\r\n// range.deleteContents();\r\n// range.insertNode(span);\r\n\r\n// // Clear the saved selection\r\n// this.savedSelection = null;\r\n// }\r\n// }\r\n // }\r\n// setTextColor(event: any) {\r\n// if (this.savedSelection) {\r\n// const color = event.target.value;\r\n// this.selectedTextColor = color;\r\n\r\n// // Restore the saved selection\r\n// const selection = window.getSelection();\r\n// if (selection && selection.rangeCount > 0) {\r\n// const range = this.savedSelection;\r\n// selection.removeAllRanges();\r\n// selection.addRange(range);\r\n\r\n// // Get selected elements\r\n// const selectedContent = range.cloneContents();\r\n// const elements = Array.from(selectedContent.querySelectorAll(\"*\")) as HTMLElement[]; // ✅ Explicitly cast to HTMLElement[]\r\n\r\n// // Apply color to each element without modifying structure\r\n// elements.forEach((el) => {\r\n// el.style.color = color;\r\n// });\r\n\r\n// // Apply color to the top-level text nodes (without wrapping them)\r\n// Array.from(selectedContent.childNodes).forEach((node) => {\r\n// if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim() !== \"\") {\r\n// const parent = range.commonAncestorContainer.parentElement;\r\n// if (parent) {\r\n// parent.style.color = color;\r\n// }\r\n// }\r\n// });\r\n\r\n// // Replace selected content\r\n// range.deleteContents();\r\n// range.insertNode(selectedContent);\r\n\r\n// // Clear saved selection\r\n// this.savedSelection = null;\r\n// }\r\n// }\r\n// }\r\n\r\nsetTextColor(event: any) {\r\n console.log(\"Clicked setTextColor\");\r\n if (!this.savedSelection) {\r\n console.warn(\"No saved selection available!\");\r\n return;\r\n }\r\n\r\n const color = event.target.value;\r\n this.selectedTextColor = color;\r\n const selection = window.getSelection();\r\n\r\n if (!selection || selection.rangeCount === 0) {\r\n console.error(\"No valid selection found!\");\r\n return;\r\n }\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(this.savedSelection);\r\n const range = this.savedSelection;\r\n\r\n const getTableCell = (node: Node | null): HTMLElement | null => {\r\n let currentNode = node;\r\n if (currentNode && currentNode.nodeType === Node.TEXT_NODE) {\r\n currentNode = currentNode.parentNode;\r\n }\r\n\r\n while (currentNode && currentNode instanceof HTMLElement) {\r\n if (currentNode.tagName === \"TD\" || currentNode.tagName === \"TH\") {\r\n return currentNode;\r\n }\r\n currentNode = currentNode.parentElement;\r\n }\r\n return null;\r\n };\r\n\r\n const tableCell =\r\n getTableCell(range.commonAncestorContainer) ||\r\n getTableCell(range.startContainer) ||\r\n getTableCell(range.endContainer);\r\n\r\n if (tableCell) {\r\n console.log(`Processing ${tableCell.tagName} element`);\r\n const selectedText = selection.toString();\r\n\r\n if (selectedText) {\r\n console.log(`Selected text in ${tableCell.tagName}:`, selectedText);\r\n const textNodes: Text[] = [];\r\n const walker = document.createTreeWalker(\r\n tableCell,\r\n NodeFilter.SHOW_TEXT,\r\n null\r\n );\r\n let node: Text | null;\r\n\r\n while ((node = walker.nextNode() as Text | null)) {\r\n textNodes.push(node);\r\n }\r\n\r\n for (const textNode of textNodes) {\r\n const text = textNode.textContent || \"\";\r\n const index = text.indexOf(selectedText);\r\n\r\n if (index !== -1) {\r\n console.log(\r\n `Found selected text in ${tableCell.tagName} text node`\r\n );\r\n\r\n const span = document.createElement(\"span\");\r\n span.style.color = color;\r\n span.textContent = selectedText;\r\n\r\n const beforeText = text.slice(0, index);\r\n const afterText = text.slice(index + selectedText.length);\r\n\r\n const fragment = document.createDocumentFragment();\r\n if (beforeText)\r\n fragment.appendChild(document.createTextNode(beforeText));\r\n fragment.appendChild(span);\r\n if (afterText)\r\n fragment.appendChild(document.createTextNode(afterText));\r\n\r\n textNode.replaceWith(fragment);\r\n break; // Apply only once per selection\r\n }\r\n }\r\n }\r\n } else {\r\n console.log(\"No TH or TD element found in selection\");\r\n return;\r\n }\r\n\r\n this.savedSelection = null;\r\n}\r\n\r\n setBackgroundColor(event: any) {\r\n if (this.savedSelection) {\r\n const color = event.target.value;\r\n this.backgroundColor = color;\r\n\r\n // Restore the saved selection\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(this.savedSelection);\r\n\r\n // Apply the background color using a span\r\n const range = this.savedSelection;\r\n const span = document.createElement('span');\r\n span.style.backgroundColor = color;\r\n span.textContent = range.toString();\r\n\r\n // Replace the selected text with the styled span\r\n range.deleteContents();\r\n range.insertNode(span);\r\n\r\n // Clear the saved selection\r\n this.savedSelection = null;\r\n }\r\n }\r\n }\r\n \r\n // colorChanged(event: any) {\r\n // this.color = event.color.hex; \r\n // }\r\n\r\n public logEvent(event: any, trigger: any) {\r\n const color = event;\r\n this.setTextColor(color)\r\n this.selectedTextColor = event\r\n document.execCommand('foreColor', false, event);\r\n // this.logs.unshift([this.logs.length + 1, trigger, event]);\r\n }\r\n \r\n\r\n editImage() {\r\n let data \r\n switch (this.editorFrom.name) {\r\n case 'section-content':\r\n data = { editIMG: true, from: 'htmlEditor', index: this.selectedItemIndex, id: this.editorFrom.id };\r\n const compressedData: string = compress(JSON.stringify(this.imageEditUrl));\r\n sessionStorage.setItem('editImageFromTemp', compressedData);\r\n const compressedData2 = compress(JSON.stringify(this.sanitizedContent));\r\n sessionStorage.setItem('textEditor', compressedData2);\r\n // alert('go to editor!')\r\n this.navigateToIMGEditor(data);\r\n this.imageEdit.emit()\r\n break;\r\n case 'create-document':\r\n this.imageEdit.emit()\r\n data = { editIMG: true, from: 'createDocument', index: this.selectedItemIndex, id: this.editorFrom.id, section: this.editorFrom.section, reportSectionId: this.editorFrom.reportSectionId };\r\n // this.openDialog(data)\r\n const compressedData3 = compress(JSON.stringify(this.imageEditUrl));\r\n const compressedData4 = compress(this.editorText);\r\n\r\n sessionStorage.setItem('editImageFromTemp2', compressedData3);\r\n sessionStorage.setItem('textEditor2', compressedData4);\r\n this.navigateToIMGEditor(data);\r\n break;\r\n default:\r\n null\r\n // sessionStorage.removeItem('editImageFromTemp');\r\n // sessionStorage.removeItem('editImageFromTemp2');\r\n // sessionStorage.removeItem('templateEditor');\r\n // sessionStorage.removeItem('textEditor');\r\n break;\r\n }\r\n // if (this.editorFrom === 'section-content') {\r\n // const data = {editIMG: true, from: 'htmlEditor', index: this.selectedItemIndex}\r\n // this.navigateToIMGEditor(data)\r\n // sessionStorage.setItem('editImageFromTemp', JSON.stringify(this.imageEditUrl))\r\n // sessionStorage.setItem('textEditor', this.editorText)\r\n // } \r\n \r\n }\r\n\r\n openDialog( item: any): void {\r\n // let data: any;\r\n // data = item\r\n // const dialogRef = this.dialog.open(ImageEditorModalComponent,{\r\n // minWidth: '100%', minHeight: '100vh', panelClass: 'theme-2B2936' ,disableClose: true, data: data\r\n // });\r\n // dialogRef.afterClosed().subscribe(result => {\r\n // console.log('result ===> img = ', result)\r\n // const imgUrl = sessionStorage.getItem('editImageFromTemp2');\r\n // if (imgUrl) {\r\n // this.replaceImageSrc(imgUrl, result.index.index);\r\n // sessionStorage.removeItem('editImageFromTemp2');\r\n // }\r\n // });\r\n }\r\n\r\n replaceImageSRC(newSrc: string, index: number) {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(this.editorText, 'text/html');\r\n const imgTags = doc.getElementsByTagName('img');\r\n\r\n if (imgTags && imgTags.length > 0) {\r\n if (index >= 0 && index < imgTags.length) {\r\n // Update the src attribute of the img at the specified index\r\n \r\n imgTags[index].setAttribute('src', newSrc);\r\n this.editorText = doc.body.innerHTML;\r\n \r\n } \r\n } \r\n }\r\n\r\n navigateToIMGEditor(data: any) {\r\n this.router.navigate(['/admin/image-editor'], { queryParams: {data : JSON.stringify(data)} })\r\n }\r\n\r\n // onTextSelect(event: MouseEvent): void {\r\n // if (this.toolbarMode === 'bubble') {\r\n // const selection = window.getSelection();\r\n // if (selection && selection.rangeCount > 0) {\r\n // const range = selection.getRangeAt(0);\r\n // if (!range.collapsed) {\r\n // const rect = range.getBoundingClientRect();\r\n // this.toolbarTop = rect.bottom + window.scrollY + 10;\r\n // this.toolbarLeft = rect.left + window.scrollX + (rect.width / 2) - 50;\r\n // this.showToolbar = true;\r\n // } else {\r\n // this.showToolbar = false;\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n onTextSelect(event?: MouseEvent): void {\r\n if (this.toolbarMode === 'bubble') {\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n if (!range.collapsed) {\r\n const rect = range.getBoundingClientRect();\r\n const scrollY = document.documentElement.scrollTop;\r\n const scrollX = document.documentElement.scrollLeft;\r\n this.toolbarTop = rect.top + scrollY - 75;\r\n this.toolbarLeft = rect.left + scrollX + (rect.width / 2) - 325;\r\n this.showToolbar = true;\r\n } else {\r\n this.showToolbar = false;\r\n }\r\n } else {\r\n this.showToolbar = false;\r\n }\r\n }\r\n}\r\n\r\n\r\n// onPaste(event: ClipboardEvent) {\r\n// event.preventDefault();\r\n// const clipboardData = event.clipboardData;\r\n// if (clipboardData) {\r\n// const pastedText = clipboardData.getData('text/plain');\r\n// if (this.isTableData(pastedText)) {\r\n// const html = this.convertTextToTable(pastedText);\r\n// this.insertHtmlAtCaret(html);\r\n// } else {\r\n// this.insertHtmlAtCaret(pastedText);\r\n// }\r\n// }\r\n// }\r\n\r\n // onPaste(event: ClipboardEvent) {\r\n // event.preventDefault();\r\n // const clipboardData = event.clipboardData;\r\n // if (clipboardData) {\r\n // // Handle image data\r\n // const items = clipboardData.items;\r\n // for (let i = 0; i < items.length; i++) {\r\n // if (items[i].type.startsWith('image/')) {\r\n // const file = items[i].getAsFile();\r\n // if (file) {\r\n // const reader = new FileReader();\r\n // reader.onload = (e: any) => {\r\n // const imgHtml = `<img src=\"${e.target.result}\" alt=\"Pasted Image\" style=\"max-width: 100%;\"/>`;\r\n // this.insertHtmlAtCaret(imgHtml);\r\n // };\r\n // reader.readAsDataURL(file);\r\n // return; // Exit if an image is handled\r\n // }\r\n // }\r\n // }\r\n\r\n // // Handle text or table data\r\n // const pastedText = clipboardData.getData('text/plain');\r\n // if (this.isTableData(pastedText)) {\r\n // const html = this.convertTextToTable(pastedText);\r\n // this.insertHtmlAtCaret(html);\r\n // } else {\r\n // this.insertHtmlAtCaret(pastedText);\r\n // }\r\n // }\r\n // }\r\n\r\n onPaste(event: ClipboardEvent) {\r\n event.preventDefault();\r\n const clipboardData = event.clipboardData;\r\n if (clipboardData) {\r\n for (let i = 0; i < clipboardData.items.length; i++) {\r\n const item = clipboardData.items[i];\r\n\r\n if (item.type.startsWith(\"image/\")) {\r\n // Handle image paste\r\n const file = item.getAsFile();\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imgHtml = `<img src=\"${e.target.result}\" alt=\"Pasted Image\" style=\"max-width: 100%;\" />`;\r\n this.insertHtmlAtCaret(imgHtml);\r\n };\r\n reader.readAsDataURL(file);\r\n return;\r\n }\r\n } else if (item.type === \"text/html\") {\r\n // Handle HTML paste\r\n // const htmlData = clipboardData.getData(\"text/html\");\r\n if (this.isTableData(clipboardData.getData('text/html'))) {\r\n const html = this.convertTextToTable(clipboardData.getData('text/html'));\r\n this.insertHtmlAtCaret(html);\r\n } else {\r\n this.insertHtmlAtCaret(clipboardData.getData('text/html'));\r\n }\r\n // this.insertHtmlAtCaret(htmlData);\r\n return;\r\n } else if (item.type === \"text/plain\") {\r\n // Handle plain text paste\r\n if (this.isTableData(clipboardData.getData('text/plain'))) {\r\n const html = this.convertTextToTable(clipboardData.getData('text/plain'));\r\n this.insertHtmlAtCaret(html);\r\n } else {\r\n this.insertHtmlAtCaret(clipboardData.getData('text/plain'));\r\n }\r\n // const plainText = clipboardData.getData(\"text/plain\");\r\n // this.insertHtmlAtCaret(plainText);\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n isExcelData(html: string): boolean {\r\n return html.includes('xmlns:o=\"urn:schemas-microsoft-com:office:office\"') || \r\n html.includes('xmlns:x=\"urn:schemas-microsoft-com:office:excel\"');\r\n }\r\n\r\n convertExcelHtmlToTable(html: string): string {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(html, 'text/html');\r\n const table = doc.querySelector('table');\r\n return table ? table.outerHTML : ''; // Extract only the table part\r\n }\r\n\r\n\r\n\r\n\r\n isTableData(text: string): boolean {\r\n const rows = text.split('\\n');\r\n return rows.length > 1 && rows[0].split('\\t').length > 1;\r\n }\r\n\r\n // convertTextToTable(text: string): string {\r\n // const rows = text.split('\\n').filter(row => row.trim() !== '');\r\n // const tableRows = rows.map(row => {\r\n // const cells = row.split('\\t').map(cell => `<td class=\"px-1 py-1\" >${cell}</td>`).join('');\r\n // return `<tr class=\"table-border-top\" style=\"border-top: ${this.themeModeTableBorderTop()}; width: 100% !important\">${cells}</tr>`;\r\n // }).join('');\r\n // return `<table>${tableRows}</table>`;\r\n // }\r\n\r\n convertTextToTable(text: string): string {\r\n const rows = text.split('\\n').filter(row => row.trim() !== '');\r\n const columnCount = rows[0]?.split('\\t').length || 1; // Get the number of columns from the first row\r\n const columnWidth = 100 / columnCount; // Calculate column width\r\n\r\n const tableRows = rows.map((row, index) => {\r\n const cells = row.split('\\t').map(cell => `\r\n <td class=\"px-1 py-1 text-truncate\" \r\n style=\"max-width: ${columnWidth}%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">\r\n ${cell}\r\n </td>`).join('');\r\n\r\n // Add a border-top for all rows except the first and border-bottom for the last row\r\n const borderTop = index === 0 ? '' : `border-top: ${this.themeModeTableBorderTop()};`;\r\n const borderBottom = index === rows.length - 1 ? `border-bottom: ${this.themeModeTableBorderTop()};` : '';\r\n\r\n return `\r\n <tr \r\n style=\"${borderTop} ${borderBottom} width: 100% !important;\">\r\n ${cells}\r\n </tr>`;\r\n }).join('');\r\n\r\n return `\r\n <table style=\"table-layout: fixed; width: 100%;\"> \r\n ${tableRows}\r\n </table>`;\r\n }\r\n\r\n\r\n\r\n insertHtmlAtCaret(html: string) {\r\n const range = window.getSelection()?.getRangeAt(0);\r\n if (range) {\r\n range.deleteContents();\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = html;\r\n const frag = document.createDocumentFragment();\r\n let node;\r\n while ((node = tempDiv.firstChild)) {\r\n frag.appendChild(node);\r\n }\r\n range.insertNode(frag);\r\n range.collapse(false);\r\n }\r\n }\r\n\r\n themeModeTableBorderTop() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '1px solid #D0D0D0; !important'\r\n } else {\r\n return '1px solid #414141 !important'\r\n }\r\n }\r\n\r\n \r\n public openFullscreen() {\r\n var elem: any = document.getElementById(\"textEditor\");\r\n this.isFullScreen = true;\r\n if (elem.requestFullscreen) {\r\n elem.requestFullscreen();\r\n } else if (elem.mozRequestFullScreen) {\r\n elem.mozRequestFullScreen();\r\n } else if (elem.webkitRequestFullscreen) {\r\n elem.webkitRequestFullscreen();\r\n } else if (elem.msRequestFullscreen) {\r\n elem.msRequestFullscreen();\r\n }\r\n this.style = {\r\n 'min-height': '90vh',\r\n 'max-height': '90vh',\r\n }\r\n }\r\n\r\n public closeFullscreen() {\r\n if (document.exitFullscreen) {\r\n document.exitFullscreen();\r\n this.isFullScreen = false;\r\n this.style = {\r\n 'min-height': '400px',\r\n 'max-height': '400px',\r\n }\r\n }\r\n }\r\n \r\n clearTextEditor() {\r\n this.editorTextClear.emit()\r\n }\r\n\r\n setupHistory() {\r\n this.saveState();\r\n const editor = document.getElementById('editor');\r\n \r\n if (editor) {\r\n editor.addEventListener('input', () => this.onInput());\r\n }\r\n }\r\n\r\n onInput() {\r\n this.saveState();\r\n }\r\n\r\n saveState() {\r\n const editor = document.getElementById('editor');\r\n \r\n if (editor) {\r\n const editorContent = editor.innerHTML;\r\n if (this.historyIndex === this.history.length - 1) {\r\n this.history.push(editorContent);\r\n this.redoStack = [];\r\n } else {\r\n this.history = this.history.slice(0, this.historyIndex + 1);\r\n this.history.push(editorContent);\r\n this.redoStack = [];\r\n }\r\n this.historyIndex++;\r\n }\r\n }\r\n undo() {\r\n if (this.historyIndex > 0) {\r\n this.redoStack.push(this.history[this.historyIndex]);\r\n this.historyIndex--;\r\n const editor = document.getElementById('editor');\r\n \r\n if (editor) {\r\n this.sanitizedContent = this.history[this.historyIndex];\r\n }\r\n }\r\n }\r\n\r\n redo() {\r\n if (this.redoStack.length > 0) {\r\n const redoContent = this.redoStack.pop();\r\n this.history.push(redoContent!);\r\n this.historyIndex++;\r\n const editor = document.getElementById('editor');\r\n \r\n if (editor) {\r\n this.sanitizedContent = redoContent!;\r\n }\r\n }\r\n }\r\n\r\n// formatTextWithDates(text: string): string {\r\n// // Regular expression to detect YYYY-MM-DD formatted dates\r\n// const dateRegex = /\\b\\d{4}-\\d{2}-\\d{2}\\b/g;\r\n\r\n// // Replace found dates with a formatted version\r\n// return text.replace(dateRegex, (dateStr) => {\r\n// // Convert the detected date string into a Date object\r\n// const dateObj = new Date(dateStr);\r\n \r\n// // Format the date to 'Month Day, Year' (e.g., October 10, 2024)\r\n// return dateObj.toLocaleDateString('en-US', {\r\n// year: 'numeric',\r\n// month: 'long',\r\n// day: 'numeric',\r\n// });\r\n// });\r\n // }\r\n \r\n formatTextWithDates(text: string): string {\r\n // Regular expression to detect YYYY-MM-DD formatted dates\r\n const dateRegex = /\\b\\d{4}-\\d{2}-\\d{2}\\b/g;\r\n\r\n // Replace found dates with a formatted version\r\n return text.replace(dateRegex, (dateStr) => {\r\n // Convert the detected date string into a Date object\r\n const dateObj = new Date(dateStr);\r\n\r\n // Extract day, month, and year\r\n const day = dateObj.getDate().toString().padStart(2, '0'); // Ensure day is two digits\r\n const month = dateObj.toLocaleString('en-US', { month: 'short' }); // Get abbreviated month name\r\n const year = dateObj.getFullYear(); // Get full year\r\n\r\n // Format the date as 'dd/mmm/yyyy'\r\n return `${day}/${month}/${year}`;\r\n });\r\n}\r\n\r\n\r\n}","<div class=\"container els-text-editor px-0\" id=\"textEditor\" #fullscreen=\"ngxFullscreen\"\r\n #textEditor\r\n ngxFullscreen>\r\n <div *ngIf=\"toolbarMode === 'fixed'\" class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\" role=\"toolbar\" [style.background]=\"themeModeBgClr()\"\r\n [ngStyle]=\"{\r\n 'pointer-events': disableToolbar ? 'none' : 'auto',\r\n 'border-top-left-radius': IsOpen ? '0' : '20px',\r\n 'border-top-right-radius': IsOpen ? '0' : '20px'\r\n}\"\r\naria-label=\"Toolbar with button groups\"\r\nstyle=\"border-top-left-radius: 20px !important; border-top-right-radius: 20px !important;\"\r\n>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\" [style.border-radius]=\"'5px'\"\r\n id=\"headerDropdown\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\" ngbDropdownToggle>\r\n <span>{{selectedFormatBlock | titlecase}}</span> <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select> -->\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n id=\"headerDropdown\" style=\"width: 100px\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px; font-weight: 700 !important;\" class=\"text-truncate\">{{selectedFont |\r\n titlecase}}</span>\r\n <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" *ngFor=\"let font of fonts\"\r\n (click)=\"changeFont(font)\" [style.color]=\"themeModeClr()\">\r\n <span>{{ font }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"py-0\" style=\"height: fit-content;\" [style.color]=\"themeModeClr()\">\r\n <div class=\"btn-group els-button-group me-2 mr-2 \" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"><i class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyLeft')\"><i class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyCenter')\"><i class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyRight')\"><i class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyFull')\"><i class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"><i class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n <button \r\n \r\n type=\"button\" \r\n class=\"btn btn-white els-toolbar-button\" \r\n *ngIf=\"isTableSelected\" \r\n [style.color]=\"tHeadBgColor\" \r\n (click)=\"openColorPicker('tHeadbgColorPicker')\" \r\n > \r\n <i class=\"mdi mdi-table-edit\"></i> \r\n </button> \r\n <input \r\n type=\"color\" \r\n id=\"tHeadbgColorPicker\" \r\n style=\" \r\n position: absolute; \r\n top: 100%; \r\n left: 0; \r\n z-index: 100; \r\n opacity: 0; \r\n \" \r\n (change)=\"setTheadBgColor($event)\" \r\n />\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n <i class=\"mdi mdi-undo\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n <i class=\"mdi mdi-redo\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button> -->\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"clearTextEditor()\"\r\n style=\" width: fit-content !important;\">\r\n <i class=\"mdi mdi-close-circle\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"toggleFullscreen1()\">\r\n <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n <i class=\"mdi mdi-fullscreen-exit\"></i> <!-- Collapse Icon -->\r\n </ng-container>\r\n <ng-template #fullscreenIcon>\r\n <i class=\"mdi mdi-fullscreen\"></i> <!-- Expand Icon -->\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"toolbarMode === 'bubble'\" class=\"bubble-toolbar border p-2\"\r\n [ngStyle]=\"{'top.px': toolbarTop, 'left.px': toolbarLeft, 'display': showToolbar ? 'block' : 'none'}\">\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <select class=\"els-form-select\" [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n class=\"mdi mdi-format-quote-close\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n class=\"mdi mdi-code-tags\"></i></button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertUnorderedList')\"><i\r\n class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <!-- <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-color-fill\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n (change)=\"logEvent($event, 'change')\"\r\n (input)=\"logEvent($event, 'input')\"\r\n >\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n [style]=\"{color: color}\"></i>\r\n <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n </div> -->\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n\r\n\r\n <!-- </div> -->\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"mdi mdi-format-header-1\"></i>\r\n </button>\r\n <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n </div>\r\n </div>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\" id=\"headerDropdown\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px;\">{{selectedFormatBlock | titlecase}}</span> <i\r\n class=\"mdi mdi-chevron-down text-dark\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n class=\"mdi mdi-format-superscript\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n class=\"mdi mdi-format-subscript\"></i></button> -->\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyLeft')\"><i\r\n class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyCenter')\"><i\r\n class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyRight')\"><i\r\n class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyFull')\"><i\r\n class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('removeFormat')\"><i\r\n class=\"mdi mdi-format-clear\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addRow()\"><i\r\n class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n </div> -->\r\n <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle (click)=\"addTable()\">\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n \r\n <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"tableWidth\">Table Width</label>\r\n <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellWidth\">Cell Width</label>\r\n <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellHeight\">Cell Height</label>\r\n <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n placeholder=\"Height\">\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n [style.min-height]=\"IsOpen ? '85vh !important' : '405px !important'\"\r\n (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important;\r\n \" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n \r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n }\"\r\n [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <div [attr.contenteditable]=\"contentEditable\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important; overflow: auto;\" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\" [ngStyle]=\"{\r\n 'font-family': selectedFont, \r\n 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': IsOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': IsOpen ? '0' :'20px',\r\n 'min-height': IsOpen ? '93vh' : '405px',\r\n 'max-height': IsOpen ? '93vh' : '405px'\r\n }\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n (input)=\"onModelChange($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\" (keydown.Tab)=\"handleTabKey($event)\">\r\n </div>\r\n\r\n <table *ngIf=\"parsedTable\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of parsedTable.rows\">\r\n <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { ElTextEditorComponent } from './el-text-editor.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ColorSketchModule } from 'ngx-color/sketch';\r\nimport { ColorPickerModule } from 'ngx-color-picker';\r\nimport { NgxFullscreenModule } from '@ultimate/ngx-fullscreen';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n ElTextEditorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NgbDropdownModule,\r\n ColorSketchModule,\r\n ColorPickerModule,\r\n NgxFullscreenModule,\r\n ],\r\n exports: [\r\n ElTextEditorComponent\r\n ]\r\n})\r\nexport class ElTextEditorModule { }\r\n","/*\r\n * Public API Surface of el-text-editor\r\n */\r\n\r\nexport * from './lib/el-text-editor.service';\r\nexport * from './lib/el-text-editor.component';\r\nexport * from './lib/el-text-editor.module';\r\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":"el-text-editor.mjs","sources":["../../../projects/el-text-editor/src/lib/el-text-editor.service.ts","../../../projects/el-text-editor/src/lib/el-text-editor.component.ts","../../../projects/el-text-editor/src/lib/el-text-editor.component.html","../../../projects/el-text-editor/src/lib/el-text-editor.module.ts","../../../projects/el-text-editor/src/public-api.ts","../../../projects/el-text-editor/src/el-text-editor.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ElTextEditorService {\r\n\r\n constructor() { }\r\n}\r\n","import { AfterViewInit, Component, Input, OnInit, Output, EventEmitter, forwardRef, ViewChild, ElementRef, Renderer2, OnChanges, SimpleChanges } from '@angular/core';\r\nimport { ControlValueAccessor, FormControl, NG_VALUE_ACCESSOR } from '@angular/forms';\r\n// import { MatDialog } from '@angular/material/dialog';\r\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\r\nimport { Router, ActivatedRoute } from '@angular/router';\r\nimport { NgxFullscreenDirective } from '@ultimate/ngx-fullscreen';\r\nimport * as XLSX from 'xlsx';\r\n// import { ImageEditorModalComponent } from '../modals/image-editor-modal/image-editor-modal.component';\r\nimport { compress, decompress } from 'lz-string';\r\n\r\n\r\n@Component({\r\n selector: 'text-editor',\r\n templateUrl: './el-text-editor.component.html',\r\n styleUrls: ['./el-text-editor.component.scss'],\r\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => ElTextEditorComponent),\r\n multi: true\r\n }]\r\n})\r\nexport class ElTextEditorComponent implements ControlValueAccessor, AfterViewInit, OnChanges {\r\n\r\n @Input() editorText: string = '';\r\n @Input() editorFrom: any;\r\n @Input() editorAction: any;\r\n @Input() UserRole: any;\r\n @Input() style: any;\r\n @Input() disableToolbar: any;\r\n @Input() placeHolder: any;\r\n @Input() reportId: any;\r\n @Input() backgroundImage: any;\r\n @Input() toolbarMode: 'fixed' | 'bubble' | 'none' = 'fixed';\r\n @Input() contentEditable: boolean = true; // Input for initial value\r\n @Output() contentEditableChange: EventEmitter<boolean> = new EventEmitter<boolean>(); // Output for changes\r\n @Output() editorTextChange = new EventEmitter<string>();\r\n @Output() editorActionResponse = new EventEmitter<any>();\r\n @Output() editorTextClear = new EventEmitter<any>();\r\n @Output() imageEdit = new EventEmitter<any>();\r\n @Output() imageEdit2 = new EventEmitter<any>();\r\n @Output() placeHolderRemove = new EventEmitter<any>();\r\n @Output() isOpen = new EventEmitter<any>();\r\n @Output() newImageAdded = new EventEmitter<any>();\r\n \r\n @Input() value: string = '';\r\n\r\n \r\n @ViewChild('textEditor') TextEditor!: ElementRef<Element>;\r\n @ViewChild('fullscreen') fullscreen!: NgxFullscreenDirective\r\n \r\n sanitizedContent!: SafeHtml;\r\n\r\n\r\n showToolbar = false;\r\n toolbarTop = 0;\r\n toolbarLeft = 0;\r\n\r\n fonts = ['Arial', 'Courier New', 'Georgia', 'Times New Roman', 'Verdana'];\r\n fontSizes = [10, 12, 14, 16, 18, 20, 24, 28, 32, 36];\r\n selectedFont = 'Arial';\r\n selectedFontSize = 14;\r\n isTableSelected = false;\r\n tableAdded = false;\r\n selectedTable: HTMLTableElement | null = null;\r\n isPlaceholderVisible = true;\r\n selectedCell: HTMLTableCellElement | null = null;\r\n \r\n isBoldActive: boolean = false;\r\n isItalicActive: boolean = false;\r\n isUnderlineActive: boolean = false;\r\n isStrikethroughActive: boolean = false;\r\n isSubscriptActive: boolean = false;\r\n isSuperscriptActive: boolean = false;\r\n\r\n selectedFormatBlock: string = 'normal'\r\n\r\n selectedImage: HTMLImageElement | null = null;\r\n imageEditUrl: string = '';\r\n imagePositionX = 0;\r\n imagePositionY = 0;\r\n imageResizeStartX = 0;\r\n imageResizeStartY = 0;\r\n imageResizeStartWidth = 0;\r\n imageResizeStartHeight = 0;\r\n imageResizeDirection: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | null = null;\r\n\r\n undoStack: string[] = [];\r\n redoStack: string[] = [];\r\n history: string[] = [];\r\n historyIndex = -1;\r\n // editorText1 = ``;\r\n selectedTextColor: any;\r\n onChange: any = () => {};\r\n onTouched: any = () => {};\r\n color: any = '#ddd';\r\n colorFormControl!: FormControl;\r\n backgroundColor: any;\r\n selectedItemIndex: number | null = null;\r\n\r\n parsedTable: { headers: string[], rows: string[][] } | null = null;\r\n\r\n isFullScreen: boolean = false;\r\n currentCaretPosition: any;\r\n userRole: any[] = [];\r\n showEditButton: boolean = false;\r\n tHeadBgColor: any;\r\n\r\n constructor(\r\n private router: Router,\r\n private route: ActivatedRoute,\r\n private renderer: Renderer2,\r\n private sanitizer: DomSanitizer,\r\n ) {\r\n this.getUserRoles()\r\n\r\n \r\n }\r\n\r\n themeMode() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '2px solid #403F4A !important'\r\n } else {\r\n return '2px solid #D0D0D0 !important'\r\n }\r\n }\r\n\r\n themeModeClr() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '#fff !important'\r\n } else {\r\n return '#000 !important'\r\n }\r\n }\r\n\r\n themeModeClrVerticalLine() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '2px solid #FFFFFF !important'\r\n } else {\r\n return '2px solid #D0D0D0 !important'\r\n }\r\n }\r\n\r\n themeModeBgClr() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '#282828 !important'\r\n } else {\r\n return '#F3F3F3 !important'\r\n }\r\n }\r\n\r\n themeModeBorderTop() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '2px solid #000 !important'\r\n } else {\r\n return '2px solid #fff !important'\r\n }\r\n }\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['placeHolder']) {\r\n this.insertAtCaret(this.placeHolder)\r\n\r\n }\r\n\r\n if (changes['reportId']) {\r\n sessionStorage.setItem('reportId', this.reportId)\r\n } \r\n\r\n if (changes['UserRole']) { \r\n this.getUserRoles()\r\n }\r\n }\r\n ngAfterViewInit() {\r\n this.initEditor();\r\n this.checkPlaceholder();\r\n this.setupHistory();\r\n document.addEventListener('fullscreenchange', this.onFullscreenChange);\r\n }\r\n\r\n ngOnInit(): void {\r\n this.init_Func(this.editorText)\r\n document.addEventListener('selectionchange', () => {\r\n this.checkActiveStates();\r\n this.checkFormatBlock();\r\n });\r\n this.addClickListenerToImages();\r\n this.addClickListenerToElements();\r\n // this.route.queryParams.subscribe(params => {\r\n // const data = JSON.parse(params['data']);\r\n // if (data.editedIMG) {\r\n // const imgUrl = sessionStorage.getItem('editImageFromTemp');\r\n // if (imgUrl) {\r\n // this.replaceImageSrc(imgUrl, data.index.index)\r\n // }\r\n // sessionStorage.removeItem('editImageFromTemp');\r\n // }\r\n // })\r\n }\r\n\r\n ngOnDestroy() {\r\n // Cleanup the event listener when the component is destroyed\r\n document.removeEventListener('fullscreenchange', this.onFullscreenChange);\r\n }\r\n\r\n IsOpen: boolean = false;\r\n\r\n toggleFullscreen1() {\r\n this.IsOpen = !this.IsOpen;\r\n this.isOpen.emit(this.IsOpen)\r\n if (this.IsOpen) { \r\n this.fullscreen.enter(this.TextEditor.nativeElement);\r\n } else {\r\n this.fullscreen.exit()\r\n }\r\n }\r\n \r\n private onFullscreenChange = () => {\r\n if (!document.fullscreenElement) {\r\n // When fullscreen mode is exited\r\n this.IsOpen = false;\r\n this.isOpen.emit(this.IsOpen);\r\n }\r\n };\r\n \r\n // enterFullscreenVideo() {\r\n // console.log('event:', event);\r\n // const fullscreen = event;\r\n // this.isOpen = event;\r\n // if (fullscreen) {\r\n // this.fullscreen.enter(this.TextEditor.nativeElement);\r\n // } else {\r\n // this.fullscreen.exit()\r\n // }\r\n \r\n // }\r\n\r\n writeValue(value: any): void {\r\n if (value !== undefined) {\r\n this.editorText = value;\r\n this.initEditor();\r\n this.init_Func(this.editorText);\r\n }\r\n }\r\n \r\n// private addClickListenerToImages() {\r\n// const editor = document.getElementById('editor');\r\n// if (editor) {\r\n// editor.addEventListener('click', (event) => {\r\n// const target = event.target as HTMLElement;\r\n// if (target.tagName === 'IMG') {\r\n// this.selectedImage = target as HTMLImageElement;\r\n// this.imageEditUrl = this.selectedImage.src;\r\n\r\n// let container = this.selectedImage.parentElement;\r\n// if (!container || container.className !== 'image-container') {\r\n// container = document.createElement('div');\r\n// container.className = 'image-container';\r\n// container.style.position = 'relative';\r\n// container.style.display = 'inline-block';\r\n// this.selectedImage.parentNode?.insertBefore(container, this.selectedImage);\r\n// container.appendChild(this.selectedImage);\r\n// }\r\n// const existingButton = container.querySelector('.image-edit-button');\r\n// if (existingButton) {\r\n// existingButton.remove();\r\n// }\r\n\r\n// const button = document.createElement('button');\r\n// // button.textContent = 'Edit';\r\n// button.innerText = 'Edit Image';\r\n\r\n// button.className = 'image-edit-button btn btn-sm';\r\n// button.style.position = 'absolute';\r\n// button.style.top = '50%';\r\n// button.style.left = '50%';\r\n// button.style.transform = 'translate(-50%, -50%)';\r\n// button.style.zIndex = '1000';\r\n// button.style.backgroundColor = '#fff';\r\n// button.style.border = '2px solid #fff';\r\n// // button.style.padding = '10px';\r\n// button.style.color = '#313a46';\r\n// button.style.cursor = 'pointer';\r\n\r\n// button.addEventListener('click', (e) => {\r\n// e.stopPropagation();\r\n// this.editImage();\r\n// });\r\n\r\n// container.appendChild(button);\r\n// } else {\r\n// this.selectedImage = null;\r\n// this.selectedItemIndex = null;\r\n// }\r\n// });\r\n// }\r\n // }\r\n getUserRoles() {\r\n this.userRole = this.UserRole\r\n }\r\n // roleCheck() {\r\n // for (let i = 0; i < this.userRole.length; ++i) {\r\n // const roleName = []\r\n // roleName.push(this.userRole[i]?.name);\r\n // return this.userRole[i]?.name;\r\n // }\r\n // }\r\n\r\n roleCheck() {\r\n let userRoleName: string[] = [];\r\n for (let i = 0; i <= this.userRole.length; ++i) {\r\n userRoleName.push(this.userRole[i]?.name);\r\n }\r\n return userRoleName;\r\n }\r\n\r\n\r\n// private addClickListenerToImages() {\r\n// const editor = document.getElementById('editor');\r\n// const roles = this.roleCheck(); // Get user roles dynamically\r\n// const isAdmin = roles.includes('Admin');\r\n// const isCreator = roles.includes('Creator');\r\n// const isApprover = roles.includes('Approver');\r\n \r\n// if (isCreator || isAdmin) {\r\n// if (editor) {\r\n// editor.addEventListener('click', (event) => {\r\n// const target = event.target as HTMLElement;\r\n// if (target.tagName === 'IMG') {\r\n// this.selectedImage = target as HTMLImageElement;\r\n// this.imageEditUrl = this.selectedImage.src;\r\n// let container = this.selectedImage.parentElement;\r\n// if (!container || container.className !== 'image-container') {\r\n// container = document.createElement('div');\r\n// container.className = 'image-container';\r\n// container.style.position = 'relative';\r\n// container.style.display = 'inline-block'; \r\n// this.selectedImage.parentNode?.insertBefore(container, this.selectedImage);\r\n// container.appendChild(this.selectedImage);\r\n// }\r\n\r\n// const existingButton = container.querySelector('.image-edit-button');\r\n// if (existingButton) {\r\n// existingButton.remove();\r\n// }\r\n\r\n// const button = document.createElement('button');\r\n// button.textContent = 'Edit Image';\r\n// button.className = 'image-edit-button btn btn-sm';\r\n// button.style.position = 'absolute';\r\n// button.style.top = '50%';\r\n// button.style.left = '50%';\r\n// button.style.transform = 'translate(-50%, -50%)';\r\n// button.style.zIndex = '1000';\r\n// button.style.backgroundColor = '#fff'; \r\n// button.style.border = '2px solid #fff'; \r\n// button.style.color = '#313a46';\r\n// button.style.cursor = 'pointer';\r\n// button.style.userSelect = 'none';\r\n\r\n// button.addEventListener('click', (e) => {\r\n// e.stopPropagation();\r\n// this.editImage();\r\n// });\r\n\r\n// container.appendChild(button);\r\n\r\n// } else {\r\n// this.selectedImage = null;\r\n// this.selectedItemIndex = null;\r\n// const buttons = document.querySelectorAll('.image-edit-button');\r\n// buttons.forEach(button => button.remove());\r\n// }\r\n// });\r\n// }\r\n// }\r\n // }\r\n private addClickListenerToImages() {\r\n const editor = document.getElementById('editor');\r\n const roles = this.roleCheck(); // Get user roles dynamically\r\n const isAdmin = roles.includes('Admin');\r\n const isCreator = roles.includes('Creator');\r\n\r\n if (isCreator || isAdmin) {\r\n if (editor) {\r\n editor.addEventListener('click', (event) => {\r\n const target = event.target as HTMLElement;\r\n if (target.tagName === 'IMG') {\r\n this.selectedImage = target as HTMLImageElement;\r\n this.imageEditUrl = this.selectedImage.src;\r\n const images = editor.getElementsByTagName('img');\r\n for (let i = 0; i < images.length; i++) {\r\n if (images[i] === this.selectedImage) {\r\n this.selectedItemIndex = i;\r\n break;\r\n }\r\n }\r\n let container = this.selectedImage.parentElement;\r\n if (!container || container.className !== 'image-container') {\r\n container = document.createElement('div');\r\n container.className = 'image-container';\r\n container.style.position = 'relative';\r\n container.style.display = 'inline-block';\r\n this.selectedImage.parentNode?.insertBefore(container, this.selectedImage);\r\n container.appendChild(this.selectedImage);\r\n }\r\n\r\n const existingButton = container.querySelector('.image-edit-button');\r\n if (existingButton) {\r\n existingButton.remove();\r\n }\r\n\r\n const button = document.createElement('button');\r\n button.textContent = 'Edit Image';\r\n button.className = 'image-edit-button btn btn-sm';\r\n button.style.position = 'absolute';\r\n button.style.top = '50%';\r\n button.style.left = '50%';\r\n button.style.transform = 'translate(-50%, -50%)';\r\n button.style.zIndex = '1000';\r\n button.style.backgroundColor = '#fff';\r\n button.style.border = '2px solid #fff';\r\n button.style.color = '#313a46';\r\n button.style.cursor = 'pointer';\r\n button.style.userSelect = 'none';\r\n\r\n button.addEventListener('click', (e) => {\r\n e.stopPropagation();\r\n this.editImage();\r\n });\r\n\r\n container.appendChild(button);\r\n } else {\r\n this.removeEditButtons();\r\n }\r\n });\r\n\r\n // Monitor editor content changes to handle image deletion\r\n const observer = new MutationObserver(() => {\r\n const buttons = editor.querySelectorAll('.image-edit-button');\r\n buttons.forEach((button) => {\r\n const container = button.parentElement;\r\n if (container && !container.querySelector('img')) {\r\n button.remove(); // Remove the button if the associated image is gone\r\n container.remove(); // Clean up the container\r\n }\r\n });\r\n });\r\n\r\n // Observe changes in the editor\r\n observer.observe(editor, { childList: true, subtree: true });\r\n }\r\n }\r\n}\r\n\r\nprivate removeEditButtons() {\r\n const buttons = document.querySelectorAll('.image-edit-button');\r\n buttons.forEach((button) => button.remove());\r\n this.selectedImage = null;\r\n this.selectedItemIndex = null;\r\n}\r\n\r\n\r\n // private addClickListenerToImages() {\r\n // const editor = document.getElementById('editor');\r\n // if (editor) {\r\n // editor.addEventListener('click', (event) => {\r\n // const target = event.target as HTMLElement;\r\n // if (target.tagName === 'IMG') {\r\n // this.selectedImage = target as HTMLImageElement;\r\n // this.imageEditUrl = this.selectedImage.src;\r\n\r\n // // Get the index of the selected image\r\n // const images = editor.getElementsByTagName('img');\r\n // for (let i = 0; i < images.length; i++) {\r\n // if (images[i] === this.selectedImage) {\r\n // this.selectedItemIndex = i;\r\n // break;\r\n // }\r\n // }\r\n\r\n // if (this.toolbarMode === 'bubble') {\r\n // this.onTextSelect();\r\n // }\r\n // } else {\r\n // this.selectedImage = null;\r\n // this.selectedItemIndex = null;\r\n // }\r\n // });\r\n // }\r\n // }\r\n \r\n private addClickListenerToElements() {\r\n const editor = document.getElementById('editor');\r\n if (editor) {\r\n editor.addEventListener('click', (event) => {\r\n const target = event.target as HTMLElement;\r\n if (target.tagName === 'IMG') {\r\n this.selectedImage = target as HTMLImageElement;\r\n this.imageEditUrl = this.selectedImage.src;\r\n const images = editor.getElementsByTagName('img');\r\n for (let i = 0; i < images.length; i++) {\r\n if (images[i] === this.selectedImage) {\r\n this.selectedItemIndex = i;\r\n break;\r\n }\r\n }\r\n } else {\r\n this.selectedImage = null;\r\n }\r\n if (target.tagName === 'TD' || target.tagName === 'TH') {\r\n this.selectedTable = target.closest('table') as HTMLTableElement;\r\n const cells = this.selectedTable.getElementsByTagName(target.tagName);\r\n for (let i = 0; i < cells.length; i++) {\r\n if (cells[i] === target) {\r\n this.selectedItemIndex = i;\r\n break;\r\n }\r\n }\r\n } else {\r\n this.selectedTable = null;\r\n }\r\n\r\n if (target.tagName === 'P' || target.tagName === 'SPAN' || target.tagName === 'DIV') {\r\n const paragraphs = editor.getElementsByTagName(target.tagName);\r\n for (let i = 0; i < paragraphs.length; i++) {\r\n if (paragraphs[i] === target) {\r\n this.selectedItemIndex = i;\r\n break;\r\n }\r\n }\r\n }\r\n });\r\n }\r\n }\r\n\r\nreplaceImageSrc(newSrc: string, index: number) {\r\n const editor = document.getElementById('editor');\r\n \r\n if (editor) {\r\n editor.focus()\r\n const images = editor.getElementsByTagName('IMG');\r\n if (index >= 0 ) {\r\n images[index].setAttribute('src', newSrc);\r\n } \r\n }\r\n}\r\n\r\n\r\n\r\n private initEditor() {\r\n // Initialize editor content and listeners\r\n const editor = document.getElementById('editor');\r\n\r\n if (editor) {\r\n editor.innerHTML = this.editorText;\r\n editor.addEventListener('input', () => {\r\n this.onModelChange(editor.innerHTML);\r\n });\r\n }\r\n this.checkPlaceholder();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouched = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n // Handle the disabled state if necessary\r\n }\r\n\r\n onModelChange(value: any): void {\r\n if (value) {\r\n const VALUE = value\r\n this.editorText = VALUE;\r\n this.onChange(VALUE);\r\n this.editorTextChange.emit(VALUE);\r\n } else {\r\n this.selectedImage = null;\r\n }\r\n }\r\n\r\n applyImageStyles(content: string): string {\r\n const div = document.createElement('div');\r\n div.innerHTML = content;\r\n const images = div.querySelectorAll('img');\r\n images.forEach(img => {\r\n if (img.style.maxWidth >= '700px') {\r\n img.style.maxWidth = '700px';\r\n // img.width = 300;\r\n img.style.height = 'auto';\r\n } else {\r\n img.style.maxWidth = '100%';\r\n img.style.height = 'auto';\r\n }\r\n });\r\n return div.innerHTML;\r\n }\r\n\r\n // init_Func(html: any) {\r\n // if (html) {\r\n // let editor = document.getElementById('editor');\r\n // if (editor) { \r\n // editor.focus()\r\n // editor.innerHTML = html;\r\n // this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n // editor.innerHTML = this.sanitizedContent as string;\r\n // editor.addEventListener('input', () => {\r\n // if (editor) {\r\n // editor.focus()\r\n // this.onModelChange(editor.innerHTML);\r\n // }\r\n // });\r\n // }\r\n // } else {\r\n // this.selectedImage = null;\r\n // }\r\n // }\r\n \r\n// init_Func(html: any) {\r\n// if (html) {\r\n// let editor = document.getElementById('editor');\r\n// if (editor) {\r\n// // Initialize the editor with sanitized content\r\n \r\n// this.setEditorContent(html);\r\n\r\n// // Set up a MutationObserver to handle content changes\r\n// this.setupMutationObserver(editor);\r\n\r\n// // Move the caret to the end after initial content setup\r\n// this.moveCaretToEnd(editor);\r\n\r\n// // Track caret position on mouse click\r\n// editor.addEventListener('click', () => {\r\n// if (editor) { // Ensure editor is not null\r\n// // this.trackCaretPosition(editor);\r\n// }\r\n// });\r\n// }\r\n// } else {\r\n// this.selectedImage = null;\r\n// }\r\n// }\r\n\r\n// private setEditorContent(html: string) {\r\n// let editor = document.getElementById('editor');\r\n// if (editor) {\r\n// // Sanitize and apply styles to the HTML\r\n// this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n// editor.innerHTML = this.sanitizedContent as string;\r\n// }\r\n// }\r\n\r\n// private setupMutationObserver(editor: HTMLElement) {\r\n// const observer = new MutationObserver(() => {\r\n// // Update model with the current content\r\n// this.onModelChange(editor.innerHTML);\r\n// });\r\n\r\n// observer.observe(editor, { childList: true, subtree: true, characterData: true });\r\n// }\r\n\r\n// This function tracks the caret position based on the mouse click\r\nprivate trackCaretPosition(editor: HTMLElement) {\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n const startNode = range.startContainer;\r\n const startOffset = range.startOffset;\r\n\r\n\r\n // You can use this information to insert content or perform actions based on the caret position\r\n // Example: Save the current caret position for future use\r\n this.currentCaretPosition = { node: startNode, offset: startOffset };\r\n }\r\n }\r\n \r\n // Method to get caret position and insert new data\r\nprivate insertAtCaret(newData: string): void {\r\n const selection = window.getSelection();\r\n \r\n if (selection && selection.rangeCount > 0) {\r\n // Get the current range (caret position)\r\n const range = selection.getRangeAt(0);\r\n\r\n // Create a document fragment to insert (allows handling HTML strings)\r\n const fragment = document.createDocumentFragment();\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = newData;\r\n\r\n // Append the new data to the fragment (supports HTML insertion)\r\n while (tempDiv.firstChild) {\r\n fragment.appendChild(tempDiv.firstChild);\r\n }\r\n\r\n // Insert the fragment at the caret position\r\n range.deleteContents(); // Remove any selected content if applicable\r\n range.insertNode(fragment);\r\n\r\n // Move the caret after the inserted content\r\n const lastChild = fragment.lastChild;\r\n\r\n if (lastChild) {\r\n range.setStartAfter(lastChild);\r\n range.setEndAfter(lastChild);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n let editor = document.getElementById('editor');\r\n if (editor) {\r\n this.moveCaretToEnd(editor)\r\n }\r\n \r\n this.placeHolderRemove.emit()\r\n }\r\n}\r\n\r\n\r\n// // Move caret to the end of the editor content\r\n// private moveCaretToEnd(editor: HTMLElement) {\r\n// const selection = window.getSelection();\r\n// const range = document.createRange();\r\n \r\n// if (editor.lastChild) {\r\n// range.selectNodeContents(editor);\r\n// range.collapse(false); // Collapse to the end\r\n// selection?.removeAllRanges();\r\n// selection?.addRange(range);\r\n \r\n// }\r\n// }\r\n \r\n \r\n\r\n\r\n init_Func(html: any) {\r\n if (html) {\r\n let editor = document.getElementById('editor');\r\n if (editor) {\r\n // Initialize the editor with sanitized content\r\n this.setEditorContent(html);\r\n\r\n // Set up a MutationObserver to handle content changes\r\n this.setupMutationObserver(editor);\r\n \r\n // Move the caret to the end after initial content setup\r\n this.moveCaretToEnd(editor);\r\n // Track caret position on mouse click\r\n editor.addEventListener('click', () => {\r\n if (editor) { // Ensure editor is not null\r\n this.trackCaretPosition(editor);\r\n }\r\n });\r\n }\r\n } else {\r\n this.selectedImage = null;\r\n }\r\n}\r\n\r\n\r\nprivate setEditorContent(html: string) {\r\n let editor = document.getElementById('editor');\r\n if (editor) {\r\n // Sanitize and apply styles to the HTML\r\n this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n editor.innerHTML = this.sanitizedContent as string;\r\n }\r\n}\r\n\r\nprivate setupMutationObserver(editor: HTMLElement) {\r\n const observer = new MutationObserver(() => {\r\n // Move the caret to the end after content changes\r\n // this.moveCaretToEnd(editor);\r\n // Update model with the current content\r\n this.onModelChange(editor.innerHTML);\r\n });\r\n\r\n observer.observe(editor, { childList: true, subtree: true, characterData: true });\r\n}\r\n\r\nprivate moveCaretToEnd(editor: HTMLElement) {\r\n const selection = window.getSelection();\r\n const range = document.createRange();\r\n \r\n if (editor.lastChild) {\r\n range.selectNodeContents(editor);\r\n range.collapse(false); // Collapse to the end\r\n selection?.removeAllRanges();\r\n selection?.addRange(range);\r\n }\r\n}\r\n\r\n// init_Func(html: any) {\r\n// if (html) {\r\n// let editor = document.getElementById('editor');\r\n// if (editor) {\r\n// editor.focus();\r\n// editor.innerHTML = html;\r\n\r\n// // Sanitize the content and apply styles\r\n// this.sanitizedContent = this.sanitizer.bypassSecurityTrustHtml(this.applyImageStyles(html));\r\n// editor.innerHTML = this.sanitizedContent as string;\r\n\r\n// // Place the caret at the end of the content\r\n// const range = document.createRange();\r\n// const selection = window.getSelection();\r\n \r\n// if (editor.lastChild) {\r\n// // Set the range at the end of the editor's content\r\n// range.selectNodeContents(editor);\r\n// range.collapse(false); // collapse to the end\r\n// selection?.removeAllRanges();\r\n// selection?.addRange(range);\r\n// }\r\n\r\n// editor.addEventListener('input', () => {\r\n// if (editor) {\r\n// this.onModelChange(editor.innerHTML);\r\n\r\n// // Ensure the caret remains at the end after new content is added\r\n// const range = document.createRange();\r\n// const selection = window.getSelection();\r\n \r\n// if (editor.lastChild) {\r\n// range.selectNodeContents(editor);\r\n// range.collapse(false); // collapse to the end\r\n// selection?.removeAllRanges();\r\n// selection?.addRange(range);\r\n// }\r\n// }\r\n// });\r\n// }\r\n// } else {\r\n// this.selectedImage = null;\r\n// }\r\n// }\r\n\r\n format(command: string, value?: any) {\r\n const editor = document.getElementById('editor');\r\n if (editor) {\r\n editor.focus();\r\n if (command === 'subscript') {\r\n this.isSubscriptActive = !this.isSubscriptActive;\r\n document.execCommand('subscript', false, '');\r\n } else if (command === 'superscript') {\r\n this.isSuperscriptActive = !this.isSuperscriptActive;\r\n document.execCommand('superscript', false, '');;\r\n } else {\r\n document.execCommand(command, false, value ?? '');\r\n if (value) {\r\n const tag = value.toLowerCase().replace(/[<>]/g, '')\r\n this.selectedFormatBlock = this.formatBlockDecode(tag);\r\n }\r\n }\r\n }\r\n this.checkActiveStates();\r\n this.checkFormatBlock();\r\n }\r\n\r\n checkActiveStates() {\r\n this.isBoldActive = document.queryCommandState('bold');\r\n this.isItalicActive = document.queryCommandState('italic');\r\n this.isUnderlineActive = document.queryCommandState('underline');\r\n this.isStrikethroughActive = document.queryCommandState('strikethrough');\r\n this.isSubscriptActive = document.queryCommandState('subscript');\r\n this.isSuperscriptActive = document.queryCommandState('superscript');\r\n }\r\n\r\n checkFormatBlock() {\r\n const editor = document.getElementById('editor');\r\n if (editor) {\r\n const formatBlock = document.queryCommandValue('formatBlock');\r\n this.selectedFormatBlock = this.formatBlockDecode(formatBlock);\r\n // You can further handle the formatBlock value as needed\r\n }\r\n }\r\n\r\n formatBlockDecode(data: string): any {\r\n switch (data) {\r\n case 'h1':\r\n return 'heading 1';\r\n break;\r\n case 'h2':\r\n return 'heading 2';\r\n break;\r\n case 'h3':\r\n return 'heading 3';\r\n break;\r\n case 'h4':\r\n return 'heading 4';\r\n break;\r\n case 'h5':\r\n return 'heading 5';\r\n break;\r\n case 'h6':\r\n return 'heading 6';\r\n break;\r\n case 'p':\r\n return 'normal';\r\n break;\r\n default:\r\n return 'normal';\r\n break;\r\n }\r\n }\r\n\r\n changeFont(event: any) {\r\n this.selectedFont = event;\r\n document.execCommand('fontName', false, this.selectedFont);\r\n }\r\n\r\n insertCodeBlock() {\r\n const code = `\r\n <pre style=\"font-size: 12px;\r\n color: white;\r\n background-color: black;\r\n overflow-x: auto;\r\n margin-bottom: 5px;\r\n margin-top: 5px;\r\n padding: 5px 10px;\">\r\n <code style=\"display: block;\r\n white-space: pre-wrap;\r\n height: auto;\r\n font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;\r\n font-size: 14px;\" class=\"language-html\">Insert code here...</code>\r\n </pre>\r\n `;\r\n document.execCommand('insertHTML', false, code);\r\n }\r\n\r\n // changeFontSize(event: any) {\r\n // document.execCommand('fontSize', false, '7');\r\n // let editor = document.getElementById('editor');\r\n // if (editor) {\r\n // let fontElements = editor.getElementsByTagName('font');\r\n // for (let i = 0; i < fontElements.length; i++) {\r\n // if (fontElements[i].size == \"7\") {\r\n // fontElements[i].removeAttribute(\"size\");\r\n // fontElements[i].style.fontSize = this.selectedFontSize + 'px';\r\n // }\r\n // }\r\n // }\r\n // }\r\n changeFontSize(event: any) {\r\n const selectedText = window.getSelection();\r\n \r\n if (selectedText && selectedText.rangeCount > 0) {\r\n const range = selectedText.getRangeAt(0);\r\n const span = document.createElement('span');\r\n span.style.fontSize = this.selectedFontSize + 'px';\r\n range.surroundContents(span);\r\n }\r\n }\r\n\r\n addLink() {\r\n let url = prompt(\"Enter the link here: \", \"http://\");\r\n if (url) {\r\n document.execCommand(\"createLink\", false, url);\r\n }\r\n }\r\n\r\n insertsImage() {\r\n const editor = document.getElementById('editor');\r\n if (editor) {\r\n editor.focus();\r\n let imageInput = document.getElementById('imageInput') as HTMLInputElement;\r\n if (imageInput) {\r\n imageInput.click();\r\n }\r\n }\r\n }\r\n\r\n // handleImageUpload(event: any) {\r\n // const file = event.target.files[0];\r\n // if (file) {\r\n // const reader = new FileReader();\r\n // reader.onload = (e: any) => {\r\n // const img = new Image();\r\n // img.src = e.target.result;\r\n // img.onload = () => {\r\n // // Create the HTML string with the exact width and height\r\n // const imgHTML = `<img src=\"${img.src}\" width=\"${794}\" >`;\r\n // // Insert the image into the editor\r\n // document.execCommand('insertHTML', false, imgHTML);\r\n // };\r\n // };\r\n // reader.readAsDataURL(file);\r\n // }\r\n // }\r\n\r\n handleImageUpload(event: any) {\r\n const file = event.target.files[0];\r\n const editorElement = document.getElementById('editor'); // Reference to the editor\r\n\r\n if (file && editorElement) {\r\n const editorWidth = editorElement.offsetWidth; // Get the editor's width\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e: any) => {\r\n const img = new Image();\r\n img.src = e.target.result;\r\n\r\n img.onload = () => {\r\n const imgWidth = img.width;\r\n\r\n // If the image width exceeds the editor's width, fit it to the editor\r\n const imgHTML =\r\n imgWidth > editorWidth\r\n ? `<img src=\"${img.src}\" style=\" max-width: ${700}px; height: auto;\">`\r\n : `<img src=\"${img.src}\" style=\"width: ${imgWidth}px; height: auto;\">`;\r\n this.newImageAdded.emit()\r\n // Insert the image into the editor\r\n document.execCommand('insertHTML', false, imgHTML);\r\n };\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n }\r\n}\r\n\r\n\r\n\r\n // addTable() {\r\n // const tableWidth = 825; // Table width in pixels\r\n // const cols = 3; // Number of columns\r\n // const cellMinWidth = tableWidth / cols; // Calculate minimum width for each cell\r\n\r\n // let table = `<br /><table style=\"width: ${tableWidth}px;\">`;\r\n // for (let i = 0; i < 3; i++) { // Number of rows\r\n // table += '<tr >';\r\n // for (let j = 0; j < cols; j++) {\r\n // table += `<td style=\" word-wrap: break-word; word-break: break-all; white-space: normal; min-width: ${cellMinWidth}px;\"> </td>`;\r\n // }\r\n // table += '</tr>';\r\n // }\r\n // table += '</table><br/ >';\r\n // // document.execCommand('insertHTML', false, table);\r\n // const editor = document.getElementById('editor');\r\n // if (editor) {\r\n // editor.focus();\r\n // document.execCommand('insertHTML', false, table);\r\n // }\r\n // this.tableAdded = true;\r\n // this.checkTableSelection();\r\n // }\r\n\r\n\r\n handleTabKey(event: any) {\r\n if (event.key === \"Tab\") {\r\n event.preventDefault(); // Stop default tabbing behavior\r\n const selection = window.getSelection();\r\n if (!selection || selection.rangeCount === 0) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n const tabNode = document.createElement(\"span\"); // Create a span element for the tab space\r\n tabNode.innerHTML = \" \"; // Four non-breaking spaces to mimic tab\r\n \r\n range.deleteContents(); // Remove any selected text\r\n range.insertNode(tabNode); // Insert the tab space as span\r\n range.setStartAfter(tabNode); // Move cursor after the inserted span\r\n range.setEndAfter(tabNode);\r\n selection.removeAllRanges();\r\n selection.addRange(range);\r\n }\r\n }\r\n \r\n// addTable() {\r\n// const tableWidth = 825; // Table width in pixels\r\n// const cols = 3; // Number of columns\r\n// const cellMinWidth = tableWidth / cols; // Calculate minimum width for each cell\r\n\r\n// let table = `<br /><table style=\"width: ${tableWidth}px;\">`;\r\n// for (let i = 0; i < 3; i++) { // Number of rows\r\n// table += `<tr style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()}\">`; // Add border-bottom to the row\r\n// for (let j = 0; j < cols; j++) {\r\n// table += `<td style=\"word-wrap: break-word; word-break: break-all; white-space: normal; min-width: ${cellMinWidth}px;\"> </td>`;\r\n// }\r\n// table += '</tr>';\r\n// }\r\n// table += '</table><br/>';\r\n\r\n// const editor = document.getElementById('editor');\r\n// if (editor) {\r\n// editor.focus();\r\n// document.execCommand('insertHTML', false, table);\r\n// }\r\n\r\n// this.tableAdded = true;\r\n// this.checkTableSelection();\r\n// }\r\n// addTable() {\r\n// const tableWidth = 825;\r\n// const cols = 3;\r\n// const cellMinWidth = tableWidth / cols;\r\n\r\n// let table = `<br /><table id=\"customTable\" style=\"width: ${tableWidth}px; border-collapse: collapse;\">`;\r\n\r\n// table += `<tbody>`;\r\n// table += `<tr id=\"tableHeaderRow\" style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()};\" (click)=\"checkTableSelection()\">`;\r\n// for (let j = 0; j < cols; j++) {\r\n// table += `<td class=\"header-cell\" \r\n// style=\"border-top: 2px solid black; \r\n// font-weight: bold; \r\n// text-align: start; \r\n// word-wrap: break-word; \r\n// word-break: break-all; \r\n// white-space: normal; \r\n// min-width: ${cellMinWidth}px; \r\n// background-color: inherit !important; \r\n// // pointer-events: none !important;\r\n// display: table-cell !important;\r\n// position: static !important;\r\n// height:28px;\"></td>`;\r\n// }\r\n// table += `</tr>`;\r\n\r\n// for (let i = 0; i < 3; i++) {\r\n// table += `<tr style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()}\">`;\r\n// for (let j = 0; j < cols; j++) {\r\n// table += `<td style=\"word-wrap: break-word; \r\n// word-break: break-all; \r\n// white-space: normal; \r\n// min-width: ${cellMinWidth}px;\r\n// display: table-cell !important;\r\n// position: static !important;\"> </td>`;\r\n// }\r\n// table += \"</tr>\";\r\n// }\r\n// table += `</tbody></table><br/>`;\r\n\r\n// const editor = document.getElementById(\"editor\");\r\n// if (editor) {\r\n// editor.focus();\r\n// document.execCommand(\"insertHTML\", false, table);\r\n// }\r\n\r\n// this.tableAdded = true;\r\n// this.checkTableSelection();\r\n\r\n// // Add styles to prevent table structure breaking\r\n// const style = document.createElement(\"style\");\r\n// style.innerHTML = `\r\n// #customTable {\r\n// table-layout: fixed !important;\r\n// border-collapse: collapse !important;\r\n// }\r\n// #customTable tr {\r\n// display: table-row !important;\r\n// }\r\n// #customTable td {\r\n// display: table-cell !important;\r\n// position: static !important;\r\n// }\r\n// #customTable .header-cell {\r\n// position: static !important;\r\n// }\r\n// #customTable .header-cell > span {\r\n// display: inline !important;\r\n// position: static !important;\r\n// }\r\n// #customTable .header-cell:hover {\r\n// cursor: default !important;\r\n// }\r\n// `;\r\n// document.head.appendChild(style);\r\n// }\r\n\r\naddTable() {\r\n const tableWidth = 825;\r\n const cols = 3;\r\n const cellMinWidth = tableWidth / cols;\r\n\r\n let table = `<br /><table id=\"customTable\" style=\"width: ${tableWidth}px; border-collapse: collapse;\">`;\r\n table += `<tbody>`;\r\n\r\n // Table Header Row\r\n table += `<tr id=\"tableHeaderRow\" style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()};\" onclick=\"checkTableSelection()\">`;\r\n\r\n for (let j = 0; j < cols; j++) {\r\n table += `<td class=\"header-cell\" \r\n style=\"border-top: 2px solid black; \r\n font-weight: bold; \r\n text-align: start; \r\n word-wrap: break-word; \r\n word-break: break-all; \r\n white-space: normal; \r\n min-width: ${cellMinWidth}px; \r\n background-color: inherit !important; \r\n display: table-cell !important;\r\n position: static !important;\r\n height:28px;\"></td>`;\r\n }\r\n\r\n // Properly closing the header row\r\n table += `</tr>`;\r\n\r\n // Data Rows\r\n for (let i = 0; i < 3; i++) {\r\n table += `<tr style=\"border-bottom: ${this.themeModeClrVerticalLineForTable()}\">`;\r\n for (let j = 0; j < cols; j++) {\r\n table += `<td style=\"word-wrap: break-word; \r\n word-break: break-all; \r\n white-space: normal; \r\n min-width: ${cellMinWidth}px;\r\n display: table-cell !important;\r\n position: static !important;\"> </td>`;\r\n }\r\n table += `</tr>`;\r\n }\r\n\r\n table += `</tbody></table><br/>`;\r\n\r\n // Inserting into the editor\r\n const editor = document.getElementById(\"editor\");\r\n if (editor) {\r\n editor.focus();\r\n document.execCommand(\"insertHTML\", false, table);\r\n }\r\n\r\n this.tableAdded = true;\r\n this.checkTableSelection();\r\n\r\n // Add styles to prevent table structure breaking\r\n const style = document.createElement(\"style\");\r\n style.innerHTML = `\r\n #customTable {\r\n table-layout: fixed !important;\r\n border-collapse: collapse !important;\r\n }\r\n #customTable tr {\r\n display: table-row !important;\r\n }\r\n #customTable td {\r\n display: table-cell !important;\r\n position: static !important;\r\n }\r\n #customTable .header-cell {\r\n position: static !important;\r\n }\r\n #customTable .header-cell > span {\r\n display: inline !important;\r\n position: static !important;\r\n }\r\n #customTable .header-cell:hover {\r\n cursor: default !important;\r\n }\r\n`;\r\n document.head.appendChild(style);\r\n}\r\n\r\n\r\n// Function to change the first row (thead) background color\r\nsetTheadBgColor(event: any) {\r\n const selectedColor = event.target.value;\r\n\r\n if (this.selectedTable) {\r\n const headerRow = this.selectedTable.querySelector(\"tr\") as HTMLElement;\r\n\r\n if (headerRow) {\r\n const headerCells = headerRow.querySelectorAll(\".header-cell\");\r\n headerCells.forEach((cell: Element) => {\r\n (cell as HTMLElement).style.backgroundColor = selectedColor;\r\n });\r\n }\r\n }\r\n}\r\n\r\n\r\n\r\n checkTableSelection(event?: MouseEvent) {\r\n let target = event?.target as HTMLElement;\r\n if (target && (target.tagName === 'TD' || target.tagName === 'TH')) {\r\n this.isTableSelected = true;\r\n this.selectedTable = target.closest('table') as HTMLTableElement;\r\n } else {\r\n this.isTableSelected = false;\r\n this.selectedTable = null;\r\n }\r\n \r\n // this.checkPlaceholder();\r\n }\r\n\r\n checkPlaceholder() {\r\n // let editor = document.getElementById('editor');\r\n // if (editor) {\r\n // this.isPlaceholderVisible = editor.innerHTML === '' || editor.innerHTML === '<br>';\r\n // if (this.isPlaceholderVisible) {\r\n // // editor.innerHTML = '<span class=\"placeholder\" style=\"background: transparent; color: #000000\">Insert text here ...</span>';\r\n // } else {\r\n // let placeholder = editor.querySelector('.placeholder');\r\n // if (placeholder) {\r\n // editor.removeChild(placeholder);\r\n // }\r\n // }\r\n // }\r\n }\r\n\r\n onFocus() {\r\n // let editor = document.getElementById('editor');\r\n // if (editor && this.isPlaceholderVisible) {\r\n // editor.innerHTML = '';\r\n // this.isPlaceholderVisible = false;\r\n // }\r\n }\r\n\r\n // colorChange(newColor: string) {\r\n // this.color = newColor;\r\n // }\r\n\r\n onBlur() {\r\n this.checkPlaceholder();\r\n }\r\n\r\n // addRow() {\r\n // if (this.selectedTable) {\r\n // let row = this.selectedTable.insertRow();\r\n // for (let i = 0; i < this.selectedTable.rows[0].cells.length; i++) {\r\n // let cell = row.insertCell(i);\r\n // cell.innerHTML = ' ';\r\n // cell.style.border = '1px solid black';\r\n // }\r\n // }\r\n // }\r\n\r\n addRow() {\r\n if (this.selectedTable) {\r\n let row = this.selectedTable.insertRow();\r\n\r\n // Loop through the columns of the first row to determine the number of cells\r\n for (let i = 0; i < this.selectedTable.rows[0].cells.length; i++) {\r\n let cell = row.insertCell(i);\r\n cell.innerHTML = ' ';\r\n\r\n // Apply bottom border explicitly\r\n cell.style.borderBottom = `2px solid ${this.themeModeClrVerticalLineColorForTable()}`; // You can replace 'black' with your theme color\r\n }\r\n }\r\n}\r\n\r\n// addRow() {\r\n// if (this.selectedTable) {\r\n// let row = this.selectedTable.insertRow();\r\n// row.style.borderBottom = this.themeModeClrVerticalLineForTable(); // Add bottom border to the row\r\n// for (let i = 0; i < this.selectedTable.rows[0].cells.length; i++) {\r\n// let cell = row.insertCell(i);\r\n// cell.innerHTML = ' ';\r\n// }\r\n// }\r\n// }\r\n\r\n\r\n // deleteRow() {\r\n // if (this.selectedTable) {\r\n // this.selectedTable.deleteRow(-1);\r\n // }\r\n // }\r\n\r\n// deleteRow() {\r\n// if (this.selectedTable) {\r\n// let rowIndex = this.selectedTable.rows.length - 1; \r\n// if (window.getSelection) {\r\n// let selection = window.getSelection();\r\n// if (selection) {\r\n// let row = selection.anchorNode?.parentElement?.closest('tr');\r\n// if (row) {\r\n// rowIndex = row.rowIndex;\r\n// }\r\n// }\r\n// }\r\n// this.selectedTable.deleteRow(rowIndex);\r\n// }\r\n// }\r\n\r\n deleteRow() {\r\n const selection = window.getSelection();\r\n if (selection) {\r\n if (!selection.rangeCount) return;\r\n\r\n const range = selection.getRangeAt(0);\r\n const selectedNode = range.startContainer;\r\n const row = selectedNode.parentElement?.closest('tr');\r\n\r\n if (row) {\r\n const table = row.closest('table');\r\n if (table) {\r\n table.deleteRow(row.rowIndex);\r\n }\r\n }\r\n }\r\n}\r\n\r\n\r\n // addColumn() {\r\n // if (this.selectedTable) {\r\n // for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n // let cell = this.selectedTable.rows[i].insertCell(-1);\r\n // cell.innerHTML = ' ';\r\n // cell.style.border = '1px solid black';\r\n // }\r\n // }\r\n // }\r\n\r\n// addColumn() {\r\n// if (this.selectedTable) {\r\n// const columnCount = this.selectedTable.rows[0].cells.length + 1; // New column count\r\n// const tableWidth = this.selectedTable.offsetWidth;\r\n// const minWidth = tableWidth / columnCount;\r\n\r\n// for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n// let cell = this.selectedTable.rows[i].insertCell(-1);\r\n// cell.innerHTML = ' ';\r\n// cell.style.border = '1px solid black';\r\n// cell.style.minWidth = `${minWidth}px`;\r\n// cell.style.wordWrap = 'break-word';\r\n// cell.style.wordBreak = 'break-all';\r\n// cell.style.whiteSpace = 'normal';\r\n// }\r\n\r\n// // Update existing cells' minWidth\r\n// for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n// for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n// this.selectedTable.rows[i].cells[j].style.minWidth = `${minWidth}px`;\r\n// }\r\n// }\r\n// }\r\n // }\r\n \r\n // addColumn() {\r\n // if (this.selectedTable) {\r\n // const columnCount = this.selectedTable.rows[0].cells.length + 1; // New column count\r\n // const tableWidth = this.selectedTable.offsetWidth;\r\n // const minWidth = tableWidth / columnCount;\r\n\r\n // for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n // let cell = this.selectedTable.rows[i].insertCell(-1);\r\n // cell.innerHTML = ' ';\r\n // cell.style.wordWrap = 'break-word';\r\n // cell.style.wordBreak = 'break-all';\r\n // cell.style.whiteSpace = 'normal';\r\n // cell.style.minWidth = `${minWidth}px`;\r\n // cell.style.borderBottom = `2px solid ${this.themeModeClrVerticalLineColorForTable()}`\r\n // }\r\n\r\n // // Update existing rows' bottom border\r\n // for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n // this.selectedTable.rows[i].style.borderBottom = this.themeModeClrVerticalLineForTable();\r\n // }\r\n // }\r\n // }\r\n\r\n addColumn() {\r\n if (this.selectedTable) {\r\n const columnCount = this.selectedTable.rows[0].cells.length + 1; // New column count\r\n const tableWidth = this.selectedTable.offsetWidth;\r\n const minWidth = tableWidth / columnCount;\r\n\r\n // Get the current header background color if any\r\n const firstHeaderCell = this.selectedTable.rows[0]\r\n .cells[0] as HTMLElement;\r\n const headerBgColor = firstHeaderCell\r\n ? firstHeaderCell.style.backgroundColor\r\n : \"\";\r\n\r\n for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n let cell = this.selectedTable.rows[i].insertCell(-1);\r\n cell.innerHTML = \" \";\r\n cell.style.wordWrap = \"break-word\";\r\n cell.style.wordBreak = \"break-all\";\r\n cell.style.whiteSpace = \"normal\";\r\n cell.style.minWidth = `${minWidth}px`;\r\n cell.style.borderBottom = \"1px solid #d3d3d3\";\r\n\r\n // cell.style.borderBottom = `2px solid ${this.themeModeClrVerticalLineColorForTable()}`;\r\n\r\n // If it's the first row, make it a header cell\r\n if (i === 0) {\r\n cell.classList.add(\"header-cell\");\r\n cell.style.fontWeight = \"bold\";\r\n cell.style.textAlign = \"start\";\r\n cell.style.pointerEvents = \"none\";\r\n cell.style.display = \"table-cell\";\r\n cell.style.position = \"static\";\r\n cell.style.borderTop = \"2px solid black\";\r\n // cell.innerText = `Header ${columnCount}`;\r\n\r\n // Apply the same background color as existing headers\r\n if (headerBgColor) {\r\n cell.style.backgroundColor = headerBgColor;\r\n }\r\n }\r\n }\r\n\r\n // Update existing rows' bottom border\r\n // for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n // this.selectedTable.rows[i].style.borderBottom =\r\n // this.themeModeClrVerticalLineForTable();\r\n // }\r\n for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n this.selectedTable.rows[i].cells[j].style.borderBottom = \"1px solid #d3d3d3\";\r\n }\r\n }\r\n }\r\n }\r\n \r\n\r\n\r\n\r\n\r\n deleteColumn() {\r\n if (this.selectedTable) {\r\n if (window.getSelection) {\r\n let selection = window.getSelection();\r\n if (selection) {\r\n let cell = selection.anchorNode?.parentElement?.closest('td, th') as HTMLTableCellElement;\r\n if (cell) {\r\n let cellIndex = cell.cellIndex;\r\n for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n this.selectedTable.rows[i].deleteCell(cellIndex);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n themeModeClrVerticalLineForTable() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '2px solid #414141 !important'\r\n } else {\r\n return '2px solid #5F5F5F !important'\r\n }\r\n }\r\n\r\n themeModeClrVerticalLineColorForTable() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '#414141'\r\n } else {\r\n return '#5F5F5F'\r\n }\r\n }\r\n\r\n adjustTableWidth(event: any) {\r\n if (this.selectedTable) {\r\n this.selectedTable.style.width = event.target.value + 'px';\r\n }\r\n }\r\n\r\n adjustCellWidth(event: any) {\r\n if (this.selectedTable) {\r\n for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n this.selectedTable.rows[i].cells[j].style.width = event.target.value + 'px';\r\n }\r\n }\r\n }\r\n }\r\n\r\n adjustCellHeight(event: any) {\r\n if (this.selectedTable) {\r\n for (let i = 0; i < this.selectedTable.rows.length; i++) {\r\n for (let j = 0; j < this.selectedTable.rows[i].cells.length; j++) {\r\n this.selectedTable.rows[i].cells[j].style.height = event.target.value + 'px';\r\n }\r\n }\r\n }\r\n }\r\n\r\n private setCaretToEnd(element: HTMLElement) {\r\n const range = document.createRange();\r\n const sel = window.getSelection();\r\n if (sel) {\r\n range.selectNodeContents(element);\r\n range.collapse(false);\r\n sel.removeAllRanges();\r\n sel.addRange(range);\r\n }\r\n }\r\n\r\n // openColorPicker(inputId: string) {\r\n // const inputElement = document.getElementById(inputId);\r\n // if (inputElement) {\r\n // inputElement.click();\r\n // }\r\n // }\r\n\r\n // setTextColor(event: any) {\r\n // const editor = document.getElementById('editor');\r\n // if (editor) {\r\n // editor.focus();\r\n // const color = event.target.value;\r\n // this.selectedTextColor = color;\r\n // document.execCommand('foreColor', false, color);\r\n // }\r\n // }\r\n\r\n // setBackgroundColor(event: any) {\r\n // const editor = document.getElementById('editor');\r\n // if (editor) {\r\n // editor.focus();\r\n // const color = event.target.value;\r\n // this.backgroundColor = color;\r\n // document.execCommand('hiliteColor', false, color);\r\n // }\r\n // }\r\n\r\n private savedSelection: Range | null = null;\r\n\r\nopenColorPicker(inputId: string) {\r\n const inputElement = document.getElementById(inputId) as HTMLInputElement;\r\n if (inputElement) {\r\n // Save the current selection\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n this.savedSelection = selection.getRangeAt(0);\r\n }\r\n inputElement.click();\r\n }\r\n}\r\n\r\n// setTextColor(event: any) {\r\n// if (this.savedSelection) {\r\n// const color = event.target.value;\r\n// this.selectedTextColor = color;\r\n\r\n// // Restore the saved selection\r\n// const selection = window.getSelection();\r\n// if (selection) {\r\n// selection.removeAllRanges();\r\n// selection.addRange(this.savedSelection);\r\n\r\n// // Apply the color using a span\r\n// const range = this.savedSelection;\r\n// const span = document.createElement('span');\r\n// span.style.color = color;\r\n// span.textContent = range.toString();\r\n\r\n// // Replace the selected text with the styled span\r\n// range.deleteContents();\r\n// range.insertNode(span);\r\n\r\n// // Clear the saved selection\r\n// this.savedSelection = null;\r\n// }\r\n// }\r\n // }\r\n// setTextColor(event: any) {\r\n// if (this.savedSelection) {\r\n// const color = event.target.value;\r\n// this.selectedTextColor = color;\r\n\r\n// // Restore the saved selection\r\n// const selection = window.getSelection();\r\n// if (selection && selection.rangeCount > 0) {\r\n// const range = this.savedSelection;\r\n// selection.removeAllRanges();\r\n// selection.addRange(range);\r\n\r\n// // Get selected elements\r\n// const selectedContent = range.cloneContents();\r\n// const elements = Array.from(selectedContent.querySelectorAll(\"*\")) as HTMLElement[]; // ✅ Explicitly cast to HTMLElement[]\r\n\r\n// // Apply color to each element without modifying structure\r\n// elements.forEach((el) => {\r\n// el.style.color = color;\r\n// });\r\n\r\n// // Apply color to the top-level text nodes (without wrapping them)\r\n// Array.from(selectedContent.childNodes).forEach((node) => {\r\n// if (node.nodeType === Node.TEXT_NODE && node.textContent?.trim() !== \"\") {\r\n// const parent = range.commonAncestorContainer.parentElement;\r\n// if (parent) {\r\n// parent.style.color = color;\r\n// }\r\n// }\r\n// });\r\n\r\n// // Replace selected content\r\n// range.deleteContents();\r\n// range.insertNode(selectedContent);\r\n\r\n// // Clear saved selection\r\n// this.savedSelection = null;\r\n// }\r\n// }\r\n// }\r\n\r\nsetTextColor(event: any) {\r\n console.log(\"Clicked setTextColor\");\r\n if (!this.savedSelection) {\r\n console.warn(\"No saved selection available!\");\r\n return;\r\n }\r\n\r\n const color = event.target.value;\r\n this.selectedTextColor = color;\r\n const selection = window.getSelection();\r\n\r\n if (!selection || selection.rangeCount === 0) {\r\n console.error(\"No valid selection found!\");\r\n return;\r\n }\r\n\r\n selection.removeAllRanges();\r\n selection.addRange(this.savedSelection);\r\n const range = this.savedSelection;\r\n\r\n const getTableCell = (node: Node | null): HTMLElement | null => {\r\n let currentNode = node;\r\n if (currentNode && currentNode.nodeType === Node.TEXT_NODE) {\r\n currentNode = currentNode.parentNode;\r\n }\r\n\r\n while (currentNode && currentNode instanceof HTMLElement) {\r\n if (currentNode.tagName === \"TD\" || currentNode.tagName === \"TH\") {\r\n return currentNode;\r\n }\r\n currentNode = currentNode.parentElement;\r\n }\r\n return null;\r\n };\r\n\r\n const tableCell =\r\n getTableCell(range.commonAncestorContainer) ||\r\n getTableCell(range.startContainer) ||\r\n getTableCell(range.endContainer);\r\n\r\n if (tableCell) {\r\n console.log(`Processing ${tableCell.tagName} element`);\r\n const selectedText = selection.toString();\r\n\r\n if (selectedText) {\r\n console.log(`Selected text in ${tableCell.tagName}:`, selectedText);\r\n const textNodes: Text[] = [];\r\n const walker = document.createTreeWalker(\r\n tableCell,\r\n NodeFilter.SHOW_TEXT,\r\n null\r\n );\r\n let node: Text | null;\r\n\r\n while ((node = walker.nextNode() as Text | null)) {\r\n textNodes.push(node);\r\n }\r\n\r\n for (const textNode of textNodes) {\r\n const text = textNode.textContent || \"\";\r\n const index = text.indexOf(selectedText);\r\n\r\n if (index !== -1) {\r\n console.log(\r\n `Found selected text in ${tableCell.tagName} text node`\r\n );\r\n\r\n const span = document.createElement(\"span\");\r\n span.style.color = color;\r\n span.textContent = selectedText;\r\n\r\n const beforeText = text.slice(0, index);\r\n const afterText = text.slice(index + selectedText.length);\r\n\r\n const fragment = document.createDocumentFragment();\r\n if (beforeText)\r\n fragment.appendChild(document.createTextNode(beforeText));\r\n fragment.appendChild(span);\r\n if (afterText)\r\n fragment.appendChild(document.createTextNode(afterText));\r\n\r\n textNode.replaceWith(fragment);\r\n break; // Apply only once per selection\r\n }\r\n }\r\n }\r\n } else {\r\n console.log(\"No TH or TD element found in selection\");\r\n return;\r\n }\r\n\r\n this.savedSelection = null;\r\n}\r\n\r\n setBackgroundColor(event: any) {\r\n if (this.savedSelection) {\r\n const color = event.target.value;\r\n this.backgroundColor = color;\r\n\r\n // Restore the saved selection\r\n const selection = window.getSelection();\r\n if (selection) {\r\n selection.removeAllRanges();\r\n selection.addRange(this.savedSelection);\r\n\r\n // Apply the background color using a span\r\n const range = this.savedSelection;\r\n const span = document.createElement('span');\r\n span.style.backgroundColor = color;\r\n span.textContent = range.toString();\r\n\r\n // Replace the selected text with the styled span\r\n range.deleteContents();\r\n range.insertNode(span);\r\n\r\n // Clear the saved selection\r\n this.savedSelection = null;\r\n }\r\n }\r\n }\r\n \r\n // colorChanged(event: any) {\r\n // this.color = event.color.hex; \r\n // }\r\n\r\n public logEvent(event: any, trigger: any) {\r\n const color = event;\r\n this.setTextColor(color)\r\n this.selectedTextColor = event\r\n document.execCommand('foreColor', false, event);\r\n // this.logs.unshift([this.logs.length + 1, trigger, event]);\r\n }\r\n \r\n\r\n editImage() {\r\n let data \r\n switch (this.editorFrom.name) {\r\n case 'section-content':\r\n data = { editIMG: true, from: 'htmlEditor', index: this.selectedItemIndex, id: this.editorFrom.id };\r\n const compressedData: string = compress(JSON.stringify(this.imageEditUrl));\r\n sessionStorage.setItem('editImageFromTemp', compressedData);\r\n const compressedData2 = compress(JSON.stringify(this.sanitizedContent));\r\n sessionStorage.setItem('textEditor', compressedData2);\r\n // alert('go to editor!')\r\n this.navigateToIMGEditor(data);\r\n this.imageEdit.emit()\r\n break;\r\n case 'create-document':\r\n this.imageEdit.emit()\r\n data = { editIMG: true, from: 'createDocument', index: this.selectedItemIndex, id: this.editorFrom.id, section: this.editorFrom.section, reportSectionId: this.editorFrom.reportSectionId };\r\n // this.openDialog(data)\r\n const compressedData3 = compress(JSON.stringify(this.imageEditUrl));\r\n const compressedData4 = compress(this.editorText);\r\n\r\n sessionStorage.setItem('editImageFromTemp2', compressedData3);\r\n sessionStorage.setItem('textEditor2', compressedData4);\r\n this.navigateToIMGEditor(data);\r\n break;\r\n default:\r\n null\r\n // sessionStorage.removeItem('editImageFromTemp');\r\n // sessionStorage.removeItem('editImageFromTemp2');\r\n // sessionStorage.removeItem('templateEditor');\r\n // sessionStorage.removeItem('textEditor');\r\n break;\r\n }\r\n // if (this.editorFrom === 'section-content') {\r\n // const data = {editIMG: true, from: 'htmlEditor', index: this.selectedItemIndex}\r\n // this.navigateToIMGEditor(data)\r\n // sessionStorage.setItem('editImageFromTemp', JSON.stringify(this.imageEditUrl))\r\n // sessionStorage.setItem('textEditor', this.editorText)\r\n // } \r\n \r\n }\r\n\r\n openDialog( item: any): void {\r\n // let data: any;\r\n // data = item\r\n // const dialogRef = this.dialog.open(ImageEditorModalComponent,{\r\n // minWidth: '100%', minHeight: '100vh', panelClass: 'theme-2B2936' ,disableClose: true, data: data\r\n // });\r\n // dialogRef.afterClosed().subscribe(result => {\r\n // console.log('result ===> img = ', result)\r\n // const imgUrl = sessionStorage.getItem('editImageFromTemp2');\r\n // if (imgUrl) {\r\n // this.replaceImageSrc(imgUrl, result.index.index);\r\n // sessionStorage.removeItem('editImageFromTemp2');\r\n // }\r\n // });\r\n }\r\n\r\n replaceImageSRC(newSrc: string, index: number) {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(this.editorText, 'text/html');\r\n const imgTags = doc.getElementsByTagName('img');\r\n\r\n if (imgTags && imgTags.length > 0) {\r\n if (index >= 0 && index < imgTags.length) {\r\n // Update the src attribute of the img at the specified index\r\n \r\n imgTags[index].setAttribute('src', newSrc);\r\n this.editorText = doc.body.innerHTML;\r\n \r\n } \r\n } \r\n }\r\n\r\n navigateToIMGEditor(data: any) {\r\n this.router.navigate(['/admin/image-editor'], { queryParams: {data : JSON.stringify(data)} })\r\n }\r\n\r\n // onTextSelect(event: MouseEvent): void {\r\n // if (this.toolbarMode === 'bubble') {\r\n // const selection = window.getSelection();\r\n // if (selection && selection.rangeCount > 0) {\r\n // const range = selection.getRangeAt(0);\r\n // if (!range.collapsed) {\r\n // const rect = range.getBoundingClientRect();\r\n // this.toolbarTop = rect.bottom + window.scrollY + 10;\r\n // this.toolbarLeft = rect.left + window.scrollX + (rect.width / 2) - 50;\r\n // this.showToolbar = true;\r\n // } else {\r\n // this.showToolbar = false;\r\n // }\r\n // }\r\n // }\r\n // }\r\n\r\n onTextSelect(event?: MouseEvent): void {\r\n if (this.toolbarMode === 'bubble') {\r\n const selection = window.getSelection();\r\n if (selection && selection.rangeCount > 0) {\r\n const range = selection.getRangeAt(0);\r\n if (!range.collapsed) {\r\n const rect = range.getBoundingClientRect();\r\n const scrollY = document.documentElement.scrollTop;\r\n const scrollX = document.documentElement.scrollLeft;\r\n this.toolbarTop = rect.top + scrollY - 75;\r\n this.toolbarLeft = rect.left + scrollX + (rect.width / 2) - 325;\r\n this.showToolbar = true;\r\n } else {\r\n this.showToolbar = false;\r\n }\r\n } else {\r\n this.showToolbar = false;\r\n }\r\n }\r\n}\r\n\r\n\r\n// onPaste(event: ClipboardEvent) {\r\n// event.preventDefault();\r\n// const clipboardData = event.clipboardData;\r\n// if (clipboardData) {\r\n// const pastedText = clipboardData.getData('text/plain');\r\n// if (this.isTableData(pastedText)) {\r\n// const html = this.convertTextToTable(pastedText);\r\n// this.insertHtmlAtCaret(html);\r\n// } else {\r\n// this.insertHtmlAtCaret(pastedText);\r\n// }\r\n// }\r\n// }\r\n\r\n // onPaste(event: ClipboardEvent) {\r\n // event.preventDefault();\r\n // const clipboardData = event.clipboardData;\r\n // if (clipboardData) {\r\n // // Handle image data\r\n // const items = clipboardData.items;\r\n // for (let i = 0; i < items.length; i++) {\r\n // if (items[i].type.startsWith('image/')) {\r\n // const file = items[i].getAsFile();\r\n // if (file) {\r\n // const reader = new FileReader();\r\n // reader.onload = (e: any) => {\r\n // const imgHtml = `<img src=\"${e.target.result}\" alt=\"Pasted Image\" style=\"max-width: 100%;\"/>`;\r\n // this.insertHtmlAtCaret(imgHtml);\r\n // };\r\n // reader.readAsDataURL(file);\r\n // return; // Exit if an image is handled\r\n // }\r\n // }\r\n // }\r\n\r\n // // Handle text or table data\r\n // const pastedText = clipboardData.getData('text/plain');\r\n // if (this.isTableData(pastedText)) {\r\n // const html = this.convertTextToTable(pastedText);\r\n // this.insertHtmlAtCaret(html);\r\n // } else {\r\n // this.insertHtmlAtCaret(pastedText);\r\n // }\r\n // }\r\n // }\r\n\r\n onPaste(event: ClipboardEvent) {\r\n event.preventDefault();\r\n const clipboardData = event.clipboardData;\r\n if (clipboardData) {\r\n for (let i = 0; i < clipboardData.items.length; i++) {\r\n const item = clipboardData.items[i];\r\n\r\n if (item.type.startsWith(\"image/\")) {\r\n // Handle image paste\r\n const file = item.getAsFile();\r\n if (file) {\r\n const reader = new FileReader();\r\n reader.onload = (e: any) => {\r\n const imgHtml = `<img src=\"${e.target.result}\" alt=\"Pasted Image\" style=\"max-width: 100%;\" />`;\r\n this.insertHtmlAtCaret(imgHtml);\r\n };\r\n reader.readAsDataURL(file);\r\n return;\r\n }\r\n } else if (item.type === \"text/html\") {\r\n // Handle HTML paste\r\n // const htmlData = clipboardData.getData(\"text/html\");\r\n if (this.isTableData(clipboardData.getData('text/html'))) {\r\n const html = this.convertTextToTable(clipboardData.getData('text/html'));\r\n this.insertHtmlAtCaret(html);\r\n } else {\r\n this.insertHtmlAtCaret(clipboardData.getData('text/html'));\r\n }\r\n // this.insertHtmlAtCaret(htmlData);\r\n return;\r\n } else if (item.type === \"text/plain\") {\r\n // Handle plain text paste\r\n if (this.isTableData(clipboardData.getData('text/plain'))) {\r\n const html = this.convertTextToTable(clipboardData.getData('text/plain'));\r\n this.insertHtmlAtCaret(html);\r\n } else {\r\n this.insertHtmlAtCaret(clipboardData.getData('text/plain'));\r\n }\r\n // const plainText = clipboardData.getData(\"text/plain\");\r\n // this.insertHtmlAtCaret(plainText);\r\n return;\r\n }\r\n }\r\n }\r\n }\r\n\r\n isExcelData(html: string): boolean {\r\n return html.includes('xmlns:o=\"urn:schemas-microsoft-com:office:office\"') || \r\n html.includes('xmlns:x=\"urn:schemas-microsoft-com:office:excel\"');\r\n }\r\n\r\n convertExcelHtmlToTable(html: string): string {\r\n const parser = new DOMParser();\r\n const doc = parser.parseFromString(html, 'text/html');\r\n const table = doc.querySelector('table');\r\n return table ? table.outerHTML : ''; // Extract only the table part\r\n }\r\n\r\n\r\n\r\n\r\n isTableData(text: string): boolean {\r\n const rows = text.split('\\n');\r\n return rows.length > 1 && rows[0].split('\\t').length > 1;\r\n }\r\n\r\n // convertTextToTable(text: string): string {\r\n // const rows = text.split('\\n').filter(row => row.trim() !== '');\r\n // const tableRows = rows.map(row => {\r\n // const cells = row.split('\\t').map(cell => `<td class=\"px-1 py-1\" >${cell}</td>`).join('');\r\n // return `<tr class=\"table-border-top\" style=\"border-top: ${this.themeModeTableBorderTop()}; width: 100% !important\">${cells}</tr>`;\r\n // }).join('');\r\n // return `<table>${tableRows}</table>`;\r\n // }\r\n\r\n convertTextToTable(text: string): string {\r\n const rows = text.split('\\n').filter(row => row.trim() !== '');\r\n const columnCount = rows[0]?.split('\\t').length || 1; // Get the number of columns from the first row\r\n const columnWidth = 100 / columnCount; // Calculate column width\r\n\r\n const tableRows = rows.map((row, index) => {\r\n const cells = row.split('\\t').map(cell => `\r\n <td class=\"px-1 py-1 text-truncate\" \r\n style=\"max-width: ${columnWidth}%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">\r\n ${cell}\r\n </td>`).join('');\r\n\r\n // Add a border-top for all rows except the first and border-bottom for the last row\r\n const borderTop = index === 0 ? '' : `border-top: ${this.themeModeTableBorderTop()};`;\r\n const borderBottom = index === rows.length - 1 ? `border-bottom: ${this.themeModeTableBorderTop()};` : '';\r\n\r\n return `\r\n <tr \r\n style=\"${borderTop} ${borderBottom} width: 100% !important;\">\r\n ${cells}\r\n </tr>`;\r\n }).join('');\r\n\r\n return `\r\n <table style=\"table-layout: fixed; width: 100%;\"> \r\n ${tableRows}\r\n </table>`;\r\n }\r\n\r\n\r\n\r\n insertHtmlAtCaret(html: string) {\r\n const range = window.getSelection()?.getRangeAt(0);\r\n if (range) {\r\n range.deleteContents();\r\n const tempDiv = document.createElement('div');\r\n tempDiv.innerHTML = html;\r\n const frag = document.createDocumentFragment();\r\n let node;\r\n while ((node = tempDiv.firstChild)) {\r\n frag.appendChild(node);\r\n }\r\n range.insertNode(frag);\r\n range.collapse(false);\r\n }\r\n }\r\n\r\n themeModeTableBorderTop() {\r\n const clrMode = document.body.getAttribute('data-layout-color')\r\n if (clrMode == 'dark') {\r\n return '1px solid #D0D0D0; !important'\r\n } else {\r\n return '1px solid #414141 !important'\r\n }\r\n }\r\n\r\n \r\n public openFullscreen() {\r\n var elem: any = document.getElementById(\"textEditor\");\r\n this.isFullScreen = true;\r\n if (elem.requestFullscreen) {\r\n elem.requestFullscreen();\r\n } else if (elem.mozRequestFullScreen) {\r\n elem.mozRequestFullScreen();\r\n } else if (elem.webkitRequestFullscreen) {\r\n elem.webkitRequestFullscreen();\r\n } else if (elem.msRequestFullscreen) {\r\n elem.msRequestFullscreen();\r\n }\r\n this.style = {\r\n 'min-height': '90vh',\r\n 'max-height': '90vh',\r\n }\r\n }\r\n\r\n public closeFullscreen() {\r\n if (document.exitFullscreen) {\r\n document.exitFullscreen();\r\n this.isFullScreen = false;\r\n this.style = {\r\n 'min-height': '400px',\r\n 'max-height': '400px',\r\n }\r\n }\r\n }\r\n \r\n clearTextEditor() {\r\n this.editorTextClear.emit()\r\n }\r\n\r\n setupHistory() {\r\n this.saveState();\r\n const editor = document.getElementById('editor');\r\n \r\n if (editor) {\r\n editor.addEventListener('input', () => this.onInput());\r\n }\r\n }\r\n\r\n onInput() {\r\n this.saveState();\r\n }\r\n\r\n saveState() {\r\n const editor = document.getElementById('editor');\r\n \r\n if (editor) {\r\n const editorContent = editor.innerHTML;\r\n if (this.historyIndex === this.history.length - 1) {\r\n this.history.push(editorContent);\r\n this.redoStack = [];\r\n } else {\r\n this.history = this.history.slice(0, this.historyIndex + 1);\r\n this.history.push(editorContent);\r\n this.redoStack = [];\r\n }\r\n this.historyIndex++;\r\n }\r\n }\r\n undo() {\r\n if (this.historyIndex > 0) {\r\n this.redoStack.push(this.history[this.historyIndex]);\r\n this.historyIndex--;\r\n const editor = document.getElementById('editor');\r\n \r\n if (editor) {\r\n this.sanitizedContent = this.history[this.historyIndex];\r\n }\r\n }\r\n }\r\n\r\n redo() {\r\n if (this.redoStack.length > 0) {\r\n const redoContent = this.redoStack.pop();\r\n this.history.push(redoContent!);\r\n this.historyIndex++;\r\n const editor = document.getElementById('editor');\r\n \r\n if (editor) {\r\n this.sanitizedContent = redoContent!;\r\n }\r\n }\r\n }\r\n\r\n// formatTextWithDates(text: string): string {\r\n// // Regular expression to detect YYYY-MM-DD formatted dates\r\n// const dateRegex = /\\b\\d{4}-\\d{2}-\\d{2}\\b/g;\r\n\r\n// // Replace found dates with a formatted version\r\n// return text.replace(dateRegex, (dateStr) => {\r\n// // Convert the detected date string into a Date object\r\n// const dateObj = new Date(dateStr);\r\n \r\n// // Format the date to 'Month Day, Year' (e.g., October 10, 2024)\r\n// return dateObj.toLocaleDateString('en-US', {\r\n// year: 'numeric',\r\n// month: 'long',\r\n// day: 'numeric',\r\n// });\r\n// });\r\n // }\r\n \r\n formatTextWithDates(text: string): string {\r\n // Regular expression to detect YYYY-MM-DD formatted dates\r\n const dateRegex = /\\b\\d{4}-\\d{2}-\\d{2}\\b/g;\r\n\r\n // Replace found dates with a formatted version\r\n return text.replace(dateRegex, (dateStr) => {\r\n // Convert the detected date string into a Date object\r\n const dateObj = new Date(dateStr);\r\n\r\n // Extract day, month, and year\r\n const day = dateObj.getDate().toString().padStart(2, '0'); // Ensure day is two digits\r\n const month = dateObj.toLocaleString('en-US', { month: 'short' }); // Get abbreviated month name\r\n const year = dateObj.getFullYear(); // Get full year\r\n\r\n // Format the date as 'dd/mmm/yyyy'\r\n return `${day}/${month}/${year}`;\r\n });\r\n}\r\n\r\n\r\n}","<div class=\"container els-text-editor px-0\" id=\"textEditor\" #fullscreen=\"ngxFullscreen\"\r\n #textEditor\r\n ngxFullscreen>\r\n <div *ngIf=\"toolbarMode === 'fixed'\" class=\"btn-toolbar els-btn-toolbar p-2 py-2 mb-0\" role=\"toolbar\" [style.background]=\"themeModeBgClr()\"\r\n [ngStyle]=\"{\r\n 'pointer-events': disableToolbar ? 'none' : 'auto',\r\n 'border-top-left-radius': IsOpen ? '0' : '20px',\r\n 'border-top-right-radius': IsOpen ? '0' : '20px'\r\n}\"\r\naria-label=\"Toolbar with button groups\"\r\nstyle=\"border-top-left-radius: 20px !important; border-top-right-radius: 20px !important;\"\r\n>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\" [style.border-radius]=\"'5px'\"\r\n id=\"headerDropdown\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\" ngbDropdownToggle>\r\n <span>{{selectedFormatBlock | titlecase}}</span> <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" [style.color]=\"themeModeClr()\"\r\n (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <!-- <select class=\"els-form-select \" style=\" font-weight: 700 !important; color: #fff;border: 2px solid #7D6D6D !important;\" \r\n [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option class=\"els-form-option\" *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select> -->\r\n <div ngbDropdown class=\"dropdown\">\r\n <button\r\n class=\"btn btn-white els-form-select border els-toolbar-dropdown-button dropdown-toggle text-start\"\r\n id=\"headerDropdown\" style=\"width: 100px\" [style.border]=\"themeMode()\" [style.color]=\"themeModeClr()\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px; font-weight: 700 !important;\" class=\"text-truncate\">{{selectedFont |\r\n titlecase}}</span>\r\n <i class=\"mdi mdi-chevron-down \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\" class=\"els-text-format\"\r\n [style.border]=\"themeMode()\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" *ngFor=\"let font of fonts\"\r\n (click)=\"changeFont(font)\" [style.color]=\"themeModeClr()\">\r\n <span>{{ font }}</span>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"py-0\" style=\"height: fit-content;\" [style.color]=\"themeModeClr()\">\r\n <div class=\"btn-group els-button-group me-2 mr-2 \" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"format('insertUnorderedList')\"><i class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyLeft')\"><i class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyCenter')\"><i class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyRight')\"><i class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button text-dark\"\r\n (click)=\"format('justifyFull')\"><i class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n <div class=\"vertical-line ms-2 border\" [style.border-left]=\"themeModeClrVerticalLine()\"></div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addRow()\"><i class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n <button \r\n \r\n type=\"button\" \r\n class=\"btn btn-white els-toolbar-button\" \r\n *ngIf=\"isTableSelected\" \r\n [style.color]=\"tHeadBgColor\" \r\n (click)=\"openColorPicker('tHeadbgColorPicker')\" \r\n > \r\n <i class=\"mdi mdi-table-edit\"></i> \r\n </button> \r\n <input \r\n type=\"color\" \r\n id=\"tHeadbgColorPicker\" \r\n style=\" \r\n position: absolute; \r\n top: 100%; \r\n left: 0; \r\n z-index: 100; \r\n opacity: 0; \r\n \" \r\n (change)=\"setTheadBgColor($event)\" \r\n />\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"undo()\">\r\n <i class=\"mdi mdi-undo\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"redo()\">\r\n <i class=\"mdi mdi-redo\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <!-- <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button> -->\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"clearTextEditor()\"\r\n style=\" width: fit-content !important;\">\r\n <i class=\"mdi mdi-close-circle\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" (click)=\"toggleFullscreen1()\">\r\n <ng-container *ngIf=\"IsOpen; else fullscreenIcon\">\r\n <i class=\"mdi mdi-fullscreen-exit\"></i> <!-- Collapse Icon -->\r\n </ng-container>\r\n <ng-template #fullscreenIcon>\r\n <i class=\"mdi mdi-fullscreen\"></i> <!-- Expand Icon -->\r\n </ng-template>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div *ngIf=\"toolbarMode === 'bubble'\" class=\"bubble-toolbar border p-2\"\r\n [ngStyle]=\"{'top.px': toolbarTop, 'left.px': toolbarLeft, 'display': showToolbar ? 'block' : 'none'}\">\r\n <div class=\"btn-group els-button-group\" role=\"group\" aria-label=\"Font Options\">\r\n <select class=\"els-form-select\" [(ngModel)]=\"selectedFont\" (change)=\"changeFont($event)\">\r\n <option *ngFor=\"let font of fonts\" [value]=\"font\">{{ font }}</option>\r\n </select>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isBoldActive\"\r\n (click)=\"format('bold')\">\r\n <i class=\"mdi mdi-format-bold\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isItalicActive\"\r\n (click)=\"format('italic')\">\r\n <i class=\"mdi mdi-format-italic\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isUnderlineActive\"\r\n (click)=\"format('underline')\">\r\n <i class=\"mdi mdi-format-underline\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isStrikethroughActive\"\r\n (click)=\"format('strikethrough')\">\r\n <i class=\"mdi mdi-format-strikethrough-variant\"></i>\r\n </button>\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('blockquote')\"><i\r\n class=\"mdi mdi-format-quote-close\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertCodeBlock()\"><i \r\n class=\"mdi mdi-code-tags\"></i></button>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertOrderedList')\"><i\r\n class=\"mdi mdi-format-list-numbered\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('insertUnorderedList')\"><i\r\n class=\"mdi mdi-format-list-bulleted\"></i></button>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Color Formatting\"> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Text Color\">\r\n <!-- <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-outline-primary arrow-none text-secondary\" id=\"dropdownBasic1\"\r\n aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-color-fill\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 300px;\">\r\n <color-sketch color=\"#fff\" (onChangeComplete)=\"setTextColor($event)\"></color-sketch>\r\n </div>\r\n </div> -->\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\" ngx-colors-trigger [(ngModel)]=\"color\"\r\n (ngModelChange)=\"logEvent($event, 'ngModelChange')\"\r\n (change)=\"logEvent($event, 'change')\"\r\n (input)=\"logEvent($event, 'input')\"\r\n >\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"\r\n [style]=\"{color: color}\"></i>\r\n <ngx-colors style=\"display: none;\" ></ngx-colors>\r\n </div> -->\r\n <input type=\"color\" id=\"textColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setTextColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" style=\"position: relative;\"\r\n (click)=\"openColorPicker('textColorPicker')\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"selectedTextColor\"></i>\r\n </button>\r\n </div>\r\n\r\n <!-- <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\">\r\n <input type=\"color\" id=\"bgColorPicker\" style=\"display: none;\" (change)=\"setBackgroundColor($event)\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n </div> -->\r\n <div class=\"btn-group\" role=\"group\" aria-label=\"Background Color\" style=\"position: relative;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [style.color]=\"backgroundColor\"\r\n (click)=\"openColorPicker('bgColorPicker')\">\r\n <i class=\"mdi mdi-alpha-a-box\"></i>\r\n </button>\r\n <!-- <input style=\"width: 0px !important;\" id=\"bgColorPicker\" [cpPresetColors]=\"['#fff', '#000', '#2889e9', '#e920e9', '#fff500', 'rgb(236,64,64)']\"\r\n [(colorPicker)]=\"color\" (change)=\"setBackgroundColor($event)\" /> -->\r\n <input type=\"color\" id=\"bgColorPicker\"\r\n style=\"position: absolute; top: 100%; left: 0; z-index: 100; opacity: 0;\"\r\n (change)=\"setBackgroundColor($event)\">\r\n </div>\r\n\r\n\r\n <!-- </div> -->\r\n </div>\r\n <!-- <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-button dropdown-toggle\" type=\"button\" id=\"headerDropdown\"\r\n data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">\r\n <i class=\"mdi mdi-format-header-1\"></i>\r\n </button>\r\n <div class=\"dropdown-menu\" aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\"><i\r\n class=\"mdi mdi-format-header-1\"></i> Heading 1</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\"><i\r\n class=\"mdi mdi-format-header-2\"></i> Heading 2</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\"><i\r\n class=\"mdi mdi-format-header-3\"></i> Heading 3</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\"><i\r\n class=\"mdi mdi-format-header-4\"></i> Heading 4</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\"><i\r\n class=\"mdi mdi-format-header-5\"></i> Heading 5</button>\r\n <button class=\"dropdown-item\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\"><i\r\n class=\"mdi mdi-format-header-6\"></i> Heading 6</button>\r\n </div>\r\n </div>\r\n </div> -->\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Header Options\">\r\n <div ngbDropdown class=\"dropdown\">\r\n <button class=\"btn btn-white els-toolbar-dropdown-button dropdown-toggle\" id=\"headerDropdown\"\r\n ngbDropdownToggle>\r\n <span style=\"width: 85px;\">{{selectedFormatBlock | titlecase}}</span> <i\r\n class=\"mdi mdi-chevron-down text-dark\"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"headerDropdown\">\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h1>')\">\r\n <h1>Heading 1</h1>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h2>')\">\r\n <h2>Heading 2</h2>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h3>')\">\r\n <h3>Heading 3</h3>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h4>')\">\r\n <h4>Heading 4</h4>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h5>')\">\r\n <h5>Heading 5</h5>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<h6>')\">\r\n <h6>Heading 6</h6>\r\n </button>\r\n <button class=\"dropdown-item pb-0\" type=\"button\" (click)=\"format('formatBlock', '<p>')\">\r\n <p>Normal</p>\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <!-- <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('superscript')\"><i\r\n class=\"mdi mdi-format-superscript\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('subscript')\"><i\r\n class=\"mdi mdi-format-subscript\"></i></button> -->\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSubscriptActive\"\r\n (click)=\"format('subscript')\">\r\n <i class=\"mdi mdi-format-subscript\"></i>\r\n </button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" [class.active]=\"isSuperscriptActive\"\r\n (click)=\"format('superscript')\">\r\n <i class=\"mdi mdi-format-superscript\"></i>\r\n </button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <div ngbDropdown class=\"ql-align\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button arrow-none text-secondary\"\r\n id=\"dropdownBasic1\" aria-expanded=\"false\" ngbDropdownToggle>\r\n <i class=\"mdi mdi-format-align-left \"></i>\r\n </button>\r\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\" style=\"width: 3px;\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyLeft')\"><i\r\n class=\"mdi mdi-format-align-left\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyCenter')\"><i\r\n class=\"mdi mdi-format-align-center\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyRight')\"><i\r\n class=\"mdi mdi-format-align-right\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('justifyFull')\"><i\r\n class=\"mdi mdi-format-align-justify\"></i></button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"format('removeFormat')\"><i\r\n class=\"mdi mdi-format-clear\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Text Formatting\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addLink()\"><i\r\n class=\"mdi mdi-link-variant\"></i></button>\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"insertsImage()\"><i\r\n class=\"mdi mdi-image\"></i></button>\r\n <input type=\"file\" id=\"imageInput\" style=\"display: none;\" (change)=\"handleImageUpload($event)\" accept=\"image/*\">\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addTable()\"><i\r\n class=\"mdi mdi-table\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\" (click)=\"addRow()\"><i\r\n class=\"mdi mdi-table-row-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteRow()\"><i class=\"mdi mdi-table-row-remove\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"addColumn()\"><i class=\"mdi mdi-table-column-plus-after\"></i></button>\r\n <button *ngIf=\"isTableSelected\" type=\"button\" class=\"btn btn-white els-toolbar-button\"\r\n (click)=\"deleteColumn()\"><i class=\"mdi mdi-table-column-remove\"></i></button>\r\n </div>\r\n <div class=\"btn-group els-button-group mr-2\" role=\"group\" aria-label=\"Table Options\">\r\n <button *ngIf=\"selectedImage\" class=\"btn btn-white els-toolbar-button-2\" (click)=\"editImage()\"\r\n style=\"position: absolute;\">Edit Image</button>\r\n </div>\r\n\r\n\r\n <!-- <div class=\"btn btn-white els-toolbar-button custom-color-trigger\">\r\n <i class=\"mdi mdi-format-color-text icon-with-underline\" [style.color]=\"color\"></i>\r\n <ngx-colors [(ngModel)]=\"color\" (change)=\"colorChanged($event)\"></ngx-colors>\r\n </div> -->\r\n <!-- <div class=\"btn-group els-button-group\" ngbDropdown aria-label=\"Table Options\">\r\n <button class=\"btn btn-white els-toolbar-button\" ngbDropdownToggle (click)=\"addTable()\">\r\n <i class=\"mdi mdi-table\"></i>\r\n </button>\r\n \r\n <div ngbDropdownMenu *ngIf=\"isTableSelected || tableAdded\">\r\n <button class=\"dropdown-item\" (click)=\"addRow()\">\r\n <i class=\"mdi mdi-table-row-plus-after\"></i> Add Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteRow()\">\r\n <i class=\"mdi mdi-table-row-remove\"></i> Delete Row\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"addColumn()\">\r\n <i class=\"mdi mdi-table-column-plus-after\"></i> Add Column\r\n </button>\r\n <button class=\"dropdown-item\" (click)=\"deleteColumn()\">\r\n <i class=\"mdi mdi-table-column-remove\"></i> Delete Column\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"tableWidth\">Table Width</label>\r\n <input type=\"number\" id=\"tableWidth\" class=\"form-control\" (change)=\"adjustTableWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellWidth\">Cell Width</label>\r\n <input type=\"number\" id=\"cellWidth\" class=\"form-control\" (change)=\"adjustCellWidth($event)\"\r\n placeholder=\"Width\">\r\n </div>\r\n <div class=\"dropdown-item\">\r\n <label for=\"cellHeight\">Cell Height</label>\r\n <input type=\"number\" id=\"cellHeight\" class=\"form-control\" (change)=\"adjustCellHeight($event)\"\r\n placeholder=\"Height\">\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus\" #editor\r\n style=\"position: relative !important;border-bottom-left-radius: 20px !important; border-bottom-right-radius: 20px !important; border-bottom-left-radius: 20px !important;\" [style.background]=\"themeModeBgClr()\" [style.border-top]=\"themeModeBorderTop()\"\r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px'}\" [style]=\"style\"\r\n [style.min-height]=\"IsOpen ? '85vh !important' : '405px !important'\"\r\n (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\" (blur)=\"onBlur()\"\r\n (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <!-- <div contenteditable=\"true\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important;\r\n \" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\"\r\n \r\n [ngStyle]=\"{'font-family': selectedFont, 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': isOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': isOpen ? '0' :'20px'\r\n }\"\r\n [style.min-height]=\"IsOpen ? '93vh' : '405px'\" (input)=\"onModelChange($event)\" placeholder=\"Insert text here ...\"\r\n readonly (mouseup)=\"onTextSelect($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\"\r\n (focus)=\"onFocus()\" (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\">\r\n </div> -->\r\n <div [attr.contenteditable]=\"contentEditable\" id=\"editor\" class=\"p-3 custom-scrollbar non-focus overflow-auto\" #editor\r\n style=\"position: relative !important; overflow: auto;\" [style.background]=\"themeModeBgClr()\"\r\n [style.border-top]=\"themeModeBorderTop()\" [ngStyle]=\"{\r\n 'font-family': selectedFont, \r\n 'font-size': selectedFontSize + 'px',\r\n 'border-bottom-left-radius': IsOpen ? '0' :'20px',\r\n 'border-bottom-right-radius': IsOpen ? '0' :'20px',\r\n 'min-height': IsOpen ? '93vh' : '405px',\r\n 'max-height': IsOpen ? '93vh' : '405px'\r\n }\" placeholder=\"Insert text here ...\" readonly (mouseup)=\"onTextSelect($event)\"\r\n (input)=\"onModelChange($event)\" [innerHTML]=\"sanitizedContent\" (paste)=\"onPaste($event)\" (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\" (click)=\"checkTableSelection($event)\" (keydown.Tab)=\"handleTabKey($event)\">\r\n </div>\r\n\r\n <table *ngIf=\"parsedTable\">\r\n <thead>\r\n <tr>\r\n <th *ngFor=\"let header of parsedTable.headers\">{{ header }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of parsedTable.rows\">\r\n <td *ngFor=\"let cell of row\">{{ cell }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n\r\n</div>","import { NgModule } from '@angular/core';\r\nimport { ElTextEditorComponent } from './el-text-editor.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { NgbDropdownModule } from '@ng-bootstrap/ng-bootstrap';\r\nimport { ColorSketchModule } from 'ngx-color/sketch';\r\nimport { ColorPickerModule } from 'ngx-color-picker';\r\nimport { NgxFullscreenModule } from '@ultimate/ngx-fullscreen';\r\n\r\n\r\n\r\n@NgModule({\r\n declarations: [\r\n ElTextEditorComponent\r\n ],\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n NgbDropdownModule,\r\n ColorSketchModule,\r\n ColorPickerModule,\r\n NgxFullscreenModule,\r\n ],\r\n exports: [\r\n ElTextEditorComponent\r\n ]\r\n})\r\nexport class ElTextEditorModule { }\r\n","/*\r\n * Public API Surface of el-text-editor\r\n */\r\n\r\nexport * from './lib/el-text-editor.service';\r\nexport * from './lib/el-text-editor.component';\r\nexport * from './lib/el-text-editor.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|