@talrace/ngx-noder 0.0.16 → 0.0.18
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/README.md +72 -9
- package/assets/i18n/noder.en.json +93 -0
- package/assets/i18n/noder.es.json +93 -0
- package/assets/i18n/noder.ru.json +93 -0
- package/esm2022/lib/apart-components/add-link-dialog/add-link-dialog.component.mjs +21 -21
- package/esm2022/lib/apart-components/add-link-mobile/add-link-mobile.component.mjs +5 -3
- package/esm2022/lib/apart-components/confirm-dialog/confirm-dialog.component.mjs +5 -3
- package/esm2022/lib/apart-components/editor-search/editor-search-dialog.component.mjs +14 -3
- package/esm2022/lib/apart-components/editor-title/editor-title.component.mjs +17 -14
- package/esm2022/lib/apart-components/editor-title-mobile/editor-title-mobile.component.mjs +5 -3
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/color-picker/color-picker.component.mjs +3 -3
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/font/font.component.mjs +3 -3
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/format/format.component.mjs +3 -3
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/numbering/numbering.component.mjs +3 -3
- package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns/menu-dropdowns.component.mjs +4 -3
- package/esm2022/lib/apart-components/editor-toolbar/components/menu-dropdowns-mobile/menu-dropdowns-mobile.component.mjs +4 -3
- package/esm2022/lib/apart-components/editor-toolbar/components/toolbar-actions/toolbar-actions.component.mjs +2 -2
- package/esm2022/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.mjs +18 -16
- package/esm2022/lib/apart-components/editor-toolbar/editor-toolbar.module.mjs +8 -13
- package/esm2022/lib/apart-components/insert-table-mobile/insert-table-mobile.component.mjs +5 -3
- package/esm2022/lib/apart-components/text-format-mobile/text-format-mobile.component.mjs +14 -3
- package/esm2022/lib/editor/components/edges/edge.component.mjs +48 -6
- package/esm2022/lib/editor/components/edges/edges.mjs +7 -29
- package/esm2022/lib/editor/components/external-element/models/external-element.model.mjs +4 -4
- package/esm2022/lib/editor/components/shared/services/component.service.mjs +1 -13
- package/esm2022/lib/editor/components/shared/services/custom-content.service.mjs +1 -7
- package/esm2022/lib/editor/components/table/overlay-menu/overlay-menu.component.mjs +29 -19
- package/esm2022/lib/editor/display/layers/pages.layer.mjs +13 -1
- package/esm2022/lib/editor/editor.module.mjs +28 -4
- package/esm2022/lib/editor/execution/edit.session.mjs +5 -4
- package/esm2022/lib/editor/execution/editor.mjs +2 -1
- package/esm2022/lib/editor/gadgets/scrollbar.mjs +11 -6
- package/esm2022/lib/editor/interaction/editor.service.mjs +27 -1
- package/esm2022/lib/translate/noder-translate.loader.mjs +22 -0
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/talrace-ngx-noder.mjs +283 -189
- package/fesm2022/talrace-ngx-noder.mjs.map +1 -1
- package/lib/apart-components/add-link-dialog/add-link-dialog.component.d.ts +1 -10
- package/lib/apart-components/editor-title/editor-title.component.d.ts +5 -3
- package/lib/apart-components/editor-toolbar/editor-mobile-toolbar/editor-mobile-toolbar.component.d.ts +3 -1
- package/lib/apart-components/editor-toolbar/editor-toolbar.module.d.ts +23 -23
- package/lib/editor/components/edges/edge.component.d.ts +10 -3
- package/lib/editor/components/edges/edges.d.ts +0 -2
- package/lib/editor/components/external-element/models/external-element.model.d.ts +3 -3
- package/lib/editor/components/shared/services/component.service.d.ts +0 -5
- package/lib/editor/components/shared/services/custom-content.service.d.ts +0 -2
- package/lib/editor/components/table/overlay-menu/overlay-menu.component.d.ts +3 -1
- package/lib/editor/editor.module.d.ts +2 -1
- package/lib/editor/gadgets/scrollbar.d.ts +1 -0
- package/lib/editor/interaction/editor.service.d.ts +8 -0
- package/lib/translate/noder-translate.loader.d.ts +11 -0
- package/package.json +3 -1
- package/public-api.d.ts +1 -0
- package/esm2022/lib/apart-components/editor-toolbar/components/buttons/heading/heading.component.mjs +0 -22
- package/lib/apart-components/editor-toolbar/components/buttons/heading/heading.component.d.ts +0 -8
package/README.md
CHANGED
|
@@ -14,6 +14,64 @@ Run this command to add ngx-noder package to your project
|
|
|
14
14
|
npm i @talrace/ngx-noder
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
+
### Translation
|
|
18
|
+
|
|
19
|
+
NgxNoder uses @ngx-translate for its translations. Its should be included to list of static application assets and application should import TranslateModule. NgxNoder translates are loaded by NoderTranslateLoader.
|
|
20
|
+
|
|
21
|
+
angular.json
|
|
22
|
+
|
|
23
|
+
```typescript
|
|
24
|
+
"assets": [
|
|
25
|
+
...
|
|
26
|
+
{ "glob": "**/*", "input": "node_modules/@talrace/ngx-noder/assets", "output": "assets" }
|
|
27
|
+
],
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
app.module.ts
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
34
|
+
|
|
35
|
+
@NgModule({
|
|
36
|
+
imports: [
|
|
37
|
+
...
|
|
38
|
+
TranslateModule.forRoot()
|
|
39
|
+
],
|
|
40
|
+
...
|
|
41
|
+
})
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
NgxNoder translates loading
|
|
45
|
+
|
|
46
|
+
app.module.ts (if application do not have own translations, preferred language can be set by the 'use' method of TranslateService)
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
import { NoderTranslateLoader } from '@talrace/ngx-noder';
|
|
50
|
+
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
|
51
|
+
|
|
52
|
+
@NgModule({
|
|
53
|
+
imports: [
|
|
54
|
+
...
|
|
55
|
+
TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: NoderTranslateLoader } })
|
|
56
|
+
],
|
|
57
|
+
...
|
|
58
|
+
})
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
service or state where translation is controlled (if application have own translations)
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import { NoderTranslateLoader } from '@talrace/ngx-noder';
|
|
65
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
66
|
+
...
|
|
67
|
+
constructor(private translateService: TranslateService, private noderTranslateLoader: NoderTranslateLoader) {}
|
|
68
|
+
...
|
|
69
|
+
this.noderTranslateLoader
|
|
70
|
+
.getTranslation(language)
|
|
71
|
+
.pipe(take(1))
|
|
72
|
+
.subscribe(x => this.translateService.setTranslation(language, x, true))
|
|
73
|
+
```
|
|
74
|
+
|
|
17
75
|
### Editor
|
|
18
76
|
|
|
19
77
|
Import editor module. This is basic module and provides creating, editing and viewing document functionality.
|
|
@@ -98,6 +156,15 @@ export class SomeModule {}
|
|
|
98
156
|
|
|
99
157
|
Example of full-featured NgxNoder with toolbar, header, custom search and receiving commands from editor.
|
|
100
158
|
|
|
159
|
+
angular.json
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
"assets": [
|
|
163
|
+
...
|
|
164
|
+
{ "glob": "**/*", "input": "node_modules/@talrace/ngx-noder/assets", "output": "assets" }
|
|
165
|
+
],
|
|
166
|
+
```
|
|
167
|
+
|
|
101
168
|
app.module.ts
|
|
102
169
|
|
|
103
170
|
```typescript
|
|
@@ -111,6 +178,8 @@ import {
|
|
|
111
178
|
EditorToolbarModule
|
|
112
179
|
} from '@talrace/ngx-noder';
|
|
113
180
|
import { NgModule } from '@angular/core';
|
|
181
|
+
import { NoderTranslateLoader } from '@talrace/ngx-noder';
|
|
182
|
+
import { TranslateLoader, TranslateModule } from '@ngx-translate/core';
|
|
114
183
|
|
|
115
184
|
@NgModule({
|
|
116
185
|
declarations: [AppComponent],
|
|
@@ -124,7 +193,8 @@ import { NgModule } from '@angular/core';
|
|
|
124
193
|
EditorSearchDialogComponent,
|
|
125
194
|
EditorTitleComponent,
|
|
126
195
|
EditorTitleMobileComponent,
|
|
127
|
-
EditorToolbarModule
|
|
196
|
+
EditorToolbarModule,
|
|
197
|
+
TranslateModule.forRoot({ loader: { provide: TranslateLoader, useClass: NoderTranslateLoader } })
|
|
128
198
|
…
|
|
129
199
|
],
|
|
130
200
|
providers: [EditorService, ElementApiService, ImageUploadService],
|
|
@@ -233,7 +303,6 @@ import { ActivatedRoute } from '@angular/router';
|
|
|
233
303
|
import { BehaviorSubject, filter, Observable, Subject, take, takeUntil, tap } from 'rxjs';
|
|
234
304
|
import {
|
|
235
305
|
AddLinkDialogComponent,
|
|
236
|
-
AddLinkDialogOptions,
|
|
237
306
|
AddLinkMobileComponent,
|
|
238
307
|
BreakTypes,
|
|
239
308
|
CommandsService,
|
|
@@ -418,14 +487,8 @@ export class AppComponent extends DestroyComponent {
|
|
|
418
487
|
if (this.isMobile) {
|
|
419
488
|
this.editorService.openSidenav(AddLinkMobileComponent);
|
|
420
489
|
} else {
|
|
421
|
-
const data = new AddLinkDialogOptions({
|
|
422
|
-
textPlaceholder: 'Text',
|
|
423
|
-
linkPlaceholder: 'Link',
|
|
424
|
-
title: 'Add Link'
|
|
425
|
-
});
|
|
426
|
-
|
|
427
490
|
this.dialog
|
|
428
|
-
.open(AddLinkDialogComponent, { panelClass: 'add-link-dialog'
|
|
491
|
+
.open(AddLinkDialogComponent, { panelClass: 'add-link-dialog' })
|
|
429
492
|
.afterClosed()
|
|
430
493
|
.subscribe((result: any) => {
|
|
431
494
|
if (result) {
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"NODER": {
|
|
3
|
+
"COMPLEX_LABEL": {
|
|
4
|
+
"INSERT_COLUMNS_TO_THE_LEFT": "Insert {{ count }} columns to the left",
|
|
5
|
+
"INSERT_COLUMNS_TO_THE_RIGHT": "Insert {{ count }} columns to the right",
|
|
6
|
+
"INSERT_ROWS_ABOVE": "Insert {{ count }} rows above",
|
|
7
|
+
"INSERT_ROWS_BELOW": "Insert {{ count }} rows below",
|
|
8
|
+
"OF_COUNTER": "{{ current }} of {{ total }}",
|
|
9
|
+
"REMOVE_COLUMNS": "Remove {{ count }} columns",
|
|
10
|
+
"REMOVE_ROWS": "Remove {{ count }} rows"
|
|
11
|
+
},
|
|
12
|
+
"LABEL": {
|
|
13
|
+
"ADD_LINK": "Add Link",
|
|
14
|
+
"ALIGN": "Align",
|
|
15
|
+
"ALIGNMENT": "Alignment",
|
|
16
|
+
"APPLY": "Apply",
|
|
17
|
+
"BOLD": "Bold",
|
|
18
|
+
"BULLETED_AND_NUMBERED_LIST": "Bulleted & Numbered List",
|
|
19
|
+
"BULLETS_AND_NUMBERING": "Bullets & Numbering",
|
|
20
|
+
"BULLET_LIST_MENU": "Bullet List Menu",
|
|
21
|
+
"CANCEL": "Cancel",
|
|
22
|
+
"CENTER": "Center",
|
|
23
|
+
"CLOSE": "Close",
|
|
24
|
+
"COLUMNS": "Columns",
|
|
25
|
+
"CONFIRMATION": "Confirmation",
|
|
26
|
+
"COPY": "Copy",
|
|
27
|
+
"CUT": "Cut",
|
|
28
|
+
"DELETE": "Delete",
|
|
29
|
+
"DOUBLE_CLICK_TO_RENAME": "Double click to rename",
|
|
30
|
+
"EDIT": "Edit",
|
|
31
|
+
"EDIT_DOCUMENT": "Edit document",
|
|
32
|
+
"EVEN_PAGES_FOOTER": "Even Pages Footer",
|
|
33
|
+
"EVEN_PAGES_HEADER": "Even Pages Header",
|
|
34
|
+
"FILE": "File",
|
|
35
|
+
"FILL_OR_PRINT_DOCUMENT": "Fill or print document",
|
|
36
|
+
"FIRST_PAGE_FOOTER": "First Page Footer",
|
|
37
|
+
"FIRST_PAGE_HEADER": "First Page Header",
|
|
38
|
+
"FONT": "Font",
|
|
39
|
+
"FOOTER": "Footer",
|
|
40
|
+
"FORMAT": "Format",
|
|
41
|
+
"HEADER": "Header",
|
|
42
|
+
"HEADERS_AND_FOOTERS": "Headers & Footers",
|
|
43
|
+
"IMAGE": "Image",
|
|
44
|
+
"INSERT": "Insert",
|
|
45
|
+
"INSERT_COLUMN_TO_THE_LEFT": "Insert column to the left",
|
|
46
|
+
"INSERT_COLUMN_TO_THE_RIGHT": "Insert column to the right",
|
|
47
|
+
"INSERT_FORMAT": "Insert Format",
|
|
48
|
+
"INSERT_LINK": "Insert Link",
|
|
49
|
+
"INSERT_ROW_ABOVE": "Insert row above",
|
|
50
|
+
"INSERT_ROW_BELOW": "Insert row below",
|
|
51
|
+
"INSERT_TABLE": "Insert Table",
|
|
52
|
+
"ITALIC": "Italic",
|
|
53
|
+
"LAYOUT": "Layout",
|
|
54
|
+
"LEFT": "Left",
|
|
55
|
+
"LINK": "Link",
|
|
56
|
+
"LINK_OPTIONS": "Link Options",
|
|
57
|
+
"NEW": "New",
|
|
58
|
+
"NONE": "None",
|
|
59
|
+
"NUMBERED_LIST_MENU": "Numbered List Menu",
|
|
60
|
+
"ODD_PAGES_FOOTER": "Odd Pages Footer",
|
|
61
|
+
"ODD_PAGES_HEADER": "Odd Pages Header",
|
|
62
|
+
"OPEN_FROM": "Open From",
|
|
63
|
+
"PAGE_BREAK": "Page Break",
|
|
64
|
+
"PASTE": "Paste",
|
|
65
|
+
"PRINT": "Print",
|
|
66
|
+
"QUICK_SELECT": "Quick Select",
|
|
67
|
+
"READ_OR_PRINT_DOCUMENT": "Read or print document",
|
|
68
|
+
"REDO": "Redo",
|
|
69
|
+
"REMOVE_COLUMN": "Remove column",
|
|
70
|
+
"REMOVE_ROW": "Remove row",
|
|
71
|
+
"RENAME": "Rename",
|
|
72
|
+
"REPLACE": "Replace",
|
|
73
|
+
"REPLACE_WITH": "Replace with",
|
|
74
|
+
"RIGHT": "Right",
|
|
75
|
+
"ROWS": "Rows",
|
|
76
|
+
"SAVE_AS": "Save As",
|
|
77
|
+
"SEARCH_FOR": "Search for",
|
|
78
|
+
"SELECT_ALL": "Select All",
|
|
79
|
+
"TABLE": "Table",
|
|
80
|
+
"TABLE_OPTIONS": "Table Options",
|
|
81
|
+
"TEXT": "Text",
|
|
82
|
+
"TEXT_FORMAT": "Text Format",
|
|
83
|
+
"TEXT_STYLE": "Text Style",
|
|
84
|
+
"THE_COLUMN_IS_REQUIRED": "The Columns is required",
|
|
85
|
+
"THE_LINK_IS_REQUIRED": "The Link is required",
|
|
86
|
+
"THE_ROW_IS_REQUIRED": "The Rows is required",
|
|
87
|
+
"THE_TEXT_IS_REQUIRED": "The Text is required",
|
|
88
|
+
"UNDERLINED": "Underlined",
|
|
89
|
+
"UNDO": "Undo",
|
|
90
|
+
"UNTITLED_DOCUMENT": "Untitled document"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"NODER": {
|
|
3
|
+
"COMPLEX_LABEL": {
|
|
4
|
+
"INSERT_COLUMNS_TO_THE_LEFT": "Inserte {{ count }} columnas a la izquierda",
|
|
5
|
+
"INSERT_COLUMNS_TO_THE_RIGHT": "Inserte {{ count }} columnas a la derecha",
|
|
6
|
+
"INSERT_ROWS_ABOVE": "Inserte {{ count }} filas arriba",
|
|
7
|
+
"INSERT_ROWS_BELOW": "Inserte {{ count }} filas debajo",
|
|
8
|
+
"OF_COUNTER": "{{ current }} de {{ total }}",
|
|
9
|
+
"REMOVE_COLUMNS": "Eliminar columnas {{ count }} ",
|
|
10
|
+
"REMOVE_ROWS": "Eliminar {{ count }} filas"
|
|
11
|
+
},
|
|
12
|
+
"LABEL": {
|
|
13
|
+
"ADD_LINK": "Añadir Enlace",
|
|
14
|
+
"ALIGN": "Alinear",
|
|
15
|
+
"ALIGNMENT": "Alineación",
|
|
16
|
+
"APPLY": "Aplicar",
|
|
17
|
+
"BOLD": "Negrita",
|
|
18
|
+
"BULLETED_AND_NUMBERED_LIST": "Lista Numerada y con Viñetas",
|
|
19
|
+
"BULLETS_AND_NUMBERING": "Viñetas y Numeración",
|
|
20
|
+
"BULLET_LIST_MENU": "Menú de Lista de Viñetas",
|
|
21
|
+
"CANCEL": "Cancelar",
|
|
22
|
+
"CENTER": "Centro",
|
|
23
|
+
"CLOSE": "Cerrar",
|
|
24
|
+
"COLUMNS": "Columnas",
|
|
25
|
+
"CONFIRMATION": "Confirmación",
|
|
26
|
+
"COPY": "Copia",
|
|
27
|
+
"CUT": "Corte",
|
|
28
|
+
"DELETE": "Suprimir",
|
|
29
|
+
"DOUBLE_CLICK_TO_RENAME": "Haga doble clic para cambiar el nombre",
|
|
30
|
+
"EDIT": "Editar",
|
|
31
|
+
"EDIT_DOCUMENT": "Editar documento",
|
|
32
|
+
"EVEN_PAGES_FOOTER": "Pie de Página Uniforme",
|
|
33
|
+
"EVEN_PAGES_HEADER": "Encabezado de Páginas Pares",
|
|
34
|
+
"FILE": "Archivo",
|
|
35
|
+
"FILL_OR_PRINT_DOCUMENT": "Rellenar o imprimir documento",
|
|
36
|
+
"FIRST_PAGE_FOOTER": "Pie de Página de la Primera Página",
|
|
37
|
+
"FIRST_PAGE_HEADER": "Encabezado de la Primera Página",
|
|
38
|
+
"FONT": "Fuente",
|
|
39
|
+
"FOOTER": "Pie de página",
|
|
40
|
+
"FORMAT": "Formato",
|
|
41
|
+
"HEADER": "Cabecera",
|
|
42
|
+
"HEADERS_AND_FOOTERS": "Encabezados y Pies de página",
|
|
43
|
+
"IMAGE": "Imagen",
|
|
44
|
+
"INSERT": "Insertar",
|
|
45
|
+
"INSERT_COLUMN_TO_THE_LEFT": "Insertar columna a la izquierda",
|
|
46
|
+
"INSERT_COLUMN_TO_THE_RIGHT": "Insertar columna a la derecha",
|
|
47
|
+
"INSERT_FORMAT": "Formato de Inserción",
|
|
48
|
+
"INSERT_LINK": "Insertar Enlace",
|
|
49
|
+
"INSERT_ROW_ABOVE": "Insertar fila arriba",
|
|
50
|
+
"INSERT_ROW_BELOW": "Insertar fila debajo",
|
|
51
|
+
"INSERT_TABLE": "Insertar Tabla",
|
|
52
|
+
"ITALIC": "Cursiva",
|
|
53
|
+
"LAYOUT": "Maquetación",
|
|
54
|
+
"LEFT": "Izquierda",
|
|
55
|
+
"LINK": "Enlace",
|
|
56
|
+
"LINK_OPTIONS": "Opciones de Enlace",
|
|
57
|
+
"NEW": "Nuevo",
|
|
58
|
+
"NONE": "Ninguna",
|
|
59
|
+
"NUMBERED_LIST_MENU": "Menú de Lista Numerada",
|
|
60
|
+
"ODD_PAGES_FOOTER": "Pie de Página de Páginas Impares",
|
|
61
|
+
"ODD_PAGES_HEADER": "Encabezado de Páginas Impares",
|
|
62
|
+
"OPEN_FROM": "Abierto Desde",
|
|
63
|
+
"PAGE_BREAK": "Salto de Página",
|
|
64
|
+
"PASTE": "Pasta",
|
|
65
|
+
"PRINT": "Imprimir",
|
|
66
|
+
"QUICK_SELECT": "Selección Rápida",
|
|
67
|
+
"READ_OR_PRINT_DOCUMENT": "Leer o imprimir documento",
|
|
68
|
+
"REDO": "Rehacer",
|
|
69
|
+
"REMOVE_COLUMN": "Eliminar columna",
|
|
70
|
+
"REMOVE_ROW": "Eliminar fila",
|
|
71
|
+
"RENAME": "Renombrar",
|
|
72
|
+
"REPLACE": "Reemplazar",
|
|
73
|
+
"REPLACE_WITH": "Reemplazar con",
|
|
74
|
+
"RIGHT": "Correcto",
|
|
75
|
+
"ROWS": "Filas",
|
|
76
|
+
"SAVE_AS": "Guardar Como",
|
|
77
|
+
"SEARCH_FOR": "Buscar por",
|
|
78
|
+
"SELECT_ALL": "Seleccionar Todo",
|
|
79
|
+
"TABLE": "Cuadro",
|
|
80
|
+
"TABLE_OPTIONS": "Opciones de Tabla",
|
|
81
|
+
"TEXT": "Texto",
|
|
82
|
+
"TEXT_FORMAT": "Formato de Texto",
|
|
83
|
+
"TEXT_STYLE": "Estilo de Texto",
|
|
84
|
+
"THE_COLUMN_IS_REQUIRED": "Las Columnas son obligatorias",
|
|
85
|
+
"THE_LINK_IS_REQUIRED": "El Enlace es obligatorio",
|
|
86
|
+
"THE_ROW_IS_REQUIRED": "Se requieren las filas",
|
|
87
|
+
"THE_TEXT_IS_REQUIRED": "El Texto es obligatorio",
|
|
88
|
+
"UNDERLINED": "Subrayado",
|
|
89
|
+
"UNDO": "Deshacer",
|
|
90
|
+
"UNTITLED_DOCUMENT": "Documento sin título"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"NODER": {
|
|
3
|
+
"COMPLEX_LABEL": {
|
|
4
|
+
"INSERT_COLUMNS_TO_THE_LEFT": "Вставить {{ count }} столбцов слева",
|
|
5
|
+
"INSERT_COLUMNS_TO_THE_RIGHT": "Вставить {{ count }} столбцов справа",
|
|
6
|
+
"INSERT_ROWS_ABOVE": "Вставить {{ count }} строк выше",
|
|
7
|
+
"INSERT_ROWS_BELOW": "Вставить {{ count }} строк ниже",
|
|
8
|
+
"OF_COUNTER": "{{ current }} из {{ total }}",
|
|
9
|
+
"REMOVE_COLUMNS": "Удалить {{ count }} столбцов",
|
|
10
|
+
"REMOVE_ROWS": "Удалить {{ count }} строк"
|
|
11
|
+
},
|
|
12
|
+
"LABEL": {
|
|
13
|
+
"ADD_LINK": "Добавить ссылку",
|
|
14
|
+
"ALIGN": "Выровнять",
|
|
15
|
+
"ALIGNMENT": "Выравнивание",
|
|
16
|
+
"APPLY": "Применить",
|
|
17
|
+
"BOLD": "Жирный шрифт",
|
|
18
|
+
"BULLETED_AND_NUMBERED_LIST": "Маркированный и нумерованный список",
|
|
19
|
+
"BULLETS_AND_NUMBERING": "Маркеры и нумерация",
|
|
20
|
+
"BULLET_LIST_MENU": "Меню маркированного списка",
|
|
21
|
+
"CANCEL": "Отмена",
|
|
22
|
+
"CENTER": "По центру",
|
|
23
|
+
"CLOSE": "Закрыть",
|
|
24
|
+
"COLUMNS": "Столбцы",
|
|
25
|
+
"CONFIRMATION": "Подтверждение",
|
|
26
|
+
"COPY": "Копировать",
|
|
27
|
+
"CUT": "Вырезать",
|
|
28
|
+
"DELETE": "Удалить",
|
|
29
|
+
"DOUBLE_CLICK_TO_RENAME": "Дважды щелкните, чтобы переименовать",
|
|
30
|
+
"EDIT": "Редактировать",
|
|
31
|
+
"EDIT_DOCUMENT": "Редактировать документ",
|
|
32
|
+
"EVEN_PAGES_FOOTER": "Нижний колонтитул четных страниц",
|
|
33
|
+
"EVEN_PAGES_HEADER": "Верхний колонтитул четных страниц",
|
|
34
|
+
"FILE": "Файл",
|
|
35
|
+
"FILL_OR_PRINT_DOCUMENT": "Заполнить или распечатать документ",
|
|
36
|
+
"FIRST_PAGE_FOOTER": "Нижний колонтитул первой страницы",
|
|
37
|
+
"FIRST_PAGE_HEADER": "Верхний колонтитул первой страницы",
|
|
38
|
+
"FONT": "Шрифт",
|
|
39
|
+
"FOOTER": "Нижний колонтитул",
|
|
40
|
+
"FORMAT": "Формат",
|
|
41
|
+
"HEADER": "Верхний колонтитул",
|
|
42
|
+
"HEADERS_AND_FOOTERS": "Верхние и нижние колонтитулы",
|
|
43
|
+
"IMAGE": "Изображение",
|
|
44
|
+
"INSERT": "Вставить",
|
|
45
|
+
"INSERT_COLUMN_TO_THE_LEFT": "Вставить столбец слева",
|
|
46
|
+
"INSERT_COLUMN_TO_THE_RIGHT": "Вставить столбец справа",
|
|
47
|
+
"INSERT_FORMAT": "Вставить формат",
|
|
48
|
+
"INSERT_LINK": "Вставить ссылку",
|
|
49
|
+
"INSERT_ROW_ABOVE": "Вставить строку выше",
|
|
50
|
+
"INSERT_ROW_BELOW": "Вставить строку ниже",
|
|
51
|
+
"INSERT_TABLE": "Вставить таблицу",
|
|
52
|
+
"ITALIC": "Курсив",
|
|
53
|
+
"LAYOUT": "Макет",
|
|
54
|
+
"LEFT": "По левому краю",
|
|
55
|
+
"LINK": "Ссылка",
|
|
56
|
+
"LINK_OPTIONS": "Параметры ссылки",
|
|
57
|
+
"NEW": "Новый",
|
|
58
|
+
"NONE": "Нет",
|
|
59
|
+
"NUMBERED_LIST_MENU": "Меню нумерованного списка",
|
|
60
|
+
"ODD_PAGES_FOOTER": "Нижний колонтитул нечетных страниц",
|
|
61
|
+
"ODD_PAGES_HEADER": "Верхний колонтитул нечетных страниц",
|
|
62
|
+
"OPEN_FROM": "Открыть из",
|
|
63
|
+
"PAGE_BREAK": "Разрыв страницы",
|
|
64
|
+
"PASTE": "Вставить",
|
|
65
|
+
"PRINT": "Печать",
|
|
66
|
+
"QUICK_SELECT": "Быстрый выбор",
|
|
67
|
+
"READ_OR_PRINT_DOCUMENT": "Прочитать или распечатать документ",
|
|
68
|
+
"REDO": "Повторить",
|
|
69
|
+
"REMOVE_COLUMN": "Удалить столбец",
|
|
70
|
+
"REMOVE_ROW": "Удалить строку",
|
|
71
|
+
"RENAME": "Переименовать",
|
|
72
|
+
"REPLACE": "Заменить",
|
|
73
|
+
"REPLACE_WITH": "Заменить на",
|
|
74
|
+
"RIGHT": "По правому краю",
|
|
75
|
+
"ROWS": "Строки",
|
|
76
|
+
"SAVE_AS": "Сохранить как",
|
|
77
|
+
"SEARCH_FOR": "Поиск",
|
|
78
|
+
"SELECT_ALL": "Выбрать все",
|
|
79
|
+
"TABLE": "Таблица",
|
|
80
|
+
"TABLE_OPTIONS": "Параметры таблицы",
|
|
81
|
+
"TEXT": "Текст",
|
|
82
|
+
"TEXT_FORMAT": "Текстовый формат",
|
|
83
|
+
"TEXT_STYLE": "Стиль текста",
|
|
84
|
+
"THE_COLUMN_IS_REQUIRED": "Столбцы обязательны",
|
|
85
|
+
"THE_LINK_IS_REQUIRED": "Ссылка обязательна",
|
|
86
|
+
"THE_ROW_IS_REQUIRED": "Строки обязательны",
|
|
87
|
+
"THE_TEXT_IS_REQUIRED": "Текст обязателен",
|
|
88
|
+
"UNDERLINED": "Подчеркнутый",
|
|
89
|
+
"UNDO": "Отменить",
|
|
90
|
+
"UNTITLED_DOCUMENT": "Документ без названия"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import { ChangeDetectionStrategy, Component, HostBinding, HostListener
|
|
1
|
+
import { ChangeDetectionStrategy, Component, HostBinding, HostListener } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { ReactiveFormsModule, Validators } from '@angular/forms';
|
|
4
|
-
import {
|
|
4
|
+
import { MatDialogModule } from '@angular/material/dialog';
|
|
5
5
|
import { MatButtonModule } from '@angular/material/button';
|
|
6
6
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
7
7
|
import { MatIconModule } from '@angular/material/icon';
|
|
8
8
|
import { MatInputModule } from '@angular/material/input';
|
|
9
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
9
10
|
import { ValidationHelper } from './validation.helper';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
12
|
import * as i1 from "@angular/material/dialog";
|
|
@@ -14,23 +15,16 @@ import * as i3 from "@angular/material/button";
|
|
|
14
15
|
import * as i4 from "@angular/material/form-field";
|
|
15
16
|
import * as i5 from "@angular/material/icon";
|
|
16
17
|
import * as i6 from "@angular/material/input";
|
|
17
|
-
|
|
18
|
-
constructor(fields) {
|
|
19
|
-
if (fields) {
|
|
20
|
-
Object.assign(this, fields);
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
18
|
+
import * as i7 from "@ngx-translate/core";
|
|
24
19
|
export class AddLinkDialogComponent {
|
|
25
|
-
constructor(dialogRef,
|
|
20
|
+
constructor(dialogRef, fb) {
|
|
26
21
|
this.dialogRef = dialogRef;
|
|
27
|
-
this.data = data;
|
|
28
22
|
this.fb = fb;
|
|
29
23
|
this.modal = true;
|
|
30
24
|
dialogRef.disableClose = true;
|
|
31
25
|
this.form = this.fb.group({
|
|
32
|
-
text: [
|
|
33
|
-
link: [
|
|
26
|
+
text: ['', Validators.required],
|
|
27
|
+
link: ['', [Validators.required, ValidationHelper.urlValidator]]
|
|
34
28
|
});
|
|
35
29
|
}
|
|
36
30
|
onClose() {
|
|
@@ -51,16 +45,22 @@ export class AddLinkDialogComponent {
|
|
|
51
45
|
}
|
|
52
46
|
this.dialogRef.close({ text: this.form.controls.text.value, link: this.form.controls.link.value });
|
|
53
47
|
}
|
|
54
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddLinkDialogComponent, deps: [{ token: i1.MatDialogRef }, { token:
|
|
55
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddLinkDialogComponent, isStandalone: true, selector: "app-nod-add-link-dialog", host: { listeners: { "keydown.esc": "onClose()", "keydown.enter": "onApply()" }, properties: { "class.noder-modal": "this.modal" } }, ngImport: i0, template: "<div mat-dialog-title>{{
|
|
48
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddLinkDialogComponent, deps: [{ token: i1.MatDialogRef }, { token: i2.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
49
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AddLinkDialogComponent, isStandalone: true, selector: "app-nod-add-link-dialog", host: { listeners: { "keydown.esc": "onClose()", "keydown.enter": "onApply()" }, properties: { "class.noder-modal": "this.modal" } }, ngImport: i0, template: "<div mat-dialog-title>{{ 'NODER.LABEL.ADD_LINK' | translate }}</div>\n<div\n mat-dialog-content\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.TEXT' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_TEXT_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.LINK' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_LINK_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n {{ 'NODER.LABEL.CANCEL' | translate }}\n </button>\n <button\n mat-raised-button\n color=\"primary\"\n class=\"apply-btn\"\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n {{ 'NODER.LABEL.APPLY' | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:300px;width:430px;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.mat-mdc-dialog-title{font-weight:600;padding-top:5px}mat-form-field{width:100%}.mat-mdc-dialog-content{padding-top:10px!important;padding-bottom:0}.mat-mdc-dialog-actions{display:flex;justify-content:center;padding-top:5px;height:40px;margin-bottom:30px}.mat-mdc-dialog-actions button{width:30%;height:100%;letter-spacing:1px;border-radius:8px;text-transform:uppercase}.mat-mdc-dialog-actions button .apply-btn{font-weight:400}.mat-mdc-dialog-actions button .mat-icon{font-size:24px;height:24px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
56
50
|
}
|
|
57
51
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AddLinkDialogComponent, decorators: [{
|
|
58
52
|
type: Component,
|
|
59
|
-
args: [{ standalone: true, imports: [
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
53
|
+
args: [{ standalone: true, imports: [
|
|
54
|
+
CommonModule,
|
|
55
|
+
MatButtonModule,
|
|
56
|
+
MatDialogModule,
|
|
57
|
+
MatFormFieldModule,
|
|
58
|
+
MatIconModule,
|
|
59
|
+
MatInputModule,
|
|
60
|
+
ReactiveFormsModule,
|
|
61
|
+
TranslateModule
|
|
62
|
+
], selector: 'app-nod-add-link-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div mat-dialog-title>{{ 'NODER.LABEL.ADD_LINK' | translate }}</div>\n<div\n mat-dialog-content\n [formGroup]=\"form\">\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.TEXT' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.text\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_TEXT_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n <mat-form-field appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.LINK' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"form.controls.link\"\n required />\n <mat-error>{{ 'NODER.LABEL.THE_LINK_IS_REQUIRED' | translate }}.</mat-error>\n </mat-form-field>\n</div>\n<div mat-dialog-actions>\n <button\n mat-button\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\" />\n {{ 'NODER.LABEL.CANCEL' | translate }}\n </button>\n <button\n mat-raised-button\n color=\"primary\"\n class=\"apply-btn\"\n [disabled]=\"form.invalid\"\n (click)=\"onApply()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-done-thin\" />\n {{ 'NODER.LABEL.APPLY' | translate }}\n </button>\n</div>\n", styles: [":host{display:flex;flex-direction:column;height:300px;width:430px;overflow:hidden}:host ::ng-deep .mdc-text-field--outlined{--mdc-outlined-text-field-container-shape: 12px;height:48px}:host ::ng-deep .mat-mdc-text-field-wrapper.mdc-text-field--outlined .mat-mdc-form-field-infix{padding-top:12px}.mat-mdc-dialog-title{font-weight:600;padding-top:5px}mat-form-field{width:100%}.mat-mdc-dialog-content{padding-top:10px!important;padding-bottom:0}.mat-mdc-dialog-actions{display:flex;justify-content:center;padding-top:5px;height:40px;margin-bottom:30px}.mat-mdc-dialog-actions button{width:30%;height:100%;letter-spacing:1px;border-radius:8px;text-transform:uppercase}.mat-mdc-dialog-actions button .apply-btn{font-weight:400}.mat-mdc-dialog-actions button .mat-icon{font-size:24px;height:24px}\n"] }]
|
|
63
|
+
}], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: i2.FormBuilder }], propDecorators: { modal: [{
|
|
64
64
|
type: HostBinding,
|
|
65
65
|
args: ['class.noder-modal']
|
|
66
66
|
}], onClose: [{
|
|
@@ -70,4 +70,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
70
70
|
type: HostListener,
|
|
71
71
|
args: ['keydown.enter']
|
|
72
72
|
}] } });
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWxpbmstZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1ub2Rlci9zcmMvbGliL2FwYXJ0LWNvbXBvbmVudHMvYWRkLWxpbmstZGlhbG9nL2FkZC1saW5rLWRpYWxvZy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbm9kZXIvc3JjL2xpYi9hcGFydC1jb21wb25lbnRzL2FkZC1saW5rLWRpYWxvZy9hZGQtbGluay1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXVDLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXRELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7Ozs7QUFtQnZELE1BQU0sT0FBTyxzQkFBc0I7SUFLL0IsWUFBbUIsU0FBK0MsRUFBVSxFQUFlO1FBQXhFLGNBQVMsR0FBVCxTQUFTLENBQXNDO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUp6RCxVQUFLLEdBQUcsSUFBSSxDQUFDO1FBSzNDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDdEIsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDL0IsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNuRSxDQUFDLENBQUM7SUFDUCxDQUFDO0lBR0QsT0FBTztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUdELE9BQU87UUFDSCxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ25CLE9BQU87U0FDVjtRQUVELElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUMvQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUMxRTtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2hDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25FO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMvRTtRQUVELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7K0dBckNRLHNCQUFzQjttR0FBdEIsc0JBQXNCLHlOQzdCbkMsczNDQTBDQSxtMUJEM0JRLFlBQVksOEJBQ1osZUFBZSwyTkFDZixlQUFlLHliQUNmLGtCQUFrQix1WUFDbEIsYUFBYSxtTEFDYixjQUFjLDBXQUNkLG1CQUFtQixtbENBQ25CLGVBQWU7OzRGQU9WLHNCQUFzQjtrQkFqQmxDLFNBQVM7aUNBQ00sSUFBSSxXQUNQO3dCQUNMLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixlQUFlO3dCQUNmLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixjQUFjO3dCQUNkLG1CQUFtQjt3QkFDbkIsZUFBZTtxQkFDbEIsWUFDUyx5QkFBeUIsbUJBR2xCLHVCQUF1QixDQUFDLE1BQU07MkdBR2IsS0FBSztzQkFBdEMsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBYWhDLE9BQU87c0JBRE4sWUFBWTt1QkFBQyxhQUFhO2dCQU0zQixPQUFPO3NCQUROLFlBQVk7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdERpYWxvZ01vZHVsZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmltcG9ydCB7IFZhbGlkYXRpb25IZWxwZXIgfSBmcm9tICcuL3ZhbGlkYXRpb24uaGVscGVyJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgTWF0QnV0dG9uTW9kdWxlLFxuICAgICAgICBNYXREaWFsb2dNb2R1bGUsXG4gICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICAgICAgTWF0SWNvbk1vZHVsZSxcbiAgICAgICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIFRyYW5zbGF0ZU1vZHVsZVxuICAgIF0sXG4gICAgc2VsZWN0b3I6ICdhcHAtbm9kLWFkZC1saW5rLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICdhZGQtbGluay1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydhZGQtbGluay1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBBZGRMaW5rRGlhbG9nQ29tcG9uZW50IHtcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5vZGVyLW1vZGFsJykgbW9kYWwgPSB0cnVlO1xuXG4gICAgZm9ybTogRm9ybUdyb3VwPHsgdGV4dDogRm9ybUNvbnRyb2w8c3RyaW5nPjsgbGluazogRm9ybUNvbnRyb2w8c3RyaW5nPiB9PjtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxBZGRMaW5rRGlhbG9nQ29tcG9uZW50PiwgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIpIHtcbiAgICAgICAgZGlhbG9nUmVmLmRpc2FibGVDbG9zZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgICAgICAgdGV4dDogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIGxpbms6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRpb25IZWxwZXIudXJsVmFsaWRhdG9yXV1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lc2MnKVxuICAgIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5lbnRlcicpXG4gICAgb25BcHBseSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtLmNvbnRyb2xzLnRleHQudmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybS5jb250cm9scy50ZXh0LnNldFZhbHVlKHRoaXMuZm9ybS5jb250cm9scy50ZXh0LnZhbHVlLnRyaW0oKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9scy50ZXh0LnZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMudGV4dC5zZXRWYWx1ZSh0aGlzLmZvcm0uY29udHJvbHMubGluay52YWx1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuZm9ybS5jb250cm9scy5saW5rLnZhbHVlLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmxpbmsuc2V0VmFsdWUoJ2h0dHA6Ly8nICsgdGhpcy5mb3JtLmNvbnRyb2xzLmxpbmsudmFsdWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UoeyB0ZXh0OiB0aGlzLmZvcm0uY29udHJvbHMudGV4dC52YWx1ZSwgbGluazogdGhpcy5mb3JtLmNvbnRyb2xzLmxpbmsudmFsdWUgfSk7XG4gICAgfVxufVxuIiwiPGRpdiBtYXQtZGlhbG9nLXRpdGxlPnt7ICdOT0RFUi5MQUJFTC5BRERfTElOSycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbjxkaXZcbiAgICBtYXQtZGlhbG9nLWNvbnRlbnRcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyAnTk9ERVIuTEFCRUwuVEVYVCcgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm0uY29udHJvbHMudGV4dFwiXG4gICAgICAgICAgICByZXF1aXJlZCAvPlxuICAgICAgICA8bWF0LWVycm9yPnt7ICdOT0RFUi5MQUJFTC5USEVfVEVYVF9JU19SRVFVSVJFRCcgfCB0cmFuc2xhdGUgfX0uPC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgPG1hdC1sYWJlbD57eyAnTk9ERVIuTEFCRUwuTElOSycgfCB0cmFuc2xhdGUgfX08L21hdC1sYWJlbD5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cImZvcm0uY29udHJvbHMubGlua1wiXG4gICAgICAgICAgICByZXF1aXJlZCAvPlxuICAgICAgICA8bWF0LWVycm9yPnt7ICdOT0RFUi5MQUJFTC5USEVfTElOS19JU19SRVFVSVJFRCcgfCB0cmFuc2xhdGUgfX0uPC9tYXQtZXJyb3I+XG4gICAgPC9tYXQtZm9ybS1maWVsZD5cbjwvZGl2PlxuPGRpdiBtYXQtZGlhbG9nLWFjdGlvbnM+XG4gICAgPGJ1dHRvblxuICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJvbkNsb3NlKClcIj5cbiAgICAgICAgPG1hdC1pY29uXG4gICAgICAgICAgICBmb250U2V0PVwibm9kZXItaWNvblwiXG4gICAgICAgICAgICBmb250SWNvbj1cImljb24tY2FuY2VsLXRoaW5cIiAvPlxuICAgICAgICB7eyAnTk9ERVIuTEFCRUwuQ0FOQ0VMJyB8IHRyYW5zbGF0ZSB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcbiAgICAgICAgY2xhc3M9XCJhcHBseS1idG5cIlxuICAgICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQXBwbHkoKVwiPlxuICAgICAgICA8bWF0LWljb25cbiAgICAgICAgICAgIGZvbnRTZXQ9XCJub2Rlci1pY29uXCJcbiAgICAgICAgICAgIGZvbnRJY29uPVwiaWNvbi1kb25lLXRoaW5cIiAvPlxuICAgICAgICB7eyAnTk9ERVIuTEFCRUwuQVBQTFknIHwgdHJhbnNsYXRlIH19XG4gICAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==
|