@sd-angular/core 19.0.0-beta.14 → 19.0.0-beta.16

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":"sd-angular-core-components-document-builder.mjs","sources":["../../../projects/sd-angular/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.ts","../../../projects/sd-angular/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.ts","../../../projects/sd-angular/components/document-builder/src/plugins/heading/heading.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/comment/comment.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/variable/variable.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/table-fit/table-fit.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/image-upload/image-upload.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/image-custom/image-custom.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.config.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.utils.ts","../../../projects/sd-angular/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.component.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.component.html","../../../projects/sd-angular/components/document-builder/sd-angular-core-components-document-builder.ts"],"sourcesContent":["import { Plugin, ButtonView } from 'ckeditor5';\r\n\r\nexport class PageNumberPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n // 1. Đăng ký nút \"Số trang hiện tại\"\r\n editor.ui.componentFactory.add('pageNumber', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n view.set({\r\n label: 'Số trang hiện tại',\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M16 2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H4V4h12v12zM6 6h2v2H6zm0 4h2v2H6zm0 4h2v2H6zm4-8h4v2h-4zm0 4h4v2h-4zm0 4h4v2h-4z\"/></svg>', // Icon đơn giản\r\n tooltip: true\r\n });\r\n\r\n // Khi bấm nút -> Chèn HTML đánh dấu\r\n view.on('execute', () => {\r\n editor.model.change(writer => {\r\n const viewFragment = editor.data.processor.toView(\r\n // Đây là HTML chuẩn để Word hiểu là số trang (dùng cho cách xuất MHTML/.doc)\r\n // Hoặc là marker để Backend replace\r\n '<span class=\"page-number-marker\" style=\"mso-field-code: PAGE; background: #eee; border: 1px dashed #999; padding: 0 4px;\">[PAGE]</span> ' \r\n );\r\n const modelFragment = editor.data.toModel(viewFragment);\r\n editor.model.insertContent(modelFragment);\r\n });\r\n });\r\n return view;\r\n });\r\n\r\n // 2. Đăng ký nút \"Tổng số trang\"\r\n editor.ui.componentFactory.add('totalPages', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n view.set({\r\n label: 'Tổng số trang',\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\"/></svg>',\r\n tooltip: true\r\n });\r\n\r\n view.on('execute', () => {\r\n editor.model.change(writer => {\r\n const viewFragment = editor.data.processor.toView(\r\n '<span class=\"total-page-marker\" style=\"mso-field-code: NUMPAGES; background: #eee; border: 1px dashed #999; padding: 0 4px;\">[TOTAL]</span> '\r\n );\r\n const modelFragment = editor.data.toModel(viewFragment);\r\n editor.model.insertContent(modelFragment);\r\n });\r\n });\r\n return view;\r\n });\r\n }\r\n}","import { Component, ViewEncapsulation, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\n\r\nimport {\r\n ClassicEditor,\r\n EditorConfig,\r\n Essentials,\r\n Paragraph,\r\n Bold,\r\n Italic,\r\n Underline,\r\n FontSize,\r\n FontColor,\r\n FontBackgroundColor,\r\n Alignment,\r\n // Import Plugin tự viết\r\n // PageNumberPlugin (nếu import từ file ngoài)\r\n} from 'ckeditor5';\r\nimport { PageNumberPlugin } from './plugins/page-number.plugin';\r\n\r\n@Component({\r\n selector: 'sd-header-footer-builder',\r\n standalone: true,\r\n imports: [CommonModule, CKEditorModule],\r\n template: `\r\n <div class=\"header-footer-editor-wrapper\">\r\n <ckeditor [editor]=\"Editor\" [config]=\"config\" (ready)=\"onReady($event)\"> </ckeditor>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Style tối giản cho vùng soạn thảo Header/Footer */\r\n :host ::ng-deep .header-footer-editor-wrapper .ck-editor__editable_inline {\r\n min-height: 100px; /* Header thường ngắn */\r\n max-height: 200px;\r\n padding: 10px 20px;\r\n border: 1px solid #ddd;\r\n }\r\n\r\n /* Style hiển thị cho Placeholder số trang trong lúc soạn thảo */\r\n :host ::ng-deep .page-number-marker,\r\n :host ::ng-deep .total-page-marker {\r\n font-size: 11px;\r\n color: #555;\r\n cursor: default;\r\n user-select: none;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class SdHeaderFooterBuilder {\r\n #editor!: ClassicEditor;\r\n Editor = ClassicEditor;\r\n\r\n #model: string | undefined | null;\r\n @Input() set model(value: string | undefined | null) {\r\n if (this.#model !== value) {\r\n this.#model = value;\r\n }\r\n }\r\n\r\n @Output() modelChange = new EventEmitter<string>();\r\n config: EditorConfig = {\r\n licenseKey: 'GPL', // Hoặc key thương mại nếu có\r\n // 1. PLUGIN RÚT GỌN (Bỏ Table, List, PageBreak...)\r\n plugins: [\r\n Essentials,\r\n Paragraph,\r\n Bold,\r\n Italic,\r\n Underline,\r\n FontSize,\r\n FontColor,\r\n FontBackgroundColor,\r\n Alignment,\r\n PageNumberPlugin, // <--- Plugin số trang\r\n ],\r\n // 2. TOOLBAR ĐƠN GIẢN\r\n toolbar: {\r\n items: [\r\n 'undo',\r\n 'redo',\r\n '|',\r\n 'fontSize',\r\n 'fontColor',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n '|',\r\n 'alignment', // Căn trái/phải/giữa (Quan trọng cho Header/Footer)\r\n '|',\r\n 'pageNumber',\r\n 'totalPages', // <--- 2 nút mới\r\n ],\r\n shouldNotGroupWhenFull: true,\r\n },\r\n // Cấu hình alignment\r\n alignment: {\r\n options: ['left', 'center', 'right'],\r\n },\r\n };\r\n\r\n onReady(editor: ClassicEditor): void {\r\n this.#editor = editor;\r\n this.#editor.setData(this.#model || '');\r\n this.#editor.model.document.on('change:data', () => {\r\n this.#model = this.#editor.getData();\r\n this.modelChange.next(this.#model);\r\n });\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class HeadingPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n editor.conversion.for('editingDowncast').markerToHighlight({\r\n model: 'highlightMarker',\r\n view: {\r\n classes: 'ck-heading-highlight',\r\n },\r\n });\r\n }\r\n}\r\n","import { Plugin, ButtonView, Config } from 'ckeditor5';\r\nimport { SdEditorConfig } from '../../document-builder.model';\r\n\r\nexport class CommentPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n // 1. MODEL MARKER -> VIEW CSS\r\n editor.conversion.for('downcast').markerToHighlight({\r\n model: 'comment',\r\n view: data => {\r\n return {\r\n classes: 'ck-comment-marker',\r\n attributes: {\r\n 'data-comment-id': data.markerName,\r\n },\r\n };\r\n },\r\n });\r\n\r\n // 2. ĐĂNG KÝ UI COMPONENT: 'addCommentBtn'\r\n editor.ui.componentFactory.add('addCommentBtn', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n // Lấy config từ Angular\r\n const config = editor.config as Config<SdEditorConfig>;\r\n const getOption = config.get('getOption') as SdEditorConfig['getOption'];\r\n const option = getOption?.();\r\n\r\n // Ẩn button nếu không có onAddComment\r\n if (!option?.onAddComment) {\r\n view.set({\r\n label: '',\r\n isVisible: false,\r\n });\r\n return view;\r\n }\r\n\r\n view.set({\r\n label: 'Thêm bình luận',\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 13v6l-4-4H4a2 2 0 01-2-2V4a2 2 0 012-2h14a2 2 0 012 2v9zM5 7h10v2H5V7zm0 4h10v2H5v-2z\"/></svg>',\r\n tooltip: true,\r\n isEnabled: false,\r\n });\r\n\r\n // Logic Enable/Disable: Dựa theo Selection\r\n const selection = editor.model.document.selection;\r\n\r\n // Lắng nghe sự kiện change selection để bật/tắt nút\r\n this.listenTo(selection, 'change', () => {\r\n // Enable khi có bôi đen text (không phải collapsed)\r\n view.isEnabled = !selection.isCollapsed;\r\n });\r\n\r\n // Logic Execute: Khi bấm nút\r\n this.listenTo(view, 'execute', () => {\r\n const range = selection.getFirstRange();\r\n if (!range || !option?.onAddComment) return;\r\n // Helper lấy text thuần từ range\r\n let selectedText = '';\r\n for (const item of range.getItems()) {\r\n if (item.is('$text') || item.is('$textProxy')) {\r\n selectedText += (item as any).data;\r\n }\r\n }\r\n // BẮN EVENT RA NGOÀI - KHÔNG TỰ ADD MARKER\r\n // Angular component sẽ xử lý logic (mở modal, validation, etc.)\r\n // và gọi lại hàm addComment() nếu cần\r\n \r\n option.onAddComment({range, selectedText});\r\n });\r\n\r\n return view;\r\n });\r\n\r\n // 3. Xử lý sự kiện Copy (Clipboard Output)\r\n this.listenTo(editor.editing.view.document, 'clipboardOutput', (_, data) => {\r\n const isCopyOrCut = data.method === 'copy' || data.method === 'cut';\r\n // Nếu không phải hành động copy hoặc cut thì thoát hàm\r\n if (!isCopyOrCut) {\r\n return;\r\n }\r\n\r\n const content = data.content;\r\n\r\n editor.editing.view.change(writer => {\r\n // Tạo range bao quanh toàn bộ nội dung clipboard\r\n const range = writer.createRangeIn(content);\r\n // Mảng chứa các item cần xử lý\r\n const itemsToClean = [];\r\n\r\n // 1. Duyệt qua để tìm các thẻ có class ck-comment-marker\r\n for (const item of range.getItems()) {\r\n if (item.is('element') && item.hasClass('ck-comment-marker')) {\r\n itemsToClean.push(item);\r\n }\r\n }\r\n\r\n // 2. Thực hiện xóa Class và Attribute\r\n for (const item of itemsToClean) {\r\n // Xóa class 'ck-comment-marker'\r\n writer.removeClass('ck-comment-marker', item);\r\n // Xóa thuộc tính 'data-comment-id'\r\n writer.removeAttribute('data-comment-id', item);\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","import { v4 as uuidv4 } from 'uuid';\r\nimport { Config, Plugin, Widget, toWidget } from 'ckeditor5';\r\nimport { SdDocumentBuilderVariable, SdEditorConfig } from '../../document-builder.model';\r\nimport { SdResolveMaybeAsync } from '@sd-angular/core/utilities';\r\n\r\nexport class VariablePlugin extends Plugin {\r\n // Khai báo dependencies nếu cần (VD: Widget)\r\n static get requires() {\r\n return [Widget];\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n const schema = editor.model.schema;\r\n const conversion = editor.conversion;\r\n const editingView = editor.editing.view;\r\n\r\n // 1. Định nghĩa Schema (Model)\r\n schema.register('variable', {\r\n inheritAllFrom: '$inlineObject',\r\n allowWhere: '$text',\r\n isInline: true,\r\n isObject: true,\r\n allowAttributes: ['id', 'uuid', 'value', 'display'],\r\n });\r\n\r\n // 2. Model -> HTML\r\n conversion.for('downcast').elementToElement({\r\n model: 'variable',\r\n view: (modelItem, { writer: viewWriter }) => {\r\n const id = modelItem.getAttribute('id') as string;\r\n const uuid = modelItem.getAttribute('uuid') as string;\r\n const display = modelItem.getAttribute('display') as string;\r\n const value = modelItem.getAttribute('value') as string;\r\n const widgetElement = viewWriter.createContainerElement('span', {\r\n class: 'variable-widget',\r\n 'data-id': id,\r\n 'data-uuid': uuid,\r\n 'data-value': value,\r\n 'data-display': display,\r\n });\r\n const innerText = viewWriter.createText(`{{${display}}}`);\r\n viewWriter.insert(viewWriter.createPositionAt(widgetElement, 0), innerText);\r\n return toWidget(widgetElement, viewWriter);\r\n },\r\n });\r\n\r\n // 3. HTML -> Model\r\n conversion.for('upcast').elementToElement({\r\n // NOTE: Khi bổ sung thêm attribute vào element variable, dev nên bổ sung thêm \"[atribute]: true\" vào view\r\n // Để:\r\n // - Nếu lọc chính xác sẽ không sinh ra thẻ span thừa bọc ngoài\r\n // - Nếu chưa bổ sung thì sẽ sinh ra thẻ <span> bọc ngoài kèm [atribute] chưa lọc\r\n view: {\r\n name: 'span',\r\n classes: 'variable-widget ck-widget',\r\n attributes: {\r\n 'data-id': true,\r\n 'data-uuid': true,\r\n 'data-value': true,\r\n 'data-display': true,\r\n contenteditable: true,\r\n },\r\n },\r\n model: (viewElement, { writer: modelWriter }) => {\r\n return modelWriter.createElement('variable', {\r\n id: viewElement.getAttribute('data-id'),\r\n uuid: viewElement.getAttribute('data-uuid'),\r\n value: viewElement.getAttribute('data-value'),\r\n display: viewElement.getAttribute('data-display'),\r\n });\r\n },\r\n });\r\n\r\n // 4. Xử lý sự kiện Drop\r\n this.listenTo(editingView.document, 'drop', async (evt, data) => {\r\n const dataTransfer = (data as any).dataTransfer;\r\n const jsonData = dataTransfer.getData('ck-variable');\r\n if (!jsonData) return;\r\n\r\n // data.dropRange là vị trí con chuột trên View khi thả\r\n const viewRange = (data as any).dropRange;\r\n const modelRange = editor.editing.mapper.toModelRange(viewRange);\r\n evt.stop();\r\n\r\n try {\r\n let variable: SdDocumentBuilderVariable = JSON.parse(jsonData);\r\n const config = editor.config as Config<SdEditorConfig>;\r\n const getOption = config.get('getOption') as SdEditorConfig['getOption'];\r\n const option = getOption?.();\r\n if (option?.onDropVariable) {\r\n const result = await SdResolveMaybeAsync<boolean | SdDocumentBuilderVariable>(option.onDropVariable(variable, 0));\r\n // * Hỗ trợ dữ liệu có sẵn sẽ chỉ cần nhận vào boolean có cho phép thả hay không?\r\n if (typeof result === 'boolean') {\r\n if (!result) {\r\n throw new Error('Không cho phép thêm variable vào văn bản');\r\n }\r\n } else {\r\n // * Hỗ trợ dữ liệu lấy từ API (Kiểm tra xem result có đúng định dạng interface SdDocumentBuilderVariable hay không?)\r\n if (this.#isSdDocumentBuilderVariableResult(result)) {\r\n variable = result;\r\n } else {\r\n throw new Error('Dữ liệu variable không hợp lệ');\r\n }\r\n }\r\n }\r\n\r\n editor.model.change(writer => {\r\n // 4.1. Chèn biến\r\n const variableElem = writer.createElement('variable', {\r\n id: variable.id,\r\n uuid: uuidv4(),\r\n value: variable.value,\r\n display: variable.display,\r\n });\r\n\r\n editor.model.insertContent(variableElem, modelRange);\r\n // 4.2. Đặt con trỏ ra sau biến\r\n writer.setSelection(variableElem, 'after');\r\n });\r\n } catch (e) {\r\n // Đặt con trỏ ngay tại vị trí lỗi\r\n if (modelRange) {\r\n editor.model.change(writer => {\r\n writer.setSelection(modelRange);\r\n });\r\n }\r\n console.error(e);\r\n } finally {\r\n // 5. Dọn dẹp drop-target dù thành công hay lỗi\r\n editor.model.change(writer => {\r\n for (const marker of editor.model.markers) {\r\n if (marker.name.startsWith('drop-target')) {\r\n writer.removeMarker(marker);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n // 5. Lắng nghe sự kiện bàn phím\r\n let isNavigating = false;\r\n this.editor.editing.view.document.on(\r\n 'keydown',\r\n (evt, data) => {\r\n // Mã phím mũi tên: 37 (Left), 38 (Up), 39 (Right), 40 (Down)\r\n const isArrowKey = data.keyCode >= 37 && data.keyCode <= 40;\r\n if (isArrowKey) {\r\n isNavigating = true;\r\n } else {\r\n isNavigating = false;\r\n }\r\n },\r\n { priority: 'high' }\r\n );\r\n\r\n // 6. Lắng nghe sự kiện Click chuột\r\n this.editor.editing.view.document.on('mousedown', () => {\r\n isNavigating = true;\r\n });\r\n\r\n this.listenTo(editor.model.document.selection, 'change:range', () => {\r\n // Nếu không phải là hành động click hoặc mũi tên thì thoát hàm.\r\n if (!isNavigating) {\r\n return;\r\n }\r\n\r\n const model = editor.model;\r\n const selection = model.document.selection;\r\n if (!selection.isCollapsed) return;\r\n\r\n const position = selection.getFirstPosition();\r\n const nodeBefore = position?.nodeBefore;\r\n if (!position) return;\r\n\r\n // Kiểm tra: Node đứng trước con trỏ là variable\r\n if (nodeBefore && nodeBefore.is('element', 'variable')) {\r\n // Lấy node ngay sau variable để kiểm tra\r\n const nextNode = nodeBefore.nextSibling;\r\n\r\n // Logic: Nếu phía sau KHÔNG CÓ GÌ hoặc KHÔNG PHẢI LÀ TEXT\r\n if (!nextNode || !nextNode.is('$text')) {\r\n model.change(writer => {\r\n // Chèn thêm con trỏ variable\r\n writer.insertText('\\u00A0', nodeBefore, 'after');\r\n // Lấy vị trí ngay sau variable (lúc này đang là đầu của text node mới)\r\n const posAfterVariable = writer.createPositionAfter(nodeBefore);\r\n // Dịch chuyển vị trí đó sang phải 1 đơn vị (bỏ qua ký tự vừa thêm)\r\n const targetPos = posAfterVariable.getShiftedBy(1);\r\n // 3. Đặt con trỏ vào vị trí đã tính toán\r\n writer.setSelection(targetPos);\r\n });\r\n }\r\n }\r\n });\r\n\r\n // 7. Handle xóa variable\r\n this.editor.editing.view.document.on(\r\n 'keydown',\r\n (evt, data) => {\r\n // Mã phím 8 là Backspace, 46 là Delete\r\n const btnBackspace = data.keyCode === 8;\r\n const btnDelete = data.keyCode === 46;\r\n if (btnBackspace || btnDelete) {\r\n const selection = editor.model.document.selection;\r\n const model = editor.model;\r\n\r\n // CASE 1: Nếu con trỏ đang nhấp nháy (Collapsed)\r\n if (selection.isCollapsed) {\r\n const position = selection.getFirstPosition();\r\n // Với Backspace ta kiểm tra nodeBefore, với Delete ta kiểm tra nodeAfter\r\n const targetNode = data.keyCode === 8 ? position?.nodeBefore : position?.nodeAfter;\r\n\r\n if (targetNode && targetNode.is('element', 'variable')) {\r\n data.preventDefault();\r\n evt.stop();\r\n\r\n model.change(writer => {\r\n // Chọn bao quanh Variable đó\r\n writer.setSelection(targetNode, 'on');\r\n });\r\n return;\r\n }\r\n }\r\n // CASE 2: Nếu đang có một vùng chọn (đã được highlight từ lần bấm trước)\r\n else {\r\n const selectedElement = selection.getSelectedElement();\r\n\r\n // Nếu phần tử đang được chọn chính là variable\r\n if (selectedElement && selectedElement.is('element', 'variable')) {\r\n // Cho phép hành động mặc định diễn ra (CKEditor sẽ tự xóa phần tử đang được chọn)\r\n // Hoặc chủ động xóa để chắc chắn:\r\n data.preventDefault();\r\n evt.stop();\r\n\r\n model.change(writer => {\r\n writer.remove(selectedElement);\r\n });\r\n }\r\n }\r\n }\r\n },\r\n { priority: 'highest' }\r\n );\r\n\r\n // 8. Xử lý sự kiện Copy (Clipboard Output)\r\n // Khi copy, thay thế variable bằng text\r\n this.listenTo(editor.editing.view.document, 'clipboardOutput', (_, data) => {\r\n const isCopyOrCut = data.method === 'copy' || data.method === 'cut';\r\n // Nếu không phải hành động copy hoặc cut thì thoát hàm\r\n if (!isCopyOrCut) {\r\n return;\r\n }\r\n\r\n const content = data.content;\r\n editor.editing.view.change(writer => {\r\n // Tạo range bao quanh toàn bộ nội dung clipboard\r\n const range = writer.createRangeIn(content);\r\n const itemsToReplace: any[] = [];\r\n\r\n // Duyệt qua tất cả các phần tử trong clipboard để tìm variable\r\n for (const item of range.getItems()) {\r\n // Kiểm tra đúng là thẻ span và có class variable-widget\r\n if (item.is('element', 'span') && item.hasClass('variable-widget')) {\r\n itemsToReplace.push(item);\r\n }\r\n }\r\n\r\n // Thay thế variable bằng text\r\n for (const item of itemsToReplace) {\r\n const displayText = item.getAttribute('data-display');\r\n\r\n if (displayText) {\r\n // Tạo một node text thuần túy\r\n const textNode = writer.createText(`{{${displayText}}}`);\r\n\r\n // Chèn text node vào ngay trước widget cũ\r\n writer.insert(writer.createPositionBefore(item), textNode);\r\n\r\n // Xóa widget cũ đi\r\n writer.remove(item);\r\n }\r\n }\r\n });\r\n });\r\n }\r\n\r\n #isSdDocumentBuilderVariableResult = (obj: any): obj is SdDocumentBuilderVariable => {\r\n return (\r\n obj !== null &&\r\n obj !== undefined &&\r\n typeof obj === 'object' &&\r\n !Array.isArray(obj) &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.value === 'string' &&\r\n typeof obj.display === 'string'\r\n );\r\n };\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class TableFitPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n const applyTableDefaults = (writer: any, tableElement: any) => {\r\n if (!tableElement) return;\r\n\r\n // Always force table width to 100% on paste/insert\r\n writer.setAttribute('tableWidth', '100%', tableElement);\r\n };\r\n\r\n const applyCellBorders = (writer: any, tableElement: any) => {\r\n if (!tableElement) return;\r\n\r\n for (const row of tableElement.getChildren()) {\r\n for (const cell of row.getChildren()) {\r\n const hasBorderColor = cell.getAttribute('tableCellBorderColor');\r\n const hasBorderStyle = cell.getAttribute('tableCellBorderStyle');\r\n const hasBorderWidth = cell.getAttribute('tableCellBorderWidth');\r\n const hasPadding = cell.getAttribute('tableCellPadding');\r\n\r\n if (!hasBorderColor) {\r\n writer.setAttribute('tableCellBorderColor', '#000000', cell);\r\n }\r\n\r\n if (!hasBorderStyle) {\r\n writer.setAttribute('tableCellBorderStyle', 'solid', cell);\r\n }\r\n\r\n if (!hasBorderWidth) {\r\n writer.setAttribute('tableCellBorderWidth', '1pt', cell);\r\n }\r\n\r\n if (!hasPadding) {\r\n writer.setAttribute('tableCellPadding', '0.4em', cell);\r\n }\r\n }\r\n }\r\n };\r\n\r\n const listenAndApplyOnExecute = (commandName: string) => {\r\n const cmd = editor.commands.get(commandName);\r\n\r\n if (!cmd) return;\r\n\r\n this.listenTo(cmd, 'execute', () => {\r\n editor.model.change(writer => {\r\n const selection = editor.model.document.selection;\r\n const position = selection.getFirstPosition();\r\n\r\n if (!position) return;\r\n\r\n const tableElement = position.findAncestor('table');\r\n applyTableDefaults(writer, tableElement);\r\n applyCellBorders(writer, tableElement);\r\n });\r\n });\r\n };\r\n\r\n // Can thiệp vào quá trình convert từ View (HTML Paste) sang Model\r\n editor.conversion.for('upcast').add(dispatcher => {\r\n dispatcher.on(\r\n 'element:table',\r\n (evt, data, conversionApi) => {\r\n // 1. Gọi consume để báo với CKEditor là chúng ta sẽ xử lý element này\r\n if (!conversionApi.consumable.consume(data.viewItem, { name: true })) {\r\n return;\r\n }\r\n\r\n // 2. Thực hiện chuyển đổi mặc định để tạo ra model element\r\n const { modelCursor, modelRange } = conversionApi.convertChildren(data.viewItem, data.modelCursor);\r\n\r\n // 3. Bây giờ modelRange chắc chắn tồn tại, ta tìm element table trong đó\r\n for (const item of modelRange.getItems()) {\r\n if (item.is('element', 'table')) {\r\n editor.model.change(writer => {\r\n applyTableDefaults(writer, item);\r\n applyCellBorders(writer, item);\r\n });\r\n }\r\n }\r\n\r\n // 4. Cập nhật modelCursor để dispatcher biết đã xử lý xong tới đâu\r\n data.modelRange = modelRange;\r\n data.modelCursor = modelCursor;\r\n },\r\n { priority: 'low' }\r\n );\r\n // Chạy sau cùng để ghi đè các logic mặc định\r\n });\r\n\r\n const findInnerTable = (viewElement: any): any => {\r\n if (!viewElement) return null;\r\n if (viewElement.name === 'table') return viewElement;\r\n\r\n for (const child of viewElement.getChildren()) {\r\n if (child.name === 'table') return child;\r\n const found = findInnerTable(child);\r\n if (found) return found;\r\n }\r\n return null;\r\n };\r\n\r\n editor.conversion.for('downcast').add(dispatcher => {\r\n // Handle when tableWidth attribute changes\r\n dispatcher.on('attribute:tableWidth:table', (evt, data, conversionApi) => {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n const innerTable = findInnerTable(viewElement);\r\n if (!innerTable) return;\r\n\r\n viewWriter.setStyle('border-collapse', 'collapse', innerTable);\r\n viewWriter.setStyle('margin', '0', innerTable);\r\n viewWriter.setStyle('width', '100%', innerTable);\r\n \r\n // Set width on the wrapper container (ck-widget) as well\r\n viewWriter.setStyle('width', '100%', viewElement);\r\n });\r\n\r\n // Handle when table is first inserted\r\n dispatcher.on('insert:table', (evt, data, conversionApi) => {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n const innerTable = findInnerTable(viewElement);\r\n if (!innerTable) return;\r\n\r\n viewWriter.setStyle('border-collapse', 'collapse', innerTable);\r\n viewWriter.setStyle('margin', '0', innerTable);\r\n viewWriter.setStyle('width', '100%', innerTable);\r\n \r\n // Set width on the wrapper container (ck-widget) as well\r\n viewWriter.setStyle('width', '100%', viewElement);\r\n });\r\n });\r\n\r\n // Lắng nghe lệnh insertTable để can thiệp ngay sau khi bảng được tạo\r\n const insertTableCommand = editor.commands.get('insertTable');\r\n\r\n if (insertTableCommand) {\r\n // Dùng 'on' event để hook vào sau khi lệnh thực thi\r\n this.listenTo(insertTableCommand, 'execute', (evt, args) => {\r\n editor.model.change(writer => {\r\n // Lấy vị trí con trỏ hiện tại (nơi bảng vừa được chèn)\r\n const selection = editor.model.document.selection;\r\n const position = selection.getFirstPosition();\r\n\r\n if (!position) return;\r\n\r\n // Tìm element table vừa chèn (nó nằm ở vị trí cha của selection)\r\n // Khi vừa insert, con trỏ thường nằm trong ô đầu tiên của bảng\r\n const tableElement = position.findAncestor('table');\r\n\r\n if (tableElement) {\r\n // Ép width 100% cho bảng mới vẽ\r\n applyTableDefaults(writer, tableElement);\r\n // Apply border style 1pt solid black\r\n writer.setAttribute('tableBorderColor', '#000000', tableElement);\r\n writer.setAttribute('tableBorderStyle', 'solid', tableElement);\r\n writer.setAttribute('tableBorderWidth', '1pt', tableElement);\r\n\r\n applyCellBorders(writer, tableElement);\r\n }\r\n });\r\n });\r\n }\r\n\r\n listenAndApplyOnExecute('insertTableRowAbove');\r\n listenAndApplyOnExecute('insertTableRowBelow');\r\n listenAndApplyOnExecute('insertTableColumnLeft');\r\n listenAndApplyOnExecute('insertTableColumnRight');\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class ImageUploadPlugin extends Plugin {\r\n static get pluginName() {\r\n return 'ImageUploadPlugin' as const;\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n \r\n editor.plugins.get('FileRepository').createUploadAdapter = (loader: any) => {\r\n return new Base64UploadAdapter(loader);\r\n };\r\n }\r\n}\r\n\r\nclass Base64UploadAdapter {\r\n private loader: any;\r\n\r\n constructor(loader: any) {\r\n this.loader = loader;\r\n }\r\n\r\n /**\r\n * Starts the upload process and converts the file to base64.\r\n * @returns Promise that resolves with the base64 URL\r\n */\r\n upload(): Promise<{ default: string }> {\r\n return this.loader.file.then((file: File) => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n const base64Url = reader.result as string;\r\n resolve({ default: base64Url });\r\n };\r\n\r\n reader.onerror = () => {\r\n reject('Failed to convert image to base64');\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Aborts the upload process.\r\n */\r\n abort(): void {\r\n // For base64 conversion, there's nothing to abort\r\n // This method is required by the UploadAdapter interface\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class ImageCustomPlugin extends Plugin {\r\n static get pluginName() {\r\n return 'ImageCustomPlugin' as const;\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n\r\n // Thiết lập style mặc định là alignCenter khi chèn ảnh\r\n editor.commands.get('imageUpload')?.on('execute', (evt, args) => {\r\n // Đặt style mặc định sau khi ảnh được chèn\r\n setTimeout(() => {\r\n const selection = editor.model.document.selection;\r\n const imageElement = selection.getSelectedElement();\r\n if (imageElement && (imageElement.name === 'imageBlock' || imageElement.name === 'imageInline')) {\r\n const currentStyle = imageElement.getAttribute('imageStyle');\r\n // Chỉ đặt mặc định nếu chưa có style nào\r\n if (!currentStyle) {\r\n editor.model.change(writer => {\r\n writer.setAttribute('imageStyle', 'alignCenter', imageElement);\r\n });\r\n }\r\n }\r\n }, 0);\r\n });\r\n\r\n // Downcast: Model -> View (HTML output)\r\n // CKEditor 5 có 2 loại ảnh: imageBlock và imageInline\r\n editor.conversion.for('downcast').add(dispatcher => {\r\n // Xử lý ảnh block (được wrap trong figure)\r\n dispatcher.on(\r\n 'insert:imageBlock',\r\n (evt, data, conversionApi) => {\r\n this.handleImageInsert(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý ảnh inline\r\n dispatcher.on(\r\n 'insert:imageInline',\r\n (evt, data, conversionApi) => {\r\n this.handleImageInsert(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi attribute cho cả 2 loại ảnh\r\n ['imageBlock', 'imageInline'].forEach(imageType => {\r\n // Xử lý thay đổi src\r\n dispatcher.on(\r\n `attribute:src:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageAttributeChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi width\r\n dispatcher.on(\r\n `attribute:width:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageAttributeChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi height\r\n dispatcher.on(\r\n `attribute:height:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageAttributeChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi imageStyle (căn chỉnh) - thêm float inline style\r\n dispatcher.on(\r\n `attribute:imageStyle:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageStyleChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n });\r\n });\r\n\r\n // Xử lý upcast (HTML paste) - xóa aspect-ratio từ HTML đầu vào\r\n editor.conversion.for('upcast').add(dispatcher => {\r\n dispatcher.on(\r\n 'element:img',\r\n (evt, data, conversionApi) => {\r\n const viewItem = data.viewItem;\r\n if (!viewItem) return;\r\n\r\n // Kiểm tra viewItem có các method cần thiết\r\n if (typeof viewItem.getStyle !== 'function') return;\r\n\r\n // Xóa aspect-ratio từ inline styles nếu có\r\n const hasAspectRatio = viewItem.getStyle('aspect-ratio');\r\n if (hasAspectRatio && typeof viewItem.removeStyle === 'function') {\r\n viewItem.removeStyle('aspect-ratio');\r\n }\r\n\r\n // Đặt custom styles nếu _styles map tồn tại\r\n if (viewItem._styles && typeof viewItem._styles.set === 'function') {\r\n viewItem._styles.set('margin', '0');\r\n viewItem._styles.set('border', '0');\r\n viewItem._styles.set('max-width', '100%');\r\n viewItem._styles.set('height', 'auto');\r\n }\r\n },\r\n { priority: 'high' }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Xử lý sự kiện chèn ảnh\r\n */\r\n private handleImageInsert(evt: any, data: any, conversionApi: any): void {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n // viewElement có thể là figure (cho block) hoặc img itself (cho inline)\r\n // Tìm element img thực tế\r\n const imgElement = this.findImgElement(viewElement);\r\n if (!imgElement) return;\r\n\r\n this.applyCustomStyles(viewWriter, imgElement);\r\n }\r\n\r\n /**\r\n * Xử lý sự kiện thay đổi attribute ảnh\r\n */\r\n private handleImageAttributeChange(evt: any, data: any, conversionApi: any): void {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n const imgElement = this.findImgElement(viewElement);\r\n if (!imgElement) return;\r\n\r\n this.applyCustomStyles(viewWriter, imgElement);\r\n }\r\n\r\n /**\r\n * Xử lý sự kiện thay đổi style ảnh - thêm float inline style cho căn chỉnh\r\n */\r\n private handleImageStyleChange(evt: any, data: any, conversionApi: any): void {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n // Tìm container ck-widget (element figure)\r\n const widgetElement = this.findWidgetElement(viewElement);\r\n if (!widgetElement) return;\r\n\r\n // Lấy giá trị imageStyle (căn chỉnh)\r\n const imageStyle = data.item.getAttribute('imageStyle') as string;\r\n\r\n // Xóa các style hiện có trước\r\n viewWriter.removeStyle('float', widgetElement);\r\n viewWriter.removeStyle('margin', widgetElement);\r\n viewWriter.removeStyle('text-align', widgetElement);\r\n\r\n // Áp dụng style dựa trên căn chỉnh ảnh\r\n // Các options đã cấu hình: ['inline', 'alignLeft', 'alignRight', 'alignCenter']\r\n switch (imageStyle) {\r\n case 'inline':\r\n // Ảnh inline - không style đặc biệt, chỉ flow inline\r\n break;\r\n case 'alignLeft':\r\n // Float trái\r\n viewWriter.setStyle('float', 'left', widgetElement);\r\n viewWriter.setStyle('margin', '0 16px 16px 0', widgetElement);\r\n break;\r\n case 'alignRight':\r\n // Float phải\r\n viewWriter.setStyle('float', 'right', widgetElement);\r\n viewWriter.setStyle('margin', '0 0 16px 16px', widgetElement);\r\n break;\r\n case 'alignCenter':\r\n case 'block':\r\n // Căn giữa\r\n viewWriter.setStyle('text-align', 'center', widgetElement);\r\n viewWriter.setStyle('margin', '16px auto', widgetElement);\r\n break;\r\n default:\r\n // Mặc định - căn giữa\r\n viewWriter.setStyle('text-align', 'center', widgetElement);\r\n viewWriter.setStyle('margin', '16px auto', widgetElement);\r\n break;\r\n }\r\n\r\n // Áp dụng custom styles cơ bản cho element img\r\n const imgElement = this.findImgElement(viewElement);\r\n if (imgElement) {\r\n this.applyCustomStyles(viewWriter, imgElement);\r\n }\r\n }\r\n\r\n /**\r\n * Áp dụng custom styles cho element ảnh\r\n */\r\n private applyCustomStyles(viewWriter: any, imgElement: any): void {\r\n // Xóa aspect-ratio nếu tồn tại\r\n if (imgElement.getStyle('aspect-ratio')) {\r\n viewWriter.removeStyle('aspect-ratio', imgElement);\r\n }\r\n\r\n // Áp dụng custom styles\r\n viewWriter.setStyle('margin', '0', imgElement);\r\n viewWriter.setStyle('border', '0', imgElement);\r\n viewWriter.setStyle('max-width', '100%', imgElement);\r\n viewWriter.setStyle('height', 'auto', imgElement);\r\n }\r\n\r\n /**\r\n * Tìm container ck-widget (element figure)\r\n * CKEditor wrap ảnh block trong <figure class=\"ck-widget\"><img></figure>\r\n */\r\n private findWidgetElement(viewElement: any): any {\r\n if (!viewElement) return null;\r\n\r\n // Nếu đây là element figure itself\r\n if (viewElement.name === 'figure') {\r\n return viewElement;\r\n }\r\n\r\n // Cho ảnh inline, trả về element itself (span wrapper)\r\n if (viewElement.name === 'span') {\r\n return viewElement;\r\n }\r\n\r\n // Tìm ngược lên tree để tìm figure/ck-widget\r\n let current = viewElement;\r\n while (current) {\r\n if (current.name === 'figure' || current.name === 'span') {\r\n return current;\r\n }\r\n // Di chuyển lên parent\r\n if (current.parent) {\r\n current = current.parent;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Nếu không tìm thấy widget, trả về element gốc\r\n return viewElement;\r\n }\r\n\r\n /**\r\n * Tìm element img thực tế bên trong widget structure\r\n * CKEditor wrap ảnh block trong <figure class=\"ck-widget\"><img></figure>\r\n */\r\n private findImgElement(viewElement: any): any {\r\n if (!viewElement) return null;\r\n\r\n // Nếu đây là element img itself\r\n if (viewElement.name === 'img') {\r\n return viewElement;\r\n }\r\n\r\n // Cho structure widget của CKEditor, tìm đệ quy\r\n // Ảnh block: figure > span > img\r\n // Ảnh thường được wrap trong một container\r\n const queue = [viewElement];\r\n while (queue.length > 0) {\r\n const current = queue.shift();\r\n if (!current) continue;\r\n\r\n if (current.name === 'img') {\r\n return current;\r\n }\r\n\r\n // Thêm children vào queue\r\n if (current.getChildren) {\r\n for (const child of current.getChildren()) {\r\n queue.push(child);\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { ButtonView, Plugin } from 'ckeditor5';\r\n// Icon khổ dọc (Mặc định cũ)\r\nconst ICON_PORTRAIT =\r\n '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6V4h8v12z\"/></svg>';\r\n\r\n// Icon khổ ngang (Mới)\r\nconst ICON_LANDSCAPE =\r\n '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 4H2C.9 4 0 4.9 0 6v8c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 10H2V6h16v8z\"/></svg>';\r\nexport class PageOrientationPlugin extends Plugin {\r\n public static readonly pluginName = 'PageOrientationPlugin';\r\n\r\n private _currentOrientation: 'PORTRAIT' | 'LANDSCAPE' = 'PORTRAIT';\r\n private orientationChangeEmitter?: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void;\r\n private buttonView?: ButtonView;\r\n\r\n init() {\r\n const editor = this.editor;\r\n const componentFactory = editor.ui.componentFactory;\r\n\r\n // Đăng ký nút tên là 'pageOrientation'\r\n componentFactory.add('pageOrientation', locale => {\r\n const view = new ButtonView(locale);\r\n this.buttonView = view;\r\n\r\n view.set({\r\n // label: 'Xoay giấy (A4)',\r\n icon: ICON_PORTRAIT,\r\n // tooltip: true,\r\n // withText: true,\r\n class: 'btn-orientation', // Class để style nếu cần\r\n });\r\n\r\n // Xử lý khi bấm nút\r\n view.on('execute', () => {\r\n this.toggleOrientation();\r\n });\r\n\r\n return view;\r\n });\r\n }\r\n\r\n /**\r\n * Toggle between portrait and landscape orientation\r\n */\r\n toggleOrientation(): void {\r\n const newOrientation = this._currentOrientation === 'PORTRAIT' ? 'LANDSCAPE' : 'PORTRAIT';\r\n this.setOrientation(newOrientation);\r\n }\r\n\r\n /**\r\n * Set orientation programmatically\r\n */\r\n setOrientation(orientation: 'PORTRAIT' | 'LANDSCAPE'): void {\r\n const editor = this.editor;\r\n const editingView = editor.editing.view;\r\n const rootElement = editingView.document.getRoot();\r\n\r\n editor.editing.view.change(writer => {\r\n if (orientation === 'LANDSCAPE') {\r\n writer.addClass('landscape', rootElement!);\r\n } else {\r\n writer.removeClass('landscape', rootElement!);\r\n }\r\n });\r\n\r\n // Update button icon\r\n if (this.buttonView) {\r\n this.buttonView.icon = orientation === 'LANDSCAPE' ? ICON_LANDSCAPE : ICON_PORTRAIT;\r\n }\r\n\r\n this._currentOrientation = orientation;\r\n this.orientationChangeEmitter?.(orientation);\r\n }\r\n\r\n /**\r\n * Get current orientation\r\n */\r\n getOrientation(): 'PORTRAIT' | 'LANDSCAPE' {\r\n return this._currentOrientation;\r\n }\r\n\r\n /**\r\n * Register callback for orientation changes\r\n */\r\n onOrientationChange(callback: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void): void {\r\n this.orientationChangeEmitter = callback;\r\n }\r\n}\r\n","/**\r\n * Cấu hình màu cho Document Builder\r\n * Bảng màu tập trung và cấu hình cho việc lựa chọn màu nhất quán\r\n */\r\n\r\nimport { ColorPickerConfig, FontColorConfig, FontSizeConfig, HeadingConfig } from 'ckeditor5';\r\n\r\n/**\r\n * Trả về bảng màu chung được sử dụng trong tất cả tính năng của document builder\r\n * @returns Mảng các tùy chọn màu được định sẵn với giá trị hex và label\r\n */\r\nexport function getPresetColors(): FontColorConfig['colors'] {\r\n return [\r\n { color: '#000000', label: 'Black' },\r\n { color: '#4D4D4D', label: 'Dim grey' },\r\n { color: '#999999', label: 'Grey' },\r\n { color: '#E6E6E6', label: 'Light grey' },\r\n { color: '#FFFFFF', label: 'White' },\r\n { color: '#E64D4D', label: 'Red' },\r\n { color: '#E6994D', label: 'Orange' },\r\n { color: '#E6E64D', label: 'Yellow' },\r\n { color: '#99E64D', label: 'Light green' },\r\n { color: '#4DE64D', label: 'Green' },\r\n { color: '#4DE699', label: 'Aquamarine' },\r\n { color: '#4DE6E6', label: 'Turquoise' },\r\n { color: '#4D99E6', label: 'Light blue' },\r\n { color: '#4D4DE6', label: 'Blue' },\r\n { color: '#994DE6', label: 'Purple' },\r\n ];\r\n}\r\n\r\n/**\r\n * Trả về cấu hình bộ chọn màu với định dạng hex\r\n * @returns Đối tượng cấu hình bộ chọn màu\r\n */\r\nexport function getColorPickerConfig(): ColorPickerConfig {\r\n return {\r\n format: 'hex',\r\n };\r\n}\r\n\r\n/**\r\n * Trả về cấu hình kích thước font cho document builder\r\n * @returns Mảng các tùy chọn kích thước font được định sẵn\r\n */\r\nexport function getFontSizeOptions(): FontSizeConfig['options'] {\r\n return [\r\n {\r\n title: '9',\r\n model: '9pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '9pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '10',\r\n model: '10pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '10pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '11',\r\n model: '11pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '11pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '12',\r\n model: '12pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '12pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '13',\r\n model: '13pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '13pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '14',\r\n model: '14pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '14pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '16',\r\n model: '16pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '16pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '18',\r\n model: '18pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '18pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '20',\r\n model: '20pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '20pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '24',\r\n model: '24pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '24pt' },\r\n priority: 7,\r\n },\r\n },\r\n ];\r\n}\r\n\r\nexport function getHeadingOptions(): HeadingConfig['options'] {\r\n return [\r\n { model: 'paragraph', title: 'Paragraph', class: 'ck-heading_paragraph' },\r\n { model: 'heading1', view: 'h1', title: 'Heading 1', class: 'ck-heading_heading1' },\r\n { model: 'heading2', view: 'h2', title: 'Heading 2', class: 'ck-heading_heading2' },\r\n { model: 'heading3', view: 'h3', title: 'Heading 3', class: 'ck-heading_heading3' },\r\n ];\r\n}\r\n","/**\r\n * Document Builder Utilities\r\n * Các hàm tiện ích cho document builder\r\n */\r\n\r\nimport { hslToHex, rgbToHex } from '@sd-angular/core/utilities';\r\n\r\n/**\r\n * Chuẩn hóa nội dung bằng cách chuyển đổi tất cả màu HSL và RGB sang hex\r\n * @param content - Nội dung HTML cần chuẩn hóa\r\n * @returns Nội dung đã được chuẩn hóa với màu hex\r\n */\r\nexport function normalize(content: string): string {\r\n let normalized = content;\r\n\r\n // Chuyển đổi HSL sang hex\r\n const hslRegex = /hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*\\)/gi;\r\n normalized = normalized.replace(hslRegex, (match, h, s, l) => {\r\n try {\r\n const hue = parseInt(h, 10);\r\n const saturation = parseInt(s, 10);\r\n const lightness = parseInt(l, 10);\r\n\r\n // Kiểm tra giá trị hợp lệ\r\n if (hue >= 0 && hue <= 360 && saturation >= 0 && saturation <= 100 && lightness >= 0 && lightness <= 100) {\r\n return hslToHex(hue, saturation, lightness);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to convert HSL to hex:', error, match);\r\n }\r\n\r\n return match; // Giữ nguyên nếu không thể chuyển đổi\r\n });\r\n\r\n // Chuyển đổi RGB sang hex\r\n const rgbRegex = /rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/gi;\r\n normalized = normalized.replace(rgbRegex, (match, r, g, b) => {\r\n try {\r\n const red = parseInt(r, 10);\r\n const green = parseInt(g, 10);\r\n const blue = parseInt(b, 10);\r\n\r\n if (red >= 0 && red <= 255 && green >= 0 && green <= 255 && blue >= 0 && blue <= 255) {\r\n return rgbToHex(red, green, blue);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to convert RGB to hex:', error, match);\r\n }\r\n\r\n return match;\r\n });\r\n\r\n return normalized;\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class HighlightRangePlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n editor.conversion.for('editingDowncast').markerToHighlight({\r\n model: 'highlightRange',\r\n view: {\r\n classes: 'highlight-range',\r\n },\r\n });\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\nimport {\r\n Alignment,\r\n Bold,\r\n ClassicEditor,\r\n Essentials,\r\n FontBackgroundColor,\r\n FontColor,\r\n FontFamily,\r\n FontSize,\r\n GeneralHtmlSupport,\r\n Heading,\r\n Image,\r\n ImageBlock,\r\n ImageCaption,\r\n ImageResize,\r\n ImageStyle,\r\n ImageToolbar,\r\n ImageUpload,\r\n Indent,\r\n IndentBlock,\r\n Italic,\r\n List,\r\n ModelElement,\r\n ModelRange,\r\n PageBreak,\r\n Paragraph,\r\n PasteFromOffice,\r\n Subscript,\r\n Superscript,\r\n Table,\r\n TableCellProperties,\r\n TableColumnResize,\r\n TableProperties,\r\n TableToolbar,\r\n Underline,\r\n Undo,\r\n} from 'ckeditor5';\r\nimport { throttleTime, Subject, Subscription } from 'rxjs';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\nimport {\r\n CommentPlugin,\r\n PageOrientationPlugin,\r\n TableFitPlugin,\r\n VariablePlugin,\r\n ImageUploadPlugin,\r\n HeadingPlugin,\r\n ImageCustomPlugin,\r\n} from './plugins';\r\nimport { getPresetColors, getColorPickerConfig, getFontSizeOptions, getHeadingOptions } from './document-builder.config';\r\nimport {\r\n SdDocumentBuilderComment,\r\n SdDocumentBuilderHeading,\r\n SdDocumentBuilderOption,\r\n SdDocumentBuilderVariable,\r\n SdEditorConfig,\r\n} from './document-builder.model';\r\nimport { normalize } from './document-builder.utils';\r\nimport { HighlightRangePlugin } from './plugins/highlight-range/highlight-range.plugin';\r\n\r\n@Component({\r\n selector: 'sd-document-builder',\r\n standalone: true,\r\n imports: [CommonModule, CKEditorModule],\r\n templateUrl: './document-builder.component.html',\r\n styleUrls: [\r\n './document-builder.component.scss',\r\n './plugins/heading/heading.plugin.scss',\r\n './plugins/comment/comment.plugin.scss',\r\n './plugins/variable/variable.plugin.scss',\r\n './plugins/table-fit/table-fit.plugin.scss',\r\n './plugins/highlight-range/highlight-range.plugin.scss',\r\n ],\r\n})\r\nexport class SdDocumentBuilder {\r\n @Input({ required: true }) option!: SdDocumentBuilderOption;\r\n disabled = false;\r\n @Input('disabled') set _disabled(val: boolean | '' | undefined | null) {\r\n this.disabled = val === '' || !!val;\r\n this.#updateState();\r\n }\r\n @Output() contentChange = new EventEmitter<string>(); // Emit HTML content\r\n\r\n Editor = ClassicEditor;\r\n #editor!: ClassicEditor;\r\n\r\n #id = '55b0afb0-288d-423c-98b3-5f9db286e16d';\r\n #subscription = new Subscription();\r\n #sharedColors = getPresetColors();\r\n #headingOptions = getHeadingOptions();\r\n #fontSizeOptions = getFontSizeOptions();\r\n #colorPickerConfig = getColorPickerConfig();\r\n #contentChangeSubject = new Subject<string>();\r\n #idTimeOutScrollHeading: ReturnType<typeof setTimeout> | null = null;\r\n #headingElementsMap = new Map<string, ModelElement>(); // Hash lưu trữ các heading\r\n\r\n // Config\r\n config: SdEditorConfig = {\r\n getOption: () => this.option,\r\n licenseKey: 'GPL', // Hoặc key thương mại nếu có\r\n plugins: [\r\n GeneralHtmlSupport,\r\n FontSize,\r\n FontColor,\r\n FontFamily,\r\n FontBackgroundColor,\r\n Bold,\r\n Italic,\r\n Underline,\r\n Essentials,\r\n Paragraph,\r\n Heading,\r\n List,\r\n Table,\r\n TableToolbar,\r\n TableProperties,\r\n TableCellProperties,\r\n TableColumnResize,\r\n PasteFromOffice,\r\n PageBreak,\r\n Undo,\r\n Alignment, // Canh lề\r\n Subscript, // Mũ dưới (H₂O)\r\n Superscript, // Mũ trên (x²)\r\n // Image\r\n Image,\r\n ImageUpload,\r\n ImageToolbar,\r\n ImageCaption,\r\n ImageResize,\r\n ImageStyle,\r\n ImageBlock,\r\n // Custom Plugin\r\n HeadingPlugin,\r\n CommentPlugin,\r\n VariablePlugin,\r\n TableFitPlugin,\r\n Indent,\r\n IndentBlock,\r\n PageOrientationPlugin,\r\n ImageUploadPlugin,\r\n ImageCustomPlugin,\r\n HighlightRangePlugin,\r\n ],\r\n toolbar: {\r\n items: [\r\n 'pageOrientation',\r\n '|',\r\n 'heading',\r\n 'fontFamily',\r\n '|',\r\n 'fontSize',\r\n 'fontColor',\r\n 'fontBackgroundColor',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'subscript',\r\n 'superscript',\r\n '|',\r\n 'alignment',\r\n 'bulletedList',\r\n 'numberedList',\r\n '|',\r\n 'insertTable',\r\n 'imageUpload',\r\n 'pageBreak',\r\n '|',\r\n 'undo',\r\n 'redo',\r\n '|',\r\n 'addCommentBtn',\r\n ],\r\n shouldNotGroupWhenFull: true,\r\n },\r\n\r\n image: {\r\n styles: {\r\n options: ['inline', 'alignLeft', 'alignRight', 'alignCenter'],\r\n },\r\n toolbar: [\r\n 'imageStyle:inline',\r\n 'imageStyle:alignCenter',\r\n {\r\n name: 'imageStyle:alignDropdown',\r\n items: ['imageStyle:alignLeft', 'imageStyle:alignRight'],\r\n defaultItem: 'imageStyle:alignLeft',\r\n },\r\n ],\r\n },\r\n\r\n fontSize: {\r\n options: this.#fontSizeOptions,\r\n supportAllValues: false, // Khuyên dùng false để ép user chọn đúng size chuẩn\r\n },\r\n\r\n heading: {\r\n options: this.#headingOptions,\r\n },\r\n\r\n // 4. Cấu hình bảng màu (Tùy chọn)\r\n fontColor: {\r\n // columns: 5,\r\n documentColors: 10,\r\n colorPicker: this.#colorPickerConfig,\r\n colors: this.#sharedColors,\r\n },\r\n\r\n fontBackgroundColor: {\r\n // columns: 5,\r\n documentColors: 10,\r\n colorPicker: this.#colorPickerConfig,\r\n colors: this.#sharedColors,\r\n },\r\n\r\n table: {\r\n contentToolbar: ['tableColumn', 'tableRow', 'mergeTableCells', '|', 'tableProperties', 'tableCellProperties'],\r\n tableProperties: {\r\n borderColors: this.#sharedColors,\r\n backgroundColors: this.#sharedColors,\r\n colorPicker: this.#colorPickerConfig,\r\n defaultProperties: {\r\n borderStyle: 'solid',\r\n borderWidth: '1px',\r\n borderColor: '#ccc',\r\n },\r\n },\r\n tableCellProperties: {\r\n borderColors: this.#sharedColors,\r\n backgroundColors: this.#sharedColors,\r\n colorPicker: this.#colorPickerConfig,\r\n defaultProperties: {\r\n borderStyle: 'solid',\r\n borderWidth: '1px',\r\n borderColor: '#ccc',\r\n },\r\n },\r\n },\r\n\r\n indentBlock: {\r\n offset: 48, // Đơn vị px cho mỗi mức indent (tương đương 0.5 inch)\r\n unit: 'px',\r\n },\r\n\r\n // Quan trọng: Cho phép paste style từ Word nhưng bỏ qua margin/padding\r\n htmlSupport: {\r\n allow: [\r\n {\r\n name: /.*/,\r\n attributes: /.*/, // attributes chấp nhận boolean\r\n classes: /.*/, // Cho phép mọi class\r\n styles: {\r\n // Cho phép tất cả styles trừ margin và padding\r\n match: /^(?!margin|padding).*/,\r\n },\r\n },\r\n ],\r\n },\r\n };\r\n\r\n ngOnInit() {\r\n // Debounce trong rxjs không hỗ trợ leading --> throttleTime\r\n this.#subscription.add(\r\n this.#contentChangeSubject.pipe(throttleTime(500, undefined, { leading: true, trailing: true })).subscribe(content => {\r\n this.contentChange.emit(normalize(content));\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n onReady(editor: ClassicEditor) {\r\n this.#editor = editor;\r\n\r\n // Setup orientation plugin callback\r\n try {\r\n const orientationPlugin = editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && typeof orientationPlugin.onOrientationChange === 'function') {\r\n orientationPlugin.onOrientationChange(orientation => {\r\n this.option.onOrientation?.(orientation);\r\n });\r\n\r\n // Set initial orientation if provided\r\n if (this.option.orientation) {\r\n orientationPlugin.setOrientation(this.option.orientation);\r\n }\r\n }\r\n } catch (error) {\r\n console.warn('PageOrientationPlugin not available:', error);\r\n }\r\n\r\n // Lắng nghe selection\r\n editor.model.document.selection.on('change', $event => {\r\n this.option.onSelection?.(this.#editor.model.document.selection, $event);\r\n });\r\n\r\n // Lắng nghe sự kiện thay đổi nội dung\r\n editor.model.document.on('change:data', () => {\r\n const content = editor.getData();\r\n this.#contentChangeSubject.next(content);\r\n });\r\n\r\n try {\r\n // Manual keybinding cho Tab nếu cần\r\n editor.keystrokes.set('Tab', (evt, cancel) => {\r\n const command = editor.commands.get('indentBlock');\r\n if (command && command.isEnabled) {\r\n editor.execute('indentBlock');\r\n cancel();\r\n }\r\n });\r\n\r\n // Manual keybinding cho Shift+Tab\r\n editor.keystrokes.set('Shift+Tab', (evt, cancel) => {\r\n const command = editor.commands.get('outdentBlock');\r\n if (command && command.isEnabled) {\r\n editor.execute('outdentBlock');\r\n cancel();\r\n }\r\n });\r\n } catch (error) {\r\n console.warn('Error setting up indent keybindings:', error);\r\n }\r\n\r\n this.#updateState();\r\n }\r\n\r\n setContent = (html: string) => {\r\n this.#editor?.setData?.(html);\r\n };\r\n\r\n getContent = () => {\r\n if (this.#editor) {\r\n return this.#editor.getData();\r\n }\r\n return '';\r\n };\r\n\r\n setOrientation = (orientation: 'PORTRAIT' | 'LANDSCAPE'): void => {\r\n if (!this.#editor) return;\r\n\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && typeof orientationPlugin.setOrientation === 'function') {\r\n orientationPlugin.setOrientation(orientation);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to set orientation:', error);\r\n }\r\n };\r\n\r\n getOrientation = (): 'PORTRAIT' | 'LANDSCAPE' => {\r\n if (!this.#editor) return 'PORTRAIT';\r\n\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && typeof orientationPlugin.getOrientation === 'function') {\r\n return orientationPlugin.getOrientation();\r\n }\r\n } catch (error) {\r\n console.warn('Failed to get orientation:', error);\r\n }\r\n\r\n return 'PORTRAIT';\r\n };\r\n\r\n scrollToTop() {\r\n setTimeout(() => {\r\n if (this.#editor) {\r\n const editableElement = this.#editor.ui.view.editable.element;\r\n if (editableElement) {\r\n const scrollContainer = editableElement.closest('.builder-container');\r\n if (scrollContainer) {\r\n scrollContainer.scrollTo({\r\n top: 0,\r\n behavior: 'smooth',\r\n });\r\n } else {\r\n editableElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n }\r\n }\r\n }, 100);\r\n }\r\n\r\n #updateState(): void {\r\n if (!this.#editor) return;\r\n if (this.disabled) {\r\n // Bật chế độ chỉ đọc với ID khóa\r\n this.#editor.enableReadOnlyMode(this.#id);\r\n\r\n // Disable page orientation button\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && (orientationPlugin as any).buttonView) {\r\n (orientationPlugin as any).buttonView.isEnabled = false;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to disable orientation button:', error);\r\n }\r\n } else {\r\n // Tắt chế độ chỉ đọc với ID khóa tương ứng\r\n this.#editor.disableReadOnlyMode(this.#id);\r\n\r\n // Enable page orientation button\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && (orientationPlugin as any).buttonView) {\r\n (orientationPlugin as any).buttonView.isEnabled = true;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to enable orientation button:', error);\r\n }\r\n }\r\n }\r\n\r\n #getTextFromElement = (element: ModelElement): string => {\r\n let text = '';\r\n // Heading trong Model chứa các text node con\r\n for (const child of element.getChildren()) {\r\n if (child.is('$text') || child.is('$textProxy')) {\r\n text += (child as any).data;\r\n }\r\n }\r\n return text;\r\n };\r\n\r\n #getTextFromRange = (range: ModelRange): string => {\r\n let text = '';\r\n for (const item of range.getItems()) {\r\n // TextProxy là một phần của Text Node nằm trong Range\r\n if (item.is('$textProxy') || item.is('$text')) {\r\n text += (item as any).data;\r\n }\r\n }\r\n return text;\r\n };\r\n\r\n // ========================================================================\r\n // 1. QUẢN LÝ HEADING\r\n // ========================================================================\r\n heading = {\r\n /**\r\n * Lấy tất cả headings trong document\r\n * @returns Danh sách tất cả headings\r\n */\r\n all: (): SdDocumentBuilderHeading[] => {\r\n if (!this.#editor) return [];\r\n\r\n const root = this.#editor.model.document.getRoot();\r\n if (!root) return [];\r\n\r\n // Reset lại map mỗi lần quét\r\n this.#headingElementsMap.clear();\r\n\r\n const headings: SdDocumentBuilderHeading[] = [];\r\n const range = this.#editor.model.createRangeIn(root);\r\n\r\n // Biến đếm để tạo ID unique\r\n let index = 0;\r\n\r\n for (const item of range.getItems()) {\r\n // Kiểm tra xem item có phải là Element và tên bắt đầu bằng 'heading' không\r\n if (item.is('element') && item.name.startsWith('heading')) {\r\n // 1. Lấy text của heading\r\n const text = this.#getTextFromElement(item);\r\n // 2. Xác định Level (heading1 -> 1, heading2 -> 2)\r\n // item.name có dạng 'heading1', 'heading2'\r\n const level = parseInt(item.name.replace('heading', ''), 10) || 1;\r\n // 3. Tạo ID runtime (Dùng để map khi click scroll)\r\n // Bạn có thể generate slug từ text nếu muốn, ở đây mình dùng index cho đơn giản và unique\r\n const id = `heading_${index}_${Date.now()}`;\r\n // 4. Lưu tham chiếu Model Element vào Map\r\n this.#headingElementsMap.set(id, item as ModelElement);\r\n headings.push({\r\n id: id,\r\n text: text,\r\n level: level,\r\n type: item.name,\r\n });\r\n index++;\r\n }\r\n }\r\n\r\n return headings;\r\n },\r\n\r\n /**\r\n * Scroll tới vị trí của heading\r\n * @param id - ID của heading cần scroll tới\r\n */\r\n scroll: (id: string) => {\r\n if (!this.#editor) return;\r\n\r\n const modelElement = this.#headingElementsMap.get(id);\r\n\r\n if (modelElement) {\r\n this.#editor.model.change(writer => {\r\n // Xóa marker cũ\r\n if (this.#idTimeOutScrollHeading) {\r\n clearTimeout(this.#idTimeOutScrollHeading);\r\n }\r\n const currentMarker = this.#editor.model.markers.get('highlightMarker');\r\n if (currentMarker) {\r\n writer.removeMarker(currentMarker);\r\n }\r\n\r\n // Tạo Range bao trùm highlight\r\n const range = writer.createRangeOn(modelElement);\r\n\r\n // Thêm Marker mới\r\n writer.addMarker('highlightMarker', {\r\n range: range,\r\n usingOperation: false,\r\n });\r\n });\r\n\r\n // Scroll tới vị trí tìm được\r\n const viewElement = this.#editor.editing.mapper.toViewElement(modelElement);\r\n if (viewElement) {\r\n const domElement = this.#editor.editing.view.domConverter.viewToDom(viewElement);\r\n if (domElement) {\r\n domElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n\r\n // Tự động tắt marker sau 5 giây\r\n this.#idTimeOutScrollHeading = setTimeout(() => {\r\n if (this.#editor) {\r\n this.#editor.model.change(writer => {\r\n const marker = this.#editor.model.markers.get('highlightMarker');\r\n if (marker) writer.removeMarker(marker);\r\n });\r\n }\r\n }, 5000);\r\n } else {\r\n console.warn(`Heading with id ${id} not found.`);\r\n }\r\n },\r\n };\r\n\r\n // ========================================================================\r\n // 2. QUẢN LÝ COMMENT\r\n // ========================================================================\r\n comment = {\r\n /**\r\n * Lấy tất cả comments trong document\r\n * @returns Danh sách tất cả comments\r\n */\r\n all: (): SdDocumentBuilderComment[] => {\r\n if (!this.#editor) return [];\r\n\r\n const editableElement = this.#editor.ui.view.editable.element;\r\n if (!editableElement) return [];\r\n\r\n const commentMarkers = editableElement.querySelectorAll('.ck-comment-marker[data-comment-id^=\"comment:\"]') || [];\r\n const commentsMap = new Map<string, SdDocumentBuilderComment>();\r\n\r\n commentMarkers.forEach(el => {\r\n const markerId = el.getAttribute('data-comment-id');\r\n if (markerId) {\r\n const existing = commentsMap.get(markerId);\r\n const text = el.textContent || '';\r\n if (existing) {\r\n existing.selectedText += text;\r\n } else {\r\n commentsMap.set(markerId, {\r\n markerId,\r\n selectedText: text,\r\n });\r\n }\r\n }\r\n });\r\n\r\n return Array.from(commentsMap.values());\r\n },\r\n\r\n /**\r\n * Thêm comment vào vùng text đang được chọn\r\n * @param comment - Dữ liệu comment\r\n * @param data - Dữ liệu extra data\r\n * @returns SdDocumentBuilderComment hoặc null nếu không có text được chọn\r\n */\r\n add: <T = any>(\r\n range: ModelRange,\r\n comment: string,\r\n args?: {\r\n markerIdExternal?: string | number;\r\n data?: T;\r\n }\r\n ): SdDocumentBuilderComment<T> | null => {\r\n // markerIdExternal khi truyền từ bên ngoài vào sẽ có thể là Date.now() hoặc uuidv4().\r\n // Miễn là đảm bảo markerIdExternal là unique.\r\n // Phục vụ cho case gọi API comment thành công thì mới sinh ra markerId.\r\n const { markerIdExternal, data } = args ?? {};\r\n\r\n if (!this.#editor) return null;\r\n const model = this.#editor.model;\r\n if (!range) return null;\r\n // 3. Lấy text từ range\r\n const selectedText = this.#getTextFromRange(range);\r\n if (!selectedText.trim()) {\r\n console.warn('Selected text is empty');\r\n return null;\r\n }\r\n // 4. Tạo ID unique cho marker\r\n const markerId = markerIdExternal ? `comment:${markerIdExternal}` : `comment:${Date.now()}`;\r\n // 5. Tạo marker trong model\r\n model.change(writer => {\r\n writer.addMarker(markerId, {\r\n range,\r\n usingOperation: true, // Quan trọng: Cho phép undo/redo\r\n affectsData: true, // Lưu marker vào data khi getData()\r\n });\r\n });\r\n return {\r\n markerId,\r\n selectedText,\r\n comment,\r\n createdAt: new Date(),\r\n data,\r\n };\r\n },\r\n\r\n /**\r\n * Cập nhật nội dung comment\r\n * @param markerId - ID của marker\r\n * @param commentData - Dữ liệu mới\r\n * @returns Comment đã cập nhật hoặc null\r\n */\r\n update: <T = any>(markerId: string, comment: string, data?: T): SdDocumentBuilderComment<T> | null => {\r\n if (!this.#editor) return null;\r\n const marker = this.#editor.model.markers.get(markerId);\r\n if (!marker) {\r\n console.warn(`Marker ${markerId} not found`);\r\n return null;\r\n }\r\n // Lấy text hiện tại từ marker (có thể đã thay đổi)\r\n const currentText = this.#getTextFromRange(marker.getRange());\r\n return {\r\n markerId: markerId,\r\n selectedText: currentText,\r\n comment,\r\n data,\r\n };\r\n },\r\n\r\n /**\r\n * Lấy chi tiết comment theo markerId\r\n * @param markerId - ID của marker\r\n * @returns Comment hoặc null\r\n */\r\n detail: (markerId: string): SdDocumentBuilderComment | null => {\r\n if (!this.#editor) return null;\r\n const marker = this.#editor.model.markers.get(markerId);\r\n if (!marker) return null;\r\n const currentText = this.#getTextFromRange(marker.getRange());\r\n return {\r\n markerId: markerId,\r\n selectedText: currentText,\r\n };\r\n },\r\n\r\n /**\r\n * Xóa comment theo markerId\r\n * @param markerId - ID của marker cần xóa\r\n * @returns true nếu xóa thành công, false nếu không tìm thấy\r\n */\r\n remove: (markerId: string): boolean => {\r\n if (!this.#editor) return false;\r\n const model = this.#editor.model;\r\n const marker = model.markers.get(markerId);\r\n if (!marker) {\r\n console.warn(`Marker ${markerId} not found`);\r\n return false;\r\n }\r\n model.change(writer => {\r\n writer.removeMarker(markerId);\r\n });\r\n return true;\r\n },\r\n\r\n /**\r\n * Scroll đến vị trí comment\r\n * @param markerId - ID của marker cần scroll tới\r\n */\r\n scroll: (markerId: string): void => {\r\n if (!this.#editor) return;\r\n const editor = this.#editor;\r\n const marker = editor.model.markers.get(markerId);\r\n if (marker) {\r\n // 1. Set Selection vào Marker đó trước\r\n editor.model.change(writer => {\r\n writer.setSelection(marker.getRange());\r\n });\r\n\r\n // 2. Sau đó gọi scrollToTheSelection\r\n editor.editing.view.scrollToTheSelection({\r\n alignToTop: true,\r\n });\r\n editor.editing.view.focus();\r\n } else {\r\n console.warn(`Marker with id ${markerId} not found.`);\r\n }\r\n },\r\n };\r\n\r\n // ========================================================================\r\n // 3. QUẢN LÝ VARIABLE\r\n // ========================================================================\r\n variable = {\r\n /**\r\n * Lấy tất cả variabes trong document\r\n * @returns Danh sách tất cả variables\r\n */\r\n all: <T = any>(): SdDocumentBuilderVariable<T>[] => {\r\n if (!this.#editor) return [];\r\n const model = this.#editor.model;\r\n const root = model.document.getRoot();\r\n if (!root) return [];\r\n\r\n const variables: SdDocumentBuilderVariable<T>[] = [];\r\n try {\r\n const range = model.createRangeIn(root);\r\n\r\n for (const item of range.getItems()) {\r\n // Sử dụng item.is('element', 'variable') là chính xác\r\n if (item.is('element', 'variable')) {\r\n variables.push({\r\n id: item.getAttribute('id') as string,\r\n uuid: item.getAttribute('uuid') as string,\r\n value: item.getAttribute('value') as string,\r\n display: item.getAttribute('display') as string,\r\n });\r\n }\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n return [];\r\n }\r\n\r\n return variables;\r\n },\r\n\r\n /**\r\n * Scroll tới vị trí của variable\r\n * @param uuid - uuid của variable FE sẽ tự sinh sau mỗi lần drop vào editor\r\n */\r\n scroll: (uuid: string) => {\r\n if (!this.#editor) return;\r\n\r\n const model = this.#editor.model;\r\n const root = model.document.getRoot();\r\n if (!root) return;\r\n\r\n let targetElement = null;\r\n const range = model.createRangeIn(root);\r\n for (const item of range.getItems()) {\r\n if (item.is('element', 'variable') && item.getAttribute('uuid') === uuid) {\r\n targetElement = item;\r\n break;\r\n }\r\n }\r\n\r\n if (targetElement) {\r\n const viewElement = this.#editor.editing.mapper.toViewElement(targetElement);\r\n if (viewElement) {\r\n const domElement = this.#editor.editing.view.domConverter.viewToDom(viewElement);\r\n if (domElement) {\r\n domElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n model.change(writer => {\r\n writer.setSelection(targetElement, 'on');\r\n });\r\n }\r\n }\r\n } else {\r\n console.warn(`Variable với id ${uuid} không tìm thấy trong tài liệu.`);\r\n }\r\n },\r\n };\r\n\r\n // ========================================================================\r\n // 4. HÀM EXPORT DOCX (FULL HEADER/FOOTER + PAGE NUMBER)\r\n // ========================================================================\r\n /**\r\n * Xuất file Word có Header/Footer\r\n * @param fileName Tên file\r\n * @param headerText Nội dung Header (hoặc HTML)\r\n * '<p style=\"text-align: center; font-weight: bold;\">CÔNG TY CỔ PHẦN CÔNG NGHỆ ABC</p>'\r\n * @param footerText Nội dung Footer (hoặc HTML)\r\n * '<p style=\"text-align: right; font-size: 10pt;\">Trang <span style=\"mso-field-code: PAGE\"></span> / <span style=\"mso-field-code: NUMPAGES\"></span></p>'\r\n */\r\n exportDocx(args: { fileName?: string; header?: string; footer?: string }): void {\r\n if (!this.#editor) return;\r\n const fileName = args?.fileName || `document_${Date.now()}.docx`;\r\n const header = args?.header || ``;\r\n const footer = args?.footer || ``;\r\n // 1. Kiểm tra xoay giấy\r\n const rootElement = this.#editor.editing.view.document.getRoot();\r\n const isLandscape = rootElement?.hasClass('landscape');\r\n const orientation = isLandscape ? 'landscape' : 'portrait';\r\n\r\n // Kích thước giấy cho Word (A4)\r\n // Portrait: 21cm x 29.7cm\r\n // Landscape: 29.7cm x 21cm\r\n // @page size trong CSS Word đôi khi cần set cứng width/height để header không bị lệch\r\n const pageCss = isLandscape\r\n ? 'size: 29.7cm 21cm; mso-page-orientation: landscape;'\r\n : 'size: 21cm 29.7cm; mso-page-orientation: portrait;';\r\n\r\n const contentHtml = this.#editor.getData();\r\n\r\n // 2. TẠO HTML CHUẨN MICROSOFT WORD XML\r\n // Phải có xmlns:o và xmlns:w thì Word mới hiểu được các lệnh mso-\r\n const fullHtml = `\r\n <html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'>\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <title>Export Document</title>\r\n \r\n <style>\r\n /* --- 1. SETUP TRANG GIẤY & HEADER/FOOTER --- */\r\n @page {\r\n ${pageCss}\r\n margin: 2.0cm; /* Lề chuẩn 2cm */\r\n \r\n /* Kỹ thuật map ID của Word */\r\n mso-header: header1;\r\n mso-footer: footer1;\r\n }\r\n\r\n /* Quan trọng: Ẩn các div header/footer khỏi luồng văn bản chính */\r\n /* Chúng sẽ chỉ hiện thị khi được @page gọi thông qua mso-header/footer */\r\n div#header1 { display: none; }\r\n div#footer1 { display: none; }\r\n\r\n /* --- 2. STYLE CƠ BẢN --- */\r\n body {\r\n font-family: 'Times New Roman', serif;\r\n font-size: 13pt;\r\n line-height: 1.5;\r\n tab-interval: 36pt;\r\n }\r\n \r\n /* Style Bảng */\r\n table { width: 100%; border-collapse: collapse; }\r\n td, th { border: 1px solid black; padding: 5px; }\r\n\r\n /* Style Biến (Giữ nguyên giao diện đẹp của bạn) */\r\n .variable-widget {\r\n color: #1565c0; font-weight: bold;\r\n background: #e3f2fd; padding: 0 4px; border-radius: 4px;\r\n border: 1px solid #90caf9;\r\n }\r\n \r\n /* Ẩn Comment khi in/xuất file */\r\n .ck-comment-marker { background-color: transparent; border: none; text-decoration: none; }\r\n </style>\r\n </head>\r\n <body>\r\n \r\n <div id=\"header1\">\r\n <div style=\"mso-element:header\">\r\n ${header}\r\n <div style='border-bottom: 1px solid #000; margin-top: 5px; margin-bottom: 20px;'></div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"footer1\">\r\n <div style=\"mso-element:footer\">\r\n <div style='border-top: 1px solid #000; margin-top: 20px; margin-bottom: 5px;'></div>\r\n ${footer}\r\n </div>\r\n </div>\r\n\r\n <div class=\"content\">\r\n ${contentHtml}\r\n </div>\r\n\r\n </body>\r\n </html>\r\n `;\r\n\r\n // 3. TẠO BLOB VÀ TẢI XUỐNG\r\n // Lưu ý: Dùng type 'application/msword' thay vì dùng thư viện html-docx-js\r\n // Thêm '\\ufeff' (BOM) để fix lỗi font tiếng Việt\r\n const blob = new Blob(['\\ufeff', fullHtml], { type: 'application/msword' });\r\n SdUtilities.downloadBlob(blob, fileName);\r\n }\r\n\r\n hightSelectRange = (range: ModelRange): void => {\r\n if (!range) return;\r\n const editor = this.#editor;\r\n\r\n editor.model.change(writer => {\r\n // Xóa marker cũ (nếu có)\r\n if (editor.model.markers.has('highlightRange')) {\r\n writer.removeMarker('highlightRange');\r\n }\r\n\r\n // Tạo marker mới\r\n writer.addMarker('highlightRange', {\r\n usingOperation: false, // Không lưu vào lịch sử Undo/Redo\r\n affectsData: false, // Không ảnh hưởng đến data lấy ra (getData)\r\n range: range,\r\n });\r\n });\r\n };\r\n\r\n removeHighlightSeclectRange = (): void => {\r\n const editor = this.#editor;\r\n editor.model.change(writer => {\r\n if (editor.model.markers.has('highlightRange')) {\r\n writer.removeMarker('highlightRange');\r\n }\r\n });\r\n };\r\n}\r\n","<div class=\"builder-container\">\n <ckeditor\n style=\"width: 100%\"\n [editor]=\"Editor\" \n [config]=\"config\" \n (ready)=\"onReady($event)\"\n [disabled]=\"disabled\">\n </ckeditor>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uuidv4"],"mappings":"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"}
1
+ {"version":3,"file":"sd-angular-core-components-document-builder.mjs","sources":["../../../projects/sd-angular/components/document-builder/src/components/header-footer-builder/plugins/page-number.plugin.ts","../../../projects/sd-angular/components/document-builder/src/components/header-footer-builder/header-footer-builder.component.ts","../../../projects/sd-angular/components/document-builder/src/plugins/heading/heading.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/comment/comment.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/variable/variable.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/table-fit/table-fit.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/image-upload/image-upload.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/image-custom/image-custom.plugin.ts","../../../projects/sd-angular/components/document-builder/src/plugins/page-orientation/page-orientation.plugin.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.config.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.utils.ts","../../../projects/sd-angular/components/document-builder/src/plugins/highlight-range/highlight-range.plugin.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.component.ts","../../../projects/sd-angular/components/document-builder/src/document-builder.component.html","../../../projects/sd-angular/components/document-builder/sd-angular-core-components-document-builder.ts"],"sourcesContent":["import { Plugin, ButtonView } from 'ckeditor5';\r\n\r\nexport class PageNumberPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n // 1. Đăng ký nút \"Số trang hiện tại\"\r\n editor.ui.componentFactory.add('pageNumber', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n view.set({\r\n label: 'Số trang hiện tại',\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M16 2H4c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H4V4h12v12zM6 6h2v2H6zm0 4h2v2H6zm0 4h2v2H6zm4-8h4v2h-4zm0 4h4v2h-4zm0 4h4v2h-4z\"/></svg>', // Icon đơn giản\r\n tooltip: true\r\n });\r\n\r\n // Khi bấm nút -> Chèn HTML đánh dấu\r\n view.on('execute', () => {\r\n editor.model.change(writer => {\r\n const viewFragment = editor.data.processor.toView(\r\n // Đây là HTML chuẩn để Word hiểu là số trang (dùng cho cách xuất MHTML/.doc)\r\n // Hoặc là marker để Backend replace\r\n '<span class=\"page-number-marker\" style=\"mso-field-code: PAGE; background: #eee; border: 1px dashed #999; padding: 0 4px;\">[PAGE]</span> ' \r\n );\r\n const modelFragment = editor.data.toModel(viewFragment);\r\n editor.model.insertContent(modelFragment);\r\n });\r\n });\r\n return view;\r\n });\r\n\r\n // 2. Đăng ký nút \"Tổng số trang\"\r\n editor.ui.componentFactory.add('totalPages', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n view.set({\r\n label: 'Tổng số trang',\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 2H6c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm2 16H8v-2h8v2zm0-4H8v-2h8v2zm-3-5V3.5L18.5 9H13z\"/></svg>',\r\n tooltip: true\r\n });\r\n\r\n view.on('execute', () => {\r\n editor.model.change(writer => {\r\n const viewFragment = editor.data.processor.toView(\r\n '<span class=\"total-page-marker\" style=\"mso-field-code: NUMPAGES; background: #eee; border: 1px dashed #999; padding: 0 4px;\">[TOTAL]</span> '\r\n );\r\n const modelFragment = editor.data.toModel(viewFragment);\r\n editor.model.insertContent(modelFragment);\r\n });\r\n });\r\n return view;\r\n });\r\n }\r\n}","import { Component, ViewEncapsulation, Input, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\n\r\nimport {\r\n ClassicEditor,\r\n EditorConfig,\r\n Essentials,\r\n Paragraph,\r\n Bold,\r\n Italic,\r\n Underline,\r\n FontSize,\r\n FontColor,\r\n FontBackgroundColor,\r\n Alignment,\r\n // Import Plugin tự viết\r\n // PageNumberPlugin (nếu import từ file ngoài)\r\n} from 'ckeditor5';\r\nimport { PageNumberPlugin } from './plugins/page-number.plugin';\r\n\r\n@Component({\r\n selector: 'sd-header-footer-builder',\r\n standalone: true,\r\n imports: [CommonModule, CKEditorModule],\r\n template: `\r\n <div class=\"header-footer-editor-wrapper\">\r\n <ckeditor [editor]=\"Editor\" [config]=\"config\" (ready)=\"onReady($event)\"> </ckeditor>\r\n </div>\r\n `,\r\n styles: [\r\n `\r\n /* Style tối giản cho vùng soạn thảo Header/Footer */\r\n :host ::ng-deep .header-footer-editor-wrapper .ck-editor__editable_inline {\r\n min-height: 100px; /* Header thường ngắn */\r\n max-height: 200px;\r\n padding: 10px 20px;\r\n border: 1px solid #ddd;\r\n }\r\n\r\n /* Style hiển thị cho Placeholder số trang trong lúc soạn thảo */\r\n :host ::ng-deep .page-number-marker,\r\n :host ::ng-deep .total-page-marker {\r\n font-size: 11px;\r\n color: #555;\r\n cursor: default;\r\n user-select: none;\r\n }\r\n `,\r\n ],\r\n})\r\nexport class SdHeaderFooterBuilder {\r\n #editor!: ClassicEditor;\r\n Editor = ClassicEditor;\r\n\r\n #model: string | undefined | null;\r\n @Input() set model(value: string | undefined | null) {\r\n if (this.#model !== value) {\r\n this.#model = value;\r\n }\r\n }\r\n\r\n @Output() modelChange = new EventEmitter<string>();\r\n config: EditorConfig = {\r\n licenseKey: 'GPL', // Hoặc key thương mại nếu có\r\n // 1. PLUGIN RÚT GỌN (Bỏ Table, List, PageBreak...)\r\n plugins: [\r\n Essentials,\r\n Paragraph,\r\n Bold,\r\n Italic,\r\n Underline,\r\n FontSize,\r\n FontColor,\r\n FontBackgroundColor,\r\n Alignment,\r\n PageNumberPlugin, // <--- Plugin số trang\r\n ],\r\n // 2. TOOLBAR ĐƠN GIẢN\r\n toolbar: {\r\n items: [\r\n 'undo',\r\n 'redo',\r\n '|',\r\n 'fontSize',\r\n 'fontColor',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n '|',\r\n 'alignment', // Căn trái/phải/giữa (Quan trọng cho Header/Footer)\r\n '|',\r\n 'pageNumber',\r\n 'totalPages', // <--- 2 nút mới\r\n ],\r\n shouldNotGroupWhenFull: true,\r\n },\r\n // Cấu hình alignment\r\n alignment: {\r\n options: ['left', 'center', 'right'],\r\n },\r\n };\r\n\r\n onReady(editor: ClassicEditor): void {\r\n this.#editor = editor;\r\n this.#editor.setData(this.#model || '');\r\n this.#editor.model.document.on('change:data', () => {\r\n this.#model = this.#editor.getData();\r\n this.modelChange.next(this.#model);\r\n });\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class HeadingPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n editor.conversion.for('editingDowncast').markerToHighlight({\r\n model: 'highlightMarker',\r\n view: {\r\n classes: 'ck-heading-highlight',\r\n },\r\n });\r\n }\r\n}\r\n","import { Plugin, ButtonView, Config } from 'ckeditor5';\r\nimport { SdEditorConfig } from '../../document-builder.model';\r\n\r\nexport class CommentPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n // 1. MODEL MARKER -> VIEW CSS\r\n editor.conversion.for('downcast').markerToHighlight({\r\n model: 'comment',\r\n view: data => {\r\n return {\r\n classes: 'ck-comment-marker',\r\n attributes: {\r\n 'data-comment-id': data.markerName,\r\n },\r\n };\r\n },\r\n });\r\n\r\n // 2. ĐĂNG KÝ UI COMPONENT: 'addCommentBtn'\r\n editor.ui.componentFactory.add('addCommentBtn', locale => {\r\n const view = new ButtonView(locale);\r\n\r\n // Lấy config từ Angular\r\n const config = editor.config as Config<SdEditorConfig>;\r\n const getOption = config.get('getOption') as SdEditorConfig['getOption'];\r\n const option = getOption?.();\r\n\r\n // Ẩn button nếu không có onAddComment\r\n if (!option?.onAddComment) {\r\n view.set({\r\n label: '',\r\n isVisible: false,\r\n });\r\n return view;\r\n }\r\n\r\n view.set({\r\n label: 'Thêm bình luận',\r\n icon: '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 13v6l-4-4H4a2 2 0 01-2-2V4a2 2 0 012-2h14a2 2 0 012 2v9zM5 7h10v2H5V7zm0 4h10v2H5v-2z\"/></svg>',\r\n tooltip: true,\r\n isEnabled: false,\r\n });\r\n\r\n // Logic Enable/Disable: Dựa theo Selection\r\n const selection = editor.model.document.selection;\r\n\r\n // Lắng nghe sự kiện change selection để bật/tắt nút\r\n this.listenTo(selection, 'change', () => {\r\n // Enable khi có bôi đen text (không phải collapsed)\r\n view.isEnabled = !selection.isCollapsed;\r\n });\r\n\r\n // Logic Execute: Khi bấm nút\r\n this.listenTo(view, 'execute', () => {\r\n const range = selection.getFirstRange();\r\n if (!range || !option?.onAddComment) return;\r\n // Helper lấy text thuần từ range\r\n let selectedText = '';\r\n for (const item of range.getItems()) {\r\n if (item.is('$text') || item.is('$textProxy')) {\r\n selectedText += (item as any).data;\r\n }\r\n }\r\n // BẮN EVENT RA NGOÀI - KHÔNG TỰ ADD MARKER\r\n // Angular component sẽ xử lý logic (mở modal, validation, etc.)\r\n // và gọi lại hàm addComment() nếu cần\r\n \r\n option.onAddComment({range, selectedText});\r\n });\r\n\r\n return view;\r\n });\r\n\r\n // 3. Xử lý sự kiện Copy (Clipboard Output)\r\n this.listenTo(editor.editing.view.document, 'clipboardOutput', (_, data) => {\r\n const isCopyOrCut = data.method === 'copy' || data.method === 'cut';\r\n // Nếu không phải hành động copy hoặc cut thì thoát hàm\r\n if (!isCopyOrCut) {\r\n return;\r\n }\r\n\r\n const content = data.content;\r\n\r\n editor.editing.view.change(writer => {\r\n // Tạo range bao quanh toàn bộ nội dung clipboard\r\n const range = writer.createRangeIn(content);\r\n // Mảng chứa các item cần xử lý\r\n const itemsToClean = [];\r\n\r\n // 1. Duyệt qua để tìm các thẻ có class ck-comment-marker\r\n for (const item of range.getItems()) {\r\n if (item.is('element') && item.hasClass('ck-comment-marker')) {\r\n itemsToClean.push(item);\r\n }\r\n }\r\n\r\n // 2. Thực hiện xóa Class và Attribute\r\n for (const item of itemsToClean) {\r\n // Xóa class 'ck-comment-marker'\r\n writer.removeClass('ck-comment-marker', item);\r\n // Xóa thuộc tính 'data-comment-id'\r\n writer.removeAttribute('data-comment-id', item);\r\n }\r\n });\r\n });\r\n }\r\n}\r\n","import { v4 as uuidv4 } from 'uuid';\r\nimport { Config, Plugin, Widget, toWidget } from 'ckeditor5';\r\nimport { SdDocumentBuilderVariable, SdEditorConfig } from '../../document-builder.model';\r\nimport { SdResolveMaybeAsync } from '@sd-angular/core/utilities';\r\n\r\nexport class VariablePlugin extends Plugin {\r\n // Khai báo dependencies nếu cần (VD: Widget)\r\n static get requires() {\r\n return [Widget];\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n const schema = editor.model.schema;\r\n const conversion = editor.conversion;\r\n const editingView = editor.editing.view;\r\n\r\n // 1. Định nghĩa Schema (Model)\r\n schema.register('variable', {\r\n inheritAllFrom: '$inlineObject',\r\n allowWhere: '$text',\r\n isInline: true,\r\n isObject: true,\r\n allowAttributes: ['id', 'uuid', 'value', 'display'],\r\n });\r\n\r\n // 2. Model -> HTML\r\n conversion.for('downcast').elementToElement({\r\n model: 'variable',\r\n view: (modelItem, { writer: viewWriter }) => {\r\n const id = modelItem.getAttribute('id') as string;\r\n const uuid = modelItem.getAttribute('uuid') as string;\r\n const display = modelItem.getAttribute('display') as string;\r\n const value = modelItem.getAttribute('value') as string;\r\n const widgetElement = viewWriter.createContainerElement('span', {\r\n class: 'variable-widget',\r\n 'data-id': id,\r\n 'data-uuid': uuid,\r\n 'data-value': value,\r\n 'data-display': display,\r\n });\r\n const innerText = viewWriter.createText(`{{${display}}}`);\r\n viewWriter.insert(viewWriter.createPositionAt(widgetElement, 0), innerText);\r\n return toWidget(widgetElement, viewWriter);\r\n },\r\n });\r\n\r\n // 3. HTML -> Model\r\n conversion.for('upcast').elementToElement({\r\n // NOTE: Khi bổ sung thêm attribute vào element variable, dev nên bổ sung thêm \"[atribute]: true\" vào view\r\n // Để:\r\n // - Nếu lọc chính xác sẽ không sinh ra thẻ span thừa bọc ngoài\r\n // - Nếu chưa bổ sung thì sẽ sinh ra thẻ <span> bọc ngoài kèm [atribute] chưa lọc\r\n view: {\r\n name: 'span',\r\n classes: 'variable-widget ck-widget',\r\n attributes: {\r\n 'data-id': true,\r\n 'data-uuid': true,\r\n 'data-value': true,\r\n 'data-display': true,\r\n contenteditable: true,\r\n },\r\n },\r\n model: (viewElement, { writer: modelWriter }) => {\r\n return modelWriter.createElement('variable', {\r\n id: viewElement.getAttribute('data-id'),\r\n uuid: viewElement.getAttribute('data-uuid'),\r\n value: viewElement.getAttribute('data-value'),\r\n display: viewElement.getAttribute('data-display'),\r\n });\r\n },\r\n });\r\n\r\n // 4. Xử lý sự kiện Drop\r\n this.listenTo(editingView.document, 'drop', async (evt, data) => {\r\n const dataTransfer = (data as any).dataTransfer;\r\n const jsonData = dataTransfer.getData('ck-variable');\r\n if (!jsonData) return;\r\n\r\n // data.dropRange là vị trí con chuột trên View khi thả\r\n const viewRange = (data as any).dropRange;\r\n const modelRange = editor.editing.mapper.toModelRange(viewRange);\r\n evt.stop();\r\n\r\n try {\r\n let variable: SdDocumentBuilderVariable = JSON.parse(jsonData);\r\n const config = editor.config as Config<SdEditorConfig>;\r\n const getOption = config.get('getOption') as SdEditorConfig['getOption'];\r\n const option = getOption?.();\r\n if (option?.onDropVariable) {\r\n const result = await SdResolveMaybeAsync<boolean | SdDocumentBuilderVariable>(option.onDropVariable(variable, 0));\r\n // * Hỗ trợ dữ liệu có sẵn sẽ chỉ cần nhận vào boolean có cho phép thả hay không?\r\n if (typeof result === 'boolean') {\r\n if (!result) {\r\n throw new Error('Không cho phép thêm variable vào văn bản');\r\n }\r\n } else {\r\n // * Hỗ trợ dữ liệu lấy từ API (Kiểm tra xem result có đúng định dạng interface SdDocumentBuilderVariable hay không?)\r\n if (this.#isSdDocumentBuilderVariableResult(result)) {\r\n variable = result;\r\n } else {\r\n throw new Error('Dữ liệu variable không hợp lệ');\r\n }\r\n }\r\n }\r\n\r\n editor.model.change(writer => {\r\n // 4.1. Chèn biến\r\n const variableElem = writer.createElement('variable', {\r\n id: variable.id,\r\n uuid: uuidv4(),\r\n value: variable.value,\r\n display: variable.display,\r\n });\r\n\r\n editor.model.insertContent(variableElem, modelRange);\r\n // 4.2. Đặt con trỏ ra sau biến\r\n writer.setSelection(variableElem, 'after');\r\n });\r\n } catch (e) {\r\n // Đặt con trỏ ngay tại vị trí lỗi\r\n if (modelRange) {\r\n editor.model.change(writer => {\r\n writer.setSelection(modelRange);\r\n });\r\n }\r\n console.error(e);\r\n } finally {\r\n // 5. Dọn dẹp drop-target dù thành công hay lỗi\r\n editor.model.change(writer => {\r\n for (const marker of editor.model.markers) {\r\n if (marker.name.startsWith('drop-target')) {\r\n writer.removeMarker(marker);\r\n }\r\n }\r\n });\r\n }\r\n });\r\n\r\n // 5. Lắng nghe sự kiện bàn phím\r\n let isNavigating = false;\r\n this.editor.editing.view.document.on(\r\n 'keydown',\r\n (evt, data) => {\r\n // Mã phím mũi tên: 37 (Left), 38 (Up), 39 (Right), 40 (Down)\r\n const isArrowKey = data.keyCode >= 37 && data.keyCode <= 40;\r\n if (isArrowKey) {\r\n isNavigating = true;\r\n } else {\r\n isNavigating = false;\r\n }\r\n },\r\n { priority: 'high' }\r\n );\r\n\r\n // 6. Lắng nghe sự kiện Click chuột\r\n this.editor.editing.view.document.on('mousedown', () => {\r\n isNavigating = true;\r\n });\r\n\r\n this.listenTo(editor.model.document.selection, 'change:range', () => {\r\n // Nếu không phải là hành động click hoặc mũi tên thì thoát hàm.\r\n if (!isNavigating) {\r\n return;\r\n }\r\n\r\n const model = editor.model;\r\n const selection = model.document.selection;\r\n if (!selection.isCollapsed) return;\r\n\r\n const position = selection.getFirstPosition();\r\n const nodeBefore = position?.nodeBefore;\r\n if (!position) return;\r\n\r\n // Kiểm tra: Node đứng trước con trỏ là variable\r\n if (nodeBefore && nodeBefore.is('element', 'variable')) {\r\n // Lấy node ngay sau variable để kiểm tra\r\n const nextNode = nodeBefore.nextSibling;\r\n\r\n // Logic: Nếu phía sau KHÔNG CÓ GÌ hoặc KHÔNG PHẢI LÀ TEXT\r\n if (!nextNode || !nextNode.is('$text')) {\r\n model.change(writer => {\r\n // Chèn thêm con trỏ variable\r\n writer.insertText('\\u00A0', nodeBefore, 'after');\r\n // Lấy vị trí ngay sau variable (lúc này đang là đầu của text node mới)\r\n const posAfterVariable = writer.createPositionAfter(nodeBefore);\r\n // Dịch chuyển vị trí đó sang phải 1 đơn vị (bỏ qua ký tự vừa thêm)\r\n const targetPos = posAfterVariable.getShiftedBy(1);\r\n // 3. Đặt con trỏ vào vị trí đã tính toán\r\n writer.setSelection(targetPos);\r\n });\r\n }\r\n }\r\n });\r\n\r\n // 7. Handle xóa variable\r\n this.editor.editing.view.document.on(\r\n 'keydown',\r\n (evt, data) => {\r\n // Mã phím 8 là Backspace, 46 là Delete\r\n const btnBackspace = data.keyCode === 8;\r\n const btnDelete = data.keyCode === 46;\r\n if (btnBackspace || btnDelete) {\r\n const selection = editor.model.document.selection;\r\n const model = editor.model;\r\n\r\n // CASE 1: Nếu con trỏ đang nhấp nháy (Collapsed)\r\n if (selection.isCollapsed) {\r\n const position = selection.getFirstPosition();\r\n // Với Backspace ta kiểm tra nodeBefore, với Delete ta kiểm tra nodeAfter\r\n const targetNode = data.keyCode === 8 ? position?.nodeBefore : position?.nodeAfter;\r\n\r\n if (targetNode && targetNode.is('element', 'variable')) {\r\n data.preventDefault();\r\n evt.stop();\r\n\r\n model.change(writer => {\r\n // Chọn bao quanh Variable đó\r\n writer.setSelection(targetNode, 'on');\r\n });\r\n return;\r\n }\r\n }\r\n // CASE 2: Nếu đang có một vùng chọn (đã được highlight từ lần bấm trước)\r\n else {\r\n const selectedElement = selection.getSelectedElement();\r\n\r\n // Nếu phần tử đang được chọn chính là variable\r\n if (selectedElement && selectedElement.is('element', 'variable')) {\r\n // Cho phép hành động mặc định diễn ra (CKEditor sẽ tự xóa phần tử đang được chọn)\r\n // Hoặc chủ động xóa để chắc chắn:\r\n data.preventDefault();\r\n evt.stop();\r\n\r\n model.change(writer => {\r\n writer.remove(selectedElement);\r\n });\r\n }\r\n }\r\n }\r\n },\r\n { priority: 'highest' }\r\n );\r\n\r\n // 8. Xử lý sự kiện Copy (Clipboard Output)\r\n // Chỉ set thêm text/plain fallback, không thay đổi HTML content\r\n this.listenTo(editor.editing.view.document, 'clipboardOutput', (evt, data) => {\r\n const isCopyOrCut = data.method === 'copy' || data.method === 'cut';\r\n if (!isCopyOrCut) return;\r\n\r\n // Set thêm plain text fallback cho external apps\r\n const dataTransfer = data.dataTransfer;\r\n const content = data.content;\r\n\r\n // Lấy tất cả text từ content (bao gồm cả variable dạng {{text}})\r\n let plainText = '';\r\n const viewRange = editor.editing.view.createRangeIn(content);\r\n for (const item of viewRange.getItems()) {\r\n if (item.is('$text') || item.is('element', 'span')) {\r\n const itemAny = item as any;\r\n if (item.is('$text') && itemAny.data) {\r\n plainText += itemAny.data;\r\n } else if (item.is('element', 'span') && item.hasClass('variable-widget')) {\r\n const display = item.getAttribute('data-display');\r\n if (display) plainText += `{{${display}}}`;\r\n }\r\n }\r\n }\r\n\r\n if (plainText) {\r\n dataTransfer.setData('text/plain', plainText);\r\n }\r\n\r\n // HTML content giữ nguyên - CKEditor sẽ tự xử lý\r\n }, { priority: 'low' });\r\n\r\n // 9. Xử lý sự kiện Paste (Clipboard Input)\r\n // Nếu paste từ external source (chỉ có text, không có HTML variable)\r\n // thì chuyển {{text}} thành variable widget\r\n this.listenTo(editor.editing.view.document, 'clipboardInput', (evt, data: any) => {\r\n const dataTransfer = data.dataTransfer;\r\n\r\n // Nếu có HTML chứa variable-widget thì để CKEditor xử lý (upcast converter)\r\n const html = dataTransfer.getData('text/html');\r\n if (html && html.includes('variable-widget')) {\r\n return; // Để CKEditor upcast converter xử lý\r\n }\r\n\r\n // Chỉ xử lý nếu chỉ có plain text với pattern {{text}}\r\n let text = dataTransfer.getData('text/plain');\r\n if (!text) return;\r\n\r\n // Kiểm tra có chứa pattern {{text}} không (không cần id, value)\r\n const variablePattern = /\\{\\{([^}]+)\\}\\}/g;\r\n if (!variablePattern.test(text)) {\r\n return;\r\n }\r\n\r\n // Reset lastIndex sau khi test\r\n variablePattern.lastIndex = 0;\r\n\r\n evt.stop();\r\n\r\n editor.model.change(writer => {\r\n const selection = editor.model.document.selection;\r\n const position = selection.getFirstPosition();\r\n if (!position) return;\r\n\r\n // Tách text thành các phần: normal text và variables\r\n let lastIndex = 0;\r\n let match;\r\n const fragments: Array<{ type: 'text' | 'variable'; content: string; display?: string }> = [];\r\n\r\n while ((match = variablePattern.exec(text)) !== null) {\r\n // Thêm text trước variable\r\n if (match.index > lastIndex) {\r\n fragments.push({\r\n type: 'text',\r\n content: text.slice(lastIndex, match.index),\r\n });\r\n }\r\n\r\n // Thêm variable\r\n const display = match[1];\r\n fragments.push({\r\n type: 'variable',\r\n content: match[0],\r\n display,\r\n });\r\n\r\n lastIndex = match.index + match[0].length;\r\n }\r\n\r\n // Thêm text còn lại sau variable cuối cùng\r\n if (lastIndex < text.length) {\r\n fragments.push({\r\n type: 'text',\r\n content: text.slice(lastIndex),\r\n });\r\n }\r\n\r\n // Chèn từng fragment vào document\r\n let currentPosition = position;\r\n for (const fragment of fragments) {\r\n if (fragment.type === 'text' && fragment.content) {\r\n const textNode = writer.createText(fragment.content);\r\n writer.insert(textNode, currentPosition);\r\n currentPosition = writer.createPositionAfter(textNode);\r\n } else if (fragment.type === 'variable' && fragment.display) {\r\n const variableElem = writer.createElement('variable', {\r\n id: uuidv4(),\r\n uuid: uuidv4(),\r\n value: fragment.display,\r\n display: fragment.display,\r\n });\r\n\r\n writer.insert(variableElem, currentPosition);\r\n currentPosition = writer.createPositionAfter(variableElem);\r\n }\r\n }\r\n\r\n // Đặt con trỏ sau nội dung vừa paste\r\n writer.setSelection(currentPosition);\r\n });\r\n });\r\n }\r\n\r\n #isSdDocumentBuilderVariableResult = (obj: any): obj is SdDocumentBuilderVariable => {\r\n return (\r\n obj !== null &&\r\n obj !== undefined &&\r\n typeof obj === 'object' &&\r\n !Array.isArray(obj) &&\r\n typeof obj.id === 'string' &&\r\n typeof obj.value === 'string' &&\r\n typeof obj.display === 'string'\r\n );\r\n };\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class TableFitPlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n // Can thiệp vào quá trình convert từ View (HTML Paste) sang Model\r\n editor.conversion.for('upcast').add(dispatcher => {\r\n dispatcher.on(\r\n 'element:table',\r\n (evt, data) => {\r\n if (!data.modelRange) return;\r\n\r\n for (const item of data.modelRange.getItems()) {\r\n if (item.is('element', 'table')) {\r\n editor.model.change(writer => {\r\n this._applyTableDefaults(writer, item);\r\n this._applyCellBorders(writer, item);\r\n });\r\n }\r\n }\r\n },\r\n { priority: 'low' }\r\n );\r\n });\r\n\r\n const findInnerTable = (viewElement: any): any => {\r\n if (!viewElement) return null;\r\n if (viewElement.name === 'table') return viewElement;\r\n\r\n for (const child of viewElement.getChildren()) {\r\n if (child.name === 'table') return child;\r\n const found = findInnerTable(child);\r\n if (found) return found;\r\n }\r\n return null;\r\n };\r\n\r\n editor.conversion.for('downcast').add(dispatcher => {\r\n dispatcher.on('attribute:tableWidth:table', (evt, data, conversionApi) => {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n const innerTable = findInnerTable(viewElement);\r\n if (!innerTable) return;\r\n\r\n viewWriter.setStyle('border-collapse', 'collapse', innerTable);\r\n viewWriter.setStyle('margin', '0', innerTable);\r\n viewWriter.setStyle('width', '100%', innerTable);\r\n viewWriter.setStyle('width', '100%', viewElement);\r\n });\r\n\r\n dispatcher.on('insert:table', (evt, data, conversionApi) => {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n const innerTable = findInnerTable(viewElement);\r\n if (!innerTable) return;\r\n\r\n viewWriter.setStyle('border-collapse', 'collapse', innerTable);\r\n viewWriter.setStyle('margin', '0', innerTable);\r\n viewWriter.setStyle('width', '100%', innerTable);\r\n viewWriter.setStyle('width', '100%', viewElement);\r\n });\r\n });\r\n\r\n // Lắng nghe lệnh insertTable\r\n const insertTableCommand = editor.commands.get('insertTable');\r\n if (insertTableCommand) {\r\n this.listenTo(insertTableCommand, 'execute', () => {\r\n editor.model.change(writer => {\r\n const position = editor.model.document.selection.getFirstPosition();\r\n if (!position) return;\r\n\r\n const tableElement = position.findAncestor('table');\r\n if (tableElement) {\r\n this._applyTableDefaults(writer, tableElement);\r\n writer.setAttribute('tableBorderColor', '#000000', tableElement);\r\n writer.setAttribute('tableBorderStyle', 'solid', tableElement);\r\n writer.setAttribute('tableBorderWidth', '1pt', tableElement);\r\n this._applyCellBorders(writer, tableElement);\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Listen for row/column commands\r\n const tableCommands = [\r\n 'insertTableRowAbove',\r\n 'insertTableRowBelow',\r\n 'insertTableColumnLeft',\r\n 'insertTableColumnRight',\r\n 'resizeTableRow',\r\n 'resizeTableColumn',\r\n 'setTableColumnWidth',\r\n 'tableColumnWidth'\r\n ];\r\n\r\n tableCommands.forEach(cmdName => {\r\n const cmd = editor.commands.get(cmdName);\r\n if (cmd) {\r\n this.listenTo(cmd, 'execute', () => {\r\n editor.model.change(writer => {\r\n const position = editor.model.document.selection.getFirstPosition();\r\n if (!position) return;\r\n\r\n const tableElement = position.findAncestor('table');\r\n if (tableElement) {\r\n this._applyTableDefaults(writer, tableElement);\r\n this._applyCellBorders(writer, tableElement);\r\n }\r\n });\r\n });\r\n }\r\n });\r\n\r\n // Setup style preservation on model change\r\n this._setupStylePreservationOnModelChange();\r\n }\r\n\r\n /**\r\n * Apply default table width\r\n */\r\n private _applyTableDefaults(writer: any, tableElement: any): void {\r\n if (!tableElement) return;\r\n writer.setAttribute('tableWidth', '100%', tableElement);\r\n }\r\n\r\n /**\r\n * Apply default borders to all cells in a table\r\n */\r\n private _applyCellBorders(writer: any, tableElement: any): void {\r\n if (!tableElement) return;\r\n\r\n for (const row of tableElement.getChildren()) {\r\n for (const cell of row.getChildren()) {\r\n if (!cell.getAttribute('tableCellBorderColor')) {\r\n writer.setAttribute('tableCellBorderColor', '#000000', cell);\r\n }\r\n if (!cell.getAttribute('tableCellBorderStyle')) {\r\n writer.setAttribute('tableCellBorderStyle', 'solid', cell);\r\n }\r\n if (!cell.getAttribute('tableCellBorderWidth')) {\r\n writer.setAttribute('tableCellBorderWidth', '1pt', cell);\r\n }\r\n if (!cell.getAttribute('tableCellPadding')) {\r\n writer.setAttribute('tableCellPadding', '0.4em', cell);\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Setup listener to preserve cell/table styles when model changes\r\n */\r\n private _setupStylePreservationOnModelChange(): void {\r\n const editor = this.editor;\r\n\r\n // Use listenTo for proper cleanup via destroy()\r\n this.listenTo(editor.model.document, 'change', (evt: unknown, batch: any) => {\r\n if (batch?.isLocal === false) return;\r\n\r\n const changes = editor.model.document.differ.getChanges();\r\n const tablesToFix = this._findTablesNeedingFix(changes);\r\n\r\n if (tablesToFix.size > 0) {\r\n editor.model.enqueueChange(() => {\r\n editor.model.change(writer => {\r\n for (const table of tablesToFix) {\r\n this._applyTableDefaults(writer, table);\r\n this._applyCellBorders(writer, table);\r\n }\r\n });\r\n });\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Find tables that need border fixes from model changes\r\n */\r\n private _findTablesNeedingFix(changes: any): Set<any> {\r\n const tablesToFix = new Set<any>();\r\n\r\n for (const change of changes) {\r\n if (change.type === 'attribute') {\r\n const attrKey = change.attributeKey;\r\n if (attrKey && (attrKey.includes('table') || attrKey.includes('column') || attrKey.includes('width'))) {\r\n const element = change.item;\r\n if (element) {\r\n const parentTable = this._findParentTable(element);\r\n if (parentTable) tablesToFix.add(parentTable);\r\n }\r\n }\r\n }\r\n\r\n if (change.type === 'insert' && change.position) {\r\n const tableElement = change.position.findAncestor?.('table') ||\r\n change.position.parent?.findAncestor?.('table');\r\n if (tableElement) tablesToFix.add(tableElement);\r\n }\r\n }\r\n\r\n return tablesToFix;\r\n }\r\n\r\n /**\r\n * Find parent table element\r\n */\r\n private _findParentTable(element: any): any {\r\n if (!element) return null;\r\n let parent = element;\r\n while (parent && !parent.is?.('element', 'table')) {\r\n parent = parent.parent;\r\n }\r\n return parent;\r\n }\r\n\r\n /**\r\n * Cleanup listeners when plugin is destroyed\r\n * Note: this.listenTo() listeners are automatically cleaned up by super.destroy()\r\n */\r\n override destroy(): void {\r\n super.destroy();\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class ImageUploadPlugin extends Plugin {\r\n static get pluginName() {\r\n return 'ImageUploadPlugin' as const;\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n \r\n editor.plugins.get('FileRepository').createUploadAdapter = (loader: any) => {\r\n return new Base64UploadAdapter(loader);\r\n };\r\n }\r\n}\r\n\r\nclass Base64UploadAdapter {\r\n private loader: any;\r\n\r\n constructor(loader: any) {\r\n this.loader = loader;\r\n }\r\n\r\n /**\r\n * Starts the upload process and converts the file to base64.\r\n * @returns Promise that resolves with the base64 URL\r\n */\r\n upload(): Promise<{ default: string }> {\r\n return this.loader.file.then((file: File) => {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n\r\n reader.onload = () => {\r\n const base64Url = reader.result as string;\r\n resolve({ default: base64Url });\r\n };\r\n\r\n reader.onerror = () => {\r\n reject('Failed to convert image to base64');\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Aborts the upload process.\r\n */\r\n abort(): void {\r\n // For base64 conversion, there's nothing to abort\r\n // This method is required by the UploadAdapter interface\r\n }\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class ImageCustomPlugin extends Plugin {\r\n static get pluginName() {\r\n return 'ImageCustomPlugin' as const;\r\n }\r\n\r\n init() {\r\n const editor = this.editor;\r\n\r\n // Thiết lập style mặc định là alignCenter khi chèn ảnh\r\n editor.commands.get('imageUpload')?.on('execute', (evt, args) => {\r\n // Đặt style mặc định sau khi ảnh được chèn\r\n setTimeout(() => {\r\n const selection = editor.model.document.selection;\r\n const imageElement = selection.getSelectedElement();\r\n if (imageElement && (imageElement.name === 'imageBlock' || imageElement.name === 'imageInline')) {\r\n const currentStyle = imageElement.getAttribute('imageStyle');\r\n // Chỉ đặt mặc định nếu chưa có style nào\r\n if (!currentStyle) {\r\n editor.model.change(writer => {\r\n writer.setAttribute('imageStyle', 'alignCenter', imageElement);\r\n });\r\n }\r\n }\r\n }, 0);\r\n });\r\n\r\n // Downcast: Model -> View (HTML output)\r\n // CKEditor 5 có 2 loại ảnh: imageBlock và imageInline\r\n editor.conversion.for('downcast').add(dispatcher => {\r\n // Xử lý ảnh block (được wrap trong figure)\r\n dispatcher.on(\r\n 'insert:imageBlock',\r\n (evt, data, conversionApi) => {\r\n this.handleImageInsert(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý ảnh inline\r\n dispatcher.on(\r\n 'insert:imageInline',\r\n (evt, data, conversionApi) => {\r\n this.handleImageInsert(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi attribute cho cả 2 loại ảnh\r\n ['imageBlock', 'imageInline'].forEach(imageType => {\r\n // Xử lý thay đổi src\r\n dispatcher.on(\r\n `attribute:src:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageAttributeChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi width\r\n dispatcher.on(\r\n `attribute:width:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageAttributeChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi height\r\n dispatcher.on(\r\n `attribute:height:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageAttributeChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n\r\n // Xử lý thay đổi imageStyle (căn chỉnh) - thêm float inline style\r\n dispatcher.on(\r\n `attribute:imageStyle:${imageType}`,\r\n (evt, data, conversionApi) => {\r\n this.handleImageStyleChange(evt, data, conversionApi);\r\n },\r\n { priority: 'low' }\r\n );\r\n });\r\n });\r\n\r\n // Xử lý upcast (HTML paste) - xóa aspect-ratio từ HTML đầu vào\r\n editor.conversion.for('upcast').add(dispatcher => {\r\n dispatcher.on(\r\n 'element:img',\r\n (evt, data, conversionApi) => {\r\n const viewItem = data.viewItem;\r\n if (!viewItem) return;\r\n\r\n // Kiểm tra viewItem có các method cần thiết\r\n if (typeof viewItem.getStyle !== 'function') return;\r\n\r\n // Xóa aspect-ratio từ inline styles nếu có\r\n const hasAspectRatio = viewItem.getStyle('aspect-ratio');\r\n if (hasAspectRatio && typeof viewItem.removeStyle === 'function') {\r\n viewItem.removeStyle('aspect-ratio');\r\n }\r\n\r\n // Đặt custom styles nếu _styles map tồn tại\r\n if (viewItem._styles && typeof viewItem._styles.set === 'function') {\r\n viewItem._styles.set('margin', '0');\r\n viewItem._styles.set('border', '0');\r\n viewItem._styles.set('max-width', '100%');\r\n viewItem._styles.set('height', 'auto');\r\n }\r\n },\r\n { priority: 'high' }\r\n );\r\n });\r\n }\r\n\r\n /**\r\n * Xử lý sự kiện chèn ảnh\r\n */\r\n private handleImageInsert(evt: any, data: any, conversionApi: any): void {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n // viewElement có thể là figure (cho block) hoặc img itself (cho inline)\r\n // Tìm element img thực tế\r\n const imgElement = this.findImgElement(viewElement);\r\n if (!imgElement) return;\r\n\r\n this.applyCustomStyles(viewWriter, imgElement);\r\n }\r\n\r\n /**\r\n * Xử lý sự kiện thay đổi attribute ảnh\r\n */\r\n private handleImageAttributeChange(evt: any, data: any, conversionApi: any): void {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n const imgElement = this.findImgElement(viewElement);\r\n if (!imgElement) return;\r\n\r\n this.applyCustomStyles(viewWriter, imgElement);\r\n }\r\n\r\n /**\r\n * Xử lý sự kiện thay đổi style ảnh - thêm float inline style cho căn chỉnh\r\n */\r\n private handleImageStyleChange(evt: any, data: any, conversionApi: any): void {\r\n const viewWriter = conversionApi.writer;\r\n const viewElement = conversionApi.mapper.toViewElement(data.item);\r\n\r\n if (!viewElement) return;\r\n\r\n // Tìm container ck-widget (element figure)\r\n const widgetElement = this.findWidgetElement(viewElement);\r\n if (!widgetElement) return;\r\n\r\n // Lấy giá trị imageStyle (căn chỉnh)\r\n const imageStyle = data.item.getAttribute('imageStyle') as string;\r\n\r\n // Xóa các style hiện có trước\r\n viewWriter.removeStyle('float', widgetElement);\r\n viewWriter.removeStyle('margin', widgetElement);\r\n viewWriter.removeStyle('text-align', widgetElement);\r\n\r\n // Áp dụng style dựa trên căn chỉnh ảnh\r\n // Các options đã cấu hình: ['inline', 'alignLeft', 'alignRight', 'alignCenter']\r\n switch (imageStyle) {\r\n case 'inline':\r\n // Ảnh inline - không style đặc biệt, chỉ flow inline\r\n break;\r\n case 'alignLeft':\r\n // Float trái\r\n viewWriter.setStyle('float', 'left', widgetElement);\r\n viewWriter.setStyle('margin', '0 16px 16px 0', widgetElement);\r\n break;\r\n case 'alignRight':\r\n // Float phải\r\n viewWriter.setStyle('float', 'right', widgetElement);\r\n viewWriter.setStyle('margin', '0 0 16px 16px', widgetElement);\r\n break;\r\n case 'alignCenter':\r\n case 'block':\r\n // Căn giữa\r\n viewWriter.setStyle('text-align', 'center', widgetElement);\r\n viewWriter.setStyle('margin', '16px auto', widgetElement);\r\n break;\r\n default:\r\n // Mặc định - căn giữa\r\n viewWriter.setStyle('text-align', 'center', widgetElement);\r\n viewWriter.setStyle('margin', '16px auto', widgetElement);\r\n break;\r\n }\r\n\r\n // Áp dụng custom styles cơ bản cho element img\r\n const imgElement = this.findImgElement(viewElement);\r\n if (imgElement) {\r\n this.applyCustomStyles(viewWriter, imgElement);\r\n }\r\n }\r\n\r\n /**\r\n * Áp dụng custom styles cho element ảnh\r\n */\r\n private applyCustomStyles(viewWriter: any, imgElement: any): void {\r\n // Xóa aspect-ratio nếu tồn tại\r\n if (imgElement.getStyle('aspect-ratio')) {\r\n viewWriter.removeStyle('aspect-ratio', imgElement);\r\n }\r\n\r\n // Áp dụng custom styles\r\n viewWriter.setStyle('margin', '0', imgElement);\r\n viewWriter.setStyle('border', '0', imgElement);\r\n viewWriter.setStyle('max-width', '100%', imgElement);\r\n viewWriter.setStyle('height', 'auto', imgElement);\r\n }\r\n\r\n /**\r\n * Tìm container ck-widget (element figure)\r\n * CKEditor wrap ảnh block trong <figure class=\"ck-widget\"><img></figure>\r\n */\r\n private findWidgetElement(viewElement: any): any {\r\n if (!viewElement) return null;\r\n\r\n // Nếu đây là element figure itself\r\n if (viewElement.name === 'figure') {\r\n return viewElement;\r\n }\r\n\r\n // Cho ảnh inline, trả về element itself (span wrapper)\r\n if (viewElement.name === 'span') {\r\n return viewElement;\r\n }\r\n\r\n // Tìm ngược lên tree để tìm figure/ck-widget\r\n let current = viewElement;\r\n while (current) {\r\n if (current.name === 'figure' || current.name === 'span') {\r\n return current;\r\n }\r\n // Di chuyển lên parent\r\n if (current.parent) {\r\n current = current.parent;\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n // Nếu không tìm thấy widget, trả về element gốc\r\n return viewElement;\r\n }\r\n\r\n /**\r\n * Tìm element img thực tế bên trong widget structure\r\n * CKEditor wrap ảnh block trong <figure class=\"ck-widget\"><img></figure>\r\n */\r\n private findImgElement(viewElement: any): any {\r\n if (!viewElement) return null;\r\n\r\n // Nếu đây là element img itself\r\n if (viewElement.name === 'img') {\r\n return viewElement;\r\n }\r\n\r\n // Cho structure widget của CKEditor, tìm đệ quy\r\n // Ảnh block: figure > span > img\r\n // Ảnh thường được wrap trong một container\r\n const queue = [viewElement];\r\n while (queue.length > 0) {\r\n const current = queue.shift();\r\n if (!current) continue;\r\n\r\n if (current.name === 'img') {\r\n return current;\r\n }\r\n\r\n // Thêm children vào queue\r\n if (current.getChildren) {\r\n for (const child of current.getChildren()) {\r\n queue.push(child);\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { ButtonView, Plugin } from 'ckeditor5';\r\n// Icon khổ dọc (Mặc định cũ)\r\nconst ICON_PORTRAIT =\r\n '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M14 2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6V4h8v12z\"/></svg>';\r\n\r\n// Icon khổ ngang (Mới)\r\nconst ICON_LANDSCAPE =\r\n '<svg viewBox=\"0 0 20 20\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M18 4H2C.9 4 0 4.9 0 6v8c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V6c0-1.1-.9-2-2-2zm0 10H2V6h16v8z\"/></svg>';\r\nexport class PageOrientationPlugin extends Plugin {\r\n public static readonly pluginName = 'PageOrientationPlugin';\r\n\r\n private _currentOrientation: 'PORTRAIT' | 'LANDSCAPE' = 'PORTRAIT';\r\n private orientationChangeEmitter?: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void;\r\n private buttonView?: ButtonView;\r\n\r\n init() {\r\n const editor = this.editor;\r\n const componentFactory = editor.ui.componentFactory;\r\n\r\n // Đăng ký nút tên là 'pageOrientation'\r\n componentFactory.add('pageOrientation', locale => {\r\n const view = new ButtonView(locale);\r\n this.buttonView = view;\r\n\r\n view.set({\r\n // label: 'Xoay giấy (A4)',\r\n icon: ICON_PORTRAIT,\r\n // tooltip: true,\r\n // withText: true,\r\n class: 'btn-orientation', // Class để style nếu cần\r\n });\r\n\r\n // Xử lý khi bấm nút\r\n view.on('execute', () => {\r\n this.toggleOrientation();\r\n });\r\n\r\n return view;\r\n });\r\n }\r\n\r\n /**\r\n * Toggle between portrait and landscape orientation\r\n */\r\n toggleOrientation(): void {\r\n const newOrientation = this._currentOrientation === 'PORTRAIT' ? 'LANDSCAPE' : 'PORTRAIT';\r\n this.setOrientation(newOrientation);\r\n }\r\n\r\n /**\r\n * Set orientation programmatically\r\n */\r\n setOrientation(orientation: 'PORTRAIT' | 'LANDSCAPE'): void {\r\n const editor = this.editor;\r\n const editingView = editor.editing.view;\r\n const rootElement = editingView.document.getRoot();\r\n\r\n editor.editing.view.change(writer => {\r\n if (orientation === 'LANDSCAPE') {\r\n writer.addClass('landscape', rootElement!);\r\n } else {\r\n writer.removeClass('landscape', rootElement!);\r\n }\r\n });\r\n\r\n // Update button icon\r\n if (this.buttonView) {\r\n this.buttonView.icon = orientation === 'LANDSCAPE' ? ICON_LANDSCAPE : ICON_PORTRAIT;\r\n }\r\n\r\n this._currentOrientation = orientation;\r\n this.orientationChangeEmitter?.(orientation);\r\n }\r\n\r\n /**\r\n * Get current orientation\r\n */\r\n getOrientation(): 'PORTRAIT' | 'LANDSCAPE' {\r\n return this._currentOrientation;\r\n }\r\n\r\n /**\r\n * Register callback for orientation changes\r\n */\r\n onOrientationChange(callback: (orientation: 'PORTRAIT' | 'LANDSCAPE') => void): void {\r\n this.orientationChangeEmitter = callback;\r\n }\r\n}\r\n","/**\r\n * Cấu hình màu cho Document Builder\r\n * Bảng màu tập trung và cấu hình cho việc lựa chọn màu nhất quán\r\n */\r\n\r\nimport { ColorPickerConfig, FontColorConfig, FontSizeConfig, HeadingConfig } from 'ckeditor5';\r\n\r\n/**\r\n * Trả về bảng màu chung được sử dụng trong tất cả tính năng của document builder\r\n * @returns Mảng các tùy chọn màu được định sẵn với giá trị hex và label\r\n */\r\nexport function getPresetColors(): FontColorConfig['colors'] {\r\n return [\r\n { color: '#000000', label: 'Black' },\r\n { color: '#4D4D4D', label: 'Dim grey' },\r\n { color: '#999999', label: 'Grey' },\r\n { color: '#E6E6E6', label: 'Light grey' },\r\n { color: '#FFFFFF', label: 'White' },\r\n { color: '#E64D4D', label: 'Red' },\r\n { color: '#E6994D', label: 'Orange' },\r\n { color: '#E6E64D', label: 'Yellow' },\r\n { color: '#99E64D', label: 'Light green' },\r\n { color: '#4DE64D', label: 'Green' },\r\n { color: '#4DE699', label: 'Aquamarine' },\r\n { color: '#4DE6E6', label: 'Turquoise' },\r\n { color: '#4D99E6', label: 'Light blue' },\r\n { color: '#4D4DE6', label: 'Blue' },\r\n { color: '#994DE6', label: 'Purple' },\r\n ];\r\n}\r\n\r\n/**\r\n * Trả về cấu hình bộ chọn màu với định dạng hex\r\n * @returns Đối tượng cấu hình bộ chọn màu\r\n */\r\nexport function getColorPickerConfig(): ColorPickerConfig {\r\n return {\r\n format: 'hex',\r\n };\r\n}\r\n\r\n/**\r\n * Trả về cấu hình kích thước font cho document builder\r\n * @returns Mảng các tùy chọn kích thước font được định sẵn\r\n */\r\nexport function getFontSizeOptions(): FontSizeConfig['options'] {\r\n return [\r\n {\r\n title: '9',\r\n model: '9pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '9pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '10',\r\n model: '10pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '10pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '11',\r\n model: '11pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '11pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '12',\r\n model: '12pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '12pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '13',\r\n model: '13pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '13pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '14',\r\n model: '14pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '14pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '16',\r\n model: '16pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '16pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '18',\r\n model: '18pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '18pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '20',\r\n model: '20pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '20pt' },\r\n priority: 7,\r\n },\r\n },\r\n {\r\n title: '24',\r\n model: '24pt',\r\n view: {\r\n name: 'span',\r\n styles: { 'font-size': '24pt' },\r\n priority: 7,\r\n },\r\n },\r\n ];\r\n}\r\n\r\nexport function getHeadingOptions(): HeadingConfig['options'] {\r\n return [\r\n { model: 'paragraph', title: 'Paragraph', class: 'ck-heading_paragraph' },\r\n { model: 'heading1', view: 'h1', title: 'Heading 1', class: 'ck-heading_heading1' },\r\n { model: 'heading2', view: 'h2', title: 'Heading 2', class: 'ck-heading_heading2' },\r\n { model: 'heading3', view: 'h3', title: 'Heading 3', class: 'ck-heading_heading3' },\r\n ];\r\n}\r\n","/**\r\n * Document Builder Utilities\r\n * Các hàm tiện ích cho document builder\r\n */\r\n\r\nimport { hslToHex, rgbToHex } from '@sd-angular/core/utilities';\r\n\r\n/**\r\n * Chuẩn hóa nội dung bằng cách chuyển đổi tất cả màu HSL và RGB sang hex\r\n * @param content - Nội dung HTML cần chuẩn hóa\r\n * @returns Nội dung đã được chuẩn hóa với màu hex\r\n */\r\nexport function normalize(content: string): string {\r\n let normalized = content;\r\n\r\n // Chuyển đổi HSL sang hex\r\n const hslRegex = /hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%?\\s*,\\s*(\\d+)%?\\s*\\)/gi;\r\n normalized = normalized.replace(hslRegex, (match, h, s, l) => {\r\n try {\r\n const hue = parseInt(h, 10);\r\n const saturation = parseInt(s, 10);\r\n const lightness = parseInt(l, 10);\r\n\r\n // Kiểm tra giá trị hợp lệ\r\n if (hue >= 0 && hue <= 360 && saturation >= 0 && saturation <= 100 && lightness >= 0 && lightness <= 100) {\r\n return hslToHex(hue, saturation, lightness);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to convert HSL to hex:', error, match);\r\n }\r\n\r\n return match; // Giữ nguyên nếu không thể chuyển đổi\r\n });\r\n\r\n // Chuyển đổi RGB sang hex\r\n const rgbRegex = /rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/gi;\r\n normalized = normalized.replace(rgbRegex, (match, r, g, b) => {\r\n try {\r\n const red = parseInt(r, 10);\r\n const green = parseInt(g, 10);\r\n const blue = parseInt(b, 10);\r\n\r\n if (red >= 0 && red <= 255 && green >= 0 && green <= 255 && blue >= 0 && blue <= 255) {\r\n return rgbToHex(red, green, blue);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to convert RGB to hex:', error, match);\r\n }\r\n\r\n return match;\r\n });\r\n\r\n return normalized;\r\n}\r\n","import { Plugin } from 'ckeditor5';\r\n\r\nexport class HighlightRangePlugin extends Plugin {\r\n init() {\r\n const editor = this.editor;\r\n\r\n editor.conversion.for('editingDowncast').markerToHighlight({\r\n model: 'highlightRange',\r\n view: {\r\n classes: 'highlight-range',\r\n },\r\n });\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { Component, EventEmitter, Input, Output } from '@angular/core';\r\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\r\nimport {\r\n Alignment,\r\n Bold,\r\n ClassicEditor,\r\n Essentials,\r\n FontBackgroundColor,\r\n FontColor,\r\n FontFamily,\r\n FontSize,\r\n GeneralHtmlSupport,\r\n Heading,\r\n Image,\r\n ImageBlock,\r\n ImageCaption,\r\n ImageResize,\r\n ImageStyle,\r\n ImageToolbar,\r\n ImageUpload,\r\n Indent,\r\n IndentBlock,\r\n Italic,\r\n List,\r\n ModelElement,\r\n ModelRange,\r\n PageBreak,\r\n Paragraph,\r\n PasteFromOffice,\r\n Subscript,\r\n Superscript,\r\n Table,\r\n TableCellProperties,\r\n TableColumnResize,\r\n TableProperties,\r\n TableToolbar,\r\n Underline,\r\n Undo,\r\n} from 'ckeditor5';\r\nimport { throttleTime, Subject, Subscription } from 'rxjs';\r\nimport { SdUtilities } from '@sd-angular/core/utilities';\r\nimport {\r\n CommentPlugin,\r\n PageOrientationPlugin,\r\n TableFitPlugin,\r\n VariablePlugin,\r\n ImageUploadPlugin,\r\n HeadingPlugin,\r\n ImageCustomPlugin,\r\n} from './plugins';\r\nimport { getPresetColors, getColorPickerConfig, getFontSizeOptions, getHeadingOptions } from './document-builder.config';\r\nimport {\r\n SdDocumentBuilderComment,\r\n SdDocumentBuilderHeading,\r\n SdDocumentBuilderOption,\r\n SdDocumentBuilderVariable,\r\n SdEditorConfig,\r\n} from './document-builder.model';\r\nimport { normalize } from './document-builder.utils';\r\nimport { HighlightRangePlugin } from './plugins/highlight-range/highlight-range.plugin';\r\n\r\n@Component({\r\n selector: 'sd-document-builder',\r\n standalone: true,\r\n imports: [CommonModule, CKEditorModule],\r\n templateUrl: './document-builder.component.html',\r\n styleUrls: [\r\n './document-builder.component.scss',\r\n './plugins/heading/heading.plugin.scss',\r\n './plugins/comment/comment.plugin.scss',\r\n './plugins/variable/variable.plugin.scss',\r\n './plugins/table-fit/table-fit.plugin.scss',\r\n './plugins/highlight-range/highlight-range.plugin.scss',\r\n ],\r\n})\r\nexport class SdDocumentBuilder {\r\n @Input({ required: true }) option!: SdDocumentBuilderOption;\r\n disabled = false;\r\n @Input('disabled') set _disabled(val: boolean | '' | undefined | null) {\r\n this.disabled = val === '' || !!val;\r\n this.#updateState();\r\n }\r\n @Output() contentChange = new EventEmitter<string>(); // Emit HTML content\r\n\r\n Editor = ClassicEditor;\r\n #editor!: ClassicEditor;\r\n\r\n #id = '55b0afb0-288d-423c-98b3-5f9db286e16d';\r\n #subscription = new Subscription();\r\n #sharedColors = getPresetColors();\r\n #headingOptions = getHeadingOptions();\r\n #fontSizeOptions = getFontSizeOptions();\r\n #colorPickerConfig = getColorPickerConfig();\r\n #contentChangeSubject = new Subject<string>();\r\n #idTimeOutScrollHeading: ReturnType<typeof setTimeout> | null = null;\r\n #headingElementsMap = new Map<string, ModelElement>(); // Hash lưu trữ các heading\r\n\r\n // Config\r\n config: SdEditorConfig = {\r\n getOption: () => this.option,\r\n licenseKey: 'GPL', // Hoặc key thương mại nếu có\r\n plugins: [\r\n GeneralHtmlSupport,\r\n FontSize,\r\n FontColor,\r\n FontFamily,\r\n FontBackgroundColor,\r\n Bold,\r\n Italic,\r\n Underline,\r\n Essentials,\r\n Paragraph,\r\n Heading,\r\n List,\r\n Table,\r\n TableToolbar,\r\n TableProperties,\r\n TableCellProperties,\r\n TableColumnResize,\r\n PasteFromOffice,\r\n PageBreak,\r\n Undo,\r\n Alignment, // Canh lề\r\n Subscript, // Mũ dưới (H₂O)\r\n Superscript, // Mũ trên (x²)\r\n // Image\r\n Image,\r\n ImageUpload,\r\n ImageToolbar,\r\n ImageCaption,\r\n ImageResize,\r\n ImageStyle,\r\n ImageBlock,\r\n // Custom Plugin\r\n HeadingPlugin,\r\n CommentPlugin,\r\n VariablePlugin,\r\n TableFitPlugin,\r\n Indent,\r\n IndentBlock,\r\n PageOrientationPlugin,\r\n ImageUploadPlugin,\r\n ImageCustomPlugin,\r\n HighlightRangePlugin,\r\n ],\r\n toolbar: {\r\n items: [\r\n 'pageOrientation',\r\n '|',\r\n 'heading',\r\n 'fontFamily',\r\n '|',\r\n 'fontSize',\r\n 'fontColor',\r\n 'fontBackgroundColor',\r\n '|',\r\n 'bold',\r\n 'italic',\r\n 'underline',\r\n 'subscript',\r\n 'superscript',\r\n '|',\r\n 'alignment',\r\n 'bulletedList',\r\n 'numberedList',\r\n '|',\r\n 'insertTable',\r\n 'imageUpload',\r\n 'pageBreak',\r\n '|',\r\n 'undo',\r\n 'redo',\r\n '|',\r\n 'addCommentBtn',\r\n ],\r\n shouldNotGroupWhenFull: true,\r\n },\r\n\r\n image: {\r\n styles: {\r\n options: ['inline', 'alignLeft', 'alignRight', 'alignCenter'],\r\n },\r\n toolbar: [\r\n 'imageStyle:inline',\r\n 'imageStyle:alignCenter',\r\n {\r\n name: 'imageStyle:alignDropdown',\r\n items: ['imageStyle:alignLeft', 'imageStyle:alignRight'],\r\n defaultItem: 'imageStyle:alignLeft',\r\n },\r\n ],\r\n },\r\n\r\n fontSize: {\r\n options: this.#fontSizeOptions,\r\n supportAllValues: false, // Khuyên dùng false để ép user chọn đúng size chuẩn\r\n },\r\n\r\n heading: {\r\n options: this.#headingOptions,\r\n },\r\n\r\n // 4. Cấu hình bảng màu (Tùy chọn)\r\n fontColor: {\r\n // columns: 5,\r\n documentColors: 10,\r\n colorPicker: this.#colorPickerConfig,\r\n colors: this.#sharedColors,\r\n },\r\n\r\n fontBackgroundColor: {\r\n // columns: 5,\r\n documentColors: 10,\r\n colorPicker: this.#colorPickerConfig,\r\n colors: this.#sharedColors,\r\n },\r\n\r\n table: {\r\n contentToolbar: ['tableColumn', 'tableRow', 'mergeTableCells', '|', 'tableProperties', 'tableCellProperties'],\r\n tableProperties: {\r\n borderColors: this.#sharedColors,\r\n backgroundColors: this.#sharedColors,\r\n colorPicker: this.#colorPickerConfig,\r\n defaultProperties: {\r\n borderStyle: 'solid',\r\n borderWidth: '1px',\r\n borderColor: '#ccc',\r\n },\r\n },\r\n tableCellProperties: {\r\n borderColors: this.#sharedColors,\r\n backgroundColors: this.#sharedColors,\r\n colorPicker: this.#colorPickerConfig,\r\n defaultProperties: {\r\n borderStyle: 'solid',\r\n borderWidth: '1px',\r\n borderColor: '#ccc',\r\n },\r\n },\r\n },\r\n\r\n indentBlock: {\r\n offset: 48, // Đơn vị px cho mỗi mức indent (tương đương 0.5 inch)\r\n unit: 'px',\r\n },\r\n\r\n // Quan trọng: Cho phép paste style từ Word nhưng bỏ qua margin/padding\r\n htmlSupport: {\r\n allow: [\r\n {\r\n name: /.*/,\r\n attributes: /.*/, // attributes chấp nhận boolean\r\n classes: /.*/, // Cho phép mọi class\r\n styles: {\r\n // Cho phép tất cả styles trừ margin và padding\r\n match: /^(?!margin|padding).*/,\r\n },\r\n },\r\n ],\r\n },\r\n };\r\n\r\n ngOnInit() {\r\n // Debounce trong rxjs không hỗ trợ leading --> throttleTime\r\n this.#subscription.add(\r\n this.#contentChangeSubject.pipe(throttleTime(500, undefined, { leading: true, trailing: true })).subscribe(content => {\r\n this.contentChange.emit(normalize(content));\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.#subscription.unsubscribe();\r\n }\r\n\r\n onReady(editor: ClassicEditor) {\r\n this.#editor = editor;\r\n\r\n // Setup orientation plugin callback\r\n try {\r\n const orientationPlugin = editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && typeof orientationPlugin.onOrientationChange === 'function') {\r\n orientationPlugin.onOrientationChange(orientation => {\r\n this.option.onOrientation?.(orientation);\r\n });\r\n\r\n // Set initial orientation if provided\r\n if (this.option.orientation) {\r\n orientationPlugin.setOrientation(this.option.orientation);\r\n }\r\n }\r\n } catch (error) {\r\n console.warn('PageOrientationPlugin not available:', error);\r\n }\r\n\r\n // Lắng nghe selection\r\n editor.model.document.selection.on('change', $event => {\r\n this.option.onSelection?.(this.#editor.model.document.selection, $event);\r\n });\r\n\r\n // Lắng nghe sự kiện thay đổi nội dung\r\n editor.model.document.on('change:data', () => {\r\n const content = editor.getData();\r\n this.#contentChangeSubject.next(content);\r\n });\r\n\r\n try {\r\n // Manual keybinding cho Tab nếu cần\r\n editor.keystrokes.set('Tab', (evt, cancel) => {\r\n const command = editor.commands.get('indentBlock');\r\n if (command && command.isEnabled) {\r\n editor.execute('indentBlock');\r\n cancel();\r\n }\r\n });\r\n\r\n // Manual keybinding cho Shift+Tab\r\n editor.keystrokes.set('Shift+Tab', (evt, cancel) => {\r\n const command = editor.commands.get('outdentBlock');\r\n if (command && command.isEnabled) {\r\n editor.execute('outdentBlock');\r\n cancel();\r\n }\r\n });\r\n } catch (error) {\r\n console.warn('Error setting up indent keybindings:', error);\r\n }\r\n\r\n this.#updateState();\r\n }\r\n\r\n setContent = (html: string) => {\r\n this.#editor?.setData?.(html);\r\n };\r\n\r\n getContent = () => {\r\n if (this.#editor) {\r\n return this.#editor.getData();\r\n }\r\n return '';\r\n };\r\n\r\n setOrientation = (orientation: 'PORTRAIT' | 'LANDSCAPE'): void => {\r\n if (!this.#editor) return;\r\n\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && typeof orientationPlugin.setOrientation === 'function') {\r\n orientationPlugin.setOrientation(orientation);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to set orientation:', error);\r\n }\r\n };\r\n\r\n getOrientation = (): 'PORTRAIT' | 'LANDSCAPE' => {\r\n if (!this.#editor) return 'PORTRAIT';\r\n\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && typeof orientationPlugin.getOrientation === 'function') {\r\n return orientationPlugin.getOrientation();\r\n }\r\n } catch (error) {\r\n console.warn('Failed to get orientation:', error);\r\n }\r\n\r\n return 'PORTRAIT';\r\n };\r\n\r\n scrollToTop() {\r\n setTimeout(() => {\r\n if (this.#editor) {\r\n const editableElement = this.#editor.ui.view.editable.element;\r\n if (editableElement) {\r\n const scrollContainer = editableElement.closest('.builder-container');\r\n if (scrollContainer) {\r\n scrollContainer.scrollTo({\r\n top: 0,\r\n behavior: 'smooth',\r\n });\r\n } else {\r\n editableElement.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n }\r\n }\r\n }, 100);\r\n }\r\n\r\n #updateState(): void {\r\n if (!this.#editor) return;\r\n if (this.disabled) {\r\n // Bật chế độ chỉ đọc với ID khóa\r\n this.#editor.enableReadOnlyMode(this.#id);\r\n\r\n // Disable page orientation button\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && (orientationPlugin as any).buttonView) {\r\n (orientationPlugin as any).buttonView.isEnabled = false;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to disable orientation button:', error);\r\n }\r\n } else {\r\n // Tắt chế độ chỉ đọc với ID khóa tương ứng\r\n this.#editor.disableReadOnlyMode(this.#id);\r\n\r\n // Enable page orientation button\r\n try {\r\n const orientationPlugin = this.#editor.plugins.get('PageOrientationPlugin') as PageOrientationPlugin;\r\n if (orientationPlugin && (orientationPlugin as any).buttonView) {\r\n (orientationPlugin as any).buttonView.isEnabled = true;\r\n }\r\n } catch (error) {\r\n console.warn('Failed to enable orientation button:', error);\r\n }\r\n }\r\n }\r\n\r\n #getTextFromElement = (element: ModelElement): string => {\r\n let text = '';\r\n // Heading trong Model chứa các text node con\r\n for (const child of element.getChildren()) {\r\n if (child.is('$text') || child.is('$textProxy')) {\r\n text += (child as any).data;\r\n }\r\n }\r\n return text;\r\n };\r\n\r\n #getTextFromRange = (range: ModelRange): string => {\r\n let text = '';\r\n for (const item of range.getItems()) {\r\n // TextProxy là một phần của Text Node nằm trong Range\r\n if (item.is('$textProxy') || item.is('$text')) {\r\n text += (item as any).data;\r\n }\r\n }\r\n return text;\r\n };\r\n\r\n // ========================================================================\r\n // 1. QUẢN LÝ HEADING\r\n // ========================================================================\r\n heading = {\r\n /**\r\n * Lấy tất cả headings trong document\r\n * @returns Danh sách tất cả headings\r\n */\r\n all: (): SdDocumentBuilderHeading[] => {\r\n if (!this.#editor) return [];\r\n\r\n const root = this.#editor.model.document.getRoot();\r\n if (!root) return [];\r\n\r\n // Reset lại map mỗi lần quét\r\n this.#headingElementsMap.clear();\r\n\r\n const headings: SdDocumentBuilderHeading[] = [];\r\n const range = this.#editor.model.createRangeIn(root);\r\n\r\n // Biến đếm để tạo ID unique\r\n let index = 0;\r\n\r\n for (const item of range.getItems()) {\r\n // Kiểm tra xem item có phải là Element và tên bắt đầu bằng 'heading' không\r\n if (item.is('element') && item.name.startsWith('heading')) {\r\n // 1. Lấy text của heading\r\n const text = this.#getTextFromElement(item);\r\n // 2. Xác định Level (heading1 -> 1, heading2 -> 2)\r\n // item.name có dạng 'heading1', 'heading2'\r\n const level = parseInt(item.name.replace('heading', ''), 10) || 1;\r\n // 3. Tạo ID runtime (Dùng để map khi click scroll)\r\n // Bạn có thể generate slug từ text nếu muốn, ở đây mình dùng index cho đơn giản và unique\r\n const id = `heading_${index}_${Date.now()}`;\r\n // 4. Lưu tham chiếu Model Element vào Map\r\n this.#headingElementsMap.set(id, item as ModelElement);\r\n headings.push({\r\n id: id,\r\n text: text,\r\n level: level,\r\n type: item.name,\r\n });\r\n index++;\r\n }\r\n }\r\n\r\n return headings;\r\n },\r\n\r\n /**\r\n * Scroll tới vị trí của heading\r\n * @param id - ID của heading cần scroll tới\r\n */\r\n scroll: (id: string) => {\r\n if (!this.#editor) return;\r\n\r\n const modelElement = this.#headingElementsMap.get(id);\r\n\r\n if (modelElement) {\r\n this.#editor.model.change(writer => {\r\n // Xóa marker cũ\r\n if (this.#idTimeOutScrollHeading) {\r\n clearTimeout(this.#idTimeOutScrollHeading);\r\n }\r\n const currentMarker = this.#editor.model.markers.get('highlightMarker');\r\n if (currentMarker) {\r\n writer.removeMarker(currentMarker);\r\n }\r\n\r\n // Tạo Range bao trùm highlight\r\n const range = writer.createRangeOn(modelElement);\r\n\r\n // Thêm Marker mới\r\n writer.addMarker('highlightMarker', {\r\n range: range,\r\n usingOperation: false,\r\n });\r\n });\r\n\r\n // Scroll tới vị trí tìm được\r\n const viewElement = this.#editor.editing.mapper.toViewElement(modelElement);\r\n if (viewElement) {\r\n const domElement = this.#editor.editing.view.domConverter.viewToDom(viewElement);\r\n if (domElement) {\r\n domElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n }\r\n }\r\n\r\n // Tự động tắt marker sau 5 giây\r\n this.#idTimeOutScrollHeading = setTimeout(() => {\r\n if (this.#editor) {\r\n this.#editor.model.change(writer => {\r\n const marker = this.#editor.model.markers.get('highlightMarker');\r\n if (marker) writer.removeMarker(marker);\r\n });\r\n }\r\n }, 5000);\r\n } else {\r\n console.warn(`Heading with id ${id} not found.`);\r\n }\r\n },\r\n };\r\n\r\n // ========================================================================\r\n // 2. QUẢN LÝ COMMENT\r\n // ========================================================================\r\n comment = {\r\n /**\r\n * Lấy tất cả comments trong document\r\n * @returns Danh sách tất cả comments\r\n */\r\n all: (): SdDocumentBuilderComment[] => {\r\n if (!this.#editor) return [];\r\n\r\n const editableElement = this.#editor.ui.view.editable.element;\r\n if (!editableElement) return [];\r\n\r\n const commentMarkers = editableElement.querySelectorAll('.ck-comment-marker[data-comment-id^=\"comment:\"]') || [];\r\n const commentsMap = new Map<string, SdDocumentBuilderComment>();\r\n\r\n commentMarkers.forEach(el => {\r\n const markerId = el.getAttribute('data-comment-id');\r\n if (markerId) {\r\n const existing = commentsMap.get(markerId);\r\n const text = el.textContent || '';\r\n if (existing) {\r\n existing.selectedText += text;\r\n } else {\r\n commentsMap.set(markerId, {\r\n markerId,\r\n selectedText: text,\r\n });\r\n }\r\n }\r\n });\r\n\r\n return Array.from(commentsMap.values());\r\n },\r\n\r\n /**\r\n * Thêm comment vào vùng text đang được chọn\r\n * @param comment - Dữ liệu comment\r\n * @param data - Dữ liệu extra data\r\n * @returns SdDocumentBuilderComment hoặc null nếu không có text được chọn\r\n */\r\n add: <T = any>(\r\n range: ModelRange,\r\n comment: string,\r\n args?: {\r\n markerIdExternal?: string | number;\r\n data?: T;\r\n }\r\n ): SdDocumentBuilderComment<T> | null => {\r\n // markerIdExternal khi truyền từ bên ngoài vào sẽ có thể là Date.now() hoặc uuidv4().\r\n // Miễn là đảm bảo markerIdExternal là unique.\r\n // Phục vụ cho case gọi API comment thành công thì mới sinh ra markerId.\r\n const { markerIdExternal, data } = args ?? {};\r\n\r\n if (!this.#editor) return null;\r\n const model = this.#editor.model;\r\n if (!range) return null;\r\n // 3. Lấy text từ range\r\n const selectedText = this.#getTextFromRange(range);\r\n if (!selectedText.trim()) {\r\n console.warn('Selected text is empty');\r\n return null;\r\n }\r\n // 4. Tạo ID unique cho marker\r\n const markerId = markerIdExternal ? `comment:${markerIdExternal}` : `comment:${Date.now()}`;\r\n // 5. Tạo marker trong model\r\n model.change(writer => {\r\n writer.addMarker(markerId, {\r\n range,\r\n usingOperation: true, // Quan trọng: Cho phép undo/redo\r\n affectsData: true, // Lưu marker vào data khi getData()\r\n });\r\n });\r\n return {\r\n markerId,\r\n selectedText,\r\n comment,\r\n createdAt: new Date(),\r\n data,\r\n };\r\n },\r\n\r\n /**\r\n * Cập nhật nội dung comment\r\n * @param markerId - ID của marker\r\n * @param commentData - Dữ liệu mới\r\n * @returns Comment đã cập nhật hoặc null\r\n */\r\n update: <T = any>(markerId: string, comment: string, data?: T): SdDocumentBuilderComment<T> | null => {\r\n if (!this.#editor) return null;\r\n const marker = this.#editor.model.markers.get(markerId);\r\n if (!marker) {\r\n console.warn(`Marker ${markerId} not found`);\r\n return null;\r\n }\r\n // Lấy text hiện tại từ marker (có thể đã thay đổi)\r\n const currentText = this.#getTextFromRange(marker.getRange());\r\n return {\r\n markerId: markerId,\r\n selectedText: currentText,\r\n comment,\r\n data,\r\n };\r\n },\r\n\r\n /**\r\n * Lấy chi tiết comment theo markerId\r\n * @param markerId - ID của marker\r\n * @returns Comment hoặc null\r\n */\r\n detail: (markerId: string): SdDocumentBuilderComment | null => {\r\n if (!this.#editor) return null;\r\n const marker = this.#editor.model.markers.get(markerId);\r\n if (!marker) return null;\r\n const currentText = this.#getTextFromRange(marker.getRange());\r\n return {\r\n markerId: markerId,\r\n selectedText: currentText,\r\n };\r\n },\r\n\r\n /**\r\n * Xóa comment theo markerId\r\n * @param markerId - ID của marker cần xóa\r\n * @returns true nếu xóa thành công, false nếu không tìm thấy\r\n */\r\n remove: (markerId: string): boolean => {\r\n if (!this.#editor) return false;\r\n const model = this.#editor.model;\r\n const marker = model.markers.get(markerId);\r\n if (!marker) {\r\n console.warn(`Marker ${markerId} not found`);\r\n return false;\r\n }\r\n model.change(writer => {\r\n writer.removeMarker(markerId);\r\n });\r\n return true;\r\n },\r\n\r\n /**\r\n * Scroll đến vị trí comment\r\n * @param markerId - ID của marker cần scroll tới\r\n */\r\n scroll: (markerId: string): void => {\r\n if (!this.#editor) return;\r\n const editor = this.#editor;\r\n const marker = editor.model.markers.get(markerId);\r\n if (marker) {\r\n // 1. Set Selection vào Marker đó trước\r\n editor.model.change(writer => {\r\n writer.setSelection(marker.getRange());\r\n });\r\n\r\n // 2. Sau đó gọi scrollToTheSelection\r\n editor.editing.view.scrollToTheSelection({\r\n alignToTop: true,\r\n });\r\n editor.editing.view.focus();\r\n } else {\r\n console.warn(`Marker with id ${markerId} not found.`);\r\n }\r\n },\r\n };\r\n\r\n // ========================================================================\r\n // 3. QUẢN LÝ VARIABLE\r\n // ========================================================================\r\n variable = {\r\n /**\r\n * Lấy tất cả variabes trong document\r\n * @returns Danh sách tất cả variables\r\n */\r\n all: <T = any>(): SdDocumentBuilderVariable<T>[] => {\r\n if (!this.#editor) return [];\r\n const model = this.#editor.model;\r\n const root = model.document.getRoot();\r\n if (!root) return [];\r\n\r\n const variables: SdDocumentBuilderVariable<T>[] = [];\r\n try {\r\n const range = model.createRangeIn(root);\r\n\r\n for (const item of range.getItems()) {\r\n // Sử dụng item.is('element', 'variable') là chính xác\r\n if (item.is('element', 'variable')) {\r\n variables.push({\r\n id: item.getAttribute('id') as string,\r\n uuid: item.getAttribute('uuid') as string,\r\n value: item.getAttribute('value') as string,\r\n display: item.getAttribute('display') as string,\r\n });\r\n }\r\n }\r\n } catch (e) {\r\n console.error(e);\r\n return [];\r\n }\r\n\r\n return variables;\r\n },\r\n\r\n /**\r\n * Scroll tới vị trí của variable\r\n * @param uuid - uuid của variable FE sẽ tự sinh sau mỗi lần drop vào editor\r\n */\r\n scroll: (uuid: string) => {\r\n if (!this.#editor) return;\r\n\r\n const model = this.#editor.model;\r\n const root = model.document.getRoot();\r\n if (!root) return;\r\n\r\n let targetElement = null;\r\n const range = model.createRangeIn(root);\r\n for (const item of range.getItems()) {\r\n if (item.is('element', 'variable') && item.getAttribute('uuid') === uuid) {\r\n targetElement = item;\r\n break;\r\n }\r\n }\r\n\r\n if (targetElement) {\r\n const viewElement = this.#editor.editing.mapper.toViewElement(targetElement);\r\n if (viewElement) {\r\n const domElement = this.#editor.editing.view.domConverter.viewToDom(viewElement);\r\n if (domElement) {\r\n domElement.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n model.change(writer => {\r\n writer.setSelection(targetElement, 'on');\r\n });\r\n }\r\n }\r\n } else {\r\n console.warn(`Variable với id ${uuid} không tìm thấy trong tài liệu.`);\r\n }\r\n },\r\n };\r\n\r\n // ========================================================================\r\n // 4. HÀM EXPORT DOCX (FULL HEADER/FOOTER + PAGE NUMBER)\r\n // ========================================================================\r\n /**\r\n * Xuất file Word có Header/Footer\r\n * @param fileName Tên file\r\n * @param headerText Nội dung Header (hoặc HTML)\r\n * '<p style=\"text-align: center; font-weight: bold;\">CÔNG TY CỔ PHẦN CÔNG NGHỆ ABC</p>'\r\n * @param footerText Nội dung Footer (hoặc HTML)\r\n * '<p style=\"text-align: right; font-size: 10pt;\">Trang <span style=\"mso-field-code: PAGE\"></span> / <span style=\"mso-field-code: NUMPAGES\"></span></p>'\r\n */\r\n exportDocx(args: { fileName?: string; header?: string; footer?: string }): void {\r\n if (!this.#editor) return;\r\n const fileName = args?.fileName || `document_${Date.now()}.docx`;\r\n const header = args?.header || ``;\r\n const footer = args?.footer || ``;\r\n // 1. Kiểm tra xoay giấy\r\n const rootElement = this.#editor.editing.view.document.getRoot();\r\n const isLandscape = rootElement?.hasClass('landscape');\r\n const orientation = isLandscape ? 'landscape' : 'portrait';\r\n\r\n // Kích thước giấy cho Word (A4)\r\n // Portrait: 21cm x 29.7cm\r\n // Landscape: 29.7cm x 21cm\r\n // @page size trong CSS Word đôi khi cần set cứng width/height để header không bị lệch\r\n const pageCss = isLandscape\r\n ? 'size: 29.7cm 21cm; mso-page-orientation: landscape;'\r\n : 'size: 21cm 29.7cm; mso-page-orientation: portrait;';\r\n\r\n const contentHtml = this.#editor.getData();\r\n\r\n // 2. TẠO HTML CHUẨN MICROSOFT WORD XML\r\n // Phải có xmlns:o và xmlns:w thì Word mới hiểu được các lệnh mso-\r\n const fullHtml = `\r\n <html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'>\r\n <head>\r\n <meta charset=\"UTF-8\">\r\n <title>Export Document</title>\r\n \r\n <style>\r\n /* --- 1. SETUP TRANG GIẤY & HEADER/FOOTER --- */\r\n @page {\r\n ${pageCss}\r\n margin: 2.0cm; /* Lề chuẩn 2cm */\r\n \r\n /* Kỹ thuật map ID của Word */\r\n mso-header: header1;\r\n mso-footer: footer1;\r\n }\r\n\r\n /* Quan trọng: Ẩn các div header/footer khỏi luồng văn bản chính */\r\n /* Chúng sẽ chỉ hiện thị khi được @page gọi thông qua mso-header/footer */\r\n div#header1 { display: none; }\r\n div#footer1 { display: none; }\r\n\r\n /* --- 2. STYLE CƠ BẢN --- */\r\n body {\r\n font-family: 'Times New Roman', serif;\r\n font-size: 13pt;\r\n line-height: 1.5;\r\n tab-interval: 36pt;\r\n }\r\n \r\n /* Style Bảng */\r\n table { width: 100%; border-collapse: collapse; }\r\n td, th { border: 1px solid black; padding: 5px; }\r\n\r\n /* Style Biến (Giữ nguyên giao diện đẹp của bạn) */\r\n .variable-widget {\r\n color: #1565c0; font-weight: bold;\r\n background: #e3f2fd; padding: 0 4px; border-radius: 4px;\r\n border: 1px solid #90caf9;\r\n }\r\n \r\n /* Ẩn Comment khi in/xuất file */\r\n .ck-comment-marker { background-color: transparent; border: none; text-decoration: none; }\r\n </style>\r\n </head>\r\n <body>\r\n \r\n <div id=\"header1\">\r\n <div style=\"mso-element:header\">\r\n ${header}\r\n <div style='border-bottom: 1px solid #000; margin-top: 5px; margin-bottom: 20px;'></div>\r\n </div>\r\n </div>\r\n\r\n <div id=\"footer1\">\r\n <div style=\"mso-element:footer\">\r\n <div style='border-top: 1px solid #000; margin-top: 20px; margin-bottom: 5px;'></div>\r\n ${footer}\r\n </div>\r\n </div>\r\n\r\n <div class=\"content\">\r\n ${contentHtml}\r\n </div>\r\n\r\n </body>\r\n </html>\r\n `;\r\n\r\n // 3. TẠO BLOB VÀ TẢI XUỐNG\r\n // Lưu ý: Dùng type 'application/msword' thay vì dùng thư viện html-docx-js\r\n // Thêm '\\ufeff' (BOM) để fix lỗi font tiếng Việt\r\n const blob = new Blob(['\\ufeff', fullHtml], { type: 'application/msword' });\r\n SdUtilities.downloadBlob(blob, fileName);\r\n }\r\n\r\n hightSelectRange = (range: ModelRange): void => {\r\n if (!range) return;\r\n const editor = this.#editor;\r\n\r\n editor.model.change(writer => {\r\n // Xóa marker cũ (nếu có)\r\n if (editor.model.markers.has('highlightRange')) {\r\n writer.removeMarker('highlightRange');\r\n }\r\n\r\n // Tạo marker mới\r\n writer.addMarker('highlightRange', {\r\n usingOperation: false, // Không lưu vào lịch sử Undo/Redo\r\n affectsData: false, // Không ảnh hưởng đến data lấy ra (getData)\r\n range: range,\r\n });\r\n });\r\n };\r\n\r\n removeHighlightSeclectRange = (): void => {\r\n const editor = this.#editor;\r\n editor.model.change(writer => {\r\n if (editor.model.markers.has('highlightRange')) {\r\n writer.removeMarker('highlightRange');\r\n }\r\n });\r\n };\r\n}\r\n","<div class=\"builder-container\">\n <ckeditor\n style=\"width: 100%\"\n [editor]=\"Editor\" \n [config]=\"config\" \n (ready)=\"onReady($event)\"\n [disabled]=\"disabled\">\n </ckeditor>\n</div>","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["uuidv4"],"mappings":"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"}