oip-common 0.0.12 → 0.0.14

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.
@@ -722,10 +722,10 @@ class LayoutService {
722
722
  this.dateTimeFormat = computed(() => `${this.layoutConfig().dateFormat} ${this.layoutConfig().timeFormat}`, ...(ngDevMode ? [{ debugName: "dateTimeFormat" }] : []));
723
723
  this.monthFormat = computed(() => {
724
724
  const reDay = /d+/i;
725
- const reDelimeter = /^[^\w]|[^\w]$|([^\w])\1+/;
725
+ const reDelimiter = /^[^\w]|[^\w]$|([^\w])\1+/;
726
726
  const ngDateFormat = convertToPrimeNgDateFormat(this.layoutConfig().dateFormat);
727
727
  const ngDate = ngDateFormat.replace(reDay, '');
728
- const dateGroups = ngDate.match(reDelimeter);
728
+ const dateGroups = ngDate.match(reDelimiter);
729
729
  if (Array.isArray(dateGroups) && dateGroups.length > 1) {
730
730
  return dateGroups[1] !== undefined
731
731
  ? ngDate.replace(dateGroups[0], '')
@@ -1431,6 +1431,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImpor
1431
1431
  type: Input
1432
1432
  }] } });
1433
1433
 
1434
+ class SecurityService {
1435
+ }
1434
1436
  /**
1435
1437
  * SecurityService extends OidcSecurityService to manage authentication,
1436
1438
  * token handling, and user role access in an Angular application.
@@ -1438,7 +1440,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImpor
1438
1440
  * It provides helper methods for checking authentication, managing tokens,
1439
1441
  * determining user roles, and performing logout and refresh operations.
1440
1442
  */
1441
- class SecurityService extends OidcSecurityService {
1443
+ class KeycloakSecurityService extends OidcSecurityService {
1442
1444
  /**
1443
1445
  * Initializes service and subscribes to authentication events.
1444
1446
  * When a 'NewAuthenticationResult' event is received, the `auth` method is called.
@@ -1464,6 +1466,9 @@ class SecurityService extends OidcSecurityService {
1464
1466
  this.auth();
1465
1467
  });
1466
1468
  }
1469
+ getCurrentUser() {
1470
+ return this.userData;
1471
+ }
1467
1472
  /**
1468
1473
  * Returns the ID token for the sign-in.
1469
1474
  * @returns A string with the id token.
@@ -1476,7 +1481,7 @@ class SecurityService extends OidcSecurityService {
1476
1481
  *
1477
1482
  * @returns {boolean} True if the user is an admin, false otherwise.
1478
1483
  */
1479
- get isAdmin() {
1484
+ isAdmin() {
1480
1485
  return this.payload.getValue()?.realm_access?.roles?.includes('admin');
1481
1486
  }
1482
1487
  /**
@@ -1518,10 +1523,10 @@ class SecurityService extends OidcSecurityService {
1518
1523
  return payload.exp < Math.floor(Date.now() / 1000);
1519
1524
  }));
1520
1525
  }
1521
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: SecurityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1522
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: SecurityService }); }
1526
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: KeycloakSecurityService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1527
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: KeycloakSecurityService }); }
1523
1528
  }
1524
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: SecurityService, decorators: [{
1529
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: KeycloakSecurityService, decorators: [{
1525
1530
  type: Injectable
1526
1531
  }], ctorParameters: () => [] });
1527
1532
 
@@ -1548,11 +1553,11 @@ class UserService {
1548
1553
  * Typically used for avatar display when a photo is unavailable.
1549
1554
  */
1550
1555
  get shortLabel() {
1551
- const data = this.securityService.userData;
1556
+ const data = this.securityService.getCurrentUser();
1552
1557
  return (data) ? data.given_name[0] + data.family_name[0] : "";
1553
1558
  }
1554
1559
  get userName() {
1555
- const data = this.securityService.userData;
1560
+ const data = this.securityService.getCurrentUser();
1556
1561
  return `${data.given_name} ${data.family_name}`;
1557
1562
  }
1558
1563
  /**
@@ -1560,7 +1565,7 @@ class UserService {
1560
1565
  * and updates the `photo` and `photoLoaded` properties accordingly.
1561
1566
  */
1562
1567
  getUserPhoto() {
1563
- const url = `${this.baseDataService.baseUrl}api/user-profile/get-user-photo?email=${this.securityService.userData.email}`;
1568
+ const url = `${this.baseDataService.baseUrl}api/user-profile/get-user-photo?email=${this.securityService.getCurrentUser().email}`;
1564
1569
  this.baseDataService.getBlob(url).then((data) => {
1565
1570
  this.createImageFromBlob(data);
1566
1571
  this.photoLoaded = true;
@@ -1608,101 +1613,102 @@ class AppTopbar {
1608
1613
  }
1609
1614
  }
1610
1615
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: AppTopbar, deps: [{ token: LayoutService }], target: i0.ɵɵFactoryTarget.Component }); }
1611
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.2", type: AppTopbar, isStandalone: true, selector: "app-topbar", ngImport: i0, template: ` <div class="layout-topbar">
1612
- <div class="layout-topbar-logo-container">
1613
- <button class="layout-menu-button layout-topbar-action" (click)="layoutService.onMenuToggle()">
1614
- <i class="pi pi-bars"></i>
1615
- </button>
1616
- <a class="layout-topbar-logo" id="oip-app-topbar-logo-link" routerLink="">
1617
- <logo [height]="36" [width]="36"></logo>
1618
- <span>OIP</span>
1619
- </a>
1620
- </div>
1616
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.2", type: AppTopbar, isStandalone: true, selector: "app-topbar", ngImport: i0, template: `
1617
+ <div class="layout-topbar">
1618
+ <div class="layout-topbar-logo-container">
1619
+ <button class="layout-menu-button layout-topbar-action" (click)="layoutService.onMenuToggle()">
1620
+ <i class="pi pi-bars"></i>
1621
+ </button>
1622
+ <a class="layout-topbar-logo" id="oip-app-topbar-logo-link" routerLink="">
1623
+ <logo [height]="36" [width]="36"></logo>
1624
+ <span>OIP</span>
1625
+ </a>
1626
+ </div>
1621
1627
 
1622
- @if (securityService.isAdmin && topBarService.topBarItems.length > 0) {
1623
- <p-tabs class="layout-topbar-tabs ml-2" [(value)]="topBarService.activeId">
1624
- <p-tablist>
1625
- @for (tab of topBarService.availableTopBarItems; track tab.id) {
1626
- <p-tab id="oip-app-topbar-tab-{{ tab.id }}" [value]="tab.id">
1627
- <i class="pi {{ tab.icon }}"></i>
1628
- <span class="ml-2">{{ tab.caption }}</span>
1629
- </p-tab>
1630
- }
1631
- </p-tablist>
1632
- </p-tabs>
1633
- }
1634
- <div class="layout-topbar-actions">
1635
- <div class="layout-config-menu">
1636
- <p-button
1637
- class="layout-topbar-action"
1638
- id="oip-app-topbar-theme-button"
1639
- severity="secondary"
1640
- type="button"
1641
- [rounded]="true"
1642
- [text]="true"
1643
- (click)="toggleDarkMode()">
1644
- <i
1645
- class="pi"
1646
- [ngClass]="{
1628
+ @if (securityService.isAdmin() && topBarService.topBarItems.length > 0) {
1629
+ <p-tabs class="layout-topbar-tabs ml-2" [(value)]="topBarService.activeId">
1630
+ <p-tablist>
1631
+ @for (tab of topBarService.availableTopBarItems; track tab.id) {
1632
+ <p-tab id="oip-app-topbar-tab-{{ tab.id }}" [value]="tab.id">
1633
+ <i class="pi {{ tab.icon }}"></i>
1634
+ <span class="ml-2">{{ tab.caption }}</span>
1635
+ </p-tab>
1636
+ }
1637
+ </p-tablist>
1638
+ </p-tabs>
1639
+ }
1640
+ <div class="layout-topbar-actions">
1641
+ <div class="layout-config-menu">
1642
+ <p-button
1643
+ class="layout-topbar-action"
1644
+ id="oip-app-topbar-theme-button"
1645
+ severity="secondary"
1646
+ type="button"
1647
+ [rounded]="true"
1648
+ [text]="true"
1649
+ (click)="toggleDarkMode()">
1650
+ <i
1651
+ class="pi"
1652
+ [ngClass]="{
1647
1653
  'pi-moon': layoutService.isDarkTheme(),
1648
1654
  'pi-sun': !layoutService.isDarkTheme()
1649
1655
  }"></i>
1650
- </p-button>
1651
- <div class="relative">
1652
- <p-button
1653
- class="layout-topbar-action layout-topbar-action-highlight"
1654
- enterActiveClass="animate-scalein"
1655
- enterFromClass="hidden"
1656
- id="oip-app-topbar-palette-button"
1657
- leaveActiveClass="animate-fadeout"
1658
- leaveToClass="hidden"
1659
- pStyleClass="@next"
1660
- [hideOnOutsideClick]="true"
1661
- [rounded]="true">
1662
- <i class="pi pi-palette"></i>
1663
1656
  </p-button>
1664
- <app-configurator />
1657
+ <div class="relative">
1658
+ <p-button
1659
+ class="layout-topbar-action layout-topbar-action-highlight"
1660
+ enterActiveClass="animate-scalein"
1661
+ enterFromClass="hidden"
1662
+ id="oip-app-topbar-palette-button"
1663
+ leaveActiveClass="animate-fadeout"
1664
+ leaveToClass="hidden"
1665
+ pStyleClass="@next"
1666
+ [hideOnOutsideClick]="true"
1667
+ [rounded]="true">
1668
+ <i class="pi pi-palette"></i>
1669
+ </p-button>
1670
+ <app-configurator/>
1671
+ </div>
1665
1672
  </div>
1666
- </div>
1667
1673
 
1668
- <button
1669
- class="layout-topbar-menu-button layout-topbar-action"
1670
- enterActiveClass="animate-scalein"
1671
- enterFromClass="hidden"
1672
- id="oip-app-topbar-menu-expand-button"
1673
- leaveActiveClass="animate-fadeout"
1674
- leaveToClass="hidden"
1675
- pStyleClass="@next"
1676
- [hideOnOutsideClick]="true">
1677
- <i class="pi pi-ellipsis-v"></i>
1678
- </button>
1674
+ <button
1675
+ class="layout-topbar-menu-button layout-topbar-action"
1676
+ enterActiveClass="animate-scalein"
1677
+ enterFromClass="hidden"
1678
+ id="oip-app-topbar-menu-expand-button"
1679
+ leaveActiveClass="animate-fadeout"
1680
+ leaveToClass="hidden"
1681
+ pStyleClass="@next"
1682
+ [hideOnOutsideClick]="true">
1683
+ <i class="pi pi-ellipsis-v"></i>
1684
+ </button>
1679
1685
 
1680
- <div class="layout-topbar-menu hidden lg:block">
1681
- <div class="layout-topbar-menu-content">
1682
- <button
1683
- class="layout-topbar-action"
1684
- id="oip-app-topbar-logout-button"
1685
- type="button"
1686
- (click)="securityService.logout()"
1687
- (keydown)="logoutKeyDown($event)">
1688
- <i class="pi pi-sign-out"></i>
1689
- <span>Logout</span>
1690
- </button>
1691
- <button class="layout-topbar-action" routerLink="config">
1692
- <p-avatar
1693
- class="p-link flex align-items-center"
1694
- id="oip-app-topbar-user-avatar"
1695
- shape="circle"
1696
- size="normal"
1697
- [image]="userService.photoLoaded ? userService.photo : null"
1686
+ <div class="layout-topbar-menu hidden lg:block">
1687
+ <div class="layout-topbar-menu-content">
1688
+ <button
1689
+ class="layout-topbar-action"
1690
+ id="oip-app-topbar-logout-button"
1691
+ type="button"
1692
+ (click)="securityService.logout()"
1693
+ (keydown)="logoutKeyDown($event)">
1694
+ <i class="pi pi-sign-out"></i>
1695
+ <span>Logout</span>
1696
+ </button>
1697
+ <button class="layout-topbar-action" routerLink="config">
1698
+ <p-avatar
1699
+ class="p-link flex align-items-center"
1700
+ id="oip-app-topbar-user-avatar"
1701
+ shape="circle"
1702
+ size="normal"
1703
+ [image]="userService.photoLoaded ? userService.photo : null"
1698
1704
  >{{ !userService.photoLoaded ? userService.shortLabel : null }}
1699
- </p-avatar>
1700
- <span class="ml-2">Profile</span>
1701
- </button>
1705
+ </p-avatar>
1706
+ <span class="ml-2">Profile</span>
1707
+ </button>
1708
+ </div>
1702
1709
  </div>
1703
1710
  </div>
1704
- </div>
1705
- </div>`, isInline: true, styles: [""], 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: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i4.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: LogoComponent, selector: "logo", inputs: ["width", "height"] }, { 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: i5$1.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: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }] }); }
1711
+ </div>`, isInline: true, styles: [""], 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: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: StyleClassModule }, { kind: "directive", type: i4.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: LogoComponent, selector: "logo", inputs: ["width", "height"] }, { 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: i5$1.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: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }] }); }
1706
1712
  }
1707
1713
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImport: i0, type: AppTopbar, decorators: [{
1708
1714
  type: Component,
@@ -1717,101 +1723,102 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImpor
1717
1723
  Tab,
1718
1724
  AvatarModule,
1719
1725
  ButtonModule
1720
- ], template: ` <div class="layout-topbar">
1721
- <div class="layout-topbar-logo-container">
1722
- <button class="layout-menu-button layout-topbar-action" (click)="layoutService.onMenuToggle()">
1723
- <i class="pi pi-bars"></i>
1724
- </button>
1725
- <a class="layout-topbar-logo" id="oip-app-topbar-logo-link" routerLink="">
1726
- <logo [height]="36" [width]="36"></logo>
1727
- <span>OIP</span>
1728
- </a>
1729
- </div>
1726
+ ], template: `
1727
+ <div class="layout-topbar">
1728
+ <div class="layout-topbar-logo-container">
1729
+ <button class="layout-menu-button layout-topbar-action" (click)="layoutService.onMenuToggle()">
1730
+ <i class="pi pi-bars"></i>
1731
+ </button>
1732
+ <a class="layout-topbar-logo" id="oip-app-topbar-logo-link" routerLink="">
1733
+ <logo [height]="36" [width]="36"></logo>
1734
+ <span>OIP</span>
1735
+ </a>
1736
+ </div>
1730
1737
 
1731
- @if (securityService.isAdmin && topBarService.topBarItems.length > 0) {
1732
- <p-tabs class="layout-topbar-tabs ml-2" [(value)]="topBarService.activeId">
1733
- <p-tablist>
1734
- @for (tab of topBarService.availableTopBarItems; track tab.id) {
1735
- <p-tab id="oip-app-topbar-tab-{{ tab.id }}" [value]="tab.id">
1736
- <i class="pi {{ tab.icon }}"></i>
1737
- <span class="ml-2">{{ tab.caption }}</span>
1738
- </p-tab>
1739
- }
1740
- </p-tablist>
1741
- </p-tabs>
1742
- }
1743
- <div class="layout-topbar-actions">
1744
- <div class="layout-config-menu">
1745
- <p-button
1746
- class="layout-topbar-action"
1747
- id="oip-app-topbar-theme-button"
1748
- severity="secondary"
1749
- type="button"
1750
- [rounded]="true"
1751
- [text]="true"
1752
- (click)="toggleDarkMode()">
1753
- <i
1754
- class="pi"
1755
- [ngClass]="{
1738
+ @if (securityService.isAdmin() && topBarService.topBarItems.length > 0) {
1739
+ <p-tabs class="layout-topbar-tabs ml-2" [(value)]="topBarService.activeId">
1740
+ <p-tablist>
1741
+ @for (tab of topBarService.availableTopBarItems; track tab.id) {
1742
+ <p-tab id="oip-app-topbar-tab-{{ tab.id }}" [value]="tab.id">
1743
+ <i class="pi {{ tab.icon }}"></i>
1744
+ <span class="ml-2">{{ tab.caption }}</span>
1745
+ </p-tab>
1746
+ }
1747
+ </p-tablist>
1748
+ </p-tabs>
1749
+ }
1750
+ <div class="layout-topbar-actions">
1751
+ <div class="layout-config-menu">
1752
+ <p-button
1753
+ class="layout-topbar-action"
1754
+ id="oip-app-topbar-theme-button"
1755
+ severity="secondary"
1756
+ type="button"
1757
+ [rounded]="true"
1758
+ [text]="true"
1759
+ (click)="toggleDarkMode()">
1760
+ <i
1761
+ class="pi"
1762
+ [ngClass]="{
1756
1763
  'pi-moon': layoutService.isDarkTheme(),
1757
1764
  'pi-sun': !layoutService.isDarkTheme()
1758
1765
  }"></i>
1759
- </p-button>
1760
- <div class="relative">
1761
- <p-button
1762
- class="layout-topbar-action layout-topbar-action-highlight"
1763
- enterActiveClass="animate-scalein"
1764
- enterFromClass="hidden"
1765
- id="oip-app-topbar-palette-button"
1766
- leaveActiveClass="animate-fadeout"
1767
- leaveToClass="hidden"
1768
- pStyleClass="@next"
1769
- [hideOnOutsideClick]="true"
1770
- [rounded]="true">
1771
- <i class="pi pi-palette"></i>
1772
1766
  </p-button>
1773
- <app-configurator />
1767
+ <div class="relative">
1768
+ <p-button
1769
+ class="layout-topbar-action layout-topbar-action-highlight"
1770
+ enterActiveClass="animate-scalein"
1771
+ enterFromClass="hidden"
1772
+ id="oip-app-topbar-palette-button"
1773
+ leaveActiveClass="animate-fadeout"
1774
+ leaveToClass="hidden"
1775
+ pStyleClass="@next"
1776
+ [hideOnOutsideClick]="true"
1777
+ [rounded]="true">
1778
+ <i class="pi pi-palette"></i>
1779
+ </p-button>
1780
+ <app-configurator/>
1781
+ </div>
1774
1782
  </div>
1775
- </div>
1776
1783
 
1777
- <button
1778
- class="layout-topbar-menu-button layout-topbar-action"
1779
- enterActiveClass="animate-scalein"
1780
- enterFromClass="hidden"
1781
- id="oip-app-topbar-menu-expand-button"
1782
- leaveActiveClass="animate-fadeout"
1783
- leaveToClass="hidden"
1784
- pStyleClass="@next"
1785
- [hideOnOutsideClick]="true">
1786
- <i class="pi pi-ellipsis-v"></i>
1787
- </button>
1784
+ <button
1785
+ class="layout-topbar-menu-button layout-topbar-action"
1786
+ enterActiveClass="animate-scalein"
1787
+ enterFromClass="hidden"
1788
+ id="oip-app-topbar-menu-expand-button"
1789
+ leaveActiveClass="animate-fadeout"
1790
+ leaveToClass="hidden"
1791
+ pStyleClass="@next"
1792
+ [hideOnOutsideClick]="true">
1793
+ <i class="pi pi-ellipsis-v"></i>
1794
+ </button>
1788
1795
 
1789
- <div class="layout-topbar-menu hidden lg:block">
1790
- <div class="layout-topbar-menu-content">
1791
- <button
1792
- class="layout-topbar-action"
1793
- id="oip-app-topbar-logout-button"
1794
- type="button"
1795
- (click)="securityService.logout()"
1796
- (keydown)="logoutKeyDown($event)">
1797
- <i class="pi pi-sign-out"></i>
1798
- <span>Logout</span>
1799
- </button>
1800
- <button class="layout-topbar-action" routerLink="config">
1801
- <p-avatar
1802
- class="p-link flex align-items-center"
1803
- id="oip-app-topbar-user-avatar"
1804
- shape="circle"
1805
- size="normal"
1806
- [image]="userService.photoLoaded ? userService.photo : null"
1796
+ <div class="layout-topbar-menu hidden lg:block">
1797
+ <div class="layout-topbar-menu-content">
1798
+ <button
1799
+ class="layout-topbar-action"
1800
+ id="oip-app-topbar-logout-button"
1801
+ type="button"
1802
+ (click)="securityService.logout()"
1803
+ (keydown)="logoutKeyDown($event)">
1804
+ <i class="pi pi-sign-out"></i>
1805
+ <span>Logout</span>
1806
+ </button>
1807
+ <button class="layout-topbar-action" routerLink="config">
1808
+ <p-avatar
1809
+ class="p-link flex align-items-center"
1810
+ id="oip-app-topbar-user-avatar"
1811
+ shape="circle"
1812
+ size="normal"
1813
+ [image]="userService.photoLoaded ? userService.photo : null"
1807
1814
  >{{ !userService.photoLoaded ? userService.shortLabel : null }}
1808
- </p-avatar>
1809
- <span class="ml-2">Profile</span>
1810
- </button>
1815
+ </p-avatar>
1816
+ <span class="ml-2">Profile</span>
1817
+ </button>
1818
+ </div>
1811
1819
  </div>
1812
1820
  </div>
1813
- </div>
1814
- </div>` }]
1821
+ </div>` }]
1815
1822
  }], ctorParameters: () => [{ type: LayoutService }] });
1816
1823
 
1817
1824
  class FooterComponent {
@@ -3566,7 +3573,7 @@ class ConfigComponent {
3566
3573
  </div>
3567
3574
  </div>
3568
3575
  </div>
3569
- @if (securityService.isAdmin) {
3576
+ @if (securityService.isAdmin()) {
3570
3577
  <div class="md:w-1/2">
3571
3578
  <div class="card flex flex-col gap-4">
3572
3579
  <div class="font-semibold text-xl">{{ l10n.menu }}</div>
@@ -3629,7 +3636,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.2", ngImpor
3629
3636
  </div>
3630
3637
  </div>
3631
3638
  </div>
3632
- @if (securityService.isAdmin) {
3639
+ @if (securityService.isAdmin()) {
3633
3640
  <div class="md:w-1/2">
3634
3641
  <div class="card flex flex-col gap-4">
3635
3642
  <div class="font-semibold text-xl">{{ l10n.menu }}</div>
@@ -4253,5 +4260,5 @@ const httpLoaderAuthFactory = (httpClient) => {
4253
4260
  * Generated bundle index. Do not edit.
4254
4261
  */
4255
4262
 
4256
- export { AppConfiguratorComponent, AppFloatingConfiguratorComponent, AppLayoutComponent, AppModulesComponent, AppTopbar, AuthGuardService, BaseDataService, BaseModuleComponent, ConfigComponent, DbMigrationComponent, ErrorComponent, FooterComponent, LayoutService, LogoComponent, MenuComponent, MenuService, MsgService, NotfoundComponent, ProfileComponent, SecurePipe, SecurityComponent, SecurityDataService, SecurityService, SecurityStorageService, SidebarComponent, TopBarService, UnauthorizedComponent, UserService, httpLoaderAuthFactory, langIntercept };
4263
+ export { AppConfiguratorComponent, AppFloatingConfiguratorComponent, AppLayoutComponent, AppModulesComponent, AppTopbar, AuthGuardService, BaseDataService, BaseModuleComponent, ConfigComponent, DbMigrationComponent, ErrorComponent, FooterComponent, KeycloakSecurityService, LayoutService, LogoComponent, MenuComponent, MenuService, MsgService, NotfoundComponent, ProfileComponent, SecurePipe, SecurityComponent, SecurityDataService, SecurityService, SecurityStorageService, SidebarComponent, TopBarService, UnauthorizedComponent, UserService, httpLoaderAuthFactory, langIntercept };
4257
4264
  //# sourceMappingURL=oip-common.mjs.map