oip-common 0.8.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { Injectable, inject, signal, computed, effect, isDevMode, DestroyRef, ChangeDetectorRef, Component, Input, InjectionToken, PLATFORM_ID, ViewChild, HostBinding, EventEmitter, Output, untracked, Renderer2, SecurityContext, ChangeDetectionStrategy, Injector, EnvironmentInjector, ViewContainerRef, makeEnvironmentProviders, importProvidersFrom } from '@angular/core';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { Subject, BehaviorSubject, of, tap, shareReplay, ReplaySubject, firstValueFrom, from, filter as filter$1 } from 'rxjs';
5
- import * as i2$1 from 'primeng/api';
5
+ import * as i3$1 from 'primeng/api';
6
6
  import { MessageService, ConfirmationService, PrimeIcons, SharedModule } from 'primeng/api';
7
7
  import { HttpErrorResponse, HttpClient as HttpClient$1, provideHttpClient, withInterceptors, withFetch } from '@angular/common/http';
8
8
  import * as i1$7 from '@ngx-translate/core';
@@ -22,47 +22,46 @@ import * as i1$1 from '@angular/forms';
22
22
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
23
23
  import * as i1$3 from '@angular/common';
24
24
  import { isPlatformBrowser, CommonModule, NgComponentOutlet, NgClass, DatePipe, PathLocationStrategy, LocationStrategy } from '@angular/common';
25
- import * as i3$3 from 'primeng/styleclass';
25
+ import * as i3$4 from 'primeng/styleclass';
26
26
  import { StyleClassModule } from 'primeng/styleclass';
27
27
  import { updatePreset, updateSurfacePalette, $t, definePreset } from '@primeng/themes';
28
28
  import Aura from '@primeng/themes/aura';
29
29
  import * as i3 from 'primeng/selectbutton';
30
30
  import { SelectButtonModule } from 'primeng/selectbutton';
31
31
  import { Tabs, TabList, Tab } from 'primeng/tabs';
32
- import * as i2$2 from 'primeng/avatar';
32
+ import * as i2$1 from 'primeng/avatar';
33
33
  import { AvatarModule } from 'primeng/avatar';
34
34
  import { ConfirmDialog } from 'primeng/confirmdialog';
35
35
  import * as i1$4 from 'primeng/badge';
36
36
  import { BadgeModule } from 'primeng/badge';
37
- import * as i3$1 from 'primeng/paginator';
37
+ import * as i3$2 from 'primeng/paginator';
38
38
  import { PaginatorModule } from 'primeng/paginator';
39
39
  import * as i7 from 'primeng/popover';
40
40
  import { Popover, PopoverModule } from 'primeng/popover';
41
41
  import * as i4 from 'primeng/progressspinner';
42
42
  import { ProgressSpinnerModule, ProgressSpinner } from 'primeng/progressspinner';
43
- import * as i9 from 'primeng/tag';
43
+ import * as i3$6 from 'primeng/tag';
44
44
  import { Tag, TagModule } from 'primeng/tag';
45
45
  import * as signalR from '@microsoft/signalr';
46
- import * as i3$2 from 'primeng/menu';
46
+ import * as i3$3 from 'primeng/menu';
47
47
  import { MenuModule } from 'primeng/menu';
48
48
  import * as i1$6 from 'primeng/contextmenu';
49
49
  import { ContextMenuModule, ContextMenu } from 'primeng/contextmenu';
50
- import * as i3$4 from 'primeng/dialog';
50
+ import * as i3$5 from 'primeng/dialog';
51
51
  import { DialogModule } from 'primeng/dialog';
52
52
  import * as i4$1 from 'primeng/inputtext';
53
53
  import { InputTextModule, InputText } from 'primeng/inputtext';
54
- import * as i2$3 from 'primeng/ripple';
54
+ import * as i2$2 from 'primeng/ripple';
55
55
  import { RippleModule } from 'primeng/ripple';
56
56
  import * as i5 from 'primeng/select';
57
57
  import { SelectModule, Select } from 'primeng/select';
58
58
  import * as i1$8 from 'primeng/fileupload';
59
59
  import { FileUploadModule } from 'primeng/fileupload';
60
60
  import { ImageModule } from 'primeng/image';
61
- import * as i1$9 from 'primeng/table';
61
+ import * as i2$4 from 'primeng/table';
62
62
  import { TableModule } from 'primeng/table';
63
- import * as i2$4 from 'primeng/toggleswitch';
63
+ import * as i2$3 from 'primeng/toggleswitch';
64
64
  import { ToggleSwitchModule } from 'primeng/toggleswitch';
65
- import { TextareaModule, Textarea } from 'primeng/textarea';
66
65
  import * as i5$1 from 'primeng/toolbar';
67
66
  import { ToolbarModule } from 'primeng/toolbar';
68
67
  import * as i5$2 from 'primeng/card';
@@ -70,6 +69,7 @@ import { CardModule } from 'primeng/card';
70
69
  import { DividerModule } from 'primeng/divider';
71
70
  import * as i6 from 'primeng/panel';
72
71
  import { PanelModule } from 'primeng/panel';
72
+ import { Textarea } from 'primeng/textarea';
73
73
  import { loadRemoteModule } from '@angular-architects/module-federation';
74
74
  import { primitive } from '@primeng/themes/aura/base';
75
75
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
@@ -541,6 +541,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
541
541
  args: [{ providedIn: 'root' }]
542
542
  }], ctorParameters: () => [] });
543
543
 
544
+ var userService$1 = {
545
+ failedToLoadPhoto: "Failed to load user photo"
546
+ };
544
547
  var msgService$1 = {
545
548
  success: "Success",
546
549
  info: "Info",
@@ -549,11 +552,15 @@ var msgService$1 = {
549
552
  secondary: "Secondary"
550
553
  };
551
554
  var primeng$1 = "";
552
- var en$k = {
555
+ var en$l = {
556
+ userService: userService$1,
553
557
  msgService: msgService$1,
554
558
  primeng: primeng$1
555
559
  };
556
560
 
561
+ var userService = {
562
+ failedToLoadPhoto: "Не удалось загрузить фото пользователя"
563
+ };
557
564
  var msgService = {
558
565
  success: "Успешно",
559
566
  info: "Информация",
@@ -753,7 +760,8 @@ var primeng = {
753
760
  zoomOut: "Уменьшить"
754
761
  }
755
762
  };
756
- var ru$k = {
763
+ var ru$l = {
764
+ userService: userService,
757
765
  msgService: msgService,
758
766
  primeng: primeng
759
767
  };
@@ -762,7 +770,7 @@ var ru$k = {
762
770
  * Global dictionaries shared by all components. They are bundled with the library,
763
771
  * so the application never requests `assets/i18n/{lang}.json`.
764
772
  */
765
- const globalTranslations = { en: en$k, ru: ru$k };
773
+ const globalTranslations = { en: en$l, ru: ru$l };
766
774
  /**
767
775
  * Service for managing translation loading in the application
768
776
  */
@@ -1468,7 +1476,7 @@ var baseComponent$1 = {
1468
1476
  security: "Security",
1469
1477
  success: "Saved successfully"
1470
1478
  };
1471
- var en$j = {
1479
+ var en$k = {
1472
1480
  baseComponent: baseComponent$1
1473
1481
  };
1474
1482
 
@@ -1478,7 +1486,7 @@ var baseComponent = {
1478
1486
  security: "Безопасность",
1479
1487
  success: "Сохранено"
1480
1488
  };
1481
- var ru$j = {
1489
+ var ru$k = {
1482
1490
  baseComponent: baseComponent
1483
1491
  };
1484
1492
 
@@ -1619,7 +1627,7 @@ class BaseModuleComponent {
1619
1627
  * @type {Subject<TLocalStoreSettings>}
1620
1628
  */
1621
1629
  this.localSettingsUpdate = new Subject();
1622
- this.baseTranslations = provideTranslations({ en: en$j, ru: ru$j });
1630
+ this.baseTranslations = provideTranslations({ en: en$k, ru: ru$k });
1623
1631
  this.l10nService = inject(L10nService);
1624
1632
  this.canRead = false;
1625
1633
  this.canEdit = false;
@@ -1930,7 +1938,7 @@ var securityComponent$1 = {
1930
1938
  savedSecurity: "Security settings saved",
1931
1939
  selectRoles: "Select roles"
1932
1940
  };
1933
- var en$i = {
1941
+ var en$j = {
1934
1942
  securityComponent: securityComponent$1
1935
1943
  };
1936
1944
 
@@ -1940,13 +1948,13 @@ var securityComponent = {
1940
1948
  savedSecurity: "Настройки сохранены",
1941
1949
  selectRoles: "Выберите роли"
1942
1950
  };
1943
- var ru$i = {
1951
+ var ru$j = {
1944
1952
  securityComponent: securityComponent
1945
1953
  };
1946
1954
 
1947
1955
  class SecurityComponent {
1948
1956
  constructor() {
1949
- this.translations = provideTranslations({ en: en$i, ru: ru$i });
1957
+ this.translations = provideTranslations({ en: en$j, ru: ru$j });
1950
1958
  this.msgService = inject(MsgService);
1951
1959
  this.translateService = inject(TranslateService);
1952
1960
  this.httpClient = inject(HttpClient);
@@ -2115,7 +2123,7 @@ const APP_THEME_PRESETS_MERGE_MODE = new InjectionToken('APP_THEME_PRESETS_MERGE
2115
2123
  factory: () => 'mergeWithDefaults'
2116
2124
  });
2117
2125
 
2118
- var en$h = {
2126
+ var en$i = {
2119
2127
  "app-configurator": {
2120
2128
  primary: "Primary",
2121
2129
  surface: "Surface",
@@ -2126,7 +2134,7 @@ var en$h = {
2126
2134
  }
2127
2135
  };
2128
2136
 
2129
- var ru$h = {
2137
+ var ru$i = {
2130
2138
  "app-configurator": {
2131
2139
  primary: "Основной",
2132
2140
  surface: "Фон",
@@ -2170,7 +2178,7 @@ const PRIMARY_COLORS = [
2170
2178
  ];
2171
2179
  class AppConfiguratorComponent {
2172
2180
  constructor() {
2173
- this.translations = provideTranslations({ en: en$h, ru: ru$h });
2181
+ this.translations = provideTranslations({ en: en$i, ru: ru$i });
2174
2182
  this.router = inject(Router);
2175
2183
  this.config = inject(PrimeNG);
2176
2184
  this.layoutService = inject(LayoutService);
@@ -2691,7 +2699,7 @@ class AppConfiguratorComponent {
2691
2699
  </div>
2692
2700
  }
2693
2701
  </div>
2694
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i3.SelectButton, selector: "p-selectButton, p-selectbutton, p-select-button", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "styleClass", "ariaLabelledBy", "dataKey", "autofocus", "size", "fluid"], outputs: ["onOptionClick", "onChange"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
2702
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i3.SelectButton, selector: "p-selectButton, p-selectbutton, p-select-button", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "styleClass", "ariaLabelledBy", "dataKey", "autofocus", "size", "fluid"], outputs: ["onOptionClick", "onChange"] }, { kind: "directive", type: i3$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
2695
2703
  }
2696
2704
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppConfiguratorComponent, decorators: [{
2697
2705
  type: Component,
@@ -2903,7 +2911,7 @@ class UserService {
2903
2911
  // A 404 just means the user hasn't uploaded a photo yet (e.g. on first login) —
2904
2912
  // that's an expected state, not a failure, so fall back to initials silently.
2905
2913
  if (error?.status !== 404) {
2906
- this.msgService.errorFromException(error, this.translateService.instant('profileComponent.failedToLoadPhoto'));
2914
+ this.msgService.errorFromException(error, this.translateService.instant('userService.failedToLoadPhoto'));
2907
2915
  }
2908
2916
  this.photoLoaded = false;
2909
2917
  });
@@ -3178,7 +3186,7 @@ var userNotifications$1 = {
3178
3186
  markAsRead: "Read",
3179
3187
  markedAsRead: "Notification marked as read"
3180
3188
  };
3181
- var en$g = {
3189
+ var en$h = {
3182
3190
  userNotifications: userNotifications$1
3183
3191
  };
3184
3192
 
@@ -3189,13 +3197,13 @@ var userNotifications = {
3189
3197
  markAsRead: "Прочитано",
3190
3198
  markedAsRead: "Оповещение отмечено прочитанным"
3191
3199
  };
3192
- var ru$g = {
3200
+ var ru$h = {
3193
3201
  userNotifications: userNotifications
3194
3202
  };
3195
3203
 
3196
3204
  class UserNotificationsComponent {
3197
3205
  constructor() {
3198
- this.translations = provideTranslations({ en: en$g, ru: ru$g });
3206
+ this.translations = provideTranslations({ en: en$h, ru: ru$h });
3199
3207
  this.notifications = [];
3200
3208
  this.totalCount = 0;
3201
3209
  this.skip = 0;
@@ -3360,7 +3368,7 @@ class UserNotificationsComponent {
3360
3368
  (onPageChange)="onPageChange($event)"></p-paginator>
3361
3369
  }
3362
3370
  </p-popover>
3363
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: BadgeModule }, { kind: "component", type: i1$4.Badge, selector: "p-badge", inputs: ["styleClass", "badgeSize", "size", "severity", "value", "badgeDisabled"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: PaginatorModule }, { kind: "component", type: i3$1.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first", "appendTo"], outputs: ["onPageChange"] }, { kind: "component", type: Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ProgressSpinnerModule }, { kind: "component", type: i4.ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "pipe", type: i1$3.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
3371
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: BadgeModule }, { kind: "component", type: i1$4.Badge, selector: "p-badge", inputs: ["styleClass", "badgeSize", "size", "severity", "value", "badgeDisabled"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: PaginatorModule }, { kind: "component", type: i3$2.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first", "appendTo"], outputs: ["onPageChange"] }, { kind: "component", type: Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ProgressSpinnerModule }, { kind: "component", type: i4.ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "pipe", type: i1$3.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
3364
3372
  }
3365
3373
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: UserNotificationsComponent, decorators: [{
3366
3374
  type: Component,
@@ -3585,7 +3593,7 @@ class AppTopbarApplicationSwitcherComponent {
3585
3593
  </p-button>
3586
3594
  <p-menu #applicationMenu [model]="applicationMenuItems" [popup]="true" />
3587
3595
  }
3588
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: MenuModule }, { kind: "component", type: i3$2.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex", "appendTo"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
3596
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: MenuModule }, { kind: "component", type: i3$3.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex", "appendTo"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
3589
3597
  }
3590
3598
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppTopbarApplicationSwitcherComponent, decorators: [{
3591
3599
  type: Component,
@@ -3624,7 +3632,7 @@ var topbar$1 = {
3624
3632
  profile: "Profile",
3625
3633
  applications: "Applications"
3626
3634
  };
3627
- var en$f = {
3635
+ var en$g = {
3628
3636
  topbar: topbar$1
3629
3637
  };
3630
3638
 
@@ -3637,13 +3645,13 @@ var topbar = {
3637
3645
  profile: "Профиль",
3638
3646
  applications: "Приложения"
3639
3647
  };
3640
- var ru$f = {
3648
+ var ru$g = {
3641
3649
  topbar: topbar
3642
3650
  };
3643
3651
 
3644
3652
  class AppTopbar {
3645
3653
  constructor() {
3646
- this.translations = provideTranslations({ en: en$f, ru: ru$f });
3654
+ this.translations = provideTranslations({ en: en$g, ru: ru$g });
3647
3655
  this.securityService = inject(SecurityService);
3648
3656
  this.topBarService = inject(TopBarService);
3649
3657
  this.userService = inject(UserService);
@@ -3790,7 +3798,7 @@ class AppTopbar {
3790
3798
  </div>
3791
3799
  </div>
3792
3800
  </div>
3793
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i3$3.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfiguratorComponent, selector: "app-configurator" }, { kind: "component", type: Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: TabList, selector: "p-tablist" }, { kind: "component", type: Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2$2.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "component", type: UserNotificationsComponent, selector: "app-user-notifications" }, { kind: "component", type: AppTopbarApplicationSwitcherComponent, selector: "app-topbar-application-switcher" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
3801
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$3.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i3$4.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfiguratorComponent, selector: "app-configurator" }, { kind: "component", type: Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: TabList, selector: "p-tablist" }, { kind: "component", type: Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2$1.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "component", type: UserNotificationsComponent, selector: "app-user-notifications" }, { kind: "component", type: AppTopbarApplicationSwitcherComponent, selector: "app-topbar-application-switcher" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
3794
3802
  }
3795
3803
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppTopbar, decorators: [{
3796
3804
  type: Component,
@@ -4556,7 +4564,7 @@ class MenuItemComponent {
4556
4564
  </ul>
4557
4565
  }
4558
4566
  </ng-container>
4559
- `, isInline: true, dependencies: [{ kind: "component", type: MenuItemComponent, selector: "[app-menuitem]", inputs: ["item", "index", "root", "parentKey", "menuItemCreateDialogComponent", "menuItemEditDialogComponent", "contextMenu"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i2$3.Ripple, selector: "[pRipple]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: ContextMenuModule }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }] }); }
4567
+ `, isInline: true, dependencies: [{ kind: "component", type: MenuItemComponent, selector: "[app-menuitem]", inputs: ["item", "index", "root", "parentKey", "menuItemCreateDialogComponent", "menuItemEditDialogComponent", "contextMenu"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i2$2.Ripple, selector: "[pRipple]" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: ContextMenuModule }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }] }); }
4560
4568
  }
4561
4569
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuItemComponent, decorators: [{
4562
4570
  type: Component,
@@ -4813,7 +4821,7 @@ class MenuItemCreateDialogComponent {
4813
4821
  (click)="save()" />
4814
4822
  </div>
4815
4823
  </p-dialog>
4816
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i3$4.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$1.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i5.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
4824
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i3$5.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$1.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i5.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
4817
4825
  }
4818
4826
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuItemCreateDialogComponent, decorators: [{
4819
4827
  type: Component,
@@ -5075,7 +5083,7 @@ class MenuItemEditDialogComponent {
5075
5083
  (click)="save()" />
5076
5084
  </div>
5077
5085
  </p-dialog>
5078
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i3$4.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$1.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i5.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i1.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "styleClass", "panelStyle", "panelStyleClass", "inputId", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "dataKey", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "placeholder", "options", "filterValue", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus", "highlightOnSelect", "size", "variant", "fluid", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
5086
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i3$5.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$1.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i5.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i1.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "styleClass", "panelStyle", "panelStyleClass", "inputId", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "dataKey", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "placeholder", "options", "filterValue", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus", "highlightOnSelect", "size", "variant", "fluid", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
5079
5087
  }
5080
5088
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuItemEditDialogComponent, decorators: [{
5081
5089
  type: Component,
@@ -5224,7 +5232,7 @@ var menuItemCreateDialogComponent$1 = {
5224
5232
  cancel: "Cancel",
5225
5233
  save: "Save"
5226
5234
  };
5227
- var en$e = {
5235
+ var en$f = {
5228
5236
  menuComponent: menuComponent$1,
5229
5237
  menuItemComponent: menuItemComponent$1,
5230
5238
  menuItemEditDialogComponent: menuItemEditDialogComponent$1,
@@ -5273,7 +5281,7 @@ var menuItemCreateDialogComponent = {
5273
5281
  cancel: "Отмена",
5274
5282
  save: "Сохранить"
5275
5283
  };
5276
- var ru$e = {
5284
+ var ru$f = {
5277
5285
  menuComponent: menuComponent,
5278
5286
  menuItemComponent: menuItemComponent,
5279
5287
  menuItemEditDialogComponent: menuItemEditDialogComponent,
@@ -5284,7 +5292,7 @@ class MenuComponent {
5284
5292
  constructor() {
5285
5293
  // Registers the whole menu/l10n/menu.*.json bundle, which also covers
5286
5294
  // menuItemComponent, menuItemEditDialogComponent and menuItemCreateDialogComponent.
5287
- this.translations = provideTranslations({ en: en$e, ru: ru$e });
5295
+ this.translations = provideTranslations({ en: en$f, ru: ru$f });
5288
5296
  this.menuService = inject(MenuService);
5289
5297
  this.securityService = inject(SecurityService);
5290
5298
  this.translateService = inject(TranslateService);
@@ -5411,14 +5419,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
5411
5419
  var blockLoader$1 = {
5412
5420
  loading: "Loading..."
5413
5421
  };
5414
- var en$d = {
5422
+ var en$e = {
5415
5423
  blockLoader: blockLoader$1
5416
5424
  };
5417
5425
 
5418
5426
  var blockLoader = {
5419
5427
  loading: "Загрузка..."
5420
5428
  };
5421
- var ru$d = {
5429
+ var ru$e = {
5422
5430
  blockLoader: blockLoader
5423
5431
  };
5424
5432
 
@@ -5435,7 +5443,7 @@ class BlockLoaderComponent {
5435
5443
  static { this.showDelayMs = 150; }
5436
5444
  static { this.minVisibleMs = 300; }
5437
5445
  constructor() {
5438
- this.translations = provideTranslations({ en: en$d, ru: ru$d });
5446
+ this.translations = provideTranslations({ en: en$e, ru: ru$e });
5439
5447
  this.moduleLoadingService = inject(ModuleLoadingService);
5440
5448
  this.shownAt = 0;
5441
5449
  this.visible = signal(false, ...(ngDevMode ? [{ debugName: "visible" }] : []));
@@ -5567,7 +5575,7 @@ var defaultSecretsBanner$1 = {
5567
5575
  dismiss: "Dismiss"
5568
5576
  }
5569
5577
  };
5570
- var en$c = {
5578
+ var en$d = {
5571
5579
  defaultSecretsBanner: defaultSecretsBanner$1
5572
5580
  };
5573
5581
 
@@ -5589,7 +5597,7 @@ var defaultSecretsBanner = {
5589
5597
  dismiss: "Скрыть"
5590
5598
  }
5591
5599
  };
5592
- var ru$c = {
5600
+ var ru$d = {
5593
5601
  defaultSecretsBanner: defaultSecretsBanner
5594
5602
  };
5595
5603
 
@@ -5605,7 +5613,7 @@ var ru$c = {
5605
5613
  */
5606
5614
  class DefaultSecretsBannerComponent {
5607
5615
  constructor() {
5608
- this.translations = provideTranslations({ en: en$c, ru: ru$c });
5616
+ this.translations = provideTranslations({ en: en$d, ru: ru$d });
5609
5617
  this.securityApi = inject(SecurityApi);
5610
5618
  this.securityService = inject(SecurityService);
5611
5619
  this.destroyRef = inject(DestroyRef);
@@ -5947,7 +5955,7 @@ class AppFloatingConfiguratorComponent {
5947
5955
  <app-configurator />
5948
5956
  </div>
5949
5957
  </div>
5950
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i3$3.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfiguratorComponent, selector: "app-configurator" }] }); }
5958
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i3$4.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfiguratorComponent, selector: "app-configurator" }] }); }
5951
5959
  }
5952
5960
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppFloatingConfiguratorComponent, decorators: [{
5953
5961
  type: Component,
@@ -5988,7 +5996,7 @@ var notfound$1 = {
5988
5996
  description: "Requested resource is not available.",
5989
5997
  button: "Go to home"
5990
5998
  };
5991
- var en$b = {
5999
+ var en$c = {
5992
6000
  notfound: notfound$1
5993
6001
  };
5994
6002
 
@@ -5998,13 +6006,13 @@ var notfound = {
5998
6006
  description: "Запрашиваемый ресурс недоступен.",
5999
6007
  button: "На главную"
6000
6008
  };
6001
- var ru$b = {
6009
+ var ru$c = {
6002
6010
  notfound: notfound
6003
6011
  };
6004
6012
 
6005
6013
  class NotfoundComponent {
6006
6014
  constructor() {
6007
- this.translations = provideTranslations({ en: en$b, ru: ru$b });
6015
+ this.translations = provideTranslations({ en: en$c, ru: ru$c });
6008
6016
  }
6009
6017
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: NotfoundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6010
6018
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: NotfoundComponent, isStandalone: true, selector: "app-notfound", ngImport: i0, template: ` <app-floating-configurator />
@@ -6064,7 +6072,7 @@ var unauthorized$1 = {
6064
6072
  signInToContinue: "Sign in to continue",
6065
6073
  signIn: "Sign In"
6066
6074
  };
6067
- var en$a = {
6075
+ var en$b = {
6068
6076
  unauthorized: unauthorized$1
6069
6077
  };
6070
6078
 
@@ -6073,13 +6081,13 @@ var unauthorized = {
6073
6081
  signInToContinue: "Войдите чтобы продолжить",
6074
6082
  signIn: "Войти"
6075
6083
  };
6076
- var ru$a = {
6084
+ var ru$b = {
6077
6085
  unauthorized: unauthorized
6078
6086
  };
6079
6087
 
6080
6088
  class UnauthorizedComponent {
6081
6089
  constructor() {
6082
- this.translations = provideTranslations({ en: en$a, ru: ru$a });
6090
+ this.translations = provideTranslations({ en: en$b, ru: ru$b });
6083
6091
  this.securityService = inject(SecurityService);
6084
6092
  this.route = inject(ActivatedRoute);
6085
6093
  }
@@ -6179,7 +6187,7 @@ var access$1 = {
6179
6187
  message: "You do not have the necessary permissions. Please contact admins.",
6180
6188
  button: "Go to Dashboard"
6181
6189
  };
6182
- var en$9 = {
6190
+ var en$a = {
6183
6191
  access: access$1
6184
6192
  };
6185
6193
 
@@ -6188,13 +6196,13 @@ var access = {
6188
6196
  message: "У вас недостаточно прав. Пожалуйста, обратитесь к администраторам.",
6189
6197
  button: "На главную"
6190
6198
  };
6191
- var ru$9 = {
6199
+ var ru$a = {
6192
6200
  access: access
6193
6201
  };
6194
6202
 
6195
6203
  class AccessComponent {
6196
6204
  constructor() {
6197
- this.translations = provideTranslations({ en: en$9, ru: ru$9 });
6205
+ this.translations = provideTranslations({ en: en$a, ru: ru$a });
6198
6206
  }
6199
6207
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AccessComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6200
6208
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AccessComponent, isStandalone: true, selector: "app-access", ngImport: i0, template: `<div
@@ -6227,7 +6235,7 @@ class AccessComponent {
6227
6235
  </div>
6228
6236
  </div>
6229
6237
  </div>
6230
- </div>`, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1$2.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i2$3.Ripple, selector: "[pRipple]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
6238
+ </div>`, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1$2.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i2$2.Ripple, selector: "[pRipple]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
6231
6239
  }
6232
6240
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AccessComponent, decorators: [{
6233
6241
  type: Component,
@@ -6274,7 +6282,7 @@ var error$1 = {
6274
6282
  message: "Requested resource is not available.",
6275
6283
  button: "Go to Dashboard"
6276
6284
  };
6277
- var en$8 = {
6285
+ var en$9 = {
6278
6286
  error: error$1
6279
6287
  };
6280
6288
 
@@ -6283,13 +6291,13 @@ var error = {
6283
6291
  message: "Запрашиваемый ресурс недоступен.",
6284
6292
  button: "На главную"
6285
6293
  };
6286
- var ru$8 = {
6294
+ var ru$9 = {
6287
6295
  error: error
6288
6296
  };
6289
6297
 
6290
6298
  class ErrorComponent {
6291
6299
  constructor() {
6292
- this.translations = provideTranslations({ en: en$8, ru: ru$8 });
6300
+ this.translations = provideTranslations({ en: en$9, ru: ru$9 });
6293
6301
  }
6294
6302
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
6295
6303
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: ErrorComponent, isStandalone: true, selector: "app-error", ngImport: i0, template: `<div
@@ -6322,7 +6330,7 @@ class ErrorComponent {
6322
6330
  </div>
6323
6331
  </div>
6324
6332
  </div>
6325
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1$2.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i2$3.Ripple, selector: "[pRipple]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
6333
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1$2.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: RippleModule }, { kind: "directive", type: i2$2.Ripple, selector: "[pRipple]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
6326
6334
  }
6327
6335
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ErrorComponent, decorators: [{
6328
6336
  type: Component,
@@ -6372,7 +6380,6 @@ var error_component = /*#__PURE__*/Object.freeze({
6372
6380
  var profileComponent$1 = {
6373
6381
  changePhoto: "Upload Photo",
6374
6382
  successfullyUploaded: "Uploaded successfully",
6375
- failedToLoadPhoto: "Failed to load user photo",
6376
6383
  deletePhoto: "Delete Photo",
6377
6384
  deletePhotoConfirmHeader: "Delete Photo",
6378
6385
  deletePhotoConfirmMessage: "Are you sure you want to delete your photo?",
@@ -6381,14 +6388,13 @@ var profileComponent$1 = {
6381
6388
  photoDeleted: "Photo deleted",
6382
6389
  failedToDeletePhoto: "Failed to delete user photo"
6383
6390
  };
6384
- var en$7 = {
6391
+ var en$8 = {
6385
6392
  profileComponent: profileComponent$1
6386
6393
  };
6387
6394
 
6388
6395
  var profileComponent = {
6389
6396
  changePhoto: "Загрузить фото",
6390
6397
  successfullyUploaded: "Загружено",
6391
- failedToLoadPhoto: "Не удалось загрузить фото пользователя",
6392
6398
  deletePhoto: "Удалить фото",
6393
6399
  deletePhotoConfirmHeader: "Удаление фото",
6394
6400
  deletePhotoConfirmMessage: "Вы уверены, что хотите удалить своё фото?",
@@ -6397,13 +6403,13 @@ var profileComponent = {
6397
6403
  photoDeleted: "Фото удалено",
6398
6404
  failedToDeletePhoto: "Не удалось удалить фото пользователя"
6399
6405
  };
6400
- var ru$7 = {
6406
+ var ru$8 = {
6401
6407
  profileComponent: profileComponent
6402
6408
  };
6403
6409
 
6404
6410
  class UserProfileComponent {
6405
6411
  constructor() {
6406
- this.translations = provideTranslations({ en: en$7, ru: ru$7 });
6412
+ this.translations = provideTranslations({ en: en$8, ru: ru$8 });
6407
6413
  this.userService = inject(UserService);
6408
6414
  this.msgService = inject(MsgService);
6409
6415
  this.translateService = inject(TranslateService);
@@ -6485,7 +6491,7 @@ class UserProfileComponent {
6485
6491
  (onClick)="confirmDeletePhoto($event)" />
6486
6492
  }
6487
6493
  </div>
6488
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FileUploadModule }, { kind: "component", type: i1$8.FileUpload, selector: "p-fileupload, p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "ngmodule", type: ImageModule }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2$2.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
6494
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FileUploadModule }, { kind: "component", type: i1$8.FileUpload, selector: "p-fileupload, p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "ngmodule", type: ImageModule }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2$1.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
6489
6495
  }
6490
6496
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: UserProfileComponent, decorators: [{
6491
6497
  type: Component,
@@ -6545,11 +6551,12 @@ var config$1 = {
6545
6551
  photo: "Photo",
6546
6552
  profile: "Profile",
6547
6553
  selectLanguage: "Select language",
6554
+ sessionManagement: "Session management",
6548
6555
  timeFormat: "Time format",
6549
6556
  timeZone: "Time zone",
6550
6557
  usePhoto256x256Pixel: "Use photo 256x256 pixel"
6551
6558
  };
6552
- var en$6 = {
6559
+ var en$7 = {
6553
6560
  config: config$1
6554
6561
  };
6555
6562
 
@@ -6565,17 +6572,18 @@ var config = {
6565
6572
  photo: "Фото",
6566
6573
  profile: "Профиль",
6567
6574
  selectLanguage: "Выберите язык",
6575
+ sessionManagement: "Управление сессиями",
6568
6576
  timeFormat: "Формат времени",
6569
6577
  timeZone: "Часовой пояс",
6570
6578
  usePhoto256x256Pixel: "Используйте фото 256x256 пикселей"
6571
6579
  };
6572
- var ru$6 = {
6580
+ var ru$7 = {
6573
6581
  config: config
6574
6582
  };
6575
6583
 
6576
6584
  class ConfigComponent {
6577
6585
  constructor() {
6578
- this.translations = provideTranslations({ en: en$6, ru: ru$6 });
6586
+ this.translations = provideTranslations({ en: en$7, ru: ru$7 });
6579
6587
  this.layoutService = inject(LayoutService);
6580
6588
  this.l10nService = inject(L10nService);
6581
6589
  this.userService = inject(UserService);
@@ -6710,11 +6718,19 @@ class ConfigComponent {
6710
6718
  label="{{ 'config.goTo' | translate }}"
6711
6719
  routerLink="/applications" />
6712
6720
  </div>
6721
+ <div class="flex items-center gap-2">
6722
+ <label for="oip-app-config-sessions-link">{{ 'config.sessionManagement' | translate }}</label>
6723
+ <p-button
6724
+ icon="pi pi-users"
6725
+ id="oip-app-config-sessions-link"
6726
+ label="{{ 'config.goTo' | translate }}"
6727
+ routerLink="/sessions" />
6728
+ </div>
6713
6729
  </div>
6714
6730
  </div>
6715
6731
  }
6716
6732
  </div>
6717
- `, isInline: true, dependencies: [{ kind: "component", type: UserProfileComponent, selector: "user-profile" }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: TableModule }, { kind: "ngmodule", type: ToggleSwitchModule }, { kind: "component", type: i2$4.ToggleSwitch, selector: "p-toggleswitch, p-toggleSwitch, p-toggle-switch", inputs: ["styleClass", "tabindex", "inputId", "readonly", "trueValue", "falseValue", "ariaLabel", "size", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
6733
+ `, isInline: true, dependencies: [{ kind: "component", type: UserProfileComponent, selector: "user-profile" }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: TableModule }, { kind: "ngmodule", type: ToggleSwitchModule }, { kind: "component", type: i2$3.ToggleSwitch, selector: "p-toggleswitch, p-toggleSwitch, p-toggle-switch", inputs: ["styleClass", "tabindex", "inputId", "readonly", "trueValue", "falseValue", "ariaLabel", "size", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
6718
6734
  }
6719
6735
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ConfigComponent, decorators: [{
6720
6736
  type: Component,
@@ -6820,6 +6836,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
6820
6836
  label="{{ 'config.goTo' | translate }}"
6821
6837
  routerLink="/applications" />
6822
6838
  </div>
6839
+ <div class="flex items-center gap-2">
6840
+ <label for="oip-app-config-sessions-link">{{ 'config.sessionManagement' | translate }}</label>
6841
+ <p-button
6842
+ icon="pi pi-users"
6843
+ id="oip-app-config-sessions-link"
6844
+ label="{{ 'config.goTo' | translate }}"
6845
+ routerLink="/sessions" />
6846
+ </div>
6823
6847
  </div>
6824
6848
  </div>
6825
6849
  }
@@ -6844,12 +6868,12 @@ var config_component = /*#__PURE__*/Object.freeze({
6844
6868
  ConfigComponent: ConfigComponent
6845
6869
  });
6846
6870
 
6847
- var en$5 = {
6871
+ var en$6 = {
6848
6872
  "db-migration": {
6849
6873
  migrationManager: "Migration manager",
6850
6874
  actions: {
6851
6875
  refresh: "Refresh",
6852
- cleanFilter: "Clean filter",
6876
+ cleanFilter: "Clear filter",
6853
6877
  applyMigration: "Apply migration"
6854
6878
  },
6855
6879
  columns: {
@@ -6860,16 +6884,20 @@ var en$5 = {
6860
6884
  },
6861
6885
  messages: {
6862
6886
  errorRefreshing: "Error refreshing database"
6863
- }
6887
+ },
6888
+ filterPlaceholder: "Filter by migration name",
6889
+ empty: "No migrations",
6890
+ yes: "Yes",
6891
+ no: "No"
6864
6892
  }
6865
6893
  };
6866
6894
 
6867
- var ru$5 = {
6895
+ var ru$6 = {
6868
6896
  "db-migration": {
6869
6897
  migrationManager: "Менеджер миграций",
6870
6898
  actions: {
6871
6899
  refresh: "Обновить",
6872
- cleanFilter: "Очистить фильтр",
6900
+ cleanFilter: "Сбросить фильтр",
6873
6901
  applyMigration: "Применить миграцию"
6874
6902
  },
6875
6903
  columns: {
@@ -6880,28 +6908,48 @@ var ru$5 = {
6880
6908
  },
6881
6909
  messages: {
6882
6910
  errorRefreshing: "Ошибка обновления базы данных"
6883
- }
6911
+ },
6912
+ filterPlaceholder: "Фильтр по имени миграции",
6913
+ empty: "Нет миграций",
6914
+ yes: "Да",
6915
+ no: "Нет"
6884
6916
  }
6885
6917
  };
6886
6918
 
6887
6919
  class DbMigrationComponent extends BaseModuleComponent {
6888
6920
  constructor() {
6889
6921
  super(...arguments);
6890
- this.translations = provideTranslations({ en: en$5, ru: ru$5 });
6922
+ this.translations = provideTranslations({ en: en$6, ru: ru$6 });
6923
+ this.data = [];
6924
+ this.loading = false;
6925
+ this.globalFilter = '';
6891
6926
  }
6892
6927
  async ngOnInit() {
6893
6928
  await super.ngOnInit();
6894
6929
  await this.refreshAction();
6895
6930
  }
6896
6931
  async refreshAction() {
6897
- this.getData()
6898
- .then((response) => {
6899
- this.data = response;
6900
- })
6901
- .catch((error) => {
6932
+ this.loading = true;
6933
+ try {
6934
+ this.data = await this.getData();
6935
+ }
6936
+ catch (error) {
6902
6937
  console.log(error);
6903
6938
  this.msgService.error(this.l10nService.instant('db-migration.messages.errorRefreshing'));
6904
- });
6939
+ }
6940
+ finally {
6941
+ this.loading = false;
6942
+ }
6943
+ }
6944
+ get hasActiveFilters() {
6945
+ if (!this.dt?.filters)
6946
+ return false;
6947
+ return Object.values(this.dt.filters).some((meta) => (Array.isArray(meta) ? meta : [meta]).some((m) => m?.value !== null && m?.value !== undefined && m?.value !== ''));
6948
+ }
6949
+ clearFilter() {
6950
+ this.globalFilter = '';
6951
+ this.dt.clearFilterValues();
6952
+ this.dt._filter();
6905
6953
  }
6906
6954
  async getData() {
6907
6955
  return this.getMigrations();
@@ -6911,85 +6959,125 @@ class DbMigrationComponent extends BaseModuleComponent {
6911
6959
  return this.applyModuleMigration(request);
6912
6960
  }
6913
6961
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DbMigrationComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
6914
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DbMigrationComponent, isStandalone: true, selector: "db-migration", providers: [ConfirmationService], usesInheritance: true, ngImport: i0, template: `
6962
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DbMigrationComponent, isStandalone: true, selector: "db-migration", providers: [ConfirmationService], viewQueries: [{ propertyName: "dt", first: true, predicate: ["dt"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
6915
6963
  @if (isContent) {
6916
- <div class="card" style="height: 100%">
6917
- <p-confirmDialog />
6918
- <div>
6919
- <h5>{{ 'db-migration.migrationManager' | translate }}</h5>
6920
- <div class="flex flex-row gap-2">
6921
- <p-button
6922
- icon="pi pi-refresh"
6923
- severity="secondary"
6924
- tooltipPosition="bottom"
6925
- [outlined]="true"
6926
- [pTooltip]="'db-migration.actions.refresh' | translate"
6927
- (click)="refreshAction()" />
6928
- <p-button
6929
- icon="pi pi-filter-slash"
6930
- severity="secondary"
6931
- tooltipPosition="bottom"
6932
- [outlined]="true"
6933
- [pTooltip]="'db-migration.actions.cleanFilter' | translate"
6934
- (click)="dt.clear()" />
6935
- </div>
6936
- <div>
6937
- <p-table #dt dataKey="name" editMode="row" size="small" [scrollable]="true" [value]="data">
6938
- <ng-template let-columns pTemplate="header">
6939
- <tr>
6940
- <th pSortableColumn="name" scope="col">
6941
- {{ 'db-migration.columns.name' | translate }}
6942
- <p-columnFilter display="menu" field="name" type="text" />
6943
- </th>
6944
- <th scope="col">{{ 'db-migration.columns.applied' | translate }}</th>
6945
- <th scope="col">{{ 'db-migration.columns.exist' | translate }}</th>
6946
- <th scope="col">{{ 'db-migration.columns.pending' | translate }}</th>
6947
- <th scope="col"></th>
6948
- </tr>
6949
- </ng-template>
6964
+ <p-confirmDialog />
6965
+ <div class="flex flex-col md:flex-row gap-4">
6966
+ <div class="card w-full">
6967
+ <div class="mb-4">
6968
+ <p-toolbar>
6969
+ <div class="flex flex-col md:flex-row md:items-center gap-2 w-full">
6970
+ <div class="font-semibold text-lg flex items-center gap-2 mx-2">
6971
+ <i class="pi pi-database"></i>
6972
+ {{ 'db-migration.migrationManager' | translate }}
6973
+ </div>
6950
6974
 
6951
- <ng-template #body let-columns="columns" let-editing="editing" let-ri="rowIndex" let-rowData>
6952
- <tr [pEditableRow]="rowData">
6953
- <td>
6954
- {{ rowData.name }}
6955
- </td>
6956
- <td>
6957
- @if (rowData.applied) {
6958
- <p-button icon="pi pi-check" severity="success" [rounded]="true" [text]="true"></p-button>
6959
- }
6960
- </td>
6961
- <td>
6962
- @if (rowData.exist) {
6963
- <p-button icon="pi pi-check" severity="success" [rounded]="true" [text]="true" />
6964
- }
6965
- </td>
6966
- <td>
6967
- @if (rowData.pending) {
6968
- <p-button icon="pi pi-check" severity="success" [rounded]="true" [text]="true"></p-button>
6969
- }
6970
- </td>
6971
- <td>
6972
- <p-button
6973
- icon="pi pi-bolt"
6974
- pCancelEditableRow
6975
- pTooltip="{{ 'db-migration.actions.applyMigration' | translate }}"
6976
- severity="secondary"
6977
- tooltipPosition="left"
6978
- [rounded]="true"
6979
- [text]="true"
6980
- (click)="applyMigration(rowData)">
6981
- </p-button>
6982
- </td>
6983
- </tr>
6984
- </ng-template>
6985
- </p-table>
6975
+ <div class="flex-1"></div>
6976
+ <div class="flex items-center gap-1 w-full md:w-auto">
6977
+ <p-button
6978
+ icon="pi pi-refresh"
6979
+ rounded="true"
6980
+ severity="secondary"
6981
+ text="true"
6982
+ tooltipPosition="bottom"
6983
+ [loading]="loading"
6984
+ [pTooltip]="'db-migration.actions.refresh' | translate"
6985
+ (onClick)="refreshAction()"></p-button>
6986
+ <input
6987
+ class="w-full md:w-96"
6988
+ pInputText
6989
+ type="text"
6990
+ [placeholder]="'db-migration.filterPlaceholder' | translate"
6991
+ [(ngModel)]="globalFilter"
6992
+ (ngModelChange)="dt.filterGlobal($event, 'contains')" />
6993
+ <p-button
6994
+ icon="pi pi-filter-slash"
6995
+ rounded="true"
6996
+ severity="secondary"
6997
+ text="true"
6998
+ tooltipPosition="bottom"
6999
+ [disabled]="!hasActiveFilters"
7000
+ [pTooltip]="'db-migration.actions.cleanFilter' | translate"
7001
+ (onClick)="clearFilter()"></p-button>
7002
+ </div>
7003
+ </div>
7004
+ </p-toolbar>
6986
7005
  </div>
7006
+ <p-table
7007
+ #dt
7008
+ class="mt-4"
7009
+ dataKey="name"
7010
+ sortField="name"
7011
+ [sortOrder]="1"
7012
+ [paginator]="true"
7013
+ [rows]="50"
7014
+ [globalFilterFields]="['name']"
7015
+ [value]="data"
7016
+ [loading]="loading">
7017
+ <ng-template pTemplate="header">
7018
+ <tr>
7019
+ <th pSortableColumn="name" scope="col">
7020
+ {{ 'db-migration.columns.name' | translate }}
7021
+ <p-sortIcon field="name"></p-sortIcon>
7022
+ <p-columnFilter display="menu" field="name" type="text" />
7023
+ </th>
7024
+ <th pSortableColumn="applied" scope="col">
7025
+ {{ 'db-migration.columns.applied' | translate }}
7026
+ <p-sortIcon field="applied"></p-sortIcon>
7027
+ </th>
7028
+ <th pSortableColumn="exist" scope="col">
7029
+ {{ 'db-migration.columns.exist' | translate }}
7030
+ <p-sortIcon field="exist"></p-sortIcon>
7031
+ </th>
7032
+ <th pSortableColumn="pending" scope="col">
7033
+ {{ 'db-migration.columns.pending' | translate }}
7034
+ <p-sortIcon field="pending"></p-sortIcon>
7035
+ </th>
7036
+ <th style="width: 4rem" scope="col"></th>
7037
+ </tr>
7038
+ </ng-template>
7039
+ <ng-template let-migration pTemplate="body">
7040
+ <tr>
7041
+ <td>{{ migration.name }}</td>
7042
+ <td>
7043
+ <p-tag
7044
+ [severity]="migration.applied ? 'success' : 'secondary'"
7045
+ [value]="(migration.applied ? 'db-migration.yes' : 'db-migration.no') | translate"></p-tag>
7046
+ </td>
7047
+ <td>
7048
+ <p-tag
7049
+ [severity]="migration.exist ? 'success' : 'secondary'"
7050
+ [value]="(migration.exist ? 'db-migration.yes' : 'db-migration.no') | translate"></p-tag>
7051
+ </td>
7052
+ <td>
7053
+ <p-tag
7054
+ [severity]="migration.pending ? 'warn' : 'secondary'"
7055
+ [value]="(migration.pending ? 'db-migration.yes' : 'db-migration.no') | translate"></p-tag>
7056
+ </td>
7057
+ <td>
7058
+ <p-button
7059
+ icon="pi pi-bolt"
7060
+ rounded="true"
7061
+ severity="secondary"
7062
+ text="true"
7063
+ tooltipPosition="left"
7064
+ [pTooltip]="'db-migration.actions.applyMigration' | translate"
7065
+ (onClick)="applyMigration(migration)"></p-button>
7066
+ </td>
7067
+ </tr>
7068
+ </ng-template>
7069
+ <ng-template pTemplate="emptymessage">
7070
+ <tr>
7071
+ <td colspan="5">{{ 'db-migration.empty' | translate }}</td>
7072
+ </tr>
7073
+ </ng-template>
7074
+ </p-table>
6987
7075
  </div>
6988
7076
  </div>
6989
7077
  } @else if (isSecurity) {
6990
7078
  <security [controller]="controller" [id]="id" />
6991
7079
  }
6992
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: TableModule }, { kind: "component", type: i1$9.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1$9.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i1$9.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i1$9.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i1$9.ColumnFilter, selector: "p-columnFilter, p-column-filter, p-columnfilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "filterOn", "useGrouping", "showButtons", "ariaLabel", "filterButtonProps"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: SharedModule }, { kind: "ngmodule", type: TagModule }, { kind: "ngmodule", type: InputTextModule }, { kind: "ngmodule", type: TextareaModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "component", type: SecurityComponent, selector: "security", inputs: ["id", "controller"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
7080
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: TableModule }, { kind: "component", type: i2$4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2$4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i2$4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i2$4.ColumnFilter, selector: "p-columnFilter, p-column-filter, p-columnfilter", inputs: ["field", "type", "display", "showMenu", "matchMode", "operator", "showOperator", "showClearButton", "showApplyButton", "showMatchModes", "showAddButton", "hideOnClear", "placeholder", "matchModeOptions", "maxConstraints", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "locale", "localeMatcher", "currency", "currencyDisplay", "filterOn", "useGrouping", "showButtons", "ariaLabel", "filterButtonProps"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: SharedModule }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i3$6.Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$1.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "component", type: i5$1.Toolbar, selector: "p-toolbar", inputs: ["styleClass", "ariaLabelledBy"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "component", type: SecurityComponent, selector: "security", inputs: ["id", "controller"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
6993
7081
  }
6994
7082
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DbMigrationComponent, decorators: [{
6995
7083
  type: Component,
@@ -6999,8 +7087,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
6999
7087
  SharedModule,
7000
7088
  TagModule,
7001
7089
  InputTextModule,
7002
- TextareaModule,
7003
7090
  ButtonModule,
7091
+ ToolbarModule,
7004
7092
  FormsModule,
7005
7093
  ConfirmDialog,
7006
7094
  SecurityComponent,
@@ -7010,77 +7098,117 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
7010
7098
  selector: 'db-migration',
7011
7099
  template: `
7012
7100
  @if (isContent) {
7013
- <div class="card" style="height: 100%">
7014
- <p-confirmDialog />
7015
- <div>
7016
- <h5>{{ 'db-migration.migrationManager' | translate }}</h5>
7017
- <div class="flex flex-row gap-2">
7018
- <p-button
7019
- icon="pi pi-refresh"
7020
- severity="secondary"
7021
- tooltipPosition="bottom"
7022
- [outlined]="true"
7023
- [pTooltip]="'db-migration.actions.refresh' | translate"
7024
- (click)="refreshAction()" />
7025
- <p-button
7026
- icon="pi pi-filter-slash"
7027
- severity="secondary"
7028
- tooltipPosition="bottom"
7029
- [outlined]="true"
7030
- [pTooltip]="'db-migration.actions.cleanFilter' | translate"
7031
- (click)="dt.clear()" />
7032
- </div>
7033
- <div>
7034
- <p-table #dt dataKey="name" editMode="row" size="small" [scrollable]="true" [value]="data">
7035
- <ng-template let-columns pTemplate="header">
7036
- <tr>
7037
- <th pSortableColumn="name" scope="col">
7038
- {{ 'db-migration.columns.name' | translate }}
7039
- <p-columnFilter display="menu" field="name" type="text" />
7040
- </th>
7041
- <th scope="col">{{ 'db-migration.columns.applied' | translate }}</th>
7042
- <th scope="col">{{ 'db-migration.columns.exist' | translate }}</th>
7043
- <th scope="col">{{ 'db-migration.columns.pending' | translate }}</th>
7044
- <th scope="col"></th>
7045
- </tr>
7046
- </ng-template>
7101
+ <p-confirmDialog />
7102
+ <div class="flex flex-col md:flex-row gap-4">
7103
+ <div class="card w-full">
7104
+ <div class="mb-4">
7105
+ <p-toolbar>
7106
+ <div class="flex flex-col md:flex-row md:items-center gap-2 w-full">
7107
+ <div class="font-semibold text-lg flex items-center gap-2 mx-2">
7108
+ <i class="pi pi-database"></i>
7109
+ {{ 'db-migration.migrationManager' | translate }}
7110
+ </div>
7047
7111
 
7048
- <ng-template #body let-columns="columns" let-editing="editing" let-ri="rowIndex" let-rowData>
7049
- <tr [pEditableRow]="rowData">
7050
- <td>
7051
- {{ rowData.name }}
7052
- </td>
7053
- <td>
7054
- @if (rowData.applied) {
7055
- <p-button icon="pi pi-check" severity="success" [rounded]="true" [text]="true"></p-button>
7056
- }
7057
- </td>
7058
- <td>
7059
- @if (rowData.exist) {
7060
- <p-button icon="pi pi-check" severity="success" [rounded]="true" [text]="true" />
7061
- }
7062
- </td>
7063
- <td>
7064
- @if (rowData.pending) {
7065
- <p-button icon="pi pi-check" severity="success" [rounded]="true" [text]="true"></p-button>
7066
- }
7067
- </td>
7068
- <td>
7069
- <p-button
7070
- icon="pi pi-bolt"
7071
- pCancelEditableRow
7072
- pTooltip="{{ 'db-migration.actions.applyMigration' | translate }}"
7073
- severity="secondary"
7074
- tooltipPosition="left"
7075
- [rounded]="true"
7076
- [text]="true"
7077
- (click)="applyMigration(rowData)">
7078
- </p-button>
7079
- </td>
7080
- </tr>
7081
- </ng-template>
7082
- </p-table>
7112
+ <div class="flex-1"></div>
7113
+ <div class="flex items-center gap-1 w-full md:w-auto">
7114
+ <p-button
7115
+ icon="pi pi-refresh"
7116
+ rounded="true"
7117
+ severity="secondary"
7118
+ text="true"
7119
+ tooltipPosition="bottom"
7120
+ [loading]="loading"
7121
+ [pTooltip]="'db-migration.actions.refresh' | translate"
7122
+ (onClick)="refreshAction()"></p-button>
7123
+ <input
7124
+ class="w-full md:w-96"
7125
+ pInputText
7126
+ type="text"
7127
+ [placeholder]="'db-migration.filterPlaceholder' | translate"
7128
+ [(ngModel)]="globalFilter"
7129
+ (ngModelChange)="dt.filterGlobal($event, 'contains')" />
7130
+ <p-button
7131
+ icon="pi pi-filter-slash"
7132
+ rounded="true"
7133
+ severity="secondary"
7134
+ text="true"
7135
+ tooltipPosition="bottom"
7136
+ [disabled]="!hasActiveFilters"
7137
+ [pTooltip]="'db-migration.actions.cleanFilter' | translate"
7138
+ (onClick)="clearFilter()"></p-button>
7139
+ </div>
7140
+ </div>
7141
+ </p-toolbar>
7083
7142
  </div>
7143
+ <p-table
7144
+ #dt
7145
+ class="mt-4"
7146
+ dataKey="name"
7147
+ sortField="name"
7148
+ [sortOrder]="1"
7149
+ [paginator]="true"
7150
+ [rows]="50"
7151
+ [globalFilterFields]="['name']"
7152
+ [value]="data"
7153
+ [loading]="loading">
7154
+ <ng-template pTemplate="header">
7155
+ <tr>
7156
+ <th pSortableColumn="name" scope="col">
7157
+ {{ 'db-migration.columns.name' | translate }}
7158
+ <p-sortIcon field="name"></p-sortIcon>
7159
+ <p-columnFilter display="menu" field="name" type="text" />
7160
+ </th>
7161
+ <th pSortableColumn="applied" scope="col">
7162
+ {{ 'db-migration.columns.applied' | translate }}
7163
+ <p-sortIcon field="applied"></p-sortIcon>
7164
+ </th>
7165
+ <th pSortableColumn="exist" scope="col">
7166
+ {{ 'db-migration.columns.exist' | translate }}
7167
+ <p-sortIcon field="exist"></p-sortIcon>
7168
+ </th>
7169
+ <th pSortableColumn="pending" scope="col">
7170
+ {{ 'db-migration.columns.pending' | translate }}
7171
+ <p-sortIcon field="pending"></p-sortIcon>
7172
+ </th>
7173
+ <th style="width: 4rem" scope="col"></th>
7174
+ </tr>
7175
+ </ng-template>
7176
+ <ng-template let-migration pTemplate="body">
7177
+ <tr>
7178
+ <td>{{ migration.name }}</td>
7179
+ <td>
7180
+ <p-tag
7181
+ [severity]="migration.applied ? 'success' : 'secondary'"
7182
+ [value]="(migration.applied ? 'db-migration.yes' : 'db-migration.no') | translate"></p-tag>
7183
+ </td>
7184
+ <td>
7185
+ <p-tag
7186
+ [severity]="migration.exist ? 'success' : 'secondary'"
7187
+ [value]="(migration.exist ? 'db-migration.yes' : 'db-migration.no') | translate"></p-tag>
7188
+ </td>
7189
+ <td>
7190
+ <p-tag
7191
+ [severity]="migration.pending ? 'warn' : 'secondary'"
7192
+ [value]="(migration.pending ? 'db-migration.yes' : 'db-migration.no') | translate"></p-tag>
7193
+ </td>
7194
+ <td>
7195
+ <p-button
7196
+ icon="pi pi-bolt"
7197
+ rounded="true"
7198
+ severity="secondary"
7199
+ text="true"
7200
+ tooltipPosition="left"
7201
+ [pTooltip]="'db-migration.actions.applyMigration' | translate"
7202
+ (onClick)="applyMigration(migration)"></p-button>
7203
+ </td>
7204
+ </tr>
7205
+ </ng-template>
7206
+ <ng-template pTemplate="emptymessage">
7207
+ <tr>
7208
+ <td colspan="5">{{ 'db-migration.empty' | translate }}</td>
7209
+ </tr>
7210
+ </ng-template>
7211
+ </p-table>
7084
7212
  </div>
7085
7213
  </div>
7086
7214
  } @else if (isSecurity) {
@@ -7089,7 +7217,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
7089
7217
  `,
7090
7218
  providers: [ConfirmationService]
7091
7219
  }]
7092
- }] });
7220
+ }], propDecorators: { dt: [{
7221
+ type: ViewChild,
7222
+ args: ['dt']
7223
+ }] } });
7093
7224
 
7094
7225
  var dbMigration_component = /*#__PURE__*/Object.freeze({
7095
7226
  __proto__: null,
@@ -7192,7 +7323,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
7192
7323
  type: Injectable
7193
7324
  }] });
7194
7325
 
7195
- var en$4 = {
7326
+ var en$5 = {
7196
7327
  "app-modules": {
7197
7328
  title: "Modules",
7198
7329
  refreshTooltip: "Refresh",
@@ -7206,7 +7337,8 @@ var en$4 = {
7206
7337
  currentlyLoaded: "Currently Loaded",
7207
7338
  yes: "Yes",
7208
7339
  no: "No",
7209
- deleteTooltip: "Delete"
7340
+ deleteTooltip: "Delete",
7341
+ empty: "No modules"
7210
7342
  },
7211
7343
  confirm: {
7212
7344
  header: "Warning",
@@ -7218,12 +7350,15 @@ var en$4 = {
7218
7350
  deleteSuccess: "Module deleted",
7219
7351
  deleteError: "Module delete failed",
7220
7352
  registerError: "External module registration failed",
7221
- registerSuccess: "External module registered"
7222
- }
7353
+ registerSuccess: "External module registered",
7354
+ loadError: "Failed to load modules"
7355
+ },
7356
+ filterPlaceholder: "Filter by ID or name",
7357
+ clearFilterTooltip: "Clear filter"
7223
7358
  }
7224
7359
  };
7225
7360
 
7226
- var ru$4 = {
7361
+ var ru$5 = {
7227
7362
  "app-modules": {
7228
7363
  title: "Модули",
7229
7364
  refreshTooltip: "Обновить",
@@ -7237,7 +7372,8 @@ var ru$4 = {
7237
7372
  currentlyLoaded: "Загружен",
7238
7373
  yes: "Да",
7239
7374
  no: "Нет",
7240
- deleteTooltip: "Удалить"
7375
+ deleteTooltip: "Удалить",
7376
+ empty: "Нет модулей"
7241
7377
  },
7242
7378
  confirm: {
7243
7379
  header: "Внимание",
@@ -7249,15 +7385,20 @@ var ru$4 = {
7249
7385
  deleteSuccess: "Модуль удален",
7250
7386
  deleteError: "Не удалось удалить модуль",
7251
7387
  registerError: "Не удалось зарегистрировать внешний модуль",
7252
- registerSuccess: "Внешний модуль зарегистрирован"
7253
- }
7388
+ registerSuccess: "Внешний модуль зарегистрирован",
7389
+ loadError: "Не удалось загрузить модули"
7390
+ },
7391
+ filterPlaceholder: "Фильтр по ID или имени",
7392
+ clearFilterTooltip: "Сбросить фильтр"
7254
7393
  }
7255
7394
  };
7256
7395
 
7257
- L10nService.registerTranslations({ en: en$4, ru: ru$4 });
7396
+ L10nService.registerTranslations({ en: en$5, ru: ru$5 });
7258
7397
  class AppModulesComponent {
7259
7398
  constructor() {
7260
7399
  this.modules = [];
7400
+ this.moduleFilter = '';
7401
+ this.loading = false;
7261
7402
  this.msgService = inject(MsgService);
7262
7403
  this.confirmationService = inject(ConfirmationService);
7263
7404
  this.l10nService = inject(L10nService);
@@ -7273,8 +7414,24 @@ class AppModulesComponent {
7273
7414
  this.titleService.setTitle(this.t('app-modules.title'));
7274
7415
  await this.refreshAction();
7275
7416
  }
7417
+ get filteredModules() {
7418
+ const filter = this.moduleFilter.trim().toLowerCase();
7419
+ if (!filter) {
7420
+ return this.modules;
7421
+ }
7422
+ return this.modules.filter((module) => [module.moduleId, module.name].some((value) => value?.toString().toLowerCase().includes(filter)));
7423
+ }
7276
7424
  async refreshAction() {
7277
- this.modules = await this.moduleService.getModulesWithLoadStatus();
7425
+ this.loading = true;
7426
+ try {
7427
+ this.modules = await this.moduleService.getModulesWithLoadStatus();
7428
+ }
7429
+ catch (error) {
7430
+ this.msgService.errorFromException(error, this.t('app-modules.messages.loadError'), this.t('app-modules.messages.loadError'));
7431
+ }
7432
+ finally {
7433
+ this.loading = false;
7434
+ }
7278
7435
  }
7279
7436
  get canRegisterExternalModule() {
7280
7437
  return !!this.externalModuleManifestUrl.trim() && !this.registeringExternalModule;
@@ -7337,46 +7494,91 @@ class AppModulesComponent {
7337
7494
  <p-confirmDialog></p-confirmDialog>
7338
7495
  <div class="flex flex-col md:flex-row gap-4">
7339
7496
  <div class="card w-full">
7340
- <div class="font-semibold text-xl mb-4">
7341
- {{ 'app-modules.title' | translate }}
7342
- </div>
7343
7497
  <div class="mb-4">
7344
7498
  <p-toolbar>
7345
7499
  <div class="flex flex-col md:flex-row md:items-center gap-2 w-full">
7346
- <div class="flex flex-col sm:flex-row gap-2 flex-1">
7500
+ <div class="font-semibold text-lg flex items-center gap-2 mx-2">
7501
+ <i class="pi pi-box"></i>
7502
+ {{ 'app-modules.title' | translate }}
7503
+ </div>
7504
+
7505
+ <div class="flex items-center gap-1 flex-1">
7347
7506
  <input
7348
7507
  class="w-full"
7349
7508
  pInputText
7350
7509
  type="url"
7510
+ id="oip-app-modules-manifest-url"
7351
7511
  [disabled]="registeringExternalModule"
7352
7512
  [placeholder]="'app-modules.register.manifestUrlPlaceholder' | translate"
7353
7513
  [(ngModel)]="externalModuleManifestUrl"
7354
7514
  (keydown.enter)="registerExternalModule()" />
7355
7515
  <p-button
7356
7516
  icon="pi pi-plus"
7517
+ rounded="true"
7357
7518
  severity="success"
7519
+ text="true"
7520
+ tooltipPosition="bottom"
7521
+ id="oip-app-modules-register"
7358
7522
  [disabled]="!canRegisterExternalModule"
7359
- [label]="'app-modules.register.button' | translate"
7523
+ [pTooltip]="'app-modules.register.button' | translate"
7360
7524
  [loading]="registeringExternalModule"
7361
7525
  (onClick)="registerExternalModule()"></p-button>
7362
7526
  </div>
7363
- <p-button
7364
- icon="pi pi-refresh"
7365
- rounded="true"
7366
- severity="secondary"
7367
- text="true"
7368
- tooltipPosition="bottom"
7369
- [pTooltip]="'app-modules.refreshTooltip' | translate"
7370
- (onClick)="refreshAction()"></p-button>
7527
+
7528
+ <div class="flex items-center gap-1 w-full md:w-auto">
7529
+ <p-button
7530
+ icon="pi pi-refresh"
7531
+ rounded="true"
7532
+ severity="secondary"
7533
+ text="true"
7534
+ tooltipPosition="bottom"
7535
+ [loading]="loading"
7536
+ [pTooltip]="'app-modules.refreshTooltip' | translate"
7537
+ (onClick)="refreshAction()"></p-button>
7538
+ <input
7539
+ class="w-full md:w-96"
7540
+ pInputText
7541
+ type="text"
7542
+ id="oip-app-modules-filter"
7543
+ [placeholder]="'app-modules.filterPlaceholder' | translate"
7544
+ [(ngModel)]="moduleFilter" />
7545
+ <p-button
7546
+ icon="pi pi-filter-slash"
7547
+ rounded="true"
7548
+ severity="secondary"
7549
+ text="true"
7550
+ tooltipPosition="bottom"
7551
+ id="oip-app-modules-clear-filter"
7552
+ [disabled]="!moduleFilter"
7553
+ [pTooltip]="'app-modules.clearFilterTooltip' | translate"
7554
+ (onClick)="moduleFilter = ''"></p-button>
7555
+ </div>
7371
7556
  </div>
7372
7557
  </p-toolbar>
7373
7558
  </div>
7374
- <p-table class="mt-4" [paginator]="true" [rows]="100" [value]="modules">
7559
+ <p-table
7560
+ class="mt-4"
7561
+ dataKey="moduleId"
7562
+ sortField="name"
7563
+ [sortOrder]="1"
7564
+ [paginator]="true"
7565
+ [rows]="100"
7566
+ [value]="filteredModules"
7567
+ [loading]="loading">
7375
7568
  <ng-template pTemplate="header">
7376
7569
  <tr>
7377
- <th>{{ 'app-modules.table.moduleId' | translate }}</th>
7378
- <th>{{ 'app-modules.table.name' | translate }}</th>
7379
- <th>{{ 'app-modules.table.currentlyLoaded' | translate }}</th>
7570
+ <th pSortableColumn="moduleId">
7571
+ {{ 'app-modules.table.moduleId' | translate }}
7572
+ <p-sortIcon field="moduleId"></p-sortIcon>
7573
+ </th>
7574
+ <th pSortableColumn="name">
7575
+ {{ 'app-modules.table.name' | translate }}
7576
+ <p-sortIcon field="name"></p-sortIcon>
7577
+ </th>
7578
+ <th pSortableColumn="currentlyLoaded">
7579
+ {{ 'app-modules.table.currentlyLoaded' | translate }}
7580
+ <p-sortIcon field="currentlyLoaded"></p-sortIcon>
7581
+ </th>
7380
7582
  <th style="width: 4rem"></th>
7381
7583
  </tr>
7382
7584
  </ng-template>
@@ -7403,10 +7605,15 @@ class AppModulesComponent {
7403
7605
  </td>
7404
7606
  </tr>
7405
7607
  </ng-template>
7608
+ <ng-template pTemplate="emptymessage">
7609
+ <tr>
7610
+ <td colspan="4">{{ 'app-modules.table.empty' | translate }}</td>
7611
+ </tr>
7612
+ </ng-template>
7406
7613
  </p-table>
7407
7614
  </div>
7408
7615
  </div>
7409
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i1$9.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "component", type: i5$1.Toolbar, selector: "p-toolbar", inputs: ["styleClass", "ariaLabelledBy"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$1.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
7616
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i2$4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2$4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i2$4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "component", type: i5$1.Toolbar, selector: "p-toolbar", inputs: ["styleClass", "ariaLabelledBy"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$1.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
7410
7617
  }
7411
7618
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppModulesComponent, decorators: [{
7412
7619
  type: Component,
@@ -7428,48 +7635,93 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
7428
7635
  <p-confirmDialog></p-confirmDialog>
7429
7636
  <div class="flex flex-col md:flex-row gap-4">
7430
7637
  <div class="card w-full">
7431
- <div class="font-semibold text-xl mb-4">
7432
- {{ 'app-modules.title' | translate }}
7433
- </div>
7434
7638
  <div class="mb-4">
7435
7639
  <p-toolbar>
7436
7640
  <div class="flex flex-col md:flex-row md:items-center gap-2 w-full">
7437
- <div class="flex flex-col sm:flex-row gap-2 flex-1">
7641
+ <div class="font-semibold text-lg flex items-center gap-2 mx-2">
7642
+ <i class="pi pi-box"></i>
7643
+ {{ 'app-modules.title' | translate }}
7644
+ </div>
7645
+
7646
+ <div class="flex items-center gap-1 flex-1">
7438
7647
  <input
7439
7648
  class="w-full"
7440
7649
  pInputText
7441
7650
  type="url"
7651
+ id="oip-app-modules-manifest-url"
7442
7652
  [disabled]="registeringExternalModule"
7443
7653
  [placeholder]="'app-modules.register.manifestUrlPlaceholder' | translate"
7444
7654
  [(ngModel)]="externalModuleManifestUrl"
7445
7655
  (keydown.enter)="registerExternalModule()" />
7446
7656
  <p-button
7447
7657
  icon="pi pi-plus"
7658
+ rounded="true"
7448
7659
  severity="success"
7660
+ text="true"
7661
+ tooltipPosition="bottom"
7662
+ id="oip-app-modules-register"
7449
7663
  [disabled]="!canRegisterExternalModule"
7450
- [label]="'app-modules.register.button' | translate"
7664
+ [pTooltip]="'app-modules.register.button' | translate"
7451
7665
  [loading]="registeringExternalModule"
7452
7666
  (onClick)="registerExternalModule()"></p-button>
7453
7667
  </div>
7454
- <p-button
7455
- icon="pi pi-refresh"
7456
- rounded="true"
7457
- severity="secondary"
7458
- text="true"
7459
- tooltipPosition="bottom"
7460
- [pTooltip]="'app-modules.refreshTooltip' | translate"
7461
- (onClick)="refreshAction()"></p-button>
7668
+
7669
+ <div class="flex items-center gap-1 w-full md:w-auto">
7670
+ <p-button
7671
+ icon="pi pi-refresh"
7672
+ rounded="true"
7673
+ severity="secondary"
7674
+ text="true"
7675
+ tooltipPosition="bottom"
7676
+ [loading]="loading"
7677
+ [pTooltip]="'app-modules.refreshTooltip' | translate"
7678
+ (onClick)="refreshAction()"></p-button>
7679
+ <input
7680
+ class="w-full md:w-96"
7681
+ pInputText
7682
+ type="text"
7683
+ id="oip-app-modules-filter"
7684
+ [placeholder]="'app-modules.filterPlaceholder' | translate"
7685
+ [(ngModel)]="moduleFilter" />
7686
+ <p-button
7687
+ icon="pi pi-filter-slash"
7688
+ rounded="true"
7689
+ severity="secondary"
7690
+ text="true"
7691
+ tooltipPosition="bottom"
7692
+ id="oip-app-modules-clear-filter"
7693
+ [disabled]="!moduleFilter"
7694
+ [pTooltip]="'app-modules.clearFilterTooltip' | translate"
7695
+ (onClick)="moduleFilter = ''"></p-button>
7696
+ </div>
7462
7697
  </div>
7463
7698
  </p-toolbar>
7464
7699
  </div>
7465
- <p-table class="mt-4" [paginator]="true" [rows]="100" [value]="modules">
7700
+ <p-table
7701
+ class="mt-4"
7702
+ dataKey="moduleId"
7703
+ sortField="name"
7704
+ [sortOrder]="1"
7705
+ [paginator]="true"
7706
+ [rows]="100"
7707
+ [value]="filteredModules"
7708
+ [loading]="loading">
7466
7709
  <ng-template pTemplate="header">
7467
7710
  <tr>
7468
- <th>{{ 'app-modules.table.moduleId' | translate }}</th>
7469
- <th>{{ 'app-modules.table.name' | translate }}</th>
7470
- <th>{{ 'app-modules.table.currentlyLoaded' | translate }}</th>
7471
- <th style="width: 4rem"></th>
7472
- </tr>
7711
+ <th pSortableColumn="moduleId">
7712
+ {{ 'app-modules.table.moduleId' | translate }}
7713
+ <p-sortIcon field="moduleId"></p-sortIcon>
7714
+ </th>
7715
+ <th pSortableColumn="name">
7716
+ {{ 'app-modules.table.name' | translate }}
7717
+ <p-sortIcon field="name"></p-sortIcon>
7718
+ </th>
7719
+ <th pSortableColumn="currentlyLoaded">
7720
+ {{ 'app-modules.table.currentlyLoaded' | translate }}
7721
+ <p-sortIcon field="currentlyLoaded"></p-sortIcon>
7722
+ </th>
7723
+ <th style="width: 4rem"></th>
7724
+ </tr>
7473
7725
  </ng-template>
7474
7726
  <ng-template let-module pTemplate="body">
7475
7727
  <tr>
@@ -7494,6 +7746,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
7494
7746
  </td>
7495
7747
  </tr>
7496
7748
  </ng-template>
7749
+ <ng-template pTemplate="emptymessage">
7750
+ <tr>
7751
+ <td colspan="4">{{ 'app-modules.table.empty' | translate }}</td>
7752
+ </tr>
7753
+ </ng-template>
7497
7754
  </p-table>
7498
7755
  </div>
7499
7756
  </div>
@@ -7506,6 +7763,580 @@ var appModules_component = /*#__PURE__*/Object.freeze({
7506
7763
  AppModulesComponent: AppModulesComponent
7507
7764
  });
7508
7765
 
7766
+ /* eslint-disable */
7767
+ /* tslint:disable */
7768
+ // @ts-nocheck
7769
+ class AuthSessionsApi extends HttpClient {
7770
+ constructor() {
7771
+ super(...arguments);
7772
+ this.getAuthSessions = (query, params = {}) => this.request({
7773
+ path: `/api/auth-sessions/get-auth-sessions`,
7774
+ method: "GET",
7775
+ query: query,
7776
+ secure: true,
7777
+ format: "json",
7778
+ ...params,
7779
+ });
7780
+ this.deleteAuthSession = ({ sessionId, ...query }, params = {}) => this.request({
7781
+ path: `/api/auth-sessions/delete-auth-session/${sessionId}`,
7782
+ method: "DELETE",
7783
+ secure: true,
7784
+ ...params,
7785
+ });
7786
+ this.deleteAuthSessionsByUser = ({ userId, ...query }, params = {}) => this.request({
7787
+ path: `/api/auth-sessions/delete-auth-sessions-by-user/${userId}`,
7788
+ method: "DELETE",
7789
+ secure: true,
7790
+ format: "json",
7791
+ ...params,
7792
+ });
7793
+ this.deleteAllAuthSessions = (params = {}) => this.request({
7794
+ path: `/api/auth-sessions/delete-all-auth-sessions`,
7795
+ method: "DELETE",
7796
+ secure: true,
7797
+ format: "json",
7798
+ ...params,
7799
+ });
7800
+ }
7801
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AuthSessionsApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
7802
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AuthSessionsApi }); }
7803
+ }
7804
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AuthSessionsApi, decorators: [{
7805
+ type: Injectable
7806
+ }] });
7807
+
7808
+ var en$4 = {
7809
+ "auth-sessions": {
7810
+ title: "Active sessions",
7811
+ refreshTooltip: "Refresh",
7812
+ filterPlaceholder: "Filter by user, email or IP address",
7813
+ table: {
7814
+ user: "User",
7815
+ created: "Signed in",
7816
+ lastActivity: "Last activity",
7817
+ expires: "Expires",
7818
+ ipAddress: "IP address",
7819
+ userAgent: "Browser",
7820
+ current: "Current",
7821
+ terminateTooltip: "Terminate session",
7822
+ terminateAllTooltip: "Terminate all user sessions",
7823
+ empty: "No active sessions"
7824
+ },
7825
+ confirm: {
7826
+ header: "Warning",
7827
+ terminateMessage: "Terminate the session of {{user}}?",
7828
+ terminateAllMessage: "Terminate all sessions of {{user}}?",
7829
+ cancel: "Cancel",
7830
+ terminate: "Terminate",
7831
+ terminateEveryoneMessage: "Terminate all sessions except the current one?"
7832
+ },
7833
+ messages: {
7834
+ loadError: "Failed to load sessions",
7835
+ terminateSuccess: "Session terminated",
7836
+ terminateAllSuccess: "Sessions terminated: {{count}}",
7837
+ terminateError: "Session termination failed"
7838
+ },
7839
+ terminateAllTooltip: "Terminate all except current",
7840
+ clearFilterTooltip: "Clear filter"
7841
+ }
7842
+ };
7843
+
7844
+ var ru$4 = {
7845
+ "auth-sessions": {
7846
+ title: "Активные сессии",
7847
+ refreshTooltip: "Обновить",
7848
+ filterPlaceholder: "Фильтр по пользователю, email или IP-адресу",
7849
+ table: {
7850
+ user: "Пользователь",
7851
+ created: "Вход",
7852
+ lastActivity: "Последняя активность",
7853
+ expires: "Истекает",
7854
+ ipAddress: "IP-адрес",
7855
+ userAgent: "Браузер",
7856
+ current: "Текущая",
7857
+ terminateTooltip: "Завершить сессию",
7858
+ terminateAllTooltip: "Завершить все сессии пользователя",
7859
+ empty: "Активных сессий нет"
7860
+ },
7861
+ confirm: {
7862
+ header: "Внимание",
7863
+ terminateMessage: "Завершить сессию пользователя {{user}}?",
7864
+ terminateAllMessage: "Завершить все сессии пользователя {{user}}?",
7865
+ cancel: "Отмена",
7866
+ terminate: "Завершить",
7867
+ terminateEveryoneMessage: "Завершить все сессии, кроме текущей?"
7868
+ },
7869
+ messages: {
7870
+ loadError: "Не удалось загрузить сессии",
7871
+ terminateSuccess: "Сессия завершена",
7872
+ terminateAllSuccess: "Завершено сессий: {{count}}",
7873
+ terminateError: "Не удалось завершить сессию"
7874
+ },
7875
+ terminateAllTooltip: "Завершить все, кроме текущей",
7876
+ clearFilterTooltip: "Очистить фильтр"
7877
+ }
7878
+ };
7879
+
7880
+ L10nService.registerTranslations({ en: en$4, ru: ru$4 });
7881
+ /**
7882
+ * Administrator page listing active authentication sessions with the ability to terminate them.
7883
+ */
7884
+ class AuthSessionsComponent {
7885
+ constructor() {
7886
+ this.sessions = [];
7887
+ this.userFilter = '';
7888
+ this.loading = false;
7889
+ this.msgService = inject(MsgService);
7890
+ this.confirmationService = inject(ConfirmationService);
7891
+ this.l10nService = inject(L10nService);
7892
+ this.titleService = inject(AppTitleService);
7893
+ this.layoutService = inject(LayoutService);
7894
+ this.authSessionsApi = inject(AuthSessionsApi);
7895
+ this.translationsReady = firstValueFrom(this.l10nService.loadComponentTranslations('auth-sessions'));
7896
+ }
7897
+ async ngOnInit() {
7898
+ await this.translationsReady;
7899
+ this.titleService.setTitle(this.t('auth-sessions.title'));
7900
+ await this.refreshAction();
7901
+ }
7902
+ get filteredSessions() {
7903
+ const filter = this.userFilter.trim().toLowerCase();
7904
+ if (!filter) {
7905
+ return this.sessions;
7906
+ }
7907
+ return this.sessions.filter((session) => [session.userName, session.displayName, session.email, session.userId, session.ipAddress].some((value) => value?.toLowerCase().includes(filter)));
7908
+ }
7909
+ async refreshAction() {
7910
+ this.loading = true;
7911
+ try {
7912
+ this.sessions = await this.authSessionsApi.getAuthSessions({});
7913
+ }
7914
+ catch (error) {
7915
+ this.msgService.errorFromException(error, this.t('auth-sessions.messages.loadError'), this.t('auth-sessions.messages.loadError'));
7916
+ }
7917
+ finally {
7918
+ this.loading = false;
7919
+ }
7920
+ }
7921
+ get hasOtherSessionsThanCurrent() {
7922
+ return this.sessions.some((x) => !x.isCurrent);
7923
+ }
7924
+ async terminateAllSessions() {
7925
+ await this.translationsReady;
7926
+ this.confirmationService.confirm({
7927
+ header: this.t('auth-sessions.confirm.header'),
7928
+ message: this.t('auth-sessions.confirm.terminateEveryoneMessage'),
7929
+ icon: 'pi pi-power-off',
7930
+ rejectButtonProps: {
7931
+ label: this.t('auth-sessions.confirm.cancel'),
7932
+ severity: 'secondary',
7933
+ outlined: true
7934
+ },
7935
+ acceptButtonProps: {
7936
+ label: this.t('auth-sessions.confirm.terminate'),
7937
+ severity: 'danger'
7938
+ },
7939
+ accept: async () => {
7940
+ try {
7941
+ const result = await this.authSessionsApi.deleteAllAuthSessions();
7942
+ await this.refreshAction();
7943
+ this.msgService.success(this.l10nService.instant('auth-sessions.messages.terminateAllSuccess', {
7944
+ count: result.deletedCount ?? 0
7945
+ }));
7946
+ }
7947
+ catch (error) {
7948
+ this.msgService.errorFromException(error, this.t('auth-sessions.messages.terminateError'), this.t('auth-sessions.messages.terminateError'));
7949
+ }
7950
+ }
7951
+ });
7952
+ }
7953
+ hasOtherSessions(session) {
7954
+ return this.sessions.some((x) => x.userId === session.userId && !x.isCurrent);
7955
+ }
7956
+ async terminateSession(session) {
7957
+ await this.translationsReady;
7958
+ this.confirmationService.confirm({
7959
+ header: this.t('auth-sessions.confirm.header'),
7960
+ message: this.l10nService.instant('auth-sessions.confirm.terminateMessage', {
7961
+ user: session.userName ?? session.userId ?? ''
7962
+ }),
7963
+ icon: 'pi pi-sign-out',
7964
+ rejectButtonProps: {
7965
+ label: this.t('auth-sessions.confirm.cancel'),
7966
+ severity: 'secondary',
7967
+ outlined: true
7968
+ },
7969
+ acceptButtonProps: {
7970
+ label: this.t('auth-sessions.confirm.terminate'),
7971
+ severity: 'danger'
7972
+ },
7973
+ accept: async () => {
7974
+ try {
7975
+ await this.authSessionsApi.deleteAuthSession({ sessionId: session.sessionId });
7976
+ await this.refreshAction();
7977
+ this.msgService.success(this.t('auth-sessions.messages.terminateSuccess'));
7978
+ }
7979
+ catch (error) {
7980
+ this.msgService.errorFromException(error, this.t('auth-sessions.messages.terminateError'), this.t('auth-sessions.messages.terminateError'));
7981
+ }
7982
+ }
7983
+ });
7984
+ }
7985
+ async terminateUserSessions(session) {
7986
+ await this.translationsReady;
7987
+ this.confirmationService.confirm({
7988
+ header: this.t('auth-sessions.confirm.header'),
7989
+ message: this.l10nService.instant('auth-sessions.confirm.terminateAllMessage', {
7990
+ user: session.userName ?? session.userId ?? ''
7991
+ }),
7992
+ icon: 'pi pi-user-minus',
7993
+ rejectButtonProps: {
7994
+ label: this.t('auth-sessions.confirm.cancel'),
7995
+ severity: 'secondary',
7996
+ outlined: true
7997
+ },
7998
+ acceptButtonProps: {
7999
+ label: this.t('auth-sessions.confirm.terminate'),
8000
+ severity: 'danger'
8001
+ },
8002
+ accept: async () => {
8003
+ try {
8004
+ const result = await this.authSessionsApi.deleteAuthSessionsByUser({ userId: session.userId });
8005
+ await this.refreshAction();
8006
+ this.msgService.success(this.l10nService.instant('auth-sessions.messages.terminateAllSuccess', {
8007
+ count: result.deletedCount ?? 0
8008
+ }));
8009
+ }
8010
+ catch (error) {
8011
+ this.msgService.errorFromException(error, this.t('auth-sessions.messages.terminateError'), this.t('auth-sessions.messages.terminateError'));
8012
+ }
8013
+ }
8014
+ });
8015
+ }
8016
+ t(key) {
8017
+ return this.l10nService.instant(key);
8018
+ }
8019
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AuthSessionsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8020
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: AuthSessionsComponent, isStandalone: true, selector: "app-auth-sessions", providers: [ConfirmationService, AuthSessionsApi], ngImport: i0, template: `
8021
+ <p-confirmDialog></p-confirmDialog>
8022
+ <div class="flex flex-col md:flex-row gap-4">
8023
+ <div class="card w-full">
8024
+ <div class="mb-4">
8025
+ <p-toolbar>
8026
+ <div class="flex flex-col md:flex-row md:items-center gap-2 w-full">
8027
+ <div class="font-semibold text-lg flex items-center gap-2 mx-2">
8028
+ <i class="pi pi-users"></i>
8029
+ {{ 'auth-sessions.title' | translate }}
8030
+ </div>
8031
+
8032
+ <div class="flex-1"></div>
8033
+ <div class="flex items-center gap-1 w-full md:w-auto">
8034
+ <p-button
8035
+ icon="pi pi-refresh"
8036
+ rounded="true"
8037
+ severity="secondary"
8038
+ text="true"
8039
+ tooltipPosition="bottom"
8040
+ [loading]="loading"
8041
+ [pTooltip]="'auth-sessions.refreshTooltip' | translate"
8042
+ (onClick)="refreshAction()"></p-button>
8043
+ <p-button
8044
+ icon="pi pi-power-off"
8045
+ rounded="true"
8046
+ severity="danger"
8047
+ text="true"
8048
+ tooltipPosition="bottom"
8049
+ id="oip-auth-sessions-terminate-all"
8050
+ [disabled]="loading || !hasOtherSessionsThanCurrent"
8051
+ [pTooltip]="'auth-sessions.terminateAllTooltip' | translate"
8052
+ (onClick)="terminateAllSessions()"></p-button>
8053
+ <input
8054
+ class="w-full md:w-96"
8055
+ pInputText
8056
+ type="text"
8057
+ id="oip-auth-sessions-filter"
8058
+ [placeholder]="'auth-sessions.filterPlaceholder' | translate"
8059
+ [(ngModel)]="userFilter"/>
8060
+ <p-button
8061
+ icon="pi pi-filter-slash"
8062
+ rounded="true"
8063
+ severity="secondary"
8064
+ text="true"
8065
+ tooltipPosition="bottom"
8066
+ id="oip-auth-sessions-clear-filter"
8067
+ [disabled]="!userFilter"
8068
+ [pTooltip]="'auth-sessions.clearFilterTooltip' | translate"
8069
+ (onClick)="userFilter = ''"></p-button>
8070
+ </div>
8071
+ </div>
8072
+ </p-toolbar>
8073
+ </div>
8074
+ <p-table
8075
+ class="mt-4"
8076
+ dataKey="sessionId"
8077
+ [paginator]="true"
8078
+ [rows]="50"
8079
+ sortField="lastActivityUtc"
8080
+ [sortOrder]="-1"
8081
+ [value]="filteredSessions"
8082
+ [loading]="loading">
8083
+ <ng-template pTemplate="header">
8084
+ <tr>
8085
+ <th pSortableColumn="userName">
8086
+ {{ 'auth-sessions.table.user' | translate }}
8087
+ <p-sortIcon field="userName"></p-sortIcon>
8088
+ </th>
8089
+ <th pSortableColumn="createdUtc">
8090
+ {{ 'auth-sessions.table.created' | translate }}
8091
+ <p-sortIcon field="createdUtc"></p-sortIcon>
8092
+ </th>
8093
+ <th pSortableColumn="expiresUtc">
8094
+ {{ 'auth-sessions.table.expires' | translate }}
8095
+ <p-sortIcon field="expiresUtc"></p-sortIcon>
8096
+ </th>
8097
+ <th pSortableColumn="lastActivityUtc">
8098
+ {{ 'auth-sessions.table.lastActivity' | translate }}
8099
+ <p-sortIcon field="lastActivityUtc"></p-sortIcon>
8100
+ </th>
8101
+ <th pSortableColumn="ipAddress">
8102
+ {{ 'auth-sessions.table.ipAddress' | translate }}
8103
+ <p-sortIcon field="ipAddress"></p-sortIcon>
8104
+ </th>
8105
+ <th pSortableColumn="userAgent">
8106
+ {{ 'auth-sessions.table.userAgent' | translate }}
8107
+ <p-sortIcon field="userAgent"></p-sortIcon>
8108
+ </th>
8109
+ <th style="width: 7rem"></th>
8110
+ </tr>
8111
+ </ng-template>
8112
+ <ng-template let-session pTemplate="body">
8113
+ <tr>
8114
+ <td>
8115
+ <div class="flex items-center gap-2">
8116
+ <div class="flex flex-col">
8117
+ <span class="font-medium">{{ session.userName }}</span>
8118
+ @if (session.displayName || session.email) {
8119
+ <span class="text-sm text-muted-color">{{ session.displayName || session.email }}</span>
8120
+ }
8121
+ </div>
8122
+ @if (session.isCurrent) {
8123
+ <p-tag severity="info" [value]="'auth-sessions.table.current' | translate"></p-tag>
8124
+ }
8125
+ </div>
8126
+ </td>
8127
+ <td>{{ session.createdUtc | date: layoutService.dateTimeFormat() }}</td>
8128
+ <td>{{ session.expiresUtc | date: layoutService.dateTimeFormat() }}</td>
8129
+ <td>{{ session.lastActivityUtc | date: layoutService.dateTimeFormat() }}</td>
8130
+ <td>{{ session.ipAddress }}</td>
8131
+ <td class="max-w-80 truncate" [pTooltip]="session.userAgent" tooltipPosition="top">
8132
+ {{ session.userAgent }}
8133
+ </td>
8134
+ <td>
8135
+ <div class="flex gap-1">
8136
+ <p-button
8137
+ icon="pi pi-sign-out"
8138
+ rounded="true"
8139
+ severity="danger"
8140
+ text="true"
8141
+ tooltipPosition="bottom"
8142
+ [disabled]="session.isCurrent"
8143
+ [pTooltip]="'auth-sessions.table.terminateTooltip' | translate"
8144
+ (onClick)="terminateSession(session)"></p-button>
8145
+ <p-button
8146
+ icon="pi pi-user-minus"
8147
+ rounded="true"
8148
+ severity="danger"
8149
+ text="true"
8150
+ tooltipPosition="bottom"
8151
+ [disabled]="!session.userId || !hasOtherSessions(session)"
8152
+ [pTooltip]="'auth-sessions.table.terminateAllTooltip' | translate"
8153
+ (onClick)="terminateUserSessions(session)"></p-button>
8154
+ </div>
8155
+ </td>
8156
+ </tr>
8157
+ </ng-template>
8158
+ <ng-template pTemplate="emptymessage">
8159
+ <tr>
8160
+ <td colspan="7">{{ 'auth-sessions.table.empty' | translate }}</td>
8161
+ </tr>
8162
+ </ng-template>
8163
+ </p-table>
8164
+ </div>
8165
+ </div>
8166
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i2$4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2$4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i2$4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "component", type: i5$1.Toolbar, selector: "p-toolbar", inputs: ["styleClass", "ariaLabelledBy"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4$1.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: DatePipe, name: "date" }] }); }
8167
+ }
8168
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AuthSessionsComponent, decorators: [{
8169
+ type: Component,
8170
+ args: [{
8171
+ imports: [
8172
+ FormsModule,
8173
+ TableModule,
8174
+ Tag,
8175
+ ButtonModule,
8176
+ ToolbarModule,
8177
+ Tooltip,
8178
+ ConfirmDialog,
8179
+ TranslatePipe,
8180
+ InputTextModule,
8181
+ DatePipe
8182
+ ],
8183
+ providers: [ConfirmationService, AuthSessionsApi],
8184
+ selector: 'app-auth-sessions',
8185
+ template: `
8186
+ <p-confirmDialog></p-confirmDialog>
8187
+ <div class="flex flex-col md:flex-row gap-4">
8188
+ <div class="card w-full">
8189
+ <div class="mb-4">
8190
+ <p-toolbar>
8191
+ <div class="flex flex-col md:flex-row md:items-center gap-2 w-full">
8192
+ <div class="font-semibold text-lg flex items-center gap-2 mx-2">
8193
+ <i class="pi pi-users"></i>
8194
+ {{ 'auth-sessions.title' | translate }}
8195
+ </div>
8196
+
8197
+ <div class="flex-1"></div>
8198
+ <div class="flex items-center gap-1 w-full md:w-auto">
8199
+ <p-button
8200
+ icon="pi pi-refresh"
8201
+ rounded="true"
8202
+ severity="secondary"
8203
+ text="true"
8204
+ tooltipPosition="bottom"
8205
+ [loading]="loading"
8206
+ [pTooltip]="'auth-sessions.refreshTooltip' | translate"
8207
+ (onClick)="refreshAction()"></p-button>
8208
+ <p-button
8209
+ icon="pi pi-power-off"
8210
+ rounded="true"
8211
+ severity="danger"
8212
+ text="true"
8213
+ tooltipPosition="bottom"
8214
+ id="oip-auth-sessions-terminate-all"
8215
+ [disabled]="loading || !hasOtherSessionsThanCurrent"
8216
+ [pTooltip]="'auth-sessions.terminateAllTooltip' | translate"
8217
+ (onClick)="terminateAllSessions()"></p-button>
8218
+ <input
8219
+ class="w-full md:w-96"
8220
+ pInputText
8221
+ type="text"
8222
+ id="oip-auth-sessions-filter"
8223
+ [placeholder]="'auth-sessions.filterPlaceholder' | translate"
8224
+ [(ngModel)]="userFilter"/>
8225
+ <p-button
8226
+ icon="pi pi-filter-slash"
8227
+ rounded="true"
8228
+ severity="secondary"
8229
+ text="true"
8230
+ tooltipPosition="bottom"
8231
+ id="oip-auth-sessions-clear-filter"
8232
+ [disabled]="!userFilter"
8233
+ [pTooltip]="'auth-sessions.clearFilterTooltip' | translate"
8234
+ (onClick)="userFilter = ''"></p-button>
8235
+ </div>
8236
+ </div>
8237
+ </p-toolbar>
8238
+ </div>
8239
+ <p-table
8240
+ class="mt-4"
8241
+ dataKey="sessionId"
8242
+ [paginator]="true"
8243
+ [rows]="50"
8244
+ sortField="lastActivityUtc"
8245
+ [sortOrder]="-1"
8246
+ [value]="filteredSessions"
8247
+ [loading]="loading">
8248
+ <ng-template pTemplate="header">
8249
+ <tr>
8250
+ <th pSortableColumn="userName">
8251
+ {{ 'auth-sessions.table.user' | translate }}
8252
+ <p-sortIcon field="userName"></p-sortIcon>
8253
+ </th>
8254
+ <th pSortableColumn="createdUtc">
8255
+ {{ 'auth-sessions.table.created' | translate }}
8256
+ <p-sortIcon field="createdUtc"></p-sortIcon>
8257
+ </th>
8258
+ <th pSortableColumn="expiresUtc">
8259
+ {{ 'auth-sessions.table.expires' | translate }}
8260
+ <p-sortIcon field="expiresUtc"></p-sortIcon>
8261
+ </th>
8262
+ <th pSortableColumn="lastActivityUtc">
8263
+ {{ 'auth-sessions.table.lastActivity' | translate }}
8264
+ <p-sortIcon field="lastActivityUtc"></p-sortIcon>
8265
+ </th>
8266
+ <th pSortableColumn="ipAddress">
8267
+ {{ 'auth-sessions.table.ipAddress' | translate }}
8268
+ <p-sortIcon field="ipAddress"></p-sortIcon>
8269
+ </th>
8270
+ <th pSortableColumn="userAgent">
8271
+ {{ 'auth-sessions.table.userAgent' | translate }}
8272
+ <p-sortIcon field="userAgent"></p-sortIcon>
8273
+ </th>
8274
+ <th style="width: 7rem"></th>
8275
+ </tr>
8276
+ </ng-template>
8277
+ <ng-template let-session pTemplate="body">
8278
+ <tr>
8279
+ <td>
8280
+ <div class="flex items-center gap-2">
8281
+ <div class="flex flex-col">
8282
+ <span class="font-medium">{{ session.userName }}</span>
8283
+ @if (session.displayName || session.email) {
8284
+ <span class="text-sm text-muted-color">{{ session.displayName || session.email }}</span>
8285
+ }
8286
+ </div>
8287
+ @if (session.isCurrent) {
8288
+ <p-tag severity="info" [value]="'auth-sessions.table.current' | translate"></p-tag>
8289
+ }
8290
+ </div>
8291
+ </td>
8292
+ <td>{{ session.createdUtc | date: layoutService.dateTimeFormat() }}</td>
8293
+ <td>{{ session.expiresUtc | date: layoutService.dateTimeFormat() }}</td>
8294
+ <td>{{ session.lastActivityUtc | date: layoutService.dateTimeFormat() }}</td>
8295
+ <td>{{ session.ipAddress }}</td>
8296
+ <td class="max-w-80 truncate" [pTooltip]="session.userAgent" tooltipPosition="top">
8297
+ {{ session.userAgent }}
8298
+ </td>
8299
+ <td>
8300
+ <div class="flex gap-1">
8301
+ <p-button
8302
+ icon="pi pi-sign-out"
8303
+ rounded="true"
8304
+ severity="danger"
8305
+ text="true"
8306
+ tooltipPosition="bottom"
8307
+ [disabled]="session.isCurrent"
8308
+ [pTooltip]="'auth-sessions.table.terminateTooltip' | translate"
8309
+ (onClick)="terminateSession(session)"></p-button>
8310
+ <p-button
8311
+ icon="pi pi-user-minus"
8312
+ rounded="true"
8313
+ severity="danger"
8314
+ text="true"
8315
+ tooltipPosition="bottom"
8316
+ [disabled]="!session.userId || !hasOtherSessions(session)"
8317
+ [pTooltip]="'auth-sessions.table.terminateAllTooltip' | translate"
8318
+ (onClick)="terminateUserSessions(session)"></p-button>
8319
+ </div>
8320
+ </td>
8321
+ </tr>
8322
+ </ng-template>
8323
+ <ng-template pTemplate="emptymessage">
8324
+ <tr>
8325
+ <td colspan="7">{{ 'auth-sessions.table.empty' | translate }}</td>
8326
+ </tr>
8327
+ </ng-template>
8328
+ </p-table>
8329
+ </div>
8330
+ </div>
8331
+ `
8332
+ }]
8333
+ }], ctorParameters: () => [] });
8334
+
8335
+ var authSessions_component = /*#__PURE__*/Object.freeze({
8336
+ __proto__: null,
8337
+ AuthSessionsComponent: AuthSessionsComponent
8338
+ });
8339
+
7509
8340
  var ServiceType;
7510
8341
  (function (ServiceType) {
7511
8342
  ServiceType["Service"] = "Service";
@@ -7514,10 +8345,8 @@ var ServiceType;
7514
8345
 
7515
8346
  var applications$1 = {
7516
8347
  title: "Applications",
7517
- subtitle: "Manage the frontend application registry",
7518
- searchPlaceholder: "Search applications",
7519
- search: "Search",
7520
- clear: "Clear",
8348
+ searchPlaceholder: "Filter applications",
8349
+ clear: "Clear filter",
7521
8350
  add: "Add",
7522
8351
  refreshTooltip: "Refresh",
7523
8352
  empty: "No applications found",
@@ -7562,10 +8391,8 @@ var en$3 = {
7562
8391
 
7563
8392
  var applications = {
7564
8393
  title: "Приложения",
7565
- subtitle: "Управление реестром фронтенд-приложений",
7566
- searchPlaceholder: "Поиск по приложениям",
7567
- search: "Найти",
7568
- clear: "Очистить",
8394
+ searchPlaceholder: "Фильтр по приложениям",
8395
+ clear: "Сбросить фильтр",
7569
8396
  add: "Добавить",
7570
8397
  refreshTooltip: "Обновить",
7571
8398
  empty: "Приложения не найдены",
@@ -7833,65 +8660,71 @@ class ApplicationsComponent {
7833
8660
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ApplicationsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7834
8661
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: ApplicationsComponent, isStandalone: true, selector: "app-applications", providers: [ApplicationsApi, ConfirmationService], ngImport: i0, template: `
7835
8662
  <p-confirmDialog></p-confirmDialog>
7836
- <div class="flex flex-col gap-4">
8663
+ <div class="flex flex-col md:flex-row gap-4">
7837
8664
  <div class="card w-full">
7838
- <div class="flex flex-col gap-3 md:flex-row md:items-center md:justify-between">
7839
- <div>
7840
- <div class="font-semibold text-xl mb-1">
7841
- {{ 'applications.title' | translate }}
7842
- </div>
7843
- <p class="m-0 text-surface-500">{{ 'applications.subtitle' | translate }}</p>
7844
- </div>
7845
- <div class="flex flex-col gap-2 sm:flex-row">
7846
- <input
7847
- class="w-full sm:w-72"
7848
- pInputText
7849
- type="text"
7850
- [placeholder]="'applications.searchPlaceholder' | translate"
7851
- [(ngModel)]="globalFilter"
7852
- (keydown.enter)="applyGlobalFilter()" />
7853
- <p-button
7854
- icon="pi pi-search"
7855
- [label]="'applications.search' | translate"
7856
- (onClick)="applyGlobalFilter()"></p-button>
7857
- <p-button
7858
- icon="pi pi-filter-slash"
7859
- severity="secondary"
7860
- [label]="'applications.clear' | translate"
7861
- (onClick)="clearFilters()"></p-button>
7862
- </div>
7863
- </div>
7864
-
7865
- <div class="my-4">
8665
+ <div class="mb-4">
7866
8666
  <p-toolbar>
7867
- <p-button
7868
- icon="pi pi-plus"
7869
- severity="success"
7870
- [disabled]="loading || activeRowAction"
7871
- [label]="'applications.add' | translate"
7872
- (onClick)="beginCreateApplication()"></p-button>
7873
- <p-button
7874
- icon="pi pi-refresh"
7875
- rounded="true"
7876
- severity="secondary"
7877
- text="true"
7878
- tooltipPosition="bottom"
7879
- [disabled]="loading || activeRowAction"
7880
- [pTooltip]="'applications.refreshTooltip' | translate"
7881
- (onClick)="refreshAction()"></p-button>
8667
+ <div class="flex flex-col md:flex-row md:items-center gap-2 w-full">
8668
+ <div class="font-semibold text-lg flex items-center gap-2 mx-2">
8669
+ <i class="pi pi-th-large"></i>
8670
+ {{ 'applications.title' | translate }}
8671
+ </div>
8672
+
8673
+ <div class="flex-1"></div>
8674
+ <div class="flex items-center gap-1 w-full md:w-auto">
8675
+ <p-button
8676
+ icon="pi pi-refresh"
8677
+ rounded="true"
8678
+ severity="secondary"
8679
+ text="true"
8680
+ tooltipPosition="bottom"
8681
+ id="oip-applications-refresh"
8682
+ [loading]="loading"
8683
+ [disabled]="activeRowAction"
8684
+ [pTooltip]="'applications.refreshTooltip' | translate"
8685
+ (onClick)="refreshAction()"></p-button>
8686
+ <p-button
8687
+ icon="pi pi-plus"
8688
+ rounded="true"
8689
+ severity="success"
8690
+ text="true"
8691
+ tooltipPosition="bottom"
8692
+ id="oip-applications-add"
8693
+ [disabled]="loading || activeRowAction"
8694
+ [pTooltip]="'applications.add' | translate"
8695
+ (onClick)="beginCreateApplication()"></p-button>
8696
+ <input
8697
+ class="w-full md:w-96"
8698
+ pInputText
8699
+ type="text"
8700
+ id="oip-applications-filter"
8701
+ [placeholder]="'applications.searchPlaceholder' | translate"
8702
+ [(ngModel)]="globalFilter"
8703
+ (ngModelChange)="applyGlobalFilter()" />
8704
+ <p-button
8705
+ icon="pi pi-filter-slash"
8706
+ rounded="true"
8707
+ severity="secondary"
8708
+ text="true"
8709
+ tooltipPosition="bottom"
8710
+ id="oip-applications-clear-filter"
8711
+ [disabled]="!globalFilter"
8712
+ [pTooltip]="'applications.clear' | translate"
8713
+ (onClick)="clearFilters()"></p-button>
8714
+ </div>
8715
+ </div>
7882
8716
  </p-toolbar>
7883
8717
  </div>
7884
8718
 
7885
8719
  <p-table
7886
- #table
8720
+ class="mt-4"
7887
8721
  dataKey="code"
7888
- responsiveLayout="scroll"
7889
- [globalFilterFields]="globalFilterFields"
7890
- [loading]="loading"
8722
+ sortField="order"
8723
+ [sortOrder]="1"
7891
8724
  [paginator]="true"
7892
- [rows]="25"
7893
- [rowsPerPageOptions]="[10, 25, 50, 100]"
7894
- [value]="visibleApplications">
8725
+ [rows]="50"
8726
+ [value]="visibleApplications"
8727
+ [loading]="loading">
7895
8728
  <ng-template pTemplate="header">
7896
8729
  <tr>
7897
8730
  <th pSortableColumn="code">
@@ -8011,10 +8844,11 @@ class ApplicationsComponent {
8011
8844
  "></p-tag>
8012
8845
  </td>
8013
8846
  <td>
8014
- <div class="flex items-center justify-center gap-2">
8847
+ <div class="flex items-center justify-center gap-1">
8015
8848
  @if (application._isEditing) {
8016
8849
  <p-button
8017
8850
  icon="pi pi-check"
8851
+ rounded="true"
8018
8852
  severity="success"
8019
8853
  text="true"
8020
8854
  tooltipPosition="bottom"
@@ -8023,6 +8857,7 @@ class ApplicationsComponent {
8023
8857
  (onClick)="saveApplication(application)"></p-button>
8024
8858
  <p-button
8025
8859
  icon="pi pi-times"
8860
+ rounded="true"
8026
8861
  severity="secondary"
8027
8862
  text="true"
8028
8863
  tooltipPosition="bottom"
@@ -8032,6 +8867,7 @@ class ApplicationsComponent {
8032
8867
  } @else {
8033
8868
  <p-button
8034
8869
  icon="pi pi-pencil"
8870
+ rounded="true"
8035
8871
  text="true"
8036
8872
  tooltipPosition="bottom"
8037
8873
  [disabled]="activeRowAction"
@@ -8039,6 +8875,7 @@ class ApplicationsComponent {
8039
8875
  (onClick)="editApplication(application)"></p-button>
8040
8876
  <p-button
8041
8877
  icon="pi pi-trash"
8878
+ rounded="true"
8042
8879
  severity="danger"
8043
8880
  text="true"
8044
8881
  tooltipPosition="bottom"
@@ -8053,15 +8890,13 @@ class ApplicationsComponent {
8053
8890
 
8054
8891
  <ng-template pTemplate="emptymessage">
8055
8892
  <tr>
8056
- <td class="py-8 text-center text-surface-500" colspan="10">
8057
- {{ 'applications.empty' | translate }}
8058
- </td>
8893
+ <td colspan="10">{{ 'applications.empty' | translate }}</td>
8059
8894
  </tr>
8060
8895
  </ng-template>
8061
8896
  </p-table>
8062
8897
  </div>
8063
8898
  </div>
8064
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i1$9.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1$9.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i1$9.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "component", type: i5$1.Toolbar, selector: "p-toolbar", inputs: ["styleClass", "ariaLabelledBy"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i5.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: ToggleSwitchModule }, { kind: "component", type: i2$4.ToggleSwitch, selector: "p-toggleswitch, p-toggleSwitch, p-toggle-switch", inputs: ["styleClass", "tabindex", "inputId", "readonly", "trueValue", "falseValue", "ariaLabel", "size", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
8899
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i2$4.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i3$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i2$4.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i2$4.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "component", type: i5$1.Toolbar, selector: "p-toolbar", inputs: ["styleClass", "ariaLabelledBy"] }, { kind: "directive", type: Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "directive", type: InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i5.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: ToggleSwitchModule }, { kind: "component", type: i2$3.ToggleSwitch, selector: "p-toggleswitch, p-toggleSwitch, p-toggle-switch", inputs: ["styleClass", "tabindex", "inputId", "readonly", "trueValue", "falseValue", "ariaLabel", "size", "ariaLabelledBy", "autofocus"], outputs: ["onChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
8065
8900
  }
8066
8901
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ApplicationsComponent, decorators: [{
8067
8902
  type: Component,
@@ -8083,65 +8918,71 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8083
8918
  selector: 'app-applications',
8084
8919
  template: `
8085
8920
  <p-confirmDialog></p-confirmDialog>
8086
- <div class="flex flex-col gap-4">
8921
+ <div class="flex flex-col md:flex-row gap-4">
8087
8922
  <div class="card w-full">
8088
- <div class="flex flex-col gap-3 md:flex-row md:items-center md:justify-between">
8089
- <div>
8090
- <div class="font-semibold text-xl mb-1">
8091
- {{ 'applications.title' | translate }}
8092
- </div>
8093
- <p class="m-0 text-surface-500">{{ 'applications.subtitle' | translate }}</p>
8094
- </div>
8095
- <div class="flex flex-col gap-2 sm:flex-row">
8096
- <input
8097
- class="w-full sm:w-72"
8098
- pInputText
8099
- type="text"
8100
- [placeholder]="'applications.searchPlaceholder' | translate"
8101
- [(ngModel)]="globalFilter"
8102
- (keydown.enter)="applyGlobalFilter()" />
8103
- <p-button
8104
- icon="pi pi-search"
8105
- [label]="'applications.search' | translate"
8106
- (onClick)="applyGlobalFilter()"></p-button>
8107
- <p-button
8108
- icon="pi pi-filter-slash"
8109
- severity="secondary"
8110
- [label]="'applications.clear' | translate"
8111
- (onClick)="clearFilters()"></p-button>
8112
- </div>
8113
- </div>
8114
-
8115
- <div class="my-4">
8923
+ <div class="mb-4">
8116
8924
  <p-toolbar>
8117
- <p-button
8118
- icon="pi pi-plus"
8119
- severity="success"
8120
- [disabled]="loading || activeRowAction"
8121
- [label]="'applications.add' | translate"
8122
- (onClick)="beginCreateApplication()"></p-button>
8123
- <p-button
8124
- icon="pi pi-refresh"
8125
- rounded="true"
8126
- severity="secondary"
8127
- text="true"
8128
- tooltipPosition="bottom"
8129
- [disabled]="loading || activeRowAction"
8130
- [pTooltip]="'applications.refreshTooltip' | translate"
8131
- (onClick)="refreshAction()"></p-button>
8925
+ <div class="flex flex-col md:flex-row md:items-center gap-2 w-full">
8926
+ <div class="font-semibold text-lg flex items-center gap-2 mx-2">
8927
+ <i class="pi pi-th-large"></i>
8928
+ {{ 'applications.title' | translate }}
8929
+ </div>
8930
+
8931
+ <div class="flex-1"></div>
8932
+ <div class="flex items-center gap-1 w-full md:w-auto">
8933
+ <p-button
8934
+ icon="pi pi-refresh"
8935
+ rounded="true"
8936
+ severity="secondary"
8937
+ text="true"
8938
+ tooltipPosition="bottom"
8939
+ id="oip-applications-refresh"
8940
+ [loading]="loading"
8941
+ [disabled]="activeRowAction"
8942
+ [pTooltip]="'applications.refreshTooltip' | translate"
8943
+ (onClick)="refreshAction()"></p-button>
8944
+ <p-button
8945
+ icon="pi pi-plus"
8946
+ rounded="true"
8947
+ severity="success"
8948
+ text="true"
8949
+ tooltipPosition="bottom"
8950
+ id="oip-applications-add"
8951
+ [disabled]="loading || activeRowAction"
8952
+ [pTooltip]="'applications.add' | translate"
8953
+ (onClick)="beginCreateApplication()"></p-button>
8954
+ <input
8955
+ class="w-full md:w-96"
8956
+ pInputText
8957
+ type="text"
8958
+ id="oip-applications-filter"
8959
+ [placeholder]="'applications.searchPlaceholder' | translate"
8960
+ [(ngModel)]="globalFilter"
8961
+ (ngModelChange)="applyGlobalFilter()" />
8962
+ <p-button
8963
+ icon="pi pi-filter-slash"
8964
+ rounded="true"
8965
+ severity="secondary"
8966
+ text="true"
8967
+ tooltipPosition="bottom"
8968
+ id="oip-applications-clear-filter"
8969
+ [disabled]="!globalFilter"
8970
+ [pTooltip]="'applications.clear' | translate"
8971
+ (onClick)="clearFilters()"></p-button>
8972
+ </div>
8973
+ </div>
8132
8974
  </p-toolbar>
8133
8975
  </div>
8134
8976
 
8135
8977
  <p-table
8136
- #table
8978
+ class="mt-4"
8137
8979
  dataKey="code"
8138
- responsiveLayout="scroll"
8139
- [globalFilterFields]="globalFilterFields"
8140
- [loading]="loading"
8980
+ sortField="order"
8981
+ [sortOrder]="1"
8141
8982
  [paginator]="true"
8142
- [rows]="25"
8143
- [rowsPerPageOptions]="[10, 25, 50, 100]"
8144
- [value]="visibleApplications">
8983
+ [rows]="50"
8984
+ [value]="visibleApplications"
8985
+ [loading]="loading">
8145
8986
  <ng-template pTemplate="header">
8146
8987
  <tr>
8147
8988
  <th pSortableColumn="code">
@@ -8261,10 +9102,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8261
9102
  "></p-tag>
8262
9103
  </td>
8263
9104
  <td>
8264
- <div class="flex items-center justify-center gap-2">
9105
+ <div class="flex items-center justify-center gap-1">
8265
9106
  @if (application._isEditing) {
8266
9107
  <p-button
8267
9108
  icon="pi pi-check"
9109
+ rounded="true"
8268
9110
  severity="success"
8269
9111
  text="true"
8270
9112
  tooltipPosition="bottom"
@@ -8273,6 +9115,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8273
9115
  (onClick)="saveApplication(application)"></p-button>
8274
9116
  <p-button
8275
9117
  icon="pi pi-times"
9118
+ rounded="true"
8276
9119
  severity="secondary"
8277
9120
  text="true"
8278
9121
  tooltipPosition="bottom"
@@ -8282,6 +9125,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8282
9125
  } @else {
8283
9126
  <p-button
8284
9127
  icon="pi pi-pencil"
9128
+ rounded="true"
8285
9129
  text="true"
8286
9130
  tooltipPosition="bottom"
8287
9131
  [disabled]="activeRowAction"
@@ -8289,6 +9133,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8289
9133
  (onClick)="editApplication(application)"></p-button>
8290
9134
  <p-button
8291
9135
  icon="pi pi-trash"
9136
+ rounded="true"
8292
9137
  severity="danger"
8293
9138
  text="true"
8294
9139
  tooltipPosition="bottom"
@@ -8303,9 +9148,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8303
9148
 
8304
9149
  <ng-template pTemplate="emptymessage">
8305
9150
  <tr>
8306
- <td class="py-8 text-center text-surface-500" colspan="10">
8307
- {{ 'applications.empty' | translate }}
8308
- </td>
9151
+ <td colspan="10">{{ 'applications.empty' | translate }}</td>
8309
9152
  </tr>
8310
9153
  </ng-template>
8311
9154
  </p-table>
@@ -9244,7 +10087,7 @@ class DiscussionComponent {
9244
10087
  </div>
9245
10088
  }
9246
10089
  </section>
9247
- `, isInline: true, styles: [":host{display:block}.file-trigger{position:relative;display:inline-flex}.file-trigger input{position:absolute;inset:0;opacity:0;cursor:pointer}.markdown-preview,.history-markdown{word-break:break-word}.markdown-preview :is(h1,h2,h3),.history-markdown :is(h1,h2,h3){margin:0 0 .75rem;font-weight:600}.markdown-preview a,.history-markdown a{color:#2563eb;text-decoration:underline;text-underline-offset:.18em}.emoji-popover{display:flex;flex-wrap:wrap;gap:.5rem;max-width:16rem}.emoji-option{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;font-size:1.25rem;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2$2.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: CardModule }, { kind: "component", type: i5$2.Card, selector: "p-card", inputs: ["header", "subheader", "style", "styleClass"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "ngmodule", type: DividerModule }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: i6.Panel, selector: "p-panel", inputs: ["id", "toggleable", "header", "collapsed", "styleClass", "iconPos", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i7.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ProgressSpinnerModule }, { kind: "component", type: i4.ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i9.Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "pipe", type: i1$3.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
10090
+ `, isInline: true, styles: [":host{display:block}.file-trigger{position:relative;display:inline-flex}.file-trigger input{position:absolute;inset:0;opacity:0;cursor:pointer}.markdown-preview,.history-markdown{word-break:break-word}.markdown-preview :is(h1,h2,h3),.history-markdown :is(h1,h2,h3){margin:0 0 .75rem;font-weight:600}.markdown-preview a,.history-markdown a{color:#2563eb;text-decoration:underline;text-underline-offset:.18em}.emoji-popover{display:flex;flex-wrap:wrap;gap:.5rem;max-width:16rem}.emoji-option{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;font-size:1.25rem;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.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: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2$1.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "directive", type: i3$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: CardModule }, { kind: "component", type: i5$2.Card, selector: "p-card", inputs: ["header", "subheader", "style", "styleClass"] }, { kind: "component", type: ConfirmDialog, selector: "p-confirmDialog, p-confirmdialog, p-confirm-dialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "modal", "visible", "position", "draggable"], outputs: ["onHide"] }, { kind: "ngmodule", type: DividerModule }, { kind: "ngmodule", type: PanelModule }, { kind: "component", type: i6.Panel, selector: "p-panel", inputs: ["id", "toggleable", "header", "collapsed", "styleClass", "iconPos", "showHeader", "toggler", "transitionOptions", "toggleButtonProps"], outputs: ["collapsedChange", "onBeforeToggle", "onAfterToggle"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i7.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ProgressSpinnerModule }, { kind: "component", type: i4.ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i3$6.Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "directive", type: Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "pipe", type: i1$3.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9248
10091
  }
9249
10092
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DiscussionComponent, decorators: [{
9250
10093
  type: Component,
@@ -10831,6 +11674,15 @@ function oipModulesRoute(path = 'modules') {
10831
11674
  data: { requireAdmin: true }
10832
11675
  };
10833
11676
  }
11677
+ /** Active authentication sessions, administrators only. */
11678
+ function oipSessionsRoute(path = 'sessions') {
11679
+ return {
11680
+ path,
11681
+ loadComponent: () => Promise.resolve().then(function () { return authSessions_component; }).then((m) => m.AuthSessionsComponent),
11682
+ canActivate: [oipAuthGuard],
11683
+ data: { requireAdmin: true }
11684
+ };
11685
+ }
10834
11686
  /** Discussion module. The path must keep an `:id` segment. */
10835
11687
  function oipDiscussionRoute(path = 'discussion/:id') {
10836
11688
  return {
@@ -10898,6 +11750,7 @@ function provideOipRoutes(options = {}) {
10898
11750
  builtInRoute(features.config, oipConfigRoute, children);
10899
11751
  builtInRoute(features.applications, oipApplicationsRoute, children);
10900
11752
  builtInRoute(features.modules, oipModulesRoute, children);
11753
+ builtInRoute(features.sessions, oipSessionsRoute, children);
10901
11754
  builtInRoute(features.discussion, oipDiscussionRoute, children);
10902
11755
  builtInRoute(features.dbMigration, oipDbMigrationRoute, children);
10903
11756
  builtInRoute(features.iframeModule, oipIframeModuleRoute, children);
@@ -10937,5 +11790,5 @@ function provideOipRoutes(options = {}) {
10937
11790
  * Generated bundle index. Do not edit.
10938
11791
  */
10939
11792
 
10940
- export { APP_INFO_TOKEN, APP_THEME_PRESETS, APP_THEME_PRESETS_MERGE_MODE, AccessComponent, AppConfiguratorComponent, AppFloatingConfiguratorComponent, AppInfoService, AppLayoutComponent, AppModulesComponent, AppTopbar, AppTopbarApplicationSwitcherComponent, ApplicationRegistryService, ApplicationsApi, ApplicationsComponent, AuthGuardService, BaseModuleComponent, BffSecurityService, BlockLoaderComponent, ConfigComponent, ContentType, CustomElementExtensionModuleHostComponent, DbMigrationComponent, DefaultSecretsBannerComponent, DiscussionComponent, ErrorComponent, ExtensionLoaderService, ExtensionModuleHostComponent, FolderModuleApi, FooterComponent, HttpClient, IframeModuleApi, IframeModuleComponent, L10nService, LOGO_COMPONENT_TOKEN, LayoutService, LogoComponent, LogoService, MenuComponent, MenuService, ModuleInstanceRightsService, ModuleLoadingService, MsgService, NoModulesComponent, NotfoundComponent, NotificationApi, NotificationService, OIP_EXTENSION_EVENTS, SecurityApi, SecurityComponent, SecurityService, SidebarComponent, StartPageService, TableFilterService, TopBarService, UnauthorizedComponent, UserNotificationsComponent, UserProfileApi, UserProfileComponent, UserService, convertToPrimeNgDateFormat, defaultTheme, emitOipContextChange, emitOipError, emitOipNavigate, emitOipNotify, emitOipSettingsChange, emitOipTitleChange, langIntercept, mergeWithDefaults, moduleAccessGuard, oipAccessRoute, oipApplicationsRoute, oipAuthGuard, oipConfigRoute, oipDbMigrationRoute, oipDiscussionRoute, oipErrorRoute, oipExtensionsRoute, oipIframeModuleRoute, oipModulesRoute, oipNoModulesRoute, oipProfileRoute, oipStartRedirectGuard, oipStartRoute, provideAppInfo, provideAppThemes, provideLogoComponent, provideOip, provideOipRoutes, provideTranslations, replaceDefaults };
11793
+ export { APP_INFO_TOKEN, APP_THEME_PRESETS, APP_THEME_PRESETS_MERGE_MODE, AccessComponent, AppConfiguratorComponent, AppFloatingConfiguratorComponent, AppInfoService, AppLayoutComponent, AppModulesComponent, AppTopbar, AppTopbarApplicationSwitcherComponent, ApplicationRegistryService, ApplicationsApi, ApplicationsComponent, AuthGuardService, AuthSessionsApi, AuthSessionsComponent, BaseModuleComponent, BffSecurityService, BlockLoaderComponent, ConfigComponent, ContentType, CustomElementExtensionModuleHostComponent, DbMigrationComponent, DefaultSecretsBannerComponent, DiscussionComponent, ErrorComponent, ExtensionLoaderService, ExtensionModuleHostComponent, FolderModuleApi, FooterComponent, HttpClient, IframeModuleApi, IframeModuleComponent, L10nService, LOGO_COMPONENT_TOKEN, LayoutService, LogoComponent, LogoService, MenuComponent, MenuService, ModuleInstanceRightsService, ModuleLoadingService, MsgService, NoModulesComponent, NotfoundComponent, NotificationApi, NotificationService, OIP_EXTENSION_EVENTS, SecurityApi, SecurityComponent, SecurityService, SidebarComponent, StartPageService, TableFilterService, TopBarService, UnauthorizedComponent, UserNotificationsComponent, UserProfileApi, UserProfileComponent, UserService, convertToPrimeNgDateFormat, defaultTheme, emitOipContextChange, emitOipError, emitOipNavigate, emitOipNotify, emitOipSettingsChange, emitOipTitleChange, langIntercept, mergeWithDefaults, moduleAccessGuard, oipAccessRoute, oipApplicationsRoute, oipAuthGuard, oipConfigRoute, oipDbMigrationRoute, oipDiscussionRoute, oipErrorRoute, oipExtensionsRoute, oipIframeModuleRoute, oipModulesRoute, oipNoModulesRoute, oipProfileRoute, oipSessionsRoute, oipStartRedirectGuard, oipStartRoute, provideAppInfo, provideAppThemes, provideLogoComponent, provideOip, provideOipRoutes, provideTranslations, replaceDefaults };
10941
11794
  //# sourceMappingURL=oip-common.mjs.map