@libs-ui/components-inputs-quill 0.1.1-1

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.
@@ -0,0 +1,150 @@
1
+ import { ChangeDetectionStrategy, Component, input, output, viewChild, DestroyRef, inject } from '@angular/core';
2
+ import { TranslateModule } from '@ngx-translate/core';
3
+ import Quill2x from 'quill2x';
4
+ import { fromEvent } from 'rxjs';
5
+ import { createContextMenuOptionTable, createTableSelector } from './utils/quill2x.define';
6
+ import { UtilsKeyCodeConstant } from '@libs-ui/utils';
7
+ import { get } from '@libs-ui/utils';
8
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
9
+ import * as i0 from "@angular/core";
10
+ export class LibsUiComponentsInputsQuill2xComponent {
11
+ quill;
12
+ blotsRegister = input();
13
+ outContextMenu = output();
14
+ outFunctionsControl = output();
15
+ htmlContainer = viewChild.required('htmlContainer');
16
+ quillBodyContainer = viewChild.required('snowContainer');
17
+ destroyRef = inject(DestroyRef);
18
+ ngOnInit() {
19
+ this.blotsRegister()?.forEach((item) => {
20
+ Quill2x.register(item.component, true);
21
+ });
22
+ const toolbarOptions = [
23
+ ['bold', 'italic', 'underline', 'strike'],
24
+ ['blockquote', 'code-block', 'code'],
25
+ ['link', 'image', 'video', 'formula'],
26
+ [{ list: 'ordered' }, { list: 'bullet' }, { list: 'check' }],
27
+ [{ script: 'sub' }, { script: 'super' }],
28
+ [{ indent: '-1' }, { indent: '+1' }],
29
+ [{ direction: 'rtl' }],
30
+ [{ size: ['small', false, 'large', 'huge'] }],
31
+ [{ header: [1, 2, 3, 4, 5, 6, false] }],
32
+ [{ color: [] }, { background: [] }],
33
+ [{ font: [] }],
34
+ [{ align: [] }],
35
+ ['table'],
36
+ ];
37
+ const options = {
38
+ theme: 'snow',
39
+ modules: {
40
+ toolbar: {
41
+ container: toolbarOptions,
42
+ handlers: {
43
+ table: () => {
44
+ const button = this.htmlContainer().nativeElement.querySelector?.('button.ql-table');
45
+ console.log('button', button, this.htmlContainer().nativeElement);
46
+ createTableSelector(this.quill, button);
47
+ },
48
+ },
49
+ },
50
+ table: true,
51
+ keyboard: {
52
+ bindings: {
53
+ backspace: {
54
+ key: UtilsKeyCodeConstant.BACKSPACE,
55
+ handler: (range) => this.noPreventEmbedDeletion(range),
56
+ },
57
+ delete: {
58
+ key: UtilsKeyCodeConstant.DELETE,
59
+ handler: (range) => this.noPreventEmbedDeletion(range),
60
+ },
61
+ },
62
+ },
63
+ },
64
+ };
65
+ this.quill = new Quill2x(this.quillBodyContainer().nativeElement, options);
66
+ fromEvent(this.quillBodyContainer()?.nativeElement, 'contextmenu')
67
+ .pipe(takeUntilDestroyed(this.destroyRef))
68
+ .subscribe((e) => this.outContextMenu.emit(e));
69
+ // Tự động tải nội dung đã lưu (nếu có)
70
+ try {
71
+ const saved = localStorage.getItem('quill2x_saved_html');
72
+ if (saved) {
73
+ this.quill.clipboard.dangerouslyPasteHTML(saved, 'silent');
74
+ }
75
+ }
76
+ catch {
77
+ /* no-op: bỏ qua nếu không thể tải từ localStorage */
78
+ }
79
+ // Gán handler lưu/tải/xóa nội dung
80
+ const saveBtn = document.getElementById('save-content');
81
+ saveBtn?.addEventListener('click', () => {
82
+ const html = (this.quill?.root).innerHTML;
83
+ try {
84
+ localStorage.setItem('quill2x_saved_html', html);
85
+ this.setStyleForContent();
86
+ // eslint-disable-next-line no-console
87
+ console.log('Đã lưu nội dung');
88
+ }
89
+ catch {
90
+ /* no-op: bỏ qua nếu lưu thất bại */
91
+ }
92
+ });
93
+ this.outFunctionsControl.emit(this.FunctionsControl);
94
+ this.setStyleForContent();
95
+ createContextMenuOptionTable(this.quill);
96
+ }
97
+ get FunctionsControl() {
98
+ return {
99
+ quill: () => this.quill,
100
+ };
101
+ }
102
+ noPreventEmbedDeletion(range) {
103
+ if (!this.quill)
104
+ return false;
105
+ const delta = this.quill?.getContents(range.index, 1);
106
+ if (delta?.ops.some((option) => this.blotsRegister()?.find((item) => get(option.insert, item.component['blotName']) && item.ignoreDelete))) {
107
+ return false; // Ngăn không cho Quill xử lý xóa
108
+ }
109
+ return true;
110
+ }
111
+ setStyleForContent() {
112
+ const styleArray = [
113
+ { selector: '.ql-font-Arial', style: 'font-family: Arial' },
114
+ { selector: '.ql-font-sans-serif', style: 'font-family: sans-serif' },
115
+ { selector: '.ql-font-serif', style: 'font-family: serif' },
116
+ { selector: '.ql-font-monospace', style: 'font-family: monospace' },
117
+ { selector: '.ql-font-Helvetica', style: 'font-family: Helvetica' },
118
+ { selector: '.libs-ui-quill-format-image', style: 'max-width: 100%; height: auto', overrideStyle: true },
119
+ { selector: '.libs-ui-quill-mention', style: 'font-weight: 600;-moz-osx-font-smoothing: grayscale;-webkit-font-smoothing: antialiased; color: #7239EA', overrideStyle: true },
120
+ { selector: 'blockquote', style: 'border-left: 4px solid #ccc; margin-bottom: 5px; margin-top: 5px; padding-left: 16px', overrideStyle: true },
121
+ ];
122
+ this.blotsRegister()?.forEach((item) => {
123
+ styleArray.push({ selector: `.${item.className}`, style: item.style, overrideStyle: true });
124
+ });
125
+ styleArray.forEach((item) => {
126
+ const elements = this.quill?.root.querySelectorAll(item.selector);
127
+ elements?.forEach((element) => {
128
+ if (item.overrideStyle) {
129
+ element.setAttribute('style', item.style);
130
+ return;
131
+ }
132
+ // Fixbug issue: https://admin-cv.mobio.vn/issues/49092
133
+ let styleExist = element.getAttribute('style');
134
+ if (styleExist) {
135
+ ['font-family: Arial', 'font-family: sans-serif', 'font-family: serif', 'font-family: monospace', 'font-family: Helvetica'].forEach((font) => {
136
+ styleExist = (styleExist?.includes(`${font};`) ? styleExist?.replace(`${font};`, '') : styleExist?.replace(font, ''));
137
+ });
138
+ }
139
+ element.setAttribute('style', styleExist ? `${styleExist}${styleExist[styleExist.length - 1] === ';' ? '' : ';'}${item.style};` : item.style);
140
+ });
141
+ });
142
+ }
143
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsQuill2xComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
144
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "18.2.14", type: LibsUiComponentsInputsQuill2xComponent, isStandalone: true, selector: "libs_ui-components-inputs-quill2x", inputs: { blotsRegister: { classPropertyName: "blotsRegister", publicName: "blotsRegister", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { outContextMenu: "outContextMenu", outFunctionsControl: "outFunctionsControl" }, viewQueries: [{ propertyName: "htmlContainer", first: true, predicate: ["htmlContainer"], descendants: true, isSignal: true }, { propertyName: "quillBodyContainer", first: true, predicate: ["snowContainer"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n #htmlContainer\n class=\"container\">\n <div class=\"panel\">\n <div #snowContainer></div>\n <div class=\"action-buttons\">\n <button\n id=\"save-content\"\n class=\"action-btn save-btn\">\n \uD83D\uDCBE L\u01B0u n\u1ED9i dung\n </button>\n </div>\n </div>\n</div>\n", styles: ["body{padding:25px}.container{display:flex;flex-direction:column}.action-buttons{display:flex;gap:10px;margin-top:15px;padding:10px;background-color:#f8f9fa;border-radius:4px;border:1px solid #e9ecef}.action-btn{padding:8px 16px;border:none;border-radius:4px;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease;display:flex;align-items:center;gap:5px}.action-btn:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.action-btn:active{transform:translateY(0)}.action-btn.save-btn{background-color:#28a745;color:#fff}.action-btn.save-btn:hover{background-color:#218838}.action-btn.clear-btn{background-color:#dc3545;color:#fff}.action-btn.clear-btn:hover{background-color:#c82333}.action-btn.load-btn{background-color:#007bff;color:#fff}.action-btn.load-btn:hover{background-color:#0056b3}.panel{margin:10px 0}.ql-container{font-size:14px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;border:1px solid #ccc;border-radius:4px}.ql-toolbar{border:1px solid #ccc;border-bottom:none;border-radius:4px 4px 0 0;padding:8px;background-color:#f8f9fa}.ql-toolbar .ql-formats{margin-right:15px}.ql-toolbar .ql-formats:last-child{margin-right:0}.ql-toolbar button{border:none;background:none;cursor:pointer;padding:5px;margin:0 1px;border-radius:3px;color:#444}.ql-toolbar button:hover{background-color:#e9ecef;color:#000}.ql-toolbar button.ql-active{background-color:#007bff;color:#fff}.ql-toolbar .ql-picker{color:#444}.ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up{width:28px}.ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up .ql-picker-label{padding:2px 4px}.ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up .ql-picker-label svg{position:static;margin-top:0;width:18px;height:18px}.ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up .ql-picker-options .ql-picker-item:hover{background-color:#f0f0f0}.ql-toolbar .ql-table-up svg{width:18px;height:18px}.ql-toolbar .custom-table-icon{display:inline-block;width:18px;height:18px;vertical-align:middle;color:currentColor}.ql-editor{border:1px solid #ccc;border-top:none;border-radius:0 0 4px 4px;padding:12px;min-height:300px;line-height:1.42}.ql-editor:focus{outline:none;box-shadow:0 0 0 2px #007bff40}.ql-editor p{margin-bottom:10px}.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin-top:10px;margin-bottom:10px;font-weight:700}.ql-editor blockquote{border-left:4px solid #ccc;margin:16px 0;padding-left:16px;color:#666}.ql-editor ul,.ql-editor ol{padding-left:1.5em}.ql-editor .ql-table,.ql-editor table{border-collapse:separate!important;border-spacing:0!important;table-layout:fixed!important;width:100%!important;margin:10px 0!important}.ql-editor .ql-table colgroup col,.ql-editor table colgroup col{border:none!important}.ql-editor .ql-table td,.ql-editor .ql-table th,.ql-editor table td,.ql-editor table th{border:1px solid #ccc!important;padding:8px!important;position:relative!important;vertical-align:top!important;min-width:50px!important;min-height:30px!important;word-wrap:break-word!important;box-sizing:border-box!important}.ql-editor .ql-table td:focus,.ql-editor .ql-table th:focus,.ql-editor table td:focus,.ql-editor table th:focus{outline:2px solid #007bff!important;outline-offset:-2px!important}.ql-editor .ql-table th,.ql-editor table th{background-color:#f5f5f5!important;font-weight:700!important;text-align:center!important}.ql-editor .ql-table tr:hover td,.ql-editor .ql-table tr:hover th,.ql-editor table tr:hover td,.ql-editor table tr:hover th{background-color:#007bff0d!important}.ql-editor .table-up-wrapper{position:relative!important;margin:10px 0!important}.ql-editor .table-up-wrapper .ql-table,.ql-editor .table-up-wrapper table{border-collapse:separate!important;border-spacing:0!important;table-layout:fixed!important;width:100%!important;margin:0!important}.ql-editor .table-up-cell{position:relative!important}.ql-editor .table-up-cell .table-up-cell-inner{min-height:1em!important;outline:none!important;width:100%!important;height:100%!important}.ql-editor .table-up-cell .table-up-cell-inner:focus{outline:none!important}.ql-editor .table-up-selected{background-color:#007bff1a!important}.ql-editor .table-up-selected:after{content:\"\"!important;position:absolute!important;inset:0!important;background-color:#007bff1a!important;pointer-events:none!important}.ql-editor .table-up-resize-line{position:absolute!important;background-color:#007bff!important;z-index:100!important}.ql-editor .table-up-resize-line.table-up-resize-line-row{height:2px!important;cursor:row-resize!important;left:0!important;right:0!important}.ql-editor .table-up-resize-line.table-up-resize-line-col{width:2px!important;cursor:col-resize!important;top:0!important;bottom:0!important}.ql-editor .table-up-resize-scale{position:absolute!important;width:8px!important;height:8px!important;background-color:#007bff!important;border:1px solid #fff!important;z-index:101!important;cursor:nw-resize!important}.ql-editor .table-up-resize-scale.table-up-resize-scale-tr{top:-4px!important;right:-4px!important;cursor:ne-resize!important}.ql-editor .table-up-resize-scale.table-up-resize-scale-br{bottom:-4px!important;right:-4px!important;cursor:se-resize!important}.ql-editor .table-up-resize-scale.table-up-resize-scale-bl{bottom:-4px!important;left:-4px!important;cursor:sw-resize!important}.ql-editor .table-up-resize-scale.table-up-resize-scale-tl{top:-4px!important;left:-4px!important;cursor:nw-resize!important}.ql-editor .ql-editor table td.table-up-cell-selected,.ql-editor .ql-editor table th.table-up-cell-selected,.ql-editor .ql-editor .table-up-cell-selected,.ql-editor table td.table-up-cell-selected,.ql-editor table th.table-up-cell-selected,.ql-editor td.table-up-cell-selected,.ql-editor th.table-up-cell-selected{background-color:#007bff66!important;border:3px solid #007bff!important;box-shadow:0 0 0 1px #007bff99!important;position:relative!important}.ql-editor .table-up-merged-cell{background-color:#007bff0d!important;border:2px solid #007bff!important;position:relative!important}.ql-editor .table-up-merged-cell:after{content:\"\"!important;position:absolute!important;top:2px!important;right:2px!important;width:0!important;height:0!important;border-left:8px solid transparent!important;border-right:8px solid transparent!important;border-top:8px solid #007bff!important}.ql-editor .ql-editor table td,.ql-editor .ql-editor table th{transition:all .2s ease!important}.ql-editor .ql-editor table td:hover,.ql-editor .ql-editor table th:hover{background-color:#007bff1a!important;cursor:pointer!important}.ql-editor .table-selection-guide{position:fixed!important;top:10px!important;right:10px!important;background:#007bffe6!important;color:#fff!important;padding:8px 12px!important;border-radius:4px!important;font-size:12px!important;font-weight:700!important;z-index:1000!important;pointer-events:none!important}.ql-editor .table-selection-guide.hidden{display:none!important}.ql-editor .table-up-resize-indicator{position:absolute!important;background-color:#007bff4d!important;pointer-events:none!important;z-index:99!important}.ql-editor .table-up-resize-indicator.table-up-resize-indicator-col{width:2px!important;top:0!important;bottom:0!important}.ql-editor .table-up-resize-indicator.table-up-resize-indicator-row{height:2px!important;left:0!important;right:0!important}.ql-editor .table-up-cell:after{content:\"\"!important;position:absolute!important;right:-1px!important;top:0!important;bottom:0!important;width:4px!important;cursor:col-resize!important;background:transparent!important;z-index:10!important}.ql-editor .table-up-cell:hover:after{background:#007bff4d!important}.ql-editor .manual-resize-handle{position:absolute!important;right:-2px!important;top:0!important;bottom:0!important;width:4px!important;cursor:col-resize!important;background:transparent!important;z-index:15!important;transition:background-color .2s ease!important}.ql-editor .manual-resize-handle:hover{background:#007bff4d!important}.ql-editor .manual-resize-handle:active{background:#007bff80!important}.ql-editor .ql-editor .ql-table td,.ql-editor .ql-editor .ql-table th,.ql-editor .ql-editor table td,.ql-editor .ql-editor table th{position:relative!important}.ql-editor .table-up-menu{position:absolute!important;background:#fff!important;border:1px solid #ccc!important;border-radius:4px!important;box-shadow:0 2px 8px #00000026!important;z-index:1000!important;padding:4px!important}.ql-editor .table-up-menu .table-up-menu-item{padding:8px 12px!important;cursor:pointer!important;border-radius:3px!important;font-size:13px!important}.ql-editor .table-up-menu .table-up-menu-item:hover{background-color:#f5f5f5!important}.ql-editor .table-up-menu .table-up-menu-item.table-up-menu-item-break{height:1px!important;background-color:#e9ecef!important;margin:4px 0!important;padding:0!important}button{background-color:#007bff;color:#fff;border:none;padding:8px 12px;margin:4px;border-radius:4px;cursor:pointer;font-size:14px}button:hover{background-color:#0056b3}button:active{background-color:#004085}button:disabled{background-color:#6c757d;cursor:not-allowed}.table-up-creator,.ql-table-up-creator,[class*=table-creator],[class*=creator]{position:absolute!important;background:#fff!important;border:1px solid #ccc!important;border-radius:4px!important;box-shadow:0 2px 8px #00000026!important;z-index:9999!important;padding:12px!important;display:block!important;visibility:visible!important;opacity:1!important}.table-up-creator .table-up-creator-grid,.ql-table-up-creator .table-up-creator-grid,[class*=table-creator] .table-up-creator-grid,[class*=creator] .table-up-creator-grid{display:grid!important;gap:2px!important;margin-bottom:10px!important}.table-up-creator .table-up-creator-grid .table-up-creator-cell,.ql-table-up-creator .table-up-creator-grid .table-up-creator-cell,[class*=table-creator] .table-up-creator-grid .table-up-creator-cell,[class*=creator] .table-up-creator-grid .table-up-creator-cell{width:16px!important;height:16px!important;border:1px solid #ddd!important;cursor:pointer!important}.table-up-creator .table-up-creator-grid .table-up-creator-cell:hover,.table-up-creator .table-up-creator-grid .table-up-creator-cell.active,.ql-table-up-creator .table-up-creator-grid .table-up-creator-cell:hover,.ql-table-up-creator .table-up-creator-grid .table-up-creator-cell.active,[class*=table-creator] .table-up-creator-grid .table-up-creator-cell:hover,[class*=table-creator] .table-up-creator-grid .table-up-creator-cell.active,[class*=creator] .table-up-creator-grid .table-up-creator-cell:hover,[class*=creator] .table-up-creator-grid .table-up-creator-cell.active{background-color:#007bff!important;border-color:#007bff!important}.table-up-creator .table-up-creator-info,.ql-table-up-creator .table-up-creator-info,[class*=table-creator] .table-up-creator-info,[class*=creator] .table-up-creator-info{text-align:center!important;font-size:12px!important;color:#666!important;margin-bottom:10px!important}.table-up-creator .table-up-creator-buttons,.ql-table-up-creator .table-up-creator-buttons,[class*=table-creator] .table-up-creator-buttons,[class*=creator] .table-up-creator-buttons{display:flex!important;gap:8px!important}.table-up-creator .table-up-creator-buttons button,.ql-table-up-creator .table-up-creator-buttons button,[class*=table-creator] .table-up-creator-buttons button,[class*=creator] .table-up-creator-buttons button{flex:1!important;padding:6px 12px!important;font-size:12px!important}[class*=creator]{position:absolute!important;background:#fff!important;border:1px solid #ccc!important;z-index:9999!important;padding:10px!important;min-width:200px!important;min-height:100px!important}.ql-picker-options{z-index:9999!important}[class*=creator],[class*=table-creator]{outline:2px solid red!important;background:#ff0!important}.manual-table-creator{position:absolute!important;background:#fff!important;border:1px solid #ccc!important;border-radius:4px!important;box-shadow:0 2px 8px #00000026!important;z-index:10000!important;padding:12px!important;display:block!important;visibility:visible!important;opacity:1!important;min-width:200px!important}.manual-table-creator div:first-child{text-align:center!important;font-size:12px!important;color:#333!important;margin-bottom:10px!important;font-weight:700!important;background:#f8f9fa!important;padding:4px 8px!important;border-radius:3px!important}.manual-table-creator div:last-child{display:grid!important;grid-template-columns:repeat(8,20px)!important;gap:2px!important;-webkit-user-select:none!important;user-select:none!important}.manual-table-creator div:last-child div{width:18px!important;height:18px!important;border:1px solid #ddd!important;cursor:pointer!important;background:#fff!important;transition:all .1s ease!important}.manual-table-creator div:last-child div:hover{background-color:#007bff!important;border-color:#0056b3!important;transform:scale(1.05)!important}.manual-table-menu{position:absolute!important;background:#fff!important;border:1px solid #ccc!important;border-radius:4px!important;box-shadow:0 4px 12px #0003!important;z-index:10001!important;padding:4px!important;min-width:150px!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important}.manual-table-menu div{padding:6px 12px!important;cursor:pointer!important;border-radius:3px!important;font-size:13px!important;color:#333!important;transition:background-color .1s ease!important}.manual-table-menu div:hover{background-color:#f5f5f5!important}.manual-table-menu div:active{background-color:#e9ecef!important}.manual-table-menu div[style*=\"height: 1px\"]{height:1px!important;background:#eee!important;margin:4px 0!important;padding:0!important;cursor:default!important}.manual-table-menu div[style*=\"height: 1px\"]:hover{background:#eee!important}.manual-table-creator *,.manual-table-menu *{pointer-events:auto!important;-webkit-user-select:none!important;user-select:none!important}.status-message{position:fixed!important;top:20px!important;right:20px!important;padding:12px 20px!important;border-radius:4px!important;box-shadow:0 2px 8px #0003!important;z-index:10001!important;font-size:14px!important;font-weight:500!important;color:#fff!important}@keyframes slideIn{0%{transform:translate(100%);opacity:0}to{transform:translate(0);opacity:1}}@keyframes slideOut{0%{transform:translate(0);opacity:1}to{transform:translate(100%);opacity:0}}.table-up-color-picker .table-up-color-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:2px;margin:8px 0}.table-up-color-picker .table-up-color-grid .table-up-color-item{width:20px;height:20px;cursor:pointer;border:1px solid #ddd;border-radius:2px}.table-up-color-picker .table-up-color-grid .table-up-color-item:hover{transform:scale(1.1);border-color:#007bff}@keyframes selection-glow{0%{opacity:.3}to{opacity:.7}}.ql-editor table td,.ql-editor table th{transition:all .2s ease!important;cursor:pointer!important}.ql-editor table td:hover,.ql-editor table th:hover{background-color:#007bff1a!important;transform:scale(1.02)!important;box-shadow:0 2px 4px #007bff33!important}.selection-area-indicator{position:absolute!important;border:2px dashed #007bff!important;background-color:#007bff1a!important;pointer-events:none!important;z-index:1000!important;border-radius:4px!important}.manual-table-creator{position:absolute;top:0;left:0;background:#fff;border:1px solid #ddd;border-radius:6px;box-shadow:0 6px 16px #0000001f;padding:12px;z-index:10000;min-width:200px}.manual-table-creator>div:first-child{font-size:12px;color:#333;margin-bottom:10px;text-align:center;font-weight:600}.manual-table-creator>div:last-child{display:grid;grid-template-columns:repeat(8,18px);gap:4px}.manual-table-creator>div:last-child>div{width:18px;height:18px;border:1px solid #e5e7eb;background:#fff;cursor:pointer;transition:background-color .12s ease}.manual-table-creator>div:last-child>div:hover{background-color:#dbeafe;border-color:#93c5fd}\n"], dependencies: [{ kind: "ngmodule", type: TranslateModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
145
+ }
146
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsQuill2xComponent, decorators: [{
147
+ type: Component,
148
+ args: [{ selector: 'libs_ui-components-inputs-quill2x', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [TranslateModule], template: "<div\n #htmlContainer\n class=\"container\">\n <div class=\"panel\">\n <div #snowContainer></div>\n <div class=\"action-buttons\">\n <button\n id=\"save-content\"\n class=\"action-btn save-btn\">\n \uD83D\uDCBE L\u01B0u n\u1ED9i dung\n </button>\n </div>\n </div>\n</div>\n", styles: ["body{padding:25px}.container{display:flex;flex-direction:column}.action-buttons{display:flex;gap:10px;margin-top:15px;padding:10px;background-color:#f8f9fa;border-radius:4px;border:1px solid #e9ecef}.action-btn{padding:8px 16px;border:none;border-radius:4px;cursor:pointer;font-size:14px;font-weight:500;transition:all .2s ease;display:flex;align-items:center;gap:5px}.action-btn:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.action-btn:active{transform:translateY(0)}.action-btn.save-btn{background-color:#28a745;color:#fff}.action-btn.save-btn:hover{background-color:#218838}.action-btn.clear-btn{background-color:#dc3545;color:#fff}.action-btn.clear-btn:hover{background-color:#c82333}.action-btn.load-btn{background-color:#007bff;color:#fff}.action-btn.load-btn:hover{background-color:#0056b3}.panel{margin:10px 0}.ql-container{font-size:14px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;border:1px solid #ccc;border-radius:4px}.ql-toolbar{border:1px solid #ccc;border-bottom:none;border-radius:4px 4px 0 0;padding:8px;background-color:#f8f9fa}.ql-toolbar .ql-formats{margin-right:15px}.ql-toolbar .ql-formats:last-child{margin-right:0}.ql-toolbar button{border:none;background:none;cursor:pointer;padding:5px;margin:0 1px;border-radius:3px;color:#444}.ql-toolbar button:hover{background-color:#e9ecef;color:#000}.ql-toolbar button.ql-active{background-color:#007bff;color:#fff}.ql-toolbar .ql-picker{color:#444}.ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up{width:28px}.ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up .ql-picker-label{padding:2px 4px}.ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up .ql-picker-label svg{position:static;margin-top:0;width:18px;height:18px}.ql-toolbar .ql-picker:not(.ql-color-picker):not(.ql-icon-picker).ql-table-up .ql-picker-options .ql-picker-item:hover{background-color:#f0f0f0}.ql-toolbar .ql-table-up svg{width:18px;height:18px}.ql-toolbar .custom-table-icon{display:inline-block;width:18px;height:18px;vertical-align:middle;color:currentColor}.ql-editor{border:1px solid #ccc;border-top:none;border-radius:0 0 4px 4px;padding:12px;min-height:300px;line-height:1.42}.ql-editor:focus{outline:none;box-shadow:0 0 0 2px #007bff40}.ql-editor p{margin-bottom:10px}.ql-editor h1,.ql-editor h2,.ql-editor h3,.ql-editor h4,.ql-editor h5,.ql-editor h6{margin-top:10px;margin-bottom:10px;font-weight:700}.ql-editor blockquote{border-left:4px solid #ccc;margin:16px 0;padding-left:16px;color:#666}.ql-editor ul,.ql-editor ol{padding-left:1.5em}.ql-editor .ql-table,.ql-editor table{border-collapse:separate!important;border-spacing:0!important;table-layout:fixed!important;width:100%!important;margin:10px 0!important}.ql-editor .ql-table colgroup col,.ql-editor table colgroup col{border:none!important}.ql-editor .ql-table td,.ql-editor .ql-table th,.ql-editor table td,.ql-editor table th{border:1px solid #ccc!important;padding:8px!important;position:relative!important;vertical-align:top!important;min-width:50px!important;min-height:30px!important;word-wrap:break-word!important;box-sizing:border-box!important}.ql-editor .ql-table td:focus,.ql-editor .ql-table th:focus,.ql-editor table td:focus,.ql-editor table th:focus{outline:2px solid #007bff!important;outline-offset:-2px!important}.ql-editor .ql-table th,.ql-editor table th{background-color:#f5f5f5!important;font-weight:700!important;text-align:center!important}.ql-editor .ql-table tr:hover td,.ql-editor .ql-table tr:hover th,.ql-editor table tr:hover td,.ql-editor table tr:hover th{background-color:#007bff0d!important}.ql-editor .table-up-wrapper{position:relative!important;margin:10px 0!important}.ql-editor .table-up-wrapper .ql-table,.ql-editor .table-up-wrapper table{border-collapse:separate!important;border-spacing:0!important;table-layout:fixed!important;width:100%!important;margin:0!important}.ql-editor .table-up-cell{position:relative!important}.ql-editor .table-up-cell .table-up-cell-inner{min-height:1em!important;outline:none!important;width:100%!important;height:100%!important}.ql-editor .table-up-cell .table-up-cell-inner:focus{outline:none!important}.ql-editor .table-up-selected{background-color:#007bff1a!important}.ql-editor .table-up-selected:after{content:\"\"!important;position:absolute!important;inset:0!important;background-color:#007bff1a!important;pointer-events:none!important}.ql-editor .table-up-resize-line{position:absolute!important;background-color:#007bff!important;z-index:100!important}.ql-editor .table-up-resize-line.table-up-resize-line-row{height:2px!important;cursor:row-resize!important;left:0!important;right:0!important}.ql-editor .table-up-resize-line.table-up-resize-line-col{width:2px!important;cursor:col-resize!important;top:0!important;bottom:0!important}.ql-editor .table-up-resize-scale{position:absolute!important;width:8px!important;height:8px!important;background-color:#007bff!important;border:1px solid #fff!important;z-index:101!important;cursor:nw-resize!important}.ql-editor .table-up-resize-scale.table-up-resize-scale-tr{top:-4px!important;right:-4px!important;cursor:ne-resize!important}.ql-editor .table-up-resize-scale.table-up-resize-scale-br{bottom:-4px!important;right:-4px!important;cursor:se-resize!important}.ql-editor .table-up-resize-scale.table-up-resize-scale-bl{bottom:-4px!important;left:-4px!important;cursor:sw-resize!important}.ql-editor .table-up-resize-scale.table-up-resize-scale-tl{top:-4px!important;left:-4px!important;cursor:nw-resize!important}.ql-editor .ql-editor table td.table-up-cell-selected,.ql-editor .ql-editor table th.table-up-cell-selected,.ql-editor .ql-editor .table-up-cell-selected,.ql-editor table td.table-up-cell-selected,.ql-editor table th.table-up-cell-selected,.ql-editor td.table-up-cell-selected,.ql-editor th.table-up-cell-selected{background-color:#007bff66!important;border:3px solid #007bff!important;box-shadow:0 0 0 1px #007bff99!important;position:relative!important}.ql-editor .table-up-merged-cell{background-color:#007bff0d!important;border:2px solid #007bff!important;position:relative!important}.ql-editor .table-up-merged-cell:after{content:\"\"!important;position:absolute!important;top:2px!important;right:2px!important;width:0!important;height:0!important;border-left:8px solid transparent!important;border-right:8px solid transparent!important;border-top:8px solid #007bff!important}.ql-editor .ql-editor table td,.ql-editor .ql-editor table th{transition:all .2s ease!important}.ql-editor .ql-editor table td:hover,.ql-editor .ql-editor table th:hover{background-color:#007bff1a!important;cursor:pointer!important}.ql-editor .table-selection-guide{position:fixed!important;top:10px!important;right:10px!important;background:#007bffe6!important;color:#fff!important;padding:8px 12px!important;border-radius:4px!important;font-size:12px!important;font-weight:700!important;z-index:1000!important;pointer-events:none!important}.ql-editor .table-selection-guide.hidden{display:none!important}.ql-editor .table-up-resize-indicator{position:absolute!important;background-color:#007bff4d!important;pointer-events:none!important;z-index:99!important}.ql-editor .table-up-resize-indicator.table-up-resize-indicator-col{width:2px!important;top:0!important;bottom:0!important}.ql-editor .table-up-resize-indicator.table-up-resize-indicator-row{height:2px!important;left:0!important;right:0!important}.ql-editor .table-up-cell:after{content:\"\"!important;position:absolute!important;right:-1px!important;top:0!important;bottom:0!important;width:4px!important;cursor:col-resize!important;background:transparent!important;z-index:10!important}.ql-editor .table-up-cell:hover:after{background:#007bff4d!important}.ql-editor .manual-resize-handle{position:absolute!important;right:-2px!important;top:0!important;bottom:0!important;width:4px!important;cursor:col-resize!important;background:transparent!important;z-index:15!important;transition:background-color .2s ease!important}.ql-editor .manual-resize-handle:hover{background:#007bff4d!important}.ql-editor .manual-resize-handle:active{background:#007bff80!important}.ql-editor .ql-editor .ql-table td,.ql-editor .ql-editor .ql-table th,.ql-editor .ql-editor table td,.ql-editor .ql-editor table th{position:relative!important}.ql-editor .table-up-menu{position:absolute!important;background:#fff!important;border:1px solid #ccc!important;border-radius:4px!important;box-shadow:0 2px 8px #00000026!important;z-index:1000!important;padding:4px!important}.ql-editor .table-up-menu .table-up-menu-item{padding:8px 12px!important;cursor:pointer!important;border-radius:3px!important;font-size:13px!important}.ql-editor .table-up-menu .table-up-menu-item:hover{background-color:#f5f5f5!important}.ql-editor .table-up-menu .table-up-menu-item.table-up-menu-item-break{height:1px!important;background-color:#e9ecef!important;margin:4px 0!important;padding:0!important}button{background-color:#007bff;color:#fff;border:none;padding:8px 12px;margin:4px;border-radius:4px;cursor:pointer;font-size:14px}button:hover{background-color:#0056b3}button:active{background-color:#004085}button:disabled{background-color:#6c757d;cursor:not-allowed}.table-up-creator,.ql-table-up-creator,[class*=table-creator],[class*=creator]{position:absolute!important;background:#fff!important;border:1px solid #ccc!important;border-radius:4px!important;box-shadow:0 2px 8px #00000026!important;z-index:9999!important;padding:12px!important;display:block!important;visibility:visible!important;opacity:1!important}.table-up-creator .table-up-creator-grid,.ql-table-up-creator .table-up-creator-grid,[class*=table-creator] .table-up-creator-grid,[class*=creator] .table-up-creator-grid{display:grid!important;gap:2px!important;margin-bottom:10px!important}.table-up-creator .table-up-creator-grid .table-up-creator-cell,.ql-table-up-creator .table-up-creator-grid .table-up-creator-cell,[class*=table-creator] .table-up-creator-grid .table-up-creator-cell,[class*=creator] .table-up-creator-grid .table-up-creator-cell{width:16px!important;height:16px!important;border:1px solid #ddd!important;cursor:pointer!important}.table-up-creator .table-up-creator-grid .table-up-creator-cell:hover,.table-up-creator .table-up-creator-grid .table-up-creator-cell.active,.ql-table-up-creator .table-up-creator-grid .table-up-creator-cell:hover,.ql-table-up-creator .table-up-creator-grid .table-up-creator-cell.active,[class*=table-creator] .table-up-creator-grid .table-up-creator-cell:hover,[class*=table-creator] .table-up-creator-grid .table-up-creator-cell.active,[class*=creator] .table-up-creator-grid .table-up-creator-cell:hover,[class*=creator] .table-up-creator-grid .table-up-creator-cell.active{background-color:#007bff!important;border-color:#007bff!important}.table-up-creator .table-up-creator-info,.ql-table-up-creator .table-up-creator-info,[class*=table-creator] .table-up-creator-info,[class*=creator] .table-up-creator-info{text-align:center!important;font-size:12px!important;color:#666!important;margin-bottom:10px!important}.table-up-creator .table-up-creator-buttons,.ql-table-up-creator .table-up-creator-buttons,[class*=table-creator] .table-up-creator-buttons,[class*=creator] .table-up-creator-buttons{display:flex!important;gap:8px!important}.table-up-creator .table-up-creator-buttons button,.ql-table-up-creator .table-up-creator-buttons button,[class*=table-creator] .table-up-creator-buttons button,[class*=creator] .table-up-creator-buttons button{flex:1!important;padding:6px 12px!important;font-size:12px!important}[class*=creator]{position:absolute!important;background:#fff!important;border:1px solid #ccc!important;z-index:9999!important;padding:10px!important;min-width:200px!important;min-height:100px!important}.ql-picker-options{z-index:9999!important}[class*=creator],[class*=table-creator]{outline:2px solid red!important;background:#ff0!important}.manual-table-creator{position:absolute!important;background:#fff!important;border:1px solid #ccc!important;border-radius:4px!important;box-shadow:0 2px 8px #00000026!important;z-index:10000!important;padding:12px!important;display:block!important;visibility:visible!important;opacity:1!important;min-width:200px!important}.manual-table-creator div:first-child{text-align:center!important;font-size:12px!important;color:#333!important;margin-bottom:10px!important;font-weight:700!important;background:#f8f9fa!important;padding:4px 8px!important;border-radius:3px!important}.manual-table-creator div:last-child{display:grid!important;grid-template-columns:repeat(8,20px)!important;gap:2px!important;-webkit-user-select:none!important;user-select:none!important}.manual-table-creator div:last-child div{width:18px!important;height:18px!important;border:1px solid #ddd!important;cursor:pointer!important;background:#fff!important;transition:all .1s ease!important}.manual-table-creator div:last-child div:hover{background-color:#007bff!important;border-color:#0056b3!important;transform:scale(1.05)!important}.manual-table-menu{position:absolute!important;background:#fff!important;border:1px solid #ccc!important;border-radius:4px!important;box-shadow:0 4px 12px #0003!important;z-index:10001!important;padding:4px!important;min-width:150px!important;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important}.manual-table-menu div{padding:6px 12px!important;cursor:pointer!important;border-radius:3px!important;font-size:13px!important;color:#333!important;transition:background-color .1s ease!important}.manual-table-menu div:hover{background-color:#f5f5f5!important}.manual-table-menu div:active{background-color:#e9ecef!important}.manual-table-menu div[style*=\"height: 1px\"]{height:1px!important;background:#eee!important;margin:4px 0!important;padding:0!important;cursor:default!important}.manual-table-menu div[style*=\"height: 1px\"]:hover{background:#eee!important}.manual-table-creator *,.manual-table-menu *{pointer-events:auto!important;-webkit-user-select:none!important;user-select:none!important}.status-message{position:fixed!important;top:20px!important;right:20px!important;padding:12px 20px!important;border-radius:4px!important;box-shadow:0 2px 8px #0003!important;z-index:10001!important;font-size:14px!important;font-weight:500!important;color:#fff!important}@keyframes slideIn{0%{transform:translate(100%);opacity:0}to{transform:translate(0);opacity:1}}@keyframes slideOut{0%{transform:translate(0);opacity:1}to{transform:translate(100%);opacity:0}}.table-up-color-picker .table-up-color-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:2px;margin:8px 0}.table-up-color-picker .table-up-color-grid .table-up-color-item{width:20px;height:20px;cursor:pointer;border:1px solid #ddd;border-radius:2px}.table-up-color-picker .table-up-color-grid .table-up-color-item:hover{transform:scale(1.1);border-color:#007bff}@keyframes selection-glow{0%{opacity:.3}to{opacity:.7}}.ql-editor table td,.ql-editor table th{transition:all .2s ease!important;cursor:pointer!important}.ql-editor table td:hover,.ql-editor table th:hover{background-color:#007bff1a!important;transform:scale(1.02)!important;box-shadow:0 2px 4px #007bff33!important}.selection-area-indicator{position:absolute!important;border:2px dashed #007bff!important;background-color:#007bff1a!important;pointer-events:none!important;z-index:1000!important;border-radius:4px!important}.manual-table-creator{position:absolute;top:0;left:0;background:#fff;border:1px solid #ddd;border-radius:6px;box-shadow:0 6px 16px #0000001f;padding:12px;z-index:10000;min-width:200px}.manual-table-creator>div:first-child{font-size:12px;color:#333;margin-bottom:10px;text-align:center;font-weight:600}.manual-table-creator>div:last-child{display:grid;grid-template-columns:repeat(8,18px);gap:4px}.manual-table-creator>div:last-child>div{width:18px;height:18px;border:1px solid #e5e7eb;background:#fff;cursor:pointer;transition:background-color .12s ease}.manual-table-creator>div:last-child>div:hover{background-color:#dbeafe;border-color:#93c5fd}\n"] }]
149
+ }] });
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVpbGwyeC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvaW5wdXRzL3F1aWxsL3NyYy9xdWlsbDJ4LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvcXVpbGwvc3JjL3F1aWxsMnguY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLE9BQWtCLE1BQU0sU0FBUyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakMsT0FBTyxFQUFFLDRCQUE0QixFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFM0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDOztBQVdoRSxNQUFNLE9BQU8sc0NBQXNDO0lBQ3pDLEtBQUssQ0FBVztJQUVmLGFBQWEsR0FBRyxLQUFLLEVBQTZCLENBQUM7SUFFbkQsY0FBYyxHQUFHLE1BQU0sRUFBYyxDQUFDO0lBQ3RDLG1CQUFtQixHQUFHLE1BQU0sRUFBOEIsQ0FBQztJQUVuRCxhQUFhLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBNkIsZUFBZSxDQUFDLENBQUM7SUFDaEYsa0JBQWtCLEdBQUcsU0FBUyxDQUFDLFFBQVEsQ0FBNkIsZUFBZSxDQUFDLENBQUM7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VSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQy9DLElBQUksVUFBVSxFQUFFLENBQUM7b0JBQ2YsQ0FBQyxvQkFBb0IsRUFBRSx5QkFBeUIsRUFBRSxvQkFBb0IsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO3dCQUMzSSxVQUFVLEdBQUcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBVyxDQUFDO29CQUNsSSxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELE9BQU8sQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0FsSlUsc0NBQXNDOzRGQUF0QyxzQ0FBc0MsMGtCQ25CbkQsK1RBY0Esa3hmREdZLGVBQWU7OzRGQUVkLHNDQUFzQztrQkFUbEQsU0FBUzsrQkFFRSxtQ0FBbUMsY0FDakMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBR3RDLENBQUMsZUFBZSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgaW5wdXQsIE9uSW5pdCwgb3V0cHV0LCB2aWV3Q2hpbGQsIERlc3Ryb3lSZWYsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgUXVpbGwyeCwgeyBSYW5nZSB9IGZyb20gJ3F1aWxsMngnO1xuaW1wb3J0IHsgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjcmVhdGVDb250ZXh0TWVudU9wdGlvblRhYmxlLCBjcmVhdGVUYWJsZVNlbGVjdG9yIH0gZnJvbSAnLi91dGlscy9xdWlsbDJ4LmRlZmluZSc7XG5pbXBvcnQgeyBJUXVpbGxCbG90UmVnaXN0ZXIsIElRdWlsbEZ1bmN0aW9uQ29udHJvbEV2ZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3F1aWxsLmludGVyZmFjZSc7XG5pbXBvcnQgeyBVdGlsc0tleUNvZGVDb25zdGFudCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IGdldCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1xdWlsbDJ4JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlVXJsOiAnLi9xdWlsbDJ4LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL3F1aWxsMnguY29tcG9uZW50LnNjc3MnLFxuICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c0lucHV0c1F1aWxsMnhDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHF1aWxsPzogUXVpbGwyeDtcblxuICByZWFkb25seSBibG90c1JlZ2lzdGVyID0gaW5wdXQ8QXJyYXk8SVF1aWxsQmxvdFJlZ2lzdGVyPj4oKTtcblxuICByZWFkb25seSBvdXRDb250ZXh0TWVudSA9IG91dHB1dDxNb3VzZUV2ZW50PigpO1xuICByZWFkb25seSBvdXRGdW5jdGlvbnNDb250cm9sID0gb3V0cHV0PElRdWlsbEZ1bmN0aW9uQ29udHJvbEV2ZW50PigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgaHRtbENvbnRhaW5lciA9IHZpZXdDaGlsZC5yZXF1aXJlZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ2h0bWxDb250YWluZXInKTtcbiAgcHJpdmF0ZSByZWFkb25seSBxdWlsbEJvZHlDb250YWluZXIgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdzbm93Q29udGFpbmVyJyk7XG5cbiAgcHJpdmF0ZSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmJsb3RzUmVnaXN0ZXIoKT8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgUXVpbGwyeC5yZWdpc3RlcihpdGVtLmNvbXBvbmVudCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCB0b29sYmFyT3B0aW9ucyA9IFtcbiAgICAgIFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJywgJ3N0cmlrZSddLFxuICAgICAgWydibG9ja3F1b3RlJywgJ2NvZGUtYmxvY2snLCAnY29kZSddLFxuICAgICAgWydsaW5rJywgJ2ltYWdlJywgJ3ZpZGVvJywgJ2Zvcm11bGEnXSxcbiAgICAgIFt7IGxpc3Q6ICdvcmRlcmVkJyB9LCB7IGxpc3Q6ICdidWxsZXQnIH0sIHsgbGlzdDogJ2NoZWNrJyB9XSxcbiAgICAgIFt7IHNjcmlwdDogJ3N1YicgfSwgeyBzY3JpcHQ6ICdzdXBlcicgfV0sXG4gICAgICBbeyBpbmRlbnQ6ICctMScgfSwgeyBpbmRlbnQ6ICcrMScgfV0sXG4gICAgICBbeyBkaXJlY3Rpb246ICdydGwnIH1dLFxuICAgICAgW3sgc2l6ZTogWydzbWFsbCcsIGZhbHNlLCAnbGFyZ2UnLCAnaHVnZSddIH1dLFxuICAgICAgW3sgaGVhZGVyOiBbMSwgMiwgMywgNCwgNSwgNiwgZmFsc2VdIH1dLFxuICAgICAgW3sgY29sb3I6IFtdIH0sIHsgYmFja2dyb3VuZDogW10gfV0sXG4gICAgICBbeyBmb250OiBbXSB9XSxcbiAgICAgIFt7IGFsaWduOiBbXSB9XSxcbiAgICAgIFsndGFibGUnXSxcbiAgICBdO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHRoZW1lOiAnc25vdycsXG4gICAgICBtb2R1bGVzOiB7XG4gICAgICAgIHRvb2xiYXI6IHtcbiAgICAgICAgICBjb250YWluZXI6IHRvb2xiYXJPcHRpb25zLFxuICAgICAgICAgIGhhbmRsZXJzOiB7XG4gICAgICAgICAgICB0YWJsZTogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSB0aGlzLmh0bWxDb250YWluZXIoKS5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3I/LignYnV0dG9uLnFsLXRhYmxlJykgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnYnV0dG9uJywgYnV0dG9uLCB0aGlzLmh0bWxDb250YWluZXIoKS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgICAgICAgY3JlYXRlVGFibGVTZWxlY3Rvcih0aGlzLnF1aWxsIGFzIFF1aWxsMngsIGJ1dHRvbik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHRhYmxlOiB0cnVlLFxuICAgICAgICBrZXlib2FyZDoge1xuICAgICAgICAgIGJpbmRpbmdzOiB7XG4gICAgICAgICAgICBiYWNrc3BhY2U6IHtcbiAgICAgICAgICAgICAga2V5OiBVdGlsc0tleUNvZGVDb25zdGFudC5CQUNLU1BBQ0UsXG4gICAgICAgICAgICAgIGhhbmRsZXI6IChyYW5nZTogUmFuZ2UpID0+IHRoaXMubm9QcmV2ZW50RW1iZWREZWxldGlvbihyYW5nZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGVsZXRlOiB7XG4gICAgICAgICAgICAgIGtleTogVXRpbHNLZXlDb2RlQ29uc3RhbnQuREVMRVRFLFxuICAgICAgICAgICAgICBoYW5kbGVyOiAocmFuZ2U6IFJhbmdlKSA9PiB0aGlzLm5vUHJldmVudEVtYmVkRGVsZXRpb24ocmFuZ2UpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgdGhpcy5xdWlsbCA9IG5ldyBRdWlsbDJ4KHRoaXMucXVpbGxCb2R5Q29udGFpbmVyKCkubmF0aXZlRWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4odGhpcy5xdWlsbEJvZHlDb250YWluZXIoKT8ubmF0aXZlRWxlbWVudCwgJ2NvbnRleHRtZW51JylcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgoZSkgPT4gdGhpcy5vdXRDb250ZXh0TWVudS5lbWl0KGUpKTtcblxuICAgIC8vIFThu7EgxJHhu5luZyB04bqjaSBu4buZaSBkdW5nIMSRw6MgbMawdSAobuG6v3UgY8OzKVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzYXZlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdxdWlsbDJ4X3NhdmVkX2h0bWwnKTtcbiAgICAgIGlmIChzYXZlZCkge1xuICAgICAgICB0aGlzLnF1aWxsLmNsaXBib2FyZC5kYW5nZXJvdXNseVBhc3RlSFRNTChzYXZlZCwgJ3NpbGVudCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLyogbm8tb3A6IGLhu48gcXVhIG7hur91IGtow7RuZyB0aOG7gyB04bqjaSB04burIGxvY2FsU3RvcmFnZSAqL1xuICAgIH1cblxuICAgIC8vIEfDoW4gaGFuZGxlciBsxrB1L3ThuqNpL3jDs2EgbuG7mWkgZHVuZ1xuICAgIGNvbnN0IHNhdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZS1jb250ZW50Jyk7XG5cbiAgICBzYXZlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIGNvbnN0IGh0bWwgPSAodGhpcy5xdWlsbD8ucm9vdCBhcyBIVE1MRWxlbWVudCkuaW5uZXJIVE1MO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3F1aWxsMnhfc2F2ZWRfaHRtbCcsIGh0bWwpO1xuICAgICAgICB0aGlzLnNldFN0eWxlRm9yQ29udGVudCgpO1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZygnxJDDoyBsxrB1IG7hu5lpIGR1bmcnKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvKiBuby1vcDogYuG7jyBxdWEgbuG6v3UgbMawdSB0aOG6pXQgYuG6oWkgKi9cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMub3V0RnVuY3Rpb25zQ29udHJvbC5lbWl0KHRoaXMuRnVuY3Rpb25zQ29udHJvbCk7XG4gICAgdGhpcy5zZXRTdHlsZUZvckNvbnRlbnQoKTtcbiAgICBjcmVhdGVDb250ZXh0TWVudU9wdGlvblRhYmxlKHRoaXMucXVpbGwgYXMgUXVpbGwyeCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IEZ1bmN0aW9uc0NvbnRyb2woKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVpbGw6ICgpID0+IHRoaXMucXVpbGwgYXMgYW55LFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIG5vUHJldmVudEVtYmVkRGVsZXRpb24ocmFuZ2U6IFJhbmdlKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnF1aWxsKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgZGVsdGEgPSB0aGlzLnF1aWxsPy5nZXRDb250ZW50cyhyYW5nZS5pbmRleCwgMSk7XG5cbiAgICBpZiAoZGVsdGE/Lm9wcy5zb21lKChvcHRpb24pID0+IHRoaXMuYmxvdHNSZWdpc3RlcigpPy5maW5kKChpdGVtKSA9PiBnZXQob3B0aW9uLmluc2VydCwgaXRlbS5jb21wb25lbnRbJ2Jsb3ROYW1lJ10pICYmIGl0ZW0uaWdub3JlRGVsZXRlKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTsgLy8gTmfEg24ga2jDtG5nIGNobyBRdWlsbCB44butIGzDvSB4w7NhXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNldFN0eWxlRm9yQ29udGVudCgpIHtcbiAgICBjb25zdCBzdHlsZUFycmF5ID0gW1xuICAgICAgeyBzZWxlY3RvcjogJy5xbC1mb250LUFyaWFsJywgc3R5bGU6ICdmb250LWZhbWlseTogQXJpYWwnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtc2Fucy1zZXJpZicsIHN0eWxlOiAnZm9udC1mYW1pbHk6IHNhbnMtc2VyaWYnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtc2VyaWYnLCBzdHlsZTogJ2ZvbnQtZmFtaWx5OiBzZXJpZicgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICcucWwtZm9udC1tb25vc3BhY2UnLCBzdHlsZTogJ2ZvbnQtZmFtaWx5OiBtb25vc3BhY2UnIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLnFsLWZvbnQtSGVsdmV0aWNhJywgc3R5bGU6ICdmb250LWZhbWlseTogSGVsdmV0aWNhJyB9LFxuICAgICAgeyBzZWxlY3RvcjogJy5saWJzLXVpLXF1aWxsLWZvcm1hdC1pbWFnZScsIHN0eWxlOiAnbWF4LXdpZHRoOiAxMDAlOyBoZWlnaHQ6IGF1dG8nLCBvdmVycmlkZVN0eWxlOiB0cnVlIH0sXG4gICAgICB7IHNlbGVjdG9yOiAnLmxpYnMtdWktcXVpbGwtbWVudGlvbicsIHN0eWxlOiAnZm9udC13ZWlnaHQ6IDYwMDstbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOy13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOyBjb2xvcjogIzcyMzlFQScsIG92ZXJyaWRlU3R5bGU6IHRydWUgfSxcbiAgICAgIHsgc2VsZWN0b3I6ICdibG9ja3F1b3RlJywgc3R5bGU6ICdib3JkZXItbGVmdDogNHB4IHNvbGlkICNjY2M7IG1hcmdpbi1ib3R0b206IDVweDsgbWFyZ2luLXRvcDogNXB4OyBwYWRkaW5nLWxlZnQ6IDE2cHgnLCBvdmVycmlkZVN0eWxlOiB0cnVlIH0sXG4gICAgXTtcbiAgICB0aGlzLmJsb3RzUmVnaXN0ZXIoKT8uZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgc3R5bGVBcnJheS5wdXNoKHsgc2VsZWN0b3I6IGAuJHtpdGVtLmNsYXNzTmFtZX1gLCBzdHlsZTogaXRlbS5zdHlsZSwgb3ZlcnJpZGVTdHlsZTogdHJ1ZSB9KTtcbiAgICB9KTtcbiAgICBzdHlsZUFycmF5LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGhpcy5xdWlsbD8ucm9vdC5xdWVyeVNlbGVjdG9yQWxsKGl0ZW0uc2VsZWN0b3IpO1xuICAgICAgZWxlbWVudHM/LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoaXRlbS5vdmVycmlkZVN0eWxlKSB7XG4gICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgaXRlbS5zdHlsZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpeGJ1ZyBpc3N1ZTogaHR0cHM6Ly9hZG1pbi1jdi5tb2Jpby52bi9pc3N1ZXMvNDkwOTJcbiAgICAgICAgbGV0IHN0eWxlRXhpc3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnc3R5bGUnKTtcbiAgICAgICAgaWYgKHN0eWxlRXhpc3QpIHtcbiAgICAgICAgICBbJ2ZvbnQtZmFtaWx5OiBBcmlhbCcsICdmb250LWZhbWlseTogc2Fucy1zZXJpZicsICdmb250LWZhbWlseTogc2VyaWYnLCAnZm9udC1mYW1pbHk6IG1vbm9zcGFjZScsICdmb250LWZhbWlseTogSGVsdmV0aWNhJ10uZm9yRWFjaCgoZm9udCkgPT4ge1xuICAgICAgICAgICAgc3R5bGVFeGlzdCA9IChzdHlsZUV4aXN0Py5pbmNsdWRlcyhgJHtmb250fTtgKSA/IHN0eWxlRXhpc3Q/LnJlcGxhY2UoYCR7Zm9udH07YCwgJycpIDogc3R5bGVFeGlzdD8ucmVwbGFjZShmb250LCAnJykpIGFzIHN0cmluZztcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZUV4aXN0ID8gYCR7c3R5bGVFeGlzdH0ke3N0eWxlRXhpc3Rbc3R5bGVFeGlzdC5sZW5ndGggLSAxXSA9PT0gJzsnID8gJycgOiAnOyd9JHtpdGVtLnN0eWxlfTtgIDogaXRlbS5zdHlsZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPGRpdlxuICAjaHRtbENvbnRhaW5lclxuICBjbGFzcz1cImNvbnRhaW5lclwiPlxuICA8ZGl2IGNsYXNzPVwicGFuZWxcIj5cbiAgICA8ZGl2ICNzbm93Q29udGFpbmVyPjwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBpZD1cInNhdmUtY29udGVudFwiXG4gICAgICAgIGNsYXNzPVwiYWN0aW9uLWJ0biBzYXZlLWJ0blwiPlxuICAgICAgICDwn5K+IEzGsHUgbuG7mWkgZHVuZ1xuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,67 @@
1
+ import { ChangeDetectionStrategy, Component, input, output, signal } from '@angular/core';
2
+ import { LibsUiComponentsModalComponent } from '@libs-ui/components-modal';
3
+ import * as i0 from "@angular/core";
4
+ export class LibsUiComponentsInputsQuillUploadImageComponent {
5
+ buttonFooter = signal([
6
+ {
7
+ type: 'button-third',
8
+ label: 'i18n_cancel',
9
+ action: async () => this.outClose.emit(),
10
+ },
11
+ {
12
+ label: 'i18n_save',
13
+ action: () => this.handlerSaveImage(),
14
+ },
15
+ ]);
16
+ disable = signal(false);
17
+ ignoreCommunicateMicroEvent = input();
18
+ // private mediaFile =signal<IMediaFile | undefined>(undefined);
19
+ // private mediaUploadFunctionControl =signal<IMediaUploadBaseFunctionControlEvent | undefined>(undefined);
20
+ uploadImageConfig = input.required();
21
+ outClose = output();
22
+ // protected handlerFunctionsControl(event: IMediaUploadBaseFunctionControlEvent) {
23
+ // this.mediaUploadFunctionControl.set(event);
24
+ // }
25
+ // protected handlerChangeFile(event: IChangeFile) {
26
+ // this.mediaFile.set(event.files[0]);
27
+ // }
28
+ async handlerSaveImage() {
29
+ // if (!await this.mediaUploadFunctionControl()?.checkIsValid()) {
30
+ // return;
31
+ // }
32
+ // if (this.mediaFile?.origin_url) {
33
+ // this.moClose.emit(this.mediaFile.origin_url);
34
+ // return;
35
+ // }
36
+ // const body: IOptionsUploadMedia = {
37
+ // do_not_delete: true,
38
+ // file: this.mediaFile?.file,
39
+ // option: 'thumb',
40
+ // size: [{ 'width': '200', 'height': '200' }]
41
+ // };
42
+ // this.disable = true;
43
+ // try {
44
+ // const params = new HttpParamsRequest({ fromObject: { pem: BUILD_PEM_OBJECT({ isCheck: 0, action: DefineConstants.PERMISSION_ACTION_VIEW, pathCheck: '/other' }) } });
45
+ // const res = await this.mediaService.uploadImage(params, body);
46
+ // this.moClose.emit(res.data?.url);
47
+ // } catch (error) {
48
+ // console.log(error);
49
+ // this.pushMessageService.showCompTypeText('i18n_notification_manipulation_not_success', undefined, undefined, { timeRemove: 2000, type: 'error' });
50
+ // this.moClose.emit();
51
+ // } finally {
52
+ // this.disable = false;
53
+ // }
54
+ }
55
+ handlerEventModal(event) {
56
+ if (event === 'close') {
57
+ this.outClose.emit();
58
+ }
59
+ }
60
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsQuillUploadImageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
61
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.14", type: LibsUiComponentsInputsQuillUploadImageComponent, isStandalone: true, selector: "libs_ui-components-inputs-quill-upload_image", inputs: { ignoreCommunicateMicroEvent: { classPropertyName: "ignoreCommunicateMicroEvent", publicName: "ignoreCommunicateMicroEvent", isSignal: true, isRequired: false, transformFunction: null }, uploadImageConfig: { classPropertyName: "uploadImageConfig", publicName: "uploadImageConfig", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { outClose: "outClose" }, ngImport: i0, template: "<libs_ui-components-modal\n [title]=\"'i18n_upload_image'\"\n [mode]=\"'center'\"\n [width]=\"'598px'\"\n [headerConfig]=\"{ ignoreHeaderTheme: true }\"\n [maxHeight]=\"'calc(100% - 100px)'\"\n [height]=\"'auto'\"\n [zIndex]=\"uploadImageConfig().zIndex || 1203\"\n [disable]=\"disable()\"\n [ignoreCommunicateMicroEvent]=\"ignoreCommunicateMicroEvent()\"\n [buttonsFooter]=\"buttonFooter()\"\n (outEvent)=\"handlerEventModal($event)\">\n <div class=\"libs-ui-modal-body-custom\">\n <!-- <libs-uicomponents-media-upload [zIndex]=\"zIndex+1\"\n [labelConfig]=\"labelConfig\"\n [multiple]=\"false\"\n [fileType]=\"'image'\"\n [doNotDelete]=\"true\"\n [maxImageSize]=\"maxImageSize || 1048576\"\n [limitFile]=\"10\"\n [validRequired]=\"{isRequired: true}\"\n (moChangeFile)=\"handlerChangeFile($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n </libs-uicomponents-media-upload> -->\n </div>\n</libs_ui-components-modal>\n", dependencies: [{ kind: "component", type: LibsUiComponentsModalComponent, selector: "libs_ui-components-modal", inputs: ["show", "mode", "isBackdropTransparent", "isBackgroundTransparentModal", "isSizeBackdropByWidthHeightInput", "hasShadowBoxWhenHiddenBackDropTransparent", "classIncludeModalWrapper", "zIndex", "width", "height", "maxWidth", "maxHeight", "minWidth", "isFullScreen", "disable", "ignoreCommunicateMicroEvent", "headerConfig", "bodyConfig", "footerConfig", "buttonsFooter", "title", "titleUseXssFilter", "titleUseTooltip", "titleUseInnerText"], outputs: ["showChange", "widthChange", "heightChange", "maxWidthChange", "maxHeightChange", "minWidthChange", "disableChange", "buttonsFooterChange", "outScrollContent", "outEvent", "outFunctionControl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
62
+ }
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LibsUiComponentsInputsQuillUploadImageComponent, decorators: [{
64
+ type: Component,
65
+ args: [{ selector: 'libs_ui-components-inputs-quill-upload_image', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsModalComponent], template: "<libs_ui-components-modal\n [title]=\"'i18n_upload_image'\"\n [mode]=\"'center'\"\n [width]=\"'598px'\"\n [headerConfig]=\"{ ignoreHeaderTheme: true }\"\n [maxHeight]=\"'calc(100% - 100px)'\"\n [height]=\"'auto'\"\n [zIndex]=\"uploadImageConfig().zIndex || 1203\"\n [disable]=\"disable()\"\n [ignoreCommunicateMicroEvent]=\"ignoreCommunicateMicroEvent()\"\n [buttonsFooter]=\"buttonFooter()\"\n (outEvent)=\"handlerEventModal($event)\">\n <div class=\"libs-ui-modal-body-custom\">\n <!-- <libs-uicomponents-media-upload [zIndex]=\"zIndex+1\"\n [labelConfig]=\"labelConfig\"\n [multiple]=\"false\"\n [fileType]=\"'image'\"\n [doNotDelete]=\"true\"\n [maxImageSize]=\"maxImageSize || 1048576\"\n [limitFile]=\"10\"\n [validRequired]=\"{isRequired: true}\"\n (moChangeFile)=\"handlerChangeFile($event)\"\n (outFunctionsControl)=\"handlerFunctionsControl($event)\">\n </libs-uicomponents-media-upload> -->\n </div>\n</libs_ui-components-modal>\n" }]
66
+ }] });
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLWltYWdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9pbnB1dHMvcXVpbGwvc3JjL3VwbG9hZC1pbWFnZS91cGxvYWQtaW1hZ2UuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL2lucHV0cy9xdWlsbC9zcmMvdXBsb2FkLWltYWdlL3VwbG9hZC1pbWFnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTFGLE9BQU8sRUFBRSw4QkFBOEIsRUFBb0IsTUFBTSwyQkFBMkIsQ0FBQzs7QUFXN0YsTUFBTSxPQUFPLCtDQUErQztJQUNoRCxZQUFZLEdBQUcsTUFBTSxDQUFpQjtRQUM5QztZQUNFLElBQUksRUFBRSxjQUFjO1lBQ3BCLEtBQUssRUFBRSxhQUFhO1lBQ3BCLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFO1NBQ3pDO1FBQ0Q7WUFDRSxLQUFLLEVBQUUsV0FBVztZQUNsQixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1NBQ3RDO0tBQ0YsQ0FBQyxDQUFDO0lBQ08sT0FBTyxHQUFHLE1BQU0sQ0FBVSxLQUFLLENBQUMsQ0FBQztJQUNsQywyQkFBMkIsR0FBRyxLQUFLLEVBQVcsQ0FBQztJQUV4RCxnRUFBZ0U7SUFDaEUsMkdBQTJHO0lBRWxHLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQTJCLENBQUM7SUFFOUQsUUFBUSxHQUFHLE1BQU0sRUFBaUIsQ0FBQztJQUU1QyxtRkFBbUY7SUFDbkYsZ0RBQWdEO0lBQ2hELElBQUk7SUFFSixvREFBb0Q7SUFDcEQsd0NBQXdDO0lBQ3hDLElBQUk7SUFFSSxLQUFLLENBQUMsZ0JBQWdCO1FBQzVCLGtFQUFrRTtRQUNsRSxZQUFZO1FBQ1osSUFBSTtRQUNKLG9DQUFvQztRQUNwQyxrREFBa0Q7UUFDbEQsWUFBWTtRQUNaLElBQUk7UUFDSixzQ0FBc0M7UUFDdEMseUJBQXlCO1FBQ3pCLGdDQUFnQztRQUNoQyxxQkFBcUI7UUFDckIsZ0RBQWdEO1FBQ2hELEtBQUs7UUFDTCx1QkFBdUI7UUFDdkIsUUFBUTtRQUNSLDBLQUEwSztRQUMxSyxtRUFBbUU7UUFDbkUsc0NBQXNDO1FBQ3RDLG9CQUFvQjtRQUNwQix3QkFBd0I7UUFDeEIsdUpBQXVKO1FBQ3ZKLHlCQUF5QjtRQUN6QixjQUFjO1FBQ2QsMEJBQTBCO1FBQzFCLElBQUk7SUFDTixDQUFDO0lBRVMsaUJBQWlCLENBQUMsS0FBdUI7UUFDakQsSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQzt3R0E5RFUsK0NBQStDOzRGQUEvQywrQ0FBK0MsNGVDYjVELCsrQkEwQkEsNENEZlksOEJBQThCOzs0RkFFN0IsK0NBQStDO2tCQVIzRCxTQUFTOytCQUVFLDhDQUE4QyxjQUU1QyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyw4QkFBOEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUJ1dHRvbiB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c01vZGFsQ29tcG9uZW50LCBUWVBFX01PREFMX0VWRU5UIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1tb2RhbCc7XG5pbXBvcnQgeyBJUXVpbGxVcGxvYWRJbWFnZUNvbmZpZyB9IGZyb20gJy4uL2ludGVyZmFjZXMvcXVpbGwuaW50ZXJmYWNlJztcblxuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLWlucHV0cy1xdWlsbC11cGxvYWRfaW1hZ2UnLFxuICB0ZW1wbGF0ZVVybDogJy4vdXBsb2FkLWltYWdlLmNvbXBvbmVudC5odG1sJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtMaWJzVWlDb21wb25lbnRzTW9kYWxDb21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzSW5wdXRzUXVpbGxVcGxvYWRJbWFnZUNvbXBvbmVudCB7XG4gIHByb3RlY3RlZCBidXR0b25Gb290ZXIgPSBzaWduYWw8QXJyYXk8SUJ1dHRvbj4+KFtcbiAgICB7XG4gICAgICB0eXBlOiAnYnV0dG9uLXRoaXJkJyxcbiAgICAgIGxhYmVsOiAnaTE4bl9jYW5jZWwnLFxuICAgICAgYWN0aW9uOiBhc3luYyAoKSA9PiB0aGlzLm91dENsb3NlLmVtaXQoKSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiAnaTE4bl9zYXZlJyxcbiAgICAgIGFjdGlvbjogKCkgPT4gdGhpcy5oYW5kbGVyU2F2ZUltYWdlKCksXG4gICAgfSxcbiAgXSk7XG4gIHByb3RlY3RlZCBkaXNhYmxlID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgaWdub3JlQ29tbXVuaWNhdGVNaWNyb0V2ZW50ID0gaW5wdXQ8Ym9vbGVhbj4oKTtcblxuICAvLyBwcml2YXRlIG1lZGlhRmlsZSA9c2lnbmFsPElNZWRpYUZpbGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gIC8vIHByaXZhdGUgbWVkaWFVcGxvYWRGdW5jdGlvbkNvbnRyb2wgPXNpZ25hbDxJTWVkaWFVcGxvYWRCYXNlRnVuY3Rpb25Db250cm9sRXZlbnQgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgcmVhZG9ubHkgdXBsb2FkSW1hZ2VDb25maWcgPSBpbnB1dC5yZXF1aXJlZDxJUXVpbGxVcGxvYWRJbWFnZUNvbmZpZz4oKTtcblxuICByZWFkb25seSBvdXRDbG9zZSA9IG91dHB1dDxzdHJpbmcgfCB2b2lkPigpO1xuXG4gIC8vIHByb3RlY3RlZCBoYW5kbGVyRnVuY3Rpb25zQ29udHJvbChldmVudDogSU1lZGlhVXBsb2FkQmFzZUZ1bmN0aW9uQ29udHJvbEV2ZW50KSB7XG4gIC8vICAgdGhpcy5tZWRpYVVwbG9hZEZ1bmN0aW9uQ29udHJvbC5zZXQoZXZlbnQpO1xuICAvLyB9XG5cbiAgLy8gcHJvdGVjdGVkIGhhbmRsZXJDaGFuZ2VGaWxlKGV2ZW50OiBJQ2hhbmdlRmlsZSkge1xuICAvLyAgIHRoaXMubWVkaWFGaWxlLnNldChldmVudC5maWxlc1swXSk7XG4gIC8vIH1cblxuICBwcml2YXRlIGFzeW5jIGhhbmRsZXJTYXZlSW1hZ2UoKSB7XG4gICAgLy8gaWYgKCFhd2FpdCB0aGlzLm1lZGlhVXBsb2FkRnVuY3Rpb25Db250cm9sKCk/LmNoZWNrSXNWYWxpZCgpKSB7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIC8vIGlmICh0aGlzLm1lZGlhRmlsZT8ub3JpZ2luX3VybCkge1xuICAgIC8vICAgdGhpcy5tb0Nsb3NlLmVtaXQodGhpcy5tZWRpYUZpbGUub3JpZ2luX3VybCk7XG4gICAgLy8gICByZXR1cm47XG4gICAgLy8gfVxuICAgIC8vIGNvbnN0IGJvZHk6IElPcHRpb25zVXBsb2FkTWVkaWEgPSB7XG4gICAgLy8gICBkb19ub3RfZGVsZXRlOiB0cnVlLFxuICAgIC8vICAgZmlsZTogdGhpcy5tZWRpYUZpbGU/LmZpbGUsXG4gICAgLy8gICBvcHRpb246ICd0aHVtYicsXG4gICAgLy8gICBzaXplOiBbeyAnd2lkdGgnOiAnMjAwJywgJ2hlaWdodCc6ICcyMDAnIH1dXG4gICAgLy8gfTtcbiAgICAvLyB0aGlzLmRpc2FibGUgPSB0cnVlO1xuICAgIC8vIHRyeSB7XG4gICAgLy8gICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtc1JlcXVlc3QoeyBmcm9tT2JqZWN0OiB7IHBlbTogQlVJTERfUEVNX09CSkVDVCh7IGlzQ2hlY2s6IDAsIGFjdGlvbjogRGVmaW5lQ29uc3RhbnRzLlBFUk1JU1NJT05fQUNUSU9OX1ZJRVcsIHBhdGhDaGVjazogJy9vdGhlcicgfSkgfSB9KTtcbiAgICAvLyAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMubWVkaWFTZXJ2aWNlLnVwbG9hZEltYWdlKHBhcmFtcywgYm9keSk7XG4gICAgLy8gICB0aGlzLm1vQ2xvc2UuZW1pdChyZXMuZGF0YT8udXJsKTtcbiAgICAvLyB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgIC8vICAgdGhpcy5wdXNoTWVzc2FnZVNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dCgnaTE4bl9ub3RpZmljYXRpb25fbWFuaXB1bGF0aW9uX25vdF9zdWNjZXNzJywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHsgdGltZVJlbW92ZTogMjAwMCwgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAvLyAgIHRoaXMubW9DbG9zZS5lbWl0KCk7XG4gICAgLy8gfSBmaW5hbGx5IHtcbiAgICAvLyAgIHRoaXMuZGlzYWJsZSA9IGZhbHNlO1xuICAgIC8vIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyRXZlbnRNb2RhbChldmVudDogVFlQRV9NT0RBTF9FVkVOVCkge1xuICAgIGlmIChldmVudCA9PT0gJ2Nsb3NlJykge1xuICAgICAgdGhpcy5vdXRDbG9zZS5lbWl0KCk7XG4gICAgfVxuICB9XG59XG4iLCI8bGlic191aS1jb21wb25lbnRzLW1vZGFsXG4gIFt0aXRsZV09XCInaTE4bl91cGxvYWRfaW1hZ2UnXCJcbiAgW21vZGVdPVwiJ2NlbnRlcidcIlxuICBbd2lkdGhdPVwiJzU5OHB4J1wiXG4gIFtoZWFkZXJDb25maWddPVwieyBpZ25vcmVIZWFkZXJUaGVtZTogdHJ1ZSB9XCJcbiAgW21heEhlaWdodF09XCInY2FsYygxMDAlIC0gMTAwcHgpJ1wiXG4gIFtoZWlnaHRdPVwiJ2F1dG8nXCJcbiAgW3pJbmRleF09XCJ1cGxvYWRJbWFnZUNvbmZpZygpLnpJbmRleCB8fCAxMjAzXCJcbiAgW2Rpc2FibGVdPVwiZGlzYWJsZSgpXCJcbiAgW2lnbm9yZUNvbW11bmljYXRlTWljcm9FdmVudF09XCJpZ25vcmVDb21tdW5pY2F0ZU1pY3JvRXZlbnQoKVwiXG4gIFtidXR0b25zRm9vdGVyXT1cImJ1dHRvbkZvb3RlcigpXCJcbiAgKG91dEV2ZW50KT1cImhhbmRsZXJFdmVudE1vZGFsKCRldmVudClcIj5cbiAgPGRpdiBjbGFzcz1cImxpYnMtdWktbW9kYWwtYm9keS1jdXN0b21cIj5cbiAgICA8IS0tIDxsaWJzLXVpY29tcG9uZW50cy1tZWRpYS11cGxvYWQgW3pJbmRleF09XCJ6SW5kZXgrMVwiXG4gICAgICBbbGFiZWxDb25maWddPVwibGFiZWxDb25maWdcIlxuICAgICAgW211bHRpcGxlXT1cImZhbHNlXCJcbiAgICAgIFtmaWxlVHlwZV09XCInaW1hZ2UnXCJcbiAgICAgIFtkb05vdERlbGV0ZV09XCJ0cnVlXCJcbiAgICAgIFttYXhJbWFnZVNpemVdPVwibWF4SW1hZ2VTaXplIHx8IDEwNDg1NzZcIlxuICAgICAgW2xpbWl0RmlsZV09XCIxMFwiXG4gICAgICBbdmFsaWRSZXF1aXJlZF09XCJ7aXNSZXF1aXJlZDogdHJ1ZX1cIlxuICAgICAgKG1vQ2hhbmdlRmlsZSk9XCJoYW5kbGVyQ2hhbmdlRmlsZSgkZXZlbnQpXCJcbiAgICAgIChvdXRGdW5jdGlvbnNDb250cm9sKT1cImhhbmRsZXJGdW5jdGlvbnNDb250cm9sKCRldmVudClcIj5cbiAgICA8L2xpYnMtdWljb21wb25lbnRzLW1lZGlhLXVwbG9hZD4gLS0+XG4gIDwvZGl2PlxuPC9saWJzX3VpLWNvbXBvbmVudHMtbW9kYWw+XG4iXX0=