@sdcorejs/angular 20.0.7 → 20.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +8 -2
  2. package/assets/STYLE-GUIDE.md +13 -0
  3. package/components/autoid-inspector/index.d.ts +47 -137
  4. package/components/table/index.d.ts +5 -9
  5. package/fesm2022/sdcorejs-angular-components-anchor.mjs +2 -3
  6. package/fesm2022/sdcorejs-angular-components-anchor.mjs.map +1 -1
  7. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs +195 -25
  8. package/fesm2022/sdcorejs-angular-components-autoid-inspector.mjs.map +1 -1
  9. package/fesm2022/sdcorejs-angular-components-badge.mjs +2 -2
  10. package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
  11. package/fesm2022/sdcorejs-angular-components-button.mjs +2 -2
  12. package/fesm2022/sdcorejs-angular-components-button.mjs.map +1 -1
  13. package/fesm2022/sdcorejs-angular-components-document-builder.mjs +5 -6
  14. package/fesm2022/sdcorejs-angular-components-document-builder.mjs.map +1 -1
  15. package/fesm2022/sdcorejs-angular-components-editor.mjs +4 -4
  16. package/fesm2022/sdcorejs-angular-components-editor.mjs.map +1 -1
  17. package/fesm2022/sdcorejs-angular-components-form-generic.mjs +4 -4
  18. package/fesm2022/sdcorejs-angular-components-form-generic.mjs.map +1 -1
  19. package/fesm2022/sdcorejs-angular-components-import-excel.mjs.map +1 -1
  20. package/fesm2022/sdcorejs-angular-components-inform.mjs +2 -2
  21. package/fesm2022/sdcorejs-angular-components-inform.mjs.map +1 -1
  22. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs +2 -2
  23. package/fesm2022/sdcorejs-angular-components-modal-resizable.mjs.map +1 -1
  24. package/fesm2022/sdcorejs-angular-components-modal.mjs +2 -2
  25. package/fesm2022/sdcorejs-angular-components-modal.mjs.map +1 -1
  26. package/fesm2022/sdcorejs-angular-components-operator.mjs +2 -2
  27. package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -1
  28. package/fesm2022/sdcorejs-angular-components-org-chart.mjs +2 -2
  29. package/fesm2022/sdcorejs-angular-components-org-chart.mjs.map +1 -1
  30. package/fesm2022/sdcorejs-angular-components-preview.mjs +3 -3
  31. package/fesm2022/sdcorejs-angular-components-preview.mjs.map +1 -1
  32. package/fesm2022/sdcorejs-angular-components-query-bar.mjs +8 -8
  33. package/fesm2022/sdcorejs-angular-components-query-bar.mjs.map +1 -1
  34. package/fesm2022/sdcorejs-angular-components-section.mjs +2 -2
  35. package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
  36. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs +6 -4
  37. package/fesm2022/sdcorejs-angular-components-side-drawer.mjs.map +1 -1
  38. package/fesm2022/sdcorejs-angular-components-table.mjs +772 -810
  39. package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
  40. package/fesm2022/sdcorejs-angular-components-tree.mjs +2 -2
  41. package/fesm2022/sdcorejs-angular-components-tree.mjs.map +1 -1
  42. package/fesm2022/sdcorejs-angular-components-upload-file.mjs +7 -8
  43. package/fesm2022/sdcorejs-angular-components-upload-file.mjs.map +1 -1
  44. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs +4 -5
  45. package/fesm2022/sdcorejs-angular-forms-autocomplete.mjs.map +1 -1
  46. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs +3 -3
  47. package/fesm2022/sdcorejs-angular-forms-checkbox.mjs.map +1 -1
  48. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs +4 -4
  49. package/fesm2022/sdcorejs-angular-forms-chip-calendar.mjs.map +1 -1
  50. package/fesm2022/sdcorejs-angular-forms-chip.mjs +4 -4
  51. package/fesm2022/sdcorejs-angular-forms-chip.mjs.map +1 -1
  52. package/fesm2022/sdcorejs-angular-forms-date-range.mjs +16 -9
  53. package/fesm2022/sdcorejs-angular-forms-date-range.mjs.map +1 -1
  54. package/fesm2022/sdcorejs-angular-forms-date.mjs +5 -6
  55. package/fesm2022/sdcorejs-angular-forms-date.mjs.map +1 -1
  56. package/fesm2022/sdcorejs-angular-forms-datetime.mjs +5 -6
  57. package/fesm2022/sdcorejs-angular-forms-datetime.mjs.map +1 -1
  58. package/fesm2022/sdcorejs-angular-forms-inline-text.mjs +2 -2
  59. package/fesm2022/sdcorejs-angular-forms-inline-text.mjs.map +1 -1
  60. package/fesm2022/sdcorejs-angular-forms-input-number.mjs +5 -6
  61. package/fesm2022/sdcorejs-angular-forms-input-number.mjs.map +1 -1
  62. package/fesm2022/sdcorejs-angular-forms-input.mjs +3 -3
  63. package/fesm2022/sdcorejs-angular-forms-input.mjs.map +1 -1
  64. package/fesm2022/sdcorejs-angular-forms-radio.mjs +3 -4
  65. package/fesm2022/sdcorejs-angular-forms-radio.mjs.map +1 -1
  66. package/fesm2022/sdcorejs-angular-forms-select.mjs +2 -2
  67. package/fesm2022/sdcorejs-angular-forms-select.mjs.map +1 -1
  68. package/fesm2022/sdcorejs-angular-forms-switch.mjs +3 -4
  69. package/fesm2022/sdcorejs-angular-forms-switch.mjs.map +1 -1
  70. package/fesm2022/sdcorejs-angular-forms-textarea.mjs +5 -7
  71. package/fesm2022/sdcorejs-angular-forms-textarea.mjs.map +1 -1
  72. package/fesm2022/sdcorejs-angular-modules-layout.mjs +2 -3
  73. package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
  74. package/fesm2022/sdcorejs-angular-services-api.mjs +1 -2
  75. package/fesm2022/sdcorejs-angular-services-api.mjs.map +1 -1
  76. package/fesm2022/sdcorejs-angular-services-confirm.mjs +2 -2
  77. package/fesm2022/sdcorejs-angular-services-confirm.mjs.map +1 -1
  78. package/forms/date-range/index.d.ts +2 -0
  79. package/forms/input-number/index.d.ts +0 -1
  80. package/package.json +1 -1
@@ -1,5 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, inject, DestroyRef, ChangeDetectorRef, input, booleanAttribute, computed, model, output, signal, effect, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { Utilities } from '@sdcorejs/utils/fns';
3
4
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
5
  import { NgForm, FormGroup } from '@angular/forms';
5
6
  import * as i2 from '@angular/material/form-field';
@@ -13,7 +14,6 @@ import { CKEditorModule } from '@ckeditor/ckeditor5-angular';
13
14
  import { Plugin, FileRepository, Image, ImageResize, ImageUpload, ImageStyle, ImageToolbar, ClassicEditor, Essentials, FontColor, FontSize, Paragraph, Bold, Italic, Underline, List, Undo, Widget, Alignment } from 'ckeditor5';
14
15
  import { Subject } from 'rxjs';
15
16
  import { debounceTime } from 'rxjs/operators';
16
- import * as uuid from 'uuid';
17
17
  import { SdNotifyService } from '@sdcorejs/angular/services';
18
18
  import { I18nService } from '@sdcorejs/angular/i18n';
19
19
  import { sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';
@@ -725,7 +725,7 @@ class SdEditor {
725
725
  autoId = computed(() => (this.autoIdInput() ? `components-editor-${this.autoIdInput()}` : undefined), ...(ngDevMode ? [{ debugName: "autoId" }] : []));
726
726
  dataDisabled = computed(() => (this.disabled() ? 'true' : 'false'), ...(ngDevMode ? [{ debugName: "dataDisabled" }] : []));
727
727
  dataEmpty = computed(() => (sdIsEmpty(this.valueModel()) ? 'true' : 'false'), ...(ngDevMode ? [{ debugName: "dataEmpty" }] : []));
728
- name = input(uuid.v4(), ...(ngDevMode ? [{ debugName: "name" }] : []));
728
+ name = input(Utilities.generateUuid(), ...(ngDevMode ? [{ debugName: "name" }] : []));
729
729
  valueModel = model('', ...(ngDevMode ? [{ debugName: "valueModel", alias: 'model' }] : [{ alias: 'model' }]));
730
730
  // Output
731
731
  sdChange = output();
@@ -1074,11 +1074,11 @@ class SdEditor {
1074
1074
  return this.option()?.imageConfig?.uploadFn ?? this.#getSelectedConfig()?.upload;
1075
1075
  };
1076
1076
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdEditor, deps: [], target: i0.ɵɵFactoryTarget.Component });
1077
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdEditor, isStandalone: true, selector: "sd-editor", inputs: { option: { classPropertyName: "option", publicName: "option", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, maxlength: { classPropertyName: "maxlength", publicName: "maxlength", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, helperText: { classPropertyName: "helperText", publicName: "helperText", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, hideInlineError: { classPropertyName: "hideInlineError", publicName: "hideInlineError", isSignal: true, isRequired: false, transformFunction: null }, inlineError: { classPropertyName: "inlineError", publicName: "inlineError", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, validator: { classPropertyName: "validator", publicName: "validator", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: false, transformFunction: null }, autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange", sdChange: "sdChange", sdBlur: "sdBlur", sdFocus: "sdFocus" }, ngImport: i0, template: "<sd-ckeditor-styles />\n@let lbl = label();\n@let hText = helperText();\n@let hideErr = hideInlineError();\n@let errMsg = errorMessage;\n@let req = required();\n@let maxLen = maxlength();\n@let showCounter = !!maxLen && !formControl.disabled && !hideErr;\n\n@if (lbl) {\n <sd-label [label]=\"lbl\" [required]=\"req\" [helperText]=\"hText\"></sd-label>\n}\n\n<div\n class=\"sd-editor\"\n [class.sd-editor--readonly]=\"readonly()\"\n [class.sd-editor--error]=\"formControl.invalid && formControl.touched\"\n [class.has-counter]=\"showCounter\"\n [style.--sd-editor-content-min-height]=\"height()\"\n [style.--sd-editor-content-max-height]=\"maxHeight()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-empty]=\"dataEmpty()\">\n <ckeditor [editor]=\"Editor\" [config]=\"editorConfig()\" [disabled]=\"formControl.disabled\" (ready)=\"onReady($event)\"></ckeditor>\n\n @if (showCounter) {\n <div class=\"sd-editor-counter-row\">\n <span class=\"sd-editor-counter\" [class.sd-editor-counter--over]=\"isOverLimit()\"> {{ _textLength() }}/{{ maxLen }} </span>\n </div>\n }\n\n @if (hideErr && errMsg && formControl.touched) {\n <mat-icon class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\">error</mat-icon>\n }\n</div>\n\n<div class=\"sd-editor-footer\">\n @if (!hideErr && errMsg && formControl.touched) {\n <mat-error>{{ errMsg }}</mat-error>\n }\n</div>\n", styles: [".sd-editor{display:flex;flex-direction:column;width:100%;position:relative}.sd-editor-counter-row{display:flex;justify-content:flex-end;align-items:center;padding:4px 12px;border:1px solid var(--ck-color-base-border);border-top:none}.sd-editor-footer{min-height:20px;margin-top:4px}.sd-editor-footer mat-error{font-size:12px;color:var(--mdc-theme-error, #f44336)}.sd-error-icon{position:absolute;right:8px;bottom:8px;z-index:2;color:var(--mdc-theme-error, #f44336);height:20px;width:20px;font-size:20px;cursor:default}.sd-editor--readonly :host ::ng-deep .ck-editor__editable{background:#0000000a;cursor:default}.sd-editor-counter{font-size:12px;color:#0009}.sd-editor-counter--over{color:var(--mdc-theme-error, #f44336)}::ng-deep .ck-powered-by,::ng-deep .ck-powered-by-balloon{display:none!important}:host ::ng-deep ckeditor,:host ::ng-deep .ck-editor{display:flex;flex-direction:column}:host ::ng-deep .ck-editor{--ck-content-font-size: 14px;--ck-content-line-height: 1.5}:host ::ng-deep .ck-editor__main{overflow:visible}:host ::ng-deep .ck-editor__editable{min-height:var(--sd-editor-content-min-height, 200px)!important;max-height:var(--sd-editor-content-max-height, none)!important;padding:24px!important;overflow-y:auto!important;border:1px solid var(--ck-color-base-border)!important}:host ::ng-deep .ck-editor__editable.ck-focused{box-shadow:none!important}:host ::ng-deep .sd-editor.has-counter .ck-editor__editable{border-bottom:none!important}:host ::ng-deep .sd-editor--error .ck-editor__editable,:host ::ng-deep .sd-editor--error .ck-toolbar{border-color:var(--mdc-theme-error, #f44336)!important}:host ::ng-deep .sd-editor--error.has-counter .sd-editor-counter-row{border-color:var(--mdc-theme-error, #f44336)}:host ::ng-deep .ck-content p{margin-bottom:var(--ck-spacing-large);text-indent:0}:host ::ng-deep .ck-content ul,:host ::ng-deep .ck-content ol{margin-left:0!important;padding-left:20px!important}\n", ":host ::ng-deep .ck-content img{max-width:100%!important;height:auto!important;object-fit:contain}:host ::ng-deep .ck-content figure.image{position:relative;display:block;width:fit-content;max-width:100%;margin:0 auto;overflow:visible}:host ::ng-deep .ck-content figure.image:hover{z-index:99999!important}:host ::ng-deep .ck-content figure.image.image-style-align-left{float:left;margin:0 1em 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-left[style*=\"width:100\"]{float:none;margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-right{float:right;margin:0 0 0 1em}:host ::ng-deep .ck-content figure.image.image-style-align-right[style*=\"width:100\"]{float:none;margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image.image-style-block-align-left{margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-block-align-right{margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image .ck-progress-bar{position:absolute;bottom:0;left:0;width:30%!important;height:3px;background:var(--sd-color-primary, #1565c0);border-radius:2px;z-index:10;pointer-events:none;animation:sd-progress-indeterminate 1.4s ease-in-out infinite}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar){overflow:hidden}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar) img{filter:blur(1px) brightness(.85);transition:filter .3s ease}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):after{content:\"\";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:9;background:#ffffff40;border-radius:inherit}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):before{content:\"\";position:absolute;top:50%;left:50%;width:28px;height:28px;margin:-14px 0 0 -14px;border:3px solid rgba(255,255,255,.5);border-top-color:var(--sd-color-primary, #1565c0);border-radius:50%;animation:sd-spinner .75s linear infinite;z-index:11;pointer-events:none}@keyframes sd-spinner{to{transform:rotate(360deg)}}@keyframes sd-progress-indeterminate{0%{left:-30%}to{left:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CKEditorModule }, { kind: "component", type: i1.CKEditorComponent, selector: "ckeditor", inputs: ["editor", "config", "data", "tagName", "watchdog", "editorWatchdogConfig", "disableWatchdog", "disableTwoWayDataBinding", "disabled"], outputs: ["ready", "change", "blur", "focus", "error"] }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "component", type: SdCKEditorStyles, selector: "sd-ckeditor-styles" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1077
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: SdEditor, isStandalone: true, selector: "sd-editor", inputs: { option: { classPropertyName: "option", publicName: "option", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, maxHeight: { classPropertyName: "maxHeight", publicName: "maxHeight", isSignal: true, isRequired: false, transformFunction: null }, maxlength: { classPropertyName: "maxlength", publicName: "maxlength", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, helperText: { classPropertyName: "helperText", publicName: "helperText", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, hideInlineError: { classPropertyName: "hideInlineError", publicName: "hideInlineError", isSignal: true, isRequired: false, transformFunction: null }, inlineError: { classPropertyName: "inlineError", publicName: "inlineError", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, validator: { classPropertyName: "validator", publicName: "validator", isSignal: true, isRequired: false, transformFunction: null }, form: { classPropertyName: "form", publicName: "form", isSignal: true, isRequired: false, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: false, transformFunction: null }, autoIdInput: { classPropertyName: "autoIdInput", publicName: "autoId", isSignal: true, isRequired: false, transformFunction: null }, name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, valueModel: { classPropertyName: "valueModel", publicName: "model", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueModel: "modelChange", sdChange: "sdChange", sdBlur: "sdBlur", sdFocus: "sdFocus" }, ngImport: i0, template: "<sd-ckeditor-styles />\n@let _label = label();\n@let _helperText = helperText();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage;\n@let _required = required();\n@let _maxLength = maxlength();\n@let _showCounter = !!_maxLength && !formControl.disabled && !_hideInlineError;\n\n@if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\" [helperText]=\"_helperText\"></sd-label>\n}\n\n<div\n class=\"sd-editor\"\n [class.sd-editor--readonly]=\"readonly()\"\n [class.sd-editor--error]=\"formControl.invalid && formControl.touched\"\n [class.has-counter]=\"_showCounter\"\n [style.--sd-editor-content-min-height]=\"height()\"\n [style.--sd-editor-content-max-height]=\"maxHeight()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-empty]=\"dataEmpty()\">\n <ckeditor [editor]=\"Editor\" [config]=\"editorConfig()\" [disabled]=\"formControl.disabled\" (ready)=\"onReady($event)\"></ckeditor>\n\n @if (_showCounter) {\n <div class=\"sd-editor-counter-row\">\n <span class=\"sd-editor-counter\" [class.sd-editor-counter--over]=\"isOverLimit()\"> {{ _textLength() }}/{{ _maxLength }} </span>\n </div>\n }\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\">error</mat-icon>\n }\n</div>\n\n<div class=\"sd-editor-footer\">\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n</div>\n", styles: [".sd-editor{display:flex;flex-direction:column;width:100%;position:relative}.sd-editor-counter-row{display:flex;justify-content:flex-end;align-items:center;padding:4px 12px;border:1px solid var(--ck-color-base-border);border-top:none}.sd-editor-footer{min-height:20px;margin-top:4px}.sd-editor-footer mat-error{font-size:12px;color:var(--mdc-theme-error, #f44336)}.sd-error-icon{position:absolute;right:8px;bottom:8px;z-index:2;color:var(--mdc-theme-error, #f44336);height:20px;width:20px;font-size:20px;cursor:default}.sd-editor--readonly :host ::ng-deep .ck-editor__editable{background:#0000000a;cursor:default}.sd-editor-counter{font-size:12px;color:#0009}.sd-editor-counter--over{color:var(--mdc-theme-error, #f44336)}::ng-deep .ck-powered-by,::ng-deep .ck-powered-by-balloon{display:none!important}:host ::ng-deep ckeditor,:host ::ng-deep .ck-editor{display:flex;flex-direction:column}:host ::ng-deep .ck-editor{--ck-content-font-size: 14px;--ck-content-line-height: 1.5}:host ::ng-deep .ck-editor__main{overflow:visible}:host ::ng-deep .ck-editor__editable{min-height:var(--sd-editor-content-min-height, 200px)!important;max-height:var(--sd-editor-content-max-height, none)!important;padding:24px!important;overflow-y:auto!important;border:1px solid var(--ck-color-base-border)!important}:host ::ng-deep .ck-editor__editable.ck-focused{box-shadow:none!important}:host ::ng-deep .sd-editor.has-counter .ck-editor__editable{border-bottom:none!important}:host ::ng-deep .sd-editor--error .ck-editor__editable,:host ::ng-deep .sd-editor--error .ck-toolbar{border-color:var(--mdc-theme-error, #f44336)!important}:host ::ng-deep .sd-editor--error.has-counter .sd-editor-counter-row{border-color:var(--mdc-theme-error, #f44336)}:host ::ng-deep .ck-content p{margin-bottom:var(--ck-spacing-large);text-indent:0}:host ::ng-deep .ck-content ul,:host ::ng-deep .ck-content ol{margin-left:0!important;padding-left:20px!important}\n", ":host ::ng-deep .ck-content img{max-width:100%!important;height:auto!important;object-fit:contain}:host ::ng-deep .ck-content figure.image{position:relative;display:block;width:fit-content;max-width:100%;margin:0 auto;overflow:visible}:host ::ng-deep .ck-content figure.image:hover{z-index:99999!important}:host ::ng-deep .ck-content figure.image.image-style-align-left{float:left;margin:0 1em 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-left[style*=\"width:100\"]{float:none;margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-right{float:right;margin:0 0 0 1em}:host ::ng-deep .ck-content figure.image.image-style-align-right[style*=\"width:100\"]{float:none;margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image.image-style-block-align-left{margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-block-align-right{margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image .ck-progress-bar{position:absolute;bottom:0;left:0;width:30%!important;height:3px;background:var(--sd-color-primary, #1565c0);border-radius:2px;z-index:10;pointer-events:none;animation:sd-progress-indeterminate 1.4s ease-in-out infinite}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar){overflow:hidden}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar) img{filter:blur(1px) brightness(.85);transition:filter .3s ease}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):after{content:\"\";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:9;background:#ffffff40;border-radius:inherit}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):before{content:\"\";position:absolute;top:50%;left:50%;width:28px;height:28px;margin:-14px 0 0 -14px;border:3px solid rgba(255,255,255,.5);border-top-color:var(--sd-color-primary, #1565c0);border-radius:50%;animation:sd-spinner .75s linear infinite;z-index:11;pointer-events:none}@keyframes sd-spinner{to{transform:rotate(360deg)}}@keyframes sd-progress-indeterminate{0%{left:-30%}to{left:100%}}\n"], dependencies: [{ kind: "ngmodule", type: CKEditorModule }, { kind: "component", type: i1.CKEditorComponent, selector: "ckeditor", inputs: ["editor", "config", "data", "tagName", "watchdog", "editorWatchdogConfig", "disableWatchdog", "disableTwoWayDataBinding", "disabled"], outputs: ["ready", "change", "blur", "focus", "error"] }, { kind: "component", type: SdLabel, selector: "sd-label", inputs: ["label", "description", "required", "helperText"] }, { kind: "component", type: SdCKEditorStyles, selector: "sd-ckeditor-styles" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i2.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1078
1078
  }
1079
1079
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: SdEditor, decorators: [{
1080
1080
  type: Component,
1081
- args: [{ selector: 'sd-editor', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CKEditorModule, SdLabel, SdCKEditorStyles, MatFormFieldModule, MatIconModule, MatTooltipModule], template: "<sd-ckeditor-styles />\n@let lbl = label();\n@let hText = helperText();\n@let hideErr = hideInlineError();\n@let errMsg = errorMessage;\n@let req = required();\n@let maxLen = maxlength();\n@let showCounter = !!maxLen && !formControl.disabled && !hideErr;\n\n@if (lbl) {\n <sd-label [label]=\"lbl\" [required]=\"req\" [helperText]=\"hText\"></sd-label>\n}\n\n<div\n class=\"sd-editor\"\n [class.sd-editor--readonly]=\"readonly()\"\n [class.sd-editor--error]=\"formControl.invalid && formControl.touched\"\n [class.has-counter]=\"showCounter\"\n [style.--sd-editor-content-min-height]=\"height()\"\n [style.--sd-editor-content-max-height]=\"maxHeight()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-empty]=\"dataEmpty()\">\n <ckeditor [editor]=\"Editor\" [config]=\"editorConfig()\" [disabled]=\"formControl.disabled\" (ready)=\"onReady($event)\"></ckeditor>\n\n @if (showCounter) {\n <div class=\"sd-editor-counter-row\">\n <span class=\"sd-editor-counter\" [class.sd-editor-counter--over]=\"isOverLimit()\"> {{ _textLength() }}/{{ maxLen }} </span>\n </div>\n }\n\n @if (hideErr && errMsg && formControl.touched) {\n <mat-icon class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\">error</mat-icon>\n }\n</div>\n\n<div class=\"sd-editor-footer\">\n @if (!hideErr && errMsg && formControl.touched) {\n <mat-error>{{ errMsg }}</mat-error>\n }\n</div>\n", styles: [".sd-editor{display:flex;flex-direction:column;width:100%;position:relative}.sd-editor-counter-row{display:flex;justify-content:flex-end;align-items:center;padding:4px 12px;border:1px solid var(--ck-color-base-border);border-top:none}.sd-editor-footer{min-height:20px;margin-top:4px}.sd-editor-footer mat-error{font-size:12px;color:var(--mdc-theme-error, #f44336)}.sd-error-icon{position:absolute;right:8px;bottom:8px;z-index:2;color:var(--mdc-theme-error, #f44336);height:20px;width:20px;font-size:20px;cursor:default}.sd-editor--readonly :host ::ng-deep .ck-editor__editable{background:#0000000a;cursor:default}.sd-editor-counter{font-size:12px;color:#0009}.sd-editor-counter--over{color:var(--mdc-theme-error, #f44336)}::ng-deep .ck-powered-by,::ng-deep .ck-powered-by-balloon{display:none!important}:host ::ng-deep ckeditor,:host ::ng-deep .ck-editor{display:flex;flex-direction:column}:host ::ng-deep .ck-editor{--ck-content-font-size: 14px;--ck-content-line-height: 1.5}:host ::ng-deep .ck-editor__main{overflow:visible}:host ::ng-deep .ck-editor__editable{min-height:var(--sd-editor-content-min-height, 200px)!important;max-height:var(--sd-editor-content-max-height, none)!important;padding:24px!important;overflow-y:auto!important;border:1px solid var(--ck-color-base-border)!important}:host ::ng-deep .ck-editor__editable.ck-focused{box-shadow:none!important}:host ::ng-deep .sd-editor.has-counter .ck-editor__editable{border-bottom:none!important}:host ::ng-deep .sd-editor--error .ck-editor__editable,:host ::ng-deep .sd-editor--error .ck-toolbar{border-color:var(--mdc-theme-error, #f44336)!important}:host ::ng-deep .sd-editor--error.has-counter .sd-editor-counter-row{border-color:var(--mdc-theme-error, #f44336)}:host ::ng-deep .ck-content p{margin-bottom:var(--ck-spacing-large);text-indent:0}:host ::ng-deep .ck-content ul,:host ::ng-deep .ck-content ol{margin-left:0!important;padding-left:20px!important}\n", ":host ::ng-deep .ck-content img{max-width:100%!important;height:auto!important;object-fit:contain}:host ::ng-deep .ck-content figure.image{position:relative;display:block;width:fit-content;max-width:100%;margin:0 auto;overflow:visible}:host ::ng-deep .ck-content figure.image:hover{z-index:99999!important}:host ::ng-deep .ck-content figure.image.image-style-align-left{float:left;margin:0 1em 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-left[style*=\"width:100\"]{float:none;margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-right{float:right;margin:0 0 0 1em}:host ::ng-deep .ck-content figure.image.image-style-align-right[style*=\"width:100\"]{float:none;margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image.image-style-block-align-left{margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-block-align-right{margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image .ck-progress-bar{position:absolute;bottom:0;left:0;width:30%!important;height:3px;background:var(--sd-color-primary, #1565c0);border-radius:2px;z-index:10;pointer-events:none;animation:sd-progress-indeterminate 1.4s ease-in-out infinite}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar){overflow:hidden}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar) img{filter:blur(1px) brightness(.85);transition:filter .3s ease}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):after{content:\"\";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:9;background:#ffffff40;border-radius:inherit}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):before{content:\"\";position:absolute;top:50%;left:50%;width:28px;height:28px;margin:-14px 0 0 -14px;border:3px solid rgba(255,255,255,.5);border-top-color:var(--sd-color-primary, #1565c0);border-radius:50%;animation:sd-spinner .75s linear infinite;z-index:11;pointer-events:none}@keyframes sd-spinner{to{transform:rotate(360deg)}}@keyframes sd-progress-indeterminate{0%{left:-30%}to{left:100%}}\n"] }]
1081
+ args: [{ selector: 'sd-editor', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CKEditorModule, SdLabel, SdCKEditorStyles, MatFormFieldModule, MatIconModule, MatTooltipModule], template: "<sd-ckeditor-styles />\n@let _label = label();\n@let _helperText = helperText();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage;\n@let _required = required();\n@let _maxLength = maxlength();\n@let _showCounter = !!_maxLength && !formControl.disabled && !_hideInlineError;\n\n@if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\" [helperText]=\"_helperText\"></sd-label>\n}\n\n<div\n class=\"sd-editor\"\n [class.sd-editor--readonly]=\"readonly()\"\n [class.sd-editor--error]=\"formControl.invalid && formControl.touched\"\n [class.has-counter]=\"_showCounter\"\n [style.--sd-editor-content-min-height]=\"height()\"\n [style.--sd-editor-content-max-height]=\"maxHeight()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-empty]=\"dataEmpty()\">\n <ckeditor [editor]=\"Editor\" [config]=\"editorConfig()\" [disabled]=\"formControl.disabled\" (ready)=\"onReady($event)\"></ckeditor>\n\n @if (_showCounter) {\n <div class=\"sd-editor-counter-row\">\n <span class=\"sd-editor-counter\" [class.sd-editor-counter--over]=\"isOverLimit()\"> {{ _textLength() }}/{{ _maxLength }} </span>\n </div>\n }\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\">error</mat-icon>\n }\n</div>\n\n<div class=\"sd-editor-footer\">\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n</div>\n", styles: [".sd-editor{display:flex;flex-direction:column;width:100%;position:relative}.sd-editor-counter-row{display:flex;justify-content:flex-end;align-items:center;padding:4px 12px;border:1px solid var(--ck-color-base-border);border-top:none}.sd-editor-footer{min-height:20px;margin-top:4px}.sd-editor-footer mat-error{font-size:12px;color:var(--mdc-theme-error, #f44336)}.sd-error-icon{position:absolute;right:8px;bottom:8px;z-index:2;color:var(--mdc-theme-error, #f44336);height:20px;width:20px;font-size:20px;cursor:default}.sd-editor--readonly :host ::ng-deep .ck-editor__editable{background:#0000000a;cursor:default}.sd-editor-counter{font-size:12px;color:#0009}.sd-editor-counter--over{color:var(--mdc-theme-error, #f44336)}::ng-deep .ck-powered-by,::ng-deep .ck-powered-by-balloon{display:none!important}:host ::ng-deep ckeditor,:host ::ng-deep .ck-editor{display:flex;flex-direction:column}:host ::ng-deep .ck-editor{--ck-content-font-size: 14px;--ck-content-line-height: 1.5}:host ::ng-deep .ck-editor__main{overflow:visible}:host ::ng-deep .ck-editor__editable{min-height:var(--sd-editor-content-min-height, 200px)!important;max-height:var(--sd-editor-content-max-height, none)!important;padding:24px!important;overflow-y:auto!important;border:1px solid var(--ck-color-base-border)!important}:host ::ng-deep .ck-editor__editable.ck-focused{box-shadow:none!important}:host ::ng-deep .sd-editor.has-counter .ck-editor__editable{border-bottom:none!important}:host ::ng-deep .sd-editor--error .ck-editor__editable,:host ::ng-deep .sd-editor--error .ck-toolbar{border-color:var(--mdc-theme-error, #f44336)!important}:host ::ng-deep .sd-editor--error.has-counter .sd-editor-counter-row{border-color:var(--mdc-theme-error, #f44336)}:host ::ng-deep .ck-content p{margin-bottom:var(--ck-spacing-large);text-indent:0}:host ::ng-deep .ck-content ul,:host ::ng-deep .ck-content ol{margin-left:0!important;padding-left:20px!important}\n", ":host ::ng-deep .ck-content img{max-width:100%!important;height:auto!important;object-fit:contain}:host ::ng-deep .ck-content figure.image{position:relative;display:block;width:fit-content;max-width:100%;margin:0 auto;overflow:visible}:host ::ng-deep .ck-content figure.image:hover{z-index:99999!important}:host ::ng-deep .ck-content figure.image.image-style-align-left{float:left;margin:0 1em 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-left[style*=\"width:100\"]{float:none;margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-align-right{float:right;margin:0 0 0 1em}:host ::ng-deep .ck-content figure.image.image-style-align-right[style*=\"width:100\"]{float:none;margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image.image-style-block-align-left{margin:0 auto 0 0}:host ::ng-deep .ck-content figure.image.image-style-block-align-right{margin:0 0 0 auto}:host ::ng-deep .ck-content figure.image .ck-progress-bar{position:absolute;bottom:0;left:0;width:30%!important;height:3px;background:var(--sd-color-primary, #1565c0);border-radius:2px;z-index:10;pointer-events:none;animation:sd-progress-indeterminate 1.4s ease-in-out infinite}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar){overflow:hidden}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar) img{filter:blur(1px) brightness(.85);transition:filter .3s ease}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):after{content:\"\";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;z-index:9;background:#ffffff40;border-radius:inherit}:host ::ng-deep .ck-content figure.image:has(.ck-progress-bar):before{content:\"\";position:absolute;top:50%;left:50%;width:28px;height:28px;margin:-14px 0 0 -14px;border:3px solid rgba(255,255,255,.5);border-top-color:var(--sd-color-primary, #1565c0);border-radius:50%;animation:sd-spinner .75s linear infinite;z-index:11;pointer-events:none}@keyframes sd-spinner{to{transform:rotate(360deg)}}@keyframes sd-progress-indeterminate{0%{left:-30%}to{left:100%}}\n"] }]
1082
1082
  }], ctorParameters: () => [], propDecorators: { option: [{ type: i0.Input, args: [{ isSignal: true, alias: "option", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], maxHeight: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxHeight", required: false }] }], maxlength: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxlength", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], helperText: [{ type: i0.Input, args: [{ isSignal: true, alias: "helperText", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], readonly: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], hideInlineError: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideInlineError", required: false }] }], inlineError: [{ type: i0.Input, args: [{ isSignal: true, alias: "inlineError", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], validator: [{ type: i0.Input, args: [{ isSignal: true, alias: "validator", required: false }] }], form: [{ type: i0.Input, args: [{ isSignal: true, alias: "form", required: false }] }], key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: false }] }], autoIdInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "autoId", required: false }] }], name: [{ type: i0.Input, args: [{ isSignal: true, alias: "name", required: false }] }], valueModel: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: false }] }, { type: i0.Output, args: ["modelChange"] }], sdChange: [{ type: i0.Output, args: ["sdChange"] }], sdBlur: [{ type: i0.Output, args: ["sdBlur"] }], sdFocus: [{ type: i0.Output, args: ["sdFocus"] }] } });
1083
1083
 
1084
1084
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"sdcorejs-angular-components-editor.mjs","sources":["../../../projects/sdcorejs-angular/components/editor/src/configurations/editor.configuration.ts","../../../projects/sdcorejs-angular/components/editor/src/plugins/image-upload/utils/validate.utils.ts","../../../projects/sdcorejs-angular/components/editor/src/plugins/image-upload/utils/batch.utils.ts","../../../projects/sdcorejs-angular/components/editor/src/plugins/image-upload/utils/style.utils.ts","../../../projects/sdcorejs-angular/components/editor/src/plugins/image-upload/image-upload.plugin.ts","../../../projects/sdcorejs-angular/components/editor/src/editor.component.ts","../../../projects/sdcorejs-angular/components/editor/src/editor.component.html","../../../projects/sdcorejs-angular/components/editor/sdcorejs-angular-components-editor.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface SdEditorUploadFileDetail {\n idOrKey: string;\n cdn: string;\n name?: string;\n}\n\nexport type SdEditorUploadFileFuncUpload = (files: File[]) => Promise<SdEditorUploadFileDetail[]>;\n\nexport interface ISdEditorConfiguration {\n key?: string;\n upload: SdEditorUploadFileFuncUpload;\n}\n\nexport const SD_EDITOR_CONFIGURATION = new InjectionToken<ISdEditorConfiguration>(\n 'sd.editor.configuration'\n);\n","import { FileLoader } from 'ckeditor5';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdEditorImageUploadValidation } from '../../../models';\n\n// Dựa vào file để detect định dạng thay vì chỉ check tên\n// Tránh user gửi file không đúng, ví dụ file docx nhưng đổi tên thành ảnh docx.jpg\nconst detectFormatFromBytes = async (file: File): Promise<string> => {\n const buffer = await file.slice(0, 12).arrayBuffer();\n const b = new Uint8Array(buffer);\n\n if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) return 'jpg';\n if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) return 'png';\n if (b[0] === 0x52 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x46 && b[8] === 0x57) return 'webp';\n if (b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x38) return 'gif';\n if (b[4] === 0x66 && b[5] === 0x74 && b[6] === 0x79 && b[7] === 0x70) {\n const brand = String.fromCharCode(b[8], b[9], b[10], b[11]);\n if (brand === 'avif') return 'avif';\n if (brand.startsWith('hei')) return 'heic';\n }\n return '';\n};\n\nconst getImageInfo = async (file: File): Promise<{ width: number; height: number; sizeMB: number; format: string }> => {\n const sizeMB = file.size / (1024 * 1024);\n const loadDimensions = new Promise<{ width: number; height: number }>(resolve => {\n const url = URL.createObjectURL(file);\n const img = new window.Image();\n img.onload = () => {\n URL.revokeObjectURL(url);\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve({ width: 0, height: 0 });\n };\n img.src = url;\n });\n const [format, { width, height }] = await Promise.all([detectFormatFromBytes(file), loadDimensions]);\n return { width, height, sizeMB, format };\n};\n\n// Helper: gọi i18n.t khi có service; nếu thiếu thì trả empty (Angular wrapper luôn truyền i18n)\nconst tr = (i18n: I18nService | undefined, key: string, params: Record<string, unknown>): string =>\n i18n?.t(key, params as any) ?? '';\n\nconst validateImageFile = async (\n file: File,\n validation: SdEditorImageUploadValidation,\n onWarning?: (message: string) => void,\n i18n?: I18nService\n): Promise<boolean> => {\n const { width, height, sizeMB, format } = await getImageInfo(file);\n\n if (validation.allowedFormats !== undefined) {\n const normalizedFormats = validation.allowedFormats.map((f: string) => {\n const fmt = f.replace(/^\\./, '').toLowerCase();\n return fmt === 'jpeg' ? 'jpg' : fmt;\n });\n if (!normalizedFormats.includes(format)) {\n const allowed = normalizedFormats.join(', ');\n onWarning?.(tr(i18n, 'core.component.editor.image.invalid-format', { format, allowed }));\n return false;\n }\n }\n if (validation.maxSizeMB !== undefined && sizeMB > validation.maxSizeMB) {\n const sizeMBFixed = sizeMB.toFixed(2);\n onWarning?.(tr(i18n, 'core.component.editor.image.size-exceeded', { sizeMB: sizeMBFixed, maxSizeMB: validation.maxSizeMB }));\n return false;\n }\n if (validation.minWidth !== undefined && width < validation.minWidth) {\n onWarning?.(tr(i18n, 'core.component.editor.image.min-width', { width, min: validation.minWidth }));\n return false;\n }\n if (validation.minHeight !== undefined && height < validation.minHeight) {\n onWarning?.(tr(i18n, 'core.component.editor.image.min-height', { height, min: validation.minHeight }));\n return false;\n }\n if (validation.maxWidth !== undefined && width > validation.maxWidth) {\n onWarning?.(tr(i18n, 'core.component.editor.image.max-width', { width, max: validation.maxWidth }));\n return false;\n }\n if (validation.maxHeight !== undefined && height > validation.maxHeight) {\n onWarning?.(tr(i18n, 'core.component.editor.image.max-height', { height, max: validation.maxHeight }));\n return false;\n }\n return true;\n};\n\nexport const validateAndGetFile = async (\n loader: FileLoader,\n validation?: SdEditorImageUploadValidation,\n onWarning?: (message: string) => void,\n i18n?: I18nService\n): Promise<File> => {\n const file = (await loader.file) as File | null;\n if (!file) {\n throw new Error('No file found');\n }\n if (validation) {\n const valid = await validateImageFile(file, validation, onWarning, i18n);\n if (!valid) {\n throw new Error('Image validation failed');\n }\n }\n return file;\n};\n","import { ClassicEditor } from 'ckeditor5';\nimport { SdEditorOption } from '../../../models';\nimport { SdEditorUploadFileDetail, SdEditorUploadFileFuncUpload } from '../../../configurations';\n\nexport const getBatchConfig = (option: SdEditorOption): { batchSize: number; maxConcurrent: number } => {\n const imageConfig = option?.imageConfig;\n return {\n batchSize: Math.max(1, imageConfig?.batchSize ?? 2),\n maxConcurrent: Math.max(1, imageConfig?.maxConcurrentUploads ?? 2),\n };\n};\n\nexport const getActiveBlobUrls = (editor: ClassicEditor): Set<string> => {\n const urls = new Set<string>();\n const root = editor.model.document.getRoot();\n if (!root) return urls;\n for (const item of editor.model.createRangeIn(root).getItems()) {\n if (item.is('element', 'imageBlock') || item.is('element', 'imageInline')) {\n const src = item.getAttribute('src') as string;\n if (src?.startsWith('blob:')) urls.add(src);\n }\n }\n return urls;\n};\n\nexport const filterActivePendingFiles = (\n pendingFiles: Map<string, File>,\n activeBlobUrls: Set<string>\n): Array<[string, File]> => {\n const toUpload: Array<[string, File]> = [];\n for (const [blobUrl, file] of pendingFiles) {\n if (activeBlobUrls.has(blobUrl)) {\n toUpload.push([blobUrl, file]);\n } else {\n URL.revokeObjectURL(blobUrl);\n pendingFiles.delete(blobUrl);\n }\n }\n return toUpload;\n};\n\nexport const runBatchUploads = async (\n toUpload: Array<[string, File]>,\n uploadFn: SdEditorUploadFileFuncUpload,\n batchSize: number,\n maxConcurrent: number\n): Promise<{ replacements: Map<string, SdEditorUploadFileDetail>; failedBatches: Array<[string, File][]> }> => {\n const batches: Array<[string, File][]> = [];\n for (let i = 0; i < toUpload.length; i += batchSize) {\n batches.push(toUpload.slice(i, i + batchSize));\n }\n\n const replacements = new Map<string, SdEditorUploadFileDetail>();\n const failedBatches: Array<[string, File][]> = [];\n\n let head = 0;\n const runWorker = async () => {\n while (head < batches.length) {\n const batch = batches[head++];\n try {\n const details = await uploadFn(batch.map(([, file]) => file));\n if (details.length !== batch.length) {\n throw new Error(`API returned ${details.length} results for ${batch.length} files`);\n }\n batch.forEach(([blobUrl], idx) => {\n replacements.set(blobUrl, details[idx]);\n URL.revokeObjectURL(blobUrl);\n });\n } catch {\n failedBatches.push(batch);\n }\n }\n };\n\n await Promise.all(Array.from({ length: Math.min(maxConcurrent, batches.length) }, runWorker));\n\n return { replacements, failedBatches };\n};\n\nexport const applyReplacementsToEditor = (editor: ClassicEditor, replacements: Map<string, SdEditorUploadFileDetail>): void => {\n if (replacements.size === 0) return;\n\n editor.model.change(writer => {\n const root = editor.model.document.getRoot()!;\n for (const item of editor.model.createRangeIn(root).getItems()) {\n if (!item.is('element', 'imageBlock') && !item.is('element', 'imageInline')) continue;\n const detail = replacements.get(item.getAttribute('src') as string);\n if (detail) writer.setAttribute('src', detail.cdn, item);\n }\n });\n};\n","const parseStyle = (style: string): Map<string, string> => {\n const map = new Map<string, string>();\n for (const decl of style.split(';')) {\n const colon = decl.indexOf(':');\n if (colon === -1) continue;\n const key = decl.slice(0, colon).trim();\n const value = decl.slice(colon + 1).trim();\n if (key && value) map.set(key, value);\n }\n return map;\n};\n\nconst serializeStyle = (map: Map<string, string>): string =>\n [...map.entries()].map(([k, v]) => `${k}:${v}`).join(';');\n\nexport const countTextLength = (content: string): number => {\n if (!content) return 0;\n const doc = new DOMParser().parseFromString(content, 'text/html');\n doc.querySelectorAll('img, figure').forEach(el => el.remove());\n return doc.body.textContent?.length ?? 0;\n};\n\nexport const imageInlineStylesToClasses = (html: string): string => {\n if (!html) return html;\n\n const doc = new DOMParser().parseFromString(html, 'text/html');\n doc.querySelectorAll('figure.image').forEach(figure => {\n const styleMap = parseStyle(figure.getAttribute('style') || '');\n\n const floatVal = styleMap.get('float') || '';\n const marginVal = styleMap.get('margin') || '';\n const widthVal = styleMap.get('width') || '';\n const hasNumericWidth = /\\d/.test(widthVal) && widthVal !== 'fit-content';\n\n styleMap.delete('display');\n styleMap.delete('max-width');\n styleMap.delete('float');\n styleMap.delete('margin');\n if (widthVal === 'fit-content') styleMap.delete('width');\n\n figure.classList.remove(\n 'image-style-align-left', 'image-style-align-right',\n 'image-style-block-align-left', 'image-style-block-align-right'\n );\n\n if (floatVal === 'left') {\n figure.classList.add('image-style-align-left');\n } else if (floatVal === 'right') {\n figure.classList.add('image-style-align-right');\n } else if (marginVal === '0 auto 0 0') {\n figure.classList.add(hasNumericWidth ? 'image-style-align-left' : 'image-style-block-align-left');\n } else if (marginVal === '0 0 0 auto') {\n figure.classList.add(hasNumericWidth ? 'image-style-align-right' : 'image-style-block-align-right');\n }\n\n figure.setAttribute('style', serializeStyle(styleMap));\n\n if (hasNumericWidth) {\n const img = figure.querySelector('img');\n if (img) {\n const imgStyle = parseStyle(img.getAttribute('style') || '');\n if (imgStyle.get('width') === '100%') imgStyle.delete('width');\n if (imgStyle.get('height') === 'auto') imgStyle.delete('height');\n const serialized = serializeStyle(imgStyle);\n if (serialized) img.setAttribute('style', serialized);\n else img.removeAttribute('style');\n }\n }\n });\n\n return doc.body.innerHTML;\n};\n\nexport const imageClassesToInlineStyles = (html: string): string => {\n if (!html) return html;\n\n const doc = new DOMParser().parseFromString(html, 'text/html');\n doc.querySelectorAll('figure.image').forEach(figure => {\n const styleMap = parseStyle(figure.getAttribute('style') || '');\n const classList = figure.classList;\n const hasResizeWidth = styleMap.has('width') && /\\d/.test(styleMap.get('width')!);\n\n styleMap.set('display', 'block');\n styleMap.set('max-width', '100%');\n\n if (classList.contains('image-style-align-left')) {\n if (hasResizeWidth && styleMap.get('width') === '100%') {\n styleMap.delete('float');\n styleMap.set('margin', '0 auto 0 0');\n } else {\n styleMap.set('float', 'left');\n styleMap.set('margin', '0 1em 0 0');\n }\n } else if (classList.contains('image-style-align-right')) {\n if (hasResizeWidth && styleMap.get('width') === '100%') {\n styleMap.delete('float');\n styleMap.set('margin', '0 0 0 auto');\n } else {\n styleMap.set('float', 'right');\n styleMap.set('margin', '0 0 0 1em');\n }\n } else if (classList.contains('image-style-block-align-left')) {\n styleMap.delete('float');\n styleMap.set('margin', '0 auto 0 0');\n } else if (classList.contains('image-style-block-align-right')) {\n styleMap.delete('float');\n styleMap.set('margin', '0 0 0 auto');\n } else {\n styleMap.delete('float');\n styleMap.set('margin', '0 auto');\n }\n\n if (!hasResizeWidth) styleMap.set('width', 'fit-content');\n figure.setAttribute('style', serializeStyle(styleMap));\n\n if (hasResizeWidth) {\n const img = figure.querySelector('img');\n if (img) {\n const imgStyle = parseStyle(img.getAttribute('style') || '');\n imgStyle.set('width', '100%');\n imgStyle.set('height', 'auto');\n img.setAttribute('style', serializeStyle(imgStyle));\n }\n }\n });\n\n return doc.body.innerHTML;\n};\n","import { SdEditorImageConfig, SdEditorImageUploadValidation } from '../../models';\nimport { SdEditorUploadFileDetail, SdEditorUploadFileFuncUpload } from '../../configurations';\nimport { FileRepository, Image, ImageResize, ImageStyle, ImageToolbar, ImageUpload, Plugin, FileLoader } from 'ckeditor5';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { validateAndGetFile } from './utils';\n\ntype GetOptionFn =\n | (() => {\n imageConfig?: SdEditorImageConfig;\n uploadFn?: SdEditorUploadFileFuncUpload;\n onWarning?: (message: string) => void;\n _i18n?: I18nService;\n })\n | undefined;\n\ninterface ImageMeta {\n name?: string;\n fileName?: string;\n idOrKey?: string;\n lazyLoad: boolean;\n}\n\nclass UploadQueue {\n #queue: Array<() => void> = [];\n #running = 0;\n readonly maxConcurrent: number;\n\n constructor(maxConcurrent: number) {\n this.maxConcurrent = maxConcurrent;\n }\n\n async run<T>(task: () => Promise<T>): Promise<T> {\n if (this.#running >= this.maxConcurrent) {\n await new Promise<void>(resolve => {\n this.#queue.push(resolve);\n });\n }\n this.#running++;\n try {\n return await task();\n } finally {\n this.#running--;\n this.#queue.shift()?.();\n }\n }\n}\n\nclass BatchUploadScheduler {\n #pending: Array<{ file: File; resolve: (d: SdEditorUploadFileDetail) => void; reject: (e: unknown) => void }> = [];\n #timer: ReturnType<typeof setTimeout> | null = null;\n readonly #batchSize: number;\n readonly #uploadFn: SdEditorUploadFileFuncUpload;\n readonly #queue: UploadQueue;\n\n constructor(batchSize: number, uploadFn: SdEditorUploadFileFuncUpload, queue: UploadQueue) {\n this.#batchSize = batchSize;\n this.#uploadFn = uploadFn;\n this.#queue = queue;\n }\n\n enqueue(file: File): Promise<SdEditorUploadFileDetail> {\n return new Promise((resolve, reject) => {\n this.#pending.push({ file, resolve, reject });\n if (this.#timer) {\n clearTimeout(this.#timer);\n }\n if (this.#pending.length >= this.#batchSize) {\n this.#timer = null;\n this.#flush();\n } else {\n this.#timer = setTimeout(() => this.#flush(), 50);\n }\n });\n }\n\n destroy() {\n if (this.#timer !== null) {\n clearTimeout(this.#timer);\n this.#timer = null;\n }\n this.#pending.splice(0).forEach(p => p.reject(new Error('Upload cancelled')));\n }\n\n #flush() {\n this.#timer = null;\n const all = this.#pending.splice(0);\n if (all.length === 0) {\n return;\n }\n\n for (let i = 0; i < all.length; i += this.#batchSize) {\n const batch = all.slice(i, i + this.#batchSize);\n this.#queue\n .run(() => this.#uploadFn(batch.map(p => p.file)))\n .then(details => {\n batch.forEach((p, idx) => {\n if (details && details[idx]) {\n p.resolve(details[idx]);\n } else {\n p.reject(new Error('Upload failed: Missing details from server'));\n }\n });\n })\n .catch(err => {\n batch.forEach(p => p.reject(err));\n });\n }\n }\n}\n\nclass DeferredImageUploadAdapter {\n #loader: FileLoader;\n #pendingFiles: Map<string, File>;\n #imageMetaMap: Map<string, ImageMeta>;\n #validation: SdEditorImageUploadValidation | undefined;\n #onWarning: ((message: string) => void) | undefined;\n #i18n: I18nService | undefined;\n #lazyLoad: boolean;\n #currentBlobUrl: string | null = null;\n\n constructor(\n loader: FileLoader,\n pendingFiles: Map<string, File>,\n imageMetaMap: Map<string, ImageMeta>,\n options: {\n validation?: SdEditorImageUploadValidation;\n onWarning?: (message: string) => void;\n i18n?: I18nService;\n lazyLoad: boolean;\n }\n ) {\n this.#loader = loader;\n this.#pendingFiles = pendingFiles;\n this.#imageMetaMap = imageMetaMap;\n this.#validation = options.validation;\n this.#onWarning = options.onWarning;\n this.#i18n = options.i18n;\n this.#lazyLoad = options.lazyLoad;\n }\n\n upload = async (): Promise<{ default: string }> => {\n const file = await validateAndGetFile(this.#loader, this.#validation, this.#onWarning, this.#i18n);\n if (!file) throw new Error('Image validation failed');\n this.#currentBlobUrl = URL.createObjectURL(file);\n this.#pendingFiles.set(this.#currentBlobUrl, file);\n this.#imageMetaMap.set(this.#currentBlobUrl, { fileName: file.name, lazyLoad: this.#lazyLoad });\n return { default: this.#currentBlobUrl };\n };\n\n abort() {\n if (this.#currentBlobUrl) {\n URL.revokeObjectURL(this.#currentBlobUrl);\n this.#pendingFiles.delete(this.#currentBlobUrl);\n this.#imageMetaMap.delete(this.#currentBlobUrl);\n }\n }\n}\n\nclass ImmediateImageUploadAdapter {\n #loader: FileLoader;\n #validation: SdEditorImageUploadValidation | undefined;\n #onWarning: ((message: string) => void) | undefined;\n #i18n: I18nService | undefined;\n #scheduler: BatchUploadScheduler;\n #imageMetaMap: Map<string, ImageMeta>;\n #lazyLoad: boolean;\n\n constructor(\n loader: FileLoader,\n scheduler: BatchUploadScheduler,\n imageMetaMap: Map<string, ImageMeta>,\n options: {\n validation?: SdEditorImageUploadValidation;\n onWarning?: (message: string) => void;\n i18n?: I18nService;\n lazyLoad: boolean;\n }\n ) {\n this.#loader = loader;\n this.#scheduler = scheduler;\n this.#imageMetaMap = imageMetaMap;\n this.#validation = options.validation;\n this.#onWarning = options.onWarning;\n this.#i18n = options.i18n;\n this.#lazyLoad = options.lazyLoad;\n }\n\n upload = async (): Promise<{ default: string }> => {\n const file = await validateAndGetFile(this.#loader, this.#validation, this.#onWarning, this.#i18n);\n if (!file) throw new Error('Image validation failed');\n const detail = await this.#scheduler.enqueue(file);\n this.#imageMetaMap.set(detail.cdn, {\n name: detail.name,\n fileName: file.name,\n idOrKey: detail.idOrKey,\n lazyLoad: this.#lazyLoad,\n });\n return { default: detail.cdn };\n };\n\n abort() {}\n}\n\nexport class EditorImageUploadPlugin extends Plugin {\n pendingFiles = new Map<string, File>();\n uploadQueue!: UploadQueue;\n #batchScheduler: BatchUploadScheduler | undefined;\n #imageMetaMap = new Map<string, ImageMeta>();\n\n setMeta(cdnUrl: string, meta: { name?: string; idOrKey?: string; lazyLoad: boolean }): void {\n this.#imageMetaMap.set(cdnUrl, { name: meta.name, idOrKey: meta.idOrKey, lazyLoad: meta.lazyLoad });\n }\n\n static get pluginName() {\n return 'EditorImageUploadPlugin' as const;\n }\n\n static get requires() {\n return [FileRepository, Image, ImageResize, ImageUpload, ImageStyle, ImageToolbar] as const;\n }\n\n init() {\n const editor = this.editor;\n const getOption = editor.config.get('getOption') as GetOptionFn;\n const maxConcurrent = getOption?.()?.imageConfig?.maxConcurrentUploads ?? 2;\n this.uploadQueue = new UploadQueue(maxConcurrent);\n\n this.#registerSchemaAndConverters();\n this.#listenForSrcChanges();\n\n editor.editing.view.document.on(\n 'clipboardInput',\n (evt: any, data: any) => {\n const dataTransfer = data.dataTransfer;\n if (!dataTransfer) return;\n const hasImageFiles = Array.from<File>(dataTransfer.files ?? []).some(f => f.type.startsWith('image/'));\n const hasImageInHtml = /<img[\\s>]/i.test(dataTransfer.getData('text/html') ?? '');\n if (hasImageFiles || hasImageInHtml) {\n evt.stop();\n }\n },\n { priority: 'highest' }\n );\n\n const uploadImageCommand = editor.commands.get('uploadImage');\n if (uploadImageCommand) {\n uploadImageCommand.on(\n 'execute',\n (evt: any, args: any[]) => {\n const options = args[0] || {};\n const option = getOption?.();\n const maxPerSelection = option?.imageConfig?.maxImagesPerSelection;\n\n if (maxPerSelection !== undefined) {\n const files: File[] = Array.isArray(options?.file) ? options.file : options?.file ? [options.file] : [];\n if (files.length > maxPerSelection) {\n // Angular wrapper luôn truyền _i18n; nếu thiếu thì warning sẽ là chuỗi rỗng (i18n service tự log missing key)\n const msg = option?._i18n?.t('core.component.editor.image.max-per-selection', { max: maxPerSelection }) ?? '';\n option?.onWarning?.(msg);\n evt.stop();\n }\n }\n },\n { priority: 'high' }\n );\n }\n\n editor.once('ready', () => {\n const notification = (editor.plugins as any).get('Notification');\n notification?.on(\n 'show:warning',\n (evt: any) => {\n evt.stop();\n },\n { priority: 'highest' }\n );\n });\n\n editor.plugins.get('FileRepository').createUploadAdapter = (loader: FileLoader) => {\n const option = getOption?.();\n const imageConfig = option?.imageConfig;\n const uploadMode = imageConfig?.uploadMode ?? 'deferred';\n const validation = imageConfig?.validation;\n const onWarning = option?.onWarning;\n const i18n = option?._i18n;\n const lazyLoad = imageConfig?.lazyLoad ?? true;\n\n if (uploadMode === 'deferred') {\n return new DeferredImageUploadAdapter(loader, this.pendingFiles, this.#imageMetaMap, { validation, onWarning, i18n, lazyLoad });\n }\n\n if (!this.#batchScheduler) {\n const uploadFn = option?.uploadFn;\n if (uploadFn) {\n const batchSize = imageConfig?.batchSize ?? 2;\n this.#batchScheduler = new BatchUploadScheduler(batchSize, uploadFn, this.uploadQueue);\n }\n }\n\n if (!this.#batchScheduler) {\n throw new Error('No upload function configured');\n }\n return new ImmediateImageUploadAdapter(loader, this.#batchScheduler, this.#imageMetaMap, { validation, onWarning, i18n, lazyLoad });\n };\n }\n\n override destroy() {\n super.destroy();\n this.#batchScheduler?.destroy();\n for (const blobUrl of this.pendingFiles.keys()) {\n URL.revokeObjectURL(blobUrl);\n }\n this.pendingFiles.clear();\n this.#imageMetaMap.clear();\n }\n\n #registerSchemaAndConverters() {\n const editor = this.editor;\n const schema = editor.model.schema;\n\n for (const type of ['imageBlock', 'imageInline'] as const) {\n if (schema.isRegistered(type)) {\n schema.extend(type, { allowAttributes: ['loading', 'imageId'] });\n }\n }\n\n // Downcast: model → HTML view\n editor.conversion.for('downcast').add((dispatcher: any) => {\n for (const [modelAttr, htmlAttr] of [\n ['loading', 'loading'],\n ['imageId', 'id'],\n ] as const) {\n const handleAttribute = (isBlock: boolean) => (evt: any, data: any, conversionApi: any) => {\n if (!conversionApi.consumable.consume(data.item, evt.name)) return;\n\n const viewElement = conversionApi.mapper.toViewElement(data.item);\n const viewImg = isBlock ? this.#findImg(viewElement) : viewElement;\n\n if (!viewImg) return;\n\n if (data.attributeNewValue != null) {\n conversionApi.writer.setAttribute(htmlAttr, String(data.attributeNewValue), viewImg);\n } else {\n conversionApi.writer.removeAttribute(htmlAttr, viewImg);\n }\n };\n\n dispatcher.on(`attribute:${modelAttr}:imageBlock`, handleAttribute(true));\n dispatcher.on(`attribute:${modelAttr}:imageInline`, handleAttribute(false));\n }\n });\n\n // Upcast: HTML → model\n editor.conversion.for('upcast').add((dispatcher: any) => {\n dispatcher.on(\n 'element:figure',\n (_evt: any, data: any, conversionApi: any) => {\n if (!data.viewItem.hasClass('image')) return;\n const modelElement = data.modelRange?.start?.nodeAfter;\n if (!modelElement) return;\n const viewImg = this.#findImg(data.viewItem);\n if (!viewImg) return;\n this.#transferHtmlAttrsToModel(viewImg, modelElement, conversionApi);\n },\n { priority: 'low' }\n );\n\n dispatcher.on(\n 'element:img',\n (_evt: any, data: any, conversionApi: any) => {\n const modelElement = data.modelRange?.start?.nodeAfter;\n if (!modelElement) return;\n this.#transferHtmlAttrsToModel(data.viewItem, modelElement, conversionApi);\n },\n { priority: 'low' }\n );\n });\n }\n\n #listenForSrcChanges() {\n const editor = this.editor;\n\n editor.model.document.on('change', () => {\n const changes = editor.model.document.differ.getChanges();\n const updates: Array<{ element: any; meta: ImageMeta }> = [];\n\n for (const change of changes) {\n if (change.type !== 'attribute' || change.attributeKey !== 'src') continue;\n const newSrc = (change as any).attributeNewValue as string;\n const meta = this.#imageMetaMap.get(newSrc);\n if (!meta) continue;\n\n const node = (change as any).range?.start?.nodeAfter;\n if (node?.is('element')) {\n updates.push({ element: node, meta });\n this.#imageMetaMap.delete(newSrc);\n }\n }\n\n if (updates.length === 0) return;\n\n editor.model.enqueueChange('transparent' as any, (writer: any) => {\n for (const { element, meta } of updates) {\n if (meta.name || meta.fileName) {\n writer.setAttribute('alt', meta.name || this.#generateAlt(meta.fileName), element);\n }\n\n if (meta.lazyLoad) {\n writer.setAttribute('loading', 'lazy', element);\n }\n\n if (meta.idOrKey) {\n writer.setAttribute('imageId', meta.idOrKey, element);\n }\n }\n });\n });\n }\n\n #findImg(viewElement: any): any {\n if (!viewElement) return null;\n if (viewElement.is?.('element', 'img')) return viewElement;\n for (const child of viewElement.getChildren?.() ?? []) {\n if ((child as any).is?.('element', 'img')) return child;\n }\n return null;\n }\n\n #transferHtmlAttrsToModel(viewImg: any, modelElement: any, conversionApi: any) {\n const schema = this.editor.model.schema;\n if (viewImg.hasAttribute('loading') && schema.checkAttribute(modelElement, 'loading')) {\n conversionApi.writer.setAttribute('loading', viewImg.getAttribute('loading'), modelElement);\n }\n if (viewImg.hasAttribute('id') && schema.checkAttribute(modelElement, 'imageId')) {\n conversionApi.writer.setAttribute('imageId', viewImg.getAttribute('id'), modelElement);\n }\n }\n\n #generateAlt(fileName?: string): string {\n if (!fileName) return 'Image';\n const nameWithoutExt = fileName.replace(/\\.[^.]+$/, '');\n const result = nameWithoutExt\n .replace(/[_\\-\\.]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n return result || 'Image';\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AsyncValidatorFn, FormGroup, NgForm, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\nimport {\n Alignment,\n Bold,\n ClassicEditor,\n Essentials,\n FontColor,\n FontSize,\n Italic,\n List,\n Paragraph,\n Underline,\n Undo,\n Widget,\n} from 'ckeditor5';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport * as uuid from 'uuid';\nimport { ISdEditorConfiguration, SD_EDITOR_CONFIGURATION, SdEditorUploadFileFuncUpload } from './configurations';\nimport { SdNotifyService } from '@sdcorejs/angular/services';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { EditorImageUploadPlugin } from './plugins/image-upload/image-upload.plugin';\nimport { EditorOption, SdEditorOption } from './models';\nimport { HandleSdCustomValidator, SdCustomValidator, SdFormControl } from '@sdcorejs/angular/forms/models';\nimport { SdCKEditorStyles } from '@sdcorejs/angular/components/ckeditor-styles';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n applyReplacementsToEditor,\n countTextLength,\n filterActivePendingFiles,\n getActiveBlobUrls,\n getBatchConfig,\n imageClassesToInlineStyles,\n imageInlineStylesToClasses,\n runBatchUploads,\n} from './plugins/image-upload/utils';\n\n@Component({\n selector: 'sd-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CKEditorModule, SdLabel, SdCKEditorStyles, MatFormFieldModule, MatIconModule, MatTooltipModule],\n templateUrl: './editor.component.html',\n styleUrls: ['./editor.component.scss', './plugins/image-upload/image-upload.plugin.scss'],\n})\nexport class SdEditor {\n // Injected\n readonly #destroyRef = inject(DestroyRef);\n readonly #cdRef = inject(ChangeDetectorRef);\n readonly #uploadConfig = inject<ISdEditorConfiguration | ISdEditorConfiguration[]>(SD_EDITOR_CONFIGURATION, { optional: true });\n readonly #notifyService = inject(SdNotifyService);\n readonly #i18n = inject(I18nService);\n\n // Input\n readonly option = input<SdEditorOption>({});\n readonly height = input<string>('250px'); // Chiều dài height hiển thị mặc định\n readonly maxHeight = input<string>('250px'); // Chiều dài tối đa mở rộng nếu nội dung vượt quá height mặc định\n readonly maxlength = input<number | undefined>(undefined);\n readonly label = input<string | undefined>();\n readonly helperText = input<string | undefined>();\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly hideInlineError = input(false, { transform: booleanAttribute });\n readonly inlineError = input<string | undefined>();\n readonly placeholder = input<string | undefined>();\n readonly validator = input<SdCustomValidator | undefined>();\n readonly form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n if (val instanceof NgForm) return val.form;\n if (val instanceof FormGroup) return val;\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n readonly key = input<string | undefined>(undefined);\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n readonly autoId = computed(() => (this.autoIdInput() ? `components-editor-${this.autoIdInput()}` : undefined));\n readonly dataDisabled = computed(() => (this.disabled() ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.valueModel()) ? 'true' : 'false'));\n readonly name = input<string>(uuid.v4());\n readonly valueModel = model<string>('', { alias: 'model' });\n\n // Output\n readonly sdChange = output<string>();\n readonly sdBlur = output<FocusEvent>();\n readonly sdFocus = output<FocusEvent>();\n\n // State\n readonly _textLength = signal(0);\n readonly formControl = new SdFormControl();\n readonly isOverLimit = computed(() => {\n const max = this.maxlength();\n return max !== undefined && this._textLength() > max;\n });\n\n get errorMessage(): string | undefined {\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n if (errors['required']) return this.#i18n.t('core.component.editor.required');\n if (errors['maxlength']) return this.#i18n.t('core.component.editor.maxlength', { max: this.maxlength() ?? 0 });\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n }\n\n readonly Editor = ClassicEditor;\n #editor: ClassicEditor | undefined;\n readonly #contentChangeSubject = new Subject<string>();\n\n readonly editorConfig = computed<EditorOption>(() => {\n const opt = this.option();\n const uploadFn = this.#buildUploadFn();\n const enableImageUpload = !!uploadFn;\n\n const plugins: any[] = [Essentials, FontColor, FontSize, Paragraph, Bold, Italic, Underline, List, Undo, Widget, Alignment];\n if (enableImageUpload) plugins.push(EditorImageUploadPlugin);\n\n const toolbarItems = [\n 'bold',\n 'italic',\n 'underline',\n '|',\n 'fontSize',\n 'fontColor',\n '|',\n 'alignment:left',\n 'alignment:center',\n 'alignment:right',\n 'alignment:justify',\n '|',\n 'bulletedList',\n 'numberedList',\n ];\n if (enableImageUpload) toolbarItems.push('|', 'uploadImage');\n\n const config: EditorOption = {\n licenseKey: 'GPL',\n getOption: () => ({\n ...opt,\n uploadFn,\n onWarning: (msg: string) => this.#notifyService.warning(msg),\n // Truyền i18n service xuống CKEditor plugin (ngoài DI tree) để dịch warning messages\n _i18n: this.#i18n,\n }),\n plugins,\n toolbar: { items: toolbarItems, shouldNotGroupWhenFull: true },\n placeholder: this.placeholder(),\n fontColor: { columns: 5, documentColors: 10, colorPicker: { format: 'hex' } },\n fontSize: { options: [10, 11, 12, 14, 16, 18, 20], supportAllValues: true },\n };\n\n if (enableImageUpload) {\n config.image = {\n resizeUnit: '%',\n resizeOptions: [\n { name: 'resizeImage:100', value: '100', label: '100%' },\n { name: 'resizeImage:75', value: '75', label: '75%' },\n { name: 'resizeImage:50', value: '50', label: '50%' },\n { name: 'resizeImage:25', value: '25', label: '25%' },\n { name: 'resizeImage:original', value: null, label: 'Original' },\n ],\n toolbar: ['resizeImage', '|', 'imageStyle:alignBlockLeft', 'imageStyle:alignCenter', 'imageStyle:alignBlockRight'],\n };\n }\n\n return config;\n });\n\n constructor() {\n this.#validateDuplicateConfigKeys();\n this.#setupEffects();\n this.#setupSubscriptions();\n this.#setupDestroy();\n }\n\n onReady = (editor: ClassicEditor) => {\n this.#editor = editor;\n\n const currentValue = this.valueModel();\n if (currentValue) {\n this.#setToEditor(currentValue);\n }\n if (this.formControl.disabled) {\n editor.enableReadOnlyMode('sd-editor');\n }\n if (this.readonly()) {\n editor.enableReadOnlyMode('sd-editor-readonly');\n }\n\n editor.model.document.registerPostFixer(writer => {\n let changed = false;\n for (const change of editor.model.document.differ.getChanges()) {\n if (change.type === 'insert' && (change.name === 'imageBlock' || change.name === 'imageInline')) {\n const element = (change as any).position.nodeAfter;\n if (element && !element.hasAttribute('resizedWidth')) {\n writer.setAttribute('resizedWidth', '100%', element);\n changed = true;\n }\n }\n }\n return changed;\n });\n\n editor.model.document.on('change:data', () => this.#contentChangeSubject.next(editor.getData()));\n editor.editing.view.document.on('focus', evt => this.sdFocus.emit((evt as any).domEvent as FocusEvent));\n editor.editing.view.document.on('blur', evt => {\n this.sdBlur.emit((evt as any).domEvent as FocusEvent);\n this.formControl.markAsTouched();\n this.#cdRef.markForCheck();\n });\n };\n\n focusEditor = () => this.#editor?.editing?.view?.focus?.();\n\n /**\n * Xử lý tải lên các file và trả về nội dung dữ liệu cuối cùng.\n * * @description\n * - Đối với các file upload chế độ 'deferred' (chỉ xử lý khi submit), cần @ViewChild component và gọi hàm upload() này.\n * - Hỗ trợ two-way binding.\n * - Hàm hỗ trợ trả ra data cuối cùng.\n * * @returns {Promise<string>} Nội dung cuối cùng được trích xuất từ sd-editor.\n */\n upload = async (): Promise<string> => {\n await this.#uploadImages();\n return this.#getFromEditor();\n };\n\n // Editor Content\n #setToEditor(html: string): void {\n this.#editor?.setData?.(this.#normalizeHtmlForEditor(html));\n }\n\n #getFromEditor(): string {\n return this.#editor ? this.#normalizeEditorToHtml(this.#editor.getData()) : '';\n }\n\n // Normalize HTML từ bên ngoài -> format CKEditor.\n #normalizeHtmlForEditor = (html: string): string => {\n if (!html) {\n return '';\n }\n\n let result = html;\n result = imageInlineStylesToClasses(result);\n return result;\n };\n\n // Normalize HTML từ CKEditor → format HTML.\n #normalizeEditorToHtml = (html: string): string => {\n if (!html) {\n return '';\n }\n\n let result = html;\n result = imageClassesToInlineStyles(result);\n return result;\n };\n\n // Xử lý binding 2 chiều\n #onModelSignalChange(html: string): void {\n const v = html ?? '';\n if (this.formControl.value === v) {\n return;\n }\n this.formControl.setValue(v, { emitEvent: false });\n this._textLength.set(countTextLength(v));\n if (this.#editor) {\n this.#setToEditor(v);\n }\n }\n\n // Xử lý khi user soạn thảo\n #onEditorUserInput(rawHtml: string): void {\n const out = imageClassesToInlineStyles(rawHtml);\n this._textLength.set(countTextLength(out));\n if (this.formControl.value !== out) {\n this.formControl.setValue(out, { emitEvent: false });\n }\n this.formControl.updateValueAndValidity({ emitEvent: false });\n this.formControl.sdChanges.next(true);\n this.valueModel.set(out);\n this.sdChange.emit(out);\n }\n\n // Xử lý nếu dev sử dụng form và set trực tiếp data\n #onFormGroupExternalChange(html: string): void {\n const v = html ?? '';\n this.valueModel.set(v);\n this._textLength.set(countTextLength(v));\n if (this.#editor) {\n this.#setToEditor(v);\n }\n }\n\n // Validators\n #requiredValidator(): ValidatorFn {\n return (): ValidationErrors | null => (this._textLength() ? null : { required: true });\n }\n\n #maxLengthValidator(): ValidatorFn {\n return (): ValidationErrors | null => {\n const max = this.maxlength()!;\n const len = this._textLength();\n return len > max ? { maxlength: { requiredLength: max, actualLength: len } } : null;\n };\n }\n\n #inlineErrorValidator(): ValidatorFn {\n return (): ValidationErrors | null => ({ inlineError: true });\n }\n\n #updateValidators(): void {\n const validators: ValidatorFn[] = [];\n const asyncValidators: AsyncValidatorFn[] = [];\n\n if (this.required()) {\n validators.push(this.#requiredValidator());\n }\n if (this.maxlength() !== undefined) {\n validators.push(this.#maxLengthValidator());\n }\n if (this.inlineError()) {\n validators.push(this.#inlineErrorValidator());\n }\n\n const val = this.validator();\n if (val) {\n asyncValidators.push(HandleSdCustomValidator(val));\n }\n\n this.formControl.setValidators(validators.length ? validators : null);\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\n this.formControl.updateValueAndValidity({ emitEvent: false });\n }\n\n // Setup\n #setupEffects(): void {\n // Lắng nghe disabled\n effect(() => {\n this.disabled() ? this.formControl.disable({ emitEvent: false }) : this.formControl.enable({ emitEvent: false });\n });\n\n // Lắng nghe readonly\n effect(() => {\n if (!this.#editor) {\n return;\n }\n if (this.readonly()) {\n this.#editor.enableReadOnlyMode('sd-editor-readonly');\n } else {\n this.#editor.disableReadOnlyMode('sd-editor-readonly');\n }\n });\n\n // Lắng nghe binđing 2 chiều model\n effect(() => this.#onModelSignalChange(this.valueModel()));\n\n // Lắng nghe name form\n effect(() => this.form()?.addControl(this.name(), this.formControl));\n\n // Lắng nghe validators\n effect(() => {\n this.required();\n this.maxlength();\n this.inlineError();\n this.validator();\n this.#updateValidators();\n });\n }\n\n #setupSubscriptions(): void {\n // Đăng ký nếu dev sử dụng form để set data trực tiếp từ bên ngoài vào\n this.formControl.valueChanges\n .pipe(takeUntilDestroyed(this.#destroyRef))\n .subscribe((val: string) => this.#onFormGroupExternalChange(val));\n\n this.formControl.sdChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => this.#cdRef.markForCheck());\n\n // Đăng ký user gõ trong editor\n this.#contentChangeSubject\n .pipe(debounceTime(100), takeUntilDestroyed(this.#destroyRef))\n .subscribe(rawHtml => this.#onEditorUserInput(rawHtml));\n }\n\n #setupDestroy(): void {\n this.#destroyRef.onDestroy(() => {\n this.form()?.removeControl(this.name());\n this.#editor?.destroy?.();\n });\n }\n\n // Helpers\n #uploadImages = async (): Promise<void> => {\n const uploadMode = this.option()?.imageConfig?.uploadMode ?? 'deferred';\n // Early return nếu không phải 'deferred' mode.\n // Nếu trước đó là mode \"deferred\" mà mong muốn chuyển sang mode \"immediate\", dev chưa cần refactor code phía caller mà không ảnh hưởng đến logic.\n if (uploadMode !== 'deferred') return;\n\n const uploadFn = this.#buildUploadFn();\n if (!uploadFn) {\n throw new Error('No upload function configured for image upload');\n }\n\n const plugin = this.#editor?.plugins?.get(EditorImageUploadPlugin) as EditorImageUploadPlugin | undefined;\n if (!plugin || plugin.pendingFiles.size === 0) return;\n\n const { batchSize, maxConcurrent } = getBatchConfig(this.option());\n const activeBlobUrls = this.#editor ? getActiveBlobUrls(this.#editor) : new Set<string>();\n const toUpload = filterActivePendingFiles(plugin.pendingFiles, activeBlobUrls);\n\n // Capture trước await để tránh race condition: ảnh được chèn trong lúc chờ API\n const processedBlobUrls = new Set(toUpload.map(([blobUrl]) => blobUrl));\n const { replacements, failedBatches } = await runBatchUploads(toUpload, uploadFn, batchSize, maxConcurrent);\n\n if (this.#editor) {\n const lazyLoad = this.option()?.imageConfig?.lazyLoad ?? true;\n for (const detail of replacements.values()) {\n plugin.setMeta(detail.cdn, { name: detail.name, idOrKey: detail.idOrKey, lazyLoad });\n }\n applyReplacementsToEditor(this.#editor, replacements);\n }\n\n // Chỉ xóa đúng các entries đã được xử lý\n for (const blobUrl of processedBlobUrls) {\n plugin.pendingFiles.delete(blobUrl);\n }\n\n for (const [blobUrl, file] of failedBatches.flat()) {\n plugin.pendingFiles.set(blobUrl, file);\n }\n\n if (failedBatches.length > 0) {\n throw new Error(`Upload failed for ${failedBatches.flat().length} image(s)`);\n }\n };\n\n #getConfigurations = (): ISdEditorConfiguration[] => {\n const config = this.#uploadConfig;\n if (!config) {\n return [];\n }\n return Array.isArray(config) ? config : [config];\n };\n\n #validateDuplicateConfigKeys = (): void => {\n const config = this.#uploadConfig;\n if (!config) {\n return;\n }\n const configurations = Array.isArray(config) ? config : [config];\n const seen = new Set<string>();\n for (const cfg of configurations) {\n const normalizedKey = cfg.key === undefined ? '__undefined__' : cfg.key;\n if (seen.has(normalizedKey)) {\n const label = cfg.key === undefined ? 'undefined' : cfg.key;\n throw new Error(`[sd-editor] Duplicate upload configuration key detected: ${label}`);\n }\n seen.add(normalizedKey);\n }\n };\n\n #getSelectedConfig = (): ISdEditorConfiguration | undefined => {\n const configurations = this.#getConfigurations();\n if (!configurations.length) {\n return undefined;\n }\n\n return configurations.find(cfg => cfg.key === this.key());\n };\n\n #buildUploadFn = (): SdEditorUploadFileFuncUpload | undefined => {\n return this.option()?.imageConfig?.uploadFn ?? this.#getSelectedConfig()?.upload;\n };\n}\n","<sd-ckeditor-styles />\n@let lbl = label();\n@let hText = helperText();\n@let hideErr = hideInlineError();\n@let errMsg = errorMessage;\n@let req = required();\n@let maxLen = maxlength();\n@let showCounter = !!maxLen && !formControl.disabled && !hideErr;\n\n@if (lbl) {\n <sd-label [label]=\"lbl\" [required]=\"req\" [helperText]=\"hText\"></sd-label>\n}\n\n<div\n class=\"sd-editor\"\n [class.sd-editor--readonly]=\"readonly()\"\n [class.sd-editor--error]=\"formControl.invalid && formControl.touched\"\n [class.has-counter]=\"showCounter\"\n [style.--sd-editor-content-min-height]=\"height()\"\n [style.--sd-editor-content-max-height]=\"maxHeight()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-empty]=\"dataEmpty()\">\n <ckeditor [editor]=\"Editor\" [config]=\"editorConfig()\" [disabled]=\"formControl.disabled\" (ready)=\"onReady($event)\"></ckeditor>\n\n @if (showCounter) {\n <div class=\"sd-editor-counter-row\">\n <span class=\"sd-editor-counter\" [class.sd-editor-counter--over]=\"isOverLimit()\"> {{ _textLength() }}/{{ maxLen }} </span>\n </div>\n }\n\n @if (hideErr && errMsg && formControl.touched) {\n <mat-icon class=\"sd-error-icon\" [matTooltip]=\"errMsg\" matTooltipPosition=\"above\">error</mat-icon>\n }\n</div>\n\n<div class=\"sd-editor-footer\">\n @if (!hideErr && errMsg && formControl.touched) {\n <mat-error>{{ errMsg }}</mat-error>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sdcorejs-angular-components-editor.mjs","sources":["../../../projects/sdcorejs-angular/components/editor/src/configurations/editor.configuration.ts","../../../projects/sdcorejs-angular/components/editor/src/plugins/image-upload/utils/validate.utils.ts","../../../projects/sdcorejs-angular/components/editor/src/plugins/image-upload/utils/batch.utils.ts","../../../projects/sdcorejs-angular/components/editor/src/plugins/image-upload/utils/style.utils.ts","../../../projects/sdcorejs-angular/components/editor/src/plugins/image-upload/image-upload.plugin.ts","../../../projects/sdcorejs-angular/components/editor/src/editor.component.ts","../../../projects/sdcorejs-angular/components/editor/src/editor.component.html","../../../projects/sdcorejs-angular/components/editor/sdcorejs-angular-components-editor.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport interface SdEditorUploadFileDetail {\n idOrKey: string;\n cdn: string;\n name?: string;\n}\n\nexport type SdEditorUploadFileFuncUpload = (files: File[]) => Promise<SdEditorUploadFileDetail[]>;\n\nexport interface ISdEditorConfiguration {\n key?: string;\n upload: SdEditorUploadFileFuncUpload;\n}\n\nexport const SD_EDITOR_CONFIGURATION = new InjectionToken<ISdEditorConfiguration>(\n 'sd.editor.configuration'\n);\n","import { FileLoader } from 'ckeditor5';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdEditorImageUploadValidation } from '../../../models';\n\n// Dựa vào file để detect định dạng thay vì chỉ check tên\n// Tránh user gửi file không đúng, ví dụ file docx nhưng đổi tên thành ảnh docx.jpg\nconst detectFormatFromBytes = async (file: File): Promise<string> => {\n const buffer = await file.slice(0, 12).arrayBuffer();\n const b = new Uint8Array(buffer);\n\n if (b[0] === 0xff && b[1] === 0xd8 && b[2] === 0xff) return 'jpg';\n if (b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) return 'png';\n if (b[0] === 0x52 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x46 && b[8] === 0x57) return 'webp';\n if (b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46 && b[3] === 0x38) return 'gif';\n if (b[4] === 0x66 && b[5] === 0x74 && b[6] === 0x79 && b[7] === 0x70) {\n const brand = String.fromCharCode(b[8], b[9], b[10], b[11]);\n if (brand === 'avif') return 'avif';\n if (brand.startsWith('hei')) return 'heic';\n }\n return '';\n};\n\nconst getImageInfo = async (file: File): Promise<{ width: number; height: number; sizeMB: number; format: string }> => {\n const sizeMB = file.size / (1024 * 1024);\n const loadDimensions = new Promise<{ width: number; height: number }>(resolve => {\n const url = URL.createObjectURL(file);\n const img = new window.Image();\n img.onload = () => {\n URL.revokeObjectURL(url);\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = () => {\n URL.revokeObjectURL(url);\n resolve({ width: 0, height: 0 });\n };\n img.src = url;\n });\n const [format, { width, height }] = await Promise.all([detectFormatFromBytes(file), loadDimensions]);\n return { width, height, sizeMB, format };\n};\n\n// Helper: gọi i18n.t khi có service; nếu thiếu thì trả empty (Angular wrapper luôn truyền i18n)\nconst tr = (i18n: I18nService | undefined, key: string, params: Record<string, unknown>): string =>\n i18n?.t(key, params as any) ?? '';\n\nconst validateImageFile = async (\n file: File,\n validation: SdEditorImageUploadValidation,\n onWarning?: (message: string) => void,\n i18n?: I18nService\n): Promise<boolean> => {\n const { width, height, sizeMB, format } = await getImageInfo(file);\n\n if (validation.allowedFormats !== undefined) {\n const normalizedFormats = validation.allowedFormats.map((f: string) => {\n const fmt = f.replace(/^\\./, '').toLowerCase();\n return fmt === 'jpeg' ? 'jpg' : fmt;\n });\n if (!normalizedFormats.includes(format)) {\n const allowed = normalizedFormats.join(', ');\n onWarning?.(tr(i18n, 'core.component.editor.image.invalid-format', { format, allowed }));\n return false;\n }\n }\n if (validation.maxSizeMB !== undefined && sizeMB > validation.maxSizeMB) {\n const sizeMBFixed = sizeMB.toFixed(2);\n onWarning?.(tr(i18n, 'core.component.editor.image.size-exceeded', { sizeMB: sizeMBFixed, maxSizeMB: validation.maxSizeMB }));\n return false;\n }\n if (validation.minWidth !== undefined && width < validation.minWidth) {\n onWarning?.(tr(i18n, 'core.component.editor.image.min-width', { width, min: validation.minWidth }));\n return false;\n }\n if (validation.minHeight !== undefined && height < validation.minHeight) {\n onWarning?.(tr(i18n, 'core.component.editor.image.min-height', { height, min: validation.minHeight }));\n return false;\n }\n if (validation.maxWidth !== undefined && width > validation.maxWidth) {\n onWarning?.(tr(i18n, 'core.component.editor.image.max-width', { width, max: validation.maxWidth }));\n return false;\n }\n if (validation.maxHeight !== undefined && height > validation.maxHeight) {\n onWarning?.(tr(i18n, 'core.component.editor.image.max-height', { height, max: validation.maxHeight }));\n return false;\n }\n return true;\n};\n\nexport const validateAndGetFile = async (\n loader: FileLoader,\n validation?: SdEditorImageUploadValidation,\n onWarning?: (message: string) => void,\n i18n?: I18nService\n): Promise<File> => {\n const file = (await loader.file) as File | null;\n if (!file) {\n throw new Error('No file found');\n }\n if (validation) {\n const valid = await validateImageFile(file, validation, onWarning, i18n);\n if (!valid) {\n throw new Error('Image validation failed');\n }\n }\n return file;\n};\n","import { ClassicEditor } from 'ckeditor5';\nimport { SdEditorOption } from '../../../models';\nimport { SdEditorUploadFileDetail, SdEditorUploadFileFuncUpload } from '../../../configurations';\n\nexport const getBatchConfig = (option: SdEditorOption): { batchSize: number; maxConcurrent: number } => {\n const imageConfig = option?.imageConfig;\n return {\n batchSize: Math.max(1, imageConfig?.batchSize ?? 2),\n maxConcurrent: Math.max(1, imageConfig?.maxConcurrentUploads ?? 2),\n };\n};\n\nexport const getActiveBlobUrls = (editor: ClassicEditor): Set<string> => {\n const urls = new Set<string>();\n const root = editor.model.document.getRoot();\n if (!root) return urls;\n for (const item of editor.model.createRangeIn(root).getItems()) {\n if (item.is('element', 'imageBlock') || item.is('element', 'imageInline')) {\n const src = item.getAttribute('src') as string;\n if (src?.startsWith('blob:')) urls.add(src);\n }\n }\n return urls;\n};\n\nexport const filterActivePendingFiles = (\n pendingFiles: Map<string, File>,\n activeBlobUrls: Set<string>\n): Array<[string, File]> => {\n const toUpload: Array<[string, File]> = [];\n for (const [blobUrl, file] of pendingFiles) {\n if (activeBlobUrls.has(blobUrl)) {\n toUpload.push([blobUrl, file]);\n } else {\n URL.revokeObjectURL(blobUrl);\n pendingFiles.delete(blobUrl);\n }\n }\n return toUpload;\n};\n\nexport const runBatchUploads = async (\n toUpload: Array<[string, File]>,\n uploadFn: SdEditorUploadFileFuncUpload,\n batchSize: number,\n maxConcurrent: number\n): Promise<{ replacements: Map<string, SdEditorUploadFileDetail>; failedBatches: Array<[string, File][]> }> => {\n const batches: Array<[string, File][]> = [];\n for (let i = 0; i < toUpload.length; i += batchSize) {\n batches.push(toUpload.slice(i, i + batchSize));\n }\n\n const replacements = new Map<string, SdEditorUploadFileDetail>();\n const failedBatches: Array<[string, File][]> = [];\n\n let head = 0;\n const runWorker = async () => {\n while (head < batches.length) {\n const batch = batches[head++];\n try {\n const details = await uploadFn(batch.map(([, file]) => file));\n if (details.length !== batch.length) {\n throw new Error(`API returned ${details.length} results for ${batch.length} files`);\n }\n batch.forEach(([blobUrl], idx) => {\n replacements.set(blobUrl, details[idx]);\n URL.revokeObjectURL(blobUrl);\n });\n } catch {\n failedBatches.push(batch);\n }\n }\n };\n\n await Promise.all(Array.from({ length: Math.min(maxConcurrent, batches.length) }, runWorker));\n\n return { replacements, failedBatches };\n};\n\nexport const applyReplacementsToEditor = (editor: ClassicEditor, replacements: Map<string, SdEditorUploadFileDetail>): void => {\n if (replacements.size === 0) return;\n\n editor.model.change(writer => {\n const root = editor.model.document.getRoot()!;\n for (const item of editor.model.createRangeIn(root).getItems()) {\n if (!item.is('element', 'imageBlock') && !item.is('element', 'imageInline')) continue;\n const detail = replacements.get(item.getAttribute('src') as string);\n if (detail) writer.setAttribute('src', detail.cdn, item);\n }\n });\n};\n","const parseStyle = (style: string): Map<string, string> => {\n const map = new Map<string, string>();\n for (const decl of style.split(';')) {\n const colon = decl.indexOf(':');\n if (colon === -1) continue;\n const key = decl.slice(0, colon).trim();\n const value = decl.slice(colon + 1).trim();\n if (key && value) map.set(key, value);\n }\n return map;\n};\n\nconst serializeStyle = (map: Map<string, string>): string =>\n [...map.entries()].map(([k, v]) => `${k}:${v}`).join(';');\n\nexport const countTextLength = (content: string): number => {\n if (!content) return 0;\n const doc = new DOMParser().parseFromString(content, 'text/html');\n doc.querySelectorAll('img, figure').forEach(el => el.remove());\n return doc.body.textContent?.length ?? 0;\n};\n\nexport const imageInlineStylesToClasses = (html: string): string => {\n if (!html) return html;\n\n const doc = new DOMParser().parseFromString(html, 'text/html');\n doc.querySelectorAll('figure.image').forEach(figure => {\n const styleMap = parseStyle(figure.getAttribute('style') || '');\n\n const floatVal = styleMap.get('float') || '';\n const marginVal = styleMap.get('margin') || '';\n const widthVal = styleMap.get('width') || '';\n const hasNumericWidth = /\\d/.test(widthVal) && widthVal !== 'fit-content';\n\n styleMap.delete('display');\n styleMap.delete('max-width');\n styleMap.delete('float');\n styleMap.delete('margin');\n if (widthVal === 'fit-content') styleMap.delete('width');\n\n figure.classList.remove(\n 'image-style-align-left', 'image-style-align-right',\n 'image-style-block-align-left', 'image-style-block-align-right'\n );\n\n if (floatVal === 'left') {\n figure.classList.add('image-style-align-left');\n } else if (floatVal === 'right') {\n figure.classList.add('image-style-align-right');\n } else if (marginVal === '0 auto 0 0') {\n figure.classList.add(hasNumericWidth ? 'image-style-align-left' : 'image-style-block-align-left');\n } else if (marginVal === '0 0 0 auto') {\n figure.classList.add(hasNumericWidth ? 'image-style-align-right' : 'image-style-block-align-right');\n }\n\n figure.setAttribute('style', serializeStyle(styleMap));\n\n if (hasNumericWidth) {\n const img = figure.querySelector('img');\n if (img) {\n const imgStyle = parseStyle(img.getAttribute('style') || '');\n if (imgStyle.get('width') === '100%') imgStyle.delete('width');\n if (imgStyle.get('height') === 'auto') imgStyle.delete('height');\n const serialized = serializeStyle(imgStyle);\n if (serialized) img.setAttribute('style', serialized);\n else img.removeAttribute('style');\n }\n }\n });\n\n return doc.body.innerHTML;\n};\n\nexport const imageClassesToInlineStyles = (html: string): string => {\n if (!html) return html;\n\n const doc = new DOMParser().parseFromString(html, 'text/html');\n doc.querySelectorAll('figure.image').forEach(figure => {\n const styleMap = parseStyle(figure.getAttribute('style') || '');\n const classList = figure.classList;\n const hasResizeWidth = styleMap.has('width') && /\\d/.test(styleMap.get('width')!);\n\n styleMap.set('display', 'block');\n styleMap.set('max-width', '100%');\n\n if (classList.contains('image-style-align-left')) {\n if (hasResizeWidth && styleMap.get('width') === '100%') {\n styleMap.delete('float');\n styleMap.set('margin', '0 auto 0 0');\n } else {\n styleMap.set('float', 'left');\n styleMap.set('margin', '0 1em 0 0');\n }\n } else if (classList.contains('image-style-align-right')) {\n if (hasResizeWidth && styleMap.get('width') === '100%') {\n styleMap.delete('float');\n styleMap.set('margin', '0 0 0 auto');\n } else {\n styleMap.set('float', 'right');\n styleMap.set('margin', '0 0 0 1em');\n }\n } else if (classList.contains('image-style-block-align-left')) {\n styleMap.delete('float');\n styleMap.set('margin', '0 auto 0 0');\n } else if (classList.contains('image-style-block-align-right')) {\n styleMap.delete('float');\n styleMap.set('margin', '0 0 0 auto');\n } else {\n styleMap.delete('float');\n styleMap.set('margin', '0 auto');\n }\n\n if (!hasResizeWidth) styleMap.set('width', 'fit-content');\n figure.setAttribute('style', serializeStyle(styleMap));\n\n if (hasResizeWidth) {\n const img = figure.querySelector('img');\n if (img) {\n const imgStyle = parseStyle(img.getAttribute('style') || '');\n imgStyle.set('width', '100%');\n imgStyle.set('height', 'auto');\n img.setAttribute('style', serializeStyle(imgStyle));\n }\n }\n });\n\n return doc.body.innerHTML;\n};\n","import { SdEditorImageConfig, SdEditorImageUploadValidation } from '../../models';\nimport { SdEditorUploadFileDetail, SdEditorUploadFileFuncUpload } from '../../configurations';\nimport { FileRepository, Image, ImageResize, ImageStyle, ImageToolbar, ImageUpload, Plugin, FileLoader } from 'ckeditor5';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { validateAndGetFile } from './utils';\n\ntype GetOptionFn =\n | (() => {\n imageConfig?: SdEditorImageConfig;\n uploadFn?: SdEditorUploadFileFuncUpload;\n onWarning?: (message: string) => void;\n _i18n?: I18nService;\n })\n | undefined;\n\ninterface ImageMeta {\n name?: string;\n fileName?: string;\n idOrKey?: string;\n lazyLoad: boolean;\n}\n\nclass UploadQueue {\n #queue: Array<() => void> = [];\n #running = 0;\n readonly maxConcurrent: number;\n\n constructor(maxConcurrent: number) {\n this.maxConcurrent = maxConcurrent;\n }\n\n async run<T>(task: () => Promise<T>): Promise<T> {\n if (this.#running >= this.maxConcurrent) {\n await new Promise<void>(resolve => {\n this.#queue.push(resolve);\n });\n }\n this.#running++;\n try {\n return await task();\n } finally {\n this.#running--;\n this.#queue.shift()?.();\n }\n }\n}\n\nclass BatchUploadScheduler {\n #pending: Array<{ file: File; resolve: (d: SdEditorUploadFileDetail) => void; reject: (e: unknown) => void }> = [];\n #timer: ReturnType<typeof setTimeout> | null = null;\n readonly #batchSize: number;\n readonly #uploadFn: SdEditorUploadFileFuncUpload;\n readonly #queue: UploadQueue;\n\n constructor(batchSize: number, uploadFn: SdEditorUploadFileFuncUpload, queue: UploadQueue) {\n this.#batchSize = batchSize;\n this.#uploadFn = uploadFn;\n this.#queue = queue;\n }\n\n enqueue(file: File): Promise<SdEditorUploadFileDetail> {\n return new Promise((resolve, reject) => {\n this.#pending.push({ file, resolve, reject });\n if (this.#timer) {\n clearTimeout(this.#timer);\n }\n if (this.#pending.length >= this.#batchSize) {\n this.#timer = null;\n this.#flush();\n } else {\n this.#timer = setTimeout(() => this.#flush(), 50);\n }\n });\n }\n\n destroy() {\n if (this.#timer !== null) {\n clearTimeout(this.#timer);\n this.#timer = null;\n }\n this.#pending.splice(0).forEach(p => p.reject(new Error('Upload cancelled')));\n }\n\n #flush() {\n this.#timer = null;\n const all = this.#pending.splice(0);\n if (all.length === 0) {\n return;\n }\n\n for (let i = 0; i < all.length; i += this.#batchSize) {\n const batch = all.slice(i, i + this.#batchSize);\n this.#queue\n .run(() => this.#uploadFn(batch.map(p => p.file)))\n .then(details => {\n batch.forEach((p, idx) => {\n if (details && details[idx]) {\n p.resolve(details[idx]);\n } else {\n p.reject(new Error('Upload failed: Missing details from server'));\n }\n });\n })\n .catch(err => {\n batch.forEach(p => p.reject(err));\n });\n }\n }\n}\n\nclass DeferredImageUploadAdapter {\n #loader: FileLoader;\n #pendingFiles: Map<string, File>;\n #imageMetaMap: Map<string, ImageMeta>;\n #validation: SdEditorImageUploadValidation | undefined;\n #onWarning: ((message: string) => void) | undefined;\n #i18n: I18nService | undefined;\n #lazyLoad: boolean;\n #currentBlobUrl: string | null = null;\n\n constructor(\n loader: FileLoader,\n pendingFiles: Map<string, File>,\n imageMetaMap: Map<string, ImageMeta>,\n options: {\n validation?: SdEditorImageUploadValidation;\n onWarning?: (message: string) => void;\n i18n?: I18nService;\n lazyLoad: boolean;\n }\n ) {\n this.#loader = loader;\n this.#pendingFiles = pendingFiles;\n this.#imageMetaMap = imageMetaMap;\n this.#validation = options.validation;\n this.#onWarning = options.onWarning;\n this.#i18n = options.i18n;\n this.#lazyLoad = options.lazyLoad;\n }\n\n upload = async (): Promise<{ default: string }> => {\n const file = await validateAndGetFile(this.#loader, this.#validation, this.#onWarning, this.#i18n);\n if (!file) throw new Error('Image validation failed');\n this.#currentBlobUrl = URL.createObjectURL(file);\n this.#pendingFiles.set(this.#currentBlobUrl, file);\n this.#imageMetaMap.set(this.#currentBlobUrl, { fileName: file.name, lazyLoad: this.#lazyLoad });\n return { default: this.#currentBlobUrl };\n };\n\n abort() {\n if (this.#currentBlobUrl) {\n URL.revokeObjectURL(this.#currentBlobUrl);\n this.#pendingFiles.delete(this.#currentBlobUrl);\n this.#imageMetaMap.delete(this.#currentBlobUrl);\n }\n }\n}\n\nclass ImmediateImageUploadAdapter {\n #loader: FileLoader;\n #validation: SdEditorImageUploadValidation | undefined;\n #onWarning: ((message: string) => void) | undefined;\n #i18n: I18nService | undefined;\n #scheduler: BatchUploadScheduler;\n #imageMetaMap: Map<string, ImageMeta>;\n #lazyLoad: boolean;\n\n constructor(\n loader: FileLoader,\n scheduler: BatchUploadScheduler,\n imageMetaMap: Map<string, ImageMeta>,\n options: {\n validation?: SdEditorImageUploadValidation;\n onWarning?: (message: string) => void;\n i18n?: I18nService;\n lazyLoad: boolean;\n }\n ) {\n this.#loader = loader;\n this.#scheduler = scheduler;\n this.#imageMetaMap = imageMetaMap;\n this.#validation = options.validation;\n this.#onWarning = options.onWarning;\n this.#i18n = options.i18n;\n this.#lazyLoad = options.lazyLoad;\n }\n\n upload = async (): Promise<{ default: string }> => {\n const file = await validateAndGetFile(this.#loader, this.#validation, this.#onWarning, this.#i18n);\n if (!file) throw new Error('Image validation failed');\n const detail = await this.#scheduler.enqueue(file);\n this.#imageMetaMap.set(detail.cdn, {\n name: detail.name,\n fileName: file.name,\n idOrKey: detail.idOrKey,\n lazyLoad: this.#lazyLoad,\n });\n return { default: detail.cdn };\n };\n\n abort() {}\n}\n\nexport class EditorImageUploadPlugin extends Plugin {\n pendingFiles = new Map<string, File>();\n uploadQueue!: UploadQueue;\n #batchScheduler: BatchUploadScheduler | undefined;\n #imageMetaMap = new Map<string, ImageMeta>();\n\n setMeta(cdnUrl: string, meta: { name?: string; idOrKey?: string; lazyLoad: boolean }): void {\n this.#imageMetaMap.set(cdnUrl, { name: meta.name, idOrKey: meta.idOrKey, lazyLoad: meta.lazyLoad });\n }\n\n static get pluginName() {\n return 'EditorImageUploadPlugin' as const;\n }\n\n static get requires() {\n return [FileRepository, Image, ImageResize, ImageUpload, ImageStyle, ImageToolbar] as const;\n }\n\n init() {\n const editor = this.editor;\n const getOption = editor.config.get('getOption') as GetOptionFn;\n const maxConcurrent = getOption?.()?.imageConfig?.maxConcurrentUploads ?? 2;\n this.uploadQueue = new UploadQueue(maxConcurrent);\n\n this.#registerSchemaAndConverters();\n this.#listenForSrcChanges();\n\n editor.editing.view.document.on(\n 'clipboardInput',\n (evt: any, data: any) => {\n const dataTransfer = data.dataTransfer;\n if (!dataTransfer) return;\n const hasImageFiles = Array.from<File>(dataTransfer.files ?? []).some(f => f.type.startsWith('image/'));\n const hasImageInHtml = /<img[\\s>]/i.test(dataTransfer.getData('text/html') ?? '');\n if (hasImageFiles || hasImageInHtml) {\n evt.stop();\n }\n },\n { priority: 'highest' }\n );\n\n const uploadImageCommand = editor.commands.get('uploadImage');\n if (uploadImageCommand) {\n uploadImageCommand.on(\n 'execute',\n (evt: any, args: any[]) => {\n const options = args[0] || {};\n const option = getOption?.();\n const maxPerSelection = option?.imageConfig?.maxImagesPerSelection;\n\n if (maxPerSelection !== undefined) {\n const files: File[] = Array.isArray(options?.file) ? options.file : options?.file ? [options.file] : [];\n if (files.length > maxPerSelection) {\n // Angular wrapper luôn truyền _i18n; nếu thiếu thì warning sẽ là chuỗi rỗng (i18n service tự log missing key)\n const msg = option?._i18n?.t('core.component.editor.image.max-per-selection', { max: maxPerSelection }) ?? '';\n option?.onWarning?.(msg);\n evt.stop();\n }\n }\n },\n { priority: 'high' }\n );\n }\n\n editor.once('ready', () => {\n const notification = (editor.plugins as any).get('Notification');\n notification?.on(\n 'show:warning',\n (evt: any) => {\n evt.stop();\n },\n { priority: 'highest' }\n );\n });\n\n editor.plugins.get('FileRepository').createUploadAdapter = (loader: FileLoader) => {\n const option = getOption?.();\n const imageConfig = option?.imageConfig;\n const uploadMode = imageConfig?.uploadMode ?? 'deferred';\n const validation = imageConfig?.validation;\n const onWarning = option?.onWarning;\n const i18n = option?._i18n;\n const lazyLoad = imageConfig?.lazyLoad ?? true;\n\n if (uploadMode === 'deferred') {\n return new DeferredImageUploadAdapter(loader, this.pendingFiles, this.#imageMetaMap, { validation, onWarning, i18n, lazyLoad });\n }\n\n if (!this.#batchScheduler) {\n const uploadFn = option?.uploadFn;\n if (uploadFn) {\n const batchSize = imageConfig?.batchSize ?? 2;\n this.#batchScheduler = new BatchUploadScheduler(batchSize, uploadFn, this.uploadQueue);\n }\n }\n\n if (!this.#batchScheduler) {\n throw new Error('No upload function configured');\n }\n return new ImmediateImageUploadAdapter(loader, this.#batchScheduler, this.#imageMetaMap, { validation, onWarning, i18n, lazyLoad });\n };\n }\n\n override destroy() {\n super.destroy();\n this.#batchScheduler?.destroy();\n for (const blobUrl of this.pendingFiles.keys()) {\n URL.revokeObjectURL(blobUrl);\n }\n this.pendingFiles.clear();\n this.#imageMetaMap.clear();\n }\n\n #registerSchemaAndConverters() {\n const editor = this.editor;\n const schema = editor.model.schema;\n\n for (const type of ['imageBlock', 'imageInline'] as const) {\n if (schema.isRegistered(type)) {\n schema.extend(type, { allowAttributes: ['loading', 'imageId'] });\n }\n }\n\n // Downcast: model → HTML view\n editor.conversion.for('downcast').add((dispatcher: any) => {\n for (const [modelAttr, htmlAttr] of [\n ['loading', 'loading'],\n ['imageId', 'id'],\n ] as const) {\n const handleAttribute = (isBlock: boolean) => (evt: any, data: any, conversionApi: any) => {\n if (!conversionApi.consumable.consume(data.item, evt.name)) return;\n\n const viewElement = conversionApi.mapper.toViewElement(data.item);\n const viewImg = isBlock ? this.#findImg(viewElement) : viewElement;\n\n if (!viewImg) return;\n\n if (data.attributeNewValue != null) {\n conversionApi.writer.setAttribute(htmlAttr, String(data.attributeNewValue), viewImg);\n } else {\n conversionApi.writer.removeAttribute(htmlAttr, viewImg);\n }\n };\n\n dispatcher.on(`attribute:${modelAttr}:imageBlock`, handleAttribute(true));\n dispatcher.on(`attribute:${modelAttr}:imageInline`, handleAttribute(false));\n }\n });\n\n // Upcast: HTML → model\n editor.conversion.for('upcast').add((dispatcher: any) => {\n dispatcher.on(\n 'element:figure',\n (_evt: any, data: any, conversionApi: any) => {\n if (!data.viewItem.hasClass('image')) return;\n const modelElement = data.modelRange?.start?.nodeAfter;\n if (!modelElement) return;\n const viewImg = this.#findImg(data.viewItem);\n if (!viewImg) return;\n this.#transferHtmlAttrsToModel(viewImg, modelElement, conversionApi);\n },\n { priority: 'low' }\n );\n\n dispatcher.on(\n 'element:img',\n (_evt: any, data: any, conversionApi: any) => {\n const modelElement = data.modelRange?.start?.nodeAfter;\n if (!modelElement) return;\n this.#transferHtmlAttrsToModel(data.viewItem, modelElement, conversionApi);\n },\n { priority: 'low' }\n );\n });\n }\n\n #listenForSrcChanges() {\n const editor = this.editor;\n\n editor.model.document.on('change', () => {\n const changes = editor.model.document.differ.getChanges();\n const updates: Array<{ element: any; meta: ImageMeta }> = [];\n\n for (const change of changes) {\n if (change.type !== 'attribute' || change.attributeKey !== 'src') continue;\n const newSrc = (change as any).attributeNewValue as string;\n const meta = this.#imageMetaMap.get(newSrc);\n if (!meta) continue;\n\n const node = (change as any).range?.start?.nodeAfter;\n if (node?.is('element')) {\n updates.push({ element: node, meta });\n this.#imageMetaMap.delete(newSrc);\n }\n }\n\n if (updates.length === 0) return;\n\n editor.model.enqueueChange('transparent' as any, (writer: any) => {\n for (const { element, meta } of updates) {\n if (meta.name || meta.fileName) {\n writer.setAttribute('alt', meta.name || this.#generateAlt(meta.fileName), element);\n }\n\n if (meta.lazyLoad) {\n writer.setAttribute('loading', 'lazy', element);\n }\n\n if (meta.idOrKey) {\n writer.setAttribute('imageId', meta.idOrKey, element);\n }\n }\n });\n });\n }\n\n #findImg(viewElement: any): any {\n if (!viewElement) return null;\n if (viewElement.is?.('element', 'img')) return viewElement;\n for (const child of viewElement.getChildren?.() ?? []) {\n if ((child as any).is?.('element', 'img')) return child;\n }\n return null;\n }\n\n #transferHtmlAttrsToModel(viewImg: any, modelElement: any, conversionApi: any) {\n const schema = this.editor.model.schema;\n if (viewImg.hasAttribute('loading') && schema.checkAttribute(modelElement, 'loading')) {\n conversionApi.writer.setAttribute('loading', viewImg.getAttribute('loading'), modelElement);\n }\n if (viewImg.hasAttribute('id') && schema.checkAttribute(modelElement, 'imageId')) {\n conversionApi.writer.setAttribute('imageId', viewImg.getAttribute('id'), modelElement);\n }\n }\n\n #generateAlt(fileName?: string): string {\n if (!fileName) return 'Image';\n const nameWithoutExt = fileName.replace(/\\.[^.]+$/, '');\n const result = nameWithoutExt\n .replace(/[_\\-\\.]+/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim();\n return result || 'Image';\n }\n}\n","import {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { AsyncValidatorFn, FormGroup, NgForm, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { CKEditorModule } from '@ckeditor/ckeditor5-angular';\nimport {\n Alignment,\n Bold,\n ClassicEditor,\n Essentials,\n FontColor,\n FontSize,\n Italic,\n List,\n Paragraph,\n Underline,\n Undo,\n Widget,\n} from 'ckeditor5';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { ISdEditorConfiguration, SD_EDITOR_CONFIGURATION, SdEditorUploadFileFuncUpload } from './configurations';\nimport { SdNotifyService } from '@sdcorejs/angular/services';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { sdIsEmpty } from '@sdcorejs/angular/utilities/data-state';\nimport { EditorImageUploadPlugin } from './plugins/image-upload/image-upload.plugin';\nimport { EditorOption, SdEditorOption } from './models';\nimport { HandleSdCustomValidator, SdCustomValidator, SdFormControl } from '@sdcorejs/angular/forms/models';\nimport { SdCKEditorStyles } from '@sdcorejs/angular/components/ckeditor-styles';\nimport { SdLabel } from '@sdcorejs/angular/forms/label';\nimport {\n applyReplacementsToEditor,\n countTextLength,\n filterActivePendingFiles,\n getActiveBlobUrls,\n getBatchConfig,\n imageClassesToInlineStyles,\n imageInlineStylesToClasses,\n runBatchUploads,\n} from './plugins/image-upload/utils';\n\n@Component({\n selector: 'sd-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CKEditorModule, SdLabel, SdCKEditorStyles, MatFormFieldModule, MatIconModule, MatTooltipModule],\n templateUrl: './editor.component.html',\n styleUrls: ['./editor.component.scss', './plugins/image-upload/image-upload.plugin.scss'],\n})\nexport class SdEditor {\n // Injected\n readonly #destroyRef = inject(DestroyRef);\n readonly #cdRef = inject(ChangeDetectorRef);\n readonly #uploadConfig = inject<ISdEditorConfiguration | ISdEditorConfiguration[]>(SD_EDITOR_CONFIGURATION, { optional: true });\n readonly #notifyService = inject(SdNotifyService);\n readonly #i18n = inject(I18nService);\n\n // Input\n readonly option = input<SdEditorOption>({});\n readonly height = input<string>('250px'); // Chiều dài height hiển thị mặc định\n readonly maxHeight = input<string>('250px'); // Chiều dài tối đa mở rộng nếu nội dung vượt quá height mặc định\n readonly maxlength = input<number | undefined>(undefined);\n readonly label = input<string | undefined>();\n readonly helperText = input<string | undefined>();\n readonly required = input(false, { transform: booleanAttribute });\n readonly disabled = input(false, { transform: booleanAttribute });\n readonly readonly = input(false, { transform: booleanAttribute });\n readonly hideInlineError = input(false, { transform: booleanAttribute });\n readonly inlineError = input<string | undefined>();\n readonly placeholder = input<string | undefined>();\n readonly validator = input<SdCustomValidator | undefined>();\n readonly form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n if (val instanceof NgForm) return val.form;\n if (val instanceof FormGroup) return val;\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n readonly key = input<string | undefined>(undefined);\n readonly autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n readonly autoId = computed(() => (this.autoIdInput() ? `components-editor-${this.autoIdInput()}` : undefined));\n readonly dataDisabled = computed(() => (this.disabled() ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.valueModel()) ? 'true' : 'false'));\n readonly name = input<string>(Utilities.generateUuid());\n readonly valueModel = model<string>('', { alias: 'model' });\n\n // Output\n readonly sdChange = output<string>();\n readonly sdBlur = output<FocusEvent>();\n readonly sdFocus = output<FocusEvent>();\n\n // State\n readonly _textLength = signal(0);\n readonly formControl = new SdFormControl();\n readonly isOverLimit = computed(() => {\n const max = this.maxlength();\n return max !== undefined && this._textLength() > max;\n });\n\n get errorMessage(): string | undefined {\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n if (errors['required']) return this.#i18n.t('core.component.editor.required');\n if (errors['maxlength']) return this.#i18n.t('core.component.editor.maxlength', { max: this.maxlength() ?? 0 });\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n }\n\n readonly Editor = ClassicEditor;\n #editor: ClassicEditor | undefined;\n readonly #contentChangeSubject = new Subject<string>();\n\n readonly editorConfig = computed<EditorOption>(() => {\n const opt = this.option();\n const uploadFn = this.#buildUploadFn();\n const enableImageUpload = !!uploadFn;\n\n const plugins: any[] = [Essentials, FontColor, FontSize, Paragraph, Bold, Italic, Underline, List, Undo, Widget, Alignment];\n if (enableImageUpload) plugins.push(EditorImageUploadPlugin);\n\n const toolbarItems = [\n 'bold',\n 'italic',\n 'underline',\n '|',\n 'fontSize',\n 'fontColor',\n '|',\n 'alignment:left',\n 'alignment:center',\n 'alignment:right',\n 'alignment:justify',\n '|',\n 'bulletedList',\n 'numberedList',\n ];\n if (enableImageUpload) toolbarItems.push('|', 'uploadImage');\n\n const config: EditorOption = {\n licenseKey: 'GPL',\n getOption: () => ({\n ...opt,\n uploadFn,\n onWarning: (msg: string) => this.#notifyService.warning(msg),\n // Truyền i18n service xuống CKEditor plugin (ngoài DI tree) để dịch warning messages\n _i18n: this.#i18n,\n }),\n plugins,\n toolbar: { items: toolbarItems, shouldNotGroupWhenFull: true },\n placeholder: this.placeholder(),\n fontColor: { columns: 5, documentColors: 10, colorPicker: { format: 'hex' } },\n fontSize: { options: [10, 11, 12, 14, 16, 18, 20], supportAllValues: true },\n };\n\n if (enableImageUpload) {\n config.image = {\n resizeUnit: '%',\n resizeOptions: [\n { name: 'resizeImage:100', value: '100', label: '100%' },\n { name: 'resizeImage:75', value: '75', label: '75%' },\n { name: 'resizeImage:50', value: '50', label: '50%' },\n { name: 'resizeImage:25', value: '25', label: '25%' },\n { name: 'resizeImage:original', value: null, label: 'Original' },\n ],\n toolbar: ['resizeImage', '|', 'imageStyle:alignBlockLeft', 'imageStyle:alignCenter', 'imageStyle:alignBlockRight'],\n };\n }\n\n return config;\n });\n\n constructor() {\n this.#validateDuplicateConfigKeys();\n this.#setupEffects();\n this.#setupSubscriptions();\n this.#setupDestroy();\n }\n\n onReady = (editor: ClassicEditor) => {\n this.#editor = editor;\n\n const currentValue = this.valueModel();\n if (currentValue) {\n this.#setToEditor(currentValue);\n }\n if (this.formControl.disabled) {\n editor.enableReadOnlyMode('sd-editor');\n }\n if (this.readonly()) {\n editor.enableReadOnlyMode('sd-editor-readonly');\n }\n\n editor.model.document.registerPostFixer(writer => {\n let changed = false;\n for (const change of editor.model.document.differ.getChanges()) {\n if (change.type === 'insert' && (change.name === 'imageBlock' || change.name === 'imageInline')) {\n const element = (change as any).position.nodeAfter;\n if (element && !element.hasAttribute('resizedWidth')) {\n writer.setAttribute('resizedWidth', '100%', element);\n changed = true;\n }\n }\n }\n return changed;\n });\n\n editor.model.document.on('change:data', () => this.#contentChangeSubject.next(editor.getData()));\n editor.editing.view.document.on('focus', evt => this.sdFocus.emit((evt as any).domEvent as FocusEvent));\n editor.editing.view.document.on('blur', evt => {\n this.sdBlur.emit((evt as any).domEvent as FocusEvent);\n this.formControl.markAsTouched();\n this.#cdRef.markForCheck();\n });\n };\n\n focusEditor = () => this.#editor?.editing?.view?.focus?.();\n\n /**\n * Xử lý tải lên các file và trả về nội dung dữ liệu cuối cùng.\n * * @description\n * - Đối với các file upload chế độ 'deferred' (chỉ xử lý khi submit), cần @ViewChild component và gọi hàm upload() này.\n * - Hỗ trợ two-way binding.\n * - Hàm hỗ trợ trả ra data cuối cùng.\n * * @returns {Promise<string>} Nội dung cuối cùng được trích xuất từ sd-editor.\n */\n upload = async (): Promise<string> => {\n await this.#uploadImages();\n return this.#getFromEditor();\n };\n\n // Editor Content\n #setToEditor(html: string): void {\n this.#editor?.setData?.(this.#normalizeHtmlForEditor(html));\n }\n\n #getFromEditor(): string {\n return this.#editor ? this.#normalizeEditorToHtml(this.#editor.getData()) : '';\n }\n\n // Normalize HTML từ bên ngoài -> format CKEditor.\n #normalizeHtmlForEditor = (html: string): string => {\n if (!html) {\n return '';\n }\n\n let result = html;\n result = imageInlineStylesToClasses(result);\n return result;\n };\n\n // Normalize HTML từ CKEditor → format HTML.\n #normalizeEditorToHtml = (html: string): string => {\n if (!html) {\n return '';\n }\n\n let result = html;\n result = imageClassesToInlineStyles(result);\n return result;\n };\n\n // Xử lý binding 2 chiều\n #onModelSignalChange(html: string): void {\n const v = html ?? '';\n if (this.formControl.value === v) {\n return;\n }\n this.formControl.setValue(v, { emitEvent: false });\n this._textLength.set(countTextLength(v));\n if (this.#editor) {\n this.#setToEditor(v);\n }\n }\n\n // Xử lý khi user soạn thảo\n #onEditorUserInput(rawHtml: string): void {\n const out = imageClassesToInlineStyles(rawHtml);\n this._textLength.set(countTextLength(out));\n if (this.formControl.value !== out) {\n this.formControl.setValue(out, { emitEvent: false });\n }\n this.formControl.updateValueAndValidity({ emitEvent: false });\n this.formControl.sdChanges.next(true);\n this.valueModel.set(out);\n this.sdChange.emit(out);\n }\n\n // Xử lý nếu dev sử dụng form và set trực tiếp data\n #onFormGroupExternalChange(html: string): void {\n const v = html ?? '';\n this.valueModel.set(v);\n this._textLength.set(countTextLength(v));\n if (this.#editor) {\n this.#setToEditor(v);\n }\n }\n\n // Validators\n #requiredValidator(): ValidatorFn {\n return (): ValidationErrors | null => (this._textLength() ? null : { required: true });\n }\n\n #maxLengthValidator(): ValidatorFn {\n return (): ValidationErrors | null => {\n const max = this.maxlength()!;\n const len = this._textLength();\n return len > max ? { maxlength: { requiredLength: max, actualLength: len } } : null;\n };\n }\n\n #inlineErrorValidator(): ValidatorFn {\n return (): ValidationErrors | null => ({ inlineError: true });\n }\n\n #updateValidators(): void {\n const validators: ValidatorFn[] = [];\n const asyncValidators: AsyncValidatorFn[] = [];\n\n if (this.required()) {\n validators.push(this.#requiredValidator());\n }\n if (this.maxlength() !== undefined) {\n validators.push(this.#maxLengthValidator());\n }\n if (this.inlineError()) {\n validators.push(this.#inlineErrorValidator());\n }\n\n const val = this.validator();\n if (val) {\n asyncValidators.push(HandleSdCustomValidator(val));\n }\n\n this.formControl.setValidators(validators.length ? validators : null);\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\n this.formControl.updateValueAndValidity({ emitEvent: false });\n }\n\n // Setup\n #setupEffects(): void {\n // Lắng nghe disabled\n effect(() => {\n this.disabled() ? this.formControl.disable({ emitEvent: false }) : this.formControl.enable({ emitEvent: false });\n });\n\n // Lắng nghe readonly\n effect(() => {\n if (!this.#editor) {\n return;\n }\n if (this.readonly()) {\n this.#editor.enableReadOnlyMode('sd-editor-readonly');\n } else {\n this.#editor.disableReadOnlyMode('sd-editor-readonly');\n }\n });\n\n // Lắng nghe binđing 2 chiều model\n effect(() => this.#onModelSignalChange(this.valueModel()));\n\n // Lắng nghe name form\n effect(() => this.form()?.addControl(this.name(), this.formControl));\n\n // Lắng nghe validators\n effect(() => {\n this.required();\n this.maxlength();\n this.inlineError();\n this.validator();\n this.#updateValidators();\n });\n }\n\n #setupSubscriptions(): void {\n // Đăng ký nếu dev sử dụng form để set data trực tiếp từ bên ngoài vào\n this.formControl.valueChanges\n .pipe(takeUntilDestroyed(this.#destroyRef))\n .subscribe((val: string) => this.#onFormGroupExternalChange(val));\n\n this.formControl.sdChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => this.#cdRef.markForCheck());\n\n // Đăng ký user gõ trong editor\n this.#contentChangeSubject\n .pipe(debounceTime(100), takeUntilDestroyed(this.#destroyRef))\n .subscribe(rawHtml => this.#onEditorUserInput(rawHtml));\n }\n\n #setupDestroy(): void {\n this.#destroyRef.onDestroy(() => {\n this.form()?.removeControl(this.name());\n this.#editor?.destroy?.();\n });\n }\n\n // Helpers\n #uploadImages = async (): Promise<void> => {\n const uploadMode = this.option()?.imageConfig?.uploadMode ?? 'deferred';\n // Early return nếu không phải 'deferred' mode.\n // Nếu trước đó là mode \"deferred\" mà mong muốn chuyển sang mode \"immediate\", dev chưa cần refactor code phía caller mà không ảnh hưởng đến logic.\n if (uploadMode !== 'deferred') return;\n\n const uploadFn = this.#buildUploadFn();\n if (!uploadFn) {\n throw new Error('No upload function configured for image upload');\n }\n\n const plugin = this.#editor?.plugins?.get(EditorImageUploadPlugin) as EditorImageUploadPlugin | undefined;\n if (!plugin || plugin.pendingFiles.size === 0) return;\n\n const { batchSize, maxConcurrent } = getBatchConfig(this.option());\n const activeBlobUrls = this.#editor ? getActiveBlobUrls(this.#editor) : new Set<string>();\n const toUpload = filterActivePendingFiles(plugin.pendingFiles, activeBlobUrls);\n\n // Capture trước await để tránh race condition: ảnh được chèn trong lúc chờ API\n const processedBlobUrls = new Set(toUpload.map(([blobUrl]) => blobUrl));\n const { replacements, failedBatches } = await runBatchUploads(toUpload, uploadFn, batchSize, maxConcurrent);\n\n if (this.#editor) {\n const lazyLoad = this.option()?.imageConfig?.lazyLoad ?? true;\n for (const detail of replacements.values()) {\n plugin.setMeta(detail.cdn, { name: detail.name, idOrKey: detail.idOrKey, lazyLoad });\n }\n applyReplacementsToEditor(this.#editor, replacements);\n }\n\n // Chỉ xóa đúng các entries đã được xử lý\n for (const blobUrl of processedBlobUrls) {\n plugin.pendingFiles.delete(blobUrl);\n }\n\n for (const [blobUrl, file] of failedBatches.flat()) {\n plugin.pendingFiles.set(blobUrl, file);\n }\n\n if (failedBatches.length > 0) {\n throw new Error(`Upload failed for ${failedBatches.flat().length} image(s)`);\n }\n };\n\n #getConfigurations = (): ISdEditorConfiguration[] => {\n const config = this.#uploadConfig;\n if (!config) {\n return [];\n }\n return Array.isArray(config) ? config : [config];\n };\n\n #validateDuplicateConfigKeys = (): void => {\n const config = this.#uploadConfig;\n if (!config) {\n return;\n }\n const configurations = Array.isArray(config) ? config : [config];\n const seen = new Set<string>();\n for (const cfg of configurations) {\n const normalizedKey = cfg.key === undefined ? '__undefined__' : cfg.key;\n if (seen.has(normalizedKey)) {\n const label = cfg.key === undefined ? 'undefined' : cfg.key;\n throw new Error(`[sd-editor] Duplicate upload configuration key detected: ${label}`);\n }\n seen.add(normalizedKey);\n }\n };\n\n #getSelectedConfig = (): ISdEditorConfiguration | undefined => {\n const configurations = this.#getConfigurations();\n if (!configurations.length) {\n return undefined;\n }\n\n return configurations.find(cfg => cfg.key === this.key());\n };\n\n #buildUploadFn = (): SdEditorUploadFileFuncUpload | undefined => {\n return this.option()?.imageConfig?.uploadFn ?? this.#getSelectedConfig()?.upload;\n };\n}\n","<sd-ckeditor-styles />\n@let _label = label();\n@let _helperText = helperText();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage;\n@let _required = required();\n@let _maxLength = maxlength();\n@let _showCounter = !!_maxLength && !formControl.disabled && !_hideInlineError;\n\n@if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\" [helperText]=\"_helperText\"></sd-label>\n}\n\n<div\n class=\"sd-editor\"\n [class.sd-editor--readonly]=\"readonly()\"\n [class.sd-editor--error]=\"formControl.invalid && formControl.touched\"\n [class.has-counter]=\"_showCounter\"\n [style.--sd-editor-content-min-height]=\"height()\"\n [style.--sd-editor-content-max-height]=\"maxHeight()\"\n [attr.data-autoId]=\"autoId()\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-empty]=\"dataEmpty()\">\n <ckeditor [editor]=\"Editor\" [config]=\"editorConfig()\" [disabled]=\"formControl.disabled\" (ready)=\"onReady($event)\"></ckeditor>\n\n @if (_showCounter) {\n <div class=\"sd-editor-counter-row\">\n <span class=\"sd-editor-counter\" [class.sd-editor-counter--over]=\"isOverLimit()\"> {{ _textLength() }}/{{ _maxLength }} </span>\n </div>\n }\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\">error</mat-icon>\n }\n</div>\n\n<div class=\"sd-editor-footer\">\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}