@seniorsistemas/angular-components 19.5.5 → 19.6.0
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.
- package/accordion/README.md +95 -59
- package/calendar-mask/lib/calendar-mask/calendar-mask.directive.d.ts +4 -0
- package/datepicker/README.md +175 -0
- package/datepicker/index.d.ts +5 -0
- package/datepicker/lib/datepicker/date.utils.d.ts +21 -0
- package/datepicker/lib/datepicker/datepicker.component.d.ts +254 -0
- package/datepicker/lib/datepicker/models/index.d.ts +16 -0
- package/datepicker/public-api.d.ts +2 -0
- package/dynamic-form/dynamic-form/components/lookup/lookup.component.d.ts +3 -1
- package/dynamic-form/dynamic-form/components/lookup/models/lookup-alert-config.d.ts +5 -0
- package/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.d.ts +119 -24
- package/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.d.ts +6 -0
- package/dynamic-form/dynamic-form/form-field/fields/calendar/calendar-field.component.d.ts +6 -23
- package/dynamic-form/public-api.d.ts +1 -0
- package/editor/README.md +229 -0
- package/editor/index.d.ts +5 -0
- package/editor/lib/editor/editor.component.d.ts +127 -0
- package/editor/lib/editor/link-dialog/link-dialog.component.d.ts +18 -0
- package/editor/lib/editor/models/index.d.ts +12 -0
- package/editor/lib/editor/toolbar-button/editor-toolbar-button.component.d.ts +10 -0
- package/editor/public-api.d.ts +2 -0
- package/esm2022/calendar-mask/lib/calendar-mask/calendar-mask.directive.mjs +5 -1
- package/esm2022/datepicker/lib/datepicker/date.utils.mjs +182 -0
- package/esm2022/datepicker/lib/datepicker/datepicker.component.mjs +1062 -0
- package/esm2022/datepicker/lib/datepicker/models/index.mjs +2 -0
- package/esm2022/datepicker/public-api.mjs +2 -0
- package/esm2022/datepicker/seniorsistemas-angular-components-datepicker.mjs +5 -0
- package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +11 -5
- package/esm2022/dynamic-form/dynamic-form/components/lookup/models/lookup-alert-config.mjs +2 -0
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/calendar-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/lookup-field.mjs +1 -1
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/autocomplete/autocomplete-field.component.mjs +2 -2
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/calendar/calendar-field.component.mjs +23 -116
- package/esm2022/dynamic-form/dynamic-form/form-field/fields/lookup/lookup-field.component.mjs +3 -3
- package/esm2022/dynamic-form/public-api.mjs +1 -1
- package/esm2022/editor/lib/editor/editor.component.mjs +375 -0
- package/esm2022/editor/lib/editor/link-dialog/link-dialog.component.mjs +48 -0
- package/esm2022/editor/lib/editor/models/index.mjs +3 -0
- package/esm2022/editor/lib/editor/toolbar-button/editor-toolbar-button.component.mjs +17 -0
- package/esm2022/editor/public-api.mjs +3 -0
- package/esm2022/editor/seniorsistemas-angular-components-editor.mjs +5 -0
- package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-calendar/inline-edit-calendar.component.mjs +22 -12
- package/esm2022/inline-edit/lib/inline-edit/inline-edit.module.mjs +5 -5
- package/esm2022/lib/locale/fallback.mjs +82 -3
- package/esm2022/optional-fields/editor/editor-field/editor-field.component.mjs +5 -6
- package/esm2022/optional-fields/editor/editor-field.mjs +1 -1
- package/esm2022/panel/lib/panel/panel.component.mjs +7 -3
- package/esm2022/select/lib/select/select.component.mjs +4 -8
- package/esm2022/shared/lib/accessibility/datepicker-no-period-tab.directive.mjs +5 -1
- package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs +4 -0
- package/fesm2022/seniorsistemas-angular-components-calendar-mask.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs +1250 -0
- package/fesm2022/seniorsistemas-angular-components-datepicker.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +49 -135
- package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-editor.mjs +437 -0
- package/fesm2022/seniorsistemas-angular-components-editor.mjs.map +1 -0
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +24 -15
- package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-optional-fields-editor.mjs +4 -5
- package/fesm2022/seniorsistemas-angular-components-optional-fields-editor.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-panel.mjs +6 -2
- package/fesm2022/seniorsistemas-angular-components-panel.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-select.mjs +3 -7
- package/fesm2022/seniorsistemas-angular-components-select.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components-shared.mjs +4 -0
- package/fesm2022/seniorsistemas-angular-components-shared.mjs.map +1 -1
- package/fesm2022/seniorsistemas-angular-components.mjs +81 -2
- package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
- package/inline-edit/lib/inline-edit/components/fields/inline-edit-calendar/inline-edit-calendar.component.d.ts +6 -4
- package/inline-edit/lib/inline-edit/inline-edit.module.d.ts +2 -2
- package/loading-state/README.md +57 -17
- package/optional-fields/editor/editor-field.d.ts +9 -6
- package/package.json +74 -8
- package/panel/README.md +12 -1
- package/panel/lib/panel/panel.component.d.ts +3 -1
- package/schematics/collection.json +4 -0
- package/schematics/migrations/migrate-p-datepicker/index.d.ts +2 -0
- package/schematics/migrations/migrate-p-datepicker/index.js +141 -0
- package/schematics/migrations/migrate-p-datepicker/index.js.map +1 -0
- package/schematics/migrations/migrate-p-datepicker/index.test.d.ts +1 -0
- package/schematics/migrations/migrate-p-datepicker/index.test.js +392 -0
- package/schematics/migrations/migrate-p-datepicker/index.test.js.map +1 -0
- package/schematics/migrations.json +10 -0
- package/schematics/utils/ast-utils.d.ts +28 -0
- package/schematics/utils/ast-utils.js +116 -0
- package/schematics/utils/ast-utils.js.map +1 -0
- package/schematics/utils/ast-utils.test.d.ts +1 -0
- package/schematics/utils/ast-utils.test.js +138 -0
- package/schematics/utils/ast-utils.test.js.map +1 -0
- package/schematics/utils/workspace-utils.d.ts +6 -0
- package/schematics/utils/workspace-utils.js +37 -0
- package/schematics/utils/workspace-utils.js.map +1 -0
- package/schematics/utils/workspace-utils.test.d.ts +1 -0
- package/schematics/utils/workspace-utils.test.js +152 -0
- package/schematics/utils/workspace-utils.test.js.map +1 -0
- package/shared/lib/accessibility/datepicker-no-period-tab.directive.d.ts +4 -0
- package/stats-card/README.md +80 -45
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
import { NgClass, NgStyle } from '@angular/common';
|
|
2
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, effect, forwardRef, inject, input, output, viewChild, } from '@angular/core';
|
|
3
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
|
+
import { NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
5
|
+
import { take } from 'rxjs/operators';
|
|
6
|
+
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
7
|
+
import { DialogService } from '@seniorsistemas/angular-components/dialog';
|
|
8
|
+
import { Editor } from '@tiptap/core';
|
|
9
|
+
import { Color } from '@tiptap/extension-color';
|
|
10
|
+
import Highlight from '@tiptap/extension-highlight';
|
|
11
|
+
import Image from '@tiptap/extension-image';
|
|
12
|
+
import Placeholder from '@tiptap/extension-placeholder';
|
|
13
|
+
import Subscript from '@tiptap/extension-subscript';
|
|
14
|
+
import Superscript from '@tiptap/extension-superscript';
|
|
15
|
+
import TextAlign from '@tiptap/extension-text-align';
|
|
16
|
+
import { TextStyle } from '@tiptap/extension-text-style';
|
|
17
|
+
import Underline from '@tiptap/extension-underline';
|
|
18
|
+
import StarterKit from '@tiptap/starter-kit';
|
|
19
|
+
import { LinkDialogComponent } from './link-dialog/link-dialog.component';
|
|
20
|
+
import { EditorToolbarButtonComponent } from './toolbar-button/editor-toolbar-button.component';
|
|
21
|
+
import * as i0 from "@angular/core";
|
|
22
|
+
import * as i1 from "@ngx-translate/core";
|
|
23
|
+
/**
|
|
24
|
+
* @description Componente de editor de texto rico (WYSIWYG) construído sobre o Tiptap/ProseMirror.
|
|
25
|
+
* Substitui o `p-editor` do PrimeNG sem dependência externa de licença comercial.
|
|
26
|
+
* Implementa {@link ControlValueAccessor} para integração com Angular Forms.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```html
|
|
30
|
+
* <s-editor
|
|
31
|
+
* formControlName="descricao"
|
|
32
|
+
* [readonly]="false"
|
|
33
|
+
* (textChange)="onTextChange($event)" />
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export class EditorComponent {
|
|
37
|
+
cdr = inject(ChangeDetectorRef);
|
|
38
|
+
dialogService = inject(DialogService);
|
|
39
|
+
translateService = inject(TranslateService);
|
|
40
|
+
destroyRef = inject(DestroyRef);
|
|
41
|
+
/**
|
|
42
|
+
* @description Coloca o editor em modo somente leitura.
|
|
43
|
+
* @default false
|
|
44
|
+
*/
|
|
45
|
+
readonly = input(false);
|
|
46
|
+
/**
|
|
47
|
+
* @description Lista de formatos habilitados na toolbar. Quando vazio, todos os formatos são exibidos.
|
|
48
|
+
*/
|
|
49
|
+
formats = input();
|
|
50
|
+
/**
|
|
51
|
+
* @description Texto de dica exibido quando o editor está vazio.
|
|
52
|
+
*/
|
|
53
|
+
placeholder = input();
|
|
54
|
+
/**
|
|
55
|
+
* @description Estilos inline aplicados ao container do editor.
|
|
56
|
+
*/
|
|
57
|
+
style = input();
|
|
58
|
+
/**
|
|
59
|
+
* @description Classes CSS adicionais aplicadas ao container do editor.
|
|
60
|
+
*/
|
|
61
|
+
styleClass = input();
|
|
62
|
+
/**
|
|
63
|
+
* @description Extensões Tiptap adicionais para estender o comportamento padrão do editor.
|
|
64
|
+
*/
|
|
65
|
+
extensions = input([]);
|
|
66
|
+
/**
|
|
67
|
+
* @description Emitido quando o editor é inicializado e está pronto para uso.
|
|
68
|
+
*/
|
|
69
|
+
editorInit = output();
|
|
70
|
+
/**
|
|
71
|
+
* @description Emitido sempre que o conteúdo do editor é alterado.
|
|
72
|
+
*/
|
|
73
|
+
textChange = output();
|
|
74
|
+
/**
|
|
75
|
+
* @description Emitido quando a seleção de texto no editor muda.
|
|
76
|
+
*/
|
|
77
|
+
selectionChange = output();
|
|
78
|
+
editorContainer = viewChild.required('editorContainer');
|
|
79
|
+
imageInput = viewChild.required('imageInput');
|
|
80
|
+
editor;
|
|
81
|
+
_formDisabled = false;
|
|
82
|
+
_currentPlaceholder = '';
|
|
83
|
+
activeStates = {
|
|
84
|
+
isBold: false,
|
|
85
|
+
isItalic: false,
|
|
86
|
+
isUnderline: false,
|
|
87
|
+
isStrike: false,
|
|
88
|
+
isBulletList: false,
|
|
89
|
+
isOrderedList: false,
|
|
90
|
+
isBlockquote: false,
|
|
91
|
+
isCode: false,
|
|
92
|
+
isSubscript: false,
|
|
93
|
+
isSuperscript: false,
|
|
94
|
+
isAlignLeft: false,
|
|
95
|
+
isAlignCenter: false,
|
|
96
|
+
isAlignRight: false,
|
|
97
|
+
currentHeading: 0,
|
|
98
|
+
currentColor: '#000000',
|
|
99
|
+
currentHighlight: 'transparent',
|
|
100
|
+
canUndo: false,
|
|
101
|
+
canRedo: false,
|
|
102
|
+
};
|
|
103
|
+
_value = '';
|
|
104
|
+
_onChange = () => { };
|
|
105
|
+
_onTouched = () => { };
|
|
106
|
+
constructor() {
|
|
107
|
+
effect(() => {
|
|
108
|
+
if (this.editor) {
|
|
109
|
+
this.editor.setEditable(!this.readonly() && !this._formDisabled);
|
|
110
|
+
this.cdr.markForCheck();
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
effect(() => {
|
|
114
|
+
this._currentPlaceholder = this.placeholder() ?? '';
|
|
115
|
+
this.editor?.view.dispatch(this.editor.state.tr);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
ngAfterViewInit() {
|
|
119
|
+
this.initEditor();
|
|
120
|
+
}
|
|
121
|
+
ngOnDestroy() {
|
|
122
|
+
this.editor?.destroy();
|
|
123
|
+
}
|
|
124
|
+
writeValue(value) {
|
|
125
|
+
this._value = value ?? '';
|
|
126
|
+
if (this.editor) {
|
|
127
|
+
this.editor.chain().setMeta('addToHistory', false).setContent(this._value, { emitUpdate: false }).run();
|
|
128
|
+
this.cdr.markForCheck();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
registerOnChange(fn) {
|
|
132
|
+
this._onChange = fn;
|
|
133
|
+
}
|
|
134
|
+
registerOnTouched(fn) {
|
|
135
|
+
this._onTouched = fn;
|
|
136
|
+
}
|
|
137
|
+
setDisabledState(isDisabled) {
|
|
138
|
+
this._formDisabled = isDisabled;
|
|
139
|
+
this.editor?.setEditable(!isDisabled && !this.readonly());
|
|
140
|
+
this.cdr.markForCheck();
|
|
141
|
+
}
|
|
142
|
+
isFormatAllowed(format) {
|
|
143
|
+
const formats = this.formats();
|
|
144
|
+
return !formats?.length || formats.includes(format);
|
|
145
|
+
}
|
|
146
|
+
hasAnyFormatBeforeUndoRedo() {
|
|
147
|
+
const formatsBeforeUndoRedo = [
|
|
148
|
+
'header', 'bold', 'italic', 'underline', 'strike', 'subscript', 'superscript',
|
|
149
|
+
'color', 'highlight', 'list', 'align', 'blockquote', 'code-block', 'link', 'image',
|
|
150
|
+
];
|
|
151
|
+
return formatsBeforeUndoRedo.some(f => this.isFormatAllowed(f));
|
|
152
|
+
}
|
|
153
|
+
toggleBold() {
|
|
154
|
+
this.editor?.chain().focus().toggleBold().run();
|
|
155
|
+
}
|
|
156
|
+
toggleItalic() {
|
|
157
|
+
this.editor?.chain().focus().toggleItalic().run();
|
|
158
|
+
}
|
|
159
|
+
toggleUnderline() {
|
|
160
|
+
this.editor?.chain().focus().toggleUnderline().run();
|
|
161
|
+
}
|
|
162
|
+
toggleStrike() {
|
|
163
|
+
this.editor?.chain().focus().toggleStrike().run();
|
|
164
|
+
}
|
|
165
|
+
toggleBulletList() {
|
|
166
|
+
this.editor?.chain().focus().toggleBulletList().run();
|
|
167
|
+
}
|
|
168
|
+
toggleOrderedList() {
|
|
169
|
+
this.editor?.chain().focus().toggleOrderedList().run();
|
|
170
|
+
}
|
|
171
|
+
toggleBlockquote() {
|
|
172
|
+
this.editor?.chain().focus().toggleBlockquote().run();
|
|
173
|
+
}
|
|
174
|
+
toggleCode() {
|
|
175
|
+
this.editor?.chain().focus().toggleCode().run();
|
|
176
|
+
}
|
|
177
|
+
toggleSubscript() {
|
|
178
|
+
this.editor?.chain().focus().toggleSubscript().run();
|
|
179
|
+
}
|
|
180
|
+
toggleSuperscript() {
|
|
181
|
+
this.editor?.chain().focus().toggleSuperscript().run();
|
|
182
|
+
}
|
|
183
|
+
setTextAlign(align) {
|
|
184
|
+
this.editor?.chain().focus().setTextAlign(align).run();
|
|
185
|
+
}
|
|
186
|
+
setColor(color) {
|
|
187
|
+
this.editor?.chain().focus().setColor(color).run();
|
|
188
|
+
}
|
|
189
|
+
setHighlight(color) {
|
|
190
|
+
this.editor?.chain().focus().setHighlight({ color }).run();
|
|
191
|
+
}
|
|
192
|
+
clearFormatting() {
|
|
193
|
+
this.editor?.chain().focus().clearNodes().unsetAllMarks().run();
|
|
194
|
+
}
|
|
195
|
+
onHeadingChange(event) {
|
|
196
|
+
const level = parseInt(event.target.value);
|
|
197
|
+
if (isNaN(level) || level === 0) {
|
|
198
|
+
this.editor?.chain().focus().setParagraph().run();
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
this.editor?.chain().focus().setHeading({ level }).run();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
setLink() {
|
|
205
|
+
const existingUrl = this.editor?.getAttributes('link')['href'] ?? '';
|
|
206
|
+
const ref = this.dialogService.open(LinkDialogComponent, { size: 'sm' });
|
|
207
|
+
ref.componentInstance.initialUrl = existingUrl;
|
|
208
|
+
ref.closed
|
|
209
|
+
.pipe(take(1), takeUntilDestroyed(this.destroyRef))
|
|
210
|
+
.subscribe((url) => {
|
|
211
|
+
if (url === '') {
|
|
212
|
+
this.editor?.chain().focus().extendMarkRange('link').unsetLink().run();
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
this.editor?.chain().focus().extendMarkRange('link').setLink({ href: url }).run();
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
setImage() {
|
|
220
|
+
this.imageInput().nativeElement.click();
|
|
221
|
+
}
|
|
222
|
+
onImageFileSelected(event) {
|
|
223
|
+
const input = event.target;
|
|
224
|
+
const file = input.files?.[0];
|
|
225
|
+
if (!file)
|
|
226
|
+
return;
|
|
227
|
+
const reader = new FileReader();
|
|
228
|
+
reader.onload = (e) => {
|
|
229
|
+
const src = e.target?.result;
|
|
230
|
+
this.editor?.chain().focus().setImage({ src }).run();
|
|
231
|
+
input.value = '';
|
|
232
|
+
this.cdr.markForCheck();
|
|
233
|
+
};
|
|
234
|
+
reader.readAsDataURL(file);
|
|
235
|
+
}
|
|
236
|
+
undo() {
|
|
237
|
+
this.editor?.chain().focus().undo().run();
|
|
238
|
+
}
|
|
239
|
+
redo() {
|
|
240
|
+
this.editor?.chain().focus().redo().run();
|
|
241
|
+
}
|
|
242
|
+
onToolbarKeydown(event) {
|
|
243
|
+
if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key))
|
|
244
|
+
return;
|
|
245
|
+
event.preventDefault();
|
|
246
|
+
const toolbar = event.currentTarget;
|
|
247
|
+
const focusable = this.getToolbarFocusable(toolbar);
|
|
248
|
+
if (!focusable.length)
|
|
249
|
+
return;
|
|
250
|
+
const currentIndex = focusable.findIndex(el => el === document.activeElement);
|
|
251
|
+
let nextIndex;
|
|
252
|
+
switch (event.key) {
|
|
253
|
+
case 'ArrowRight':
|
|
254
|
+
nextIndex = (currentIndex + 1) % focusable.length;
|
|
255
|
+
break;
|
|
256
|
+
case 'ArrowLeft':
|
|
257
|
+
nextIndex = (currentIndex - 1 + focusable.length) % focusable.length;
|
|
258
|
+
break;
|
|
259
|
+
case 'Home':
|
|
260
|
+
nextIndex = 0;
|
|
261
|
+
break;
|
|
262
|
+
default:
|
|
263
|
+
nextIndex = focusable.length - 1;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
focusable.forEach((el, i) => el.setAttribute('tabindex', i === nextIndex ? '0' : '-1'));
|
|
267
|
+
focusable[nextIndex].focus();
|
|
268
|
+
}
|
|
269
|
+
onToolbarFocusIn(event) {
|
|
270
|
+
const target = event.target;
|
|
271
|
+
const toolbar = event.currentTarget;
|
|
272
|
+
const focusable = this.getToolbarFocusable(toolbar);
|
|
273
|
+
if (focusable.includes(target)) {
|
|
274
|
+
focusable.forEach(el => el.setAttribute('tabindex', el === target ? '0' : '-1'));
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
getToolbarFocusable(toolbar) {
|
|
278
|
+
return Array.from(toolbar.querySelectorAll('button:not([disabled]), select, label[tabindex]'));
|
|
279
|
+
}
|
|
280
|
+
initEditor() {
|
|
281
|
+
this.editor = new Editor({
|
|
282
|
+
element: this.editorContainer().nativeElement,
|
|
283
|
+
extensions: [
|
|
284
|
+
StarterKit.configure({
|
|
285
|
+
link: { openOnClick: false },
|
|
286
|
+
underline: false,
|
|
287
|
+
}),
|
|
288
|
+
Underline,
|
|
289
|
+
Image,
|
|
290
|
+
TextAlign.configure({ types: ['heading', 'paragraph'] }),
|
|
291
|
+
TextStyle,
|
|
292
|
+
Color,
|
|
293
|
+
Highlight.configure({ multicolor: true }),
|
|
294
|
+
Placeholder.configure({ placeholder: () => this._currentPlaceholder }),
|
|
295
|
+
Subscript,
|
|
296
|
+
Superscript,
|
|
297
|
+
...this.extensions(),
|
|
298
|
+
],
|
|
299
|
+
content: this._value,
|
|
300
|
+
editable: !this.readonly(),
|
|
301
|
+
editorProps: {
|
|
302
|
+
attributes: {
|
|
303
|
+
role: 'textbox',
|
|
304
|
+
'aria-multiline': 'true',
|
|
305
|
+
'aria-label': this.translateService.instant('platform.angular_components.editor_content_area'),
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
onUpdate: ({ editor }) => {
|
|
309
|
+
const html = editor.getHTML();
|
|
310
|
+
const text = editor.getText();
|
|
311
|
+
this._value = html;
|
|
312
|
+
this._onChange(html);
|
|
313
|
+
this.textChange.emit({ htmlValue: html, textValue: text });
|
|
314
|
+
this.syncActiveStates();
|
|
315
|
+
this.cdr.markForCheck();
|
|
316
|
+
},
|
|
317
|
+
onBlur: () => {
|
|
318
|
+
this._onTouched();
|
|
319
|
+
},
|
|
320
|
+
onSelectionUpdate: ({ editor }) => {
|
|
321
|
+
this.syncActiveStates();
|
|
322
|
+
const { from, to, empty } = editor.state.selection;
|
|
323
|
+
this.selectionChange.emit({ from, to, empty });
|
|
324
|
+
this.cdr.markForCheck();
|
|
325
|
+
},
|
|
326
|
+
});
|
|
327
|
+
this.syncActiveStates();
|
|
328
|
+
this.cdr.markForCheck();
|
|
329
|
+
this.editorInit.emit(this.editor);
|
|
330
|
+
}
|
|
331
|
+
syncActiveStates() {
|
|
332
|
+
if (!this.editor)
|
|
333
|
+
return;
|
|
334
|
+
const e = this.editor;
|
|
335
|
+
this.activeStates = {
|
|
336
|
+
isBold: e.isActive('bold'),
|
|
337
|
+
isItalic: e.isActive('italic'),
|
|
338
|
+
isUnderline: e.isActive('underline'),
|
|
339
|
+
isStrike: e.isActive('strike'),
|
|
340
|
+
isBulletList: e.isActive('bulletList'),
|
|
341
|
+
isOrderedList: e.isActive('orderedList'),
|
|
342
|
+
isBlockquote: e.isActive('blockquote'),
|
|
343
|
+
isCode: e.isActive('code'),
|
|
344
|
+
isSubscript: e.isActive('subscript'),
|
|
345
|
+
isSuperscript: e.isActive('superscript'),
|
|
346
|
+
isAlignLeft: e.isActive({ textAlign: 'left' }),
|
|
347
|
+
isAlignCenter: e.isActive({ textAlign: 'center' }),
|
|
348
|
+
isAlignRight: e.isActive({ textAlign: 'right' }),
|
|
349
|
+
currentHeading: [1, 2, 3].find((level) => e.isActive('heading', { level })) ?? 0,
|
|
350
|
+
currentColor: e.getAttributes('textStyle')['color'] || '#000000',
|
|
351
|
+
currentHighlight: e.getAttributes('highlight')['color'] || 'transparent',
|
|
352
|
+
canUndo: e.can().undo(),
|
|
353
|
+
canRedo: e.can().redo(),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
357
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: EditorComponent, isStandalone: true, selector: "s-editor", inputs: { readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, formats: { classPropertyName: "formats", publicName: "formats", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, style: { classPropertyName: "style", publicName: "style", isSignal: true, isRequired: false, transformFunction: null }, styleClass: { classPropertyName: "styleClass", publicName: "styleClass", isSignal: true, isRequired: false, transformFunction: null }, extensions: { classPropertyName: "extensions", publicName: "extensions", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { editorInit: "editorInit", textChange: "textChange", selectionChange: "selectionChange" }, providers: [
|
|
358
|
+
{
|
|
359
|
+
provide: NG_VALUE_ACCESSOR,
|
|
360
|
+
useExisting: forwardRef(() => EditorComponent),
|
|
361
|
+
multi: true,
|
|
362
|
+
},
|
|
363
|
+
], viewQueries: [{ propertyName: "editorContainer", first: true, predicate: ["editorContainer"], descendants: true, isSignal: true }, { propertyName: "imageInput", first: true, predicate: ["imageInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"rounded bg-white flex flex-col border border-grayscale-30 transition-[border-color,box-shadow] duration-150 focus-within:border-[#5c5ce6] focus-within:shadow-[0_0_0_2px_rgba(92,92,230,0.15)]\"\n [ngClass]=\"styleClass()\"\n [ngStyle]=\"style()\"\n [class.s-editor--readonly]=\"readonly()\"\n>\n @if (!readonly()) {\n <div\n class=\"rounded-t flex flex-wrap items-center gap-0.5 border-b border-grayscale-30 bg-[#f9f9fb] px-2 py-1.5\"\n role=\"toolbar\"\n [attr.aria-label]=\"'platform.angular_components.editor_toolbar' | translate\"\n (keydown)=\"onToolbarKeydown($event)\"\n (focusin)=\"onToolbarFocusIn($event)\"\n >\n @if (isFormatAllowed('header')) {\n <select\n class=\"rounded bg-white h-7 cursor-pointer border border-grayscale-30 px-1.5 text-[13px] text-[#3d3d4d] outline-none transition-colors duration-150 focus:border-[#5c5ce6]\"\n (change)=\"onHeadingChange($event)\"\n [attr.aria-label]=\"'platform.angular_components.editor_heading_level' | translate\"\n >\n <option\n [value]=\"0\"\n [selected]=\"activeStates.currentHeading === 0\"\n >\n {{ 'platform.angular_components.editor_heading_normal' | translate }}\n </option>\n <option\n [value]=\"1\"\n [selected]=\"activeStates.currentHeading === 1\"\n >\n {{ 'platform.angular_components.editor_heading_1' | translate }}\n </option>\n <option\n [value]=\"2\"\n [selected]=\"activeStates.currentHeading === 2\"\n >\n {{ 'platform.angular_components.editor_heading_2' | translate }}\n </option>\n <option\n [value]=\"3\"\n [selected]=\"activeStates.currentHeading === 3\"\n >\n {{ 'platform.angular_components.editor_heading_3' | translate }}\n </option>\n </select>\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n }\n\n @if (isFormatAllowed('bold')) {\n <s-editor-toolbar-button\n icon=\"fa fa-bold\"\n [label]=\"'platform.angular_components.editor_bold' | translate\"\n [active]=\"activeStates.isBold\"\n (clicked)=\"toggleBold()\"\n />\n }\n\n @if (isFormatAllowed('italic')) {\n <s-editor-toolbar-button\n icon=\"fa fa-italic\"\n [label]=\"'platform.angular_components.editor_italic' | translate\"\n [active]=\"activeStates.isItalic\"\n (clicked)=\"toggleItalic()\"\n />\n }\n\n @if (isFormatAllowed('underline')) {\n <s-editor-toolbar-button\n icon=\"fa fa-underline\"\n [label]=\"'platform.angular_components.editor_underline' | translate\"\n [active]=\"activeStates.isUnderline\"\n (clicked)=\"toggleUnderline()\"\n />\n }\n\n @if (isFormatAllowed('strike')) {\n <s-editor-toolbar-button\n icon=\"fa fa-strikethrough\"\n [label]=\"'platform.angular_components.editor_strikethrough' | translate\"\n [active]=\"activeStates.isStrike\"\n (clicked)=\"toggleStrike()\"\n />\n }\n\n @if (isFormatAllowed('subscript')) {\n <s-editor-toolbar-button\n icon=\"fa fa-subscript\"\n [label]=\"'platform.angular_components.editor_subscript' | translate\"\n [active]=\"activeStates.isSubscript\"\n (clicked)=\"toggleSubscript()\"\n />\n }\n\n @if (isFormatAllowed('superscript')) {\n <s-editor-toolbar-button\n icon=\"fa fa-superscript\"\n [label]=\"'platform.angular_components.editor_superscript' | translate\"\n [active]=\"activeStates.isSuperscript\"\n (clicked)=\"toggleSuperscript()\"\n />\n }\n\n @if (isFormatAllowed('color')) {\n <label\n tabindex=\"0\"\n class=\"relative flex h-7 w-7 cursor-pointer items-center justify-center rounded bg-white transition-colors duration-150 hover:bg-[#f0f0f8]\"\n [attr.title]=\"'platform.angular_components.editor_text_color' | translate\"\n [attr.aria-label]=\"'platform.angular_components.editor_text_color' | translate\"\n (keydown.enter)=\"$event.preventDefault(); colorInput.click()\"\n (keydown.space)=\"$event.preventDefault(); colorInput.click()\"\n >\n <span class=\"flex flex-col items-center gap-px\">\n <i class=\"fa fa-font text-[11px] text-[#3d3d4d]\"></i>\n <span\n class=\"h-[3px] w-3.5 rounded-sm\"\n [style.background-color]=\"activeStates.currentColor\"\n ></span>\n </span>\n <input\n #colorInput\n type=\"color\"\n class=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n [value]=\"activeStates.currentColor\"\n (input)=\"setColor($any($event.target).value)\"\n />\n </label>\n }\n\n @if (isFormatAllowed('highlight')) {\n <label\n tabindex=\"0\"\n class=\"relative flex h-7 w-7 cursor-pointer items-center justify-center rounded bg-white transition-colors duration-150 hover:bg-[#f0f0f8]\"\n [attr.title]=\"'platform.angular_components.editor_background_color' | translate\"\n [attr.aria-label]=\"'platform.angular_components.editor_background_color' | translate\"\n (keydown.enter)=\"$event.preventDefault(); highlightInput.click()\"\n (keydown.space)=\"$event.preventDefault(); highlightInput.click()\"\n >\n <span class=\"flex flex-col items-center gap-px\">\n <i class=\"fa fa-highlighter text-[11px] text-[#3d3d4d]\"></i>\n <span\n class=\"h-[3px] w-3.5 rounded-sm\"\n [style.background-color]=\"activeStates.currentHighlight === 'transparent' ? '#ffff00' : activeStates.currentHighlight\"\n ></span>\n </span>\n <input\n #highlightInput\n type=\"color\"\n class=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n [value]=\"activeStates.currentHighlight === 'transparent' ? '#ffff00' : activeStates.currentHighlight\"\n (input)=\"setHighlight($any($event.target).value)\"\n />\n </label>\n }\n\n @if (isFormatAllowed('list')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-list-ul\"\n [label]=\"'platform.angular_components.editor_bullet_list' | translate\"\n [active]=\"activeStates.isBulletList\"\n (clicked)=\"toggleBulletList()\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-list-ol\"\n [label]=\"'platform.angular_components.editor_ordered_list' | translate\"\n [active]=\"activeStates.isOrderedList\"\n (clicked)=\"toggleOrderedList()\"\n />\n }\n\n @if (isFormatAllowed('align')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-align-left\"\n [label]=\"'platform.angular_components.editor_align_left' | translate\"\n [active]=\"activeStates.isAlignLeft\"\n (clicked)=\"setTextAlign('left')\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-align-center\"\n [label]=\"'platform.angular_components.editor_align_center' | translate\"\n [active]=\"activeStates.isAlignCenter\"\n (clicked)=\"setTextAlign('center')\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-align-right\"\n [label]=\"'platform.angular_components.editor_align_right' | translate\"\n [active]=\"activeStates.isAlignRight\"\n (clicked)=\"setTextAlign('right')\"\n />\n }\n\n @if (isFormatAllowed('blockquote')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-quote-right\"\n [label]=\"'platform.angular_components.editor_blockquote' | translate\"\n [active]=\"activeStates.isBlockquote\"\n (clicked)=\"toggleBlockquote()\"\n />\n }\n\n @if (isFormatAllowed('code-block')) {\n <s-editor-toolbar-button\n icon=\"fa fa-code\"\n [label]=\"'platform.angular_components.editor_inline_code' | translate\"\n [active]=\"activeStates.isCode\"\n (clicked)=\"toggleCode()\"\n />\n }\n\n @if (isFormatAllowed('link')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-link\"\n [label]=\"'platform.angular_components.editor_insert_link' | translate\"\n (clicked)=\"setLink()\"\n />\n }\n\n @if (isFormatAllowed('image')) {\n <s-editor-toolbar-button\n icon=\"fa fa-image\"\n [label]=\"'platform.angular_components.editor_insert_image' | translate\"\n (clicked)=\"setImage()\"\n />\n }\n\n @if (hasAnyFormatBeforeUndoRedo()) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n }\n\n <s-editor-toolbar-button\n icon=\"fa fa-undo\"\n [label]=\"('platform.angular_components.editor_undo' | translate) + ' (Ctrl+Z)'\"\n [disabled]=\"!activeStates.canUndo\"\n (clicked)=\"undo()\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-redo\"\n [label]=\"('platform.angular_components.editor_redo' | translate) + ' (Ctrl+Y)'\"\n [disabled]=\"!activeStates.canRedo\"\n (clicked)=\"redo()\"\n />\n\n @if (isFormatAllowed('clean')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-remove-format\"\n [label]=\"'platform.angular_components.editor_clear_formatting' | translate\"\n (clicked)=\"clearFormatting()\"\n />\n }\n </div>\n }\n\n <div\n #editorContainer\n class=\"s-editor-content flex-1\"\n ></div>\n <input\n #imageInput\n type=\"file\"\n accept=\"image/*\"\n style=\"display: none\"\n aria-hidden=\"true\"\n (change)=\"onImageFileSelected($event)\"\n />\n</div>\n", styles: [".s-editor--readonly ::ng-deep .ProseMirror{cursor:default}.s-editor-content ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:#9ca3af;pointer-events:none;float:left;height:0}.s-editor-content ::ng-deep .ProseMirror{padding:12px 16px;min-height:150px;outline:none!important;color:#1e1e2e;font-size:14px;line-height:1.6}.s-editor-content ::ng-deep .ProseMirror>*+*{margin-top:.5em}.s-editor-content ::ng-deep .ProseMirror p{margin:0}.s-editor-content ::ng-deep .ProseMirror h1{font-size:1.75em;font-weight:700;line-height:1.2;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h1:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror h2{font-size:1.4em;font-weight:600;line-height:1.3;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h2:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror h3{font-size:1.15em;font-weight:600;line-height:1.4;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h3:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror ul{list-style:disc;padding-left:1.5em}.s-editor-content ::ng-deep .ProseMirror ol{list-style:decimal;padding-left:1.5em}.s-editor-content ::ng-deep .ProseMirror li{margin:.2em 0}.s-editor-content ::ng-deep .ProseMirror li p{margin:0}.s-editor-content ::ng-deep .ProseMirror blockquote{border-left:3px solid #5c5ce6;padding-left:1em;margin:.75em 0;color:#6b6b80;font-style:italic}.s-editor-content ::ng-deep .ProseMirror code{background:#f0f0f8;border-radius:3px;padding:.15em .4em;font-family:Courier New,Courier,monospace;font-size:.875em;color:#c026d3}.s-editor-content ::ng-deep .ProseMirror pre{background:#1e1e2e;color:#cdd6f4;border-radius:6px;padding:1em 1.25em;overflow-x:auto;font-family:Courier New,Courier,monospace;font-size:.875em;line-height:1.5}.s-editor-content ::ng-deep .ProseMirror pre code{background:none;padding:0;color:inherit;font-size:inherit}.s-editor-content ::ng-deep .ProseMirror a{color:#5c5ce6;text-decoration:underline;cursor:pointer}.s-editor-content ::ng-deep .ProseMirror a:hover{color:#4040b0}.s-editor-content ::ng-deep .ProseMirror img{max-width:100%;height:auto;border-radius:4px;display:block}.s-editor-content ::ng-deep .ProseMirror hr{border:none;border-top:2px solid #e8e8f0;margin:1em 0}.s-editor-content ::ng-deep .ProseMirror sub{font-size:.75em;vertical-align:sub}.s-editor-content ::ng-deep .ProseMirror sup{font-size:.75em;vertical-align:super}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: EditorToolbarButtonComponent, selector: "s-editor-toolbar-button", inputs: ["icon", "label", "active", "disabled"], outputs: ["clicked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
364
|
+
}
|
|
365
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EditorComponent, decorators: [{
|
|
366
|
+
type: Component,
|
|
367
|
+
args: [{ selector: 's-editor', standalone: true, imports: [NgClass, NgStyle, TranslateModule, EditorToolbarButtonComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
368
|
+
{
|
|
369
|
+
provide: NG_VALUE_ACCESSOR,
|
|
370
|
+
useExisting: forwardRef(() => EditorComponent),
|
|
371
|
+
multi: true,
|
|
372
|
+
},
|
|
373
|
+
], template: "<div\n class=\"rounded bg-white flex flex-col border border-grayscale-30 transition-[border-color,box-shadow] duration-150 focus-within:border-[#5c5ce6] focus-within:shadow-[0_0_0_2px_rgba(92,92,230,0.15)]\"\n [ngClass]=\"styleClass()\"\n [ngStyle]=\"style()\"\n [class.s-editor--readonly]=\"readonly()\"\n>\n @if (!readonly()) {\n <div\n class=\"rounded-t flex flex-wrap items-center gap-0.5 border-b border-grayscale-30 bg-[#f9f9fb] px-2 py-1.5\"\n role=\"toolbar\"\n [attr.aria-label]=\"'platform.angular_components.editor_toolbar' | translate\"\n (keydown)=\"onToolbarKeydown($event)\"\n (focusin)=\"onToolbarFocusIn($event)\"\n >\n @if (isFormatAllowed('header')) {\n <select\n class=\"rounded bg-white h-7 cursor-pointer border border-grayscale-30 px-1.5 text-[13px] text-[#3d3d4d] outline-none transition-colors duration-150 focus:border-[#5c5ce6]\"\n (change)=\"onHeadingChange($event)\"\n [attr.aria-label]=\"'platform.angular_components.editor_heading_level' | translate\"\n >\n <option\n [value]=\"0\"\n [selected]=\"activeStates.currentHeading === 0\"\n >\n {{ 'platform.angular_components.editor_heading_normal' | translate }}\n </option>\n <option\n [value]=\"1\"\n [selected]=\"activeStates.currentHeading === 1\"\n >\n {{ 'platform.angular_components.editor_heading_1' | translate }}\n </option>\n <option\n [value]=\"2\"\n [selected]=\"activeStates.currentHeading === 2\"\n >\n {{ 'platform.angular_components.editor_heading_2' | translate }}\n </option>\n <option\n [value]=\"3\"\n [selected]=\"activeStates.currentHeading === 3\"\n >\n {{ 'platform.angular_components.editor_heading_3' | translate }}\n </option>\n </select>\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n }\n\n @if (isFormatAllowed('bold')) {\n <s-editor-toolbar-button\n icon=\"fa fa-bold\"\n [label]=\"'platform.angular_components.editor_bold' | translate\"\n [active]=\"activeStates.isBold\"\n (clicked)=\"toggleBold()\"\n />\n }\n\n @if (isFormatAllowed('italic')) {\n <s-editor-toolbar-button\n icon=\"fa fa-italic\"\n [label]=\"'platform.angular_components.editor_italic' | translate\"\n [active]=\"activeStates.isItalic\"\n (clicked)=\"toggleItalic()\"\n />\n }\n\n @if (isFormatAllowed('underline')) {\n <s-editor-toolbar-button\n icon=\"fa fa-underline\"\n [label]=\"'platform.angular_components.editor_underline' | translate\"\n [active]=\"activeStates.isUnderline\"\n (clicked)=\"toggleUnderline()\"\n />\n }\n\n @if (isFormatAllowed('strike')) {\n <s-editor-toolbar-button\n icon=\"fa fa-strikethrough\"\n [label]=\"'platform.angular_components.editor_strikethrough' | translate\"\n [active]=\"activeStates.isStrike\"\n (clicked)=\"toggleStrike()\"\n />\n }\n\n @if (isFormatAllowed('subscript')) {\n <s-editor-toolbar-button\n icon=\"fa fa-subscript\"\n [label]=\"'platform.angular_components.editor_subscript' | translate\"\n [active]=\"activeStates.isSubscript\"\n (clicked)=\"toggleSubscript()\"\n />\n }\n\n @if (isFormatAllowed('superscript')) {\n <s-editor-toolbar-button\n icon=\"fa fa-superscript\"\n [label]=\"'platform.angular_components.editor_superscript' | translate\"\n [active]=\"activeStates.isSuperscript\"\n (clicked)=\"toggleSuperscript()\"\n />\n }\n\n @if (isFormatAllowed('color')) {\n <label\n tabindex=\"0\"\n class=\"relative flex h-7 w-7 cursor-pointer items-center justify-center rounded bg-white transition-colors duration-150 hover:bg-[#f0f0f8]\"\n [attr.title]=\"'platform.angular_components.editor_text_color' | translate\"\n [attr.aria-label]=\"'platform.angular_components.editor_text_color' | translate\"\n (keydown.enter)=\"$event.preventDefault(); colorInput.click()\"\n (keydown.space)=\"$event.preventDefault(); colorInput.click()\"\n >\n <span class=\"flex flex-col items-center gap-px\">\n <i class=\"fa fa-font text-[11px] text-[#3d3d4d]\"></i>\n <span\n class=\"h-[3px] w-3.5 rounded-sm\"\n [style.background-color]=\"activeStates.currentColor\"\n ></span>\n </span>\n <input\n #colorInput\n type=\"color\"\n class=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n [value]=\"activeStates.currentColor\"\n (input)=\"setColor($any($event.target).value)\"\n />\n </label>\n }\n\n @if (isFormatAllowed('highlight')) {\n <label\n tabindex=\"0\"\n class=\"relative flex h-7 w-7 cursor-pointer items-center justify-center rounded bg-white transition-colors duration-150 hover:bg-[#f0f0f8]\"\n [attr.title]=\"'platform.angular_components.editor_background_color' | translate\"\n [attr.aria-label]=\"'platform.angular_components.editor_background_color' | translate\"\n (keydown.enter)=\"$event.preventDefault(); highlightInput.click()\"\n (keydown.space)=\"$event.preventDefault(); highlightInput.click()\"\n >\n <span class=\"flex flex-col items-center gap-px\">\n <i class=\"fa fa-highlighter text-[11px] text-[#3d3d4d]\"></i>\n <span\n class=\"h-[3px] w-3.5 rounded-sm\"\n [style.background-color]=\"activeStates.currentHighlight === 'transparent' ? '#ffff00' : activeStates.currentHighlight\"\n ></span>\n </span>\n <input\n #highlightInput\n type=\"color\"\n class=\"absolute inset-0 h-full w-full cursor-pointer opacity-0\"\n [value]=\"activeStates.currentHighlight === 'transparent' ? '#ffff00' : activeStates.currentHighlight\"\n (input)=\"setHighlight($any($event.target).value)\"\n />\n </label>\n }\n\n @if (isFormatAllowed('list')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-list-ul\"\n [label]=\"'platform.angular_components.editor_bullet_list' | translate\"\n [active]=\"activeStates.isBulletList\"\n (clicked)=\"toggleBulletList()\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-list-ol\"\n [label]=\"'platform.angular_components.editor_ordered_list' | translate\"\n [active]=\"activeStates.isOrderedList\"\n (clicked)=\"toggleOrderedList()\"\n />\n }\n\n @if (isFormatAllowed('align')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-align-left\"\n [label]=\"'platform.angular_components.editor_align_left' | translate\"\n [active]=\"activeStates.isAlignLeft\"\n (clicked)=\"setTextAlign('left')\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-align-center\"\n [label]=\"'platform.angular_components.editor_align_center' | translate\"\n [active]=\"activeStates.isAlignCenter\"\n (clicked)=\"setTextAlign('center')\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-align-right\"\n [label]=\"'platform.angular_components.editor_align_right' | translate\"\n [active]=\"activeStates.isAlignRight\"\n (clicked)=\"setTextAlign('right')\"\n />\n }\n\n @if (isFormatAllowed('blockquote')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-quote-right\"\n [label]=\"'platform.angular_components.editor_blockquote' | translate\"\n [active]=\"activeStates.isBlockquote\"\n (clicked)=\"toggleBlockquote()\"\n />\n }\n\n @if (isFormatAllowed('code-block')) {\n <s-editor-toolbar-button\n icon=\"fa fa-code\"\n [label]=\"'platform.angular_components.editor_inline_code' | translate\"\n [active]=\"activeStates.isCode\"\n (clicked)=\"toggleCode()\"\n />\n }\n\n @if (isFormatAllowed('link')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-link\"\n [label]=\"'platform.angular_components.editor_insert_link' | translate\"\n (clicked)=\"setLink()\"\n />\n }\n\n @if (isFormatAllowed('image')) {\n <s-editor-toolbar-button\n icon=\"fa fa-image\"\n [label]=\"'platform.angular_components.editor_insert_image' | translate\"\n (clicked)=\"setImage()\"\n />\n }\n\n @if (hasAnyFormatBeforeUndoRedo()) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n }\n\n <s-editor-toolbar-button\n icon=\"fa fa-undo\"\n [label]=\"('platform.angular_components.editor_undo' | translate) + ' (Ctrl+Z)'\"\n [disabled]=\"!activeStates.canUndo\"\n (clicked)=\"undo()\"\n />\n <s-editor-toolbar-button\n icon=\"fa fa-redo\"\n [label]=\"('platform.angular_components.editor_redo' | translate) + ' (Ctrl+Y)'\"\n [disabled]=\"!activeStates.canRedo\"\n (clicked)=\"redo()\"\n />\n\n @if (isFormatAllowed('clean')) {\n <span class=\"mx-1 inline-block h-5 w-px shrink-0 bg-[#d1d1dc]\"></span>\n <s-editor-toolbar-button\n icon=\"fa fa-remove-format\"\n [label]=\"'platform.angular_components.editor_clear_formatting' | translate\"\n (clicked)=\"clearFormatting()\"\n />\n }\n </div>\n }\n\n <div\n #editorContainer\n class=\"s-editor-content flex-1\"\n ></div>\n <input\n #imageInput\n type=\"file\"\n accept=\"image/*\"\n style=\"display: none\"\n aria-hidden=\"true\"\n (change)=\"onImageFileSelected($event)\"\n />\n</div>\n", styles: [".s-editor--readonly ::ng-deep .ProseMirror{cursor:default}.s-editor-content ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:#9ca3af;pointer-events:none;float:left;height:0}.s-editor-content ::ng-deep .ProseMirror{padding:12px 16px;min-height:150px;outline:none!important;color:#1e1e2e;font-size:14px;line-height:1.6}.s-editor-content ::ng-deep .ProseMirror>*+*{margin-top:.5em}.s-editor-content ::ng-deep .ProseMirror p{margin:0}.s-editor-content ::ng-deep .ProseMirror h1{font-size:1.75em;font-weight:700;line-height:1.2;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h1:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror h2{font-size:1.4em;font-weight:600;line-height:1.3;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h2:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror h3{font-size:1.15em;font-weight:600;line-height:1.4;margin:.75em 0 .25em}.s-editor-content ::ng-deep .ProseMirror h3:first-child{margin-top:0}.s-editor-content ::ng-deep .ProseMirror ul{list-style:disc;padding-left:1.5em}.s-editor-content ::ng-deep .ProseMirror ol{list-style:decimal;padding-left:1.5em}.s-editor-content ::ng-deep .ProseMirror li{margin:.2em 0}.s-editor-content ::ng-deep .ProseMirror li p{margin:0}.s-editor-content ::ng-deep .ProseMirror blockquote{border-left:3px solid #5c5ce6;padding-left:1em;margin:.75em 0;color:#6b6b80;font-style:italic}.s-editor-content ::ng-deep .ProseMirror code{background:#f0f0f8;border-radius:3px;padding:.15em .4em;font-family:Courier New,Courier,monospace;font-size:.875em;color:#c026d3}.s-editor-content ::ng-deep .ProseMirror pre{background:#1e1e2e;color:#cdd6f4;border-radius:6px;padding:1em 1.25em;overflow-x:auto;font-family:Courier New,Courier,monospace;font-size:.875em;line-height:1.5}.s-editor-content ::ng-deep .ProseMirror pre code{background:none;padding:0;color:inherit;font-size:inherit}.s-editor-content ::ng-deep .ProseMirror a{color:#5c5ce6;text-decoration:underline;cursor:pointer}.s-editor-content ::ng-deep .ProseMirror a:hover{color:#4040b0}.s-editor-content ::ng-deep .ProseMirror img{max-width:100%;height:auto;border-radius:4px;display:block}.s-editor-content ::ng-deep .ProseMirror hr{border:none;border-top:2px solid #e8e8f0;margin:1em 0}.s-editor-content ::ng-deep .ProseMirror sub{font-size:.75em;vertical-align:sub}.s-editor-content ::ng-deep .ProseMirror sup{font-size:.75em;vertical-align:super}\n"] }]
|
|
374
|
+
}], ctorParameters: () => [] });
|
|
375
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9lZGl0b3Ivc3JjL2xpYi9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9lZGl0b3Ivc3JjL2xpYi9lZGl0b3IvZWRpdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDbkQsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFHVixNQUFNLEVBQ04sVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRDLE9BQU8sRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDaEQsT0FBTyxTQUFTLE1BQU0sNkJBQTZCLENBQUM7QUFDcEQsT0FBTyxLQUFLLE1BQU0seUJBQXlCLENBQUM7QUFDNUMsT0FBTyxXQUFXLE1BQU0sK0JBQStCLENBQUM7QUFDeEQsT0FBTyxTQUFTLE1BQU0sNkJBQTZC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QUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDaEYsWUFBWSxFQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFZLElBQUksU0FBUztZQUM1RSxnQkFBZ0IsRUFBRyxDQUFDLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBWSxJQUFJLGFBQWE7WUFDcEYsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUU7WUFDdkIsT0FBTyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUU7U0FDMUIsQ0FBQztJQUNOLENBQUM7d0dBNVdRLGVBQWU7NEZBQWYsZUFBZSx1N0JBUmI7WUFDUDtnQkFDSSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDOUMsS0FBSyxFQUFFLElBQUk7YUFDZDtTQUNKLHlRQ2hFTCw4NFlBNlFBLHc5RUR2TmMsT0FBTyxvRkFBRSxPQUFPLDBFQUFFLGVBQWUsNEZBQUUsNEJBQTRCOzs0RkFZaEUsZUFBZTtrQkFmM0IsU0FBUzsrQkFDSSxVQUFVLGNBQ1IsSUFBSSxXQUNQLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsNEJBQTRCLENBQUMsbUJBR3pELHVCQUF1QixDQUFDLE1BQU0sYUFDcEM7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7NEJBQzlDLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdDbGFzcywgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgZWZmZWN0LFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIGlucHV0LFxuICAgIG91dHB1dCxcbiAgICB2aWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlLCBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBEaWFsb2dTZXJ2aWNlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9kaWFsb2cnO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnQHRpcHRhcC9jb3JlJztcbmltcG9ydCB7IENvbG9yIH0gZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tY29sb3InO1xuaW1wb3J0IEhpZ2hsaWdodCBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1oaWdobGlnaHQnO1xuaW1wb3J0IEltYWdlIGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWltYWdlJztcbmltcG9ydCBQbGFjZWhvbGRlciBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1wbGFjZWhvbGRlcic7XG5pbXBvcnQgU3Vic2NyaXB0IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXN1YnNjcmlwdCc7XG5pbXBvcnQgU3VwZXJzY3JpcHQgZnJvbSAnQHRpcHRhcC9leHRlbnNpb24tc3VwZXJzY3JpcHQnO1xuaW1wb3J0IFRleHRBbGlnbiBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi10ZXh0LWFsaWduJztcbmltcG9ydCB7IFRleHRTdHlsZSB9IGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLXRleHQtc3R5bGUnO1xuaW1wb3J0IFVuZGVybGluZSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi11bmRlcmxpbmUnO1xuaW1wb3J0IFN0YXJ0ZXJLaXQgZnJvbSAnQHRpcHRhcC9zdGFydGVyLWtpdCc7XG5cbmltcG9ydCB7IExpbmtEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2xpbmstZGlhbG9nL2xpbmstZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFZGl0b3JGb3JtYXQsIEVkaXRvclNlbGVjdGlvbkNoYW5nZUV2ZW50LCBFZGl0b3JUZXh0Q2hhbmdlRXZlbnQsIEV4dGVuc2lvbiB9IGZyb20gJy4vbW9kZWxzJztcbmltcG9ydCB7IEVkaXRvclRvb2xiYXJCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL3Rvb2xiYXItYnV0dG9uL2VkaXRvci10b29sYmFyLWJ1dHRvbi5jb21wb25lbnQnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb21wb25lbnRlIGRlIGVkaXRvciBkZSB0ZXh0byByaWNvIChXWVNJV1lHKSBjb25zdHJ1w61kbyBzb2JyZSBvIFRpcHRhcC9Qcm9zZU1pcnJvci5cbiAqIFN1YnN0aXR1aSBvIGBwLWVkaXRvcmAgZG8gUHJpbWVORyBzZW0gZGVwZW5kw6puY2lhIGV4dGVybmEgZGUgbGljZW7Dp2EgY29tZXJjaWFsLlxuICogSW1wbGVtZW50YSB7QGxpbmsgQ29udHJvbFZhbHVlQWNjZXNzb3J9IHBhcmEgaW50ZWdyYcOnw6NvIGNvbSBBbmd1bGFyIEZvcm1zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8cy1lZGl0b3JcbiAqICAgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpY2FvXCJcbiAqICAgW3JlYWRvbmx5XT1cImZhbHNlXCJcbiAqICAgKHRleHRDaGFuZ2UpPVwib25UZXh0Q2hhbmdlKCRldmVudClcIiAvPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncy1lZGl0b3InLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW05nQ2xhc3MsIE5nU3R5bGUsIFRyYW5zbGF0ZU1vZHVsZSwgRWRpdG9yVG9vbGJhckJ1dHRvbkNvbXBvbmVudF0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2VkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZWRpdG9yLmNvbXBvbmVudC5zY3NzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRWRpdG9yQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1NlcnZpY2UgPSBpbmplY3QoRGlhbG9nU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSB0cmFuc2xhdGVTZXJ2aWNlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBDb2xvY2EgbyBlZGl0b3IgZW0gbW9kbyBzb21lbnRlIGxlaXR1cmEuXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKi9cbiAgICByZWFkb25seSA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBMaXN0YSBkZSBmb3JtYXRvcyBoYWJpbGl0YWRvcyBuYSB0b29sYmFyLiBRdWFuZG8gdmF6aW8sIHRvZG9zIG9zIGZvcm1hdG9zIHPDo28gZXhpYmlkb3MuXG4gICAgICovXG4gICAgZm9ybWF0cyA9IGlucHV0PEVkaXRvckZvcm1hdFtdPigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFRleHRvIGRlIGRpY2EgZXhpYmlkbyBxdWFuZG8gbyBlZGl0b3IgZXN0w6EgdmF6aW8uXG4gICAgICovXG4gICAgcGxhY2Vob2xkZXIgPSBpbnB1dDxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRXN0aWxvcyBpbmxpbmUgYXBsaWNhZG9zIGFvIGNvbnRhaW5lciBkbyBlZGl0b3IuXG4gICAgICovXG4gICAgc3R5bGUgPSBpbnB1dDx7IFtrbGFzczogc3RyaW5nXTogdW5rbm93biB9PigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIENsYXNzZXMgQ1NTIGFkaWNpb25haXMgYXBsaWNhZGFzIGFvIGNvbnRhaW5lciBkbyBlZGl0b3IuXG4gICAgICovXG4gICAgc3R5bGVDbGFzcyA9IGlucHV0PHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBFeHRlbnPDtWVzIFRpcHRhcCBhZGljaW9uYWlzIHBhcmEgZXN0ZW5kZXIgbyBjb21wb3J0YW1lbnRvIHBhZHLDo28gZG8gZWRpdG9yLlxuICAgICAqL1xuICAgIGV4dGVuc2lvbnMgPSBpbnB1dDxFeHRlbnNpb25bXT4oW10pO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIG8gZWRpdG9yIMOpIGluaWNpYWxpemFkbyBlIGVzdMOhIHByb250byBwYXJhIHVzby5cbiAgICAgKi9cbiAgICBlZGl0b3JJbml0ID0gb3V0cHV0PEVkaXRvcj4oKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBFbWl0aWRvIHNlbXByZSBxdWUgbyBjb250ZcO6ZG8gZG8gZWRpdG9yIMOpIGFsdGVyYWRvLlxuICAgICAqL1xuICAgIHRleHRDaGFuZ2UgPSBvdXRwdXQ8RWRpdG9yVGV4dENoYW5nZUV2ZW50PigpO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIEVtaXRpZG8gcXVhbmRvIGEgc2VsZcOnw6NvIGRlIHRleHRvIG5vIGVkaXRvciBtdWRhLlxuICAgICAqL1xuICAgIHNlbGVjdGlvbkNoYW5nZSA9IG91dHB1dDxFZGl0b3JTZWxlY3Rpb25DaGFuZ2VFdmVudD4oKTtcblxuICAgIHByaXZhdGUgZWRpdG9yQ29udGFpbmVyID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignZWRpdG9yQ29udGFpbmVyJyk7XG4gICAgcHJpdmF0ZSBpbWFnZUlucHV0ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD4+KCdpbWFnZUlucHV0Jyk7XG5cbiAgICBwcml2YXRlIGVkaXRvcj86IEVkaXRvcjtcbiAgICBwcml2YXRlIF9mb3JtRGlzYWJsZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF9jdXJyZW50UGxhY2Vob2xkZXIgPSAnJztcblxuICAgIGFjdGl2ZVN0YXRlcyA9IHtcbiAgICAgICAgaXNCb2xkOiBmYWxzZSxcbiAgICAgICAgaXNJdGFsaWM6IGZhbHNlLFxuICAgICAgICBpc1VuZGVybGluZTogZmFsc2UsXG4gICAgICAgIGlzU3RyaWtlOiBmYWxzZSxcbiAgICAgICAgaXNCdWxsZXRMaXN0OiBmYWxzZSxcbiAgICAgICAgaXNPcmRlcmVkTGlzdDogZmFsc2UsXG4gICAgICAgIGlzQmxvY2txdW90ZTogZmFsc2UsXG4gICAgICAgIGlzQ29kZTogZmFsc2UsXG4gICAgICAgIGlzU3Vic2NyaXB0OiBmYWxzZSxcbiAgICAgICAgaXNTdXBlcnNjcmlwdDogZmFsc2UsXG4gICAgICAgIGlzQWxpZ25MZWZ0OiBmYWxzZSxcbiAgICAgICAgaXNBbGlnbkNlbnRlcjogZmFsc2UsXG4gICAgICAgIGlzQWxpZ25SaWdodDogZmFsc2UsXG4gICAgICAgIGN1cnJlbnRIZWFkaW5nOiAwLFxuICAgICAgICBjdXJyZW50Q29sb3I6ICcjMDAwMDAwJyxcbiAgICAgICAgY3VycmVudEhpZ2hsaWdodDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgY2FuVW5kbzogZmFsc2UsXG4gICAgICAgIGNhblJlZG86IGZhbHNlLFxuICAgIH07XG5cbiAgICBwcml2YXRlIF92YWx1ZSA9ICcnO1xuICAgIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIHByaXZhdGUgX29uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5zZXRFZGl0YWJsZSghdGhpcy5yZWFkb25seSgpICYmICF0aGlzLl9mb3JtRGlzYWJsZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY3VycmVudFBsYWNlaG9sZGVyID0gdGhpcy5wbGFjZWhvbGRlcigpID8/ICcnO1xuICAgICAgICAgICAgdGhpcy5lZGl0b3I/LnZpZXcuZGlzcGF0Y2godGhpcy5lZGl0b3Iuc3RhdGUudHIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5pdEVkaXRvcigpO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uZGVzdHJveSgpO1xuICAgIH1cblxuICAgIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlID8/ICcnO1xuICAgICAgICBpZiAodGhpcy5lZGl0b3IpIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yLmNoYWluKCkuc2V0TWV0YSgnYWRkVG9IaXN0b3J5JywgZmFsc2UpLnNldENvbnRlbnQodGhpcy5fdmFsdWUsIHsgZW1pdFVwZGF0ZTogZmFsc2UgfSkucnVuKCk7XG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2Zvcm1EaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5zZXRFZGl0YWJsZSghaXNEaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seSgpKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgaXNGb3JtYXRBbGxvd2VkKGZvcm1hdDogRWRpdG9yRm9ybWF0KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGZvcm1hdHMgPSB0aGlzLmZvcm1hdHMoKTtcbiAgICAgICAgcmV0dXJuICFmb3JtYXRzPy5sZW5ndGggfHwgZm9ybWF0cy5pbmNsdWRlcyhmb3JtYXQpO1xuICAgIH1cblxuICAgIGhhc0FueUZvcm1hdEJlZm9yZVVuZG9SZWRvKCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBmb3JtYXRzQmVmb3JlVW5kb1JlZG86IEVkaXRvckZvcm1hdFtdID0gW1xuICAgICAgICAgICAgJ2hlYWRlcicsICdib2xkJywgJ2l0YWxpYycsICd1bmRlcmxpbmUnLCAnc3RyaWtlJywgJ3N1YnNjcmlwdCcsICdzdXBlcnNjcmlwdCcsXG4gICAgICAgICAgICAnY29sb3InLCAnaGlnaGxpZ2h0JywgJ2xpc3QnLCAnYWxpZ24nLCAnYmxvY2txdW90ZScsICdjb2RlLWJsb2NrJywgJ2xpbmsnLCAnaW1hZ2UnLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gZm9ybWF0c0JlZm9yZVVuZG9SZWRvLnNvbWUoZiA9PiB0aGlzLmlzRm9ybWF0QWxsb3dlZChmKSk7XG4gICAgfVxuXG4gICAgdG9nZ2xlQm9sZCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS50b2dnbGVCb2xkKCkucnVuKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlSXRhbGljKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUl0YWxpYygpLnJ1bigpO1xuICAgIH1cblxuICAgIHRvZ2dsZVVuZGVybGluZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS50b2dnbGVVbmRlcmxpbmUoKS5ydW4oKTtcbiAgICB9XG5cbiAgICB0b2dnbGVTdHJpa2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3RyaWtlKCkucnVuKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlQnVsbGV0TGlzdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS50b2dnbGVCdWxsZXRMaXN0KCkucnVuKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlT3JkZXJlZExpc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkudG9nZ2xlT3JkZXJlZExpc3QoKS5ydW4oKTtcbiAgICB9XG5cbiAgICB0b2dnbGVCbG9ja3F1b3RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUJsb2NrcXVvdGUoKS5ydW4oKTtcbiAgICB9XG5cbiAgICB0b2dnbGVDb2RlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnRvZ2dsZUNvZGUoKS5ydW4oKTtcbiAgICB9XG5cbiAgICB0b2dnbGVTdWJzY3JpcHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3Vic2NyaXB0KCkucnVuKCk7XG4gICAgfVxuXG4gICAgdG9nZ2xlU3VwZXJzY3JpcHQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkudG9nZ2xlU3VwZXJzY3JpcHQoKS5ydW4oKTtcbiAgICB9XG5cbiAgICBzZXRUZXh0QWxpZ24oYWxpZ246ICdsZWZ0JyB8ICdjZW50ZXInIHwgJ3JpZ2h0Jyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnNldFRleHRBbGlnbihhbGlnbikucnVuKCk7XG4gICAgfVxuXG4gICAgc2V0Q29sb3IoY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnNldENvbG9yKGNvbG9yKS5ydW4oKTtcbiAgICB9XG5cbiAgICBzZXRIaWdobGlnaHQoY29sb3I6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnNldEhpZ2hsaWdodCh7IGNvbG9yIH0pLnJ1bigpO1xuICAgIH1cblxuICAgIGNsZWFyRm9ybWF0dGluZygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS5jbGVhck5vZGVzKCkudW5zZXRBbGxNYXJrcygpLnJ1bigpO1xuICAgIH1cblxuICAgIG9uSGVhZGluZ0NoYW5nZShldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgbGV2ZWwgPSBwYXJzZUludCgoZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS52YWx1ZSkgYXMgMCB8IDEgfCAyIHwgMztcbiAgICAgICAgaWYgKGlzTmFOKGxldmVsKSB8fCBsZXZlbCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS5zZXRQYXJhZ3JhcGgoKS5ydW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkuc2V0SGVhZGluZyh7IGxldmVsIH0pLnJ1bigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0TGluaygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhpc3RpbmdVcmwgPSAodGhpcy5lZGl0b3I/LmdldEF0dHJpYnV0ZXMoJ2xpbmsnKVsnaHJlZiddIGFzIHN0cmluZykgPz8gJyc7XG4gICAgICAgIGNvbnN0IHJlZiA9IHRoaXMuZGlhbG9nU2VydmljZS5vcGVuKExpbmtEaWFsb2dDb21wb25lbnQsIHsgc2l6ZTogJ3NtJyB9KTtcbiAgICAgICAgcmVmLmNvbXBvbmVudEluc3RhbmNlLmluaXRpYWxVcmwgPSBleGlzdGluZ1VybDtcbiAgICAgICAgcmVmLmNsb3NlZFxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCh1cmw6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh1cmwgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yPy5jaGFpbigpLmZvY3VzKCkuZXh0ZW5kTWFya1JhbmdlKCdsaW5rJykudW5zZXRMaW5rKCkucnVuKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3I/LmNoYWluKCkuZm9jdXMoKS5leHRlbmRNYXJrUmFuZ2UoJ2xpbmsnKS5zZXRMaW5rKHsgaHJlZjogdXJsIH0pLnJ1bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldEltYWdlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmltYWdlSW5wdXQoKS5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgb25JbWFnZUZpbGVTZWxlY3RlZChldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XG4gICAgICAgIGlmICghZmlsZSkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3JjID0gZS50YXJnZXQ/LnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnNldEltYWdlKHsgc3JjIH0pLnJ1bigpO1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICB9O1xuICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICB9XG5cbiAgICB1bmRvKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnVuZG8oKS5ydW4oKTtcbiAgICB9XG5cbiAgICByZWRvKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRvcj8uY2hhaW4oKS5mb2N1cygpLnJlZG8oKS5ydW4oKTtcbiAgICB9XG5cbiAgICBvblRvb2xiYXJLZXlkb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICghWydBcnJvd0xlZnQnLCAnQXJyb3dSaWdodCcsICdIb21lJywgJ0VuZCddLmluY2x1ZGVzKGV2ZW50LmtleSkpIHJldHVybjtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB0b29sYmFyID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgZm9jdXNhYmxlID0gdGhpcy5nZXRUb29sYmFyRm9jdXNhYmxlKHRvb2xiYXIpO1xuICAgICAgICBpZiAoIWZvY3VzYWJsZS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBmb2N1c2FibGUuZmluZEluZGV4KGVsID0+IGVsID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgICAgbGV0IG5leHRJbmRleDogbnVtYmVyO1xuXG4gICAgICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICAgICAgICBjYXNlICdBcnJvd1JpZ2h0JzogbmV4dEluZGV4ID0gKGN1cnJlbnRJbmRleCArIDEpICUgZm9jdXNhYmxlLmxlbmd0aDsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOiBuZXh0SW5kZXggPSAoY3VycmVudEluZGV4IC0gMSArIGZvY3VzYWJsZS5sZW5ndGgpICUgZm9jdXNhYmxlLmxlbmd0aDsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdIb21lJzogbmV4dEluZGV4ID0gMDsgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiBuZXh0SW5kZXggPSBmb2N1c2FibGUubGVuZ3RoIC0gMTsgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBmb2N1c2FibGUuZm9yRWFjaCgoZWwsIGkpID0+IGVsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCBpID09PSBuZXh0SW5kZXggPyAnMCcgOiAnLTEnKSk7XG4gICAgICAgIGZvY3VzYWJsZVtuZXh0SW5kZXhdLmZvY3VzKCk7XG4gICAgfVxuXG4gICAgb25Ub29sYmFyRm9jdXNJbihldmVudDogRm9jdXNFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IHRvb2xiYXIgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBmb2N1c2FibGUgPSB0aGlzLmdldFRvb2xiYXJGb2N1c2FibGUodG9vbGJhcik7XG4gICAgICAgIGlmIChmb2N1c2FibGUuaW5jbHVkZXModGFyZ2V0KSkge1xuICAgICAgICAgICAgZm9jdXNhYmxlLmZvckVhY2goZWwgPT4gZWwuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIGVsID09PSB0YXJnZXQgPyAnMCcgOiAnLTEnKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRvb2xiYXJGb2N1c2FibGUodG9vbGJhcjogSFRNTEVsZW1lbnQpOiBIVE1MRWxlbWVudFtdIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgICAgICB0b29sYmFyLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdidXR0b246bm90KFtkaXNhYmxlZF0pLCBzZWxlY3QsIGxhYmVsW3RhYmluZGV4XScpLFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEVkaXRvcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBuZXcgRWRpdG9yKHtcbiAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZWRpdG9yQ29udGFpbmVyKCkubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIGV4dGVuc2lvbnM6IFtcbiAgICAgICAgICAgICAgICBTdGFydGVyS2l0LmNvbmZpZ3VyZSh7XG4gICAgICAgICAgICAgICAgICAgIGxpbms6IHsgb3Blbk9uQ2xpY2s6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgICAgIHVuZGVybGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgVW5kZXJsaW5lLFxuICAgICAgICAgICAgICAgIEltYWdlLFxuICAgICAgICAgICAgICAgIFRleHRBbGlnbi5jb25maWd1cmUoeyB0eXBlczogWydoZWFkaW5nJywgJ3BhcmFncmFwaCddIH0pLFxuICAgICAgICAgICAgICAgIFRleHRTdHlsZSxcbiAgICAgICAgICAgICAgICBDb2xvcixcbiAgICAgICAgICAgICAgICBIaWdobGlnaHQuY29uZmlndXJlKHsgbXVsdGljb2xvcjogdHJ1ZSB9KSxcbiAgICAgICAgICAgICAgICBQbGFjZWhvbGRlci5jb25maWd1cmUoeyBwbGFjZWhvbGRlcjogKCkgPT4gdGhpcy5fY3VycmVudFBsYWNlaG9sZGVyIH0pLFxuICAgICAgICAgICAgICAgIFN1YnNjcmlwdCxcbiAgICAgICAgICAgICAgICBTdXBlcnNjcmlwdCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmV4dGVuc2lvbnMoKSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLl92YWx1ZSxcbiAgICAgICAgICAgIGVkaXRhYmxlOiAhdGhpcy5yZWFkb25seSgpLFxuICAgICAgICAgICAgZWRpdG9yUHJvcHM6IHtcbiAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGU6ICd0ZXh0Ym94JyxcbiAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbXVsdGlsaW5lJzogJ3RydWUnLFxuICAgICAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbCc6IHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfY29udGVudF9hcmVhJyxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uVXBkYXRlOiAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGh0bWwgPSBlZGl0b3IuZ2V0SFRNTCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSBlZGl0b3IuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gaHRtbDtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZShodG1sKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRleHRDaGFuZ2UuZW1pdCh7IGh0bWxWYWx1ZTogaHRtbCwgdGV4dFZhbHVlOiB0ZXh0IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY0FjdGl2ZVN0YXRlcygpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQmx1cjogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uU2VsZWN0aW9uVXBkYXRlOiAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY0FjdGl2ZVN0YXRlcygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZnJvbSwgdG8sIGVtcHR5IH0gPSBlZGl0b3Iuc3RhdGUuc2VsZWN0aW9uO1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoeyBmcm9tLCB0bywgZW1wdHkgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN5bmNBY3RpdmVTdGF0ZXMoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHRoaXMuZWRpdG9ySW5pdC5lbWl0KHRoaXMuZWRpdG9yKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN5bmNBY3RpdmVTdGF0ZXMoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lZGl0b3IpIHJldHVybjtcblxuICAgICAgICBjb25zdCBlID0gdGhpcy5lZGl0b3I7XG4gICAgICAgIHRoaXMuYWN0aXZlU3RhdGVzID0ge1xuICAgICAgICAgICAgaXNCb2xkOiBlLmlzQWN0aXZlKCdib2xkJyksXG4gICAgICAgICAgICBpc0l0YWxpYzogZS5pc0FjdGl2ZSgnaXRhbGljJyksXG4gICAgICAgICAgICBpc1VuZGVybGluZTogZS5pc0FjdGl2ZSgndW5kZXJsaW5lJyksXG4gICAgICAgICAgICBpc1N0cmlrZTogZS5pc0FjdGl2ZSgnc3RyaWtlJyksXG4gICAgICAgICAgICBpc0J1bGxldExpc3Q6IGUuaXNBY3RpdmUoJ2J1bGxldExpc3QnKSxcbiAgICAgICAgICAgIGlzT3JkZXJlZExpc3Q6IGUuaXNBY3RpdmUoJ29yZGVyZWRMaXN0JyksXG4gICAgICAgICAgICBpc0Jsb2NrcXVvdGU6IGUuaXNBY3RpdmUoJ2Jsb2NrcXVvdGUnKSxcbiAgICAgICAgICAgIGlzQ29kZTogZS5pc0FjdGl2ZSgnY29kZScpLFxuICAgICAgICAgICAgaXNTdWJzY3JpcHQ6IGUuaXNBY3RpdmUoJ3N1YnNjcmlwdCcpLFxuICAgICAgICAgICAgaXNTdXBlcnNjcmlwdDogZS5pc0FjdGl2ZSgnc3VwZXJzY3JpcHQnKSxcbiAgICAgICAgICAgIGlzQWxpZ25MZWZ0OiBlLmlzQWN0aXZlKHsgdGV4dEFsaWduOiAnbGVmdCcgfSksXG4gICAgICAgICAgICBpc0FsaWduQ2VudGVyOiBlLmlzQWN0aXZlKHsgdGV4dEFsaWduOiAnY2VudGVyJyB9KSxcbiAgICAgICAgICAgIGlzQWxpZ25SaWdodDogZS5pc0FjdGl2ZSh7IHRleHRBbGlnbjogJ3JpZ2h0JyB9KSxcbiAgICAgICAgICAgIGN1cnJlbnRIZWFkaW5nOiBbMSwgMiwgM10uZmluZCgobGV2ZWwpID0+IGUuaXNBY3RpdmUoJ2hlYWRpbmcnLCB7IGxldmVsIH0pKSA/PyAwLFxuICAgICAgICAgICAgY3VycmVudENvbG9yOiAoZS5nZXRBdHRyaWJ1dGVzKCd0ZXh0U3R5bGUnKVsnY29sb3InXSBhcyBzdHJpbmcpIHx8ICcjMDAwMDAwJyxcbiAgICAgICAgICAgIGN1cnJlbnRIaWdobGlnaHQ6IChlLmdldEF0dHJpYnV0ZXMoJ2hpZ2hsaWdodCcpWydjb2xvciddIGFzIHN0cmluZykgfHwgJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgIGNhblVuZG86IGUuY2FuKCkudW5kbygpLFxuICAgICAgICAgICAgY2FuUmVkbzogZS5jYW4oKS5yZWRvKCksXG4gICAgICAgIH07XG4gICAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwicm91bmRlZCBiZy13aGl0ZSBmbGV4IGZsZXgtY29sIGJvcmRlciBib3JkZXItZ3JheXNjYWxlLTMwIHRyYW5zaXRpb24tW2JvcmRlci1jb2xvcixib3gtc2hhZG93XSBkdXJhdGlvbi0xNTAgZm9jdXMtd2l0aGluOmJvcmRlci1bIzVjNWNlNl0gZm9jdXMtd2l0aGluOnNoYWRvdy1bMF8wXzBfMnB4X3JnYmEoOTIsOTIsMjMwLDAuMTUpXVwiXG4gICAgW25nQ2xhc3NdPVwic3R5bGVDbGFzcygpXCJcbiAgICBbbmdTdHlsZV09XCJzdHlsZSgpXCJcbiAgICBbY2xhc3Mucy1lZGl0b3ItLXJlYWRvbmx5XT1cInJlYWRvbmx5KClcIlxuPlxuICAgIEBpZiAoIXJlYWRvbmx5KCkpIHtcbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3M9XCJyb3VuZGVkLXQgZmxleCBmbGV4LXdyYXAgaXRlbXMtY2VudGVyIGdhcC0wLjUgYm9yZGVyLWIgYm9yZGVyLWdyYXlzY2FsZS0zMCBiZy1bI2Y5ZjlmYl0gcHgtMiBweS0xLjVcIlxuICAgICAgICAgICAgcm9sZT1cInRvb2xiYXJcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl90b29sYmFyJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvblRvb2xiYXJLZXlkb3duKCRldmVudClcIlxuICAgICAgICAgICAgKGZvY3VzaW4pPVwib25Ub29sYmFyRm9jdXNJbigkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ2hlYWRlcicpKSB7XG4gICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJvdW5kZWQgYmctd2hpdGUgaC03IGN1cnNvci1wb2ludGVyIGJvcmRlciBib3JkZXItZ3JheXNjYWxlLTMwIHB4LTEuNSB0ZXh0LVsxM3B4XSB0ZXh0LVsjM2QzZDRkXSBvdXRsaW5lLW5vbmUgdHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMTUwIGZvY3VzOmJvcmRlci1bIzVjNWNlNl1cIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uSGVhZGluZ0NoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9oZWFkaW5nX2xldmVsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiYWN0aXZlU3RhdGVzLmN1cnJlbnRIZWFkaW5nID09PSAwXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfaGVhZGluZ19ub3JtYWwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwiYWN0aXZlU3RhdGVzLmN1cnJlbnRIZWFkaW5nID09PSAxXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfaGVhZGluZ18xJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIjJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImFjdGl2ZVN0YXRlcy5jdXJyZW50SGVhZGluZyA9PT0gMlwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2hlYWRpbmdfMicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCIzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxlY3RlZF09XCJhY3RpdmVTdGF0ZXMuY3VycmVudEhlYWRpbmcgPT09IDNcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9oZWFkaW5nXzMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMSBpbmxpbmUtYmxvY2sgaC01IHctcHggc2hyaW5rLTAgYmctWyNkMWQxZGNdXCI+PC9zcGFuPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnYm9sZCcpKSB7XG4gICAgICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJmYSBmYS1ib2xkXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2JvbGQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJhY3RpdmVTdGF0ZXMuaXNCb2xkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlQm9sZCgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnaXRhbGljJykpIHtcbiAgICAgICAgICAgICAgICA8cy1lZGl0b3ItdG9vbGJhci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWl0YWxpY1wiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9pdGFsaWMnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJhY3RpdmVTdGF0ZXMuaXNJdGFsaWNcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJ0b2dnbGVJdGFsaWMoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ3VuZGVybGluZScpKSB7XG4gICAgICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJmYSBmYS11bmRlcmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfdW5kZXJsaW5lJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiYWN0aXZlU3RhdGVzLmlzVW5kZXJsaW5lXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlVW5kZXJsaW5lKClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoaXNGb3JtYXRBbGxvd2VkKCdzdHJpa2UnKSkge1xuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtc3RyaWtldGhyb3VnaFwiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9zdHJpa2V0aHJvdWdoJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiYWN0aXZlU3RhdGVzLmlzU3RyaWtlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlU3RyaWtlKClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoaXNGb3JtYXRBbGxvd2VkKCdzdWJzY3JpcHQnKSkge1xuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtc3Vic2NyaXB0XCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX3N1YnNjcmlwdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc1N1YnNjcmlwdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInRvZ2dsZVN1YnNjcmlwdCgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnc3VwZXJzY3JpcHQnKSkge1xuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtc3VwZXJzY3JpcHRcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3Jfc3VwZXJzY3JpcHQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJhY3RpdmVTdGF0ZXMuaXNTdXBlcnNjcmlwdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInRvZ2dsZVN1cGVyc2NyaXB0KClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoaXNGb3JtYXRBbGxvd2VkKCdjb2xvcicpKSB7XG4gICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicmVsYXRpdmUgZmxleCBoLTcgdy03IGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkIGJnLXdoaXRlIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTE1MCBob3ZlcjpiZy1bI2YwZjBmOF1cIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl90ZXh0X2NvbG9yJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfdGV4dF9jb2xvcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTsgY29sb3JJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGNvbG9ySW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC1weFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1mb250IHRleHQtWzExcHhdIHRleHQtWyMzZDNkNGRdXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImgtWzNweF0gdy0zLjUgcm91bmRlZC1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtY29sb3JdPVwiYWN0aXZlU3RhdGVzLmN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgI2NvbG9ySW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGluc2V0LTAgaC1mdWxsIHctZnVsbCBjdXJzb3ItcG9pbnRlciBvcGFjaXR5LTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFjdGl2ZVN0YXRlcy5jdXJyZW50Q29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNldENvbG9yKCRhbnkoJGV2ZW50LnRhcmdldCkudmFsdWUpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnaGlnaGxpZ2h0JykpIHtcbiAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZWxhdGl2ZSBmbGV4IGgtNyB3LTcgY3Vyc29yLXBvaW50ZXIgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQgYmctd2hpdGUgdHJhbnNpdGlvbi1jb2xvcnMgZHVyYXRpb24tMTUwIGhvdmVyOmJnLVsjZjBmMGY4XVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLnRpdGxlXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2JhY2tncm91bmRfY29sb3InIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9iYWNrZ3JvdW5kX2NvbG9yJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBoaWdobGlnaHRJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IGhpZ2hsaWdodElucHV0LmNsaWNrKClcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtcHhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtaGlnaGxpZ2h0ZXIgdGV4dC1bMTFweF0gdGV4dC1bIzNkM2Q0ZF1cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaC1bM3B4XSB3LTMuNSByb3VuZGVkLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJhY3RpdmVTdGF0ZXMuY3VycmVudEhpZ2hsaWdodCA9PT0gJ3RyYW5zcGFyZW50JyA/ICcjZmZmZjAwJyA6IGFjdGl2ZVN0YXRlcy5jdXJyZW50SGlnaGxpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAjaGlnaGxpZ2h0SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImFic29sdXRlIGluc2V0LTAgaC1mdWxsIHctZnVsbCBjdXJzb3ItcG9pbnRlciBvcGFjaXR5LTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImFjdGl2ZVN0YXRlcy5jdXJyZW50SGlnaGxpZ2h0ID09PSAndHJhbnNwYXJlbnQnID8gJyNmZmZmMDAnIDogYWN0aXZlU3RhdGVzLmN1cnJlbnRIaWdobGlnaHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNldEhpZ2hsaWdodCgkYW55KCRldmVudC50YXJnZXQpLnZhbHVlKVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ2xpc3QnKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMSBpbmxpbmUtYmxvY2sgaC01IHctcHggc2hyaW5rLTAgYmctWyNkMWQxZGNdXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtbGlzdC11bFwiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9idWxsZXRfbGlzdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc0J1bGxldExpc3RcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJ0b2dnbGVCdWxsZXRMaXN0KClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJmYSBmYS1saXN0LW9sXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX29yZGVyZWRfbGlzdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc09yZGVyZWRMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlT3JkZXJlZExpc3QoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ2FsaWduJykpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm14LTEgaW5saW5lLWJsb2NrIGgtNSB3LXB4IHNocmluay0wIGJnLVsjZDFkMWRjXVwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8cy1lZGl0b3ItdG9vbGJhci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWFsaWduLWxlZnRcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfYWxpZ25fbGVmdCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc0FsaWduTGVmdFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInNldFRleHRBbGlnbignbGVmdCcpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtYWxpZ24tY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2FsaWduX2NlbnRlcicgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc0FsaWduQ2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwic2V0VGV4dEFsaWduKCdjZW50ZXInKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8cy1lZGl0b3ItdG9vbGJhci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWFsaWduLXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2FsaWduX3JpZ2h0JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIFthY3RpdmVdPVwiYWN0aXZlU3RhdGVzLmlzQWxpZ25SaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInNldFRleHRBbGlnbigncmlnaHQnKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ2Jsb2NrcXVvdGUnKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMSBpbmxpbmUtYmxvY2sgaC01IHctcHggc2hyaW5rLTAgYmctWyNkMWQxZGNdXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtcXVvdGUtcmlnaHRcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfYmxvY2txdW90ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICBbYWN0aXZlXT1cImFjdGl2ZVN0YXRlcy5pc0Jsb2NrcXVvdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJ0b2dnbGVCbG9ja3F1b3RlKClcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIEBpZiAoaXNGb3JtYXRBbGxvd2VkKCdjb2RlLWJsb2NrJykpIHtcbiAgICAgICAgICAgICAgICA8cy1lZGl0b3ItdG9vbGJhci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWNvZGVcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwiJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfaW5saW5lX2NvZGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2FjdGl2ZV09XCJhY3RpdmVTdGF0ZXMuaXNDb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwidG9nZ2xlQ29kZSgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnbGluaycpKSB7XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJteC0xIGlubGluZS1ibG9jayBoLTUgdy1weCBzaHJpbmstMCBiZy1bI2QxZDFkY11cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIGljb249XCJmYSBmYS1saW5rXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2luc2VydF9saW5rJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInNldExpbmsoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGlmIChpc0Zvcm1hdEFsbG93ZWQoJ2ltYWdlJykpIHtcbiAgICAgICAgICAgICAgICA8cy1lZGl0b3ItdG9vbGJhci1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLWltYWdlXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2luc2VydF9pbWFnZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJzZXRJbWFnZSgpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGhhc0FueUZvcm1hdEJlZm9yZVVuZG9SZWRvKCkpIHtcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm14LTEgaW5saW5lLWJsb2NrIGgtNSB3LXB4IHNocmluay0wIGJnLVsjZDFkMWRjXVwiPjwvc3Bhbj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLXVuZG9cIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCIoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfdW5kbycgfCB0cmFuc2xhdGUpICsgJyAoQ3RybCtaKSdcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhYWN0aXZlU3RhdGVzLmNhblVuZG9cIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInVuZG8oKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHMtZWRpdG9yLXRvb2xiYXItYnV0dG9uXG4gICAgICAgICAgICAgICAgaWNvbj1cImZhIGZhLXJlZG9cIlxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCIoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfcmVkbycgfCB0cmFuc2xhdGUpICsgJyAoQ3RybCtZKSdcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhYWN0aXZlU3RhdGVzLmNhblJlZG9cIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cInJlZG8oKVwiXG4gICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICBAaWYgKGlzRm9ybWF0QWxsb3dlZCgnY2xlYW4nKSkge1xuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibXgtMSBpbmxpbmUtYmxvY2sgaC01IHctcHggc2hyaW5rLTAgYmctWyNkMWQxZGNdXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzLWVkaXRvci10b29sYmFyLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBpY29uPVwiZmEgZmEtcmVtb3ZlLWZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9jbGVhcl9mb3JtYXR0aW5nJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja2VkKT1cImNsZWFyRm9ybWF0dGluZygpXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICB9XG5cbiAgICA8ZGl2XG4gICAgICAgICNlZGl0b3JDb250YWluZXJcbiAgICAgICAgY2xhc3M9XCJzLWVkaXRvci1jb250ZW50IGZsZXgtMVwiXG4gICAgPjwvZGl2PlxuICAgIDxpbnB1dFxuICAgICAgICAjaW1hZ2VJbnB1dFxuICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgIGFjY2VwdD1cImltYWdlLypcIlxuICAgICAgICBzdHlsZT1cImRpc3BsYXk6IG5vbmVcIlxuICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAoY2hhbmdlKT1cIm9uSW1hZ2VGaWxlU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgLz5cbjwvZGl2PlxuIl19
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';
|
|
3
|
+
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
4
|
+
import { ButtonModule } from '@seniorsistemas/angular-components/button';
|
|
5
|
+
import { ActiveDialog, DialogComponent } from '@seniorsistemas/angular-components/dialog';
|
|
6
|
+
import { DynamicFormModule } from '@seniorsistemas/angular-components/dynamic-form';
|
|
7
|
+
import { TemplateModule } from '@seniorsistemas/angular-components/template';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@ngx-translate/core";
|
|
10
|
+
import * as i2 from "@seniorsistemas/angular-components/dynamic-form";
|
|
11
|
+
import * as i3 from "@seniorsistemas/angular-components/button";
|
|
12
|
+
import * as i4 from "@seniorsistemas/angular-components/template";
|
|
13
|
+
export class LinkDialogComponent {
|
|
14
|
+
activeDialog = inject(ActiveDialog);
|
|
15
|
+
translateService = inject(TranslateService);
|
|
16
|
+
initialUrl = '';
|
|
17
|
+
form = new FormGroup({ url: new FormControl('') });
|
|
18
|
+
configs = [];
|
|
19
|
+
ngOnInit() {
|
|
20
|
+
this.form.setValue({ url: this.initialUrl });
|
|
21
|
+
this.configs = [
|
|
22
|
+
{
|
|
23
|
+
type: 'row',
|
|
24
|
+
fields: [
|
|
25
|
+
{
|
|
26
|
+
type: 'string',
|
|
27
|
+
name: 'url',
|
|
28
|
+
label: this.translateService.instant('platform.angular_components.editor_link_url_label'),
|
|
29
|
+
placeholder: this.translateService.instant('platform.angular_components.editor_link_url_placeholder'),
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
];
|
|
34
|
+
}
|
|
35
|
+
confirm() {
|
|
36
|
+
this.activeDialog.close(this.form.value.url?.trim() ?? '');
|
|
37
|
+
}
|
|
38
|
+
cancel() {
|
|
39
|
+
this.activeDialog.dismiss();
|
|
40
|
+
}
|
|
41
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LinkDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
42
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: LinkDialogComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<s-dialog [header]=\"'platform.angular_components.editor_insert_link' | translate\">\n <ng-template sTemplate=\"body\">\n <s-dynamic-form [form]=\"form\" [configs]=\"configs\" />\n </ng-template>\n <ng-template sTemplate=\"footer\">\n <div style=\"display:flex; justify-content:flex-end; gap:8px; width:100%\">\n <s-button\n [label]=\"'platform.angular_components.cancel' | translate\"\n priority=\"secondary\"\n (clicked)=\"cancel()\"\n />\n <s-button\n [label]=\"'platform.angular_components.editor_confirm' | translate\"\n priority=\"primary\"\n (clicked)=\"confirm()\"\n />\n </div>\n </ng-template>\n</s-dialog>\n", dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "component", type: DialogComponent, selector: "s-dialog", inputs: ["header", "visible", "size", "contentClassName", "escapeOnEsc", "destroyClickOutside", "closeAriaLabel"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: DynamicFormModule }, { kind: "component", type: i2.DynamicFormComponent, selector: "s-dynamic-form", inputs: ["id", "configs", "fields", "form", "errorMessages"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i3.ButtonComponent, selector: "s-button", inputs: ["id", "label", "tooltip", "tooltipPosition", "iconClass", "rightIconClass", "caret", "styleClass", "baseZIndex", "disabled", "auxiliary", "type", "priority", "menuOptions", "size", "slide", "animation", "badge", "iconColor", "menuAriaLabel", "ariaLabel"], outputs: ["clicked"] }, { kind: "ngmodule", type: TemplateModule }, { kind: "directive", type: i4.TemplateDirective, selector: "[sTemplate]", inputs: ["sTemplate"] }] });
|
|
43
|
+
}
|
|
44
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LinkDialogComponent, decorators: [{
|
|
45
|
+
type: Component,
|
|
46
|
+
args: [{ standalone: true, imports: [ReactiveFormsModule, TranslateModule, DialogComponent, DynamicFormModule, ButtonModule, TemplateModule], template: "<s-dialog [header]=\"'platform.angular_components.editor_insert_link' | translate\">\n <ng-template sTemplate=\"body\">\n <s-dynamic-form [form]=\"form\" [configs]=\"configs\" />\n </ng-template>\n <ng-template sTemplate=\"footer\">\n <div style=\"display:flex; justify-content:flex-end; gap:8px; width:100%\">\n <s-button\n [label]=\"'platform.angular_components.cancel' | translate\"\n priority=\"secondary\"\n (clicked)=\"cancel()\"\n />\n <s-button\n [label]=\"'platform.angular_components.editor_confirm' | translate\"\n priority=\"primary\"\n (clicked)=\"confirm()\"\n />\n </div>\n </ng-template>\n</s-dialog>\n" }]
|
|
47
|
+
}] });
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1jb21wb25lbnRzL2VkaXRvci9zcmMvbGliL2VkaXRvci9saW5rLWRpYWxvZy9saW5rLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvZWRpdG9yL3NyYy9saWIvZWRpdG9yL2xpbmstZGlhbG9nL2xpbmstZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxpQkFBaUIsRUFBb0IsTUFBTSxpREFBaUQsQ0FBQztBQUN0RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNkNBQTZDLENBQUM7Ozs7OztBQU83RSxNQUFNLE9BQU8sbUJBQW1CO0lBQ1gsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNwQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUU3RCxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBRWhCLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFbkQsT0FBTyxHQUF1QixFQUFFLENBQUM7SUFFakMsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUc7WUFDWDtnQkFDSSxJQUFJLEVBQUUsS0FBSztnQkFDWCxNQUFNLEVBQUU7b0JBQ0o7d0JBQ0ksSUFBSSxFQUFFLFFBQVE7d0JBQ2QsSUFBSSxFQUFFLEtBQUs7d0JBQ1gsS0FBSyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsbURBQW1ELENBQUM7d0JBQ3pGLFdBQVcsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUN0Qyx5REFBeUQsQ0FDNUQ7cUJBQ0o7aUJBQ0o7YUFDSjtTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsT0FBTztRQUNILElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQsTUFBTTtRQUNGLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsQ0FBQzt3R0FuQ1EsbUJBQW1COzRGQUFuQixtQkFBbUIsd0VDZGhDLG14QkFtQkEsMkNEUmMsbUJBQW1CLDhCQUFFLGVBQWUsNEZBQUUsZUFBZSxtTUFBRSxpQkFBaUIsOEtBQUUsWUFBWSxvWUFBRSxjQUFjOzs0RkFHdkcsbUJBQW1CO2tCQUwvQixTQUFTO2lDQUNNLElBQUksV0FDUCxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9idXR0b24nO1xuaW1wb3J0IHsgQWN0aXZlRGlhbG9nLCBEaWFsb2dDb21wb25lbnQgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2RpYWxvZyc7XG5pbXBvcnQgeyBEeW5hbWljRm9ybU1vZHVsZSwgRHluYW1pY1N0cnVjdHVyZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9hbmd1bGFyLWNvbXBvbmVudHMvZHluYW1pYy1mb3JtJztcbmltcG9ydCB7IFRlbXBsYXRlTW9kdWxlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy90ZW1wbGF0ZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW1JlYWN0aXZlRm9ybXNNb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZSwgRGlhbG9nQ29tcG9uZW50LCBEeW5hbWljRm9ybU1vZHVsZSwgQnV0dG9uTW9kdWxlLCBUZW1wbGF0ZU1vZHVsZV0sXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xpbmstZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbn0pXG5leHBvcnQgY2xhc3MgTGlua0RpYWxvZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhY3RpdmVEaWFsb2cgPSBpbmplY3QoQWN0aXZlRGlhbG9nKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG5cbiAgICBpbml0aWFsVXJsID0gJyc7XG5cbiAgICBmb3JtID0gbmV3IEZvcm1Hcm91cCh7IHVybDogbmV3IEZvcm1Db250cm9sKCcnKSB9KTtcblxuICAgIGNvbmZpZ3M6IER5bmFtaWNTdHJ1Y3R1cmVbXSA9IFtdO1xuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybS5zZXRWYWx1ZSh7IHVybDogdGhpcy5pbml0aWFsVXJsIH0pO1xuICAgICAgICB0aGlzLmNvbmZpZ3MgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3JvdycsXG4gICAgICAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3VybCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ3BsYXRmb3JtLmFuZ3VsYXJfY29tcG9uZW50cy5lZGl0b3JfbGlua191cmxfbGFiZWwnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9saW5rX3VybF9wbGFjZWhvbGRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGNvbmZpcm0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWN0aXZlRGlhbG9nLmNsb3NlKHRoaXMuZm9ybS52YWx1ZS51cmw/LnRyaW0oKSA/PyAnJyk7XG4gICAgfVxuXG4gICAgY2FuY2VsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmFjdGl2ZURpYWxvZy5kaXNtaXNzKCk7XG4gICAgfVxufVxuXG4iLCI8cy1kaWFsb2cgW2hlYWRlcl09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmVkaXRvcl9pbnNlcnRfbGluaycgfCB0cmFuc2xhdGVcIj5cbiAgICA8bmctdGVtcGxhdGUgc1RlbXBsYXRlPVwiYm9keVwiPlxuICAgICAgICA8cy1keW5hbWljLWZvcm0gW2Zvcm1dPVwiZm9ybVwiIFtjb25maWdzXT1cImNvbmZpZ3NcIiAvPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLXRlbXBsYXRlIHNUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmQ7IGdhcDo4cHg7IHdpZHRoOjEwMCVcIj5cbiAgICAgICAgICAgIDxzLWJ1dHRvblxuICAgICAgICAgICAgICAgIFtsYWJlbF09XCIncGxhdGZvcm0uYW5ndWxhcl9jb21wb25lbnRzLmNhbmNlbCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHByaW9yaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJjYW5jZWwoKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAgPHMtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2xhYmVsXT1cIidwbGF0Zm9ybS5hbmd1bGFyX2NvbXBvbmVudHMuZWRpdG9yX2NvbmZpcm0nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICBwcmlvcml0eT1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgIChjbGlja2VkKT1cImNvbmZpcm0oKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L25nLXRlbXBsYXRlPlxuPC9zLWRpYWxvZz5cbiJdfQ==
|