oip-common 0.0.36 → 0.0.37

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.
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, inject, signal, computed, effect, ChangeDetectorRef, Component, Input, PLATFORM_ID, InjectionToken, HostBinding, EventEmitter, Output, ViewChild, Renderer2, Pipe } from '@angular/core';
3
- import * as i2$5 from 'primeng/api';
2
+ import { Injectable, inject, signal, computed, effect, ChangeDetectorRef, Component, Input, PLATFORM_ID, InjectionToken, HostBinding, EventEmitter, Output, ViewChild, Renderer2, SecurityContext, ChangeDetectionStrategy, Pipe } from '@angular/core';
3
+ import * as i2$6 from 'primeng/api';
4
4
  import { MessageService, ConfirmationService, PrimeIcons, SharedModule } from 'primeng/api';
5
5
  import { HttpErrorResponse, HttpClient as HttpClient$1, HttpHeaders } from '@angular/common/http';
6
- import * as i2$3 from '@ngx-translate/core';
6
+ import * as i2$4 from '@ngx-translate/core';
7
7
  import { TranslateService, TranslatePipe, TranslateModule } from '@ngx-translate/core';
8
- import * as i1$2 from '@angular/router';
8
+ import * as i1$3 from '@angular/router';
9
9
  import { ActivatedRoute, Router, RouterModule, NavigationEnd, RouterLinkActive, RouterLink } from '@angular/router';
10
10
  import { lastValueFrom, BehaviorSubject, Subject, filter as filter$1, combineLatest, of, map as map$1, Observable } from 'rxjs';
11
11
  import { Title, DomSanitizer } from '@angular/platform-browser';
@@ -13,12 +13,12 @@ import * as i1 from 'primeng/multiselect';
13
13
  import { MultiSelectModule } from 'primeng/multiselect';
14
14
  import * as i2 from 'primeng/tooltip';
15
15
  import { TooltipModule, Tooltip } from 'primeng/tooltip';
16
- import * as i1$1 from 'primeng/button';
16
+ import * as i1$2 from 'primeng/button';
17
17
  import { ButtonModule, Button } from 'primeng/button';
18
- import * as i5 from '@angular/forms';
18
+ import * as i1$1 from '@angular/forms';
19
19
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
20
20
  import * as i2$1 from '@angular/common';
21
- import { isPlatformBrowser, CommonModule, NgComponentOutlet, NgClass } from '@angular/common';
21
+ import { isPlatformBrowser, CommonModule, NgComponentOutlet, NgClass, DatePipe } from '@angular/common';
22
22
  import * as i3$1 from 'primeng/styleclass';
23
23
  import { StyleClassModule } from 'primeng/styleclass';
24
24
  import { updatePreset, updateSurfacePalette, $t } from '@primeng/themes';
@@ -31,11 +31,11 @@ import { SelectButtonModule } from 'primeng/selectbutton';
31
31
  import { OidcSecurityService, PublicEventsService, EventTypes, StsConfigHttpLoader } from 'angular-auth-oidc-client';
32
32
  import { filter, map, switchMap, catchError } from 'rxjs/operators';
33
33
  import { Tabs, TabList, Tab } from 'primeng/tabs';
34
- import * as i4 from 'primeng/avatar';
34
+ import * as i2$2 from 'primeng/avatar';
35
35
  import { AvatarModule } from 'primeng/avatar';
36
- import * as i1$3 from 'primeng/contextmenu';
36
+ import * as i1$4 from 'primeng/contextmenu';
37
37
  import { ContextMenuModule, ContextMenu } from 'primeng/contextmenu';
38
- import * as i2$2 from 'primeng/dialog';
38
+ import * as i2$3 from 'primeng/dialog';
39
39
  import { DialogModule } from 'primeng/dialog';
40
40
  import * as i3$3 from 'primeng/inputtext';
41
41
  import { InputTextModule } from 'primeng/inputtext';
@@ -43,19 +43,29 @@ import { trigger, state, transition, style, animate } from '@angular/animations'
43
43
  import * as i3$2 from 'primeng/ripple';
44
44
  import { RippleModule } from 'primeng/ripple';
45
45
  import { ConfirmDialog } from 'primeng/confirmdialog';
46
- import * as i4$1 from 'primeng/select';
46
+ import * as i4 from 'primeng/select';
47
47
  import { SelectModule, Select } from 'primeng/select';
48
- import * as i1$4 from 'primeng/fileupload';
48
+ import * as i1$5 from 'primeng/fileupload';
49
49
  import { FileUploadModule } from 'primeng/fileupload';
50
50
  import { ImageModule } from 'primeng/image';
51
- import * as i1$5 from 'primeng/table';
51
+ import * as i1$6 from 'primeng/table';
52
52
  import { TableModule } from 'primeng/table';
53
- import * as i2$4 from 'primeng/toggleswitch';
53
+ import * as i2$5 from 'primeng/toggleswitch';
54
54
  import { ToggleSwitchModule } from 'primeng/toggleswitch';
55
+ import * as i9 from 'primeng/tag';
55
56
  import { TagModule, Tag } from 'primeng/tag';
56
- import { TextareaModule } from 'primeng/textarea';
57
- import * as i4$2 from 'primeng/toolbar';
57
+ import { TextareaModule, Textarea } from 'primeng/textarea';
58
+ import * as i4$1 from 'primeng/toolbar';
58
59
  import { ToolbarModule } from 'primeng/toolbar';
60
+ import * as i5 from 'primeng/card';
61
+ import { CardModule } from 'primeng/card';
62
+ import { DividerModule } from 'primeng/divider';
63
+ import * as i6 from 'primeng/panel';
64
+ import { PanelModule } from 'primeng/panel';
65
+ import * as i7 from 'primeng/popover';
66
+ import { PopoverModule } from 'primeng/popover';
67
+ import * as i8 from 'primeng/progressspinner';
68
+ import { ProgressSpinnerModule } from 'primeng/progressspinner';
59
69
  import * as signalR from '@microsoft/signalr';
60
70
 
61
71
  class TopBarService {
@@ -145,6 +155,24 @@ class MsgService {
145
155
  life: life
146
156
  });
147
157
  }
158
+ extractErrorMessage(error, fallback) {
159
+ if (typeof error === 'object' &&
160
+ error &&
161
+ 'error' in error &&
162
+ typeof error.error === 'object' &&
163
+ error.error &&
164
+ 'message' in error.error &&
165
+ typeof error.error.message === 'string') {
166
+ return error.error.message;
167
+ }
168
+ if (typeof error === 'object' && error && 'message' in error && typeof error.message === 'string') {
169
+ return error.message;
170
+ }
171
+ return fallback;
172
+ }
173
+ errorFromException(error, fallback, summary = fallback, life = this.lifetime) {
174
+ this.error(this.extractErrorMessage(error, fallback), summary, life);
175
+ }
148
176
  contrast(detail, summary = this.translate.instant('msgService.error'), life = this.lifetime) {
149
177
  this.messageService.add({
150
178
  severity: 'contrast',
@@ -814,7 +842,7 @@ class SecurityComponent {
814
842
  </div>
815
843
  </div>
816
844
  </div>
817
- `, isInline: true, dependencies: [{ 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: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.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: "pipe", type: TranslatePipe, name: "translate" }] }); }
845
+ `, isInline: true, dependencies: [{ 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: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2.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: "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: "pipe", type: TranslatePipe, name: "translate" }] }); }
818
846
  }
819
847
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: SecurityComponent, decorators: [{
820
848
  type: Component,
@@ -1293,7 +1321,7 @@ class AppConfiguratorComponent {
1293
1321
  </div>
1294
1322
  }
1295
1323
  </div>
1296
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i3.SelectButton, selector: "p-selectButton, p-selectbutton, p-select-button", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "styleClass", "ariaLabelledBy", "dataKey", "autofocus", "size", "fluid"], outputs: ["onOptionClick", "onChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
1324
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SelectButtonModule }, { kind: "component", type: i3.SelectButton, selector: "p-selectButton, p-selectbutton, p-select-button", inputs: ["options", "optionLabel", "optionValue", "optionDisabled", "unselectable", "tabindex", "multiple", "allowEmpty", "styleClass", "ariaLabelledBy", "dataKey", "autofocus", "size", "fluid"], outputs: ["onOptionClick", "onChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
1297
1325
  }
1298
1326
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppConfiguratorComponent, decorators: [{
1299
1327
  type: Component,
@@ -1734,7 +1762,7 @@ class AppTopbar {
1734
1762
  </div>
1735
1763
  </div>
1736
1764
  </div>
1737
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i3$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfiguratorComponent, selector: "app-configurator" }, { kind: "component", type: Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: TabList, selector: "p-tablist" }, { kind: "component", type: Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i4.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.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: "pipe", type: TranslatePipe, name: "translate" }] }); }
1765
+ </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule", "ngComponentOutletNgModuleFactory"], exportAs: ["ngComponentOutlet"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i3$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfiguratorComponent, selector: "app-configurator" }, { kind: "component", type: Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: TabList, selector: "p-tablist" }, { kind: "component", type: Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2$2.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
1738
1766
  }
1739
1767
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppTopbar, decorators: [{
1740
1768
  type: Component,
@@ -1903,9 +1931,20 @@ var ContentType;
1903
1931
  ContentType["Text"] = "text/plain";
1904
1932
  })(ContentType || (ContentType = {}));
1905
1933
  class HttpClient {
1906
- constructor(apiConfig = {}) {
1934
+ constructor() {
1935
+ this.securityService = inject(SecurityService);
1936
+ this.layoutService = inject(LayoutService);
1907
1937
  this.baseUrl = "";
1908
1938
  this.securityData = null;
1939
+ this.securityWorker = (securityData) => ({
1940
+ headers: {
1941
+ "Accept-language": this.layoutService.language()
1942
+ ? this.layoutService.language()
1943
+ : "en",
1944
+ "X-Timezone": this.layoutService.timeZone(),
1945
+ Authorization: `Bearer ${securityData}`,
1946
+ },
1947
+ });
1909
1948
  this.abortControllers = new Map();
1910
1949
  this.customFetch = (...fetchParams) => fetch(...fetchParams);
1911
1950
  this.baseApiParams = {
@@ -1970,7 +2009,7 @@ class HttpClient {
1970
2009
  const requestParams = this.mergeRequestParams(params, secureParams);
1971
2010
  const queryString = query && this.toQueryString(query);
1972
2011
  const payloadFormatter = this.contentFormatters[type || ContentType.Json];
1973
- const responseFormat = format || requestParams.format;
2012
+ let responseFormat = format || requestParams.format;
1974
2013
  return this.customFetch(`${baseUrl || this.baseUrl || ""}${path}${queryString ? `?${queryString}` : ""}`, {
1975
2014
  ...requestParams,
1976
2015
  headers: {
@@ -2016,7 +2055,9 @@ class HttpClient {
2016
2055
  return data.data;
2017
2056
  });
2018
2057
  };
2019
- Object.assign(this, apiConfig);
2058
+ this.securityService.getAccessToken().subscribe((token) => {
2059
+ this.securityData = token;
2060
+ });
2020
2061
  }
2021
2062
  encodeQueryParam(key, value) {
2022
2063
  const encodedKey = encodeURIComponent(key);
@@ -2054,13 +2095,13 @@ class HttpClient {
2054
2095
  },
2055
2096
  };
2056
2097
  }
2057
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HttpClient, deps: "invalid", target: i0.ɵɵFactoryTarget.Injectable }); }
2098
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HttpClient, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2058
2099
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HttpClient, providedIn: "root" }); }
2059
2100
  }
2060
2101
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: HttpClient, decorators: [{
2061
2102
  type: Injectable,
2062
2103
  args: [{ providedIn: "root" }]
2063
- }], ctorParameters: () => [{ type: undefined }] });
2104
+ }], ctorParameters: () => [] });
2064
2105
 
2065
2106
  /* eslint-disable */
2066
2107
  /* tslint:disable */
@@ -2359,7 +2400,7 @@ class MenuItemComponent {
2359
2400
  },
2360
2401
  { separator: true, visible: this.hasVisibleNext(item) || this.hasVisiblePrev(item) },
2361
2402
  {
2362
- label: 'Up',
2403
+ label: this.localization.moveUp,
2363
2404
  icon: PrimeIcons.ANGLE_UP,
2364
2405
  command: (event) => {
2365
2406
  this.moveUp(item);
@@ -2369,7 +2410,7 @@ class MenuItemComponent {
2369
2410
  visible: this.hasVisiblePrev(item)
2370
2411
  },
2371
2412
  {
2372
- label: 'Down',
2413
+ label: this.localization.moveDown,
2373
2414
  icon: PrimeIcons.ANGLE_DOWN,
2374
2415
  command: (event) => {
2375
2416
  this.moveDown(item);
@@ -2470,79 +2511,79 @@ class MenuItemComponent {
2470
2511
  const currentIndex = items.findIndex((item) => item.moduleInstanceId == currentItem.moduleInstanceId);
2471
2512
  return currentIndex < items.length - 1;
2472
2513
  }
2473
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$2.Router }, { token: MenuService }], target: i0.ɵɵFactoryTarget.Component }); }
2474
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MenuItemComponent, isStandalone: true, selector: "[app-menuitem]", inputs: { item: "item", index: "index", root: "root", parentKey: "parentKey", menuItemCreateDialogComponent: "menuItemCreateDialogComponent", menuItemEditDialogComponent: "menuItemEditDialogComponent", contextMenu: "contextMenu" }, host: { properties: { "class.layout-root-menuitem": "this.root", "class.active-menuitem": "this.activeClass" } }, providers: [ConfirmationService], ngImport: i0, template: `
2475
- <ng-container>
2476
- <p-confirm-dialog />
2477
- @if (root && item.visible !== false) {
2478
- <div class="layout-menuitem-root-text" (contextmenu)="onContextMenu($event, item)">
2479
- {{ item.label }}
2480
- </div>
2481
- }
2482
- @if ((!item.routerLink || item.items) && item.visible !== false) {
2483
- <a
2484
- pRipple
2485
- tabindex="0"
2486
- [attr.href]="item.url"
2487
- [attr.target]="item.target"
2488
- [ngClass]="item.class"
2489
- (click)="itemClick($event)">
2490
- <i class="layout-menuitem-icon" [ngClass]="item.icon"></i>
2491
- <span class="layout-menuitem-text">{{ item.label }}</span>
2492
- @if (item.items) {
2493
- <i class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
2494
- }
2495
- </a>
2496
- }
2497
- @if (item.routerLink && !item.items && item.visible !== false) {
2498
- <a
2499
- pRipple
2500
- routerLinkActive="active-route"
2501
- tabindex="0"
2502
- [attr.target]="item.target"
2503
- [fragment]="item.fragment"
2504
- [ngClass]="item.class"
2505
- [preserveFragment]="item.preserveFragment"
2506
- [queryParams]="item.queryParams"
2507
- [queryParamsHandling]="item.queryParamsHandling"
2508
- [replaceUrl]="item.replaceUrl"
2509
- [routerLink]="item.routerLink"
2510
- [routerLinkActiveOptions]="
2511
- item.routerLinkActiveOptions || {
2512
- paths: 'exact',
2513
- queryParams: 'ignored',
2514
- matrixParams: 'ignored',
2515
- fragment: 'ignored'
2516
- }
2517
- "
2518
- [skipLocationChange]="item.skipLocationChange"
2519
- [state]="item.state"
2520
- (click)="itemClick($event)"
2521
- (contextmenu)="onContextMenu($event, item)">
2522
- <i class="layout-menuitem-icon" [ngClass]="item.icon"></i>
2523
- <span class="layout-menuitem-text">{{ item.label }}</span>
2524
- @if (item.items) {
2525
- <i class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
2526
- }
2527
- </a>
2528
- }
2529
-
2530
- @if (item.items && item.visible !== false) {
2531
- <ul [@children]="submenuAnimation" (contextmenu)="onContextMenu($event, item)">
2532
- @for (child of item.items; track child; let i = $index) {
2533
- <li
2534
- app-menuitem
2535
- [class]="child.badgeClass"
2536
- [contextMenu]="contextMenu"
2537
- [index]="i"
2538
- [item]="child"
2539
- [menuItemCreateDialogComponent]="menuItemCreateDialogComponent"
2540
- [menuItemEditDialogComponent]="menuItemEditDialogComponent"
2541
- [parentKey]="key"></li>
2542
- }
2543
- </ul>
2544
- }
2545
- </ng-container>
2514
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuItemComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1$3.Router }, { token: MenuService }], target: i0.ɵɵFactoryTarget.Component }); }
2515
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MenuItemComponent, isStandalone: true, selector: "[app-menuitem]", inputs: { item: "item", index: "index", root: "root", parentKey: "parentKey", menuItemCreateDialogComponent: "menuItemCreateDialogComponent", menuItemEditDialogComponent: "menuItemEditDialogComponent", contextMenu: "contextMenu" }, host: { properties: { "class.layout-root-menuitem": "this.root", "class.active-menuitem": "this.activeClass" } }, providers: [ConfirmationService], ngImport: i0, template: `
2516
+ <ng-container>
2517
+ <p-confirm-dialog />
2518
+ @if (root && item.visible !== false) {
2519
+ <div class="layout-menuitem-root-text" (contextmenu)="onContextMenu($event, item)">
2520
+ {{ item.label }}
2521
+ </div>
2522
+ }
2523
+ @if ((!item.routerLink || item.items) && item.visible !== false) {
2524
+ <a
2525
+ pRipple
2526
+ tabindex="0"
2527
+ [attr.href]="item.url"
2528
+ [attr.target]="item.target"
2529
+ [ngClass]="item.class"
2530
+ (click)="itemClick($event)">
2531
+ <i class="layout-menuitem-icon" [ngClass]="item.icon"></i>
2532
+ <span class="layout-menuitem-text">{{ item.label }}</span>
2533
+ @if (item.items) {
2534
+ <i class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
2535
+ }
2536
+ </a>
2537
+ }
2538
+ @if (item.routerLink && !item.items && item.visible !== false) {
2539
+ <a
2540
+ pRipple
2541
+ routerLinkActive="active-route"
2542
+ tabindex="0"
2543
+ [attr.target]="item.target"
2544
+ [fragment]="item.fragment"
2545
+ [ngClass]="item.class"
2546
+ [preserveFragment]="item.preserveFragment"
2547
+ [queryParams]="item.queryParams"
2548
+ [queryParamsHandling]="item.queryParamsHandling"
2549
+ [replaceUrl]="item.replaceUrl"
2550
+ [routerLink]="item.routerLink"
2551
+ [routerLinkActiveOptions]="
2552
+ item.routerLinkActiveOptions || {
2553
+ paths: 'exact',
2554
+ queryParams: 'ignored',
2555
+ matrixParams: 'ignored',
2556
+ fragment: 'ignored'
2557
+ }
2558
+ "
2559
+ [skipLocationChange]="item.skipLocationChange"
2560
+ [state]="item.state"
2561
+ (click)="itemClick($event)"
2562
+ (contextmenu)="onContextMenu($event, item)">
2563
+ <i class="layout-menuitem-icon" [ngClass]="item.icon"></i>
2564
+ <span class="layout-menuitem-text">{{ item.label }}</span>
2565
+ @if (item.items) {
2566
+ <i class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
2567
+ }
2568
+ </a>
2569
+ }
2570
+
2571
+ @if (item.items && item.visible !== false) {
2572
+ <ul [@children]="submenuAnimation" (contextmenu)="onContextMenu($event, item)">
2573
+ @for (child of item.items; track child; let i = $index) {
2574
+ <li
2575
+ app-menuitem
2576
+ [class]="child.badgeClass"
2577
+ [contextMenu]="contextMenu"
2578
+ [index]="i"
2579
+ [item]="child"
2580
+ [menuItemCreateDialogComponent]="menuItemCreateDialogComponent"
2581
+ [menuItemEditDialogComponent]="menuItemEditDialogComponent"
2582
+ [parentKey]="key"></li>
2583
+ }
2584
+ </ul>
2585
+ }
2586
+ </ng-container>
2546
2587
  `, 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$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"] }], animations: [
2547
2588
  trigger('children', [
2548
2589
  state('collapsed', style({
@@ -2560,78 +2601,78 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2560
2601
  args: [{
2561
2602
  // eslint-disable-next-line @angular-eslint/component-selector
2562
2603
  selector: '[app-menuitem]',
2563
- template: `
2564
- <ng-container>
2565
- <p-confirm-dialog />
2566
- @if (root && item.visible !== false) {
2567
- <div class="layout-menuitem-root-text" (contextmenu)="onContextMenu($event, item)">
2568
- {{ item.label }}
2569
- </div>
2570
- }
2571
- @if ((!item.routerLink || item.items) && item.visible !== false) {
2572
- <a
2573
- pRipple
2574
- tabindex="0"
2575
- [attr.href]="item.url"
2576
- [attr.target]="item.target"
2577
- [ngClass]="item.class"
2578
- (click)="itemClick($event)">
2579
- <i class="layout-menuitem-icon" [ngClass]="item.icon"></i>
2580
- <span class="layout-menuitem-text">{{ item.label }}</span>
2581
- @if (item.items) {
2582
- <i class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
2583
- }
2584
- </a>
2585
- }
2586
- @if (item.routerLink && !item.items && item.visible !== false) {
2587
- <a
2588
- pRipple
2589
- routerLinkActive="active-route"
2590
- tabindex="0"
2591
- [attr.target]="item.target"
2592
- [fragment]="item.fragment"
2593
- [ngClass]="item.class"
2594
- [preserveFragment]="item.preserveFragment"
2595
- [queryParams]="item.queryParams"
2596
- [queryParamsHandling]="item.queryParamsHandling"
2597
- [replaceUrl]="item.replaceUrl"
2598
- [routerLink]="item.routerLink"
2599
- [routerLinkActiveOptions]="
2600
- item.routerLinkActiveOptions || {
2601
- paths: 'exact',
2602
- queryParams: 'ignored',
2603
- matrixParams: 'ignored',
2604
- fragment: 'ignored'
2605
- }
2606
- "
2607
- [skipLocationChange]="item.skipLocationChange"
2608
- [state]="item.state"
2609
- (click)="itemClick($event)"
2610
- (contextmenu)="onContextMenu($event, item)">
2611
- <i class="layout-menuitem-icon" [ngClass]="item.icon"></i>
2612
- <span class="layout-menuitem-text">{{ item.label }}</span>
2613
- @if (item.items) {
2614
- <i class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
2615
- }
2616
- </a>
2617
- }
2618
-
2619
- @if (item.items && item.visible !== false) {
2620
- <ul [@children]="submenuAnimation" (contextmenu)="onContextMenu($event, item)">
2621
- @for (child of item.items; track child; let i = $index) {
2622
- <li
2623
- app-menuitem
2624
- [class]="child.badgeClass"
2625
- [contextMenu]="contextMenu"
2626
- [index]="i"
2627
- [item]="child"
2628
- [menuItemCreateDialogComponent]="menuItemCreateDialogComponent"
2629
- [menuItemEditDialogComponent]="menuItemEditDialogComponent"
2630
- [parentKey]="key"></li>
2631
- }
2632
- </ul>
2633
- }
2634
- </ng-container>
2604
+ template: `
2605
+ <ng-container>
2606
+ <p-confirm-dialog />
2607
+ @if (root && item.visible !== false) {
2608
+ <div class="layout-menuitem-root-text" (contextmenu)="onContextMenu($event, item)">
2609
+ {{ item.label }}
2610
+ </div>
2611
+ }
2612
+ @if ((!item.routerLink || item.items) && item.visible !== false) {
2613
+ <a
2614
+ pRipple
2615
+ tabindex="0"
2616
+ [attr.href]="item.url"
2617
+ [attr.target]="item.target"
2618
+ [ngClass]="item.class"
2619
+ (click)="itemClick($event)">
2620
+ <i class="layout-menuitem-icon" [ngClass]="item.icon"></i>
2621
+ <span class="layout-menuitem-text">{{ item.label }}</span>
2622
+ @if (item.items) {
2623
+ <i class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
2624
+ }
2625
+ </a>
2626
+ }
2627
+ @if (item.routerLink && !item.items && item.visible !== false) {
2628
+ <a
2629
+ pRipple
2630
+ routerLinkActive="active-route"
2631
+ tabindex="0"
2632
+ [attr.target]="item.target"
2633
+ [fragment]="item.fragment"
2634
+ [ngClass]="item.class"
2635
+ [preserveFragment]="item.preserveFragment"
2636
+ [queryParams]="item.queryParams"
2637
+ [queryParamsHandling]="item.queryParamsHandling"
2638
+ [replaceUrl]="item.replaceUrl"
2639
+ [routerLink]="item.routerLink"
2640
+ [routerLinkActiveOptions]="
2641
+ item.routerLinkActiveOptions || {
2642
+ paths: 'exact',
2643
+ queryParams: 'ignored',
2644
+ matrixParams: 'ignored',
2645
+ fragment: 'ignored'
2646
+ }
2647
+ "
2648
+ [skipLocationChange]="item.skipLocationChange"
2649
+ [state]="item.state"
2650
+ (click)="itemClick($event)"
2651
+ (contextmenu)="onContextMenu($event, item)">
2652
+ <i class="layout-menuitem-icon" [ngClass]="item.icon"></i>
2653
+ <span class="layout-menuitem-text">{{ item.label }}</span>
2654
+ @if (item.items) {
2655
+ <i class="pi pi-fw pi-angle-down layout-submenu-toggler"></i>
2656
+ }
2657
+ </a>
2658
+ }
2659
+
2660
+ @if (item.items && item.visible !== false) {
2661
+ <ul [@children]="submenuAnimation" (contextmenu)="onContextMenu($event, item)">
2662
+ @for (child of item.items; track child; let i = $index) {
2663
+ <li
2664
+ app-menuitem
2665
+ [class]="child.badgeClass"
2666
+ [contextMenu]="contextMenu"
2667
+ [index]="i"
2668
+ [item]="child"
2669
+ [menuItemCreateDialogComponent]="menuItemCreateDialogComponent"
2670
+ [menuItemEditDialogComponent]="menuItemEditDialogComponent"
2671
+ [parentKey]="key"></li>
2672
+ }
2673
+ </ul>
2674
+ }
2675
+ </ng-container>
2635
2676
  `,
2636
2677
  animations: [
2637
2678
  trigger('children', [
@@ -2647,7 +2688,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2647
2688
  imports: [RippleModule, NgClass, RouterLinkActive, RouterLink, ContextMenuModule, ConfirmDialog],
2648
2689
  providers: [ConfirmationService]
2649
2690
  }]
2650
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$2.Router }, { type: MenuService }], propDecorators: { item: [{
2691
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1$3.Router }, { type: MenuService }], propDecorators: { item: [{
2651
2692
  type: Input
2652
2693
  }], index: [{
2653
2694
  type: Input
@@ -2704,68 +2745,68 @@ class MenuItemCreateDialogComponent {
2704
2745
  this.visibleChange.emit(this.visible);
2705
2746
  }
2706
2747
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuItemCreateDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2707
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MenuItemCreateDialogComponent, isStandalone: true, selector: "menu-item-create-dialog", inputs: { visible: "visible" }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: `
2708
- <p-dialog
2709
- header="{{ 'menuItemCreateDialogComponent.header' | translate }}"
2710
- [modal]="true"
2711
- [style]="{ width: '40rem' }"
2712
- [(visible)]="visible">
2713
- @if (menuService.contextMenuItem) {
2714
- <div class="flex items-center gap-4 mb-4 mt-1">
2715
- <label class="font-semibold w-1/3" for="oip-menu-item-create-dialog-parent-input">
2716
- {{ 'menuItemCreateDialogComponent.parentLabel' | translate }}
2717
- </label>
2718
- <input
2719
- autocomplete="off"
2720
- class="flex-auto"
2721
- id="oip-menu-item-create-dialog-parent-input"
2722
- pInputText
2723
- readonly
2724
- [ngModel]="menuService.contextMenuItem?.label" />
2725
- </div>
2726
- }
2727
- <div class="flex items-center gap-4 mb-4">
2728
- <label class="font-semibold w-1/3" for="oip-menu-item-create-label">
2729
- {{ 'menuItemCreateDialogComponent.label' | translate }}
2730
- </label>
2731
- <input autocomplete="off" class="flex-auto" id="oip-menu-item-create-label" pInputText [(ngModel)]="label" />
2732
- </div>
2733
- <div class="flex items-center gap-4 mb-4">
2734
- <label class="font-semibold w-1/3" for="oip-menu-item-create-module">
2735
- {{ 'menuItemCreateDialogComponent.module' | translate }}
2736
- </label>
2737
- <p-select
2738
- appendTo="body"
2739
- class="flex-auto"
2740
- id="oip-menu-item-create-module"
2741
- optionLabel="value"
2742
- optionValue="key"
2743
- placeholder="{{ 'menuItemCreateDialogComponent.selectModule' | translate }}"
2744
- [options]="modules"
2745
- [(ngModel)]="selectModule" />
2746
- </div>
2747
- <div class="flex items-center gap-4 mb-4">
2748
- <label class="font-semibold w-1/3" for="oip-menu-item-create-dialog-icon">
2749
- {{ 'menuItemCreateDialogComponent.icon' | translate }}
2750
- </label>
2751
- <i class="{{ selectIcon }}"></i>
2752
- <input class="flex-auto" id="oip-menu-item-create-dialog-icon" pInputText [(ngModel)]="selectIcon" />
2753
- </div>
2754
- <div class="flex justify-end gap-2">
2755
- <p-button
2756
- id="oip-menu-item-create-cancel"
2757
- label="{{ 'menuItemCreateDialogComponent.cancel' | translate }}"
2758
- severity="secondary"
2759
- (click)="changeVisible()"
2760
- (keydown)="changeVisible()" />
2761
- <p-button
2762
- id="oip-menu-item-create-save"
2763
- label="{{ 'menuItemCreateDialogComponent.save' | translate }}"
2764
- (click)="save()"
2765
- (keydown)="save()" />
2766
- </div>
2767
- </p-dialog>
2768
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.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: DialogModule }, { kind: "component", type: i2$2.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: i3$3.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i4$1.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: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
2748
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MenuItemCreateDialogComponent, isStandalone: true, selector: "menu-item-create-dialog", inputs: { visible: "visible" }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: `
2749
+ <p-dialog
2750
+ header="{{ 'menuItemCreateDialogComponent.header' | translate }}"
2751
+ [modal]="true"
2752
+ [style]="{ width: '40rem' }"
2753
+ [(visible)]="visible">
2754
+ @if (menuService.contextMenuItem) {
2755
+ <div class="flex items-center gap-4 mb-4 mt-1">
2756
+ <label class="font-semibold w-1/3" for="oip-menu-item-create-dialog-parent-input">
2757
+ {{ 'menuItemCreateDialogComponent.parentLabel' | translate }}
2758
+ </label>
2759
+ <input
2760
+ autocomplete="off"
2761
+ class="flex-auto"
2762
+ id="oip-menu-item-create-dialog-parent-input"
2763
+ pInputText
2764
+ readonly
2765
+ [ngModel]="menuService.contextMenuItem?.label" />
2766
+ </div>
2767
+ }
2768
+ <div class="flex items-center gap-4 mb-4">
2769
+ <label class="font-semibold w-1/3" for="oip-menu-item-create-label">
2770
+ {{ 'menuItemCreateDialogComponent.label' | translate }}
2771
+ </label>
2772
+ <input autocomplete="off" class="flex-auto" id="oip-menu-item-create-label" pInputText [(ngModel)]="label" />
2773
+ </div>
2774
+ <div class="flex items-center gap-4 mb-4">
2775
+ <label class="font-semibold w-1/3" for="oip-menu-item-create-module">
2776
+ {{ 'menuItemCreateDialogComponent.module' | translate }}
2777
+ </label>
2778
+ <p-select
2779
+ appendTo="body"
2780
+ class="flex-auto"
2781
+ id="oip-menu-item-create-module"
2782
+ optionLabel="value"
2783
+ optionValue="key"
2784
+ placeholder="{{ 'menuItemCreateDialogComponent.selectModule' | translate }}"
2785
+ [options]="modules"
2786
+ [(ngModel)]="selectModule" />
2787
+ </div>
2788
+ <div class="flex items-center gap-4 mb-4">
2789
+ <label class="font-semibold w-1/3" for="oip-menu-item-create-dialog-icon">
2790
+ {{ 'menuItemCreateDialogComponent.icon' | translate }}
2791
+ </label>
2792
+ <i class="{{ selectIcon }}"></i>
2793
+ <input class="flex-auto" id="oip-menu-item-create-dialog-icon" pInputText [(ngModel)]="selectIcon" />
2794
+ </div>
2795
+ <div class="flex justify-end gap-2">
2796
+ <p-button
2797
+ id="oip-menu-item-create-cancel"
2798
+ label="{{ 'menuItemCreateDialogComponent.cancel' | translate }}"
2799
+ severity="secondary"
2800
+ (click)="changeVisible()"
2801
+ (keydown)="changeVisible()" />
2802
+ <p-button
2803
+ id="oip-menu-item-create-save"
2804
+ label="{{ 'menuItemCreateDialogComponent.save' | translate }}"
2805
+ (click)="save()"
2806
+ (keydown)="save()" />
2807
+ </div>
2808
+ </p-dialog>
2809
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2$3.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: i3$3.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i4.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" }] }); }
2769
2810
  }
2770
2811
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuItemCreateDialogComponent, decorators: [{
2771
2812
  type: Component,
@@ -2773,67 +2814,67 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2773
2814
  selector: 'menu-item-create-dialog',
2774
2815
  standalone: true,
2775
2816
  imports: [ButtonModule, DialogModule, InputTextModule, SelectModule, FormsModule, TranslatePipe],
2776
- template: `
2777
- <p-dialog
2778
- header="{{ 'menuItemCreateDialogComponent.header' | translate }}"
2779
- [modal]="true"
2780
- [style]="{ width: '40rem' }"
2781
- [(visible)]="visible">
2782
- @if (menuService.contextMenuItem) {
2783
- <div class="flex items-center gap-4 mb-4 mt-1">
2784
- <label class="font-semibold w-1/3" for="oip-menu-item-create-dialog-parent-input">
2785
- {{ 'menuItemCreateDialogComponent.parentLabel' | translate }}
2786
- </label>
2787
- <input
2788
- autocomplete="off"
2789
- class="flex-auto"
2790
- id="oip-menu-item-create-dialog-parent-input"
2791
- pInputText
2792
- readonly
2793
- [ngModel]="menuService.contextMenuItem?.label" />
2794
- </div>
2795
- }
2796
- <div class="flex items-center gap-4 mb-4">
2797
- <label class="font-semibold w-1/3" for="oip-menu-item-create-label">
2798
- {{ 'menuItemCreateDialogComponent.label' | translate }}
2799
- </label>
2800
- <input autocomplete="off" class="flex-auto" id="oip-menu-item-create-label" pInputText [(ngModel)]="label" />
2801
- </div>
2802
- <div class="flex items-center gap-4 mb-4">
2803
- <label class="font-semibold w-1/3" for="oip-menu-item-create-module">
2804
- {{ 'menuItemCreateDialogComponent.module' | translate }}
2805
- </label>
2806
- <p-select
2807
- appendTo="body"
2808
- class="flex-auto"
2809
- id="oip-menu-item-create-module"
2810
- optionLabel="value"
2811
- optionValue="key"
2812
- placeholder="{{ 'menuItemCreateDialogComponent.selectModule' | translate }}"
2813
- [options]="modules"
2814
- [(ngModel)]="selectModule" />
2815
- </div>
2816
- <div class="flex items-center gap-4 mb-4">
2817
- <label class="font-semibold w-1/3" for="oip-menu-item-create-dialog-icon">
2818
- {{ 'menuItemCreateDialogComponent.icon' | translate }}
2819
- </label>
2820
- <i class="{{ selectIcon }}"></i>
2821
- <input class="flex-auto" id="oip-menu-item-create-dialog-icon" pInputText [(ngModel)]="selectIcon" />
2822
- </div>
2823
- <div class="flex justify-end gap-2">
2824
- <p-button
2825
- id="oip-menu-item-create-cancel"
2826
- label="{{ 'menuItemCreateDialogComponent.cancel' | translate }}"
2827
- severity="secondary"
2828
- (click)="changeVisible()"
2829
- (keydown)="changeVisible()" />
2830
- <p-button
2831
- id="oip-menu-item-create-save"
2832
- label="{{ 'menuItemCreateDialogComponent.save' | translate }}"
2833
- (click)="save()"
2834
- (keydown)="save()" />
2835
- </div>
2836
- </p-dialog>
2817
+ template: `
2818
+ <p-dialog
2819
+ header="{{ 'menuItemCreateDialogComponent.header' | translate }}"
2820
+ [modal]="true"
2821
+ [style]="{ width: '40rem' }"
2822
+ [(visible)]="visible">
2823
+ @if (menuService.contextMenuItem) {
2824
+ <div class="flex items-center gap-4 mb-4 mt-1">
2825
+ <label class="font-semibold w-1/3" for="oip-menu-item-create-dialog-parent-input">
2826
+ {{ 'menuItemCreateDialogComponent.parentLabel' | translate }}
2827
+ </label>
2828
+ <input
2829
+ autocomplete="off"
2830
+ class="flex-auto"
2831
+ id="oip-menu-item-create-dialog-parent-input"
2832
+ pInputText
2833
+ readonly
2834
+ [ngModel]="menuService.contextMenuItem?.label" />
2835
+ </div>
2836
+ }
2837
+ <div class="flex items-center gap-4 mb-4">
2838
+ <label class="font-semibold w-1/3" for="oip-menu-item-create-label">
2839
+ {{ 'menuItemCreateDialogComponent.label' | translate }}
2840
+ </label>
2841
+ <input autocomplete="off" class="flex-auto" id="oip-menu-item-create-label" pInputText [(ngModel)]="label" />
2842
+ </div>
2843
+ <div class="flex items-center gap-4 mb-4">
2844
+ <label class="font-semibold w-1/3" for="oip-menu-item-create-module">
2845
+ {{ 'menuItemCreateDialogComponent.module' | translate }}
2846
+ </label>
2847
+ <p-select
2848
+ appendTo="body"
2849
+ class="flex-auto"
2850
+ id="oip-menu-item-create-module"
2851
+ optionLabel="value"
2852
+ optionValue="key"
2853
+ placeholder="{{ 'menuItemCreateDialogComponent.selectModule' | translate }}"
2854
+ [options]="modules"
2855
+ [(ngModel)]="selectModule" />
2856
+ </div>
2857
+ <div class="flex items-center gap-4 mb-4">
2858
+ <label class="font-semibold w-1/3" for="oip-menu-item-create-dialog-icon">
2859
+ {{ 'menuItemCreateDialogComponent.icon' | translate }}
2860
+ </label>
2861
+ <i class="{{ selectIcon }}"></i>
2862
+ <input class="flex-auto" id="oip-menu-item-create-dialog-icon" pInputText [(ngModel)]="selectIcon" />
2863
+ </div>
2864
+ <div class="flex justify-end gap-2">
2865
+ <p-button
2866
+ id="oip-menu-item-create-cancel"
2867
+ label="{{ 'menuItemCreateDialogComponent.cancel' | translate }}"
2868
+ severity="secondary"
2869
+ (click)="changeVisible()"
2870
+ (keydown)="changeVisible()" />
2871
+ <p-button
2872
+ id="oip-menu-item-create-save"
2873
+ label="{{ 'menuItemCreateDialogComponent.save' | translate }}"
2874
+ (click)="save()"
2875
+ (keydown)="save()" />
2876
+ </div>
2877
+ </p-dialog>
2837
2878
  `
2838
2879
  }]
2839
2880
  }], propDecorators: { visible: [{
@@ -2888,61 +2929,61 @@ class MenuItemEditDialogComponent {
2888
2929
  this.visibleChange.emit(this.visible);
2889
2930
  }
2890
2931
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuItemEditDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2891
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: MenuItemEditDialogComponent, isStandalone: true, selector: "menu-item-edit-dialog", inputs: { visible: "visible" }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: `
2892
- <p-dialog
2893
- header="{{ 'menuItemEditDialogComponent.header' | translate }}"
2894
- [modal]="true"
2895
- [style]="{ width: '40rem' }"
2896
- [(visible)]="visible">
2897
- <div class="flex items-center gap-4 mb-4 mt-1">
2898
- <label class="font-semibold w-1/3" for="oip-menu-item-edit-dialog-menu-input">
2899
- {{ 'menuItemEditDialogComponent.label' | translate }}
2900
- </label>
2901
- <input
2902
- autocomplete="off"
2903
- class="flex-auto"
2904
- id="oip-menu-item-edit-dialog-menu-input"
2905
- pInputText
2906
- [(ngModel)]="item.label" />
2907
- </div>
2908
-
2909
- <div class="flex items-center gap-4 mb-4">
2910
- <label class="font-semibold w-1/3" for="oip-menu-item-edit-dialog-icon">
2911
- {{ 'menuItemEditDialogComponent.icon' | translate }}
2912
- </label>
2913
- <i class="{{ item.icon }}"></i>
2914
- <input class="flex-auto" id="oip-menu-item-edit-dialog-icon" pInputText [(ngModel)]="item.icon" />
2915
- </div>
2916
-
2917
- <div class="flex items-center gap-4 mb-4">
2918
- <label class="font-semibold w-1/3" for="security">
2919
- {{ 'menuItemEditDialogComponent.security' | translate }}
2920
- </label>
2921
- <p-multiSelect
2922
- appendTo="body"
2923
- class="flex-auto"
2924
- id="oip-menu-item-edit-dialog-roles-multi-select"
2925
- placeholder="Select roles"
2926
- [maxSelectedLabels]="10"
2927
- [options]="roles"
2928
- [(ngModel)]="item.viewRoles" />
2929
- </div>
2930
-
2931
- <div class="flex justify-end gap-2">
2932
- <p-button
2933
- id="oip-menu-item-edit-dialog-cancel-edit-button"
2934
- label="{{ 'menuItemEditDialogComponent.cancel' | translate }}"
2935
- severity="secondary"
2936
- (click)="changeVisible()"
2937
- (keydown)="changeVisible()" />
2938
- <p-button
2939
- id="oip-menu-item-edit-dialog-save-edit-button"
2940
- label="{{ 'menuItemEditDialogComponent.save' | translate }}"
2941
- (click)="save()"
2942
- (keydown)="save()" />
2943
- </div>
2944
- </p-dialog>
2945
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.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: DialogModule }, { kind: "component", type: i2$2.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: i3$3.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.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" }] }); }
2932
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: MenuItemEditDialogComponent, isStandalone: true, selector: "menu-item-edit-dialog", inputs: { visible: "visible" }, outputs: { visibleChange: "visibleChange" }, ngImport: i0, template: `
2933
+ <p-dialog
2934
+ header="{{ 'menuItemEditDialogComponent.header' | translate }}"
2935
+ [modal]="true"
2936
+ [style]="{ width: '40rem' }"
2937
+ [(visible)]="visible">
2938
+ <div class="flex items-center gap-4 mb-4 mt-1">
2939
+ <label class="font-semibold w-1/3" for="oip-menu-item-edit-dialog-menu-input">
2940
+ {{ 'menuItemEditDialogComponent.label' | translate }}
2941
+ </label>
2942
+ <input
2943
+ autocomplete="off"
2944
+ class="flex-auto"
2945
+ id="oip-menu-item-edit-dialog-menu-input"
2946
+ pInputText
2947
+ [(ngModel)]="item.label" />
2948
+ </div>
2949
+
2950
+ <div class="flex items-center gap-4 mb-4">
2951
+ <label class="font-semibold w-1/3" for="oip-menu-item-edit-dialog-icon">
2952
+ {{ 'menuItemEditDialogComponent.icon' | translate }}
2953
+ </label>
2954
+ <i class="{{ item.icon }}"></i>
2955
+ <input class="flex-auto" id="oip-menu-item-edit-dialog-icon" pInputText [(ngModel)]="item.icon" />
2956
+ </div>
2957
+
2958
+ <div class="flex items-center gap-4 mb-4">
2959
+ <label class="font-semibold w-1/3" for="security">
2960
+ {{ 'menuItemEditDialogComponent.security' | translate }}
2961
+ </label>
2962
+ <p-multiSelect
2963
+ appendTo="body"
2964
+ class="flex-auto"
2965
+ id="oip-menu-item-edit-dialog-roles-multi-select"
2966
+ placeholder="Select roles"
2967
+ [maxSelectedLabels]="10"
2968
+ [options]="roles"
2969
+ [(ngModel)]="item.viewRoles" />
2970
+ </div>
2971
+
2972
+ <div class="flex justify-end gap-2">
2973
+ <p-button
2974
+ id="oip-menu-item-edit-dialog-cancel-edit-button"
2975
+ label="{{ 'menuItemEditDialogComponent.cancel' | translate }}"
2976
+ severity="secondary"
2977
+ (click)="changeVisible()"
2978
+ (keydown)="changeVisible()" />
2979
+ <p-button
2980
+ id="oip-menu-item-edit-dialog-save-edit-button"
2981
+ label="{{ 'menuItemEditDialogComponent.save' | translate }}"
2982
+ (click)="save()"
2983
+ (keydown)="save()" />
2984
+ </div>
2985
+ </p-dialog>
2986
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2$3.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: i3$3.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { 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" }] }); }
2946
2987
  }
2947
2988
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuItemEditDialogComponent, decorators: [{
2948
2989
  type: Component,
@@ -2950,60 +2991,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
2950
2991
  imports: [ButtonModule, DialogModule, InputTextModule, FormsModule, TranslatePipe, MultiSelectModule],
2951
2992
  selector: 'menu-item-edit-dialog',
2952
2993
  standalone: true,
2953
- template: `
2954
- <p-dialog
2955
- header="{{ 'menuItemEditDialogComponent.header' | translate }}"
2956
- [modal]="true"
2957
- [style]="{ width: '40rem' }"
2958
- [(visible)]="visible">
2959
- <div class="flex items-center gap-4 mb-4 mt-1">
2960
- <label class="font-semibold w-1/3" for="oip-menu-item-edit-dialog-menu-input">
2961
- {{ 'menuItemEditDialogComponent.label' | translate }}
2962
- </label>
2963
- <input
2964
- autocomplete="off"
2965
- class="flex-auto"
2966
- id="oip-menu-item-edit-dialog-menu-input"
2967
- pInputText
2968
- [(ngModel)]="item.label" />
2969
- </div>
2970
-
2971
- <div class="flex items-center gap-4 mb-4">
2972
- <label class="font-semibold w-1/3" for="oip-menu-item-edit-dialog-icon">
2973
- {{ 'menuItemEditDialogComponent.icon' | translate }}
2974
- </label>
2975
- <i class="{{ item.icon }}"></i>
2976
- <input class="flex-auto" id="oip-menu-item-edit-dialog-icon" pInputText [(ngModel)]="item.icon" />
2977
- </div>
2978
-
2979
- <div class="flex items-center gap-4 mb-4">
2980
- <label class="font-semibold w-1/3" for="security">
2981
- {{ 'menuItemEditDialogComponent.security' | translate }}
2982
- </label>
2983
- <p-multiSelect
2984
- appendTo="body"
2985
- class="flex-auto"
2986
- id="oip-menu-item-edit-dialog-roles-multi-select"
2987
- placeholder="Select roles"
2988
- [maxSelectedLabels]="10"
2989
- [options]="roles"
2990
- [(ngModel)]="item.viewRoles" />
2991
- </div>
2992
-
2993
- <div class="flex justify-end gap-2">
2994
- <p-button
2995
- id="oip-menu-item-edit-dialog-cancel-edit-button"
2996
- label="{{ 'menuItemEditDialogComponent.cancel' | translate }}"
2997
- severity="secondary"
2998
- (click)="changeVisible()"
2999
- (keydown)="changeVisible()" />
3000
- <p-button
3001
- id="oip-menu-item-edit-dialog-save-edit-button"
3002
- label="{{ 'menuItemEditDialogComponent.save' | translate }}"
3003
- (click)="save()"
3004
- (keydown)="save()" />
3005
- </div>
3006
- </p-dialog>
2994
+ template: `
2995
+ <p-dialog
2996
+ header="{{ 'menuItemEditDialogComponent.header' | translate }}"
2997
+ [modal]="true"
2998
+ [style]="{ width: '40rem' }"
2999
+ [(visible)]="visible">
3000
+ <div class="flex items-center gap-4 mb-4 mt-1">
3001
+ <label class="font-semibold w-1/3" for="oip-menu-item-edit-dialog-menu-input">
3002
+ {{ 'menuItemEditDialogComponent.label' | translate }}
3003
+ </label>
3004
+ <input
3005
+ autocomplete="off"
3006
+ class="flex-auto"
3007
+ id="oip-menu-item-edit-dialog-menu-input"
3008
+ pInputText
3009
+ [(ngModel)]="item.label" />
3010
+ </div>
3011
+
3012
+ <div class="flex items-center gap-4 mb-4">
3013
+ <label class="font-semibold w-1/3" for="oip-menu-item-edit-dialog-icon">
3014
+ {{ 'menuItemEditDialogComponent.icon' | translate }}
3015
+ </label>
3016
+ <i class="{{ item.icon }}"></i>
3017
+ <input class="flex-auto" id="oip-menu-item-edit-dialog-icon" pInputText [(ngModel)]="item.icon" />
3018
+ </div>
3019
+
3020
+ <div class="flex items-center gap-4 mb-4">
3021
+ <label class="font-semibold w-1/3" for="security">
3022
+ {{ 'menuItemEditDialogComponent.security' | translate }}
3023
+ </label>
3024
+ <p-multiSelect
3025
+ appendTo="body"
3026
+ class="flex-auto"
3027
+ id="oip-menu-item-edit-dialog-roles-multi-select"
3028
+ placeholder="Select roles"
3029
+ [maxSelectedLabels]="10"
3030
+ [options]="roles"
3031
+ [(ngModel)]="item.viewRoles" />
3032
+ </div>
3033
+
3034
+ <div class="flex justify-end gap-2">
3035
+ <p-button
3036
+ id="oip-menu-item-edit-dialog-cancel-edit-button"
3037
+ label="{{ 'menuItemEditDialogComponent.cancel' | translate }}"
3038
+ severity="secondary"
3039
+ (click)="changeVisible()"
3040
+ (keydown)="changeVisible()" />
3041
+ <p-button
3042
+ id="oip-menu-item-edit-dialog-save-edit-button"
3043
+ label="{{ 'menuItemEditDialogComponent.save' | translate }}"
3044
+ (click)="save()"
3045
+ (keydown)="save()" />
3046
+ </div>
3047
+ </p-dialog>
3007
3048
  `
3008
3049
  }]
3009
3050
  }], propDecorators: { visible: [{
@@ -3035,31 +3076,31 @@ class MenuComponent {
3035
3076
  ];
3036
3077
  }
3037
3078
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3038
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MenuComponent, isStandalone: true, selector: "app-menu", providers: [MenuApi], viewQueries: [{ propertyName: "menuItemCreateDialogComponent", first: true, predicate: MenuItemCreateDialogComponent, descendants: true }, { propertyName: "menuItemEditDialogComponent", first: true, predicate: MenuItemEditDialogComponent, descendants: true }, { propertyName: "contextMenu", first: true, predicate: ContextMenu, descendants: true }], ngImport: i0, template: ` <div #empty class="layout-sidebar" (contextmenu)="onContextMenu($event)">
3039
- <ul class="layout-menu">
3040
- @for (item of menuService.menu; track item; let i = $index) {
3041
- <ng-container>
3042
- @if (item.separator) {
3043
- <li class="menu-separator"></li>
3044
- } @else {
3045
- <li
3046
- app-menuitem
3047
- [contextMenu]="contextMenu"
3048
- [index]="i"
3049
- [item]="item"
3050
- [menuItemCreateDialogComponent]="menuItemCreateDialogComponent"
3051
- [menuItemEditDialogComponent]="menuItemEditDialogComponent"
3052
- [root]="true"></li>
3053
- }
3054
- </ng-container>
3055
- }
3056
- </ul>
3057
- </div>
3058
- <p-contextMenu [target]="empty" />
3059
- @if (securityService.isAdmin) {
3060
- <menu-item-create-dialog />
3061
- <menu-item-edit-dialog />
3062
- }`, isInline: true, dependencies: [{ kind: "component", type: MenuItemComponent, selector: "[app-menuitem]", inputs: ["item", "index", "root", "parentKey", "menuItemCreateDialogComponent", "menuItemEditDialogComponent", "contextMenu"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: ContextMenuModule }, { kind: "component", type: i1$3.ContextMenu, selector: "p-contextMenu, p-contextmenu, p-context-menu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "autoZIndex", "baseZIndex", "id", "breakpoint", "ariaLabel", "ariaLabelledBy", "pressDelay", "appendTo"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: DialogModule }, { kind: "ngmodule", type: InputTextModule }, { kind: "component", type: MenuItemCreateDialogComponent, selector: "menu-item-create-dialog", inputs: ["visible"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: MenuItemEditDialogComponent, selector: "menu-item-edit-dialog", inputs: ["visible"], outputs: ["visibleChange"] }] }); }
3079
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: MenuComponent, isStandalone: true, selector: "app-menu", providers: [MenuApi], viewQueries: [{ propertyName: "menuItemCreateDialogComponent", first: true, predicate: MenuItemCreateDialogComponent, descendants: true }, { propertyName: "menuItemEditDialogComponent", first: true, predicate: MenuItemEditDialogComponent, descendants: true }, { propertyName: "contextMenu", first: true, predicate: ContextMenu, descendants: true }], ngImport: i0, template: ` <div #empty class="layout-sidebar" (contextmenu)="onContextMenu($event)">
3080
+ <ul class="layout-menu">
3081
+ @for (item of menuService.menu; track item; let i = $index) {
3082
+ <ng-container>
3083
+ @if (item.separator) {
3084
+ <li class="menu-separator"></li>
3085
+ } @else {
3086
+ <li
3087
+ app-menuitem
3088
+ [contextMenu]="contextMenu"
3089
+ [index]="i"
3090
+ [item]="item"
3091
+ [menuItemCreateDialogComponent]="menuItemCreateDialogComponent"
3092
+ [menuItemEditDialogComponent]="menuItemEditDialogComponent"
3093
+ [root]="true"></li>
3094
+ }
3095
+ </ng-container>
3096
+ }
3097
+ </ul>
3098
+ </div>
3099
+ <p-contextMenu [target]="empty" />
3100
+ @if (securityService.isAdmin) {
3101
+ <menu-item-create-dialog />
3102
+ <menu-item-edit-dialog />
3103
+ }`, isInline: true, dependencies: [{ kind: "component", type: MenuItemComponent, selector: "[app-menuitem]", inputs: ["item", "index", "root", "parentKey", "menuItemCreateDialogComponent", "menuItemEditDialogComponent", "contextMenu"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: ContextMenuModule }, { kind: "component", type: i1$4.ContextMenu, selector: "p-contextMenu, p-contextmenu, p-context-menu", inputs: ["model", "triggerEvent", "target", "global", "style", "styleClass", "autoZIndex", "baseZIndex", "id", "breakpoint", "ariaLabel", "ariaLabelledBy", "pressDelay", "appendTo"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: DialogModule }, { kind: "ngmodule", type: InputTextModule }, { kind: "component", type: MenuItemCreateDialogComponent, selector: "menu-item-create-dialog", inputs: ["visible"], outputs: ["visibleChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "component", type: MenuItemEditDialogComponent, selector: "menu-item-edit-dialog", inputs: ["visible"], outputs: ["visibleChange"] }] }); }
3063
3104
  }
3064
3105
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: MenuComponent, decorators: [{
3065
3106
  type: Component,
@@ -3077,30 +3118,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
3077
3118
  providers: [MenuApi],
3078
3119
  selector: 'app-menu',
3079
3120
  standalone: true,
3080
- template: ` <div #empty class="layout-sidebar" (contextmenu)="onContextMenu($event)">
3081
- <ul class="layout-menu">
3082
- @for (item of menuService.menu; track item; let i = $index) {
3083
- <ng-container>
3084
- @if (item.separator) {
3085
- <li class="menu-separator"></li>
3086
- } @else {
3087
- <li
3088
- app-menuitem
3089
- [contextMenu]="contextMenu"
3090
- [index]="i"
3091
- [item]="item"
3092
- [menuItemCreateDialogComponent]="menuItemCreateDialogComponent"
3093
- [menuItemEditDialogComponent]="menuItemEditDialogComponent"
3094
- [root]="true"></li>
3095
- }
3096
- </ng-container>
3097
- }
3098
- </ul>
3099
- </div>
3100
- <p-contextMenu [target]="empty" />
3101
- @if (securityService.isAdmin) {
3102
- <menu-item-create-dialog />
3103
- <menu-item-edit-dialog />
3121
+ template: ` <div #empty class="layout-sidebar" (contextmenu)="onContextMenu($event)">
3122
+ <ul class="layout-menu">
3123
+ @for (item of menuService.menu; track item; let i = $index) {
3124
+ <ng-container>
3125
+ @if (item.separator) {
3126
+ <li class="menu-separator"></li>
3127
+ } @else {
3128
+ <li
3129
+ app-menuitem
3130
+ [contextMenu]="contextMenu"
3131
+ [index]="i"
3132
+ [item]="item"
3133
+ [menuItemCreateDialogComponent]="menuItemCreateDialogComponent"
3134
+ [menuItemEditDialogComponent]="menuItemEditDialogComponent"
3135
+ [root]="true"></li>
3136
+ }
3137
+ </ng-container>
3138
+ }
3139
+ </ul>
3140
+ </div>
3141
+ <p-contextMenu [target]="empty" />
3142
+ @if (securityService.isAdmin) {
3143
+ <menu-item-create-dialog />
3144
+ <menu-item-edit-dialog />
3104
3145
  }`
3105
3146
  }]
3106
3147
  }], propDecorators: { menuItemCreateDialogComponent: [{
@@ -3207,19 +3248,19 @@ class AppLayoutComponent {
3207
3248
  }
3208
3249
  }
3209
3250
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3210
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AppLayoutComponent, isStandalone: true, selector: "app-layout", providers: [MenuService, MenuApi], viewQueries: [{ propertyName: "appSidebar", first: true, predicate: SidebarComponent, descendants: true }, { propertyName: "appTopBar", first: true, predicate: AppTopbar, descendants: true }], ngImport: i0, template: `
3211
- <div class="layout-wrapper" [ngClass]="containerClass">
3212
- <app-topbar></app-topbar>
3213
- <app-sidebar></app-sidebar>
3214
- <div class="layout-main-container">
3215
- <div class="layout-main">
3216
- <router-outlet></router-outlet>
3217
- </div>
3218
- <app-footer></app-footer>
3219
- </div>
3220
- <div class="layout-mask animate-fadein"></div>
3221
- </div>
3222
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: AppTopbar, selector: "app-topbar" }, { kind: "component", type: SidebarComponent, selector: "app-sidebar" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$2.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: FooterComponent, selector: "app-footer" }] }); }
3251
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AppLayoutComponent, isStandalone: true, selector: "app-layout", providers: [MenuService, MenuApi], viewQueries: [{ propertyName: "appSidebar", first: true, predicate: SidebarComponent, descendants: true }, { propertyName: "appTopBar", first: true, predicate: AppTopbar, descendants: true }], ngImport: i0, template: `
3252
+ <div class="layout-wrapper" [ngClass]="containerClass">
3253
+ <app-topbar></app-topbar>
3254
+ <app-sidebar></app-sidebar>
3255
+ <div class="layout-main-container">
3256
+ <div class="layout-main">
3257
+ <router-outlet></router-outlet>
3258
+ </div>
3259
+ <app-footer></app-footer>
3260
+ </div>
3261
+ <div class="layout-mask animate-fadein"></div>
3262
+ </div>
3263
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: AppTopbar, selector: "app-topbar" }, { kind: "component", type: SidebarComponent, selector: "app-sidebar" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i1$3.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: FooterComponent, selector: "app-footer" }] }); }
3223
3264
  }
3224
3265
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppLayoutComponent, decorators: [{
3225
3266
  type: Component,
@@ -3227,18 +3268,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
3227
3268
  selector: 'app-layout',
3228
3269
  standalone: true,
3229
3270
  imports: [CommonModule, AppTopbar, SidebarComponent, RouterModule, FooterComponent],
3230
- template: `
3231
- <div class="layout-wrapper" [ngClass]="containerClass">
3232
- <app-topbar></app-topbar>
3233
- <app-sidebar></app-sidebar>
3234
- <div class="layout-main-container">
3235
- <div class="layout-main">
3236
- <router-outlet></router-outlet>
3237
- </div>
3238
- <app-footer></app-footer>
3239
- </div>
3240
- <div class="layout-mask animate-fadein"></div>
3241
- </div>
3271
+ template: `
3272
+ <div class="layout-wrapper" [ngClass]="containerClass">
3273
+ <app-topbar></app-topbar>
3274
+ <app-sidebar></app-sidebar>
3275
+ <div class="layout-main-container">
3276
+ <div class="layout-main">
3277
+ <router-outlet></router-outlet>
3278
+ </div>
3279
+ <app-footer></app-footer>
3280
+ </div>
3281
+ <div class="layout-mask animate-fadein"></div>
3282
+ </div>
3242
3283
  `,
3243
3284
  providers: [MenuService, MenuApi]
3244
3285
  }]
@@ -3286,7 +3327,7 @@ class AppFloatingConfiguratorComponent {
3286
3327
  <app-configurator />
3287
3328
  </div>
3288
3329
  </div>
3289
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i3$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfiguratorComponent, selector: "app-configurator" }] }); }
3330
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i3$1.StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: AppConfiguratorComponent, selector: "app-configurator" }] }); }
3290
3331
  }
3291
3332
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppFloatingConfiguratorComponent, decorators: [{
3292
3333
  type: Component,
@@ -3425,7 +3466,7 @@ class NotfoundComponent {
3425
3466
  </div>
3426
3467
  </div>
3427
3468
  </div>
3428
- </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" }] }); }
3469
+ </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" }] }); }
3429
3470
  }
3430
3471
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: NotfoundComponent, decorators: [{
3431
3472
  type: Component,
@@ -3490,7 +3531,7 @@ class UnauthorizedComponent {
3490
3531
  </div>
3491
3532
  </div>
3492
3533
  </div>
3493
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$1.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: "component", type: LogoComponent, selector: "logo", inputs: ["width", "height"] }, { kind: "component", type: AppFloatingConfiguratorComponent, selector: "app-floating-configurator" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
3534
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i1$2.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: RippleModule }, { kind: "component", type: LogoComponent, selector: "logo", inputs: ["width", "height"] }, { kind: "component", type: AppFloatingConfiguratorComponent, selector: "app-floating-configurator" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
3494
3535
  }
3495
3536
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: UnauthorizedComponent, decorators: [{
3496
3537
  type: Component,
@@ -3567,7 +3608,7 @@ class ErrorComponent {
3567
3608
  </div>
3568
3609
  </div>
3569
3610
  </div>
3570
- </div>`, isInline: true, dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1$1.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$2.Ripple, selector: "[pRipple]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
3611
+ </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$2.Ripple, selector: "[pRipple]" }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] }); }
3571
3612
  }
3572
3613
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ErrorComponent, decorators: [{
3573
3614
  type: Component,
@@ -3640,7 +3681,7 @@ class ProfileComponent {
3640
3681
  [auto]="true"
3641
3682
  (onUpload)="onBasicUploadAuto($event)" />
3642
3683
  </div>
3643
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FileUploadModule }, { kind: "component", type: i1$4.FileUpload, selector: "p-fileupload, p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "ngmodule", type: ImageModule }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i4.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
3684
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FileUploadModule }, { kind: "component", type: i1$5.FileUpload, selector: "p-fileupload, p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "uploadStyleClass", "cancelStyleClass", "removeStyleClass", "chooseStyleClass", "chooseButtonProps", "uploadButtonProps", "cancelButtonProps", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler", "onImageError", "onRemoveUploadedFile"] }, { kind: "ngmodule", type: ImageModule }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2$2.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
3644
3685
  }
3645
3686
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ProfileComponent, decorators: [{
3646
3687
  type: Component,
@@ -3807,7 +3848,7 @@ class ConfigComponent {
3807
3848
  </div>
3808
3849
  }
3809
3850
  </div>
3810
- `, 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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.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" }] }); }
3851
+ `, 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" }] }); }
3811
3852
  }
3812
3853
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ConfigComponent, decorators: [{
3813
3854
  type: Component,
@@ -4030,7 +4071,7 @@ class DbMigrationComponent extends BaseModuleComponent {
4030
4071
  } @else if (isSecurity) {
4031
4072
  <security [controller]="controller" [id]="id" />
4032
4073
  }
4033
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: TableModule }, { kind: "component", type: i1$5.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$5.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1$5.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i1$5.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i1$5.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i1$5.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$1.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" }] }); }
4074
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: TableModule }, { kind: "component", type: i1$6.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$6.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i1$6.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i1$6.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i1$6.CancelEditableRow, selector: "[pCancelEditableRow]" }, { kind: "component", type: i1$6.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" }] }); }
4034
4075
  }
4035
4076
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DbMigrationComponent, decorators: [{
4036
4077
  type: Component,
@@ -4271,61 +4312,61 @@ class AppModulesComponent {
4271
4312
  });
4272
4313
  }
4273
4314
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppModulesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4274
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AppModulesComponent, isStandalone: true, selector: "app-modules", providers: [ConfirmationService, ModuleApi], ngImport: i0, template: `
4275
- <p-confirmDialog></p-confirmDialog>
4276
- <div class="flex flex-col md:flex-row gap-4">
4277
- <div class="card w-full">
4278
- <div class="font-semibold text-xl mb-4">
4279
- {{ l10n.title }}
4280
- </div>
4281
- <div class="mb-4">
4282
- <p-toolbar>
4283
- <p-button
4284
- icon="pi pi-refresh"
4285
- rounded="true"
4286
- severity="secondary"
4287
- text="true"
4288
- tooltipPosition="bottom"
4289
- [pTooltip]="'app-modules.refreshTooltip' | translate"
4290
- (onClick)="refreshAction()"></p-button>
4291
- </p-toolbar>
4292
- </div>
4293
- <p-table class="mt-4" [paginator]="true" [rows]="100" [value]="modules">
4294
- <ng-template pTemplate="header">
4295
- <tr>
4296
- <th>{{ 'app-modules.table.moduleId' | translate }}</th>
4297
- <th>{{ 'app-modules.table.name' | translate }}</th>
4298
- <th>{{ 'app-modules.table.currentlyLoaded' | translate }}</th>
4299
- <th style="width: 4rem"></th>
4300
- </tr>
4301
- </ng-template>
4302
- <ng-template let-module pTemplate="body">
4303
- <tr>
4304
- <td>{{ module.moduleId }}</td>
4305
- <td>{{ module.name }}</td>
4306
- <td>
4307
- <p-tag
4308
- [severity]="module.currentlyLoaded ? 'success' : 'danger'"
4309
- [value]="
4310
- (module.currentlyLoaded ? 'app-modules.table.yes' : 'app-modules.table.no') | translate
4311
- "></p-tag>
4312
- </td>
4313
- <td>
4314
- <p-button
4315
- icon="pi pi-trash"
4316
- rounded="true"
4317
- severity="danger"
4318
- text="true"
4319
- tooltipPosition="bottom"
4320
- [pTooltip]="'app-modules.table.deleteTooltip' | translate"
4321
- (onClick)="deleteModule(module)"></p-button>
4322
- </td>
4323
- </tr>
4324
- </ng-template>
4325
- </p-table>
4326
- </div>
4327
- </div>
4328
- `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i1$5.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$5.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$1.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: i4$2.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: "pipe", type: TranslatePipe, name: "translate" }] }); }
4315
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: AppModulesComponent, isStandalone: true, selector: "app-modules", providers: [ConfirmationService, ModuleApi], ngImport: i0, template: `
4316
+ <p-confirmDialog></p-confirmDialog>
4317
+ <div class="flex flex-col md:flex-row gap-4">
4318
+ <div class="card w-full">
4319
+ <div class="font-semibold text-xl mb-4">
4320
+ {{ l10n.title }}
4321
+ </div>
4322
+ <div class="mb-4">
4323
+ <p-toolbar>
4324
+ <p-button
4325
+ icon="pi pi-refresh"
4326
+ rounded="true"
4327
+ severity="secondary"
4328
+ text="true"
4329
+ tooltipPosition="bottom"
4330
+ [pTooltip]="'app-modules.refreshTooltip' | translate"
4331
+ (onClick)="refreshAction()"></p-button>
4332
+ </p-toolbar>
4333
+ </div>
4334
+ <p-table class="mt-4" [paginator]="true" [rows]="100" [value]="modules">
4335
+ <ng-template pTemplate="header">
4336
+ <tr>
4337
+ <th>{{ 'app-modules.table.moduleId' | translate }}</th>
4338
+ <th>{{ 'app-modules.table.name' | translate }}</th>
4339
+ <th>{{ 'app-modules.table.currentlyLoaded' | translate }}</th>
4340
+ <th style="width: 4rem"></th>
4341
+ </tr>
4342
+ </ng-template>
4343
+ <ng-template let-module pTemplate="body">
4344
+ <tr>
4345
+ <td>{{ module.moduleId }}</td>
4346
+ <td>{{ module.name }}</td>
4347
+ <td>
4348
+ <p-tag
4349
+ [severity]="module.currentlyLoaded ? 'success' : 'danger'"
4350
+ [value]="
4351
+ (module.currentlyLoaded ? 'app-modules.table.yes' : 'app-modules.table.no') | translate
4352
+ "></p-tag>
4353
+ </td>
4354
+ <td>
4355
+ <p-button
4356
+ icon="pi pi-trash"
4357
+ rounded="true"
4358
+ severity="danger"
4359
+ text="true"
4360
+ tooltipPosition="bottom"
4361
+ [pTooltip]="'app-modules.table.deleteTooltip' | translate"
4362
+ (onClick)="deleteModule(module)"></p-button>
4363
+ </td>
4364
+ </tr>
4365
+ </ng-template>
4366
+ </p-table>
4367
+ </div>
4368
+ </div>
4369
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i1$6.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$6.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: i4$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: "pipe", type: TranslatePipe, name: "translate" }] }); }
4329
4370
  }
4330
4371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: AppModulesComponent, decorators: [{
4331
4372
  type: Component,
@@ -4333,64 +4374,1429 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
4333
4374
  imports: [FormsModule, TableModule, Tag, ButtonModule, ToolbarModule, Tooltip, ConfirmDialog, TranslatePipe],
4334
4375
  providers: [ConfirmationService, ModuleApi],
4335
4376
  selector: 'app-modules',
4336
- template: `
4337
- <p-confirmDialog></p-confirmDialog>
4338
- <div class="flex flex-col md:flex-row gap-4">
4339
- <div class="card w-full">
4340
- <div class="font-semibold text-xl mb-4">
4341
- {{ l10n.title }}
4342
- </div>
4343
- <div class="mb-4">
4344
- <p-toolbar>
4345
- <p-button
4346
- icon="pi pi-refresh"
4347
- rounded="true"
4348
- severity="secondary"
4349
- text="true"
4350
- tooltipPosition="bottom"
4351
- [pTooltip]="'app-modules.refreshTooltip' | translate"
4352
- (onClick)="refreshAction()"></p-button>
4353
- </p-toolbar>
4354
- </div>
4355
- <p-table class="mt-4" [paginator]="true" [rows]="100" [value]="modules">
4356
- <ng-template pTemplate="header">
4357
- <tr>
4358
- <th>{{ 'app-modules.table.moduleId' | translate }}</th>
4359
- <th>{{ 'app-modules.table.name' | translate }}</th>
4360
- <th>{{ 'app-modules.table.currentlyLoaded' | translate }}</th>
4361
- <th style="width: 4rem"></th>
4362
- </tr>
4363
- </ng-template>
4364
- <ng-template let-module pTemplate="body">
4365
- <tr>
4366
- <td>{{ module.moduleId }}</td>
4367
- <td>{{ module.name }}</td>
4368
- <td>
4369
- <p-tag
4370
- [severity]="module.currentlyLoaded ? 'success' : 'danger'"
4371
- [value]="
4372
- (module.currentlyLoaded ? 'app-modules.table.yes' : 'app-modules.table.no') | translate
4373
- "></p-tag>
4374
- </td>
4375
- <td>
4376
- <p-button
4377
- icon="pi pi-trash"
4378
- rounded="true"
4379
- severity="danger"
4380
- text="true"
4381
- tooltipPosition="bottom"
4382
- [pTooltip]="'app-modules.table.deleteTooltip' | translate"
4383
- (onClick)="deleteModule(module)"></p-button>
4384
- </td>
4385
- </tr>
4386
- </ng-template>
4387
- </p-table>
4388
- </div>
4389
- </div>
4377
+ template: `
4378
+ <p-confirmDialog></p-confirmDialog>
4379
+ <div class="flex flex-col md:flex-row gap-4">
4380
+ <div class="card w-full">
4381
+ <div class="font-semibold text-xl mb-4">
4382
+ {{ l10n.title }}
4383
+ </div>
4384
+ <div class="mb-4">
4385
+ <p-toolbar>
4386
+ <p-button
4387
+ icon="pi pi-refresh"
4388
+ rounded="true"
4389
+ severity="secondary"
4390
+ text="true"
4391
+ tooltipPosition="bottom"
4392
+ [pTooltip]="'app-modules.refreshTooltip' | translate"
4393
+ (onClick)="refreshAction()"></p-button>
4394
+ </p-toolbar>
4395
+ </div>
4396
+ <p-table class="mt-4" [paginator]="true" [rows]="100" [value]="modules">
4397
+ <ng-template pTemplate="header">
4398
+ <tr>
4399
+ <th>{{ 'app-modules.table.moduleId' | translate }}</th>
4400
+ <th>{{ 'app-modules.table.name' | translate }}</th>
4401
+ <th>{{ 'app-modules.table.currentlyLoaded' | translate }}</th>
4402
+ <th style="width: 4rem"></th>
4403
+ </tr>
4404
+ </ng-template>
4405
+ <ng-template let-module pTemplate="body">
4406
+ <tr>
4407
+ <td>{{ module.moduleId }}</td>
4408
+ <td>{{ module.name }}</td>
4409
+ <td>
4410
+ <p-tag
4411
+ [severity]="module.currentlyLoaded ? 'success' : 'danger'"
4412
+ [value]="
4413
+ (module.currentlyLoaded ? 'app-modules.table.yes' : 'app-modules.table.no') | translate
4414
+ "></p-tag>
4415
+ </td>
4416
+ <td>
4417
+ <p-button
4418
+ icon="pi pi-trash"
4419
+ rounded="true"
4420
+ severity="danger"
4421
+ text="true"
4422
+ tooltipPosition="bottom"
4423
+ [pTooltip]="'app-modules.table.deleteTooltip' | translate"
4424
+ (onClick)="deleteModule(module)"></p-button>
4425
+ </td>
4426
+ </tr>
4427
+ </ng-template>
4428
+ </p-table>
4429
+ </div>
4430
+ </div>
4390
4431
  `
4391
4432
  }]
4392
4433
  }] });
4393
4434
 
4435
+ /* eslint-disable */
4436
+ /* tslint:disable */
4437
+ // @ts-nocheck
4438
+ class DiscussionApi extends HttpClient {
4439
+ constructor() {
4440
+ super(...arguments);
4441
+ /**
4442
+ * @description Gets comments by object type and object identifier.
4443
+ *
4444
+ * @tags Discussion
4445
+ * @name getByObject
4446
+ * @summary Gets comments by object type and object identifier.
4447
+ * @request GET:/api/discussion/get-by-object
4448
+ * @secure
4449
+ * @response `200` `(CommentDto)[]` OK
4450
+ * @response `401` `ApiExceptionResponse` Unauthorized
4451
+ */
4452
+ this.getByObject = (query, params = {}) => this.request({
4453
+ path: `/api/discussion/get-by-object`,
4454
+ method: "GET",
4455
+ query: query,
4456
+ secure: true,
4457
+ format: "json",
4458
+ ...params,
4459
+ });
4460
+ /**
4461
+ * @description Gets a comment by identifier.
4462
+ *
4463
+ * @tags Discussion
4464
+ * @name getById
4465
+ * @summary Gets a comment by identifier.
4466
+ * @request GET:/api/discussion/get-by-id
4467
+ * @secure
4468
+ * @response `200` `CommentDto` OK
4469
+ * @response `401` `ApiExceptionResponse` Unauthorized
4470
+ * @response `404` `ApiExceptionResponse` Not Found
4471
+ */
4472
+ this.getById = (query, params = {}) => this.request({
4473
+ path: `/api/discussion/get-by-id`,
4474
+ method: "GET",
4475
+ query: query,
4476
+ secure: true,
4477
+ format: "json",
4478
+ ...params,
4479
+ });
4480
+ /**
4481
+ * @description Creates a new comment
4482
+ *
4483
+ * @tags Discussion
4484
+ * @name create
4485
+ * @summary Creates a new comment
4486
+ * @request POST:/api/discussion/create
4487
+ * @secure
4488
+ * @response `200` `CommentDto` OK
4489
+ * @response `400` `ApiExceptionResponse` Bad Request
4490
+ * @response `401` `ApiExceptionResponse` Unauthorized
4491
+ */
4492
+ this.create = (data, params = {}) => this.request({
4493
+ path: `/api/discussion/create`,
4494
+ method: "POST",
4495
+ body: data,
4496
+ secure: true,
4497
+ type: ContentType.Json,
4498
+ format: "json",
4499
+ ...params,
4500
+ });
4501
+ /**
4502
+ * @description Updates an existing comment.
4503
+ *
4504
+ * @tags Discussion
4505
+ * @name update
4506
+ * @summary Updates an existing comment.
4507
+ * @request PUT:/api/discussion/update/{id}
4508
+ * @secure
4509
+ * @response `200` `CommentDto` OK
4510
+ * @response `400` `ApiExceptionResponse` Bad Request
4511
+ * @response `401` `ApiExceptionResponse` Unauthorized
4512
+ * @response `403` `ApiExceptionResponse` Forbidden
4513
+ * @response `404` `ApiExceptionResponse` Not Found
4514
+ */
4515
+ this.update = ({ id, ...query }, data, params = {}) => this.request({
4516
+ path: `/api/discussion/update/${id}`,
4517
+ method: "PUT",
4518
+ body: data,
4519
+ secure: true,
4520
+ type: ContentType.Json,
4521
+ format: "json",
4522
+ ...params,
4523
+ });
4524
+ /**
4525
+ * @description Soft deletes a comment.
4526
+ *
4527
+ * @tags Discussion
4528
+ * @name delete
4529
+ * @summary Soft deletes a comment.
4530
+ * @request DELETE:/api/discussion/delete/{id}
4531
+ * @secure
4532
+ * @response `204` `void` No Content
4533
+ * @response `401` `ApiExceptionResponse` Unauthorized
4534
+ * @response `403` `ApiExceptionResponse` Forbidden
4535
+ * @response `404` `ApiExceptionResponse` Not Found
4536
+ */
4537
+ this.delete = ({ id, ...query }, params = {}) => this.request({
4538
+ path: `/api/discussion/delete/${id}`,
4539
+ method: "DELETE",
4540
+ secure: true,
4541
+ ...params,
4542
+ });
4543
+ /**
4544
+ * @description Gets edit history for a comment.
4545
+ *
4546
+ * @tags Discussion
4547
+ * @name getHistory
4548
+ * @summary Gets edit history for a comment.
4549
+ * @request GET:/api/discussion/get-history/{id}
4550
+ * @secure
4551
+ * @response `200` `(CommentHistoryDto)[]` OK
4552
+ * @response `401` `ApiExceptionResponse` Unauthorized
4553
+ * @response `404` `ApiExceptionResponse` Not Found
4554
+ */
4555
+ this.getHistory = ({ id, ...query }, params = {}) => this.request({
4556
+ path: `/api/discussion/get-history/${id}`,
4557
+ method: "GET",
4558
+ secure: true,
4559
+ format: "json",
4560
+ ...params,
4561
+ });
4562
+ /**
4563
+ * @description Uploads an attachment for a comment.
4564
+ *
4565
+ * @tags Discussion
4566
+ * @name uploadAttachment
4567
+ * @summary Uploads an attachment for a comment.
4568
+ * @request POST:/api/discussion/upload-attachment
4569
+ * @secure
4570
+ * @response `200` `AttachmentDto` OK
4571
+ * @response `400` `ApiExceptionResponse` Bad Request
4572
+ * @response `401` `ApiExceptionResponse` Unauthorized
4573
+ * @response `403` `ApiExceptionResponse` Forbidden
4574
+ * @response `404` `ApiExceptionResponse` Not Found
4575
+ */
4576
+ this.uploadAttachment = (data, params = {}) => this.request({
4577
+ path: `/api/discussion/upload-attachment`,
4578
+ method: "POST",
4579
+ body: data,
4580
+ secure: true,
4581
+ type: ContentType.FormData,
4582
+ format: "json",
4583
+ ...params,
4584
+ });
4585
+ /**
4586
+ * @description Deletes an attachment.
4587
+ *
4588
+ * @tags Discussion
4589
+ * @name deleteAttachment
4590
+ * @summary Deletes an attachment.
4591
+ * @request DELETE:/api/discussion/delete-attachment/{id}
4592
+ * @secure
4593
+ * @response `204` `void` No Content
4594
+ * @response `401` `ApiExceptionResponse` Unauthorized
4595
+ * @response `403` `ApiExceptionResponse` Forbidden
4596
+ * @response `404` `ApiExceptionResponse` Not Found
4597
+ */
4598
+ this.deleteAttachment = ({ id, ...query }, params = {}) => this.request({
4599
+ path: `/api/discussion/delete-attachment/${id}`,
4600
+ method: "DELETE",
4601
+ secure: true,
4602
+ ...params,
4603
+ });
4604
+ /**
4605
+ * @description Downloads attachment content.
4606
+ *
4607
+ * @tags Discussion
4608
+ * @name getAttachmentContent
4609
+ * @summary Downloads attachment content.
4610
+ * @request GET:/api/discussion/get-attachment-content/{id}
4611
+ * @secure
4612
+ * @response `200` `void` OK
4613
+ * @response `401` `ApiExceptionResponse` Unauthorized
4614
+ * @response `404` `ApiExceptionResponse` Not Found
4615
+ */
4616
+ this.getAttachmentContent = ({ id, ...query }, params = {}) => this.request({
4617
+ path: `/api/discussion/get-attachment-content/${id}`,
4618
+ method: "GET",
4619
+ secure: true,
4620
+ ...params,
4621
+ });
4622
+ /**
4623
+ * @description Adds or toggles a reaction for a comment.
4624
+ *
4625
+ * @tags Discussion
4626
+ * @name addReaction
4627
+ * @summary Adds or toggles a reaction for a comment.
4628
+ * @request POST:/api/discussion/add-reaction
4629
+ * @secure
4630
+ * @response `200` `(CommentReactionDto)[]` OK
4631
+ * @response `400` `ApiExceptionResponse` Bad Request
4632
+ * @response `401` `ApiExceptionResponse` Unauthorized
4633
+ * @response `404` `ApiExceptionResponse` Not Found
4634
+ */
4635
+ this.addReaction = (data, params = {}) => this.request({
4636
+ path: `/api/discussion/add-reaction`,
4637
+ method: "POST",
4638
+ body: data,
4639
+ secure: true,
4640
+ type: ContentType.Json,
4641
+ format: "json",
4642
+ ...params,
4643
+ });
4644
+ /**
4645
+ * @description Removes a reaction from a comment.
4646
+ *
4647
+ * @tags Discussion
4648
+ * @name removeReaction
4649
+ * @summary Removes a reaction from a comment.
4650
+ * @request DELETE:/api/discussion/remove-reaction
4651
+ * @secure
4652
+ * @response `200` `(CommentReactionDto)[]` OK
4653
+ * @response `401` `ApiExceptionResponse` Unauthorized
4654
+ * @response `404` `ApiExceptionResponse` Not Found
4655
+ */
4656
+ this.removeReaction = (query, params = {}) => this.request({
4657
+ path: `/api/discussion/remove-reaction`,
4658
+ method: "DELETE",
4659
+ query: query,
4660
+ secure: true,
4661
+ format: "json",
4662
+ ...params,
4663
+ });
4664
+ /**
4665
+ * @description Searches users that can be mentioned in a comment.
4666
+ *
4667
+ * @tags Discussion
4668
+ * @name searchMentionUsers
4669
+ * @summary Searches users that can be mentioned in a comment.
4670
+ * @request GET:/api/discussion/search-mention-users
4671
+ * @secure
4672
+ * @response `200` `(MentionUserDto)[]` OK
4673
+ * @response `400` `ApiExceptionResponse` Bad Request
4674
+ * @response `401` `ApiExceptionResponse` Unauthorized
4675
+ */
4676
+ this.searchMentionUsers = (query, params = {}) => this.request({
4677
+ path: `/api/discussion/search-mention-users`,
4678
+ method: "GET",
4679
+ query: query,
4680
+ secure: true,
4681
+ format: "json",
4682
+ ...params,
4683
+ });
4684
+ }
4685
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DiscussionApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
4686
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DiscussionApi }); }
4687
+ }
4688
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DiscussionApi, decorators: [{
4689
+ type: Injectable
4690
+ }] });
4691
+
4692
+ function getInitialsFromString(input) {
4693
+ if (!input || input.trim().length === 0) {
4694
+ return '';
4695
+ }
4696
+ const words = input.trim().split(/\s+/);
4697
+ if (words.length === 1) {
4698
+ return words[0].charAt(0).toUpperCase();
4699
+ }
4700
+ const firstInitial = words[0].charAt(0).toUpperCase();
4701
+ const lastInitial = words[words.length - 1].charAt(0).toUpperCase();
4702
+ return firstInitial + lastInitial;
4703
+ }
4704
+
4705
+ class DiscussionComponent {
4706
+ constructor() {
4707
+ this.msgService = inject(MsgService);
4708
+ this.discussionApi = inject(DiscussionApi);
4709
+ this.sanitizer = inject(DomSanitizer);
4710
+ this.translateService = inject(TranslateService);
4711
+ this.cdr = inject(ChangeDetectorRef);
4712
+ this.confirmationService = inject(ConfirmationService);
4713
+ this.layoutService = inject(LayoutService);
4714
+ this.objectTypeId = 1;
4715
+ this.objectId = 1;
4716
+ this.comments = [];
4717
+ this.loading = false;
4718
+ this.submitting = false;
4719
+ this.previewMode = false;
4720
+ this.newComment = '';
4721
+ this.editContent = '';
4722
+ this.editingCommentId = null;
4723
+ this.pendingFiles = [];
4724
+ this.mentionSuggestions = [];
4725
+ this.historyByComment = {};
4726
+ this.emojiPalette = ['👍', '👎', '🐳', '🍆', '🍑'];
4727
+ this.mentionSearchTimer = null;
4728
+ this.getInitialsFromString = getInitialsFromString;
4729
+ }
4730
+ ngOnChanges(changes) {
4731
+ if ((changes['objectTypeId'] || changes['objectId']) && this.objectTypeId && this.objectId) {
4732
+ this.loadComments().then();
4733
+ }
4734
+ }
4735
+ async ngOnInit() {
4736
+ await this.loadComments();
4737
+ }
4738
+ ngOnDestroy() {
4739
+ if (this.mentionSearchTimer) {
4740
+ clearTimeout(this.mentionSearchTimer);
4741
+ }
4742
+ }
4743
+ async loadComments() {
4744
+ if (!this.objectTypeId || !this.objectId) {
4745
+ return;
4746
+ }
4747
+ this.loading = true;
4748
+ this.cdr.markForCheck();
4749
+ try {
4750
+ const items = await this.discussionApi.getByObject({
4751
+ objectTypeId: this.objectTypeId,
4752
+ objectId: this.objectId,
4753
+ skip: 0,
4754
+ take: 50
4755
+ });
4756
+ this.comments = items.map((item) => this.normalizeComment(item));
4757
+ }
4758
+ catch (error) {
4759
+ this.msgService.errorFromException(error, this.translateService.instant('discussionComponent.errors.loadComments'));
4760
+ }
4761
+ finally {
4762
+ this.loading = false;
4763
+ this.cdr.markForCheck();
4764
+ }
4765
+ }
4766
+ async createComment() {
4767
+ const content = this.newComment.trim();
4768
+ if (!content) {
4769
+ return;
4770
+ }
4771
+ this.submitting = true;
4772
+ this.cdr.markForCheck();
4773
+ try {
4774
+ const created = await this.discussionApi.create({
4775
+ objectTypeId: this.objectTypeId,
4776
+ objectId: this.objectId,
4777
+ content
4778
+ });
4779
+ if (this.pendingFiles.length > 0) {
4780
+ for (const file of this.pendingFiles) {
4781
+ await this.discussionApi.uploadAttachment({
4782
+ CommentId: created.commentId,
4783
+ File: file
4784
+ });
4785
+ }
4786
+ }
4787
+ this.newComment = '';
4788
+ this.pendingFiles = [];
4789
+ this.previewMode = false;
4790
+ this.mentionSuggestions = [];
4791
+ await this.loadComments();
4792
+ }
4793
+ catch (error) {
4794
+ this.msgService.errorFromException(error, this.translateService.instant('discussionComponent.errors.createComment'));
4795
+ }
4796
+ finally {
4797
+ this.submitting = false;
4798
+ this.cdr.markForCheck();
4799
+ }
4800
+ }
4801
+ startEdit(comment) {
4802
+ this.editingCommentId = comment.commentId;
4803
+ this.editContent = comment.content;
4804
+ }
4805
+ cancelEdit() {
4806
+ this.editingCommentId = null;
4807
+ this.editContent = '';
4808
+ }
4809
+ async saveEdit(comment) {
4810
+ try {
4811
+ const updated = await this.discussionApi.update({ id: comment.commentId }, { content: this.editContent.trim() });
4812
+ this.comments = this.comments.map((item) => item.commentId === comment.commentId ? this.normalizeComment(updated) : item);
4813
+ this.cancelEdit();
4814
+ }
4815
+ catch (error) {
4816
+ this.msgService.errorFromException(error, this.translateService.instant('discussionComponent.errors.updateComment'));
4817
+ }
4818
+ finally {
4819
+ this.cdr.markForCheck();
4820
+ }
4821
+ }
4822
+ deleteComment(comment) {
4823
+ this.confirmationService.confirm({
4824
+ header: this.translateService.instant('discussionComponent.warning'),
4825
+ message: this.translateService.instant('discussionComponent.confirmDeleteComment'),
4826
+ icon: 'pi pi-trash',
4827
+ rejectButtonProps: {
4828
+ label: this.translateService.instant('discussionComponent.cancel'),
4829
+ severity: 'secondary',
4830
+ outlined: true
4831
+ },
4832
+ acceptButtonProps: {
4833
+ label: this.translateService.instant('discussionComponent.delete'),
4834
+ severity: 'danger'
4835
+ },
4836
+ accept: async () => {
4837
+ await this.performDeleteComment(comment);
4838
+ }
4839
+ });
4840
+ }
4841
+ async toggleHistory(comment) {
4842
+ const current = this.historyByComment[comment.commentId];
4843
+ if (current?.opened) {
4844
+ this.historyByComment[comment.commentId] = { ...current, opened: false };
4845
+ return;
4846
+ }
4847
+ this.historyByComment[comment.commentId] = {
4848
+ opened: true,
4849
+ loading: true,
4850
+ items: current?.items ?? []
4851
+ };
4852
+ this.cdr.markForCheck();
4853
+ try {
4854
+ const items = await this.discussionApi.getHistory({ id: comment.commentId });
4855
+ this.historyByComment[comment.commentId] = {
4856
+ opened: true,
4857
+ loading: false,
4858
+ items: items.map((item) => this.normalizeHistoryItem(item))
4859
+ };
4860
+ }
4861
+ catch (error) {
4862
+ this.msgService.errorFromException(error, this.translateService.instant('discussionComponent.errors.loadEditHistory'));
4863
+ this.historyByComment[comment.commentId] = {
4864
+ opened: false,
4865
+ loading: false,
4866
+ items: []
4867
+ };
4868
+ }
4869
+ finally {
4870
+ this.cdr.markForCheck();
4871
+ }
4872
+ }
4873
+ onFilesSelected(event) {
4874
+ const input = event.target;
4875
+ this.pendingFiles = [...this.pendingFiles, ...Array.from(input.files ?? [])];
4876
+ input.value = '';
4877
+ }
4878
+ removePendingFile(file) {
4879
+ this.pendingFiles = this.pendingFiles.filter((item) => item !== file);
4880
+ }
4881
+ async onInlineFilesSelected(comment, event) {
4882
+ const input = event.target;
4883
+ const files = Array.from(input.files ?? []);
4884
+ input.value = '';
4885
+ try {
4886
+ for (const file of files) {
4887
+ await this.discussionApi.uploadAttachment({
4888
+ CommentId: comment.commentId,
4889
+ File: file
4890
+ });
4891
+ }
4892
+ await this.loadComments();
4893
+ }
4894
+ catch (error) {
4895
+ this.msgService.errorFromException(error, this.translateService.instant('discussionComponent.errors.uploadAttachment'));
4896
+ this.cdr.markForCheck();
4897
+ }
4898
+ }
4899
+ deleteAttachment(comment, attachment) {
4900
+ this.confirmationService.confirm({
4901
+ header: this.translateService.instant('discussionComponent.warning'),
4902
+ message: this.translateService.instant('discussionComponent.confirmDeleteFile', { fileName: attachment.fileName }),
4903
+ icon: 'pi pi-trash',
4904
+ rejectButtonProps: {
4905
+ label: this.translateService.instant('discussionComponent.cancel'),
4906
+ severity: 'secondary',
4907
+ outlined: true
4908
+ },
4909
+ acceptButtonProps: {
4910
+ label: this.translateService.instant('discussionComponent.delete'),
4911
+ severity: 'danger'
4912
+ },
4913
+ accept: async () => {
4914
+ await this.performDeleteAttachment(comment, attachment);
4915
+ }
4916
+ });
4917
+ }
4918
+ async performDeleteComment(comment) {
4919
+ try {
4920
+ await this.discussionApi.delete({ id: comment.commentId });
4921
+ this.comments = this.comments.filter((item) => item.commentId !== comment.commentId);
4922
+ }
4923
+ catch (error) {
4924
+ this.msgService.errorFromException(error, this.translateService.instant('discussionComponent.errors.deleteComment'));
4925
+ }
4926
+ finally {
4927
+ this.cdr.markForCheck();
4928
+ }
4929
+ }
4930
+ async performDeleteAttachment(comment, attachment) {
4931
+ try {
4932
+ await this.discussionApi.deleteAttachment({ id: attachment.attachmentId });
4933
+ this.comments = this.comments.map((item) => item.commentId === comment.commentId
4934
+ ? { ...item, attachments: item.attachments.filter((entry) => entry.attachmentId !== attachment.attachmentId) }
4935
+ : item);
4936
+ }
4937
+ catch (error) {
4938
+ this.msgService.errorFromException(error, this.translateService.instant('discussionComponent.errors.deleteAttachment'));
4939
+ }
4940
+ finally {
4941
+ this.cdr.markForCheck();
4942
+ }
4943
+ }
4944
+ async downloadAttachment(attachment) {
4945
+ try {
4946
+ const blob = (await this.discussionApi.getAttachmentContent({ id: attachment.attachmentId }, { format: 'blob' }));
4947
+ const url = URL.createObjectURL(blob);
4948
+ const link = document.createElement('a');
4949
+ link.href = url;
4950
+ link.download = attachment.fileName;
4951
+ link.click();
4952
+ URL.revokeObjectURL(url);
4953
+ }
4954
+ catch (error) {
4955
+ this.msgService.errorFromException(error, this.translateService.instant('discussionComponent.errors.downloadAttachment'));
4956
+ this.cdr.markForCheck();
4957
+ }
4958
+ }
4959
+ async toggleReaction(comment, reaction) {
4960
+ try {
4961
+ const reactions = reaction.reactedByCurrentUser
4962
+ ? await this.discussionApi.removeReaction({ commentId: comment.commentId, emojiCode: reaction.emojiCode })
4963
+ : await this.discussionApi.addReaction({ commentId: comment.commentId, emojiCode: reaction.emojiCode });
4964
+ this.applyReactions(comment.commentId, reactions.map((item) => this.normalizeReaction(item)));
4965
+ }
4966
+ catch (error) {
4967
+ this.msgService.errorFromException(error, this.translateService.instant('discussionComponent.errors.updateReaction'));
4968
+ }
4969
+ finally {
4970
+ this.cdr.markForCheck();
4971
+ }
4972
+ }
4973
+ async reactWithEmoji(comment, emojiCode, popover) {
4974
+ try {
4975
+ const reactions = await this.discussionApi.addReaction({ commentId: comment.commentId, emojiCode });
4976
+ this.applyReactions(comment.commentId, reactions.map((item) => this.normalizeReaction(item)));
4977
+ popover?.hide();
4978
+ }
4979
+ catch (error) {
4980
+ this.msgService.errorFromException(error, this.translateService.instant('discussionComponent.errors.addReaction'));
4981
+ }
4982
+ finally {
4983
+ this.cdr.markForCheck();
4984
+ }
4985
+ }
4986
+ onComposerInput() {
4987
+ if (this.mentionSearchTimer) {
4988
+ clearTimeout(this.mentionSearchTimer);
4989
+ }
4990
+ const token = this.extractMentionQuery(this.newComment);
4991
+ if (!token || token.length < 2) {
4992
+ this.mentionSuggestions = [];
4993
+ this.cdr.markForCheck();
4994
+ return;
4995
+ }
4996
+ this.mentionSearchTimer = setTimeout(async () => {
4997
+ try {
4998
+ const users = await this.discussionApi.searchMentionUsers({ term: token });
4999
+ this.mentionSuggestions = users.map((item) => this.normalizeMentionUser(item));
5000
+ }
5001
+ catch {
5002
+ this.mentionSuggestions = [];
5003
+ }
5004
+ finally {
5005
+ this.cdr.markForCheck();
5006
+ }
5007
+ }, 250);
5008
+ }
5009
+ insertMention(candidate) {
5010
+ const query = this.extractMentionQuery(this.newComment);
5011
+ if (!query) {
5012
+ return;
5013
+ }
5014
+ this.newComment = this.newComment.replace(/@[\w.+\-@]*$/, `@${candidate.email} `);
5015
+ this.mentionSuggestions = [];
5016
+ }
5017
+ renderMarkdown(markdown) {
5018
+ const escaped = markdown.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
5019
+ const html = escaped
5020
+ .replace(/^### (.*)$/gm, '<h3>$1</h3>')
5021
+ .replace(/^## (.*)$/gm, '<h2>$1</h2>')
5022
+ .replace(/^# (.*)$/gm, '<h1>$1</h1>')
5023
+ .replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>')
5024
+ .replace(/\*(.+?)\*/g, '<em>$1</em>')
5025
+ .replace(/`(.+?)`/g, '<code>$1</code>')
5026
+ .replace(/\[([^\]]+)\]\((https?:\/\/[^\s]+)\)/g, '<a href="$2" target="_blank" rel="noopener">$1</a>')
5027
+ .replace(/(^|\s)@([A-Za-z0-9._+\-@]+)/g, '$1<span class="mention-token">@$2</span>')
5028
+ .replace(/\n/g, '<br>');
5029
+ return this.sanitizer.sanitize(SecurityContext.HTML, html) ?? '';
5030
+ }
5031
+ formatBytes(value) {
5032
+ if (value < 1024) {
5033
+ return `${value} ${this.translateService.instant('discussionComponent.units.bytes')}`;
5034
+ }
5035
+ if (value < 1024 * 1024) {
5036
+ return `${(value / 1024).toFixed(1)} ${this.translateService.instant('discussionComponent.units.kilobytes')}`;
5037
+ }
5038
+ return `${(value / (1024 * 1024)).toFixed(1)} ${this.translateService.instant('discussionComponent.units.megabytes')}`;
5039
+ }
5040
+ hasUserReaction(comment) {
5041
+ return comment.reactions.some((reaction) => reaction.reactedByCurrentUser);
5042
+ }
5043
+ getReactions(comment) {
5044
+ return comment.reactions;
5045
+ }
5046
+ applyReactions(commentId, reactions) {
5047
+ this.comments = this.comments.map((item) => (item.commentId === commentId ? { ...item, reactions } : item));
5048
+ }
5049
+ normalizeComment(comment) {
5050
+ return {
5051
+ ...comment,
5052
+ commentId: comment.commentId ?? 0,
5053
+ content: comment.content ?? '',
5054
+ authorDisplayName: comment.authorDisplayName ?? '',
5055
+ authorEmail: comment.authorEmail ?? '',
5056
+ isEdited: comment.isEdited ?? false,
5057
+ historyCount: comment.historyCount ?? 0,
5058
+ canEdit: comment.canEdit ?? false,
5059
+ canDelete: comment.canDelete ?? false,
5060
+ attachments: (comment.attachments ?? []).map((item) => this.normalizeAttachment(item)),
5061
+ reactions: (comment.reactions ?? []).map((item) => this.normalizeReaction(item))
5062
+ };
5063
+ }
5064
+ normalizeAttachment(attachment) {
5065
+ return {
5066
+ attachmentId: attachment.attachmentId ?? 0,
5067
+ fileName: attachment.fileName ?? '',
5068
+ fileType: attachment.fileType ?? '',
5069
+ fileSize: attachment.fileSize ?? 0,
5070
+ uploadedAt: attachment.uploadedAt ?? new Date(0),
5071
+ storageFileId: attachment.storageFileId ?? '',
5072
+ downloadUrl: attachment.downloadUrl ?? ''
5073
+ };
5074
+ }
5075
+ normalizeReaction(reaction) {
5076
+ return {
5077
+ emojiCode: reaction.emojiCode ?? '',
5078
+ count: reaction.count ?? 0,
5079
+ reactedByCurrentUser: reaction.reactedByCurrentUser ?? false
5080
+ };
5081
+ }
5082
+ normalizeMentionUser(user) {
5083
+ return {
5084
+ userId: user.userId ?? 0,
5085
+ displayName: user.displayName ?? '',
5086
+ email: user.email ?? ''
5087
+ };
5088
+ }
5089
+ normalizeHistoryItem(item) {
5090
+ return {
5091
+ commentEditHistoryId: item.commentEditHistoryId ?? 0,
5092
+ oldContent: item.oldContent ?? '',
5093
+ newContent: item.newContent ?? '',
5094
+ editedByUserId: item.editedByUserId ?? 0,
5095
+ editedByDisplayName: item.editedByDisplayName ?? '',
5096
+ editedAt: item.editedAt ?? new Date(0)
5097
+ };
5098
+ }
5099
+ extractMentionQuery(value) {
5100
+ const match = value.match(/@([A-Za-z0-9._+\-@]*)$/);
5101
+ return match?.[1] ?? null;
5102
+ }
5103
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DiscussionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
5104
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DiscussionComponent, isStandalone: true, selector: "discussion", inputs: { objectTypeId: "objectTypeId", objectId: "objectId" }, providers: [ConfirmationService, DiscussionApi], usesOnChanges: true, ngImport: i0, template: `
5105
+ <p-confirmDialog/>
5106
+
5107
+ <section class="flex flex-col gap-4">
5108
+
5109
+ <p-card class="block">
5110
+ <div class="flex flex-col gap-4">
5111
+ @if (!previewMode) {
5112
+ <textarea
5113
+ pTextarea
5114
+ class="min-h-28 w-full"
5115
+ [autoResize]="true"
5116
+ rows="5"
5117
+ [(ngModel)]="newComment"
5118
+ (ngModelChange)="onComposerInput()"
5119
+ [placeholder]="'discussionComponent.writeCommentPlaceholder' | translate"
5120
+ ></textarea>
5121
+ } @else {
5122
+ <div
5123
+ class="markdown-preview min-h-28 rounded-2xl border border-surface-200 bg-surface-50 px-4 py-3 leading-7 dark:border-surface-700 dark:bg-surface-900/40"
5124
+ [innerHTML]="renderMarkdown(newComment)"
5125
+ ></div>
5126
+ }
5127
+
5128
+ @if (mentionSuggestions.length > 0) {
5129
+ <p-panel class="block">
5130
+ <ng-template pTemplate="header">
5131
+ <div class="inline-flex items-center gap-2 text-sm font-medium">
5132
+ <i class="pi pi-at"></i>
5133
+ <span>{{ 'discussionComponent.mentionSuggestions' | translate }}</span>
5134
+ </div>
5135
+ </ng-template>
5136
+
5137
+ <div class="flex flex-col gap-3">
5138
+ @for (candidate of mentionSuggestions; track candidate.userId) {
5139
+ <button
5140
+ type="button"
5141
+ class="flex w-full items-center justify-between gap-4 rounded-xl border border-transparent px-3 py-3 text-left transition hover:border-primary-200 hover:bg-primary-50 dark:hover:border-primary-800 dark:hover:bg-primary-950/30"
5142
+ (click)="insertMention(candidate)"
5143
+ >
5144
+ <div class="min-w-0">
5145
+ <strong>{{ candidate.displayName }}</strong>
5146
+ <small class="mt-1 block text-surface-500">{{ candidate.email }}</small>
5147
+ </div>
5148
+ <i class="pi pi-arrow-up-left shrink-0 text-surface-400"></i>
5149
+ </button>
5150
+ }
5151
+ </div>
5152
+ </p-panel>
5153
+ }
5154
+
5155
+ @if (pendingFiles.length > 0) {
5156
+ <div class="flex flex-col gap-3">
5157
+ @for (file of pendingFiles; track file.name + file.size) {
5158
+ <div
5159
+ class="flex flex-col gap-3 rounded-2xl border border-surface-200 px-4 py-3 sm:flex-row sm:items-center sm:justify-between dark:border-surface-700">
5160
+ <div class="inline-flex items-center gap-2">
5161
+ <i class="pi pi-file"></i>
5162
+ <span class="break-all">{{ file.name }}</span>
5163
+ <p-tag [value]="formatBytes(file.size)" severity="contrast"/>
5164
+ </div>
5165
+ <p-button
5166
+ icon="pi pi-times"
5167
+ severity="danger"
5168
+ [rounded]="true"
5169
+ [text]="true"
5170
+ (onClick)="removePendingFile(file)"
5171
+ />
5172
+ </div>
5173
+ }
5174
+ </div>
5175
+ }
5176
+
5177
+ <div class="flex flex-col gap-2 sm:flex-row sm:justify-end">
5178
+ <p-button
5179
+ [label]="
5180
+ previewMode
5181
+ ? ('discussionComponent.edit' | translate)
5182
+ : ('discussionComponent.preview' | translate)
5183
+ "
5184
+ [icon]="previewMode ? 'pi pi-pencil' : 'pi pi-eye'"
5185
+ severity="secondary"
5186
+ [text]="true"
5187
+ (onClick)="previewMode = !previewMode"
5188
+ />
5189
+
5190
+ <label class="file-trigger">
5191
+ <p-button
5192
+ [label]="'discussionComponent.attachFiles' | translate"
5193
+ icon="pi pi-paperclip"
5194
+ severity="secondary"
5195
+ [text]="true"
5196
+ />
5197
+ <input type="file" multiple (change)="onFilesSelected($event)"/>
5198
+ </label>
5199
+ <p-button
5200
+ [label]="'discussionComponent.send' | translate"
5201
+ icon="pi pi-send"
5202
+ [loading]="submitting"
5203
+ [disabled]="submitting || !newComment.trim()"
5204
+ (onClick)="createComment()"
5205
+ />
5206
+ </div>
5207
+ </div>
5208
+ </p-card>
5209
+
5210
+ @if (loading) {
5211
+ <div
5212
+ class="flex min-h-20 flex-col items-center justify-center gap-3 rounded-2xl border border-surface-200 px-4 py-5 text-surface-500 dark:border-surface-700">
5213
+ <p-progressSpinner strokeWidth="4"/>
5214
+ <span>{{ 'discussionComponent.loadingComments' | translate }}</span>
5215
+ </div>
5216
+ } @else if (comments.length === 0) {
5217
+ <div
5218
+ class="flex min-h-20 items-center justify-center gap-3 rounded-2xl border border-surface-200 px-4 py-5 text-surface-500 dark:border-surface-700">
5219
+ <i class="pi pi-inbox"></i>
5220
+ <span>{{ 'discussionComponent.noCommentsYet' | translate }}</span>
5221
+ </div>
5222
+ } @else {
5223
+ <div class="flex flex-col gap-4">
5224
+ @for (comment of comments; track comment.commentId) {
5225
+ <p-card class="block">
5226
+ <ng-template pTemplate="content">
5227
+ <div class="grid gap-4 md:grid-cols-[3.2rem_minmax(0,1fr)]">
5228
+ <div>
5229
+ <p-avatar
5230
+ [label]="getInitialsFromString(comment.authorDisplayName)"
5231
+ shape="circle"
5232
+ />
5233
+ </div>
5234
+
5235
+ <div class="flex flex-col gap-2">
5236
+ <div class="flex flex-row gap-3 justify-between">
5237
+ <div class="flex flex-wrap items-center gap-2">
5238
+ <strong>{{ comment.authorDisplayName }}</strong>
5239
+ <span
5240
+ class="text-sm text-surface-500">{{ comment.createdAt | date: layoutService.dateTimeFormat() }}</span>
5241
+ </div>
5242
+
5243
+ <div class="flex flex-wrap items-center justify-end gap-2">
5244
+ <div class="flex flex-wrap items-center">
5245
+ @if (comment.isEdited) {
5246
+ <p-tag [value]="'discussionComponent.edited' | translate" icon="pi pi-pencil" severity="warn"/>
5247
+ }
5248
+ </div>
5249
+ @if (comment.canEdit) {
5250
+ <p-button
5251
+ icon="pi pi-pencil"
5252
+ severity="secondary"
5253
+ [rounded]="true"
5254
+ [text]="true"
5255
+ (onClick)="startEdit(comment)"
5256
+ />
5257
+ }
5258
+ @if (comment.historyCount > 0) {
5259
+ <p-button
5260
+ icon="pi pi-history"
5261
+ severity="secondary"
5262
+ [rounded]="true"
5263
+ [text]="true"
5264
+ (onClick)="toggleHistory(comment)"
5265
+ />
5266
+ }
5267
+ @if (comment.canDelete) {
5268
+ <p-button
5269
+ icon="pi pi-trash"
5270
+ severity="danger"
5271
+ [rounded]="true"
5272
+ [text]="true"
5273
+ (onClick)="deleteComment(comment)"
5274
+ />
5275
+ }
5276
+ </div>
5277
+ </div>
5278
+ @if (editingCommentId === comment.commentId) {
5279
+ <div class="flex flex-col gap-4">
5280
+ <textarea
5281
+ pTextarea
5282
+ class="min-h-24 w-full"
5283
+ [autoResize]="true"
5284
+ rows="4"
5285
+ [(ngModel)]="editContent"
5286
+ [placeholder]="'discussionComponent.editCommentPlaceholder' | translate"
5287
+ ></textarea>
5288
+ <div class="flex flex-col gap-2 sm:flex-row sm:justify-end">
5289
+ <div>
5290
+ <label class="file-trigger">
5291
+ <p-button
5292
+ [label]="'discussionComponent.addAttachment' | translate"
5293
+ icon="pi pi-paperclip"
5294
+ [text]="true"
5295
+ severity="secondary"
5296
+ />
5297
+ <input type="file" multiple (change)="onInlineFilesSelected(comment, $event)"/>
5298
+ </label>
5299
+ </div>
5300
+
5301
+ <p-button
5302
+ [label]="'discussionComponent.save' | translate"
5303
+ icon="pi pi-check"
5304
+ [disabled]="!editContent.trim()"
5305
+ (onClick)="saveEdit(comment)"
5306
+ />
5307
+ <p-button
5308
+ [label]="'discussionComponent.cancel' | translate"
5309
+ icon="pi pi-times"
5310
+ severity="secondary"
5311
+ [text]="true"
5312
+ (onClick)="cancelEdit()"
5313
+ />
5314
+ </div>
5315
+ </div>
5316
+ } @else {
5317
+ <div class="markdown-preview" [innerHTML]="renderMarkdown(comment.content)"></div>
5318
+ }
5319
+
5320
+ @if (comment.attachments.length > 0) {
5321
+ <div class="flex flex-col gap-3">
5322
+ <div class="flex flex-col gap-3">
5323
+ @for (attachment of comment.attachments; track attachment.attachmentId) {
5324
+ <div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-end">
5325
+ <div class="inline-flex items-center gap-2">
5326
+ <i class="pi pi-file"></i>
5327
+ <button
5328
+ type="button"
5329
+ class="break-all bg-transparent p-0 text-left font-semibold text-primary-600 transition hover:text-primary-500"
5330
+ (click)="downloadAttachment(attachment)"
5331
+ >
5332
+ {{ attachment.fileName }}
5333
+ </button>
5334
+ <p-tag [value]="formatBytes(attachment.fileSize)" severity="contrast"/>
5335
+ </div>
5336
+
5337
+ @if (comment.canEdit) {
5338
+ <p-button
5339
+ icon="pi pi-times"
5340
+ severity="danger"
5341
+ [rounded]="true"
5342
+ [text]="true"
5343
+ (onClick)="deleteAttachment(comment, attachment)"
5344
+ />
5345
+ }
5346
+ </div>
5347
+ }
5348
+ </div>
5349
+ </div>
5350
+ }
5351
+
5352
+ <div class="flex flex-wrap items-center gap-2">
5353
+ @for (reaction of getReactions(comment); track reaction.emojiCode) {
5354
+ <p-button
5355
+ [label]="reaction.emojiCode + ' ' + reaction.count"
5356
+ severity="secondary"
5357
+ [outlined]="false"
5358
+ (onClick)="toggleReaction(comment, reaction)"
5359
+ />
5360
+ }
5361
+
5362
+ @if (!hasUserReaction(comment)) {
5363
+ <p-button
5364
+ icon="pi pi-face-smile"
5365
+ severity="secondary"
5366
+ [rounded]="true"
5367
+ [text]="true"
5368
+ (onClick)="reactionPopover.toggle($event)"
5369
+ />
5370
+ <p-popover #reactionPopover>
5371
+ <div class="emoji-popover">
5372
+ @for (emoji of emojiPalette; track emoji) {
5373
+ <button
5374
+ type="button"
5375
+ class="emoji-option"
5376
+ (click)="reactWithEmoji(comment, emoji, reactionPopover)"
5377
+ >
5378
+ {{ emoji }}
5379
+ </button>
5380
+ }
5381
+ </div>
5382
+ </p-popover>
5383
+ }
5384
+ </div>
5385
+
5386
+ @if (historyByComment[comment.commentId]?.opened) {
5387
+ <p-panel class="block" [toggleable]="true" [collapsed]="false">
5388
+ <ng-template pTemplate="header">
5389
+ <div class="inline-flex items-center gap-2 text-sm font-medium">
5390
+ <i class="pi pi-history"></i>
5391
+ <span>{{ 'discussionComponent.editHistory' | translate }}</span>
5392
+ </div>
5393
+ </ng-template>
5394
+
5395
+ @if (historyByComment[comment.commentId]?.loading) {
5396
+ <div class="flex items-center gap-3 text-surface-500">
5397
+ <p-progressSpinner strokeWidth="4"/>
5398
+ <span>{{ 'discussionComponent.loadingHistory' | translate }}</span>
5399
+ </div>
5400
+ } @else {
5401
+ <div class="flex flex-col gap-4">
5402
+ @for (item of historyByComment[comment.commentId]?.items ?? []; track item.commentEditHistoryId) {
5403
+ <div class="rounded-2xl border border-surface-200 px-4 py-4 dark:border-surface-700">
5404
+ <div class="mb-3 inline-flex items-center gap-2 text-sm font-semibold">
5405
+ <i class="pi pi-clock"></i>
5406
+ <span>{{ item.editedByDisplayName }} · {{ item.editedAt | date: 'short' }}</span>
5407
+ </div>
5408
+ <div class="grid gap-4 lg:grid-cols-2">
5409
+ <div class="flex flex-col gap-2">
5410
+ <p-tag [value]="'discussionComponent.before' | translate" severity="secondary"/>
5411
+ <div
5412
+ class="history-markdown rounded-2xl bg-surface-50 px-4 py-3 leading-7 dark:bg-surface-900/40"
5413
+ [innerHTML]="renderMarkdown(item.oldContent)"
5414
+ ></div>
5415
+ </div>
5416
+ <div class="flex flex-col gap-2">
5417
+ <p-tag [value]="'discussionComponent.after' | translate" severity="success"/>
5418
+ <div
5419
+ class="history-markdown rounded-2xl bg-surface-50 px-4 py-3 leading-7 dark:bg-surface-900/40"
5420
+ [innerHTML]="renderMarkdown(item.newContent)"
5421
+ ></div>
5422
+ </div>
5423
+ </div>
5424
+ </div>
5425
+ }
5426
+ </div>
5427
+ }
5428
+ </p-panel>
5429
+ }
5430
+ </div>
5431
+ </div>
5432
+ </ng-template>
5433
+ </p-card>
5434
+ }
5435
+ </div>
5436
+ }
5437
+ </section>
5438
+ `, isInline: true, styles: [":host{display:block}.file-trigger{position:relative;display:inline-flex}.file-trigger input{position:absolute;inset:0;opacity:0;cursor:pointer}.markdown-preview,.history-markdown{word-break:break-word}.markdown-preview :is(h1,h2,h3),.history-markdown :is(h1,h2,h3){margin:0 0 .75rem;font-weight:600}.markdown-preview a,.history-markdown a{color:#2563eb;text-decoration:underline;text-underline-offset:.18em}.emoji-popover{display:flex;flex-wrap:wrap;gap:.5rem;max-width:16rem}.emoji-option{display:inline-flex;align-items:center;justify-content:center;width:2.5rem;height:2.5rem;font-size:1.25rem;cursor:pointer}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: AvatarModule }, { kind: "component", type: i2$2.Avatar, selector: "p-avatar", inputs: ["label", "icon", "image", "size", "shape", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "directive", type: i2$6.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.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: i8.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: i2$1.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5439
+ }
5440
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DiscussionComponent, decorators: [{
5441
+ type: Component,
5442
+ args: [{ selector: 'discussion', standalone: true, providers: [ConfirmationService, DiscussionApi], imports: [
5443
+ CommonModule,
5444
+ FormsModule,
5445
+ AvatarModule,
5446
+ ButtonModule,
5447
+ CardModule,
5448
+ ConfirmDialog,
5449
+ DividerModule,
5450
+ PanelModule,
5451
+ PopoverModule,
5452
+ ProgressSpinnerModule,
5453
+ TagModule,
5454
+ Textarea,
5455
+ DatePipe,
5456
+ TranslatePipe
5457
+ ], template: `
5458
+ <p-confirmDialog/>
5459
+
5460
+ <section class="flex flex-col gap-4">
5461
+
5462
+ <p-card class="block">
5463
+ <div class="flex flex-col gap-4">
5464
+ @if (!previewMode) {
5465
+ <textarea
5466
+ pTextarea
5467
+ class="min-h-28 w-full"
5468
+ [autoResize]="true"
5469
+ rows="5"
5470
+ [(ngModel)]="newComment"
5471
+ (ngModelChange)="onComposerInput()"
5472
+ [placeholder]="'discussionComponent.writeCommentPlaceholder' | translate"
5473
+ ></textarea>
5474
+ } @else {
5475
+ <div
5476
+ class="markdown-preview min-h-28 rounded-2xl border border-surface-200 bg-surface-50 px-4 py-3 leading-7 dark:border-surface-700 dark:bg-surface-900/40"
5477
+ [innerHTML]="renderMarkdown(newComment)"
5478
+ ></div>
5479
+ }
5480
+
5481
+ @if (mentionSuggestions.length > 0) {
5482
+ <p-panel class="block">
5483
+ <ng-template pTemplate="header">
5484
+ <div class="inline-flex items-center gap-2 text-sm font-medium">
5485
+ <i class="pi pi-at"></i>
5486
+ <span>{{ 'discussionComponent.mentionSuggestions' | translate }}</span>
5487
+ </div>
5488
+ </ng-template>
5489
+
5490
+ <div class="flex flex-col gap-3">
5491
+ @for (candidate of mentionSuggestions; track candidate.userId) {
5492
+ <button
5493
+ type="button"
5494
+ class="flex w-full items-center justify-between gap-4 rounded-xl border border-transparent px-3 py-3 text-left transition hover:border-primary-200 hover:bg-primary-50 dark:hover:border-primary-800 dark:hover:bg-primary-950/30"
5495
+ (click)="insertMention(candidate)"
5496
+ >
5497
+ <div class="min-w-0">
5498
+ <strong>{{ candidate.displayName }}</strong>
5499
+ <small class="mt-1 block text-surface-500">{{ candidate.email }}</small>
5500
+ </div>
5501
+ <i class="pi pi-arrow-up-left shrink-0 text-surface-400"></i>
5502
+ </button>
5503
+ }
5504
+ </div>
5505
+ </p-panel>
5506
+ }
5507
+
5508
+ @if (pendingFiles.length > 0) {
5509
+ <div class="flex flex-col gap-3">
5510
+ @for (file of pendingFiles; track file.name + file.size) {
5511
+ <div
5512
+ class="flex flex-col gap-3 rounded-2xl border border-surface-200 px-4 py-3 sm:flex-row sm:items-center sm:justify-between dark:border-surface-700">
5513
+ <div class="inline-flex items-center gap-2">
5514
+ <i class="pi pi-file"></i>
5515
+ <span class="break-all">{{ file.name }}</span>
5516
+ <p-tag [value]="formatBytes(file.size)" severity="contrast"/>
5517
+ </div>
5518
+ <p-button
5519
+ icon="pi pi-times"
5520
+ severity="danger"
5521
+ [rounded]="true"
5522
+ [text]="true"
5523
+ (onClick)="removePendingFile(file)"
5524
+ />
5525
+ </div>
5526
+ }
5527
+ </div>
5528
+ }
5529
+
5530
+ <div class="flex flex-col gap-2 sm:flex-row sm:justify-end">
5531
+ <p-button
5532
+ [label]="
5533
+ previewMode
5534
+ ? ('discussionComponent.edit' | translate)
5535
+ : ('discussionComponent.preview' | translate)
5536
+ "
5537
+ [icon]="previewMode ? 'pi pi-pencil' : 'pi pi-eye'"
5538
+ severity="secondary"
5539
+ [text]="true"
5540
+ (onClick)="previewMode = !previewMode"
5541
+ />
5542
+
5543
+ <label class="file-trigger">
5544
+ <p-button
5545
+ [label]="'discussionComponent.attachFiles' | translate"
5546
+ icon="pi pi-paperclip"
5547
+ severity="secondary"
5548
+ [text]="true"
5549
+ />
5550
+ <input type="file" multiple (change)="onFilesSelected($event)"/>
5551
+ </label>
5552
+ <p-button
5553
+ [label]="'discussionComponent.send' | translate"
5554
+ icon="pi pi-send"
5555
+ [loading]="submitting"
5556
+ [disabled]="submitting || !newComment.trim()"
5557
+ (onClick)="createComment()"
5558
+ />
5559
+ </div>
5560
+ </div>
5561
+ </p-card>
5562
+
5563
+ @if (loading) {
5564
+ <div
5565
+ class="flex min-h-20 flex-col items-center justify-center gap-3 rounded-2xl border border-surface-200 px-4 py-5 text-surface-500 dark:border-surface-700">
5566
+ <p-progressSpinner strokeWidth="4"/>
5567
+ <span>{{ 'discussionComponent.loadingComments' | translate }}</span>
5568
+ </div>
5569
+ } @else if (comments.length === 0) {
5570
+ <div
5571
+ class="flex min-h-20 items-center justify-center gap-3 rounded-2xl border border-surface-200 px-4 py-5 text-surface-500 dark:border-surface-700">
5572
+ <i class="pi pi-inbox"></i>
5573
+ <span>{{ 'discussionComponent.noCommentsYet' | translate }}</span>
5574
+ </div>
5575
+ } @else {
5576
+ <div class="flex flex-col gap-4">
5577
+ @for (comment of comments; track comment.commentId) {
5578
+ <p-card class="block">
5579
+ <ng-template pTemplate="content">
5580
+ <div class="grid gap-4 md:grid-cols-[3.2rem_minmax(0,1fr)]">
5581
+ <div>
5582
+ <p-avatar
5583
+ [label]="getInitialsFromString(comment.authorDisplayName)"
5584
+ shape="circle"
5585
+ />
5586
+ </div>
5587
+
5588
+ <div class="flex flex-col gap-2">
5589
+ <div class="flex flex-row gap-3 justify-between">
5590
+ <div class="flex flex-wrap items-center gap-2">
5591
+ <strong>{{ comment.authorDisplayName }}</strong>
5592
+ <span
5593
+ class="text-sm text-surface-500">{{ comment.createdAt | date: layoutService.dateTimeFormat() }}</span>
5594
+ </div>
5595
+
5596
+ <div class="flex flex-wrap items-center justify-end gap-2">
5597
+ <div class="flex flex-wrap items-center">
5598
+ @if (comment.isEdited) {
5599
+ <p-tag [value]="'discussionComponent.edited' | translate" icon="pi pi-pencil" severity="warn"/>
5600
+ }
5601
+ </div>
5602
+ @if (comment.canEdit) {
5603
+ <p-button
5604
+ icon="pi pi-pencil"
5605
+ severity="secondary"
5606
+ [rounded]="true"
5607
+ [text]="true"
5608
+ (onClick)="startEdit(comment)"
5609
+ />
5610
+ }
5611
+ @if (comment.historyCount > 0) {
5612
+ <p-button
5613
+ icon="pi pi-history"
5614
+ severity="secondary"
5615
+ [rounded]="true"
5616
+ [text]="true"
5617
+ (onClick)="toggleHistory(comment)"
5618
+ />
5619
+ }
5620
+ @if (comment.canDelete) {
5621
+ <p-button
5622
+ icon="pi pi-trash"
5623
+ severity="danger"
5624
+ [rounded]="true"
5625
+ [text]="true"
5626
+ (onClick)="deleteComment(comment)"
5627
+ />
5628
+ }
5629
+ </div>
5630
+ </div>
5631
+ @if (editingCommentId === comment.commentId) {
5632
+ <div class="flex flex-col gap-4">
5633
+ <textarea
5634
+ pTextarea
5635
+ class="min-h-24 w-full"
5636
+ [autoResize]="true"
5637
+ rows="4"
5638
+ [(ngModel)]="editContent"
5639
+ [placeholder]="'discussionComponent.editCommentPlaceholder' | translate"
5640
+ ></textarea>
5641
+ <div class="flex flex-col gap-2 sm:flex-row sm:justify-end">
5642
+ <div>
5643
+ <label class="file-trigger">
5644
+ <p-button
5645
+ [label]="'discussionComponent.addAttachment' | translate"
5646
+ icon="pi pi-paperclip"
5647
+ [text]="true"
5648
+ severity="secondary"
5649
+ />
5650
+ <input type="file" multiple (change)="onInlineFilesSelected(comment, $event)"/>
5651
+ </label>
5652
+ </div>
5653
+
5654
+ <p-button
5655
+ [label]="'discussionComponent.save' | translate"
5656
+ icon="pi pi-check"
5657
+ [disabled]="!editContent.trim()"
5658
+ (onClick)="saveEdit(comment)"
5659
+ />
5660
+ <p-button
5661
+ [label]="'discussionComponent.cancel' | translate"
5662
+ icon="pi pi-times"
5663
+ severity="secondary"
5664
+ [text]="true"
5665
+ (onClick)="cancelEdit()"
5666
+ />
5667
+ </div>
5668
+ </div>
5669
+ } @else {
5670
+ <div class="markdown-preview" [innerHTML]="renderMarkdown(comment.content)"></div>
5671
+ }
5672
+
5673
+ @if (comment.attachments.length > 0) {
5674
+ <div class="flex flex-col gap-3">
5675
+ <div class="flex flex-col gap-3">
5676
+ @for (attachment of comment.attachments; track attachment.attachmentId) {
5677
+ <div class="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-end">
5678
+ <div class="inline-flex items-center gap-2">
5679
+ <i class="pi pi-file"></i>
5680
+ <button
5681
+ type="button"
5682
+ class="break-all bg-transparent p-0 text-left font-semibold text-primary-600 transition hover:text-primary-500"
5683
+ (click)="downloadAttachment(attachment)"
5684
+ >
5685
+ {{ attachment.fileName }}
5686
+ </button>
5687
+ <p-tag [value]="formatBytes(attachment.fileSize)" severity="contrast"/>
5688
+ </div>
5689
+
5690
+ @if (comment.canEdit) {
5691
+ <p-button
5692
+ icon="pi pi-times"
5693
+ severity="danger"
5694
+ [rounded]="true"
5695
+ [text]="true"
5696
+ (onClick)="deleteAttachment(comment, attachment)"
5697
+ />
5698
+ }
5699
+ </div>
5700
+ }
5701
+ </div>
5702
+ </div>
5703
+ }
5704
+
5705
+ <div class="flex flex-wrap items-center gap-2">
5706
+ @for (reaction of getReactions(comment); track reaction.emojiCode) {
5707
+ <p-button
5708
+ [label]="reaction.emojiCode + ' ' + reaction.count"
5709
+ severity="secondary"
5710
+ [outlined]="false"
5711
+ (onClick)="toggleReaction(comment, reaction)"
5712
+ />
5713
+ }
5714
+
5715
+ @if (!hasUserReaction(comment)) {
5716
+ <p-button
5717
+ icon="pi pi-face-smile"
5718
+ severity="secondary"
5719
+ [rounded]="true"
5720
+ [text]="true"
5721
+ (onClick)="reactionPopover.toggle($event)"
5722
+ />
5723
+ <p-popover #reactionPopover>
5724
+ <div class="emoji-popover">
5725
+ @for (emoji of emojiPalette; track emoji) {
5726
+ <button
5727
+ type="button"
5728
+ class="emoji-option"
5729
+ (click)="reactWithEmoji(comment, emoji, reactionPopover)"
5730
+ >
5731
+ {{ emoji }}
5732
+ </button>
5733
+ }
5734
+ </div>
5735
+ </p-popover>
5736
+ }
5737
+ </div>
5738
+
5739
+ @if (historyByComment[comment.commentId]?.opened) {
5740
+ <p-panel class="block" [toggleable]="true" [collapsed]="false">
5741
+ <ng-template pTemplate="header">
5742
+ <div class="inline-flex items-center gap-2 text-sm font-medium">
5743
+ <i class="pi pi-history"></i>
5744
+ <span>{{ 'discussionComponent.editHistory' | translate }}</span>
5745
+ </div>
5746
+ </ng-template>
5747
+
5748
+ @if (historyByComment[comment.commentId]?.loading) {
5749
+ <div class="flex items-center gap-3 text-surface-500">
5750
+ <p-progressSpinner strokeWidth="4"/>
5751
+ <span>{{ 'discussionComponent.loadingHistory' | translate }}</span>
5752
+ </div>
5753
+ } @else {
5754
+ <div class="flex flex-col gap-4">
5755
+ @for (item of historyByComment[comment.commentId]?.items ?? []; track item.commentEditHistoryId) {
5756
+ <div class="rounded-2xl border border-surface-200 px-4 py-4 dark:border-surface-700">
5757
+ <div class="mb-3 inline-flex items-center gap-2 text-sm font-semibold">
5758
+ <i class="pi pi-clock"></i>
5759
+ <span>{{ item.editedByDisplayName }} · {{ item.editedAt | date: 'short' }}</span>
5760
+ </div>
5761
+ <div class="grid gap-4 lg:grid-cols-2">
5762
+ <div class="flex flex-col gap-2">
5763
+ <p-tag [value]="'discussionComponent.before' | translate" severity="secondary"/>
5764
+ <div
5765
+ class="history-markdown rounded-2xl bg-surface-50 px-4 py-3 leading-7 dark:bg-surface-900/40"
5766
+ [innerHTML]="renderMarkdown(item.oldContent)"
5767
+ ></div>
5768
+ </div>
5769
+ <div class="flex flex-col gap-2">
5770
+ <p-tag [value]="'discussionComponent.after' | translate" severity="success"/>
5771
+ <div
5772
+ class="history-markdown rounded-2xl bg-surface-50 px-4 py-3 leading-7 dark:bg-surface-900/40"
5773
+ [innerHTML]="renderMarkdown(item.newContent)"
5774
+ ></div>
5775
+ </div>
5776
+ </div>
5777
+ </div>
5778
+ }
5779
+ </div>
5780
+ }
5781
+ </p-panel>
5782
+ }
5783
+ </div>
5784
+ </div>
5785
+ </ng-template>
5786
+ </p-card>
5787
+ }
5788
+ </div>
5789
+ }
5790
+ </section>
5791
+ `, changeDetection: ChangeDetectionStrategy.OnPush, 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"] }]
5792
+ }], propDecorators: { objectTypeId: [{
5793
+ type: Input,
5794
+ args: [{ required: true }]
5795
+ }], objectId: [{
5796
+ type: Input,
5797
+ args: [{ required: true }]
5798
+ }] } });
5799
+
4394
5800
  /**
4395
5801
  * A route guard that ensures the user is authenticated and has a valid access token.
4396
5802
  * If the access token is expired, it attempts to refresh the session.
@@ -4630,5 +6036,5 @@ const httpLoaderAuthFactory = (httpClient) => {
4630
6036
  * Generated bundle index. Do not edit.
4631
6037
  */
4632
6038
 
4633
- export { AppConfiguratorComponent, AppFloatingConfiguratorComponent, AppLayoutComponent, AppModulesComponent, AppTopbar, AuthGuardService, BaseDataService, BaseModuleComponent, ConfigComponent, ContentType, DbMigrationComponent, ErrorComponent, FooterComponent, HttpClient, KeycloakSecurityService, L10nService, LOGO_COMPONENT_TOKEN, LayoutService, LogoComponent, LogoService, MenuComponent, MenuService, MsgService, NotfoundComponent, NotificationService, ProfileComponent, SecurePipe, SecurityComponent, SecurityDataService, SecurityService, SecurityStorageService, SidebarComponent, TableFilterService, TopBarService, UnauthorizedComponent, UserService, httpLoaderAuthFactory, langIntercept, provideLogoComponent };
6039
+ export { AppConfiguratorComponent, AppFloatingConfiguratorComponent, AppLayoutComponent, AppModulesComponent, AppTopbar, AuthGuardService, BaseDataService, BaseModuleComponent, ConfigComponent, ContentType, DbMigrationComponent, DiscussionComponent, ErrorComponent, FooterComponent, HttpClient, KeycloakSecurityService, L10nService, LOGO_COMPONENT_TOKEN, LayoutService, LogoComponent, LogoService, MenuComponent, MenuService, MsgService, NotfoundComponent, NotificationService, ProfileComponent, SecurePipe, SecurityComponent, SecurityDataService, SecurityService, SecurityStorageService, SidebarComponent, TableFilterService, TopBarService, UnauthorizedComponent, UserService, httpLoaderAuthFactory, langIntercept, provideLogoComponent };
4634
6040
  //# sourceMappingURL=oip-common.mjs.map