oip-common 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,13 +2,13 @@ import * as i0 from '@angular/core';
2
2
  import { Injectable, inject, signal, computed, effect, DestroyRef, ChangeDetectorRef, Component, Input, InjectionToken, PLATFORM_ID, ViewChild, HostBinding, EventEmitter, Output, 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$2 from 'primeng/api';
5
+ import * as i2$3 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
- import * as i2$3 from '@ngx-translate/core';
8
+ import * as i2$4 from '@ngx-translate/core';
9
9
  import { TranslateService, TranslatePipe, TranslateModule, TranslateLoader } from '@ngx-translate/core';
10
10
  import * as i1$5 from '@angular/router';
11
- import { ActivatedRoute, Router, RouterModule, NavigationEnd, RouterLinkActive, RouterLink } from '@angular/router';
11
+ import { Router, ActivatedRoute, RouterModule, NavigationEnd, RouterLinkActive, RouterLink } from '@angular/router';
12
12
  import { tap as tap$1, catchError, filter, distinctUntilChanged, switchMap, map, take } from 'rxjs/operators';
13
13
  import { Title, DomSanitizer } from '@angular/platform-browser';
14
14
  import { PrimeNG } from 'primeng/config';
@@ -49,11 +49,11 @@ import * as i3$2 from 'primeng/menu';
49
49
  import { MenuModule } from 'primeng/menu';
50
50
  import * as i1$6 from 'primeng/contextmenu';
51
51
  import { ContextMenuModule, ContextMenu } from 'primeng/contextmenu';
52
- import * as i3$5 from 'primeng/dialog';
52
+ import * as i3$4 from 'primeng/dialog';
53
53
  import { DialogModule } from 'primeng/dialog';
54
54
  import * as i4$1 from 'primeng/inputtext';
55
55
  import { InputTextModule, InputText } from 'primeng/inputtext';
56
- import * as i3$4 from 'primeng/ripple';
56
+ import * as i2$2 from 'primeng/ripple';
57
57
  import { RippleModule } from 'primeng/ripple';
58
58
  import * as i5 from 'primeng/select';
59
59
  import { SelectModule, Select } from 'primeng/select';
@@ -62,7 +62,7 @@ import { FileUploadModule } from 'primeng/fileupload';
62
62
  import { ImageModule } from 'primeng/image';
63
63
  import * as i1$8 from 'primeng/table';
64
64
  import { TableModule } from 'primeng/table';
65
- import * as i2$4 from 'primeng/toggleswitch';
65
+ import * as i2$5 from 'primeng/toggleswitch';
66
66
  import { ToggleSwitchModule } from 'primeng/toggleswitch';
67
67
  import { TextareaModule, Textarea } from 'primeng/textarea';
68
68
  import * as i5$1 from 'primeng/toolbar';
@@ -538,10 +538,539 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
538
538
  args: [{ providedIn: 'root' }]
539
539
  }], ctorParameters: () => [] });
540
540
 
541
+ var msgService$1 = {
542
+ success: "Success",
543
+ info: "Info",
544
+ warn: "Warn",
545
+ error: "Error",
546
+ secondary: "Secondary"
547
+ };
548
+ var securityComponent$1 = {
549
+ security: "Security",
550
+ save: "Save",
551
+ savedSecurity: "Security settings saved",
552
+ selectRoles: "Select roles"
553
+ };
554
+ var profileComponent$1 = {
555
+ changePhoto: "Upload Photo",
556
+ successfullyUploaded: "Uploaded successfully",
557
+ failedToLoadPhoto: "Failed to load user photo"
558
+ };
559
+ var configComponent$1 = {
560
+ profile: "Profile",
561
+ photo: "Photo",
562
+ usePhoto256x256Pixel: "Use a 256x256 pixel photo",
563
+ localization: "Language",
564
+ selectLanguage: "Select language"
565
+ };
566
+ var baseComponent$1 = {
567
+ content: "Content",
568
+ settings: "Settings",
569
+ security: "Security",
570
+ success: "Saved successfully"
571
+ };
572
+ var menuComponent$1 = {
573
+ all: "All",
574
+ "new": "Add"
575
+ };
576
+ var menuItemEditDialogComponent$1 = {
577
+ header: "Edit menu item",
578
+ parentLabel: "Parent item",
579
+ label: "Label",
580
+ module: "Module",
581
+ selectModule: "Select module",
582
+ icon: "Icon",
583
+ cancel: "Cancel",
584
+ save: "Save",
585
+ security: "Read access"
586
+ };
587
+ var menuItemCreateDialogComponent$1 = {
588
+ header: "New menu item",
589
+ parentLabel: "Parent item",
590
+ label: "Label",
591
+ module: "Module",
592
+ selectModule: "Select module",
593
+ searchModule: "Search module",
594
+ icon: "Icon",
595
+ cancel: "Cancel",
596
+ save: "Save"
597
+ };
598
+ var unauthorized$1 = {
599
+ welcomeToOip: "Welcome to OIP!",
600
+ signInToContinue: "Sign in to continue",
601
+ signIn: "Sign In"
602
+ };
603
+ var menuItemComponent$1 = {
604
+ "new": "Add",
605
+ edit: "Edit",
606
+ "delete": "Delete",
607
+ deleteItemConfirmHeader: "Delete",
608
+ deleteItemConfirmMessage: "Are you sure you want to delete the item?",
609
+ deleteItemSuccessMessage: "Deleted successfully",
610
+ deleteItemConfirmRejectButtonPropsLabel: "Cancel",
611
+ deleteItemConfirmAcceptButtonPropsLabel: "Delete",
612
+ moveUp: "Move up",
613
+ moveDown: "Move down"
614
+ };
615
+ var topbar$1 = {
616
+ logout: "Logout",
617
+ logoutConfirmHeader: "Logout",
618
+ logoutConfirmMessage: "Are you sure you want to logout?",
619
+ logoutConfirmCancel: "Cancel",
620
+ logoutConfirmAccept: "Logout",
621
+ profile: "Profile",
622
+ applications: "Applications"
623
+ };
624
+ var userNotifications$1 = {
625
+ title: "Notifications",
626
+ empty: "No unread notifications",
627
+ refresh: "Refresh",
628
+ markAsRead: "Read",
629
+ markedAsRead: "Notification marked as read"
630
+ };
631
+ var discussionComponent$1 = {
632
+ writeCommentPlaceholder: "Write a comment. Use @email or @first.last for mentions.",
633
+ mentionSuggestions: "Mention suggestions",
634
+ edit: "Edit",
635
+ preview: "Preview",
636
+ attachFiles: "Attach files",
637
+ send: "Send",
638
+ loadingComments: "Loading comments...",
639
+ noCommentsYet: "No comments yet.",
640
+ edited: "Edited",
641
+ editCommentPlaceholder: "Edit comment",
642
+ addAttachment: "Add attachment",
643
+ save: "Save",
644
+ cancel: "Cancel",
645
+ editHistory: "Edit history",
646
+ loadingHistory: "Loading history...",
647
+ before: "Before",
648
+ after: "After",
649
+ warning: "Warning",
650
+ "delete": "Delete",
651
+ confirmDeleteComment: "Are you sure you want to delete this comment?",
652
+ confirmDeleteFile: "Are you sure you want to delete the file \"{{fileName}}\"?",
653
+ units: {
654
+ bytes: "B",
655
+ kilobytes: "KB",
656
+ megabytes: "MB"
657
+ },
658
+ errors: {
659
+ loadComments: "Failed to load comments.",
660
+ createComment: "Failed to create comment.",
661
+ updateComment: "Failed to update comment.",
662
+ loadEditHistory: "Failed to load edit history.",
663
+ uploadAttachment: "Failed to upload attachment.",
664
+ deleteComment: "Failed to delete comment.",
665
+ deleteAttachment: "Failed to delete attachment.",
666
+ downloadAttachment: "Failed to download attachment.",
667
+ updateReaction: "Failed to update reaction.",
668
+ addReaction: "Failed to add reaction."
669
+ }
670
+ };
671
+ var primeng$1 = "";
672
+ var en$6 = {
673
+ "app-configurator": {
674
+ primary: "Primary",
675
+ surface: "Surface",
676
+ presets: "Presets",
677
+ menuMode: "Menu Mode"
678
+ },
679
+ msgService: msgService$1,
680
+ securityComponent: securityComponent$1,
681
+ profileComponent: profileComponent$1,
682
+ configComponent: configComponent$1,
683
+ baseComponent: baseComponent$1,
684
+ menuComponent: menuComponent$1,
685
+ menuItemEditDialogComponent: menuItemEditDialogComponent$1,
686
+ menuItemCreateDialogComponent: menuItemCreateDialogComponent$1,
687
+ unauthorized: unauthorized$1,
688
+ menuItemComponent: menuItemComponent$1,
689
+ topbar: topbar$1,
690
+ userNotifications: userNotifications$1,
691
+ discussionComponent: discussionComponent$1,
692
+ primeng: primeng$1
693
+ };
694
+
695
+ var msgService = {
696
+ success: "Успешно",
697
+ info: "Информация",
698
+ warn: "Внимание",
699
+ error: "Ошибка",
700
+ secondary: "Вспомогательный"
701
+ };
702
+ var securityComponent = {
703
+ security: "Безопасность",
704
+ save: "Сохранить",
705
+ savedSecurity: "Настройки сохранены",
706
+ selectRoles: "Выберите роли"
707
+ };
708
+ var profileComponent = {
709
+ changePhoto: "Загрузить фото",
710
+ successfullyUploaded: "Загружено",
711
+ failedToLoadPhoto: "Не удалось загрузить фото пользователя"
712
+ };
713
+ var configComponent = {
714
+ profile: "Профиль",
715
+ photo: "Фото",
716
+ usePhoto256x256Pixel: "Используйте фото 256х256 пикселей",
717
+ localization: "Язык",
718
+ selectLanguage: "Выберите язык"
719
+ };
720
+ var baseComponent = {
721
+ content: "Содержимое",
722
+ settings: "Настройки",
723
+ security: "Безопасность",
724
+ success: "Сохранено"
725
+ };
726
+ var menuComponent = {
727
+ all: "Все",
728
+ "new": "Добавить"
729
+ };
730
+ var menuItemEditDialogComponent = {
731
+ header: "Редактировать элемент меню",
732
+ parentLabel: "Родительский узел",
733
+ label: "Имя",
734
+ module: "Модуль",
735
+ selectModule: "Выберите модуль",
736
+ icon: "Иконка",
737
+ cancel: "Отмена",
738
+ save: "Сохранить",
739
+ security: "Доступ на чтение"
740
+ };
741
+ var menuItemCreateDialogComponent = {
742
+ header: "Новый элемент меню",
743
+ parentLabel: "Родительский узел",
744
+ label: "Имя",
745
+ module: "Модуль",
746
+ selectModule: "Выберите модуль",
747
+ searchModule: "Поиск модуля",
748
+ icon: "Иконка",
749
+ cancel: "Отмена",
750
+ save: "Сохранить"
751
+ };
752
+ var unauthorized = {
753
+ welcomeToOip: "Добро пожаловать в OIP!",
754
+ signInToContinue: "Войдите чтобы продолжить",
755
+ signIn: "Войти"
756
+ };
757
+ var menuItemComponent = {
758
+ "new": "Добавить",
759
+ edit: "Редактировать",
760
+ "delete": "Удалить",
761
+ deleteItemConfirmHeader: "Удаление",
762
+ deleteItemConfirmMessage: "Вы уверены что хотите удалить элемент?",
763
+ deleteItemSuccessMessage: "Успешно удалено",
764
+ deleteItemConfirmRejectButtonPropsLabel: "Отмена",
765
+ deleteItemConfirmAcceptButtonPropsLabel: "Удалить",
766
+ moveUp: "Вверх",
767
+ moveDown: "Вниз"
768
+ };
769
+ var topbar = {
770
+ logout: "Выход",
771
+ logoutConfirmHeader: "Выход",
772
+ logoutConfirmMessage: "Вы уверены, что хотите выйти?",
773
+ logoutConfirmCancel: "Отмена",
774
+ logoutConfirmAccept: "Выйти",
775
+ profile: "Профиль",
776
+ applications: "Приложения"
777
+ };
778
+ var userNotifications = {
779
+ title: "Оповещения",
780
+ empty: "Непрочитанных оповещений нет",
781
+ refresh: "Обновить",
782
+ markAsRead: "Прочитано",
783
+ markedAsRead: "Оповещение отмечено прочитанным"
784
+ };
785
+ var discussionComponent = {
786
+ writeCommentPlaceholder: "Напишите комментарий. Используйте @email или @first.last для упоминаний.",
787
+ mentionSuggestions: "Варианты упоминаний",
788
+ edit: "Редактировать",
789
+ preview: "Предпросмотр",
790
+ attachFiles: "Прикрепить файлы",
791
+ send: "Отправить",
792
+ loadingComments: "Загрузка комментариев...",
793
+ noCommentsYet: "Комментариев пока нет.",
794
+ edited: "Изменено",
795
+ editCommentPlaceholder: "Изменить комментарий",
796
+ addAttachment: "Добавить вложение",
797
+ save: "Сохранить",
798
+ cancel: "Отмена",
799
+ editHistory: "История изменений",
800
+ loadingHistory: "Загрузка истории...",
801
+ before: "До",
802
+ after: "После",
803
+ warning: "Предупреждение",
804
+ "delete": "Удалить",
805
+ confirmDeleteComment: "Вы уверены, что хотите удалить этот комментарий?",
806
+ confirmDeleteFile: "Вы уверены, что хотите удалить файл \"{{fileName}}\"?",
807
+ units: {
808
+ bytes: "Б",
809
+ kilobytes: "КБ",
810
+ megabytes: "МБ"
811
+ },
812
+ errors: {
813
+ loadComments: "Не удалось загрузить комментарии.",
814
+ createComment: "Не удалось создать комментарий.",
815
+ updateComment: "Не удалось обновить комментарий.",
816
+ loadEditHistory: "Не удалось загрузить историю изменений.",
817
+ uploadAttachment: "Не удалось загрузить вложение.",
818
+ deleteComment: "Не удалось удалить комментарий.",
819
+ deleteAttachment: "Не удалось удалить вложение.",
820
+ downloadAttachment: "Не удалось скачать вложение.",
821
+ updateReaction: "Не удалось обновить реакцию.",
822
+ addReaction: "Не удалось добавить реакцию."
823
+ }
824
+ };
825
+ var primeng = {
826
+ accept: "Да",
827
+ addRule: "Добавить правило",
828
+ am: "до полудня",
829
+ apply: "Принять",
830
+ cancel: "Отмена",
831
+ choose: "Выбрать",
832
+ chooseDate: "Выбрать дату",
833
+ chooseMonth: "Выбрать месяц",
834
+ chooseYear: "Выбрать год",
835
+ clear: "Очистить",
836
+ completed: "Завершено",
837
+ contains: "Содержит",
838
+ custom: "Пользовательский",
839
+ dateAfter: "Дата после",
840
+ dateBefore: "Дата до",
841
+ dateFormat: "dd.mm.yy",
842
+ dateIs: "Дата равна",
843
+ dateIsNot: "Дата не равна",
844
+ dayNames: [
845
+ "Воскресенье",
846
+ "Понедельник",
847
+ "Вторник",
848
+ "Среда",
849
+ "Четверг",
850
+ "Пятница",
851
+ "Суббота"
852
+ ],
853
+ dayNamesMin: [
854
+ "Вс",
855
+ "Пн",
856
+ "Вт",
857
+ "Ср",
858
+ "Чт",
859
+ "Пт",
860
+ "Сб"
861
+ ],
862
+ dayNamesShort: [
863
+ "Вск",
864
+ "Пнд",
865
+ "Втр",
866
+ "Срд",
867
+ "Чтв",
868
+ "Птн",
869
+ "Сбт"
870
+ ],
871
+ emptyFilterMessage: "Результатов не найдено",
872
+ emptyMessage: "Нет доступных вариантов",
873
+ emptySearchMessage: "Результатов не найдено",
874
+ emptySelectionMessage: "Нет выбранного элемента",
875
+ endsWith: "Заканчивается",
876
+ equals: "Равно",
877
+ fileChosenMessage: "{0} файлов",
878
+ fileSizeTypes: [
879
+ "Б",
880
+ "Кб",
881
+ "Мб",
882
+ "Гб",
883
+ "Тб",
884
+ "Пб",
885
+ "Эб",
886
+ "Зб",
887
+ "Йб"
888
+ ],
889
+ filter: "Фильтр",
890
+ firstDayOfWeek: 1,
891
+ gt: "Более чем",
892
+ gte: "Более чем или равно",
893
+ lt: "Меньше чем",
894
+ lte: "Меньше чем или равно",
895
+ matchAll: "Сопоставить все",
896
+ matchAny: "Совпадение с любым",
897
+ medium: "Нормальный",
898
+ monthNames: [
899
+ "Январь",
900
+ "Февраль",
901
+ "Март",
902
+ "Апрель",
903
+ "Май",
904
+ "Июнь",
905
+ "Июль",
906
+ "Август",
907
+ "Сентябрь",
908
+ "Октябрь",
909
+ "Ноябрь",
910
+ "Декабрь"
911
+ ],
912
+ monthNamesShort: [
913
+ "Янв",
914
+ "Фев",
915
+ "Мар",
916
+ "Апр",
917
+ "Май",
918
+ "Июн",
919
+ "Июл",
920
+ "Авг",
921
+ "Сен",
922
+ "Окт",
923
+ "Ноя",
924
+ "Дек"
925
+ ],
926
+ nextDecade: "Следующее десятилетие",
927
+ nextHour: "Следующий час",
928
+ nextMinute: "Следующая минута",
929
+ nextMonth: "Следующий месяц",
930
+ nextSecond: "Следующая секунда",
931
+ nextYear: "Следующий год",
932
+ noFileChosenMessage: "Файл не выбран",
933
+ noFilter: "Нет фильтра",
934
+ notContains: "Не содержит",
935
+ notEquals: "Не равно",
936
+ now: "Сейчас",
937
+ passwordPrompt: "Введите пароль",
938
+ pending: "В ожидании",
939
+ pm: "после полудня",
940
+ prevDecade: "Предыдущее десятилетие",
941
+ prevHour: "Предыдущий час",
942
+ prevMinute: "Предыдущая минута",
943
+ prevMonth: "Предыдущий месяц",
944
+ prevSecond: "Предыдущая секунда",
945
+ prevYear: "Предыдущий год",
946
+ reject: "Нет",
947
+ removeRule: "Удалить правило",
948
+ searchMessage: "{0} результатов доступно",
949
+ selectionMessage: "{0} элементов выбрано",
950
+ showMonthAfterYear: false,
951
+ startsWith: "Начинается с",
952
+ strong: "Хороший",
953
+ today: "Сегодня",
954
+ upload: "Загрузить",
955
+ weak: "Простой",
956
+ weekHeader: "Нед.",
957
+ aria: {
958
+ cancelEdit: "Отменить правку",
959
+ close: "Закрыть",
960
+ collapseLabel: "Свернуть",
961
+ collapseRow: "Свернуть строку",
962
+ editRow: "Редактировать строку",
963
+ expandLabel: "Развернуть",
964
+ expandRow: "Развернуть строку",
965
+ falseLabel: "Неверно",
966
+ filterConstraint: "Ограничение фильтра",
967
+ filterOperator: "Оператор фильтра",
968
+ firstPageLabel: "Первая страница",
969
+ gridView: "В виде сетки",
970
+ hideFilterMenu: "Скрыть меню фильтра",
971
+ jumpToPageDropdownLabel: "Перейти к раскрывающемуся списку страниц",
972
+ jumpToPageInputLabel: "Перейти к вводу страницы",
973
+ lastPageLabel: "Последняя страница",
974
+ listLabel: "Список опций",
975
+ listView: "В виде списка",
976
+ moveAllToSource: "Переместить всё в источник",
977
+ moveAllToTarget: "Переместить всё в приёмник",
978
+ moveBottom: "Переместить в конец",
979
+ moveDown: "Переместить вниз",
980
+ moveTop: "Переместить в начало",
981
+ moveToSource: "Переместить в источник",
982
+ moveToTarget: "Переместить в приёмник",
983
+ moveUp: "Переместить вверх",
984
+ navigation: "Навигация",
985
+ next: "Следующий",
986
+ nextPageLabel: "Следующая страница",
987
+ nullLabel: "Не выбран",
988
+ otpLabel: "Введите символ одноразового пароля {0}",
989
+ pageLabel: "{page}",
990
+ passwordHide: "Скрыть пароль",
991
+ passwordShow: "Показать пароль",
992
+ previous: "Предыдущий",
993
+ prevPageLabel: "Предыдущая страница",
994
+ removeLabel: "Удалить",
995
+ rotateLeft: "Повернуть влево",
996
+ rotateRight: "Повернуть вправо",
997
+ rowsPerPageLabel: "Строк на странице",
998
+ saveEdit: "Сохранить правку",
999
+ scrollTop: "Прокрутить в начало",
1000
+ selectAll: "Выбрать все строки",
1001
+ selectLabel: "Выбрать",
1002
+ selectRow: "Выбрать строку",
1003
+ showFilterMenu: "Показать меню фильтра",
1004
+ slide: "Слайд",
1005
+ slideNumber: "{slideNumber}",
1006
+ star: "1 звезда",
1007
+ stars: "{star} звёзд",
1008
+ trueLabel: "Верно",
1009
+ unselectAll: "Отменить выбор всех строк",
1010
+ unselectLabel: "Отменить выбор",
1011
+ unselectRow: "Отменить выбор строки",
1012
+ zoomImage: "Увеличить изображение",
1013
+ zoomIn: "Увеличить",
1014
+ zoomOut: "Уменьшить"
1015
+ }
1016
+ };
1017
+ var ru$6 = {
1018
+ "app-configurator": {
1019
+ primary: "Основной",
1020
+ surface: "Фон",
1021
+ presets: "Стиль",
1022
+ menuMode: "Режим меню"
1023
+ },
1024
+ msgService: msgService,
1025
+ securityComponent: securityComponent,
1026
+ profileComponent: profileComponent,
1027
+ configComponent: configComponent,
1028
+ baseComponent: baseComponent,
1029
+ menuComponent: menuComponent,
1030
+ menuItemEditDialogComponent: menuItemEditDialogComponent,
1031
+ menuItemCreateDialogComponent: menuItemCreateDialogComponent,
1032
+ unauthorized: unauthorized,
1033
+ menuItemComponent: menuItemComponent,
1034
+ topbar: topbar,
1035
+ userNotifications: userNotifications,
1036
+ discussionComponent: discussionComponent,
1037
+ primeng: primeng
1038
+ };
1039
+
1040
+ /**
1041
+ * Global dictionaries shared by all components. They are bundled with the library,
1042
+ * so the application never requests `assets/i18n/{lang}.json`.
1043
+ */
1044
+ const globalTranslations = { en: en$6, ru: ru$6 };
541
1045
  /**
542
1046
  * Service for managing translation loading in the application
543
1047
  */
544
1048
  class L10nService {
1049
+ /**
1050
+ * Translations bundled with components, registered at module load time.
1051
+ */
1052
+ static { this.staticTranslations = new Map(); }
1053
+ /**
1054
+ * Registers translations bundled with a component instead of loading them over HTTP.
1055
+ * Namespaces are taken from the root keys of the passed dictionaries.
1056
+ * Components derived from <c>BaseModuleComponent</c> don't call it directly - it is enough
1057
+ * to declare the static <c>translations</c> field.
1058
+ * @param byLang - Translations grouped by language code
1059
+ * @param namespace - Explicit namespace, needed when the dictionaries are still empty
1060
+ */
1061
+ static registerTranslations(byLang, namespace) {
1062
+ if (!byLang) {
1063
+ return;
1064
+ }
1065
+ if (namespace) {
1066
+ L10nService.staticTranslations.set(namespace, byLang);
1067
+ }
1068
+ for (const translations of Object.values(byLang)) {
1069
+ for (const namespace of Object.keys(translations)) {
1070
+ L10nService.staticTranslations.set(namespace, byLang);
1071
+ }
1072
+ }
1073
+ }
545
1074
  constructor() {
546
1075
  this.loadedTranslations = new Set();
547
1076
  this.loadingTranslations = new Map();
@@ -549,6 +1078,18 @@ class L10nService {
549
1078
  this.translateService = inject(TranslateService);
550
1079
  this.primeNg = inject(PrimeNG);
551
1080
  this.layoutService = inject(LayoutService);
1081
+ // Global dictionaries are available before the first `use()` call, so TranslateHttpLoader is never asked for them.
1082
+ L10nService.registerTranslations(globalTranslations);
1083
+ Object.entries(globalTranslations).forEach(([lang, translations]) => this.mergeTranslation(lang, translations));
1084
+ // Static translations are merged once per language, so they have to be re-merged on every language change.
1085
+ this.translateService.onLangChange.subscribe((event) => {
1086
+ L10nService.staticTranslations.forEach((byLang) => {
1087
+ const translations = byLang[event.lang];
1088
+ if (translations) {
1089
+ this.mergeTranslation(event.lang, translations);
1090
+ }
1091
+ });
1092
+ });
552
1093
  }
553
1094
  /**
554
1095
  * Loads translations for a specific component
@@ -573,8 +1114,7 @@ class L10nService {
573
1114
  return loading;
574
1115
  }
575
1116
  const request = this.httpClient.get(url).pipe(tap((translations) => {
576
- const current = this.translateService.translations[selectedLang] || {};
577
- this.translateService.setTranslation(selectedLang, { ...current, ...translations }, true);
1117
+ this.mergeTranslation(selectedLang, translations);
578
1118
  this.loadedTranslations.add(key);
579
1119
  this.loadingTranslations.delete(key);
580
1120
  }), shareReplay(1));
@@ -606,13 +1146,21 @@ class L10nService {
606
1146
  if (this.loadedTranslations.has(key)) {
607
1147
  return of(null);
608
1148
  }
1149
+ // Translations bundled with the component - no HTTP request needed.
1150
+ const staticTranslations = L10nService.staticTranslations.get(component);
1151
+ if (staticTranslations) {
1152
+ const translations = staticTranslations[lang];
1153
+ if (translations) {
1154
+ this.mergeTranslation(lang, translations);
1155
+ }
1156
+ return of(null);
1157
+ }
609
1158
  const loading = this.loadingTranslations.get(key);
610
1159
  if (loading) {
611
1160
  return loading;
612
1161
  }
613
1162
  const request = this.httpClient.get(`./assets/i18n/${component}.${lang}.json`).pipe(tap((translations) => {
614
- const current = this.translateService.translations[lang] || {};
615
- this.translateService.setTranslation(lang, { ...current, ...translations }, true);
1163
+ this.mergeTranslation(lang, translations);
616
1164
  this.loadedTranslations.add(key);
617
1165
  this.loadingTranslations.delete(key);
618
1166
  }), shareReplay(1));
@@ -626,6 +1174,15 @@ class L10nService {
626
1174
  });
627
1175
  return request;
628
1176
  }
1177
+ /**
1178
+ * Merges a translation dictionary into the dictionary of the given language
1179
+ * @param lang - Language code
1180
+ * @param translations - Translations to merge
1181
+ */
1182
+ mergeTranslation(lang, translations) {
1183
+ const current = this.translateService.translations[lang] || {};
1184
+ this.translateService.setTranslation(lang, { ...current, ...translations }, true);
1185
+ }
629
1186
  /**
630
1187
  * Changes the lang currently used
631
1188
  */
@@ -654,7 +1211,7 @@ class L10nService {
654
1211
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: L10nService, decorators: [{
655
1212
  type: Injectable,
656
1213
  args: [{ providedIn: 'root' }]
657
- }] });
1214
+ }], ctorParameters: () => [] });
658
1215
 
659
1216
  class SecurityService {
660
1217
  }
@@ -837,15 +1394,22 @@ class HttpClient {
837
1394
  constructor() {
838
1395
  this.securityService = inject(SecurityService);
839
1396
  this.layoutService = inject(LayoutService);
1397
+ this.router = inject(Router);
840
1398
  this.baseUrl = "";
841
- this.securityWorker = () => ({
842
- headers: {
843
- "Accept-language": this.layoutService.language()
844
- ? this.layoutService.language()
845
- : "en",
846
- "X-Timezone": this.layoutService.timeZone(),
847
- },
848
- });
1399
+ this.securityWorker = () => {
1400
+ const moduleInstanceId = this.getCurrentModuleInstanceId();
1401
+ return {
1402
+ headers: {
1403
+ "Accept-language": this.layoutService.language()
1404
+ ? this.layoutService.language()
1405
+ : "en",
1406
+ "X-Timezone": this.layoutService.timeZone(),
1407
+ ...(moduleInstanceId != null
1408
+ ? { "X-Module-Instance-Id": String(moduleInstanceId) }
1409
+ : {}),
1410
+ },
1411
+ };
1412
+ };
849
1413
  this.abortControllers = new Map();
850
1414
  this.customFetch = (...fetchParams) => fetch(...fetchParams);
851
1415
  this.baseApiParams = {
@@ -950,12 +1514,29 @@ class HttpClient {
950
1514
  if (cancelToken) {
951
1515
  this.abortControllers.delete(cancelToken);
952
1516
  }
953
- if (!response.ok)
1517
+ if (!response.ok) {
1518
+ this.authorizeOnUnauthorized(response, path);
954
1519
  throw data;
1520
+ }
955
1521
  return data.data;
956
1522
  });
957
1523
  };
958
1524
  }
1525
+ /**
1526
+ * Reads the module instance id of the deepest activated route.
1527
+ * The backend uses it to check module instance rights on endpoints that do not carry the id in their contract.
1528
+ */
1529
+ getCurrentModuleInstanceId() {
1530
+ // May run before the first navigation completes, when route snapshots are not available yet.
1531
+ let route = this.router.routerState?.root;
1532
+ let id = null;
1533
+ while (route) {
1534
+ id = route.snapshot?.paramMap?.get("id") ?? id;
1535
+ route = route.firstChild;
1536
+ }
1537
+ const parsed = id != null ? Number(id) : Number.NaN;
1538
+ return Number.isFinite(parsed) ? parsed : undefined;
1539
+ }
959
1540
  encodeQueryParam(key, value) {
960
1541
  const encodedKey = encodeURIComponent(key);
961
1542
  return `${encodedKey}=${encodeURIComponent(typeof value === "number" ? value : `${value}`)}`;
@@ -992,6 +1573,13 @@ class HttpClient {
992
1573
  },
993
1574
  };
994
1575
  }
1576
+ authorizeOnUnauthorized(response, path) {
1577
+ if (response.status !== 401 ||
1578
+ path.includes("/api/security/create-auth-session")) {
1579
+ return;
1580
+ }
1581
+ this.securityService.authorize(`${window.location.pathname}${window.location.search}${window.location.hash}`);
1582
+ }
995
1583
  async getCsrfRequestParams(method, path) {
996
1584
  if (!method ||
997
1585
  !["POST", "PUT", "PATCH", "DELETE"].includes(method.toUpperCase())) {
@@ -1163,6 +1751,8 @@ class BaseModuleComponent {
1163
1751
  { id: 'settings', icon: 'pi-cog', caption: '' },
1164
1752
  { id: 'security', icon: 'pi-lock', caption: '' }
1165
1753
  ];
1754
+ // Must run before the route subscription below asks L10nService for the translations.
1755
+ L10nService.registerTranslations(this.constructor.translations);
1166
1756
  effect(() => {
1167
1757
  const config = this.localSettings();
1168
1758
  if (config) {
@@ -1171,6 +1761,8 @@ class BaseModuleComponent {
1171
1761
  });
1172
1762
  this.subscriptions.push(this.route.url.subscribe((url) => {
1173
1763
  this.controller = url[0].path;
1764
+ // The route path is the translation namespace, register it before asking for translations.
1765
+ L10nService.registerTranslations(this.constructor.translations, this.controller);
1174
1766
  this.l10n$ = this.l10nService.get(this.controller);
1175
1767
  }));
1176
1768
  this.subscriptions.push(this.route.paramMap.subscribe((params) => {
@@ -1257,11 +1849,13 @@ class BaseModuleComponent {
1257
1849
  * Called whenever the module instance changes, including the first load.
1258
1850
  * Derived components can override this to refresh module-specific data.
1259
1851
  */
1260
- async onModuleInstanceChange() { }
1852
+ async onModuleInstanceChange() {
1853
+ }
1261
1854
  /**
1262
1855
  * Called whenever current user rights for the active module instance are recalculated.
1263
1856
  */
1264
- onSecurityRightsChange() { }
1857
+ onSecurityRightsChange() {
1858
+ }
1265
1859
  /**
1266
1860
  * Starts watching current token roles and maps them to module instance security settings.
1267
1861
  */
@@ -1269,20 +1863,31 @@ class BaseModuleComponent {
1269
1863
  this.rightsSubscription?.unsubscribe();
1270
1864
  this.resetRightsState();
1271
1865
  if (!controller || id == null) {
1272
- return;
1273
- }
1274
- this.rightsSubscription = this.securityService.payload
1275
- .pipe(switchMap((payload) => from(this.getSecurity(controller, id)).pipe(map((securitySettings) => ({ payload, securitySettings })))), takeUntilDestroyed(this.destroyRef))
1276
- .subscribe({
1277
- next: ({ payload, securitySettings }) => {
1278
- const roles = payload?.realm_access?.roles ?? [];
1279
- this.updateRightsState(roles, securitySettings);
1280
- },
1281
- error: (error) => {
1282
- this.securityRightsLoaded = true;
1283
- console.error('Не удалось загрузить права', error);
1284
- this.onSecurityRightsChange();
1285
- }
1866
+ return Promise.resolve();
1867
+ }
1868
+ return new Promise((resolve) => {
1869
+ let settled = false;
1870
+ const settle = () => {
1871
+ if (!settled) {
1872
+ settled = true;
1873
+ resolve();
1874
+ }
1875
+ };
1876
+ this.rightsSubscription = this.securityService.payload
1877
+ .pipe(switchMap((payload) => from(this.getSecurity(controller, id)).pipe(map((securitySettings) => ({ payload, securitySettings })))), takeUntilDestroyed(this.destroyRef))
1878
+ .subscribe({
1879
+ next: ({ payload, securitySettings }) => {
1880
+ const roles = payload?.realm_access?.roles ?? [];
1881
+ this.updateRightsState(roles, securitySettings);
1882
+ settle();
1883
+ },
1884
+ error: (error) => {
1885
+ this.securityRightsLoaded = true;
1886
+ console.error('Не удалось загрузить права', error);
1887
+ this.onSecurityRightsChange();
1888
+ settle();
1889
+ }
1890
+ });
1286
1891
  });
1287
1892
  }
1288
1893
  resetRightsState() {
@@ -1312,7 +1917,6 @@ class BaseModuleComponent {
1312
1917
  return this.httpClient.request({
1313
1918
  path: `/api/${controller}/get-security`,
1314
1919
  method: 'GET',
1315
- query: { id },
1316
1920
  secure: true,
1317
1921
  format: 'json'
1318
1922
  });
@@ -1326,11 +1930,10 @@ class BaseModuleComponent {
1326
1930
  type: ContentType.Json
1327
1931
  });
1328
1932
  }
1329
- getModuleInstanceSettings(controller = this.controller, id = this.id) {
1933
+ getModuleInstanceSettings(controller = this.controller) {
1330
1934
  return this.httpClient.request({
1331
1935
  path: `/api/${controller}/get-module-instance-settings`,
1332
1936
  method: 'GET',
1333
- query: { id },
1334
1937
  secure: true,
1335
1938
  format: 'json'
1336
1939
  });
@@ -1363,8 +1966,12 @@ class BaseModuleComponent {
1363
1966
  }
1364
1967
  async reloadModuleInstance() {
1365
1968
  this.moduleInstanceReloadPromise = this.moduleInstanceReloadPromise.then(async () => {
1969
+ // Rights first: the backend rejects settings and data requests without the read right.
1970
+ await this.watchSecurityRights();
1971
+ if (!this.canRead) {
1972
+ return;
1973
+ }
1366
1974
  await this.getSettings();
1367
- this.watchSecurityRights();
1368
1975
  await this.onModuleInstanceChange();
1369
1976
  });
1370
1977
  await this.moduleInstanceReloadPromise;
@@ -1478,7 +2085,7 @@ class SecurityComponent {
1478
2085
  return;
1479
2086
  }
1480
2087
  try {
1481
- const result = await this.getSecurity(controller, id);
2088
+ const result = await this.getSecurity(controller);
1482
2089
  if (loadToken === this.securityLoadToken) {
1483
2090
  this.securityData = result;
1484
2091
  }
@@ -1489,11 +2096,10 @@ class SecurityComponent {
1489
2096
  }
1490
2097
  }
1491
2098
  }
1492
- getSecurity(controller, id) {
2099
+ getSecurity(controller) {
1493
2100
  return this.httpClient.request({
1494
2101
  path: `/api/${controller}/get-security`,
1495
2102
  method: 'GET',
1496
- query: { id },
1497
2103
  secure: true,
1498
2104
  format: 'json'
1499
2105
  });
@@ -2676,7 +3282,7 @@ class UserNotificationsComponent {
2676
3282
  </div>
2677
3283
 
2678
3284
  <p-paginator
2679
- styleClass="mt-3"
3285
+ class="mt-3"
2680
3286
  [first]="skip"
2681
3287
  [rows]="take"
2682
3288
  [rowsPerPageOptions]="[5, 10, 20]"
@@ -2781,7 +3387,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
2781
3387
  </div>
2782
3388
 
2783
3389
  <p-paginator
2784
- styleClass="mt-3"
3390
+ class="mt-3"
2785
3391
  [first]="skip"
2786
3392
  [rows]="take"
2787
3393
  [rowsPerPageOptions]="[5, 10, 20]"
@@ -3266,6 +3872,14 @@ class MenuApi extends HttpClient {
3266
3872
  format: "json",
3267
3873
  ...params,
3268
3874
  });
3875
+ this.getModuleInstanceRights = (query, params = {}) => this.request({
3876
+ path: `/api/menu/get-module-instance-rights`,
3877
+ method: "GET",
3878
+ query: query,
3879
+ secure: true,
3880
+ format: "json",
3881
+ ...params,
3882
+ });
3269
3883
  this.getAdminMenu = (params = {}) => this.request({
3270
3884
  path: `/api/menu/get-admin-menu`,
3271
3885
  method: "GET",
@@ -3684,7 +4298,7 @@ class MenuItemComponent {
3684
4298
  </ul>
3685
4299
  }
3686
4300
  </ng-container>
3687
- `, 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: i3$4.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"] }] }); }
4301
+ `, 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"] }] }); }
3688
4302
  }
3689
4303
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: MenuItemComponent, decorators: [{
3690
4304
  type: Component,
@@ -3886,10 +4500,14 @@ class MenuItemCreateDialogComponent {
3886
4500
  <p-select
3887
4501
  appendTo="body"
3888
4502
  class="flex-auto"
4503
+ filterBy="value"
4504
+ filterPlaceholder="{{ 'menuItemCreateDialogComponent.searchModule' | translate }}"
3889
4505
  id="oip-menu-item-create-module"
3890
4506
  optionLabel="value"
3891
4507
  optionValue="key"
3892
4508
  placeholder="{{ 'menuItemCreateDialogComponent.selectModule' | translate }}"
4509
+ scrollHeight="18rem"
4510
+ [filter]="true"
3893
4511
  [options]="modules"
3894
4512
  [(ngModel)]="selectModule" />
3895
4513
  </div>
@@ -3937,7 +4555,7 @@ class MenuItemCreateDialogComponent {
3937
4555
  (click)="save()" />
3938
4556
  </div>
3939
4557
  </p-dialog>
3940
- `, 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$2.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" }] }); }
4558
+ `, 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$3.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" }] }); }
3941
4559
  }
3942
4560
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: MenuItemCreateDialogComponent, decorators: [{
3943
4561
  type: Component,
@@ -3979,10 +4597,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
3979
4597
  <p-select
3980
4598
  appendTo="body"
3981
4599
  class="flex-auto"
4600
+ filterBy="value"
4601
+ filterPlaceholder="{{ 'menuItemCreateDialogComponent.searchModule' | translate }}"
3982
4602
  id="oip-menu-item-create-module"
3983
4603
  optionLabel="value"
3984
4604
  optionValue="key"
3985
4605
  placeholder="{{ 'menuItemCreateDialogComponent.selectModule' | translate }}"
4606
+ scrollHeight="18rem"
4607
+ [filter]="true"
3986
4608
  [options]="modules"
3987
4609
  [(ngModel)]="selectModule" />
3988
4610
  </div>
@@ -4044,7 +4666,6 @@ class MenuItemEditDialogComponent {
4044
4666
  this.securityApi = inject(SecurityApi);
4045
4667
  this.msgService = inject(MsgService);
4046
4668
  this.visibleChange = new EventEmitter();
4047
- this.modules = [];
4048
4669
  this.roles = [];
4049
4670
  this.iconOptions = Object.values(PrimeIcons)
4050
4671
  .filter((icon) => typeof icon === 'string')
@@ -4098,9 +4719,6 @@ class MenuItemEditDialogComponent {
4098
4719
  viewRoles: this.menuService.contextMenuItem?.securities
4099
4720
  };
4100
4721
  this.roles = await this.securityApi.getRealmRoles();
4101
- this.menuService.getModules().then((data) => {
4102
- this.modules = data;
4103
- });
4104
4722
  this.visible = true;
4105
4723
  this.visibleChange.emit(this.visible);
4106
4724
  }
@@ -4183,7 +4801,7 @@ class MenuItemEditDialogComponent {
4183
4801
  (click)="save()" />
4184
4802
  </div>
4185
4803
  </p-dialog>
4186
- `, 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$2.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" }] }); }
4804
+ `, 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$3.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" }] }); }
4187
4805
  }
4188
4806
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: MenuItemEditDialogComponent, decorators: [{
4189
4807
  type: Component,
@@ -4589,6 +5207,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
4589
5207
  }]
4590
5208
  }] });
4591
5209
 
5210
+ var notfound$1 = {
5211
+ title: "Not Found",
5212
+ errorCode: "404",
5213
+ description: "Requested resource is not available.",
5214
+ button: "Go to home"
5215
+ };
5216
+ var en$5 = {
5217
+ notfound: notfound$1
5218
+ };
5219
+
5220
+ var notfound = {
5221
+ title: "Не найдено",
5222
+ errorCode: "404",
5223
+ description: "Запрашиваемый ресурс недоступен.",
5224
+ button: "На главную"
5225
+ };
5226
+ var ru$5 = {
5227
+ notfound: notfound
5228
+ };
5229
+
5230
+ L10nService.registerTranslations({ en: en$5, ru: ru$5 });
4592
5231
  class NotfoundComponent {
4593
5232
  constructor(l10nService) {
4594
5233
  l10nService.get('notfound');
@@ -4614,7 +5253,7 @@ class NotfoundComponent {
4614
5253
  </div>
4615
5254
  </div>
4616
5255
  </div>
4617
- </div>`, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: LogoComponent, selector: "logo", inputs: ["width", "height"] }, { 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: "component", type: AppFloatingConfiguratorComponent, selector: "app-floating-configurator" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2$3.TranslatePipe, name: "translate" }] }); }
5256
+ </div>`, isInline: true, dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: LogoComponent, selector: "logo", inputs: ["width", "height"] }, { 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: "component", type: AppFloatingConfiguratorComponent, selector: "app-floating-configurator" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2$4.TranslatePipe, name: "translate" }] }); }
4618
5257
  }
4619
5258
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: NotfoundComponent, decorators: [{
4620
5259
  type: Component,
@@ -4737,6 +5376,80 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
4737
5376
  }]
4738
5377
  }] });
4739
5378
 
5379
+ class AccessComponent {
5380
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: AccessComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5381
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.24", type: AccessComponent, isStandalone: true, selector: "app-access", ngImport: i0, template: `<div
5382
+ class="surface-ground flex align-items-center justify-content-center min-h-screen min-w-screen overflow-hidden">
5383
+ <div class="flex flex-column align-items-center justify-content-center">
5384
+ <img alt="Sakai logo" class="mb-5 w-6rem flex-shrink-0" src="assets/demo/images/access/logo-orange.svg" />
5385
+ <div
5386
+ style="border-radius:56px; padding:0.3rem; background: linear-gradient(180deg, rgba(247, 149, 48, 0.4) 10%, rgba(247, 149, 48, 0) 30%);">
5387
+ <div
5388
+ class="w-full surface-card py-8 px-5 sm:px-8 flex flex-column align-items-center"
5389
+ style="border-radius:53px">
5390
+ <div class="grid flex-column align-items-center">
5391
+ <div
5392
+ class="flex justify-content-center align-items-center bg-orange-500 border-circle"
5393
+ style="width:3.2rem; height:3.2rem;">
5394
+ <i class="text-50 pi pi-fw pi-lock text-2xl"></i>
5395
+ </div>
5396
+ <h1 class="text-900 font-bold text-4xl lg:text-5xl mb-2">Access Denied</h1>
5397
+ <span class="text-600 mb-5">You do not have the necessary permisions. Please contact admins.</span>
5398
+ <img alt="Access denied" class="mb-5" src="assets/demo/images/access/asset-access.svg" width="80%" />
5399
+ <p-button
5400
+ class="p-button-text"
5401
+ icon="pi pi-arrow-left"
5402
+ id="oip-app-access-go-to-dashboard-button"
5403
+ label="Go to Dashboard"
5404
+ pButton
5405
+ pRipple
5406
+ [routerLink]="['/']"></p-button>
5407
+ </div>
5408
+ </div>
5409
+ </div>
5410
+ </div>
5411
+ </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]" }] }); }
5412
+ }
5413
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: AccessComponent, decorators: [{
5414
+ type: Component,
5415
+ args: [{
5416
+ selector: 'app-access',
5417
+ template: `<div
5418
+ class="surface-ground flex align-items-center justify-content-center min-h-screen min-w-screen overflow-hidden">
5419
+ <div class="flex flex-column align-items-center justify-content-center">
5420
+ <img alt="Sakai logo" class="mb-5 w-6rem flex-shrink-0" src="assets/demo/images/access/logo-orange.svg" />
5421
+ <div
5422
+ style="border-radius:56px; padding:0.3rem; background: linear-gradient(180deg, rgba(247, 149, 48, 0.4) 10%, rgba(247, 149, 48, 0) 30%);">
5423
+ <div
5424
+ class="w-full surface-card py-8 px-5 sm:px-8 flex flex-column align-items-center"
5425
+ style="border-radius:53px">
5426
+ <div class="grid flex-column align-items-center">
5427
+ <div
5428
+ class="flex justify-content-center align-items-center bg-orange-500 border-circle"
5429
+ style="width:3.2rem; height:3.2rem;">
5430
+ <i class="text-50 pi pi-fw pi-lock text-2xl"></i>
5431
+ </div>
5432
+ <h1 class="text-900 font-bold text-4xl lg:text-5xl mb-2">Access Denied</h1>
5433
+ <span class="text-600 mb-5">You do not have the necessary permisions. Please contact admins.</span>
5434
+ <img alt="Access denied" class="mb-5" src="assets/demo/images/access/asset-access.svg" width="80%" />
5435
+ <p-button
5436
+ class="p-button-text"
5437
+ icon="pi pi-arrow-left"
5438
+ id="oip-app-access-go-to-dashboard-button"
5439
+ label="Go to Dashboard"
5440
+ pButton
5441
+ pRipple
5442
+ [routerLink]="['/']"></p-button>
5443
+ </div>
5444
+ </div>
5445
+ </div>
5446
+ </div>
5447
+ </div>`,
5448
+ imports: [RouterLink, ButtonModule, RippleModule],
5449
+ standalone: true
5450
+ }]
5451
+ }] });
5452
+
4740
5453
  class ErrorComponent {
4741
5454
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: ErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4742
5455
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.24", type: ErrorComponent, isStandalone: true, selector: "app-error", ngImport: i0, template: `<div
@@ -4769,7 +5482,7 @@ class ErrorComponent {
4769
5482
  </div>
4770
5483
  </div>
4771
5484
  </div>
4772
- </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: i3$4.Ripple, selector: "[pRipple]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
5485
+ </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"] }] }); }
4773
5486
  }
4774
5487
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: ErrorComponent, decorators: [{
4775
5488
  type: Component,
@@ -4885,6 +5598,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
4885
5598
  }]
4886
5599
  }] });
4887
5600
 
5601
+ var config$1 = {
5602
+ all: "All",
5603
+ applicationManagement: "Application management",
5604
+ dateFormat: "Date format",
5605
+ dateTimeFormat: "Date and time format:",
5606
+ goTo: "Go to",
5607
+ localization: "Localization",
5608
+ menu: "Menu",
5609
+ moduleManagement: "Module management",
5610
+ photo: "Photo",
5611
+ profile: "Profile",
5612
+ selectLanguage: "Select language",
5613
+ timeFormat: "Time format",
5614
+ timeZone: "Time zone",
5615
+ usePhoto256x256Pixel: "Use photo 256x256 pixel"
5616
+ };
5617
+ var en$4 = {
5618
+ config: config$1
5619
+ };
5620
+
5621
+ var config = {
5622
+ all: "Все",
5623
+ applicationManagement: "Управление приложениями",
5624
+ dateFormat: "Формат даты",
5625
+ dateTimeFormat: "Формат даты и времени:",
5626
+ goTo: "Перейти",
5627
+ localization: "Локализация",
5628
+ menu: "Меню",
5629
+ moduleManagement: "Управление модулями",
5630
+ photo: "Фото",
5631
+ profile: "Профиль",
5632
+ selectLanguage: "Выберите язык",
5633
+ timeFormat: "Формат времени",
5634
+ timeZone: "Часовой пояс",
5635
+ usePhoto256x256Pixel: "Используйте фото 256x256 пикселей"
5636
+ };
5637
+ var ru$4 = {
5638
+ config: config
5639
+ };
5640
+
5641
+ L10nService.registerTranslations({ en: en$4, ru: ru$4 });
4888
5642
  class ConfigComponent {
4889
5643
  constructor() {
4890
5644
  this.layoutService = inject(LayoutService);
@@ -5026,7 +5780,7 @@ class ConfigComponent {
5026
5780
  </div>
5027
5781
  }
5028
5782
  </div>
5029
- `, isInline: true, dependencies: [{ kind: "component", type: ProfileComponent, 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" }] }); }
5783
+ `, isInline: true, dependencies: [{ kind: "component", type: ProfileComponent, 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$5.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" }] }); }
5030
5784
  }
5031
5785
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: ConfigComponent, decorators: [{
5032
5786
  type: Component,
@@ -5151,11 +5905,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
5151
5905
  }]
5152
5906
  }], ctorParameters: () => [] });
5153
5907
 
5908
+ var en$3 = {
5909
+ "db-migration": {
5910
+ migrationManager: "Migration manager",
5911
+ actions: {
5912
+ refresh: "Refresh",
5913
+ cleanFilter: "Clean filter",
5914
+ applyMigration: "Apply migration"
5915
+ },
5916
+ columns: {
5917
+ name: "Migration name",
5918
+ applied: "Applied",
5919
+ exist: "Exist",
5920
+ pending: "Pending"
5921
+ },
5922
+ messages: {
5923
+ errorRefreshing: "Error refreshing database"
5924
+ }
5925
+ }
5926
+ };
5927
+
5928
+ var ru$3 = {
5929
+ "db-migration": {
5930
+ migrationManager: "Менеджер миграций",
5931
+ actions: {
5932
+ refresh: "Обновить",
5933
+ cleanFilter: "Очистить фильтр",
5934
+ applyMigration: "Применить миграцию"
5935
+ },
5936
+ columns: {
5937
+ name: "Название миграции",
5938
+ applied: "Применена",
5939
+ exist: "Существует",
5940
+ pending: "Ожидает"
5941
+ },
5942
+ messages: {
5943
+ errorRefreshing: "Ошибка обновления базы данных"
5944
+ }
5945
+ }
5946
+ };
5947
+
5154
5948
  class DbMigrationComponent extends BaseModuleComponent {
5155
- constructor() {
5156
- super();
5157
- this.l10nService.loadComponentTranslations('db-migration');
5158
- }
5949
+ static { this.translations = { en: en$3, ru: ru$3 }; }
5159
5950
  async ngOnInit() {
5160
5951
  await super.ngOnInit();
5161
5952
  await this.refreshAction();
@@ -5177,7 +5968,7 @@ class DbMigrationComponent extends BaseModuleComponent {
5177
5968
  const request = { name: rowData.name };
5178
5969
  return this.applyModuleMigration(request);
5179
5970
  }
5180
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DbMigrationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5971
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DbMigrationComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
5181
5972
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.24", type: DbMigrationComponent, isStandalone: true, selector: "db-migration", providers: [ConfirmationService], usesInheritance: true, ngImport: i0, template: `
5182
5973
  @if (isContent) {
5183
5974
  <div class="card" style="height: 100%">
@@ -5256,7 +6047,7 @@ class DbMigrationComponent extends BaseModuleComponent {
5256
6047
  } @else if (isSecurity) {
5257
6048
  <security [controller]="controller" [id]="id" />
5258
6049
  }
5259
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: TableModule }, { kind: "component", type: i1$8.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$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1$8.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i1$8.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i1$8.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i1$8.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" }] }); }
6050
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: TableModule }, { kind: "component", type: i1$8.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$3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1$8.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i1$8.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i1$8.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i1$8.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" }] }); }
5260
6051
  }
5261
6052
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DbMigrationComponent, decorators: [{
5262
6053
  type: Component,
@@ -5356,7 +6147,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
5356
6147
  `,
5357
6148
  providers: [ConfirmationService]
5358
6149
  }]
5359
- }], ctorParameters: () => [] });
6150
+ }] });
5360
6151
 
5361
6152
  /* eslint-disable */
5362
6153
  /* tslint:disable */
@@ -5454,6 +6245,69 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
5454
6245
  type: Injectable
5455
6246
  }] });
5456
6247
 
6248
+ var en$2 = {
6249
+ "app-modules": {
6250
+ title: "Modules",
6251
+ refreshTooltip: "Refresh",
6252
+ register: {
6253
+ manifestUrlPlaceholder: "External module manifest URL",
6254
+ button: "Register"
6255
+ },
6256
+ table: {
6257
+ moduleId: "Module ID",
6258
+ name: "Name",
6259
+ currentlyLoaded: "Currently Loaded",
6260
+ yes: "Yes",
6261
+ no: "No",
6262
+ deleteTooltip: "Delete"
6263
+ },
6264
+ confirm: {
6265
+ header: "Warning",
6266
+ message: "Are you sure you want to delete the module?",
6267
+ cancel: "Cancel",
6268
+ "delete": "Delete"
6269
+ },
6270
+ messages: {
6271
+ deleteSuccess: "Module deleted",
6272
+ deleteError: "Module delete failed",
6273
+ registerError: "External module registration failed",
6274
+ registerSuccess: "External module registered"
6275
+ }
6276
+ }
6277
+ };
6278
+
6279
+ var ru$2 = {
6280
+ "app-modules": {
6281
+ title: "Модули",
6282
+ refreshTooltip: "Обновить",
6283
+ register: {
6284
+ manifestUrlPlaceholder: "URL манифеста внешнего модуля",
6285
+ button: "Зарегистрировать"
6286
+ },
6287
+ table: {
6288
+ moduleId: "ID модуля",
6289
+ name: "Название",
6290
+ currentlyLoaded: "Загружен",
6291
+ yes: "Да",
6292
+ no: "Нет",
6293
+ deleteTooltip: "Удалить"
6294
+ },
6295
+ confirm: {
6296
+ header: "Внимание",
6297
+ message: "Вы уверены, что хотите удалить модуль?",
6298
+ cancel: "Отмена",
6299
+ "delete": "Удалить"
6300
+ },
6301
+ messages: {
6302
+ deleteSuccess: "Модуль удален",
6303
+ deleteError: "Не удалось удалить модуль",
6304
+ registerError: "Не удалось зарегистрировать внешний модуль",
6305
+ registerSuccess: "Внешний модуль зарегистрирован"
6306
+ }
6307
+ }
6308
+ };
6309
+
6310
+ L10nService.registerTranslations({ en: en$2, ru: ru$2 });
5457
6311
  class AppModulesComponent {
5458
6312
  constructor() {
5459
6313
  this.modules = [];
@@ -5605,7 +6459,7 @@ class AppModulesComponent {
5605
6459
  </p-table>
5606
6460
  </div>
5607
6461
  </div>
5608
- `, 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$8.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$2.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" }] }); }
6462
+ `, 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$8.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$3.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" }] }); }
5609
6463
  }
5610
6464
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: AppModulesComponent, decorators: [{
5611
6465
  type: Component,
@@ -5706,6 +6560,103 @@ var ServiceType;
5706
6560
  ServiceType["Application"] = "Application";
5707
6561
  })(ServiceType || (ServiceType = {}));
5708
6562
 
6563
+ var applications$1 = {
6564
+ title: "Applications",
6565
+ subtitle: "Manage the frontend application registry",
6566
+ searchPlaceholder: "Search applications",
6567
+ search: "Search",
6568
+ clear: "Clear",
6569
+ add: "Add",
6570
+ refreshTooltip: "Refresh",
6571
+ empty: "No applications found",
6572
+ table: {
6573
+ code: "Code",
6574
+ displayName: "Name",
6575
+ baseUrl: "Base URL",
6576
+ internalBaseUrl: "Internal Base URL",
6577
+ icon: "Icon",
6578
+ order: "Order",
6579
+ enabled: "Enabled",
6580
+ serviceType: "Service type",
6581
+ current: "Current",
6582
+ actions: "Actions",
6583
+ yes: "Yes",
6584
+ no: "No",
6585
+ editTooltip: "Edit",
6586
+ deleteTooltip: "Delete",
6587
+ saveTooltip: "Save",
6588
+ cancelTooltip: "Cancel"
6589
+ },
6590
+ serviceTypes: {
6591
+ service: "Service",
6592
+ application: "Application"
6593
+ },
6594
+ confirm: {
6595
+ header: "Warning",
6596
+ message: "Are you sure you want to delete application {{displayName}}?",
6597
+ cancel: "Cancel",
6598
+ "delete": "Delete"
6599
+ },
6600
+ messages: {
6601
+ requiredFields: "Fill code, name and Base URL",
6602
+ createSuccess: "Application created",
6603
+ updateSuccess: "Application updated",
6604
+ deleteSuccess: "Application deleted"
6605
+ }
6606
+ };
6607
+ var en$1 = {
6608
+ applications: applications$1
6609
+ };
6610
+
6611
+ var applications = {
6612
+ title: "Приложения",
6613
+ subtitle: "Управление реестром фронтенд-приложений",
6614
+ searchPlaceholder: "Поиск по приложениям",
6615
+ search: "Найти",
6616
+ clear: "Очистить",
6617
+ add: "Добавить",
6618
+ refreshTooltip: "Обновить",
6619
+ empty: "Приложения не найдены",
6620
+ table: {
6621
+ code: "Код",
6622
+ displayName: "Название",
6623
+ baseUrl: "Base URL",
6624
+ internalBaseUrl: "Internal Base URL",
6625
+ icon: "Иконка",
6626
+ order: "Порядок",
6627
+ enabled: "Включено",
6628
+ serviceType: "Тип сервиса",
6629
+ current: "Текущее",
6630
+ actions: "Действия",
6631
+ yes: "Да",
6632
+ no: "Нет",
6633
+ editTooltip: "Редактировать",
6634
+ deleteTooltip: "Удалить",
6635
+ saveTooltip: "Сохранить",
6636
+ cancelTooltip: "Отменить"
6637
+ },
6638
+ serviceTypes: {
6639
+ service: "Сервис",
6640
+ application: "Приложение"
6641
+ },
6642
+ confirm: {
6643
+ header: "Внимание",
6644
+ message: "Вы уверены, что хотите удалить приложение {{displayName}}?",
6645
+ cancel: "Отмена",
6646
+ "delete": "Удалить"
6647
+ },
6648
+ messages: {
6649
+ requiredFields: "Заполните код, название и Base URL",
6650
+ createSuccess: "Приложение создано",
6651
+ updateSuccess: "Приложение обновлено",
6652
+ deleteSuccess: "Приложение удалено"
6653
+ }
6654
+ };
6655
+ var ru$1 = {
6656
+ applications: applications
6657
+ };
6658
+
6659
+ L10nService.registerTranslations({ en: en$1, ru: ru$1 });
5709
6660
  class ApplicationsComponent {
5710
6661
  get serviceTypeOptions() {
5711
6662
  return [
@@ -6158,7 +7109,7 @@ class ApplicationsComponent {
6158
7109
  </p-table>
6159
7110
  </div>
6160
7111
  </div>
6161
- `, 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$8.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$2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1$8.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i1$8.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" }] }); }
7112
+ `, 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$8.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$3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1$8.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i1$8.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$5.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" }] }); }
6162
7113
  }
6163
7114
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: ApplicationsComponent, decorators: [{
6164
7115
  type: Component,
@@ -7247,7 +8198,7 @@ class DiscussionComponent {
7247
8198
  </div>
7248
8199
  }
7249
8200
  </section>
7250
- `, 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: i2$2.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 }); }
8201
+ `, 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: i2$3.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 }); }
7251
8202
  }
7252
8203
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: DiscussionComponent, decorators: [{
7253
8204
  type: Component,
@@ -7589,13 +8540,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
7589
8540
  args: [{ required: true }]
7590
8541
  }] } });
7591
8542
 
8543
+ var en = {
8544
+ "iframe-module": {
8545
+ iframeModule: {
8546
+ urlPlaceholder: "Site URL",
8547
+ settingSaveButtonLabel: "Save",
8548
+ emptyUrlMessage: "Site URL is not specified.",
8549
+ siteLoadingMessage: "Failed to load the site."
8550
+ }
8551
+ }
8552
+ };
8553
+
8554
+ var ru = {
8555
+ "iframe-module": {
8556
+ iframeModule: {
8557
+ urlPlaceholder: "URL сайта",
8558
+ settingSaveButtonLabel: "Сохранить",
8559
+ emptyUrlMessage: "URL сайта не указан.",
8560
+ siteLoadingMessage: "Не удалось загрузить сайт."
8561
+ }
8562
+ }
8563
+ };
8564
+
7592
8565
  class IframeModuleComponent extends BaseModuleComponent {
8566
+ static { this.translations = { en, ru }; }
7593
8567
  constructor() {
7594
8568
  super();
7595
8569
  this.renderer = inject(Renderer2);
7596
8570
  this.translate = inject(TranslateService);
7597
8571
  this.iframeUrl = null;
7598
- this.l10nService.loadComponentTranslations('iframe-module');
7599
8572
  }
7600
8573
  set iframeElement(element) {
7601
8574
  this.iframe = element;
@@ -8326,6 +9299,103 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
8326
9299
  type: Injectable
8327
9300
  }] });
8328
9301
 
9302
+ /**
9303
+ * Reads the rights the current user has on a module instance.
9304
+ *
9305
+ * Results are cached per instance and dropped whenever the authenticated user changes.
9306
+ */
9307
+ class ModuleInstanceRightsService {
9308
+ static { this.readRight = 'read'; }
9309
+ constructor() {
9310
+ this.menuApi = inject(MenuApi);
9311
+ this.securityService = inject(SecurityService);
9312
+ this.cache = new Map();
9313
+ this.cachedIdentity = undefined;
9314
+ this.securityService.payload.subscribe((payload) => {
9315
+ // Rights depend on both the user and the roles of the current session.
9316
+ const roles = payload?.realm_access?.roles ?? [];
9317
+ const identity = `${payload?.preferred_username ?? ''}|${[...roles].sort().join(',')}`;
9318
+ if (identity !== this.cachedIdentity) {
9319
+ this.cachedIdentity = identity;
9320
+ this.clearCache();
9321
+ }
9322
+ });
9323
+ }
9324
+ /**
9325
+ * Gets the rights of the current user on the given module instance.
9326
+ */
9327
+ getRights(moduleInstanceId) {
9328
+ const cached = this.cache.get(moduleInstanceId);
9329
+ if (cached) {
9330
+ return cached;
9331
+ }
9332
+ const request = this.menuApi
9333
+ .getModuleInstanceRights({ id: moduleInstanceId })
9334
+ .then((rights) => rights ?? [])
9335
+ .catch((error) => {
9336
+ this.cache.delete(moduleInstanceId);
9337
+ throw error;
9338
+ });
9339
+ this.cache.set(moduleInstanceId, request);
9340
+ return request;
9341
+ }
9342
+ /**
9343
+ * Checks whether the current user has the `read` right on the given module instance.
9344
+ */
9345
+ async canRead(moduleInstanceId) {
9346
+ const rights = await this.getRights(moduleInstanceId);
9347
+ return rights.includes(ModuleInstanceRightsService.readRight);
9348
+ }
9349
+ /**
9350
+ * Drops every cached result, for example after module security was changed.
9351
+ */
9352
+ clearCache() {
9353
+ this.cache.clear();
9354
+ }
9355
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: ModuleInstanceRightsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9356
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: ModuleInstanceRightsService }); }
9357
+ }
9358
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImport: i0, type: ModuleInstanceRightsService, decorators: [{
9359
+ type: Injectable
9360
+ }], ctorParameters: () => [] });
9361
+
9362
+ /**
9363
+ * Guards module routes against direct navigation without the required rights.
9364
+ *
9365
+ * - Routes flagged with `data: { requireAdmin: true }` require the `admin` role.
9366
+ * - Routes carrying an `:id` segment require the `read` right on that module instance.
9367
+ * - Everything else is left to {@link AuthGuardService}.
9368
+ *
9369
+ * Denied navigation is redirected to the access denied page. This is a UX guard only:
9370
+ * the backend checks the same rights on every module endpoint.
9371
+ */
9372
+ const moduleAccessGuard = async (route) => {
9373
+ const router = inject(Router);
9374
+ const securityService = inject(SecurityService);
9375
+ const rightsService = inject(ModuleInstanceRightsService);
9376
+ const accessDenied = router.parseUrl('/access');
9377
+ if (route.data?.requireAdmin) {
9378
+ // Wait for the session payload so a direct URL entry does not read roles before they are loaded.
9379
+ await firstValueFrom(securityService.payload.pipe(filter((payload) => payload != null), take(1)));
9380
+ return securityService.isAdmin() ? true : accessDenied;
9381
+ }
9382
+ const routeId = route.paramMap.get('id');
9383
+ if (routeId == null) {
9384
+ return true;
9385
+ }
9386
+ const moduleInstanceId = Number(routeId);
9387
+ if (!Number.isFinite(moduleInstanceId)) {
9388
+ return accessDenied;
9389
+ }
9390
+ try {
9391
+ return (await rightsService.canRead(moduleInstanceId)) ? true : accessDenied;
9392
+ }
9393
+ catch (error) {
9394
+ console.error('Failed to load module instance rights', error);
9395
+ return accessDenied;
9396
+ }
9397
+ };
9398
+
8329
9399
  /**
8330
9400
  * Prime-ng table filter service
8331
9401
  */
@@ -8471,12 +9541,14 @@ function provideOip() {
8471
9541
  { provide: LocationStrategy, useClass: PathLocationStrategy },
8472
9542
  { provide: SecurityService, useClass: BffSecurityService },
8473
9543
  AuthGuardService,
9544
+ ModuleInstanceRightsService,
8474
9545
  MessageService,
8475
9546
  UserService,
8476
9547
  NotificationService,
8477
9548
  UserProfileApi,
8478
9549
  SecurityApi,
8479
9550
  NotificationApi,
9551
+ MenuApi,
8480
9552
  importProvidersFrom([
8481
9553
  TranslateModule.forRoot({
8482
9554
  loader: {
@@ -8495,10 +9567,9 @@ function provideOip() {
8495
9567
  class FolderModuleApi extends HttpClient {
8496
9568
  constructor() {
8497
9569
  super(...arguments);
8498
- this.getModuleInstanceSettings = (query, params = {}) => this.request({
9570
+ this.getModuleInstanceSettings = (params = {}) => this.request({
8499
9571
  path: `/api/folder-module/get-module-instance-settings`,
8500
9572
  method: "GET",
8501
- query: query,
8502
9573
  secure: true,
8503
9574
  format: "json",
8504
9575
  ...params,
@@ -8517,10 +9588,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
8517
9588
  class IframeModuleApi extends HttpClient {
8518
9589
  constructor() {
8519
9590
  super(...arguments);
8520
- this.getModuleInstanceSettings = (query, params = {}) => this.request({
9591
+ this.getModuleInstanceSettings = (params = {}) => this.request({
8521
9592
  path: `/api/iframe-module/get-module-instance-settings`,
8522
9593
  method: "GET",
8523
- query: query,
8524
9594
  secure: true,
8525
9595
  format: "json",
8526
9596
  ...params,
@@ -8539,5 +9609,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.24", ngImpo
8539
9609
  * Generated bundle index. Do not edit.
8540
9610
  */
8541
9611
 
8542
- export { APP_THEME_PRESETS, APP_THEME_PRESETS_MERGE_MODE, AppConfiguratorComponent, AppFloatingConfiguratorComponent, AppLayoutComponent, AppModulesComponent, AppTopbar, AppTopbarApplicationSwitcherComponent, ApplicationRegistryService, ApplicationsApi, ApplicationsComponent, AuthGuardService, BaseModuleComponent, BffSecurityService, ConfigComponent, ContentType, CustomElementExtensionModuleHostComponent, DbMigrationComponent, DiscussionComponent, ErrorComponent, ExtensionLoaderService, ExtensionModuleHostComponent, FolderModuleApi, FooterComponent, HttpClient, IframeModuleApi, IframeModuleComponent, L10nService, LOGO_COMPONENT_TOKEN, LayoutService, LogoComponent, LogoService, MenuComponent, MenuService, MsgService, NotfoundComponent, NotificationApi, NotificationService, OIP_EXTENSION_EVENTS, ProfileComponent, SecurityApi, SecurityComponent, SecurityService, SidebarComponent, TableFilterService, TopBarService, UnauthorizedComponent, UserNotificationsComponent, UserProfileApi, UserService, convertToPrimeNgDateFormat, defaultTheme, emitOipContextChange, emitOipError, emitOipNavigate, emitOipNotify, emitOipSettingsChange, emitOipTitleChange, langIntercept, mergeWithDefaults, provideAppThemes, provideLogoComponent, provideOip, replaceDefaults };
9612
+ export { APP_THEME_PRESETS, APP_THEME_PRESETS_MERGE_MODE, AccessComponent, AppConfiguratorComponent, AppFloatingConfiguratorComponent, AppLayoutComponent, AppModulesComponent, AppTopbar, AppTopbarApplicationSwitcherComponent, ApplicationRegistryService, ApplicationsApi, ApplicationsComponent, AuthGuardService, BaseModuleComponent, BffSecurityService, ConfigComponent, ContentType, CustomElementExtensionModuleHostComponent, DbMigrationComponent, DiscussionComponent, ErrorComponent, ExtensionLoaderService, ExtensionModuleHostComponent, FolderModuleApi, FooterComponent, HttpClient, IframeModuleApi, IframeModuleComponent, L10nService, LOGO_COMPONENT_TOKEN, LayoutService, LogoComponent, LogoService, MenuComponent, MenuService, ModuleInstanceRightsService, MsgService, NotfoundComponent, NotificationApi, NotificationService, OIP_EXTENSION_EVENTS, ProfileComponent, SecurityApi, SecurityComponent, SecurityService, SidebarComponent, TableFilterService, TopBarService, UnauthorizedComponent, UserNotificationsComponent, UserProfileApi, UserService, convertToPrimeNgDateFormat, defaultTheme, emitOipContextChange, emitOipError, emitOipNavigate, emitOipNotify, emitOipSettingsChange, emitOipTitleChange, langIntercept, mergeWithDefaults, moduleAccessGuard, provideAppThemes, provideLogoComponent, provideOip, replaceDefaults };
8543
9613
  //# sourceMappingURL=oip-common.mjs.map