@talrace/ngx-noder 19.0.54 → 19.0.56

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.
@@ -5,7 +5,6 @@
5
5
  "INSERT_COLUMNS_TO_THE_RIGHT": "Insert {{ count }} columns to the right",
6
6
  "INSERT_ROWS_ABOVE": "Insert {{ count }} rows above",
7
7
  "INSERT_ROWS_BELOW": "Insert {{ count }} rows below",
8
- "OF_COUNTER": "{{ current }} of {{ total }}",
9
8
  "REMOVE_COLUMNS": "Remove {{ count }} columns",
10
9
  "REMOVE_ROWS": "Remove {{ count }} rows"
11
10
  },
@@ -78,7 +77,6 @@
78
77
  "NEW": "New",
79
78
  "NONE": "None",
80
79
  "NO_BORDER": "No border",
81
- "NO_RESULTS": "No Results",
82
80
  "NUMBERED_LIST_MENU": "Numbered List Menu",
83
81
  "ODD_PAGES_FOOTER": "Odd Pages Footer",
84
82
  "ODD_PAGES_HEADER": "Odd Pages Header",
@@ -102,14 +100,14 @@
102
100
  "REMOVE_TABLE": "Remove table",
103
101
  "RENAME": "Rename",
104
102
  "REPLACE": "Replace",
105
- "REPLACE_WITH": "Replace with",
106
103
  "RIGHT": "Right",
107
104
  "RIGHT_BORDER": "Right border",
108
105
  "ROWS": "Rows",
109
106
  "SAVE": "Save",
110
107
  "SAVE_AS": "Save As",
111
108
  "SAVE_AS_TEMPLATE": "Save As Template",
112
- "SEARCH_FOR": "Search for",
109
+ "SEARCH": "Search",
110
+ "SEARCH_AND_REPLACE": "Search & Replace",
113
111
  "SELECTED_TEXT": "Selected Text",
114
112
  "SELECT_ALL": "Select All",
115
113
  "SET_DEFAULT_VALUE": "Setting the initial value",
@@ -5,7 +5,6 @@
5
5
  "INSERT_COLUMNS_TO_THE_RIGHT": "Inserte {{ count }} columnas a la derecha",
6
6
  "INSERT_ROWS_ABOVE": "Inserte {{ count }} filas arriba",
7
7
  "INSERT_ROWS_BELOW": "Inserte {{ count }} filas debajo",
8
- "OF_COUNTER": "{{ current }} de {{ total }}",
9
8
  "REMOVE_COLUMNS": "Eliminar columnas {{ count }} ",
10
9
  "REMOVE_ROWS": "Eliminar {{ count }} filas"
11
10
  },
@@ -78,7 +77,6 @@
78
77
  "NEW": "Nuevo",
79
78
  "NONE": "Ninguna",
80
79
  "NO_BORDER": "Sin fronteras",
81
- "NO_RESULTS": "No hay resultados",
82
80
  "NUMBERED_LIST_MENU": "Menú de Lista Numerada",
83
81
  "ODD_PAGES_FOOTER": "Pie de Página de Páginas Impares",
84
82
  "ODD_PAGES_HEADER": "Encabezado de Páginas Impares",
@@ -102,14 +100,14 @@
102
100
  "REMOVE_TABLE": "Eliminar tabla",
103
101
  "RENAME": "Renombrar",
104
102
  "REPLACE": "Reemplazar",
105
- "REPLACE_WITH": "Reemplazar con",
106
103
  "RIGHT": "Correcto",
107
104
  "RIGHT_BORDER": "Borde derecho",
108
105
  "ROWS": "Filas",
109
106
  "SAVE": "Guardar",
110
107
  "SAVE_AS": "Guardar Como",
111
108
  "SAVE_AS_TEMPLATE": "Guardar Como Plantilla",
112
- "SEARCH_FOR": "Buscar por",
109
+ "SEARCH": "Buscar",
110
+ "SEARCH_AND_REPLACE": "Buscar y Reemplazar",
113
111
  "SELECTED_TEXT": "Texto seleccionado",
114
112
  "SELECT_ALL": "Seleccionar Todo",
115
113
  "SET_DEFAULT_VALUE": "Valor inicial",
@@ -5,7 +5,6 @@
5
5
  "INSERT_COLUMNS_TO_THE_RIGHT": "Вставить {{ count }} столбцов справа",
6
6
  "INSERT_ROWS_ABOVE": "Вставить {{ count }} строк выше",
7
7
  "INSERT_ROWS_BELOW": "Вставить {{ count }} строк ниже",
8
- "OF_COUNTER": "{{ current }} из {{ total }}",
9
8
  "REMOVE_COLUMNS": "Удалить {{ count }} столбцов",
10
9
  "REMOVE_ROWS": "Удалить {{ count }} строк"
11
10
  },
@@ -78,7 +77,6 @@
78
77
  "NEW": "Новый",
79
78
  "NONE": "Нет",
80
79
  "NO_BORDER": "Нет границы",
81
- "NO_RESULTS": "Нет Результатов",
82
80
  "NUMBERED_LIST_MENU": "Меню нумерованного списка",
83
81
  "ODD_PAGES_FOOTER": "Нижний колонтитул нечетных страниц",
84
82
  "ODD_PAGES_HEADER": "Верхний колонтитул нечетных страниц",
@@ -102,14 +100,14 @@
102
100
  "REMOVE_TABLE": "Удалить таблицу",
103
101
  "RENAME": "Переименовать",
104
102
  "REPLACE": "Заменить",
105
- "REPLACE_WITH": "Заменить на",
106
103
  "RIGHT": "По правому краю",
107
104
  "RIGHT_BORDER": "Правая граница",
108
105
  "ROWS": "Строки",
109
106
  "SAVE": "Сохранить",
110
107
  "SAVE_AS": "Сохранить как",
111
108
  "SAVE_AS_TEMPLATE": "Сохранить как шаблон",
112
- "SEARCH_FOR": "Поиск",
109
+ "SEARCH": "Поиск",
110
+ "SEARCH_AND_REPLACE": "Найти и заменить",
113
111
  "SELECTED_TEXT": "Выбранный текст",
114
112
  "SELECT_ALL": "Выбрать все",
115
113
  "SET_DEFAULT_VALUE": "Задание начального значения",
@@ -2112,6 +2112,14 @@ class ContentOperationsHelper {
2112
2112
  }
2113
2113
  }
2114
2114
 
2115
+ class ContentsModel {
2116
+ constructor(fields) {
2117
+ if (fields) {
2118
+ Object.assign(this, fields);
2119
+ }
2120
+ }
2121
+ }
2122
+
2115
2123
  class ElementModel {
2116
2124
  constructor(fields) {
2117
2125
  if (fields) {
@@ -2342,14 +2350,6 @@ class RestoreModel {
2342
2350
  }
2343
2351
  }
2344
2352
 
2345
- class ContentsModel {
2346
- constructor(fields) {
2347
- if (fields) {
2348
- Object.assign(this, fields);
2349
- }
2350
- }
2351
- }
2352
-
2353
2353
  class TableModel {
2354
2354
  constructor(fields) {
2355
2355
  if (fields) {
@@ -2398,7 +2398,7 @@ class ContentsOperationsHelper {
2398
2398
  comments
2399
2399
  });
2400
2400
  }
2401
- static GetRelativeContentSlice(contents, startIndex, count) {
2401
+ static GetRelativeContentSlice(contents, documentNumberings, startIndex, count) {
2402
2402
  const content = ContentOperationsHelper.sliceContent(contents.content, startIndex, count);
2403
2403
  const endIndex = startIndex + count - 1;
2404
2404
  const formats = FormatHelper.sliceSection(contents.formats, startIndex, endIndex).map(x => new FormatModel(x));
@@ -2419,6 +2419,8 @@ class ContentsOperationsHelper {
2419
2419
  IndexedElementHelper.shiftIndexes(tabs, -startIndex);
2420
2420
  RangeElementHelper.shiftIndexes(comments, -startIndex);
2421
2421
  LinkHelper.shiftIndexes(links, -startIndex);
2422
+ const paragraphNumberingIds = new Set(paragraphs.map(x => x.paragraphStyle.numberingId).filter(id => id != null));
2423
+ const numberings = documentNumberings.filter(x => paragraphNumberingIds.has(x.numberingId));
2422
2424
  return new ContentsModel({
2423
2425
  content,
2424
2426
  formats,
@@ -2429,7 +2431,8 @@ class ContentsOperationsHelper {
2429
2431
  breaks,
2430
2432
  tabs,
2431
2433
  links,
2432
- comments
2434
+ comments,
2435
+ numberings
2433
2436
  });
2434
2437
  }
2435
2438
  }
@@ -3751,6 +3754,16 @@ class NumberingOperationsHelper {
3751
3754
  numberings.splice(index, 1);
3752
3755
  }
3753
3756
  }
3757
+ static insertRelative(numberings, insertNumberingId, insertNumberings, paragraphs) {
3758
+ const oldToNewIds = new Map();
3759
+ for (const insertNumbering of insertNumberings) {
3760
+ oldToNewIds.set(insertNumbering.numberingId, insertNumberingId);
3761
+ insertNumbering.numberingId = insertNumberingId;
3762
+ numberings.push(insertNumbering);
3763
+ insertNumberingId++;
3764
+ }
3765
+ this.updateParagraphNumberings(paragraphs, oldToNewIds);
3766
+ }
3754
3767
  static filterUnusedIds(paragraphs, numberingIds) {
3755
3768
  const unusedNumberingIds = [...numberingIds];
3756
3769
  let index = 0;
@@ -3764,6 +3777,17 @@ class NumberingOperationsHelper {
3764
3777
  }
3765
3778
  return unusedNumberingIds;
3766
3779
  }
3780
+ static updateParagraphNumberings(paragraphs, oldToNewIds) {
3781
+ for (const paragraphStyle of paragraphs.map(x => x.paragraphStyle)) {
3782
+ if (paragraphStyle.numberingId == null) {
3783
+ continue;
3784
+ }
3785
+ const newId = oldToNewIds.get(paragraphStyle.numberingId);
3786
+ if (newId !== undefined) {
3787
+ paragraphStyle.numberingId = newId;
3788
+ }
3789
+ }
3790
+ }
3767
3791
  }
3768
3792
 
3769
3793
  var Alignment;
@@ -6027,13 +6051,13 @@ class OperationsHelper {
6027
6051
  }
6028
6052
  case CommandType.InsertContents: {
6029
6053
  const model = command.insertContents;
6030
- this.insertContents(contents, model.insertIndex, model.contents);
6054
+ this.insertContents(contents, document.numberings, model.insertIndex, model.contents);
6031
6055
  break;
6032
6056
  }
6033
6057
  case CommandType.ReplaceByContents: {
6034
6058
  const model = command.replaceByContents;
6035
6059
  this.delete(contents, model.startIndex, model.count);
6036
- this.insertContents(contents, model.startIndex, model.contents);
6060
+ this.insertContents(contents, document.numberings, model.startIndex, model.contents);
6037
6061
  break;
6038
6062
  }
6039
6063
  }
@@ -6291,9 +6315,11 @@ class OperationsHelper {
6291
6315
  document.comments = document.comments.filter(x => x.commentId !== commentId);
6292
6316
  return comment;
6293
6317
  }
6294
- static insertContents(contents, insertIndex, insertContents) {
6318
+ static insertContents(contents, numberings, insertIndex, insertContents) {
6295
6319
  const contentLength = insertContents.content.length;
6296
6320
  contents.content = ContentOperationsHelper.insertContent(contents.content, insertContents.content, insertIndex);
6321
+ const insertNumberingId = NumberingOperationsHelper.generateNumberingId(numberings);
6322
+ NumberingOperationsHelper.insertRelative(numberings, insertNumberingId, insertContents.numberings, insertContents.paragraphs);
6297
6323
  IndexedElementOperationsHelper.insertRelative(contents.paragraphs, insertIndex, contentLength, insertContents.paragraphs);
6298
6324
  IndexedElementOperationsHelper.insertRelative(contents.images, insertIndex, contentLength, insertContents.images);
6299
6325
  IndexedElementOperationsHelper.insertRelative(contents.tables, insertIndex, contentLength, insertContents.tables);
@@ -9728,7 +9754,7 @@ class EditSession {
9728
9754
  table.instance.updateTable();
9729
9755
  }
9730
9756
  insertContents(insertIndex, contents) {
9731
- OperationsHelper.insertContents(this.model, insertIndex, contents);
9757
+ OperationsHelper.insertContents(this.model, this.generalProperties.numberings, insertIndex, contents);
9732
9758
  const endIndex = insertIndex + contents.content.length - 1;
9733
9759
  this.insertComponents(this.model.tables, this.customComponents.tables, NoderTableComponent, insertIndex, endIndex);
9734
9760
  this.insertComponents(this.model.images, this.customComponents.images, NoderImageComponent, insertIndex, endIndex);
@@ -9786,7 +9812,7 @@ class EditSession {
9786
9812
  const startIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, start);
9787
9813
  const endIndex = ContentHelper.paragraphPositionToDocumentIndex(this.displayData.paragraphs, end) - 1;
9788
9814
  const count = endIndex - startIndex + 1;
9789
- return ContentsOperationsHelper.GetRelativeContentSlice(this.model, startIndex, count);
9815
+ return ContentsOperationsHelper.GetRelativeContentSlice(this.model, this.generalProperties.numberings, startIndex, count);
9790
9816
  }
9791
9817
  createRestoreFromSlice(start, end) {
9792
9818
  const startIndex = ContentHelper.paragraphToDocumentIndex(this.displayData.paragraphs, start.row, start.column);
@@ -13678,6 +13704,7 @@ class RenderingHelper {
13678
13704
  const components = customContentService.getComponents(customComponents, fragmentStartIndex, fragmentEndIndex);
13679
13705
  for (const component of components) {
13680
13706
  const instance = component.instance;
13707
+ const relativeIndex = instance.insertIndex - paragraphStartIndex;
13681
13708
  const textBeforeElement = fragmentText.substring(0, instance.insertIndex - fragmentStartIndex);
13682
13709
  fragmentText = fragmentText.substring(textBeforeElement.length + 1, fragmentText.length);
13683
13710
  this.renderText(fragment, textStyle, textBeforeElement, wordSpacing);
@@ -13692,7 +13719,7 @@ class RenderingHelper {
13692
13719
  renderedIndexes++;
13693
13720
  }
13694
13721
  }
13695
- else if (instance instanceof ExternalComponent && line.customTexts?.some(x => x.index === instance.insertIndex)) {
13722
+ else if (instance instanceof ExternalComponent && line.customTexts?.some(x => x.index === relativeIndex)) {
13696
13723
  const tokens = renderedTokensInLine + renderedIndexes + additionalTokens;
13697
13724
  const rendered = this.renderExternalText(fragment, textStyle, wordSpacing, instance, line, tokens, paragraphStartIndex);
13698
13725
  renderedIndexes += rendered.renderedIndexes;
@@ -16133,7 +16160,7 @@ class Editor {
16133
16160
  this.commandsService.createCommand(SaveCommandsHelper.getInsertContentsCommand(redoModel, this.targets));
16134
16161
  }
16135
16162
  saveReplaceByContentsToHistory(redoModel) {
16136
- const undoSlice = ContentsOperationsHelper.GetRelativeContentSlice(this.session.model, redoModel.startIndex, redoModel.count);
16163
+ const undoSlice = ContentsOperationsHelper.GetRelativeContentSlice(this.session.model, this.session.generalProperties.numberings, redoModel.startIndex, redoModel.count);
16137
16164
  const undoModel = new ReplaceByContentsModel({
16138
16165
  startIndex: redoModel.startIndex,
16139
16166
  contents: undoSlice,
@@ -17430,10 +17457,12 @@ class EditorSearchBarComponent {
17430
17457
  this.searchInput?.nativeElement?.select();
17431
17458
  });
17432
17459
  }
17433
- findNext() {
17460
+ findNext(event) {
17461
+ event?.stopPropagation();
17434
17462
  this.editorService.goNextSearchResult();
17435
17463
  }
17436
- findPrev() {
17464
+ findPrev(event) {
17465
+ event.stopPropagation();
17437
17466
  this.editorService.goPreviousSearchResult();
17438
17467
  }
17439
17468
  setReplace() {
@@ -17443,7 +17472,7 @@ class EditorSearchBarComponent {
17443
17472
  this.editorService.replaceCurrentSearchResult();
17444
17473
  }
17445
17474
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorSearchBarComponent, deps: [{ token: EditorService }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component }); }
17446
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: EditorSearchBarComponent, isStandalone: true, selector: "app-nod-editor-search-bar", providers: [ExternalElementService], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: "@let searchResultCount = searchResultCount$ | async;\n@let searchResultIndex = searchResultIndex$ | async;\n@let isViewOnly = isViewOnly$ | async;\n<div class=\"line search-form\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.SEARCH_FOR' | translate }}</mat-label>\n <input\n matInput\n #searchInput\n [formControl]=\"searchControl\"\n (keydown.enter)=\"findNext()\" />\n </mat-form-field>\n <div>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findPrev()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onleft\"></mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findNext()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onright\"></mat-icon>\n </button>\n </div>\n</div>\n@if (isReplace) {\n <div class=\"replace-form\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.REPLACE_WITH' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"replaceControl\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n (keydown.enter)=\"replace()\" />\n </mat-form-field>\n <button\n type=\"button\"\n mat-button\n (click)=\"replace()\">\n {{ 'NODER.LABEL.REPLACE' | translate }}\n </button>\n </div>\n}\n<div class=\"search-options\">\n <button\n type=\"button\"\n [disabled]=\"isViewOnly\"\n mat-icon-button\n matTooltip=\"Toggle Replace Mode\"\n (click)=\"setReplace()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ isReplace ? 'icon-arrow-up' : 'icon-arrow-down' }}\"></mat-icon>\n </button>\n <div class=\"counter\">\n @if (searchResultCount) {\n <span>\n {{ 'NODER.COMPLEX_LABEL.OF_COUNTER' | translate: { current: searchResultIndex, total: searchResultCount ?? 0 } }}\n </span>\n } @else {\n <span>{{ 'NODER.LABEL.NO_RESULTS' | translate }}</span>\n }\n </div>\n <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"'NODER.LABEL.CLOSE' | translate\"\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\"></mat-icon>\n </button>\n</div>\n", styles: [":host{min-height:56px;max-width:100%;display:block;font-size:10px;border-style:solid;border-radius:0 0 4px 4px;border-width:1px;border-top:none}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.close-icon{position:absolute;right:1px;top:1px}.search-form,.replace-form,.search-options{margin:8px 6px 0 0;display:flex;gap:8px}mat-form-field{padding-left:10px}.mdc-button{font-size:12px;padding:0 8px;min-width:unset}.search-options{line-height:40px}.search-options .counter{text-align:center;flex:1}.mat-mdc-input-element{font-size:10px}.replace-form .mdc-button{width:80px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { 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: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { 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$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i5$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17475
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.5", type: EditorSearchBarComponent, isStandalone: true, selector: "app-nod-editor-search-bar", providers: [ExternalElementService], viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["searchInput"], descendants: true }], ngImport: i0, template: "@let searchResultCount = searchResultCount$ | async;\n@let searchResultIndex = searchResultIndex$ | async;\n@let isViewOnly = isViewOnly$ | async;\n<div class=\"header\">\n <span>\n {{ 'NODER.LABEL.SEARCH_AND_REPLACE' | translate }}\n </span>\n <button\n class=\"navigate-button close-button\"\n mat-icon-button\n [matTooltip]=\"'NODER.LABEL.CLOSE' | translate\"\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\"></mat-icon>\n </button>\n</div>\n<div class=\"line search-form\">\n <button\n [disabled]=\"isViewOnly\"\n class=\"navigate-button\"\n mat-icon-button\n matTooltip=\"Toggle Replace Mode\"\n (click)=\"setReplace()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ isReplace ? 'icon-arrow-down' : 'icon-arrow-big' }}\"></mat-icon>\n </button>\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.SEARCH' | translate }}</mat-label>\n <input\n matInput\n #searchInput\n [formControl]=\"searchControl\"\n (keydown.enter)=\"findNext()\" />\n <div\n matSuffix\n class=\"input-suffix\">\n <span>{{ searchResultCount ? searchResultIndex : 0 }} / {{ searchResultCount ?? 0 }}</span>\n <div class=\"divider\"></div>\n <div>\n <button\n mat-icon-button\n class=\"navigate-button\"\n (click)=\"findPrev($event)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-up\"></mat-icon>\n </button>\n <button\n mat-icon-button\n class=\"navigate-button\"\n (click)=\"findNext($event)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-down\"></mat-icon>\n </button>\n </div>\n </div>\n </mat-form-field>\n</div>\n@if (isReplace) {\n <div class=\"replace-form\">\n <div class=\"replace-padding\"></div>\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.REPLACE' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"replaceControl\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n (keydown.enter)=\"replace()\" />\n </mat-form-field>\n </div>\n <div class=\"action-buttons\">\n <button\n mat-button\n class=\"action-button\"\n (click)=\"replace()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-replace\"></mat-icon>\n {{ 'NODER.LABEL.REPLACE' | translate }}\n </button>\n </div>\n}\n", styles: [":host{min-height:56px;width:388px;display:flex;flex-direction:column;gap:8px;font-size:10px;border-radius:0 0 8px 8px;border-top:none;padding:16px}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mat-mdc-form-field-flex{height:32px}:host ::ng-deep .mat-mdc-form-field-flex .mat-mdc-form-field-infix{min-height:unset;height:32px;display:flex}:host ::ng-deep .mat-mdc-form-field-flex .mat-mdc-form-field-infix input{font-size:12px;letter-spacing:0}:host ::ng-deep .mat-mdc-form-field-flex .mdc-floating-label.mat-mdc-floating-label:not(.mdc-floating-label--float-above){font-size:14px;top:15px}:host ::ng-deep .mat-mdc-button-persistent-ripple,:host ::ng-deep .mat-mdc-button-ripple,:host ::ng-deep .mat-focus-indicator,:host ::ng-deep .mat-mdc-button-touch-target{width:100%;height:100%}.header{display:flex;justify-content:space-between;align-items:center;font-size:12px}.navigate-button,.replace-padding{width:26px;height:26px;display:flex;justify-content:center;align-items:center;padding:0;font-size:12px;min-width:unset}.navigate-button.close-button,.replace-padding.close-button{width:20px;height:20px}.divider{height:16px;width:1px}.input-suffix{display:flex;align-items:center;gap:6px;margin-right:4px}.input-suffix span{font-size:12px;letter-spacing:0}.input-suffix div{display:flex;align-items:center}.action-buttons{display:flex;justify-content:flex-end;margin-top:8px}.action-button{font-size:12px;font-weight:400;letter-spacing:0;height:32px}.search-form,.replace-form{margin-top:8px;display:flex;align-items:center;gap:8px}mat-form-field{flex:1}.mat-mdc-input-element{font-size:10px}.replace-form .mdc-button{width:80px}mat-icon{font-size:18px;width:18px;height:18px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "ngmodule", type: FormsModule }, { 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: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { 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$1.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: i5$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5$2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i5$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
17447
17476
  }
17448
17477
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImport: i0, type: EditorSearchBarComponent, decorators: [{
17449
17478
  type: Component,
@@ -17456,7 +17485,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.5", ngImpor
17456
17485
  MatTooltipModule,
17457
17486
  ReactiveFormsModule,
17458
17487
  TranslateModule
17459
- ], providers: [ExternalElementService], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'app-nod-editor-search-bar', template: "@let searchResultCount = searchResultCount$ | async;\n@let searchResultIndex = searchResultIndex$ | async;\n@let isViewOnly = isViewOnly$ | async;\n<div class=\"line search-form\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.SEARCH_FOR' | translate }}</mat-label>\n <input\n matInput\n #searchInput\n [formControl]=\"searchControl\"\n (keydown.enter)=\"findNext()\" />\n </mat-form-field>\n <div>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findPrev()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onleft\"></mat-icon>\n </button>\n <button\n type=\"button\"\n mat-icon-button\n (click)=\"findNext()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-onright\"></mat-icon>\n </button>\n </div>\n</div>\n@if (isReplace) {\n <div class=\"replace-form\">\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.REPLACE_WITH' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"replaceControl\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n (keydown.enter)=\"replace()\" />\n </mat-form-field>\n <button\n type=\"button\"\n mat-button\n (click)=\"replace()\">\n {{ 'NODER.LABEL.REPLACE' | translate }}\n </button>\n </div>\n}\n<div class=\"search-options\">\n <button\n type=\"button\"\n [disabled]=\"isViewOnly\"\n mat-icon-button\n matTooltip=\"Toggle Replace Mode\"\n (click)=\"setReplace()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ isReplace ? 'icon-arrow-up' : 'icon-arrow-down' }}\"></mat-icon>\n </button>\n <div class=\"counter\">\n @if (searchResultCount) {\n <span>\n {{ 'NODER.COMPLEX_LABEL.OF_COUNTER' | translate: { current: searchResultIndex, total: searchResultCount ?? 0 } }}\n </span>\n } @else {\n <span>{{ 'NODER.LABEL.NO_RESULTS' | translate }}</span>\n }\n </div>\n <button\n type=\"button\"\n mat-icon-button\n [matTooltip]=\"'NODER.LABEL.CLOSE' | translate\"\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\"></mat-icon>\n </button>\n</div>\n", styles: [":host{min-height:56px;max-width:100%;display:block;font-size:10px;border-style:solid;border-radius:0 0 4px 4px;border-width:1px;border-top:none}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}.close-icon{position:absolute;right:1px;top:1px}.search-form,.replace-form,.search-options{margin:8px 6px 0 0;display:flex;gap:8px}mat-form-field{padding-left:10px}.mdc-button{font-size:12px;padding:0 8px;min-width:unset}.search-options{line-height:40px}.search-options .counter{text-align:center;flex:1}.mat-mdc-input-element{font-size:10px}.replace-form .mdc-button{width:80px}\n"] }]
17488
+ ], providers: [ExternalElementService], changeDetection: ChangeDetectionStrategy.OnPush, selector: 'app-nod-editor-search-bar', template: "@let searchResultCount = searchResultCount$ | async;\n@let searchResultIndex = searchResultIndex$ | async;\n@let isViewOnly = isViewOnly$ | async;\n<div class=\"header\">\n <span>\n {{ 'NODER.LABEL.SEARCH_AND_REPLACE' | translate }}\n </span>\n <button\n class=\"navigate-button close-button\"\n mat-icon-button\n [matTooltip]=\"'NODER.LABEL.CLOSE' | translate\"\n (click)=\"onClose()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-cancel-thin\"></mat-icon>\n </button>\n</div>\n<div class=\"line search-form\">\n <button\n [disabled]=\"isViewOnly\"\n class=\"navigate-button\"\n mat-icon-button\n matTooltip=\"Toggle Replace Mode\"\n (click)=\"setReplace()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"{{ isReplace ? 'icon-arrow-down' : 'icon-arrow-big' }}\"></mat-icon>\n </button>\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.SEARCH' | translate }}</mat-label>\n <input\n matInput\n #searchInput\n [formControl]=\"searchControl\"\n (keydown.enter)=\"findNext()\" />\n <div\n matSuffix\n class=\"input-suffix\">\n <span>{{ searchResultCount ? searchResultIndex : 0 }} / {{ searchResultCount ?? 0 }}</span>\n <div class=\"divider\"></div>\n <div>\n <button\n mat-icon-button\n class=\"navigate-button\"\n (click)=\"findPrev($event)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-up\"></mat-icon>\n </button>\n <button\n mat-icon-button\n class=\"navigate-button\"\n (click)=\"findNext($event)\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-arrow-down\"></mat-icon>\n </button>\n </div>\n </div>\n </mat-form-field>\n</div>\n@if (isReplace) {\n <div class=\"replace-form\">\n <div class=\"replace-padding\"></div>\n <mat-form-field\n color=\"accent\"\n floatLabel=\"auto\"\n appearance=\"outline\">\n <mat-label>{{ 'NODER.LABEL.REPLACE' | translate }}</mat-label>\n <input\n matInput\n [formControl]=\"replaceControl\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n (keydown.enter)=\"replace()\" />\n </mat-form-field>\n </div>\n <div class=\"action-buttons\">\n <button\n mat-button\n class=\"action-button\"\n (click)=\"replace()\">\n <mat-icon\n fontSet=\"noder-icon\"\n fontIcon=\"icon-replace\"></mat-icon>\n {{ 'NODER.LABEL.REPLACE' | translate }}\n </button>\n </div>\n}\n", styles: [":host{min-height:56px;width:388px;display:flex;flex-direction:column;gap:8px;font-size:10px;border-radius:0 0 8px 8px;border-top:none;padding:16px}:host ::ng-deep .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .mat-mdc-form-field-flex{height:32px}:host ::ng-deep .mat-mdc-form-field-flex .mat-mdc-form-field-infix{min-height:unset;height:32px;display:flex}:host ::ng-deep .mat-mdc-form-field-flex .mat-mdc-form-field-infix input{font-size:12px;letter-spacing:0}:host ::ng-deep .mat-mdc-form-field-flex .mdc-floating-label.mat-mdc-floating-label:not(.mdc-floating-label--float-above){font-size:14px;top:15px}:host ::ng-deep .mat-mdc-button-persistent-ripple,:host ::ng-deep .mat-mdc-button-ripple,:host ::ng-deep .mat-focus-indicator,:host ::ng-deep .mat-mdc-button-touch-target{width:100%;height:100%}.header{display:flex;justify-content:space-between;align-items:center;font-size:12px}.navigate-button,.replace-padding{width:26px;height:26px;display:flex;justify-content:center;align-items:center;padding:0;font-size:12px;min-width:unset}.navigate-button.close-button,.replace-padding.close-button{width:20px;height:20px}.divider{height:16px;width:1px}.input-suffix{display:flex;align-items:center;gap:6px;margin-right:4px}.input-suffix span{font-size:12px;letter-spacing:0}.input-suffix div{display:flex;align-items:center}.action-buttons{display:flex;justify-content:flex-end;margin-top:8px}.action-button{font-size:12px;font-weight:400;letter-spacing:0;height:32px}.search-form,.replace-form{margin-top:8px;display:flex;align-items:center;gap:8px}mat-form-field{flex:1}.mat-mdc-input-element{font-size:10px}.replace-form .mdc-button{width:80px}mat-icon{font-size:18px;width:18px;height:18px}\n"] }]
17460
17489
  }], ctorParameters: () => [{ type: EditorService }, { type: i0.DestroyRef }], propDecorators: { searchInput: [{
17461
17490
  type: ViewChild,
17462
17491
  args: ['searchInput']