valtech-components 4.0.972 → 4.0.973
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/esm2022/lib/components/organisms/rich-editor/rich-editor.component.mjs +71 -8
- package/esm2022/lib/components/organisms/rich-editor/rich-editor.i18n.mjs +3 -1
- package/esm2022/lib/version.mjs +2 -2
- package/fesm2022/valtech-components.mjs +69 -5
- package/fesm2022/valtech-components.mjs.map +1 -1
- package/lib/components/organisms/rich-editor/rich-editor.component.d.ts +13 -1
- package/lib/components/organisms/rich-editor/rich-editor.i18n.d.ts +2 -0
- package/lib/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { Component, EventEmitter, Input, Output, ViewChild, inject, signal, } from '@angular/core';
|
|
1
|
+
import { Component, EventEmitter, Injector, Input, Output, ViewChild, inject, signal, } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { IonButton, IonIcon } from '@ionic/angular/standalone';
|
|
3
|
+
import { IonButton, IonIcon, IonSpinner } from '@ionic/angular/standalone';
|
|
4
4
|
import { addIcons } from 'ionicons';
|
|
5
|
-
import { chatboxOutline, listOutline, removeOutline } from 'ionicons/icons';
|
|
5
|
+
import { chatboxOutline, imageOutline, listOutline, removeOutline } from 'ionicons/icons';
|
|
6
6
|
import { Editor } from '@tiptap/core';
|
|
7
7
|
import StarterKit from '@tiptap/starter-kit';
|
|
8
8
|
import Image from '@tiptap/extension-image';
|
|
9
9
|
import { I18nService } from '../../../services/i18n';
|
|
10
|
+
import { StorageService } from '../../../services/firebase/storage.service';
|
|
10
11
|
import { RICH_EDITOR_I18N } from './rich-editor.i18n';
|
|
11
12
|
import { tiptapDocToArticle } from './tiptap-to-article';
|
|
12
13
|
import { articleToTiptapDoc } from './article-to-tiptap';
|
|
@@ -14,7 +15,7 @@ import * as i0 from "@angular/core";
|
|
|
14
15
|
// Íconos de la toolbar. B/I/H2/H3 no tienen ícono Ionicons dedicado — se
|
|
15
16
|
// renderizan como texto ("B", "I", "H2", "H3") directo en el botón, mismo
|
|
16
17
|
// criterio que un editor de texto rico convencional (Google Docs, Notion).
|
|
17
|
-
addIcons({ listOutline, chatboxOutline, removeOutline });
|
|
18
|
+
addIcons({ listOutline, chatboxOutline, removeOutline, imageOutline });
|
|
18
19
|
/**
|
|
19
20
|
* val-rich-editor
|
|
20
21
|
*
|
|
@@ -40,11 +41,13 @@ export class RichEditorComponent {
|
|
|
40
41
|
this.props = {};
|
|
41
42
|
this.articleChange = new EventEmitter();
|
|
42
43
|
this.i18n = inject(I18nService);
|
|
44
|
+
this.injector = inject(Injector);
|
|
43
45
|
/** Se recalcula en cada `onUpdate`/`onSelectionUpdate` para reflejar el
|
|
44
46
|
* mark/nodo activo bajo el cursor (ej. el botón "B" resaltado si el
|
|
45
47
|
* cursor está dentro de texto en negrita). */
|
|
46
48
|
this._toolbarTick = signal(0);
|
|
47
49
|
this.toolbarButtons = signal([]);
|
|
50
|
+
this.uploadingImage = signal(false);
|
|
48
51
|
this.i18n.registerDefaults('RichEditor', RICH_EDITOR_I18N);
|
|
49
52
|
}
|
|
50
53
|
t(key) {
|
|
@@ -175,6 +178,36 @@ export class RichEditorComponent {
|
|
|
175
178
|
}
|
|
176
179
|
this.refreshToolbar();
|
|
177
180
|
}
|
|
181
|
+
/**
|
|
182
|
+
* Sube la imagen elegida vía `StorageService` (Regla #12 — nunca URL pegada
|
|
183
|
+
* a mano, siempre vía Storage) y la inserta en el punto del cursor.
|
|
184
|
+
* `StorageService` se resuelve perezosamente (vía `Injector`, no como
|
|
185
|
+
* campo de la clase): si la app consumer no configuró
|
|
186
|
+
* `provideValtechFirebase`, el editor sigue funcionando normal para todo
|
|
187
|
+
* lo demás — solo el botón de imagen queda sin efecto, con log de error en
|
|
188
|
+
* vez de romper el resto del componente.
|
|
189
|
+
*/
|
|
190
|
+
async onImageSelected(event) {
|
|
191
|
+
const input = event.target;
|
|
192
|
+
const file = input.files?.[0];
|
|
193
|
+
input.value = ''; // permite re-seleccionar el mismo archivo después
|
|
194
|
+
if (!file || !this.editor)
|
|
195
|
+
return;
|
|
196
|
+
this.uploadingImage.set(true);
|
|
197
|
+
try {
|
|
198
|
+
const storage = this.injector.get(StorageService);
|
|
199
|
+
const path = `rich-editor/${Date.now()}-${file.name}`;
|
|
200
|
+
const result = await storage.uploadAndGetUrl(path, file);
|
|
201
|
+
this.editor.chain().focus().setImage({ src: result.downloadUrl, alt: file.name }).run();
|
|
202
|
+
this.emitArticle(this.editor.getJSON());
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
console.error('[val-rich-editor] No se pudo subir la imagen — ¿la app configuró provideValtechFirebase?', err);
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
this.uploadingImage.set(false);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
178
211
|
ngOnDestroy() {
|
|
179
212
|
this.editor?.destroy();
|
|
180
213
|
}
|
|
@@ -221,15 +254,30 @@ export class RichEditorComponent {
|
|
|
221
254
|
}
|
|
222
255
|
</ion-button>
|
|
223
256
|
}
|
|
257
|
+
<!-- Label trick (mismo patrón que val-attachment-uploader): el
|
|
258
|
+
<label> nativo reenvía el clic al input como gesto confiable,
|
|
259
|
+
ion-button + input.click() programático falla en iOS PWA. -->
|
|
260
|
+
<label
|
|
261
|
+
class="rich-editor__image-btn"
|
|
262
|
+
[class.rich-editor__image-btn--disabled]="uploadingImage()"
|
|
263
|
+
[attr.aria-label]="t('image')"
|
|
264
|
+
>
|
|
265
|
+
@if (uploadingImage()) {
|
|
266
|
+
<ion-spinner name="dots" />
|
|
267
|
+
} @else {
|
|
268
|
+
<ion-icon name="image-outline" />
|
|
269
|
+
}
|
|
270
|
+
<input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
|
|
271
|
+
</label>
|
|
224
272
|
</div>
|
|
225
273
|
}
|
|
226
274
|
<div #editorHost class="rich-editor__surface"></div>
|
|
227
275
|
</div>
|
|
228
|
-
`, isInline: true, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
|
|
276
|
+
`, isInline: true, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__image-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 4px;border-radius:6px;color:var(--ion-color-dark, #232323);font-size:1.125rem;cursor:pointer}.rich-editor__image-btn:hover{background:#0000000f}.rich-editor__image-btn--disabled{opacity:.5;pointer-events:none}.rich-editor__image-btn input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }] }); }
|
|
229
277
|
}
|
|
230
278
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichEditorComponent, decorators: [{
|
|
231
279
|
type: Component,
|
|
232
|
-
args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon], template: `
|
|
280
|
+
args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon, IonSpinner], template: `
|
|
233
281
|
<div class="rich-editor" [class.rich-editor--disabled]="props.disabled">
|
|
234
282
|
@if (!props.disabled) {
|
|
235
283
|
<div class="rich-editor__toolbar" role="toolbar">
|
|
@@ -271,11 +319,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
271
319
|
}
|
|
272
320
|
</ion-button>
|
|
273
321
|
}
|
|
322
|
+
<!-- Label trick (mismo patrón que val-attachment-uploader): el
|
|
323
|
+
<label> nativo reenvía el clic al input como gesto confiable,
|
|
324
|
+
ion-button + input.click() programático falla en iOS PWA. -->
|
|
325
|
+
<label
|
|
326
|
+
class="rich-editor__image-btn"
|
|
327
|
+
[class.rich-editor__image-btn--disabled]="uploadingImage()"
|
|
328
|
+
[attr.aria-label]="t('image')"
|
|
329
|
+
>
|
|
330
|
+
@if (uploadingImage()) {
|
|
331
|
+
<ion-spinner name="dots" />
|
|
332
|
+
} @else {
|
|
333
|
+
<ion-icon name="image-outline" />
|
|
334
|
+
}
|
|
335
|
+
<input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
|
|
336
|
+
</label>
|
|
274
337
|
</div>
|
|
275
338
|
}
|
|
276
339
|
<div #editorHost class="rich-editor__surface"></div>
|
|
277
340
|
</div>
|
|
278
|
-
`, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"] }]
|
|
341
|
+
`, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__image-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 4px;border-radius:6px;color:var(--ion-color-dark, #232323);font-size:1.125rem;cursor:pointer}.rich-editor__image-btn:hover{background:#0000000f}.rich-editor__image-btn--disabled{opacity:.5;pointer-events:none}.rich-editor__image-btn input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"] }]
|
|
279
342
|
}], ctorParameters: () => [], propDecorators: { props: [{
|
|
280
343
|
type: Input
|
|
281
344
|
}], articleChange: [{
|
|
@@ -284,4 +347,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
284
347
|
type: ViewChild,
|
|
285
348
|
args: ['editorHost', { static: true }]
|
|
286
349
|
}] } });
|
|
287
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9yaWNoLWVkaXRvci9yaWNoLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1QsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0seUJBQXlCLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3JELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOztBQUd6RCx5RUFBeUU7QUFDekUsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSxRQUFRLENBQUMsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7QUFFekQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0Ft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Z0IsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUMvQixNQUFNO1lBQ1IsS0FBSyxXQUFXO2dCQUNkLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNoQyxNQUFNO1FBQ1YsQ0FBQztRQUNELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQzsrR0F6SlUsbUJBQW1CO21HQUFuQixtQkFBbUIsaVNBakRwQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThDVCw2c0RBL0NTLFlBQVksK0JBQUUsU0FBUyxvUEFBRSxPQUFPOzs0RkFrRC9CLG1CQUFtQjtrQkFyRC9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsWUFDakM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q1Q7d0RBSVEsS0FBSztzQkFBYixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBRW9DLFVBQVU7c0JBQXBELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGNoYXRib3hPdXRsaW5lLCBsaXN0T3V0bGluZSwgcmVtb3ZlT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcbmltcG9ydCB7IEVkaXRvciB9IGZyb20gJ0B0aXB0YXAvY29yZSc7XG5pbXBvcnQgU3RhcnRlcktpdCBmcm9tICdAdGlwdGFwL3N0YXJ0ZXIta2l0JztcbmltcG9ydCBJbWFnZSBmcm9tICdAdGlwdGFwL2V4dGVuc2lvbi1pbWFnZSc7XG5cbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBBcnRpY2xlTWV0YWRhdGEgfSBmcm9tICcuLi9hcnRpY2xlL3R5cGVzJztcbmltcG9ydCB7IFJpY2hFZGl0b3JNZXRhZGF0YSwgUmljaEVkaXRvclRvb2xiYXJCdXR0b24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFJJQ0hfRURJVE9SX0kxOE4gfSBmcm9tICcuL3JpY2gtZWRpdG9yLmkxOG4nO1xuaW1wb3J0IHsgdGlwdGFwRG9jVG9BcnRpY2xlIH0gZnJvbSAnLi90aXB0YXAtdG8tYXJ0aWNsZSc7XG5pbXBvcnQgeyBhcnRpY2xlVG9UaXB0YXBEb2MgfSBmcm9tICcuL2FydGljbGUtdG8tdGlwdGFwJztcbmltcG9ydCB0eXBlIHsgVGlwdGFwRG9jIH0gZnJvbSAnLi90aXB0YXAtdG8tYXJ0aWNsZSc7XG5cbi8vIMONY29ub3MgZGUgbGEgdG9vbGJhci4gQi9JL0gyL0gzIG5vIHRpZW5lbiDDrWNvbm8gSW9uaWNvbnMgZGVkaWNhZG8g4oCUIHNlXG4vLyByZW5kZXJpemFuIGNvbW8gdGV4dG8gKFwiQlwiLCBcIklcIiwgXCJIMlwiLCBcIkgzXCIpIGRpcmVjdG8gZW4gZWwgYm90w7NuLCBtaXNtb1xuLy8gY3JpdGVyaW8gcXVlIHVuIGVkaXRvciBkZSB0ZXh0byByaWNvIGNvbnZlbmNpb25hbCAoR29vZ2xlIERvY3MsIE5vdGlvbikuXG5hZGRJY29ucyh7IGxpc3RPdXRsaW5lLCBjaGF0Ym94T3V0bGluZSwgcmVtb3ZlT3V0bGluZSB9KTtcblxuLyoqXG4gKiB2YWwtcmljaC1lZGl0b3JcbiAqXG4gKiBPcmdhbmlzbTogZWRpdG9yIFdZU0lXWUcgcmV1c2FibGUgcGFyYSB0b2RhIGxhIHBsYXRhZm9ybWEsIHNvYnJlIFRpcFRhcC5cbiAqIEVtaXRlIGBBcnRpY2xlTWV0YWRhdGFgIOKAlCBlbCBtaXNtbyBjb250cmF0byBxdWUgYHZhbC1hcnRpY2xlYCByZW5kZXJpemEsXG4gKiBxdWUgdGFtYmnDqW4gcHJvZHVjZW4gTWFya2Rvd24gKGBwYXJzZU1hcmtkb3duQXJ0aWNsZWApIHkgKGEgZnV0dXJvKSBlbFxuICogcGFnZSBidWlsZGVyLiBFbCBjb25zdW1lciBudW5jYSB0b2NhIFRpcFRhcCBkaXJlY3RhbWVudGUuXG4gKlxuICogQ29iZXJ0dXJhIGRlIGxhIHRvb2xiYXIgdjE6IG5lZ3JpdGEsIGN1cnNpdmEsIHTDrXR1bG8gKEgyKSwgc3VidMOtdHVsbyAoSDMpLFxuICogbGlzdGEgY29uL3NpbiB2acOxZXRhcywgY2l0YSwgc2VwYXJhZG9yLCBpbWFnZW4uIFZlciBgdGlwdGFwLXRvLWFydGljbGUudHNgXG4gKiBwYXJhIHF1w6kgdGlwb3MgZGUgYEFydGljbGVFbGVtZW50YCBwdWVkZSBwcm9kdWNpciBlbCBlZGl0b3IgaG95LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8dmFsLXJpY2gtZWRpdG9yXG4gKiAgIFtwcm9wc109XCJ7IGluaXRpYWxWYWx1ZTogcmVjaXBlLmRlc2NyaXB0aW9uQXJ0aWNsZSwgcGxhY2Vob2xkZXI6ICdFc2NyaWJlIGxhIHByZXBhcmFjacOzbi4uLicgfVwiXG4gKiAgIChhcnRpY2xlQ2hhbmdlKT1cIm9uQXJ0aWNsZUNoYW5nZSgkZXZlbnQpXCJcbiAqIC8+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXJpY2gtZWRpdG9yJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW9uQnV0dG9uLCBJb25JY29uXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicmljaC1lZGl0b3JcIiBbY2xhc3MucmljaC1lZGl0b3ItLWRpc2FibGVkXT1cInByb3BzLmRpc2FibGVkXCI+XG4gICAgICBAaWYgKCFwcm9wcy5kaXNhYmxlZCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicmljaC1lZGl0b3JfX3Rvb2xiYXJcIiByb2xlPVwidG9vbGJhclwiPlxuICAgICAgICAgIEBmb3IgKGJ0biBvZiB0b29sYmFyQnV0dG9ucygpOyB0cmFjayBidG4udG9rZW4pIHtcbiAgICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAgIGZpbGw9XCJjbGVhclwiXG4gICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5yaWNoLWVkaXRvcl9fYnRuLS1hY3RpdmVdPVwiYnRuLmlzQWN0aXZlXCJcbiAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImJ0bi5kaXNhYmxlZFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYnRuLmxhYmVsXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImJ0bi5pc0FjdGl2ZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJydW5Db21tYW5kKGJ0bi50b2tlbilcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBAc3dpdGNoIChidG4udG9rZW4pIHtcbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2JvbGQnKSB7XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkI8L3N0cm9uZz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdpdGFsaWMnKSB7XG4gICAgICAgICAgICAgICAgICA8ZW0+STwvZW0+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnaGVhZGluZzInKSB7XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkgyPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnaGVhZGluZzMnKSB7XG4gICAgICAgICAgICAgICAgICA8c3Ryb25nPkgzPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnYnVsbGV0TGlzdCcpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwibGlzdC1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnb3JkZXJlZExpc3QnKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImxpc3Qtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ3F1b3RlJykge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjaGF0Ym94LW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdzZXBhcmF0b3InKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cInJlbW92ZS1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgI2VkaXRvckhvc3QgY2xhc3M9XCJyaWNoLWVkaXRvcl9fc3VyZmFjZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vcmljaC1lZGl0b3IuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBSaWNoRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwcm9wczogUmljaEVkaXRvck1ldGFkYXRhID0ge307XG4gIEBPdXRwdXQoKSBhcnRpY2xlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnRpY2xlTWV0YWRhdGE+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZWRpdG9ySG9zdCcsIHsgc3RhdGljOiB0cnVlIH0pIGVkaXRvckhvc3QhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGVkaXRvcj86IEVkaXRvcjtcblxuICAvKiogU2UgcmVjYWxjdWxhIGVuIGNhZGEgYG9uVXBkYXRlYC9gb25TZWxlY3Rpb25VcGRhdGVgIHBhcmEgcmVmbGVqYXIgZWxcbiAgICogbWFyay9ub2RvIGFjdGl2byBiYWpvIGVsIGN1cnNvciAoZWouIGVsIGJvdMOzbiBcIkJcIiByZXNhbHRhZG8gc2kgZWxcbiAgICogY3Vyc29yIGVzdMOhIGRlbnRybyBkZSB0ZXh0byBlbiBuZWdyaXRhKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBfdG9vbGJhclRpY2sgPSBzaWduYWwoMCk7XG4gIHJlYWRvbmx5IHRvb2xiYXJCdXR0b25zID0gc2lnbmFsPFJpY2hFZGl0b3JUb29sYmFyQnV0dG9uW10+KFtdKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnUmljaEVkaXRvcicsIFJJQ0hfRURJVE9SX0kxOE4pO1xuICB9XG5cbiAgcHJpdmF0ZSB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnUmljaEVkaXRvcicpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yID0gbmV3IEVkaXRvcih7XG4gICAgICBlbGVtZW50OiB0aGlzLmVkaXRvckhvc3QubmF0aXZlRWxlbWVudCxcbiAgICAgIGV4dGVuc2lvbnM6IFtTdGFydGVyS2l0LCBJbWFnZV0sXG4gICAgICBlZGl0YWJsZTogIXRoaXMucHJvcHMuZGlzYWJsZWQsXG4gICAgICBjb250ZW50OiB0aGlzLnByb3BzLmluaXRpYWxWYWx1ZVxuICAgICAgICA/IChhcnRpY2xlVG9UaXB0YXBEb2ModGhpcy5wcm9wcy5pbml0aWFsVmFsdWUpIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICAgIDogJycsXG4gICAgICBlZGl0b3JQcm9wczoge1xuICAgICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgICAgJ2RhdGEtcGxhY2Vob2xkZXInOiB0aGlzLnByb3BzLnBsYWNlaG9sZGVyID8/ICcnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG9uVXBkYXRlOiAoeyBlZGl0b3IgfSkgPT4ge1xuICAgICAgICB0aGlzLmVtaXRBcnRpY2xlKGVkaXRvci5nZXRKU09OKCkgYXMgVGlwdGFwRG9jKTtcbiAgICAgICAgdGhpcy5yZWZyZXNoVG9vbGJhcigpO1xuICAgICAgfSxcbiAgICAgIG9uU2VsZWN0aW9uVXBkYXRlOiAoKSA9PiB0aGlzLnJlZnJlc2hUb29sYmFyKCksXG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoVG9vbGJhcigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWydwcm9wcyddPy5jdXJyZW50VmFsdWUgJiYgdGhpcy5lZGl0b3IpIHtcbiAgICAgIHRoaXMuZWRpdG9yLnNldEVkaXRhYmxlKCF0aGlzLnByb3BzLmRpc2FibGVkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRBcnRpY2xlKGRvYzogVGlwdGFwRG9jKTogdm9pZCB7XG4gICAgdGhpcy5hcnRpY2xlQ2hhbmdlLmVtaXQodGlwdGFwRG9jVG9BcnRpY2xlKGRvYykpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVG9vbGJhcigpOiB2b2lkIHtcbiAgICBjb25zdCBlZGl0b3IgPSB0aGlzLmVkaXRvcjtcbiAgICBpZiAoIWVkaXRvcikgcmV0dXJuO1xuICAgIHRoaXMudG9vbGJhckJ1dHRvbnMuc2V0KFtcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdib2xkJyxcbiAgICAgICAgaWNvbjogJycsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ2JvbGQnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnYm9sZCcpLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2l0YWxpYycsXG4gICAgICAgIGljb246ICcnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdpdGFsaWMnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnaXRhbGljJyksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnaGVhZGluZzInLFxuICAgICAgICBpY29uOiAnJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnaGVhZGluZzInKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnaGVhZGluZycsIHsgbGV2ZWw6IDIgfSksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnaGVhZGluZzMnLFxuICAgICAgICBpY29uOiAnJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnaGVhZGluZzMnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnaGVhZGluZycsIHsgbGV2ZWw6IDMgfSksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnYnVsbGV0TGlzdCcsXG4gICAgICAgIGljb246ICdsaXN0LW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdidWxsZXRMaXN0JyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2J1bGxldExpc3QnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdvcmRlcmVkTGlzdCcsXG4gICAgICAgIGljb246ICdsaXN0LW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdvcmRlcmVkTGlzdCcpLFxuICAgICAgICBpc0FjdGl2ZTogZWRpdG9yLmlzQWN0aXZlKCdvcmRlcmVkTGlzdCcpLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ3F1b3RlJyxcbiAgICAgICAgaWNvbjogJ2NoYXRib3gtb3V0bGluZScsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ3F1b3RlJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2Jsb2NrcXVvdGUnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdzZXBhcmF0b3InLFxuICAgICAgICBpY29uOiAncmVtb3ZlLW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdzZXBhcmF0b3InKSxcbiAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF0pO1xuICB9XG5cbiAgcnVuQ29tbWFuZCh0b2tlbjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICBjb25zdCBjaGFpbiA9IGVkaXRvci5jaGFpbigpLmZvY3VzKCk7XG4gICAgc3dpdGNoICh0b2tlbikge1xuICAgICAgY2FzZSAnYm9sZCc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUJvbGQoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdpdGFsaWMnOlxuICAgICAgICBjaGFpbi50b2dnbGVJdGFsaWMoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdoZWFkaW5nMic6XG4gICAgICAgIGNoYWluLnRvZ2dsZUhlYWRpbmcoeyBsZXZlbDogMiB9KS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdoZWFkaW5nMyc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUhlYWRpbmcoeyBsZXZlbDogMyB9KS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdidWxsZXRMaXN0JzpcbiAgICAgICAgY2hhaW4udG9nZ2xlQnVsbGV0TGlzdCgpLnJ1bigpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ29yZGVyZWRMaXN0JzpcbiAgICAgICAgY2hhaW4udG9nZ2xlT3JkZXJlZExpc3QoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdxdW90ZSc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUJsb2NrcXVvdGUoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzZXBhcmF0b3InOlxuICAgICAgICBjaGFpbi5zZXRIb3Jpem9udGFsUnVsZSgpLnJ1bigpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5yZWZyZXNoVG9vbGJhcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5lZGl0b3I/LmRlc3Ryb3koKTtcbiAgfVxufVxuIl19
|
|
350
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9yaWNoLWVkaXRvci9yaWNoLWVkaXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osUUFBUSxFQUNSLEtBQUssRUFHTCxNQUFNLEVBRU4sU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzFGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0seUJBQXlCLENBQUM7QUFFNUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUc1RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFHekQseUVBQXlFO0FBQ3pFLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0UsUUFBUSxDQUFD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aWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdG9yLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW9uQnV0dG9uLCBJb25JY29uLCBJb25TcGlubmVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGNoYXRib3hPdXRsaW5lLCBpbWFnZU91dGxpbmUsIGxpc3RPdXRsaW5lLCByZW1vdmVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgRWRpdG9yIH0gZnJvbSAnQHRpcHRhcC9jb3JlJztcbmltcG9ydCBTdGFydGVyS2l0IGZyb20gJ0B0aXB0YXAvc3RhcnRlci1raXQnO1xuaW1wb3J0IEltYWdlIGZyb20gJ0B0aXB0YXAvZXh0ZW5zaW9uLWltYWdlJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmlyZWJhc2Uvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFydGljbGVNZXRhZGF0YSB9IGZyb20gJy4uL2FydGljbGUvdHlwZXMnO1xuaW1wb3J0IHsgUmljaEVkaXRvck1ldGFkYXRhLCBSaWNoRWRpdG9yVG9vbGJhckJ1dHRvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgUklDSF9FRElUT1JfSTE4TiB9IGZyb20gJy4vcmljaC1lZGl0b3IuaTE4bic7XG5pbXBvcnQgeyB0aXB0YXBEb2NUb0FydGljbGUgfSBmcm9tICcuL3RpcHRhcC10by1hcnRpY2xlJztcbmltcG9ydCB7IGFydGljbGVUb1RpcHRhcERvYyB9IGZyb20gJy4vYXJ0aWNsZS10by10aXB0YXAnO1xuaW1wb3J0IHR5cGUgeyBUaXB0YXBEb2MgfSBmcm9tICcuL3RpcHRhcC10by1hcnRpY2xlJztcblxuLy8gw41jb25vcyBkZSBsYSB0b29sYmFyLiBCL0kvSDIvSDMgbm8gdGllbmVuIMOtY29ubyBJb25pY29ucyBkZWRpY2FkbyDigJQgc2Vcbi8vIHJlbmRlcml6YW4gY29tbyB0ZXh0byAoXCJCXCIsIFwiSVwiLCBcIkgyXCIsIFwiSDNcIikgZGlyZWN0byBlbiBlbCBib3TDs24sIG1pc21vXG4vLyBjcml0ZXJpbyBxdWUgdW4gZWRpdG9yIGRlIHRleHRvIHJpY28gY29udmVuY2lvbmFsIChHb29nbGUgRG9jcywgTm90aW9uKS5cbmFkZEljb25zKHsgbGlzdE91dGxpbmUsIGNoYXRib3hPdXRsaW5lLCByZW1vdmVPdXRsaW5lLCBpbWFnZU91dGxpbmUgfSk7XG5cbi8qKlxuICogdmFsLXJpY2gtZWRpdG9yXG4gKlxuICogT3JnYW5pc206IGVkaXRvciBXWVNJV1lHIHJldXNhYmxlIHBhcmEgdG9kYSBsYSBwbGF0YWZvcm1hLCBzb2JyZSBUaXBUYXAuXG4gKiBFbWl0ZSBgQXJ0aWNsZU1ldGFkYXRhYCDigJQgZWwgbWlzbW8gY29udHJhdG8gcXVlIGB2YWwtYXJ0aWNsZWAgcmVuZGVyaXphLFxuICogcXVlIHRhbWJpw6luIHByb2R1Y2VuIE1hcmtkb3duIChgcGFyc2VNYXJrZG93bkFydGljbGVgKSB5IChhIGZ1dHVybykgZWxcbiAqIHBhZ2UgYnVpbGRlci4gRWwgY29uc3VtZXIgbnVuY2EgdG9jYSBUaXBUYXAgZGlyZWN0YW1lbnRlLlxuICpcbiAqIENvYmVydHVyYSBkZSBsYSB0b29sYmFyIHYxOiBuZWdyaXRhLCBjdXJzaXZhLCB0w610dWxvIChIMiksIHN1YnTDrXR1bG8gKEgzKSxcbiAqIGxpc3RhIGNvbi9zaW4gdmnDsWV0YXMsIGNpdGEsIHNlcGFyYWRvciwgaW1hZ2VuLiBWZXIgYHRpcHRhcC10by1hcnRpY2xlLnRzYFxuICogcGFyYSBxdcOpIHRpcG9zIGRlIGBBcnRpY2xlRWxlbWVudGAgcHVlZGUgcHJvZHVjaXIgZWwgZWRpdG9yIGhveS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPHZhbC1yaWNoLWVkaXRvclxuICogICBbcHJvcHNdPVwieyBpbml0aWFsVmFsdWU6IHJlY2lwZS5kZXNjcmlwdGlvbkFydGljbGUsIHBsYWNlaG9sZGVyOiAnRXNjcmliZSBsYSBwcmVwYXJhY2nDs24uLi4nIH1cIlxuICogICAoYXJ0aWNsZUNoYW5nZSk9XCJvbkFydGljbGVDaGFuZ2UoJGV2ZW50KVwiXG4gKiAvPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1yaWNoLWVkaXRvcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIElvbkJ1dHRvbiwgSW9uSWNvbiwgSW9uU3Bpbm5lcl0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJpY2gtZWRpdG9yXCIgW2NsYXNzLnJpY2gtZWRpdG9yLS1kaXNhYmxlZF09XCJwcm9wcy5kaXNhYmxlZFwiPlxuICAgICAgQGlmICghcHJvcHMuZGlzYWJsZWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJpY2gtZWRpdG9yX190b29sYmFyXCIgcm9sZT1cInRvb2xiYXJcIj5cbiAgICAgICAgICBAZm9yIChidG4gb2YgdG9vbGJhckJ1dHRvbnMoKTsgdHJhY2sgYnRuLnRva2VuKSB7XG4gICAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgICBmaWxsPVwiY2xlYXJcIlxuICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICBbY2xhc3MucmljaC1lZGl0b3JfX2J0bi0tYWN0aXZlXT1cImJ0bi5pc0FjdGl2ZVwiXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidG4uZGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImJ0bi5sYWJlbFwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJidG4uaXNBY3RpdmVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwicnVuQ29tbWFuZChidG4udG9rZW4pXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgQHN3aXRjaCAoYnRuLnRva2VuKSB7XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdib2xkJykge1xuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5CPC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnaXRhbGljJykge1xuICAgICAgICAgICAgICAgICAgPGVtPkk8L2VtPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2hlYWRpbmcyJykge1xuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5IMjwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2hlYWRpbmczJykge1xuICAgICAgICAgICAgICAgICAgPHN0cm9uZz5IMzwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ2J1bGxldExpc3QnKSB7XG4gICAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImxpc3Qtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBAY2FzZSAoJ29yZGVyZWRMaXN0Jykge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJsaXN0LW91dGxpbmVcIiBzbG90PVwiaWNvbi1vbmx5XCIgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGNhc2UgKCdxdW90ZScpIHtcbiAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hhdGJveC1vdXRsaW5lXCIgc2xvdD1cImljb24tb25seVwiIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBjYXNlICgnc2VwYXJhdG9yJykge1xuICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJyZW1vdmUtb3V0bGluZVwiIHNsb3Q9XCJpY29uLW9ubHlcIiAvPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8IS0tIExhYmVsIHRyaWNrIChtaXNtbyBwYXRyw7NuIHF1ZSB2YWwtYXR0YWNobWVudC11cGxvYWRlcik6IGVsXG4gICAgICAgICAgICAgICA8bGFiZWw+IG5hdGl2byByZWVudsOtYSBlbCBjbGljIGFsIGlucHV0IGNvbW8gZ2VzdG8gY29uZmlhYmxlLFxuICAgICAgICAgICAgICAgaW9uLWJ1dHRvbiArIGlucHV0LmNsaWNrKCkgcHJvZ3JhbcOhdGljbyBmYWxsYSBlbiBpT1MgUFdBLiAtLT5cbiAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgIGNsYXNzPVwicmljaC1lZGl0b3JfX2ltYWdlLWJ0blwiXG4gICAgICAgICAgICBbY2xhc3MucmljaC1lZGl0b3JfX2ltYWdlLWJ0bi0tZGlzYWJsZWRdPVwidXBsb2FkaW5nSW1hZ2UoKVwiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2ltYWdlJylcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIEBpZiAodXBsb2FkaW5nSW1hZ2UoKSkge1xuICAgICAgICAgICAgICA8aW9uLXNwaW5uZXIgbmFtZT1cImRvdHNcIiAvPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaW1hZ2Utb3V0bGluZVwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBhY2NlcHQ9XCJpbWFnZS8qXCIgW2Rpc2FibGVkXT1cInVwbG9hZGluZ0ltYWdlKClcIiAoY2hhbmdlKT1cIm9uSW1hZ2VTZWxlY3RlZCgkZXZlbnQpXCIgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgI2VkaXRvckhvc3QgY2xhc3M9XCJyaWNoLWVkaXRvcl9fc3VyZmFjZVwiPjwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBzdHlsZVVybDogJy4vcmljaC1lZGl0b3IuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBSaWNoRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwcm9wczogUmljaEVkaXRvck1ldGFkYXRhID0ge307XG4gIEBPdXRwdXQoKSBhcnRpY2xlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnRpY2xlTWV0YWRhdGE+KCk7XG5cbiAgQFZpZXdDaGlsZCgnZWRpdG9ySG9zdCcsIHsgc3RhdGljOiB0cnVlIH0pIGVkaXRvckhvc3QhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcblxuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSBlZGl0b3I/OiBFZGl0b3I7XG5cbiAgLyoqIFNlIHJlY2FsY3VsYSBlbiBjYWRhIGBvblVwZGF0ZWAvYG9uU2VsZWN0aW9uVXBkYXRlYCBwYXJhIHJlZmxlamFyIGVsXG4gICAqIG1hcmsvbm9kbyBhY3Rpdm8gYmFqbyBlbCBjdXJzb3IgKGVqLiBlbCBib3TDs24gXCJCXCIgcmVzYWx0YWRvIHNpIGVsXG4gICAqIGN1cnNvciBlc3TDoSBkZW50cm8gZGUgdGV4dG8gZW4gbmVncml0YSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgX3Rvb2xiYXJUaWNrID0gc2lnbmFsKDApO1xuICByZWFkb25seSB0b29sYmFyQnV0dG9ucyA9IHNpZ25hbDxSaWNoRWRpdG9yVG9vbGJhckJ1dHRvbltdPihbXSk7XG4gIHJlYWRvbmx5IHVwbG9hZGluZ0ltYWdlID0gc2lnbmFsKGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnUmljaEVkaXRvcicsIFJJQ0hfRURJVE9SX0kxOE4pO1xuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgJ1JpY2hFZGl0b3InKTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmVkaXRvciA9IG5ldyBFZGl0b3Ioe1xuICAgICAgZWxlbWVudDogdGhpcy5lZGl0b3JIb3N0Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiBbU3RhcnRlcktpdCwgSW1hZ2VdLFxuICAgICAgZWRpdGFibGU6ICF0aGlzLnByb3BzLmRpc2FibGVkLFxuICAgICAgY29udGVudDogdGhpcy5wcm9wcy5pbml0aWFsVmFsdWVcbiAgICAgICAgPyAoYXJ0aWNsZVRvVGlwdGFwRG9jKHRoaXMucHJvcHMuaW5pdGlhbFZhbHVlKSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVxuICAgICAgICA6ICcnLFxuICAgICAgZWRpdG9yUHJvcHM6IHtcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICdkYXRhLXBsYWNlaG9sZGVyJzogdGhpcy5wcm9wcy5wbGFjZWhvbGRlciA/PyAnJyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvblVwZGF0ZTogKHsgZWRpdG9yIH0pID0+IHtcbiAgICAgICAgdGhpcy5lbWl0QXJ0aWNsZShlZGl0b3IuZ2V0SlNPTigpIGFzIFRpcHRhcERvYyk7XG4gICAgICAgIHRoaXMucmVmcmVzaFRvb2xiYXIoKTtcbiAgICAgIH0sXG4gICAgICBvblNlbGVjdGlvblVwZGF0ZTogKCkgPT4gdGhpcy5yZWZyZXNoVG9vbGJhcigpLFxuICAgIH0pO1xuICAgIHRoaXMucmVmcmVzaFRvb2xiYXIoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sncHJvcHMnXT8uY3VycmVudFZhbHVlICYmIHRoaXMuZWRpdG9yKSB7XG4gICAgICB0aGlzLmVkaXRvci5zZXRFZGl0YWJsZSghdGhpcy5wcm9wcy5kaXNhYmxlZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBlbWl0QXJ0aWNsZShkb2M6IFRpcHRhcERvYyk6IHZvaWQge1xuICAgIHRoaXMuYXJ0aWNsZUNoYW5nZS5lbWl0KHRpcHRhcERvY1RvQXJ0aWNsZShkb2MpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFRvb2xiYXIoKTogdm9pZCB7XG4gICAgY29uc3QgZWRpdG9yID0gdGhpcy5lZGl0b3I7XG4gICAgaWYgKCFlZGl0b3IpIHJldHVybjtcbiAgICB0aGlzLnRvb2xiYXJCdXR0b25zLnNldChbXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnYm9sZCcsXG4gICAgICAgIGljb246ICcnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdib2xkJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2JvbGQnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdpdGFsaWMnLFxuICAgICAgICBpY29uOiAnJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnaXRhbGljJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2l0YWxpYycpLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2hlYWRpbmcyJyxcbiAgICAgICAgaWNvbjogJycsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ2hlYWRpbmcyJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2hlYWRpbmcnLCB7IGxldmVsOiAyIH0pLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2hlYWRpbmczJyxcbiAgICAgICAgaWNvbjogJycsXG4gICAgICAgIGxhYmVsOiB0aGlzLnQoJ2hlYWRpbmczJyksXG4gICAgICAgIGlzQWN0aXZlOiBlZGl0b3IuaXNBY3RpdmUoJ2hlYWRpbmcnLCB7IGxldmVsOiAzIH0pLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0b2tlbjogJ2J1bGxldExpc3QnLFxuICAgICAgICBpY29uOiAnbGlzdC1vdXRsaW5lJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnYnVsbGV0TGlzdCcpLFxuICAgICAgICBpc0FjdGl2ZTogZWRpdG9yLmlzQWN0aXZlKCdidWxsZXRMaXN0JyksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnb3JkZXJlZExpc3QnLFxuICAgICAgICBpY29uOiAnbGlzdC1vdXRsaW5lJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnb3JkZXJlZExpc3QnKSxcbiAgICAgICAgaXNBY3RpdmU6IGVkaXRvci5pc0FjdGl2ZSgnb3JkZXJlZExpc3QnKSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdG9rZW46ICdxdW90ZScsXG4gICAgICAgIGljb246ICdjaGF0Ym94LW91dGxpbmUnLFxuICAgICAgICBsYWJlbDogdGhpcy50KCdxdW90ZScpLFxuICAgICAgICBpc0FjdGl2ZTogZWRpdG9yLmlzQWN0aXZlKCdibG9ja3F1b3RlJyksXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAnc2VwYXJhdG9yJyxcbiAgICAgICAgaWNvbjogJ3JlbW92ZS1vdXRsaW5lJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnc2VwYXJhdG9yJyksXG4gICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdKTtcbiAgfVxuXG4gIHJ1bkNvbW1hbmQodG9rZW46IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9IHRoaXMuZWRpdG9yO1xuICAgIGlmICghZWRpdG9yKSByZXR1cm47XG4gICAgY29uc3QgY2hhaW4gPSBlZGl0b3IuY2hhaW4oKS5mb2N1cygpO1xuICAgIHN3aXRjaCAodG9rZW4pIHtcbiAgICAgIGNhc2UgJ2JvbGQnOlxuICAgICAgICBjaGFpbi50b2dnbGVCb2xkKCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaXRhbGljJzpcbiAgICAgICAgY2hhaW4udG9nZ2xlSXRhbGljKCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaGVhZGluZzInOlxuICAgICAgICBjaGFpbi50b2dnbGVIZWFkaW5nKHsgbGV2ZWw6IDIgfSkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaGVhZGluZzMnOlxuICAgICAgICBjaGFpbi50b2dnbGVIZWFkaW5nKHsgbGV2ZWw6IDMgfSkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYnVsbGV0TGlzdCc6XG4gICAgICAgIGNoYWluLnRvZ2dsZUJ1bGxldExpc3QoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdvcmRlcmVkTGlzdCc6XG4gICAgICAgIGNoYWluLnRvZ2dsZU9yZGVyZWRMaXN0KCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncXVvdGUnOlxuICAgICAgICBjaGFpbi50b2dnbGVCbG9ja3F1b3RlKCkucnVuKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VwYXJhdG9yJzpcbiAgICAgICAgY2hhaW4uc2V0SG9yaXpvbnRhbFJ1bGUoKS5ydW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMucmVmcmVzaFRvb2xiYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdWJlIGxhIGltYWdlbiBlbGVnaWRhIHbDrWEgYFN0b3JhZ2VTZXJ2aWNlYCAoUmVnbGEgIzEyIOKAlCBudW5jYSBVUkwgcGVnYWRhXG4gICAqIGEgbWFubywgc2llbXByZSB2w61hIFN0b3JhZ2UpIHkgbGEgaW5zZXJ0YSBlbiBlbCBwdW50byBkZWwgY3Vyc29yLlxuICAgKiBgU3RvcmFnZVNlcnZpY2VgIHNlIHJlc3VlbHZlIHBlcmV6b3NhbWVudGUgKHbDrWEgYEluamVjdG9yYCwgbm8gY29tb1xuICAgKiBjYW1wbyBkZSBsYSBjbGFzZSk6IHNpIGxhIGFwcCBjb25zdW1lciBubyBjb25maWd1csOzXG4gICAqIGBwcm92aWRlVmFsdGVjaEZpcmViYXNlYCwgZWwgZWRpdG9yIHNpZ3VlIGZ1bmNpb25hbmRvIG5vcm1hbCBwYXJhIHRvZG9cbiAgICogbG8gZGVtw6FzIOKAlCBzb2xvIGVsIGJvdMOzbiBkZSBpbWFnZW4gcXVlZGEgc2luIGVmZWN0bywgY29uIGxvZyBkZSBlcnJvciBlblxuICAgKiB2ZXogZGUgcm9tcGVyIGVsIHJlc3RvIGRlbCBjb21wb25lbnRlLlxuICAgKi9cbiAgYXN5bmMgb25JbWFnZVNlbGVjdGVkKGV2ZW50OiBFdmVudCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG4gICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XG4gICAgaW5wdXQudmFsdWUgPSAnJzsgLy8gcGVybWl0ZSByZS1zZWxlY2Npb25hciBlbCBtaXNtbyBhcmNoaXZvIGRlc3B1w6lzXG4gICAgaWYgKCFmaWxlIHx8ICF0aGlzLmVkaXRvcikgcmV0dXJuO1xuXG4gICAgdGhpcy51cGxvYWRpbmdJbWFnZS5zZXQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSB0aGlzLmluamVjdG9yLmdldChTdG9yYWdlU2VydmljZSk7XG4gICAgICBjb25zdCBwYXRoID0gYHJpY2gtZWRpdG9yLyR7RGF0ZS5ub3coKX0tJHtmaWxlLm5hbWV9YDtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN0b3JhZ2UudXBsb2FkQW5kR2V0VXJsKHBhdGgsIGZpbGUpO1xuICAgICAgdGhpcy5lZGl0b3IuY2hhaW4oKS5mb2N1cygpLnNldEltYWdlKHsgc3JjOiByZXN1bHQuZG93bmxvYWRVcmwsIGFsdDogZmlsZS5uYW1lIH0pLnJ1bigpO1xuICAgICAgdGhpcy5lbWl0QXJ0aWNsZSh0aGlzLmVkaXRvci5nZXRKU09OKCkgYXMgVGlwdGFwRG9jKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1t2YWwtcmljaC1lZGl0b3JdIE5vIHNlIHB1ZG8gc3ViaXIgbGEgaW1hZ2VuIOKAlCDCv2xhIGFwcCBjb25maWd1csOzIHByb3ZpZGVWYWx0ZWNoRmlyZWJhc2U/JywgZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy51cGxvYWRpbmdJbWFnZS5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZWRpdG9yPy5kZXN0cm95KCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -12,6 +12,7 @@ export const RICH_EDITOR_I18N = {
|
|
|
12
12
|
orderedList: 'Lista numerada',
|
|
13
13
|
quote: 'Cita',
|
|
14
14
|
separator: 'Separador',
|
|
15
|
+
image: 'Insertar imagen',
|
|
15
16
|
},
|
|
16
17
|
en: {
|
|
17
18
|
bold: 'Bold',
|
|
@@ -22,6 +23,7 @@ export const RICH_EDITOR_I18N = {
|
|
|
22
23
|
orderedList: 'Numbered list',
|
|
23
24
|
quote: 'Quote',
|
|
24
25
|
separator: 'Separator',
|
|
26
|
+
image: 'Insert image',
|
|
25
27
|
},
|
|
26
28
|
};
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmljaC1lZGl0b3IuaTE4bi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvcmljaC1lZGl0b3IvcmljaC1lZGl0b3IuaTE4bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRztJQUM5QixFQUFFLEVBQUU7UUFDRixJQUFJLEVBQUUsU0FBUztRQUNmLE1BQU0sRUFBRSxTQUFTO1FBQ2pCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLFFBQVEsRUFBRSxXQUFXO1FBQ3JCLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsV0FBVyxFQUFFLGdCQUFnQjtRQUM3QixLQUFLLEVBQUUsTUFBTTtRQUNiLFNBQVMsRUFBRSxXQUFXO1FBQ3RCLEtBQUssRUFBRSxpQkFBaUI7S0FDekI7SUFDRCxFQUFFLEVBQUU7UUFDRixJQUFJLEVBQUUsTUFBTTtRQUNaLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFFBQVEsRUFBRSxTQUFTO1FBQ25CLFFBQVEsRUFBRSxZQUFZO1FBQ3RCLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFdBQVcsRUFBRSxlQUFlO1FBQzVCLEtBQUssRUFBRSxPQUFPO1FBQ2QsU0FBUyxFQUFFLFdBQVc7UUFDdEIsS0FBSyxFQUFFLGNBQWM7S0FDdEI7Q0FDTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWZhdWx0cyBpMThuIChlcy9lbikgZGVsIGB2YWwtcmljaC1lZGl0b3JgLiBBdXRvLXJlZ2lzdHJhZG9zIGVuIGVsXG4gKiBjb25zdHJ1Y3RvciAobmFtZXNwYWNlIGBSaWNoRWRpdG9yYCkg4oCUIGVsIGNvbnN1bWVyIG51bmNhIGxvcyByZWdpc3RyYS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJJQ0hfRURJVE9SX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgYm9sZDogJ05lZ3JpdGEnLFxuICAgIGl0YWxpYzogJ0N1cnNpdmEnLFxuICAgIGhlYWRpbmcyOiAnVMOtdHVsbycsXG4gICAgaGVhZGluZzM6ICdTdWJ0w610dWxvJyxcbiAgICBidWxsZXRMaXN0OiAnTGlzdGEgY29uIHZpw7FldGFzJyxcbiAgICBvcmRlcmVkTGlzdDogJ0xpc3RhIG51bWVyYWRhJyxcbiAgICBxdW90ZTogJ0NpdGEnLFxuICAgIHNlcGFyYXRvcjogJ1NlcGFyYWRvcicsXG4gICAgaW1hZ2U6ICdJbnNlcnRhciBpbWFnZW4nLFxuICB9LFxuICBlbjoge1xuICAgIGJvbGQ6ICdCb2xkJyxcbiAgICBpdGFsaWM6ICdJdGFsaWMnLFxuICAgIGhlYWRpbmcyOiAnSGVhZGluZycsXG4gICAgaGVhZGluZzM6ICdTdWJoZWFkaW5nJyxcbiAgICBidWxsZXRMaXN0OiAnQnVsbGV0IGxpc3QnLFxuICAgIG9yZGVyZWRMaXN0OiAnTnVtYmVyZWQgbGlzdCcsXG4gICAgcXVvdGU6ICdRdW90ZScsXG4gICAgc2VwYXJhdG9yOiAnU2VwYXJhdG9yJyxcbiAgICBpbWFnZTogJ0luc2VydCBpbWFnZScsXG4gIH0sXG59IGFzIGNvbnN0O1xuIl19
|
package/esm2022/lib/version.mjs
CHANGED
|
@@ -2,5 +2,5 @@
|
|
|
2
2
|
* Current version of valtech-components.
|
|
3
3
|
* This is automatically updated during the publish process.
|
|
4
4
|
*/
|
|
5
|
-
export const VERSION = '4.0.
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
export const VERSION = '4.0.973';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC45NzMnO1xuIl19
|
|
@@ -70,7 +70,7 @@ import fixWebmDuration from 'fix-webm-duration';
|
|
|
70
70
|
* Current version of valtech-components.
|
|
71
71
|
* This is automatically updated during the publish process.
|
|
72
72
|
*/
|
|
73
|
-
const VERSION = '4.0.
|
|
73
|
+
const VERSION = '4.0.973';
|
|
74
74
|
|
|
75
75
|
function evaluateValtechAccess(rule, context, features = {}, visitedFeatures = new Set()) {
|
|
76
76
|
if (rule == null)
|
|
@@ -39420,6 +39420,7 @@ const RICH_EDITOR_I18N = {
|
|
|
39420
39420
|
orderedList: 'Lista numerada',
|
|
39421
39421
|
quote: 'Cita',
|
|
39422
39422
|
separator: 'Separador',
|
|
39423
|
+
image: 'Insertar imagen',
|
|
39423
39424
|
},
|
|
39424
39425
|
en: {
|
|
39425
39426
|
bold: 'Bold',
|
|
@@ -39430,6 +39431,7 @@ const RICH_EDITOR_I18N = {
|
|
|
39430
39431
|
orderedList: 'Numbered list',
|
|
39431
39432
|
quote: 'Quote',
|
|
39432
39433
|
separator: 'Separator',
|
|
39434
|
+
image: 'Insert image',
|
|
39433
39435
|
},
|
|
39434
39436
|
};
|
|
39435
39437
|
|
|
@@ -39682,7 +39684,7 @@ function articleToTiptapDoc(article) {
|
|
|
39682
39684
|
// Íconos de la toolbar. B/I/H2/H3 no tienen ícono Ionicons dedicado — se
|
|
39683
39685
|
// renderizan como texto ("B", "I", "H2", "H3") directo en el botón, mismo
|
|
39684
39686
|
// criterio que un editor de texto rico convencional (Google Docs, Notion).
|
|
39685
|
-
addIcons({ listOutline, chatboxOutline, removeOutline });
|
|
39687
|
+
addIcons({ listOutline, chatboxOutline, removeOutline, imageOutline });
|
|
39686
39688
|
/**
|
|
39687
39689
|
* val-rich-editor
|
|
39688
39690
|
*
|
|
@@ -39708,11 +39710,13 @@ class RichEditorComponent {
|
|
|
39708
39710
|
this.props = {};
|
|
39709
39711
|
this.articleChange = new EventEmitter();
|
|
39710
39712
|
this.i18n = inject(I18nService);
|
|
39713
|
+
this.injector = inject(Injector);
|
|
39711
39714
|
/** Se recalcula en cada `onUpdate`/`onSelectionUpdate` para reflejar el
|
|
39712
39715
|
* mark/nodo activo bajo el cursor (ej. el botón "B" resaltado si el
|
|
39713
39716
|
* cursor está dentro de texto en negrita). */
|
|
39714
39717
|
this._toolbarTick = signal(0);
|
|
39715
39718
|
this.toolbarButtons = signal([]);
|
|
39719
|
+
this.uploadingImage = signal(false);
|
|
39716
39720
|
this.i18n.registerDefaults('RichEditor', RICH_EDITOR_I18N);
|
|
39717
39721
|
}
|
|
39718
39722
|
t(key) {
|
|
@@ -39843,6 +39847,36 @@ class RichEditorComponent {
|
|
|
39843
39847
|
}
|
|
39844
39848
|
this.refreshToolbar();
|
|
39845
39849
|
}
|
|
39850
|
+
/**
|
|
39851
|
+
* Sube la imagen elegida vía `StorageService` (Regla #12 — nunca URL pegada
|
|
39852
|
+
* a mano, siempre vía Storage) y la inserta en el punto del cursor.
|
|
39853
|
+
* `StorageService` se resuelve perezosamente (vía `Injector`, no como
|
|
39854
|
+
* campo de la clase): si la app consumer no configuró
|
|
39855
|
+
* `provideValtechFirebase`, el editor sigue funcionando normal para todo
|
|
39856
|
+
* lo demás — solo el botón de imagen queda sin efecto, con log de error en
|
|
39857
|
+
* vez de romper el resto del componente.
|
|
39858
|
+
*/
|
|
39859
|
+
async onImageSelected(event) {
|
|
39860
|
+
const input = event.target;
|
|
39861
|
+
const file = input.files?.[0];
|
|
39862
|
+
input.value = ''; // permite re-seleccionar el mismo archivo después
|
|
39863
|
+
if (!file || !this.editor)
|
|
39864
|
+
return;
|
|
39865
|
+
this.uploadingImage.set(true);
|
|
39866
|
+
try {
|
|
39867
|
+
const storage = this.injector.get(StorageService);
|
|
39868
|
+
const path = `rich-editor/${Date.now()}-${file.name}`;
|
|
39869
|
+
const result = await storage.uploadAndGetUrl(path, file);
|
|
39870
|
+
this.editor.chain().focus().setImage({ src: result.downloadUrl, alt: file.name }).run();
|
|
39871
|
+
this.emitArticle(this.editor.getJSON());
|
|
39872
|
+
}
|
|
39873
|
+
catch (err) {
|
|
39874
|
+
console.error('[val-rich-editor] No se pudo subir la imagen — ¿la app configuró provideValtechFirebase?', err);
|
|
39875
|
+
}
|
|
39876
|
+
finally {
|
|
39877
|
+
this.uploadingImage.set(false);
|
|
39878
|
+
}
|
|
39879
|
+
}
|
|
39846
39880
|
ngOnDestroy() {
|
|
39847
39881
|
this.editor?.destroy();
|
|
39848
39882
|
}
|
|
@@ -39889,15 +39923,30 @@ class RichEditorComponent {
|
|
|
39889
39923
|
}
|
|
39890
39924
|
</ion-button>
|
|
39891
39925
|
}
|
|
39926
|
+
<!-- Label trick (mismo patrón que val-attachment-uploader): el
|
|
39927
|
+
<label> nativo reenvía el clic al input como gesto confiable,
|
|
39928
|
+
ion-button + input.click() programático falla en iOS PWA. -->
|
|
39929
|
+
<label
|
|
39930
|
+
class="rich-editor__image-btn"
|
|
39931
|
+
[class.rich-editor__image-btn--disabled]="uploadingImage()"
|
|
39932
|
+
[attr.aria-label]="t('image')"
|
|
39933
|
+
>
|
|
39934
|
+
@if (uploadingImage()) {
|
|
39935
|
+
<ion-spinner name="dots" />
|
|
39936
|
+
} @else {
|
|
39937
|
+
<ion-icon name="image-outline" />
|
|
39938
|
+
}
|
|
39939
|
+
<input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
|
|
39940
|
+
</label>
|
|
39892
39941
|
</div>
|
|
39893
39942
|
}
|
|
39894
39943
|
<div #editorHost class="rich-editor__surface"></div>
|
|
39895
39944
|
</div>
|
|
39896
|
-
`, isInline: true, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
|
|
39945
|
+
`, isInline: true, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__image-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 4px;border-radius:6px;color:var(--ion-color-dark, #232323);font-size:1.125rem;cursor:pointer}.rich-editor__image-btn:hover{background:#0000000f}.rich-editor__image-btn--disabled{opacity:.5;pointer-events:none}.rich-editor__image-btn input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }] }); }
|
|
39897
39946
|
}
|
|
39898
39947
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RichEditorComponent, decorators: [{
|
|
39899
39948
|
type: Component,
|
|
39900
|
-
args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon], template: `
|
|
39949
|
+
args: [{ selector: 'val-rich-editor', standalone: true, imports: [CommonModule, IonButton, IonIcon, IonSpinner], template: `
|
|
39901
39950
|
<div class="rich-editor" [class.rich-editor--disabled]="props.disabled">
|
|
39902
39951
|
@if (!props.disabled) {
|
|
39903
39952
|
<div class="rich-editor__toolbar" role="toolbar">
|
|
@@ -39939,11 +39988,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
39939
39988
|
}
|
|
39940
39989
|
</ion-button>
|
|
39941
39990
|
}
|
|
39991
|
+
<!-- Label trick (mismo patrón que val-attachment-uploader): el
|
|
39992
|
+
<label> nativo reenvía el clic al input como gesto confiable,
|
|
39993
|
+
ion-button + input.click() programático falla en iOS PWA. -->
|
|
39994
|
+
<label
|
|
39995
|
+
class="rich-editor__image-btn"
|
|
39996
|
+
[class.rich-editor__image-btn--disabled]="uploadingImage()"
|
|
39997
|
+
[attr.aria-label]="t('image')"
|
|
39998
|
+
>
|
|
39999
|
+
@if (uploadingImage()) {
|
|
40000
|
+
<ion-spinner name="dots" />
|
|
40001
|
+
} @else {
|
|
40002
|
+
<ion-icon name="image-outline" />
|
|
40003
|
+
}
|
|
40004
|
+
<input type="file" accept="image/*" [disabled]="uploadingImage()" (change)="onImageSelected($event)" />
|
|
40005
|
+
</label>
|
|
39942
40006
|
</div>
|
|
39943
40007
|
}
|
|
39944
40008
|
<div #editorHost class="rich-editor__surface"></div>
|
|
39945
40009
|
</div>
|
|
39946
|
-
`, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"] }]
|
|
40010
|
+
`, styles: [".rich-editor{display:flex;flex-direction:column;gap:8px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));border-radius:8px;overflow:hidden}.rich-editor--disabled{opacity:.7}.rich-editor__toolbar{display:flex;flex-wrap:wrap;gap:2px;padding:6px 8px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-light, #f4f5f8)}.rich-editor__toolbar ion-button{--padding-start: 8px;--padding-end: 8px;margin:0;font-size:.8125rem;min-width:32px}.rich-editor__btn--active{--background: rgba(var(--ion-color-primary-rgb), .14);--color: var(--ion-color-primary);border-radius:6px}.rich-editor__image-btn{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;margin:0 0 0 4px;border-radius:6px;color:var(--ion-color-dark, #232323);font-size:1.125rem;cursor:pointer}.rich-editor__image-btn:hover{background:#0000000f}.rich-editor__image-btn--disabled{opacity:.5;pointer-events:none}.rich-editor__image-btn input[type=file]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.rich-editor__surface{padding:12px 16px;min-height:160px}.rich-editor__surface ::ng-deep .ProseMirror{outline:none;min-height:140px;color:var(--ion-text-color, #000);font-size:.9375rem;line-height:1.5}.rich-editor__surface ::ng-deep .ProseMirror p.is-editor-empty:first-child:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);float:left;height:0;pointer-events:none}.rich-editor__surface ::ng-deep .ProseMirror p{margin:0 0 .75em}.rich-editor__surface ::ng-deep .ProseMirror h1,.rich-editor__surface ::ng-deep .ProseMirror h2,.rich-editor__surface ::ng-deep .ProseMirror h3{margin:0 0 .5em;color:var(--ion-text-color, #000)}.rich-editor__surface ::ng-deep .ProseMirror blockquote{margin:0 0 .75em;padding-left:12px;border-left:3px solid var(--ion-color-primary, #3880ff);color:var(--ion-color-medium, #92949c)}.rich-editor__surface ::ng-deep .ProseMirror ul,.rich-editor__surface ::ng-deep .ProseMirror ol{margin:0 0 .75em;padding-left:24px}.rich-editor__surface ::ng-deep .ProseMirror img{max-width:100%;border-radius:8px}\n"] }]
|
|
39947
40011
|
}], ctorParameters: () => [], propDecorators: { props: [{
|
|
39948
40012
|
type: Input
|
|
39949
40013
|
}], articleChange: [{
|