@smartbit4all/ng-client 6.0.8 → 6.0.10

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.
Files changed (73) hide show
  1. package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +1 -1
  2. package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +7 -4
  3. package/esm2022/lib/session/smart-error-catching.interceptor.mjs +3 -3
  4. package/esm2022/lib/session/smart-session.service.mjs +48 -23
  5. package/esm2022/lib/smart-generic-pages/search-page/search-page.component.mjs +3 -3
  6. package/esm2022/lib/smart-tree/smarttree.component.mjs +3 -3
  7. package/esm2022/lib/theme/theme.service.mjs +48 -0
  8. package/esm2022/lib/view-context/api/api/view.service.mjs +211 -1
  9. package/esm2022/lib/view-context/api/api-default/binaryContentData.mjs +2 -0
  10. package/esm2022/lib/view-context/api/model/deviceInfo.mjs +1 -1
  11. package/esm2022/lib/view-context/api/model/iconPosition.mjs +1 -1
  12. package/esm2022/lib/view-context/api/model/menuTriggerType.mjs +17 -0
  13. package/esm2022/lib/view-context/api/model/models.mjs +7 -1
  14. package/esm2022/lib/view-context/api/model/namedValidator.mjs +1 -1
  15. package/esm2022/lib/view-context/api/model/publishedViewData.mjs +13 -0
  16. package/esm2022/lib/view-context/api/model/shellProperty.mjs +13 -0
  17. package/esm2022/lib/view-context/api/model/smartLinkData.mjs +1 -1
  18. package/esm2022/lib/view-context/api/model/themeDefinition.mjs +2 -0
  19. package/esm2022/lib/view-context/api/model/themeDescriptor.mjs +2 -0
  20. package/esm2022/lib/view-context/api/model/themeShellDescriptor.mjs +2 -0
  21. package/esm2022/lib/view-context/api/model/uiAction.mjs +1 -1
  22. package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +1 -1
  23. package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +1 -1
  24. package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +1 -1
  25. package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +1 -1
  26. package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +1 -1
  27. package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +1 -1
  28. package/esm2022/lib/view-context/api/model/view.mjs +1 -1
  29. package/esm2022/lib/view-context/api/model/viewData.mjs +1 -1
  30. package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +1 -1
  31. package/esm2022/lib/view-context/projects.mjs +3 -2
  32. package/esm2022/lib/view-context/smart-ui-action/components/menu/click/menu.component.mjs +205 -0
  33. package/esm2022/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.mjs +205 -0
  34. package/esm2022/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.mjs +35 -0
  35. package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +6 -4
  36. package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +18 -10
  37. package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +10 -7
  38. package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +13 -3
  39. package/esm2022/lib/view-context/smart-view-context.module.mjs +13 -7
  40. package/esm2022/lib/view-context/smart-view-context.service.mjs +14 -5
  41. package/esm2022/projects.mjs +2 -1
  42. package/fesm2022/smartbit4all-ng-client.mjs +895 -313
  43. package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
  44. package/lib/session/smart-backend-bootstrap.config.d.ts +9 -1
  45. package/lib/session/smart-backend-bootstrap.service.d.ts +3 -1
  46. package/lib/session/smart-error-catching.interceptor.d.ts +2 -1
  47. package/lib/session/smart-session.service.d.ts +18 -1
  48. package/lib/theme/theme.service.d.ts +17 -0
  49. package/lib/view-context/api/api/view.service.d.ts +94 -0
  50. package/lib/view-context/api/api-default/binaryContentData.d.ts +2 -0
  51. package/lib/view-context/api/model/deviceInfo.d.ts +1 -0
  52. package/lib/view-context/api/model/menuTriggerType.d.ts +15 -0
  53. package/lib/view-context/api/model/models.d.ts +6 -0
  54. package/lib/view-context/api/model/publishedViewData.d.ts +14 -0
  55. package/lib/view-context/api/model/shellProperty.d.ts +15 -0
  56. package/lib/view-context/api/model/themeDefinition.d.ts +22 -0
  57. package/lib/view-context/api/model/themeDescriptor.d.ts +16 -0
  58. package/lib/view-context/api/model/themeShellDescriptor.d.ts +17 -0
  59. package/lib/view-context/api/model/uiActionDescriptor.d.ts +2 -0
  60. package/lib/view-context/projects.d.ts +2 -1
  61. package/lib/view-context/smart-ui-action/components/menu/{menu.component.d.ts → click/menu.component.d.ts} +8 -7
  62. package/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.d.ts +43 -0
  63. package/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.d.ts +16 -0
  64. package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +1 -0
  65. package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +2 -1
  66. package/lib/view-context/smart-ui-action/ui-action.service.d.ts +3 -1
  67. package/lib/view-context/smart-view-context.module.d.ts +56 -54
  68. package/lib/view-context/smart-view-context.service.d.ts +4 -2
  69. package/package.json +1 -1
  70. package/projects.d.ts +1 -0
  71. package/smartbit4all-ng-client-6.0.10.tgz +0 -0
  72. package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.component.mjs +0 -199
  73. package/smartbit4all-ng-client-6.0.8.tgz +0 -0
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Injectable, Optional, Inject, PLATFORM_ID, NgModule, SkipSelf, RendererStyleFlags2, Directive, Input, HostBinding, HostListener, Component, EventEmitter, Output, ViewChildren, ViewChild, ElementRef, forwardRef, Pipe, ViewContainerRef, ViewEncapsulation, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, inject, input, computed, effect, signal, ApplicationRef, viewChild, ChangeDetectorRef } from '@angular/core';
2
+ import { InjectionToken, Injectable, Optional, Inject, PLATFORM_ID, NgModule, SkipSelf, RendererStyleFlags2, Directive, Input, HostBinding, HostListener, Component, EventEmitter, Output, signal, computed, ViewChildren, ViewChild, input, ElementRef, forwardRef, Pipe, ViewContainerRef, ViewEncapsulation, ChangeDetectionStrategy, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, effect, inject, ApplicationRef, viewChild, ChangeDetectorRef } from '@angular/core';
3
3
  import * as i1 from '@angular/common/http';
4
4
  import { HttpHeaders, HttpContext, HttpErrorResponse, HttpParams, HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
5
- import { Subject, lastValueFrom, take, takeUntil, interval, startWith, map, distinctUntilChanged, catchError, throwError, from } from 'rxjs';
5
+ import { Subject, lastValueFrom, take, tap, takeUntil, interval, startWith, map, distinctUntilChanged, catchError, throwError, from } from 'rxjs';
6
6
  import * as i1$2 from '@angular/common';
7
7
  import { isPlatformBrowser, DOCUMENT, DatePipe, CommonModule } from '@angular/common';
8
8
  import * as i5 from '@angular/material/button';
@@ -139,6 +139,13 @@ import { MatToolbarModule } from '@angular/material/toolbar';
139
139
  import { MatBadgeModule } from '@angular/material/badge';
140
140
  import { MatTabsModule } from '@angular/material/tabs';
141
141
 
142
+ var SessionErrorBehaviour;
143
+ (function (SessionErrorBehaviour) {
144
+ SessionErrorBehaviour[SessionErrorBehaviour["REFRESH"] = 0] = "REFRESH";
145
+ SessionErrorBehaviour[SessionErrorBehaviour["RESTART"] = 1] = "RESTART";
146
+ SessionErrorBehaviour[SessionErrorBehaviour["RESTART_VIEWCONTEXT"] = 2] = "RESTART_VIEWCONTEXT";
147
+ })(SessionErrorBehaviour || (SessionErrorBehaviour = {}));
148
+
142
149
  class SmartSubject extends Subject {
143
150
  constructor(unsubscribe$) {
144
151
  super();
@@ -1040,31 +1047,60 @@ class SmartSessionService {
1040
1047
  }
1041
1048
  async doRefreshSession() {
1042
1049
  try {
1043
- let refreshToken = localStorage.getItem('refreshToken');
1050
+ const refreshToken = localStorage.getItem('refreshToken');
1044
1051
  if (!refreshToken) {
1045
- return await this.startSession();
1052
+ // No refresh token at all: there is no HTTP refresh round-trip that the
1053
+ // interceptor could classify as an error, so run the session-restart
1054
+ // handling here instead of silently starting a new session.
1055
+ return await this.failRefresh();
1046
1056
  }
1047
- try {
1048
- const sessionInfo = await lastValueFrom(this.apiService.refreshSession({ refreshToken }));
1049
- if (sessionInfo) {
1050
- this.updateSessionInfo(sessionInfo);
1051
- return sessionInfo;
1052
- }
1057
+ const sessionInfo = await lastValueFrom(this.apiService.refreshSession({ refreshToken }));
1058
+ if (!sessionInfo) {
1059
+ // The refresh round-trip completed (HTTP 200) but yielded no session, so
1060
+ // the interceptor never saw an error response — handle it here as well.
1061
+ return await this.failRefresh();
1053
1062
  }
1054
- catch (error) {
1055
- if (this.isInvalidRefreshTokenError(error)) {
1056
- await this.clearAndStartNewSession();
1057
- // still throw the error, so the error can be handled in the caller
1058
- }
1059
- throw error;
1060
- }
1061
- // no sessionInfo returned
1062
- throw new Error('Unable to refresh session');
1063
+ this.updateSessionInfo(sessionInfo);
1064
+ return sessionInfo;
1065
+ // If the refresh call itself FAILS with a session error, the
1066
+ // SmartErrorCatchingInterceptor already runs handleSessionError for that
1067
+ // (nested) HTTP error response. We let that error propagate unchanged and
1068
+ // must NOT handle it again here — that would invoke handleSessionError twice.
1063
1069
  }
1064
1070
  finally {
1065
1071
  this.runningRefresh = undefined;
1066
1072
  }
1067
1073
  }
1074
+ /**
1075
+ * Runs the standard session-restart handling for a refresh that finished
1076
+ * without an error HTTP response (no refresh token, or an empty refresh
1077
+ * result), then throws a failure shaped like the backend's rejected refresh.
1078
+ *
1079
+ * Only the paths that do NOT produce an error HTTP response come here: a
1080
+ * refresh call that fails with a session error is already handled by the
1081
+ * SmartErrorCatchingInterceptor, so routing it through here too would invoke
1082
+ * handleSessionError a second time.
1083
+ */
1084
+ async failRefresh() {
1085
+ await this.handleSessionError({
1086
+ code: 'session.refreshtoken.invalid',
1087
+ behaviour: SessionErrorBehaviour.RESTART,
1088
+ });
1089
+ throw this.createRefreshFailedError();
1090
+ }
1091
+ /**
1092
+ * Builds a failure shaped exactly like the backend's rejected-refresh
1093
+ * response (HTTP 400 + ApiError.code === 'session.refreshtoken.invalid'), so a
1094
+ * failed/impossible refresh surfaces like any other invalid refresh token
1095
+ * instead of producing a fresh session as a refresh side effect.
1096
+ */
1097
+ createRefreshFailedError() {
1098
+ const error = {
1099
+ code: 'session.refreshtoken.invalid',
1100
+ message: 'Unable to refresh session',
1101
+ };
1102
+ return new HttpErrorResponse({ status: 400, error });
1103
+ }
1068
1104
  updateSessionInfo(sessionInfo) {
1069
1105
  this.sessionInfoData = sessionInfo;
1070
1106
  this.token = sessionInfo.sid;
@@ -1078,11 +1114,6 @@ class SmartSessionService {
1078
1114
  this.setUpTokenForSessionService();
1079
1115
  this.setAuthenticationStatus();
1080
1116
  }
1081
- isInvalidRefreshTokenError(error) {
1082
- return (error instanceof HttpErrorResponse &&
1083
- error.error &&
1084
- error.error.code === 'session.refreshtoken.invalid');
1085
- }
1086
1117
  async getAuthenticationProviders() {
1087
1118
  let providers = await this.apiService
1088
1119
  .getAuthenticationProviders()
@@ -1499,6 +1530,48 @@ class ViewService {
1499
1530
  reportProgress: reportProgress
1500
1531
  });
1501
1532
  }
1533
+ getAndroidTheme(name, observe = 'body', reportProgress = false, options) {
1534
+ if (name === null || name === undefined) {
1535
+ throw new Error('Required parameter name was null or undefined when calling getAndroidTheme.');
1536
+ }
1537
+ let localVarHeaders = this.defaultHeaders;
1538
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
1539
+ if (localVarHttpHeaderAcceptSelected === undefined) {
1540
+ // to determine the Accept header
1541
+ const httpHeaderAccepts = [
1542
+ 'application/json'
1543
+ ];
1544
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
1545
+ }
1546
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
1547
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
1548
+ }
1549
+ let localVarHttpContext = options && options.context;
1550
+ if (localVarHttpContext === undefined) {
1551
+ localVarHttpContext = new HttpContext();
1552
+ }
1553
+ let responseType_ = 'json';
1554
+ if (localVarHttpHeaderAcceptSelected) {
1555
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
1556
+ responseType_ = 'text';
1557
+ }
1558
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
1559
+ responseType_ = 'json';
1560
+ }
1561
+ else {
1562
+ responseType_ = 'blob';
1563
+ }
1564
+ }
1565
+ let localVarPath = `/context/themes/android/${this.configuration.encodeParam({ name: "name", value: name, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
1566
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
1567
+ context: localVarHttpContext,
1568
+ responseType: responseType_,
1569
+ withCredentials: this.configuration.withCredentials,
1570
+ headers: localVarHeaders,
1571
+ observe: observe,
1572
+ reportProgress: reportProgress
1573
+ });
1574
+ }
1502
1575
  getComponentModel(uuid, observe = 'body', reportProgress = false, options) {
1503
1576
  if (uuid === null || uuid === undefined) {
1504
1577
  throw new Error('Required parameter uuid was null or undefined when calling getComponentModel.');
@@ -1583,6 +1656,174 @@ class ViewService {
1583
1656
  reportProgress: reportProgress
1584
1657
  });
1585
1658
  }
1659
+ getIosTheme(name, observe = 'body', reportProgress = false, options) {
1660
+ if (name === null || name === undefined) {
1661
+ throw new Error('Required parameter name was null or undefined when calling getIosTheme.');
1662
+ }
1663
+ let localVarHeaders = this.defaultHeaders;
1664
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
1665
+ if (localVarHttpHeaderAcceptSelected === undefined) {
1666
+ // to determine the Accept header
1667
+ const httpHeaderAccepts = [
1668
+ 'application/json'
1669
+ ];
1670
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
1671
+ }
1672
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
1673
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
1674
+ }
1675
+ let localVarHttpContext = options && options.context;
1676
+ if (localVarHttpContext === undefined) {
1677
+ localVarHttpContext = new HttpContext();
1678
+ }
1679
+ let responseType_ = 'json';
1680
+ if (localVarHttpHeaderAcceptSelected) {
1681
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
1682
+ responseType_ = 'text';
1683
+ }
1684
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
1685
+ responseType_ = 'json';
1686
+ }
1687
+ else {
1688
+ responseType_ = 'blob';
1689
+ }
1690
+ }
1691
+ let localVarPath = `/context/themes/ios/${this.configuration.encodeParam({ name: "name", value: name, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
1692
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
1693
+ context: localVarHttpContext,
1694
+ responseType: responseType_,
1695
+ withCredentials: this.configuration.withCredentials,
1696
+ headers: localVarHeaders,
1697
+ observe: observe,
1698
+ reportProgress: reportProgress
1699
+ });
1700
+ }
1701
+ getPublishedViewData(channel, uuid, observe = 'body', reportProgress = false, options) {
1702
+ if (channel === null || channel === undefined) {
1703
+ throw new Error('Required parameter channel was null or undefined when calling getPublishedViewData.');
1704
+ }
1705
+ if (uuid === null || uuid === undefined) {
1706
+ throw new Error('Required parameter uuid was null or undefined when calling getPublishedViewData.');
1707
+ }
1708
+ let localVarHeaders = this.defaultHeaders;
1709
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
1710
+ if (localVarHttpHeaderAcceptSelected === undefined) {
1711
+ // to determine the Accept header
1712
+ const httpHeaderAccepts = [
1713
+ 'application/json'
1714
+ ];
1715
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
1716
+ }
1717
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
1718
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
1719
+ }
1720
+ let localVarHttpContext = options && options.context;
1721
+ if (localVarHttpContext === undefined) {
1722
+ localVarHttpContext = new HttpContext();
1723
+ }
1724
+ let responseType_ = 'json';
1725
+ if (localVarHttpHeaderAcceptSelected) {
1726
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
1727
+ responseType_ = 'text';
1728
+ }
1729
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
1730
+ responseType_ = 'json';
1731
+ }
1732
+ else {
1733
+ responseType_ = 'blob';
1734
+ }
1735
+ }
1736
+ let localVarPath = `/smartlink/${this.configuration.encodeParam({ name: "channel", value: channel, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}/${this.configuration.encodeParam({ name: "uuid", value: uuid, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
1737
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
1738
+ context: localVarHttpContext,
1739
+ responseType: responseType_,
1740
+ withCredentials: this.configuration.withCredentials,
1741
+ headers: localVarHeaders,
1742
+ observe: observe,
1743
+ reportProgress: reportProgress
1744
+ });
1745
+ }
1746
+ getTheme(name, observe = 'body', reportProgress = false, options) {
1747
+ if (name === null || name === undefined) {
1748
+ throw new Error('Required parameter name was null or undefined when calling getTheme.');
1749
+ }
1750
+ let localVarHeaders = this.defaultHeaders;
1751
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
1752
+ if (localVarHttpHeaderAcceptSelected === undefined) {
1753
+ // to determine the Accept header
1754
+ const httpHeaderAccepts = [
1755
+ 'application/json'
1756
+ ];
1757
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
1758
+ }
1759
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
1760
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
1761
+ }
1762
+ let localVarHttpContext = options && options.context;
1763
+ if (localVarHttpContext === undefined) {
1764
+ localVarHttpContext = new HttpContext();
1765
+ }
1766
+ let responseType_ = 'json';
1767
+ if (localVarHttpHeaderAcceptSelected) {
1768
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
1769
+ responseType_ = 'text';
1770
+ }
1771
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
1772
+ responseType_ = 'json';
1773
+ }
1774
+ else {
1775
+ responseType_ = 'blob';
1776
+ }
1777
+ }
1778
+ let localVarPath = `/context/themes/${this.configuration.encodeParam({ name: "name", value: name, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}`;
1779
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
1780
+ context: localVarHttpContext,
1781
+ responseType: responseType_,
1782
+ withCredentials: this.configuration.withCredentials,
1783
+ headers: localVarHeaders,
1784
+ observe: observe,
1785
+ reportProgress: reportProgress
1786
+ });
1787
+ }
1788
+ getThemes(observe = 'body', reportProgress = false, options) {
1789
+ let localVarHeaders = this.defaultHeaders;
1790
+ let localVarHttpHeaderAcceptSelected = options && options.httpHeaderAccept;
1791
+ if (localVarHttpHeaderAcceptSelected === undefined) {
1792
+ // to determine the Accept header
1793
+ const httpHeaderAccepts = [
1794
+ 'application/json'
1795
+ ];
1796
+ localVarHttpHeaderAcceptSelected = this.configuration.selectHeaderAccept(httpHeaderAccepts);
1797
+ }
1798
+ if (localVarHttpHeaderAcceptSelected !== undefined) {
1799
+ localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
1800
+ }
1801
+ let localVarHttpContext = options && options.context;
1802
+ if (localVarHttpContext === undefined) {
1803
+ localVarHttpContext = new HttpContext();
1804
+ }
1805
+ let responseType_ = 'json';
1806
+ if (localVarHttpHeaderAcceptSelected) {
1807
+ if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
1808
+ responseType_ = 'text';
1809
+ }
1810
+ else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
1811
+ responseType_ = 'json';
1812
+ }
1813
+ else {
1814
+ responseType_ = 'blob';
1815
+ }
1816
+ }
1817
+ let localVarPath = `/context/themes`;
1818
+ return this.httpClient.request('get', `${this.configuration.basePath}${localVarPath}`, {
1819
+ context: localVarHttpContext,
1820
+ responseType: responseType_,
1821
+ withCredentials: this.configuration.withCredentials,
1822
+ headers: localVarHeaders,
1823
+ observe: observe,
1824
+ reportProgress: reportProgress
1825
+ });
1826
+ }
1586
1827
  getViewConstraint(uuid, observe = 'body', reportProgress = false, options) {
1587
1828
  if (uuid === null || uuid === undefined) {
1588
1829
  throw new Error('Required parameter uuid was null or undefined when calling getViewConstraint.');
@@ -2301,6 +2542,23 @@ var LinkTargetEnum;
2301
2542
  })(LinkTargetEnum || (LinkTargetEnum = {}));
2302
2543
  ;
2303
2544
 
2545
+ /**
2546
+ * View API
2547
+ * View API
2548
+ *
2549
+ * The version of the OpenAPI document: 1.0.0
2550
+ * Contact: info@it4all.hu
2551
+ *
2552
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
2553
+ * https://openapi-generator.tech
2554
+ * Do not edit the class manually.
2555
+ */
2556
+ var MenuTriggerType;
2557
+ (function (MenuTriggerType) {
2558
+ MenuTriggerType["CLICK"] = "CLICK";
2559
+ MenuTriggerType["HOVER"] = "HOVER";
2560
+ })(MenuTriggerType || (MenuTriggerType = {}));
2561
+
2304
2562
  /**
2305
2563
  * View API
2306
2564
  * View API
@@ -2386,6 +2644,18 @@ var NamedValidatorOperationEnum;
2386
2644
  })(NamedValidatorOperationEnum || (NamedValidatorOperationEnum = {}));
2387
2645
  ;
2388
2646
 
2647
+ /**
2648
+ * View API
2649
+ * View API
2650
+ *
2651
+ * The version of the OpenAPI document: 1.0.0
2652
+ * Contact: info@it4all.hu
2653
+ *
2654
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
2655
+ * https://openapi-generator.tech
2656
+ * Do not edit the class manually.
2657
+ */
2658
+
2389
2659
  /**
2390
2660
  * View API
2391
2661
  * View API
@@ -2410,6 +2680,18 @@ var ServerRequestType;
2410
2680
  ServerRequestType["GET_COMPONENT_MODEL"] = "GET_COMPONENT_MODEL";
2411
2681
  })(ServerRequestType || (ServerRequestType = {}));
2412
2682
 
2683
+ /**
2684
+ * View API
2685
+ * View API
2686
+ *
2687
+ * The version of the OpenAPI document: 1.0.0
2688
+ * Contact: info@it4all.hu
2689
+ *
2690
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
2691
+ * https://openapi-generator.tech
2692
+ * Do not edit the class manually.
2693
+ */
2694
+
2413
2695
  var SmartLinkMigrationStatusStatusEnum;
2414
2696
  (function (SmartLinkMigrationStatusStatusEnum) {
2415
2697
  SmartLinkMigrationStatusStatusEnum["RUNNING"] = "RUNNING";
@@ -3080,21 +3362,29 @@ class UiActionButtonComponent {
3080
3362
  }
3081
3363
  ngOnInit() {
3082
3364
  if (!this.descriptor) {
3083
- throw new Error('UiActionButtonComponent: "descriptor" input is required but was not provided.');
3365
+ this.descriptor = {
3366
+ title: this.code ?? 'UNDEFINED_BUTTON',
3367
+ color: 'primary',
3368
+ type: UiActionButtonType.FLAT,
3369
+ };
3084
3370
  }
3371
+ this.buildMainActionModel();
3085
3372
  }
3086
3373
  ngOnChanges(changes) {
3087
3374
  if (changes['descriptor'] && this.descriptor) {
3088
- this.mainActionModel = {
3089
- descriptor: this.descriptor,
3090
- uiAction: {
3091
- descriptor: this.descriptor,
3092
- code: this.code,
3093
- disabled: this.disabled ?? false,
3094
- },
3095
- };
3375
+ this.buildMainActionModel();
3096
3376
  }
3097
3377
  }
3378
+ buildMainActionModel() {
3379
+ this.mainActionModel = {
3380
+ descriptor: this.descriptor,
3381
+ uiAction: {
3382
+ descriptor: this.descriptor,
3383
+ code: this.code,
3384
+ disabled: this.disabled ?? false,
3385
+ },
3386
+ };
3387
+ }
3098
3388
  ngOnDestroy() {
3099
3389
  this._destroy$.next();
3100
3390
  this._destroy$.complete();
@@ -3517,6 +3807,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
3517
3807
  args: [COMPONENT_LIBRARY]
3518
3808
  }] }] });
3519
3809
 
3810
+ const THEME_CACHE_KEY = 'themeCache';
3811
+ class ThemeService {
3812
+ constructor(viewService) {
3813
+ this.viewService = viewService;
3814
+ this._currentTheme = signal(localStorage.getItem(THEME_CACHE_KEY) ??
3815
+ (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'));
3816
+ this.currentTheme = computed(() => this._currentTheme());
3817
+ this.themes = [];
3818
+ }
3819
+ setTheme(themeDescriptor) {
3820
+ if (!themeDescriptor.name) {
3821
+ throw new Error('No theme name given.');
3822
+ }
3823
+ document.documentElement.className = 'theme-' + themeDescriptor.name;
3824
+ localStorage.setItem(THEME_CACHE_KEY, themeDescriptor.name);
3825
+ this._currentTheme.set(themeDescriptor.name);
3826
+ }
3827
+ getThemes() {
3828
+ return this.viewService.getThemes().pipe(tap((themes) => (this.themes = themes)));
3829
+ }
3830
+ async getSelectedTheme() {
3831
+ if (this.themes.length === 0) {
3832
+ this.themes = await lastValueFrom(this.getThemes());
3833
+ }
3834
+ var themeName = localStorage.getItem(THEME_CACHE_KEY) ?? this.getSystemTheme();
3835
+ var theme = this.themes.find((t) => t.name === themeName) ?? this.themes.find((t) => t.name === 'light');
3836
+ if (!theme) {
3837
+ throw new Error('No theme found.');
3838
+ }
3839
+ return theme;
3840
+ }
3841
+ getSystemTheme() {
3842
+ return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
3843
+ }
3844
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ThemeService, deps: [{ token: ViewService }], target: i0.ɵɵFactoryTarget.Injectable }); }
3845
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ThemeService, providedIn: 'root' }); }
3846
+ }
3847
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ThemeService, decorators: [{
3848
+ type: Injectable,
3849
+ args: [{
3850
+ providedIn: 'root',
3851
+ }]
3852
+ }], ctorParameters: () => [{ type: ViewService }] });
3853
+
3520
3854
  const SmartViewContextErrorDialogButtonLabel = 'SmartViewContextErrorDialogButtonLabel';
3521
3855
  const SmartViewContextErrorDialogTitle = 'SmartViewContextErrorDialogTitle';
3522
3856
  const SmartViewContextErrorDialogMessage = 'SmartViewContextErrorDialogMessage';
@@ -3534,11 +3868,12 @@ class SmartViewContextService {
3534
3868
  }
3535
3869
  return undefined;
3536
3870
  }
3537
- constructor(view, session, dialog, apiQueueService, inject, compLib, defaultViewComponents) {
3871
+ constructor(view, session, dialog, apiQueueService, themeService, inject, compLib, defaultViewComponents) {
3538
3872
  this.view = view;
3539
3873
  this.session = session;
3540
3874
  this.dialog = dialog;
3541
3875
  this.apiQueueService = apiQueueService;
3876
+ this.themeService = themeService;
3542
3877
  this.inject = inject;
3543
3878
  this.viewContextUuidName = 'viewContextUuid';
3544
3879
  this.viewContextUuidHeaderName = 'viewContextUuid';
@@ -3806,6 +4141,13 @@ class SmartViewContextService {
3806
4141
  parameters: new Map(),
3807
4142
  };
3808
4143
  viewContextUpdate.deviceInfo.componentLibrary = this.componentLibrary;
4144
+ try {
4145
+ var selectedTheme = await this.themeService.getSelectedTheme();
4146
+ viewContextUpdate.deviceInfo.themeName = selectedTheme.name;
4147
+ }
4148
+ catch (e) {
4149
+ // No themes are avalible
4150
+ }
3809
4151
  this.viewContext = await this.view.updateViewContext(viewContextUpdate).toPromise();
3810
4152
  return this.viewContext;
3811
4153
  }
@@ -4510,7 +4852,7 @@ class SmartViewContextService {
4510
4852
  getCurrentViewContext() {
4511
4853
  return this.viewContext;
4512
4854
  }
4513
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, deps: [{ token: ViewService }, { token: SmartSessionService }, { token: SmartViewContextDialogService }, { token: ApiQueueService }, { token: i0.Injector }, { token: COMPONENT_LIBRARY, optional: true }, { token: SMART_DEFAULT_VIEW_COMPONENTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
4855
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, deps: [{ token: ViewService }, { token: SmartSessionService }, { token: SmartViewContextDialogService }, { token: ApiQueueService }, { token: ThemeService }, { token: i0.Injector }, { token: COMPONENT_LIBRARY, optional: true }, { token: SMART_DEFAULT_VIEW_COMPONENTS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
4514
4856
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, providedIn: 'root' }); }
4515
4857
  }
4516
4858
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartViewContextService, decorators: [{
@@ -4518,7 +4860,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
4518
4860
  args: [{
4519
4861
  providedIn: 'root',
4520
4862
  }]
4521
- }], ctorParameters: () => [{ type: ViewService }, { type: SmartSessionService }, { type: SmartViewContextDialogService }, { type: ApiQueueService }, { type: i0.Injector }, { type: ComponentLibrary, decorators: [{
4863
+ }], ctorParameters: () => [{ type: ViewService }, { type: SmartSessionService }, { type: SmartViewContextDialogService }, { type: ApiQueueService }, { type: ThemeService }, { type: i0.Injector }, { type: ComponentLibrary, decorators: [{
4522
4864
  type: Inject,
4523
4865
  args: [COMPONENT_LIBRARY]
4524
4866
  }, {
@@ -5843,11 +6185,15 @@ class UiActionService {
5843
6185
  this._snackBar = _snackBar;
5844
6186
  this.viewContext = viewContext;
5845
6187
  this._destroy$ = new Subject();
6188
+ this.onActionError = (_, err) => console.log(err);
5846
6189
  }
5847
6190
  ngOnDestroy() {
5848
6191
  this._destroy$.next();
5849
6192
  this._destroy$.complete();
5850
6193
  }
6194
+ setActionErrorHandler(f) {
6195
+ this.onActionError = f;
6196
+ }
5851
6197
  async execute(uiAction, uiActionModel, options) {
5852
6198
  let uiActionRequest;
5853
6199
  uiActionRequest = {
@@ -6015,7 +6361,8 @@ class UiActionService {
6015
6361
  if (uiAction.composite) {
6016
6362
  const containerUuid = uiActionModel.serviceToUse.uuid;
6017
6363
  if (containerUuid) {
6018
- uiActionRequest.params['compositeModel'] = this.viewContext.getCompositeModel(containerUuid);
6364
+ uiActionRequest.params['compositeModel'] =
6365
+ this.viewContext.getCompositeModel(containerUuid);
6019
6366
  }
6020
6367
  }
6021
6368
  try {
@@ -6025,7 +6372,12 @@ class UiActionService {
6025
6372
  }
6026
6373
  }
6027
6374
  catch (error) {
6028
- console.error(error);
6375
+ try {
6376
+ this.onActionError(uiActionRequest, error);
6377
+ }
6378
+ catch (handlerError) {
6379
+ console.log('ActionError Handler crashed: ', handlerError);
6380
+ }
6029
6381
  }
6030
6382
  }
6031
6383
  showSavedSnackbar(uiAction) {
@@ -6151,7 +6503,200 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
6151
6503
  args: [{ providedIn: 'root' }]
6152
6504
  }] });
6153
6505
 
6154
- class MenuComponent {
6506
+ class ClickMenuComponent {
6507
+ constructor(menuService, overlay, viewContainerRef, overlayPositionBuilder, compLib) {
6508
+ this.menuService = menuService;
6509
+ this.overlay = overlay;
6510
+ this.viewContainerRef = viewContainerRef;
6511
+ this.overlayPositionBuilder = overlayPositionBuilder;
6512
+ this.compLib = compLib;
6513
+ this.overlayRef = null;
6514
+ this.isSubmenu = false;
6515
+ this.actionClick = new EventEmitter();
6516
+ this.submenuOpened = new EventEmitter();
6517
+ this.destroy$ = new Subject();
6518
+ this.submenuOpenMap = new Map();
6519
+ this.subActions = [];
6520
+ this.hasCheckedChildren = false;
6521
+ this.compLib = compLib ?? ComponentLibrary.PRIMENG;
6522
+ if (this.compLib === ComponentLibrary.PRIMENG) {
6523
+ this.icon = 'chevron-right';
6524
+ }
6525
+ else if (this.compLib === ComponentLibrary.MATERIAL) {
6526
+ this.icon = 'chevron_right';
6527
+ }
6528
+ }
6529
+ ngOnInit() {
6530
+ this.menuService
6531
+ .getCloseSignal()
6532
+ .pipe(takeUntil(this.destroy$))
6533
+ .subscribe(() => {
6534
+ this.closeMenu();
6535
+ });
6536
+ }
6537
+ ngAfterViewChecked() {
6538
+ if (this.isOpen && !this.hasCheckedChildren && this.submenuComponents.length > 0) {
6539
+ this.hasCheckedChildren = true;
6540
+ }
6541
+ }
6542
+ ngOnChanges(changes) {
6543
+ if (changes['triggerAction']) {
6544
+ const trigger = changes['triggerAction'].currentValue;
6545
+ const previousTrigger = changes['triggerAction'].previousValue;
6546
+ this.subActions = trigger?.subActions ?? [];
6547
+ if (this.isOpen && previousTrigger) {
6548
+ const hasSubActionsChanged = this.hasSubActionsChanged(previousTrigger?.subActions, trigger?.subActions);
6549
+ if (hasSubActionsChanged) {
6550
+ this.refreshOverlay();
6551
+ }
6552
+ }
6553
+ }
6554
+ }
6555
+ hasSubActionsChanged(oldSubActions, newSubActions) {
6556
+ const oldLength = oldSubActions?.length ?? 0;
6557
+ const newLength = newSubActions?.length ?? 0;
6558
+ if (oldLength !== newLength) {
6559
+ return true;
6560
+ }
6561
+ if (oldLength > 0 && newLength > 0) {
6562
+ for (let i = 0; i < newLength; i++) {
6563
+ if (oldSubActions[i].code !== newSubActions[i].code) {
6564
+ return true;
6565
+ }
6566
+ }
6567
+ }
6568
+ return false;
6569
+ }
6570
+ ngOnDestroy() {
6571
+ this.destroy$.next();
6572
+ this.destroy$.complete();
6573
+ }
6574
+ onActionClick(action) {
6575
+ if (!action.disabled) {
6576
+ this.actionClick.emit(action);
6577
+ this.menuService.closeAllMenus();
6578
+ }
6579
+ }
6580
+ onMenuClick(event) {
6581
+ event.stopPropagation();
6582
+ }
6583
+ onDocumentClick(event) {
6584
+ this.menuService.closeAllMenus();
6585
+ if (this.overlayRef) {
6586
+ this.closeMenu();
6587
+ }
6588
+ }
6589
+ get isOpen() {
6590
+ return !!this.overlayRef;
6591
+ }
6592
+ closeMenu() {
6593
+ if (this.overlayRef) {
6594
+ this.overlayRef.dispose();
6595
+ this.overlayRef = null;
6596
+ this.hasCheckedChildren = false;
6597
+ }
6598
+ if (this.submenuComponents && this.submenuComponents.length > 0) {
6599
+ this.submenuComponents.forEach((submenu) => {
6600
+ submenu.closeMenu();
6601
+ });
6602
+ }
6603
+ }
6604
+ refreshOverlay() {
6605
+ if (!this.overlayRef) {
6606
+ return;
6607
+ }
6608
+ this.overlayRef.detach();
6609
+ let portal = new TemplatePortal(this.menuTemplate, this.viewContainerRef);
6610
+ this.overlayRef.attach(portal);
6611
+ this.hasCheckedChildren = false;
6612
+ }
6613
+ openMenu(event) {
6614
+ if (this.isOpen) {
6615
+ return;
6616
+ }
6617
+ if (this.isSubmenu) {
6618
+ this.submenuOpened.emit(this.triggerAction);
6619
+ }
6620
+ else {
6621
+ this.menuService.closeAllMenus();
6622
+ }
6623
+ let triggerElement = event.currentTarget;
6624
+ var positions = this.isSubmenu ? SUBMENU_POSITIONS : ROOT_MENU_POSITIONS;
6625
+ let positionStrategy = this.overlayPositionBuilder
6626
+ .flexibleConnectedTo(triggerElement)
6627
+ .withFlexibleDimensions(false)
6628
+ .withPush(true)
6629
+ .withPositions(positions);
6630
+ this.overlayRef = this.overlay.create({
6631
+ positionStrategy,
6632
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
6633
+ hasBackdrop: false,
6634
+ });
6635
+ let portal = new TemplatePortal(this.menuTemplate, this.viewContainerRef);
6636
+ this.overlayRef.attach(portal);
6637
+ }
6638
+ toggleMenu(event) {
6639
+ if (!this.isOpen) {
6640
+ this.openMenu(event);
6641
+ }
6642
+ else {
6643
+ this.closeMenu();
6644
+ }
6645
+ }
6646
+ onSubmenuOpened(openedAction) {
6647
+ if (!this.submenuComponents || this.submenuComponents.length === 0) {
6648
+ setTimeout(() => {
6649
+ this.onSubmenuOpened(openedAction);
6650
+ }, 0);
6651
+ return;
6652
+ }
6653
+ this.submenuComponents.forEach((submenu) => {
6654
+ if (submenu.triggerAction.code !== openedAction.code && submenu.overlayRef) {
6655
+ submenu.closeMenu();
6656
+ }
6657
+ });
6658
+ }
6659
+ closeSiblingSubmenus(exceptAction) {
6660
+ this.submenuComponents?.forEach((submenu) => {
6661
+ if (submenu.triggerAction.code !== exceptAction.code && submenu.isOpen) {
6662
+ submenu.closeMenu();
6663
+ }
6664
+ });
6665
+ }
6666
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ClickMenuComponent, deps: [{ token: UiMenuService }, { token: i2$2.Overlay }, { token: i0.ViewContainerRef }, { token: i2$2.OverlayPositionBuilder }, { token: COMPONENT_LIBRARY, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
6667
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: ClickMenuComponent, selector: "ui-tiered-menu", inputs: { triggerAction: "triggerAction", isSubmenu: "isSubmenu" }, outputs: { actionClick: "actionClick", submenuOpened: "submenuOpened" }, host: { listeners: { "click": "onMenuClick($event)", "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "menuTemplate", first: true, predicate: ["menuTemplate"], descendants: true }, { propertyName: "submenuComponents", predicate: ["submenu"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (isSubmenu) {\r\n <div class=\"submenu hoverEffect\" [class.activeSubmenu]=\"isOpen\" (mouseenter)=\"openMenu($event)\">\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n <smart-icon [icon]=\"icon\" color=\"black\"></smart-icon>\r\n </div>\r\n} @else {\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n}\r\n\r\n<ng-template #menuTemplate>\r\n <ul class=\"ui-tiered-menu sb4-menu-panel\">\r\n <li\r\n *ngFor=\"let action of subActions\"\r\n class=\"hoverEffect\"\r\n [class.disabled]=\"action.disabled\"\r\n (mouseenter)=\"closeSiblingSubmenus(action)\"\r\n >\r\n @if (action.subActions && action.subActions.length > 0) {\r\n <ui-tiered-menu\r\n #submenu\r\n [triggerAction]=\"action\"\r\n [isSubmenu]=\"true\"\r\n [subActions]=\"action.subActions!\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (submenuOpened)=\"onSubmenuOpened(submenu)\"\r\n ></ui-tiered-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"action.descriptor!\"\r\n [code]=\"action.code\"\r\n [disabled]=\"!!action.disabled\"\r\n (actionClick)=\"!action.subActions?.length && onActionClick(action)\"\r\n ></ui-action-button>\r\n }\r\n </li>\r\n </ul>\r\n</ng-template>\r\n\r\n<ng-template #triggerTempalte>\r\n <ui-action-button\r\n [descriptor]=\"triggerAction.descriptor!\"\r\n [code]=\"triggerAction.code\"\r\n [disabled]=\"!!triggerAction.disabled\"\r\n (actionClick)=\"toggleMenu($event.event)\"\r\n [class.submenuTrigger]=\"isSubmenu\"\r\n >\r\n </ui-action-button>\r\n</ng-template>\r\n", styles: [":host{display:inline-block;position:relative}ul,.ui-tiered-menu{top:100%;left:0;list-style:none;padding-left:0;margin:0;background:#fff;width:fit-content;box-shadow:2px 2px 8px #0003;z-index:1000;border-radius:5px;padding:.1rem}.submenuTrigger,.ui-tiered-menu ::ng-deep button{background-color:#fff;box-shadow:unset;border:unset;border-radius:unset;color:#000;width:100%;justify-content:flex-start}.hoverEffect:hover,.hoverEffect ::ng-deep button:hover{background-color:#f1f5f9}.hoverEffect.activeSubmenu,.hoverEffect.activeSubmenu ::ng-deep button{background-color:#f1f5f9}.ui-tiered-menu ::ng-deep ui-action-button,.ui-tiered-menu ::ng-deep ui-badge{width:100%}.ui-tiered-menu>li{position:relative}.submenu{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.submenu ::ng-deep ui-action-button{flex:1}.disabled{color:#aaa;cursor:not-allowed}.ui-tiered-menu ui-tiered-menu{width:100%}smart-icon{align-content:center}\n"], dependencies: [{ kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: ClickMenuComponent, selector: "ui-tiered-menu", inputs: ["triggerAction", "isSubmenu"], outputs: ["actionClick", "submenuOpened"] }] }); }
6668
+ }
6669
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ClickMenuComponent, decorators: [{
6670
+ type: Component,
6671
+ args: [{ selector: 'ui-tiered-menu', template: "@if (isSubmenu) {\r\n <div class=\"submenu hoverEffect\" [class.activeSubmenu]=\"isOpen\" (mouseenter)=\"openMenu($event)\">\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n <smart-icon [icon]=\"icon\" color=\"black\"></smart-icon>\r\n </div>\r\n} @else {\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n}\r\n\r\n<ng-template #menuTemplate>\r\n <ul class=\"ui-tiered-menu sb4-menu-panel\">\r\n <li\r\n *ngFor=\"let action of subActions\"\r\n class=\"hoverEffect\"\r\n [class.disabled]=\"action.disabled\"\r\n (mouseenter)=\"closeSiblingSubmenus(action)\"\r\n >\r\n @if (action.subActions && action.subActions.length > 0) {\r\n <ui-tiered-menu\r\n #submenu\r\n [triggerAction]=\"action\"\r\n [isSubmenu]=\"true\"\r\n [subActions]=\"action.subActions!\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (submenuOpened)=\"onSubmenuOpened(submenu)\"\r\n ></ui-tiered-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"action.descriptor!\"\r\n [code]=\"action.code\"\r\n [disabled]=\"!!action.disabled\"\r\n (actionClick)=\"!action.subActions?.length && onActionClick(action)\"\r\n ></ui-action-button>\r\n }\r\n </li>\r\n </ul>\r\n</ng-template>\r\n\r\n<ng-template #triggerTempalte>\r\n <ui-action-button\r\n [descriptor]=\"triggerAction.descriptor!\"\r\n [code]=\"triggerAction.code\"\r\n [disabled]=\"!!triggerAction.disabled\"\r\n (actionClick)=\"toggleMenu($event.event)\"\r\n [class.submenuTrigger]=\"isSubmenu\"\r\n >\r\n </ui-action-button>\r\n</ng-template>\r\n", styles: [":host{display:inline-block;position:relative}ul,.ui-tiered-menu{top:100%;left:0;list-style:none;padding-left:0;margin:0;background:#fff;width:fit-content;box-shadow:2px 2px 8px #0003;z-index:1000;border-radius:5px;padding:.1rem}.submenuTrigger,.ui-tiered-menu ::ng-deep button{background-color:#fff;box-shadow:unset;border:unset;border-radius:unset;color:#000;width:100%;justify-content:flex-start}.hoverEffect:hover,.hoverEffect ::ng-deep button:hover{background-color:#f1f5f9}.hoverEffect.activeSubmenu,.hoverEffect.activeSubmenu ::ng-deep button{background-color:#f1f5f9}.ui-tiered-menu ::ng-deep ui-action-button,.ui-tiered-menu ::ng-deep ui-badge{width:100%}.ui-tiered-menu>li{position:relative}.submenu{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.submenu ::ng-deep ui-action-button{flex:1}.disabled{color:#aaa;cursor:not-allowed}.ui-tiered-menu ui-tiered-menu{width:100%}smart-icon{align-content:center}\n"] }]
6672
+ }], ctorParameters: () => [{ type: UiMenuService }, { type: i2$2.Overlay }, { type: i0.ViewContainerRef }, { type: i2$2.OverlayPositionBuilder }, { type: ComponentLibrary, decorators: [{
6673
+ type: Inject,
6674
+ args: [COMPONENT_LIBRARY]
6675
+ }, {
6676
+ type: Optional
6677
+ }] }], propDecorators: { submenuComponents: [{
6678
+ type: ViewChildren,
6679
+ args: ['submenu']
6680
+ }], menuTemplate: [{
6681
+ type: ViewChild,
6682
+ args: ['menuTemplate']
6683
+ }], triggerAction: [{
6684
+ type: Input
6685
+ }], isSubmenu: [{
6686
+ type: Input
6687
+ }], actionClick: [{
6688
+ type: Output
6689
+ }], submenuOpened: [{
6690
+ type: Output
6691
+ }], onMenuClick: [{
6692
+ type: HostListener,
6693
+ args: ['click', ['$event']]
6694
+ }], onDocumentClick: [{
6695
+ type: HostListener,
6696
+ args: ['document:click', ['$event']]
6697
+ }] } });
6698
+
6699
+ class HoverMenuComponent {
6155
6700
  constructor(menuService, overlay, viewContainerRef, overlayPositionBuilder, compLib) {
6156
6701
  this.menuService = menuService;
6157
6702
  this.overlay = overlay;
@@ -6269,7 +6814,7 @@ class MenuComponent {
6269
6814
  this.menuService.closeAllMenus();
6270
6815
  }
6271
6816
  let triggerElement = event.currentTarget;
6272
- const positions = this.isSubmenu ? SUBMENU_POSITIONS : ROOT_MENU_POSITIONS;
6817
+ var positions = this.isSubmenu ? SUBMENU_POSITIONS : ROOT_MENU_POSITIONS;
6273
6818
  let positionStrategy = this.overlayPositionBuilder
6274
6819
  .flexibleConnectedTo(triggerElement)
6275
6820
  .withFlexibleDimensions(false)
@@ -6292,7 +6837,6 @@ class MenuComponent {
6292
6837
  }
6293
6838
  }
6294
6839
  onSubmenuOpened(openedAction) {
6295
- // Check if submenuComponents is available
6296
6840
  if (!this.submenuComponents || this.submenuComponents.length === 0) {
6297
6841
  setTimeout(() => {
6298
6842
  this.onSubmenuOpened(openedAction);
@@ -6305,12 +6849,19 @@ class MenuComponent {
6305
6849
  }
6306
6850
  });
6307
6851
  }
6308
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: MenuComponent, deps: [{ token: UiMenuService }, { token: i2$2.Overlay }, { token: i0.ViewContainerRef }, { token: i2$2.OverlayPositionBuilder }, { token: COMPONENT_LIBRARY, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
6309
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: MenuComponent, selector: "ui-tiered-menu", inputs: { triggerAction: "triggerAction", isSubmenu: "isSubmenu" }, outputs: { actionClick: "actionClick", submenuOpened: "submenuOpened" }, host: { listeners: { "click": "onMenuClick($event)", "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "menuTemplate", first: true, predicate: ["menuTemplate"], descendants: true }, { propertyName: "submenuComponents", predicate: ["submenu"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (isSubmenu) {\r\n <div class=\"submenu hoverEffect\" [class.activeSubmenu]=\"isOpen\" (mouseenter)=\"openMenu($event)\">\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n <smart-icon [icon]=\"icon\" color=\"black\"></smart-icon>\r\n </div>\r\n} @else {\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n}\r\n\r\n<ng-template #menuTemplate>\r\n <ul class=\"ui-tiered-menu\">\r\n <li *ngFor=\"let action of subActions\" class=\"hoverEffect\" [class.disabled]=\"action.disabled\">\r\n @if (action.subActions && action.subActions.length > 0) {\r\n <ui-tiered-menu\r\n #submenu\r\n [triggerAction]=\"action\"\r\n [isSubmenu]=\"true\"\r\n [subActions]=\"action.subActions!\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (submenuOpened)=\"onSubmenuOpened(submenu)\"\r\n ></ui-tiered-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"action.descriptor!\"\r\n [code]=\"action.code\"\r\n [disabled]=\"!!action.disabled\"\r\n (actionClick)=\"!action.subActions?.length && onActionClick(action)\"\r\n ></ui-action-button>\r\n }\r\n </li>\r\n </ul>\r\n</ng-template>\r\n\r\n<ng-template #triggerTempalte>\r\n <ui-action-button\r\n [descriptor]=\"triggerAction.descriptor!\"\r\n [code]=\"triggerAction.code\"\r\n [disabled]=\"!!triggerAction.disabled\"\r\n (actionClick)=\"toggleMenu($event.event)\"\r\n [class.submenuTrigger]=\"isSubmenu\"\r\n >\r\n </ui-action-button>\r\n</ng-template>\r\n", styles: [":host{display:inline-block;position:relative}ul,.ui-tiered-menu{top:100%;left:0;list-style:none;padding-left:0;margin:0;background:#fff;width:fit-content;box-shadow:2px 2px 8px #0003;z-index:1000;border-radius:5px;padding:.1rem}.submenuTrigger,.ui-tiered-menu ::ng-deep button{background-color:#fff;box-shadow:unset;border:unset;border-radius:unset;color:#000;width:100%;justify-content:flex-start}.hoverEffect:hover,.hoverEffect ::ng-deep button:hover{background-color:#f1f5f9}.hoverEffect.activeSubmenu,.hoverEffect.activeSubmenu ::ng-deep button{background-color:#f1f5f9}.ui-tiered-menu ::ng-deep ui-action-button,.ui-tiered-menu ::ng-deep ui-badge{width:100%}.ui-tiered-menu>li{position:relative}.submenu{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.submenu ::ng-deep ui-action-button{flex:1}.disabled{color:#aaa;cursor:not-allowed}.ui-tiered-menu ui-tiered-menu{width:100%}smart-icon{align-content:center}\n"], dependencies: [{ kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: MenuComponent, selector: "ui-tiered-menu", inputs: ["triggerAction", "isSubmenu"], outputs: ["actionClick", "submenuOpened"] }] }); }
6852
+ closeSiblingSubmenus(exceptAction) {
6853
+ this.submenuComponents?.forEach((submenu) => {
6854
+ if (submenu.triggerAction.code !== exceptAction.code && submenu.isOpen) {
6855
+ submenu.closeMenu();
6856
+ }
6857
+ });
6858
+ }
6859
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: HoverMenuComponent, deps: [{ token: UiMenuService }, { token: i2$2.Overlay }, { token: i0.ViewContainerRef }, { token: i2$2.OverlayPositionBuilder }, { token: COMPONENT_LIBRARY, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
6860
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: HoverMenuComponent, selector: "ui-hover-menu", inputs: { triggerAction: "triggerAction", isSubmenu: "isSubmenu" }, outputs: { actionClick: "actionClick", submenuOpened: "submenuOpened" }, host: { listeners: { "click": "onMenuClick($event)", "document:click": "onDocumentClick($event)" } }, viewQueries: [{ propertyName: "menuTemplate", first: true, predicate: ["menuTemplate"], descendants: true }, { propertyName: "submenuComponents", predicate: ["submenu"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (isSubmenu) {\r\n <div class=\"submenu hoverEffect\" [class.activeSubmenu]=\"isOpen\" (mouseenter)=\"openMenu($event)\">\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n <smart-icon [icon]=\"icon\" color=\"black\"></smart-icon>\r\n </div>\r\n} @else {\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n}\r\n\r\n<ng-template #menuTemplate>\r\n <ul class=\"ui-hover-menu sb4-menu-panel\">\r\n <li\r\n *ngFor=\"let action of subActions\"\r\n class=\"hoverEffect\"\r\n [class.disabled]=\"action.disabled\"\r\n (mouseenter)=\"closeSiblingSubmenus(action)\"\r\n >\r\n @if (action.subActions && action.subActions.length > 0) {\r\n <ui-hover-menu\r\n #submenu\r\n [triggerAction]=\"action\"\r\n [isSubmenu]=\"true\"\r\n [subActions]=\"action.subActions!\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (submenuOpened)=\"onSubmenuOpened(submenu)\"\r\n ></ui-hover-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"action.descriptor!\"\r\n [code]=\"action.code\"\r\n [disabled]=\"!!action.disabled\"\r\n (actionClick)=\"onActionClick(action)\"\r\n ></ui-action-button>\r\n }\r\n </li>\r\n </ul>\r\n</ng-template>\r\n\r\n<ng-template #triggerTempalte>\r\n <ui-action-button\r\n [descriptor]=\"triggerAction.descriptor!\"\r\n [code]=\"triggerAction.code\"\r\n [disabled]=\"!!triggerAction.disabled\"\r\n (mouseenter)=\"openMenu($event)\"\r\n (actionClick)=\"onActionClick(triggerAction)\"\r\n [class.submenuTrigger]=\"isSubmenu\"\r\n >\r\n </ui-action-button>\r\n</ng-template>\r\n", styles: [":host{display:inline-block;position:relative}ul,.ui-hover-menu{top:100%;left:0;list-style:none;padding-left:0;margin:0;background:#fff;width:fit-content;box-shadow:2px 2px 8px #0003;z-index:1000;border-radius:5px;padding:.1rem}.submenuTrigger,.ui-hover-menu ::ng-deep button{background-color:#fff;box-shadow:unset;border:unset;border-radius:unset;color:#000;width:100%;justify-content:flex-start}.hoverEffect:hover,.hoverEffect ::ng-deep button:hover{background-color:#f1f5f9}.hoverEffect.activeSubmenu,.hoverEffect.activeSubmenu ::ng-deep button{background-color:#f1f5f9}.ui-hover-menu ::ng-deep ui-action-button,.ui-hover-menu ::ng-deep ui-badge{width:100%}.ui-hover-menu>li{position:relative}.submenu{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.submenu ::ng-deep ui-action-button{flex:1}.disabled{color:#aaa;cursor:not-allowed}.ui-hover-menu ui-hover-menu{width:100%}smart-icon{align-content:center}\n"], dependencies: [{ kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: HoverMenuComponent, selector: "ui-hover-menu", inputs: ["triggerAction", "isSubmenu"], outputs: ["actionClick", "submenuOpened"] }] }); }
6310
6861
  }
6311
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: MenuComponent, decorators: [{
6862
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: HoverMenuComponent, decorators: [{
6312
6863
  type: Component,
6313
- args: [{ selector: 'ui-tiered-menu', template: "@if (isSubmenu) {\r\n <div class=\"submenu hoverEffect\" [class.activeSubmenu]=\"isOpen\" (mouseenter)=\"openMenu($event)\">\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n <smart-icon [icon]=\"icon\" color=\"black\"></smart-icon>\r\n </div>\r\n} @else {\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n}\r\n\r\n<ng-template #menuTemplate>\r\n <ul class=\"ui-tiered-menu\">\r\n <li *ngFor=\"let action of subActions\" class=\"hoverEffect\" [class.disabled]=\"action.disabled\">\r\n @if (action.subActions && action.subActions.length > 0) {\r\n <ui-tiered-menu\r\n #submenu\r\n [triggerAction]=\"action\"\r\n [isSubmenu]=\"true\"\r\n [subActions]=\"action.subActions!\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (submenuOpened)=\"onSubmenuOpened(submenu)\"\r\n ></ui-tiered-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"action.descriptor!\"\r\n [code]=\"action.code\"\r\n [disabled]=\"!!action.disabled\"\r\n (actionClick)=\"!action.subActions?.length && onActionClick(action)\"\r\n ></ui-action-button>\r\n }\r\n </li>\r\n </ul>\r\n</ng-template>\r\n\r\n<ng-template #triggerTempalte>\r\n <ui-action-button\r\n [descriptor]=\"triggerAction.descriptor!\"\r\n [code]=\"triggerAction.code\"\r\n [disabled]=\"!!triggerAction.disabled\"\r\n (actionClick)=\"toggleMenu($event.event)\"\r\n [class.submenuTrigger]=\"isSubmenu\"\r\n >\r\n </ui-action-button>\r\n</ng-template>\r\n", styles: [":host{display:inline-block;position:relative}ul,.ui-tiered-menu{top:100%;left:0;list-style:none;padding-left:0;margin:0;background:#fff;width:fit-content;box-shadow:2px 2px 8px #0003;z-index:1000;border-radius:5px;padding:.1rem}.submenuTrigger,.ui-tiered-menu ::ng-deep button{background-color:#fff;box-shadow:unset;border:unset;border-radius:unset;color:#000;width:100%;justify-content:flex-start}.hoverEffect:hover,.hoverEffect ::ng-deep button:hover{background-color:#f1f5f9}.hoverEffect.activeSubmenu,.hoverEffect.activeSubmenu ::ng-deep button{background-color:#f1f5f9}.ui-tiered-menu ::ng-deep ui-action-button,.ui-tiered-menu ::ng-deep ui-badge{width:100%}.ui-tiered-menu>li{position:relative}.submenu{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.submenu ::ng-deep ui-action-button{flex:1}.disabled{color:#aaa;cursor:not-allowed}.ui-tiered-menu ui-tiered-menu{width:100%}smart-icon{align-content:center}\n"] }]
6864
+ args: [{ selector: 'ui-hover-menu', template: "@if (isSubmenu) {\r\n <div class=\"submenu hoverEffect\" [class.activeSubmenu]=\"isOpen\" (mouseenter)=\"openMenu($event)\">\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n <smart-icon [icon]=\"icon\" color=\"black\"></smart-icon>\r\n </div>\r\n} @else {\r\n <ng-container *ngTemplateOutlet=\"triggerTempalte\"></ng-container>\r\n}\r\n\r\n<ng-template #menuTemplate>\r\n <ul class=\"ui-hover-menu sb4-menu-panel\">\r\n <li\r\n *ngFor=\"let action of subActions\"\r\n class=\"hoverEffect\"\r\n [class.disabled]=\"action.disabled\"\r\n (mouseenter)=\"closeSiblingSubmenus(action)\"\r\n >\r\n @if (action.subActions && action.subActions.length > 0) {\r\n <ui-hover-menu\r\n #submenu\r\n [triggerAction]=\"action\"\r\n [isSubmenu]=\"true\"\r\n [subActions]=\"action.subActions!\"\r\n (actionClick)=\"actionClick.emit($event)\"\r\n (submenuOpened)=\"onSubmenuOpened(submenu)\"\r\n ></ui-hover-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"action.descriptor!\"\r\n [code]=\"action.code\"\r\n [disabled]=\"!!action.disabled\"\r\n (actionClick)=\"onActionClick(action)\"\r\n ></ui-action-button>\r\n }\r\n </li>\r\n </ul>\r\n</ng-template>\r\n\r\n<ng-template #triggerTempalte>\r\n <ui-action-button\r\n [descriptor]=\"triggerAction.descriptor!\"\r\n [code]=\"triggerAction.code\"\r\n [disabled]=\"!!triggerAction.disabled\"\r\n (mouseenter)=\"openMenu($event)\"\r\n (actionClick)=\"onActionClick(triggerAction)\"\r\n [class.submenuTrigger]=\"isSubmenu\"\r\n >\r\n </ui-action-button>\r\n</ng-template>\r\n", styles: [":host{display:inline-block;position:relative}ul,.ui-hover-menu{top:100%;left:0;list-style:none;padding-left:0;margin:0;background:#fff;width:fit-content;box-shadow:2px 2px 8px #0003;z-index:1000;border-radius:5px;padding:.1rem}.submenuTrigger,.ui-hover-menu ::ng-deep button{background-color:#fff;box-shadow:unset;border:unset;border-radius:unset;color:#000;width:100%;justify-content:flex-start}.hoverEffect:hover,.hoverEffect ::ng-deep button:hover{background-color:#f1f5f9}.hoverEffect.activeSubmenu,.hoverEffect.activeSubmenu ::ng-deep button{background-color:#f1f5f9}.ui-hover-menu ::ng-deep ui-action-button,.ui-hover-menu ::ng-deep ui-badge{width:100%}.ui-hover-menu>li{position:relative}.submenu{display:flex;flex-direction:row;justify-content:space-between;align-items:center}.submenu ::ng-deep ui-action-button{flex:1}.disabled{color:#aaa;cursor:not-allowed}.ui-hover-menu ui-hover-menu{width:100%}smart-icon{align-content:center}\n"] }]
6314
6865
  }], ctorParameters: () => [{ type: UiMenuService }, { type: i2$2.Overlay }, { type: i0.ViewContainerRef }, { type: i2$2.OverlayPositionBuilder }, { type: ComponentLibrary, decorators: [{
6315
6866
  type: Inject,
6316
6867
  args: [COMPONENT_LIBRARY]
@@ -6338,6 +6889,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
6338
6889
  args: ['document:click', ['$event']]
6339
6890
  }] } });
6340
6891
 
6892
+ class ThemeSelectorComponent {
6893
+ constructor(themeService) {
6894
+ this.themeService = themeService;
6895
+ this.model = input.required();
6896
+ this.action = computed(() => this.model().uiAction);
6897
+ this.themes = [];
6898
+ }
6899
+ ngOnInit() {
6900
+ this.themeService.getThemes().subscribe(async (themes) => {
6901
+ this.themes = themes;
6902
+ if (this.themes.length === 2) {
6903
+ var selectedTheme = await this.themeService.getSelectedTheme();
6904
+ this.themeDescriptor = this.themes.find((t) => t.name !== selectedTheme.name);
6905
+ }
6906
+ });
6907
+ }
6908
+ async onActionClicked(event, themeDescriptor) {
6909
+ this.themeService.setTheme(this.themeDescriptor);
6910
+ // If we have two themes (light / dark), toggle the other
6911
+ if (this.themes.length === 2) {
6912
+ this.themeDescriptor = this.themes.find((t) => t.name !== this.themeDescriptor?.name);
6913
+ }
6914
+ }
6915
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ThemeSelectorComponent, deps: [{ token: ThemeService }], target: i0.ɵɵFactoryTarget.Component }); }
6916
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: ThemeSelectorComponent, selector: "theme-selector", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@if (themeDescriptor) {\r\n <ui-action-button\r\n [descriptor]=\"themeDescriptor.descriptor!\"\r\n [code]=\"themeDescriptor.name\"\r\n (actionClick)=\"onActionClicked($event, themeDescriptor)\"\r\n >\r\n </ui-action-button>\r\n} @else if (action()) {\r\n <!-- <ui-tiered-menu\r\n #menu\r\n [triggerAction]=\"action()!\"\r\n [subActions]=\"action()?.subActions ?? []\"\r\n (actionClick)=\"onActionClicked($event, model())\"\r\n ></ui-tiered-menu> -->\r\n}\r\n", styles: [""], dependencies: [{ kind: "component", type: UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }] }); }
6917
+ }
6918
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: ThemeSelectorComponent, decorators: [{
6919
+ type: Component,
6920
+ args: [{ selector: 'theme-selector', template: "@if (themeDescriptor) {\r\n <ui-action-button\r\n [descriptor]=\"themeDescriptor.descriptor!\"\r\n [code]=\"themeDescriptor.name\"\r\n (actionClick)=\"onActionClicked($event, themeDescriptor)\"\r\n >\r\n </ui-action-button>\r\n} @else if (action()) {\r\n <!-- <ui-tiered-menu\r\n #menu\r\n [triggerAction]=\"action()!\"\r\n [subActions]=\"action()?.subActions ?? []\"\r\n (actionClick)=\"onActionClicked($event, model())\"\r\n ></ui-tiered-menu> -->\r\n}\r\n" }]
6921
+ }], ctorParameters: () => [{ type: ThemeService }] });
6922
+
6341
6923
  class UiActionToolbarComponent {
6342
6924
  constructor(service, inject, changeDetector, compLib) {
6343
6925
  this.service = service;
@@ -6346,6 +6928,7 @@ class UiActionToolbarComponent {
6346
6928
  this.compLib = compLib;
6347
6929
  this._destroy$ = new Subject();
6348
6930
  this.componentLibrary = ComponentLibrary; // Expose the enum to the template
6931
+ this.triggerType = MenuTriggerType;
6349
6932
  this.pressedButtonActive = true;
6350
6933
  this.scrollOnWrap = false;
6351
6934
  this.isScrollable = false;
@@ -6618,11 +7201,11 @@ class UiActionToolbarComponent {
6618
7201
  return this.toolbarPropertes?.direction === ToolbarDirection.VERTICAL;
6619
7202
  }
6620
7203
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: UiActionToolbarComponent, deps: [{ token: UiActionService }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }, { token: COMPONENT_LIBRARY }], target: i0.ɵɵFactoryTarget.Component }); }
6621
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: { uiActionModels: "uiActionModels", uiActionDescriptorService: "uiActionDescriptorService", id: "id", scrollOnWrap: "scrollOnWrap", toolbarPropertes: "toolbarPropertes" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonLeft\"\r\n (actionClick)=\"scrollLeft()\"\r\n (mousedown)=\"scrollStart('left')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('left')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<div\r\n #container\r\n class=\"uiActionButtonsContainer\"\r\n [ngClass]=\"{\r\n scrollableContent: scrollOnWrap,\r\n verticalToolbar: isVertical,\r\n }\"\r\n>\r\n <ng-container *ngFor=\"let uiActionModel of uiActionModelsWithDescriptions; trackBy: trackByFn\">\r\n @if (uiActionModel.uiAction.subActions && uiActionModel.uiAction.subActions.length > 0) {\r\n <ui-tiered-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-tiered-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"uiActionModel.descriptor!\"\r\n [code]=\"uiActionModel.uiAction.code\"\r\n [disabled]=\"!!uiActionModel.uiAction.disabled\"\r\n [addedCssClass]=\"uiActionModel.cssClass\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n (actionDoubleClick)=\"onActionDoubleClicked($event, uiActionModel)\"\r\n >\r\n </ui-action-button>\r\n }\r\n </ng-container>\r\n</div>\r\n\r\n@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonRight\"\r\n (actionClick)=\"scrollRight()\"\r\n (mousedown)=\"scrollStart('right')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('right')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n", styles: [":host:has(.uiActionButtonsContainer.scrollableContent){display:flex;flex-direction:row;justify-content:space-between;gap:.5rem;width:100%;align-items:center}.uiActionButtonsContainer{display:flex;flex-direction:row;gap:1rem;flex-wrap:wrap}.uiActionButtonsContainer ::ng-deep button{display:flex;gap:1rem;align-items:center;justify-content:center}.uiActionButtonsContainer ::ng-deep .buttonWrapper{position:relative;width:fit-content;height:fit-content}.scrollableContent{flex:1;flex-wrap:nowrap;overflow-x:auto;overflow-y:visible;display:flex;scrollbar-width:none;padding:.5rem 0;align-items:center}.scrollableContent::-webkit-scrollbar{display:none!important}.verticalToolbar{display:flex;flex-direction:column}.verticalToolbar ::ng-deep ui-action-button,.verticalToolbar ::ng-deep button{width:100%;justify-content:flex-start}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: MenuComponent, selector: "ui-tiered-menu", inputs: ["triggerAction", "isSubmenu"], outputs: ["actionClick", "submenuOpened"] }] }); }
7204
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: { uiActionModels: "uiActionModels", uiActionDescriptorService: "uiActionDescriptorService", id: "id", scrollOnWrap: "scrollOnWrap", toolbarPropertes: "toolbarPropertes" }, host: { listeners: { "window:resize": "onResize()" } }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonLeft\"\r\n (actionClick)=\"scrollLeft()\"\r\n (mousedown)=\"scrollStart('left')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('left')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<div\r\n #container\r\n class=\"uiActionButtonsContainer\"\r\n [ngClass]=\"{\r\n scrollableContent: scrollOnWrap,\r\n verticalToolbar: isVertical,\r\n }\"\r\n>\r\n <ng-container *ngFor=\"let uiActionModel of uiActionModelsWithDescriptions; trackBy: trackByFn\">\r\n @if (uiActionModel.uiAction.code === 'themeSelector') {\r\n <theme-selector [model]=\"uiActionModel\"></theme-selector>\r\n } @else if (uiActionModel.uiAction.subActions && uiActionModel.uiAction.subActions.length > 0) {\r\n <ng-container\r\n *ngTemplateOutlet=\"menuTypes; context: { uiActionModel: uiActionModel }\"\r\n ></ng-container>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"uiActionModel.descriptor!\"\r\n [code]=\"uiActionModel.uiAction.code\"\r\n [disabled]=\"!!uiActionModel.uiAction.disabled\"\r\n [addedCssClass]=\"uiActionModel.cssClass\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n (actionDoubleClick)=\"onActionDoubleClicked($event, uiActionModel)\"\r\n >\r\n </ui-action-button>\r\n }\r\n </ng-container>\r\n</div>\r\n\r\n@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonRight\"\r\n (actionClick)=\"scrollRight()\"\r\n (mousedown)=\"scrollStart('right')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('right')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<ng-template #menuTypes let-uiActionModel=\"uiActionModel\">\r\n @if (uiActionModel?.uiAction?.descriptor?.menuTriggerType == triggerType.HOVER) {\r\n <ui-hover-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-hover-menu>\r\n } @else {\r\n <ui-tiered-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-tiered-menu>\r\n }\r\n</ng-template>\r\n", styles: [":host:has(.uiActionButtonsContainer.scrollableContent){display:flex;flex-direction:row;justify-content:space-between;gap:.5rem;width:100%;align-items:center}.uiActionButtonsContainer{display:flex;flex-direction:row;gap:1rem;flex-wrap:wrap}.uiActionButtonsContainer ::ng-deep button{display:flex;gap:1rem;align-items:center;justify-content:center}.uiActionButtonsContainer ::ng-deep .buttonWrapper{position:relative;width:fit-content;height:fit-content}.scrollableContent{flex:1;flex-wrap:nowrap;overflow-x:auto;overflow-y:visible;display:flex;scrollbar-width:none;padding:.5rem 0;align-items:center}.scrollableContent::-webkit-scrollbar{display:none!important}.verticalToolbar{display:flex;flex-direction:column}.verticalToolbar ::ng-deep ui-action-button,.verticalToolbar ::ng-deep button{width:100%;justify-content:flex-start}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: ClickMenuComponent, selector: "ui-tiered-menu", inputs: ["triggerAction", "isSubmenu"], outputs: ["actionClick", "submenuOpened"] }, { kind: "component", type: HoverMenuComponent, selector: "ui-hover-menu", inputs: ["triggerAction", "isSubmenu"], outputs: ["actionClick", "submenuOpened"] }, { kind: "component", type: ThemeSelectorComponent, selector: "theme-selector", inputs: ["model"] }] }); }
6622
7205
  }
6623
7206
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: UiActionToolbarComponent, decorators: [{
6624
7207
  type: Component,
6625
- args: [{ selector: 'smart-ui-action-toolbar', template: "@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonLeft\"\r\n (actionClick)=\"scrollLeft()\"\r\n (mousedown)=\"scrollStart('left')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('left')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<div\r\n #container\r\n class=\"uiActionButtonsContainer\"\r\n [ngClass]=\"{\r\n scrollableContent: scrollOnWrap,\r\n verticalToolbar: isVertical,\r\n }\"\r\n>\r\n <ng-container *ngFor=\"let uiActionModel of uiActionModelsWithDescriptions; trackBy: trackByFn\">\r\n @if (uiActionModel.uiAction.subActions && uiActionModel.uiAction.subActions.length > 0) {\r\n <ui-tiered-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-tiered-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"uiActionModel.descriptor!\"\r\n [code]=\"uiActionModel.uiAction.code\"\r\n [disabled]=\"!!uiActionModel.uiAction.disabled\"\r\n [addedCssClass]=\"uiActionModel.cssClass\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n (actionDoubleClick)=\"onActionDoubleClicked($event, uiActionModel)\"\r\n >\r\n </ui-action-button>\r\n }\r\n </ng-container>\r\n</div>\r\n\r\n@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonRight\"\r\n (actionClick)=\"scrollRight()\"\r\n (mousedown)=\"scrollStart('right')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('right')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n", styles: [":host:has(.uiActionButtonsContainer.scrollableContent){display:flex;flex-direction:row;justify-content:space-between;gap:.5rem;width:100%;align-items:center}.uiActionButtonsContainer{display:flex;flex-direction:row;gap:1rem;flex-wrap:wrap}.uiActionButtonsContainer ::ng-deep button{display:flex;gap:1rem;align-items:center;justify-content:center}.uiActionButtonsContainer ::ng-deep .buttonWrapper{position:relative;width:fit-content;height:fit-content}.scrollableContent{flex:1;flex-wrap:nowrap;overflow-x:auto;overflow-y:visible;display:flex;scrollbar-width:none;padding:.5rem 0;align-items:center}.scrollableContent::-webkit-scrollbar{display:none!important}.verticalToolbar{display:flex;flex-direction:column}.verticalToolbar ::ng-deep ui-action-button,.verticalToolbar ::ng-deep button{width:100%;justify-content:flex-start}\n"] }]
7208
+ args: [{ selector: 'smart-ui-action-toolbar', template: "@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonLeft\"\r\n (actionClick)=\"scrollLeft()\"\r\n (mousedown)=\"scrollStart('left')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('left')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<div\r\n #container\r\n class=\"uiActionButtonsContainer\"\r\n [ngClass]=\"{\r\n scrollableContent: scrollOnWrap,\r\n verticalToolbar: isVertical,\r\n }\"\r\n>\r\n <ng-container *ngFor=\"let uiActionModel of uiActionModelsWithDescriptions; trackBy: trackByFn\">\r\n @if (uiActionModel.uiAction.code === 'themeSelector') {\r\n <theme-selector [model]=\"uiActionModel\"></theme-selector>\r\n } @else if (uiActionModel.uiAction.subActions && uiActionModel.uiAction.subActions.length > 0) {\r\n <ng-container\r\n *ngTemplateOutlet=\"menuTypes; context: { uiActionModel: uiActionModel }\"\r\n ></ng-container>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"uiActionModel.descriptor!\"\r\n [code]=\"uiActionModel.uiAction.code\"\r\n [disabled]=\"!!uiActionModel.uiAction.disabled\"\r\n [addedCssClass]=\"uiActionModel.cssClass\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n (actionDoubleClick)=\"onActionDoubleClicked($event, uiActionModel)\"\r\n >\r\n </ui-action-button>\r\n }\r\n </ng-container>\r\n</div>\r\n\r\n@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonRight\"\r\n (actionClick)=\"scrollRight()\"\r\n (mousedown)=\"scrollStart('right')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('right')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<ng-template #menuTypes let-uiActionModel=\"uiActionModel\">\r\n @if (uiActionModel?.uiAction?.descriptor?.menuTriggerType == triggerType.HOVER) {\r\n <ui-hover-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-hover-menu>\r\n } @else {\r\n <ui-tiered-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-tiered-menu>\r\n }\r\n</ng-template>\r\n", styles: [":host:has(.uiActionButtonsContainer.scrollableContent){display:flex;flex-direction:row;justify-content:space-between;gap:.5rem;width:100%;align-items:center}.uiActionButtonsContainer{display:flex;flex-direction:row;gap:1rem;flex-wrap:wrap}.uiActionButtonsContainer ::ng-deep button{display:flex;gap:1rem;align-items:center;justify-content:center}.uiActionButtonsContainer ::ng-deep .buttonWrapper{position:relative;width:fit-content;height:fit-content}.scrollableContent{flex:1;flex-wrap:nowrap;overflow-x:auto;overflow-y:visible;display:flex;scrollbar-width:none;padding:.5rem 0;align-items:center}.scrollableContent::-webkit-scrollbar{display:none!important}.verticalToolbar{display:flex;flex-direction:column}.verticalToolbar ::ng-deep ui-action-button,.verticalToolbar ::ng-deep button{width:100%;justify-content:flex-start}\n"] }]
6626
7209
  }], ctorParameters: () => [{ type: UiActionService }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: ComponentLibrary, decorators: [{
6627
7210
  type: Inject,
6628
7211
  args: [COMPONENT_LIBRARY]
@@ -7657,11 +8240,11 @@ class FileEditorToolbarComponent extends UiActionToolbarComponent {
7657
8240
  await super.fireAction(uiActionModel);
7658
8241
  }
7659
8242
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FileEditorToolbarComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
7660
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: FileEditorToolbarComponent, selector: "file-editor-toolbar", inputs: { dataUri: "dataUri" }, outputs: { actionEvent: "actionEvent" }, usesInheritance: true, ngImport: i0, template: "@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonLeft\"\r\n (actionClick)=\"scrollLeft()\"\r\n (mousedown)=\"scrollStart('left')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('left')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<div\r\n #container\r\n class=\"uiActionButtonsContainer\"\r\n [ngClass]=\"{\r\n scrollableContent: scrollOnWrap,\r\n verticalToolbar: isVertical,\r\n }\"\r\n>\r\n <ng-container *ngFor=\"let uiActionModel of uiActionModelsWithDescriptions; trackBy: trackByFn\">\r\n @if (uiActionModel.uiAction.subActions && uiActionModel.uiAction.subActions.length > 0) {\r\n <ui-tiered-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-tiered-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"uiActionModel.descriptor!\"\r\n [code]=\"uiActionModel.uiAction.code\"\r\n [disabled]=\"!!uiActionModel.uiAction.disabled\"\r\n [addedCssClass]=\"uiActionModel.cssClass\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n (actionDoubleClick)=\"onActionDoubleClicked($event, uiActionModel)\"\r\n >\r\n </ui-action-button>\r\n }\r\n </ng-container>\r\n</div>\r\n\r\n@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonRight\"\r\n (actionClick)=\"scrollRight()\"\r\n (mousedown)=\"scrollStart('right')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('right')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n", styles: [":host:has(.uiActionButtonsContainer.scrollableContent){display:flex;flex-direction:row;justify-content:space-between;gap:.5rem;width:100%;align-items:center}.uiActionButtonsContainer{display:flex;flex-direction:row;gap:1rem;flex-wrap:wrap}.uiActionButtonsContainer ::ng-deep button{display:flex;gap:1rem;align-items:center;justify-content:center}.uiActionButtonsContainer ::ng-deep .buttonWrapper{position:relative;width:fit-content;height:fit-content}.scrollableContent{flex:1;flex-wrap:nowrap;overflow-x:auto;overflow-y:visible;display:flex;scrollbar-width:none;padding:.5rem 0;align-items:center}.scrollableContent::-webkit-scrollbar{display:none!important}.verticalToolbar{display:flex;flex-direction:column}.verticalToolbar ::ng-deep ui-action-button,.verticalToolbar ::ng-deep button{width:100%;justify-content:flex-start}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: MenuComponent, selector: "ui-tiered-menu", inputs: ["triggerAction", "isSubmenu"], outputs: ["actionClick", "submenuOpened"] }] }); }
8243
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: FileEditorToolbarComponent, selector: "file-editor-toolbar", inputs: { dataUri: "dataUri" }, outputs: { actionEvent: "actionEvent" }, usesInheritance: true, ngImport: i0, template: "@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonLeft\"\r\n (actionClick)=\"scrollLeft()\"\r\n (mousedown)=\"scrollStart('left')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('left')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<div\r\n #container\r\n class=\"uiActionButtonsContainer\"\r\n [ngClass]=\"{\r\n scrollableContent: scrollOnWrap,\r\n verticalToolbar: isVertical,\r\n }\"\r\n>\r\n <ng-container *ngFor=\"let uiActionModel of uiActionModelsWithDescriptions; trackBy: trackByFn\">\r\n @if (uiActionModel.uiAction.code === 'themeSelector') {\r\n <theme-selector [model]=\"uiActionModel\"></theme-selector>\r\n } @else if (uiActionModel.uiAction.subActions && uiActionModel.uiAction.subActions.length > 0) {\r\n <ng-container\r\n *ngTemplateOutlet=\"menuTypes; context: { uiActionModel: uiActionModel }\"\r\n ></ng-container>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"uiActionModel.descriptor!\"\r\n [code]=\"uiActionModel.uiAction.code\"\r\n [disabled]=\"!!uiActionModel.uiAction.disabled\"\r\n [addedCssClass]=\"uiActionModel.cssClass\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n (actionDoubleClick)=\"onActionDoubleClicked($event, uiActionModel)\"\r\n >\r\n </ui-action-button>\r\n }\r\n </ng-container>\r\n</div>\r\n\r\n@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonRight\"\r\n (actionClick)=\"scrollRight()\"\r\n (mousedown)=\"scrollStart('right')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('right')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<ng-template #menuTypes let-uiActionModel=\"uiActionModel\">\r\n @if (uiActionModel?.uiAction?.descriptor?.menuTriggerType == triggerType.HOVER) {\r\n <ui-hover-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-hover-menu>\r\n } @else {\r\n <ui-tiered-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-tiered-menu>\r\n }\r\n</ng-template>\r\n", styles: [":host:has(.uiActionButtonsContainer.scrollableContent){display:flex;flex-direction:row;justify-content:space-between;gap:.5rem;width:100%;align-items:center}.uiActionButtonsContainer{display:flex;flex-direction:row;gap:1rem;flex-wrap:wrap}.uiActionButtonsContainer ::ng-deep button{display:flex;gap:1rem;align-items:center;justify-content:center}.uiActionButtonsContainer ::ng-deep .buttonWrapper{position:relative;width:fit-content;height:fit-content}.scrollableContent{flex:1;flex-wrap:nowrap;overflow-x:auto;overflow-y:visible;display:flex;scrollbar-width:none;padding:.5rem 0;align-items:center}.scrollableContent::-webkit-scrollbar{display:none!important}.verticalToolbar{display:flex;flex-direction:column}.verticalToolbar ::ng-deep ui-action-button,.verticalToolbar ::ng-deep button{width:100%;justify-content:flex-start}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "addedCssClass", "addBasicClasses"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: ClickMenuComponent, selector: "ui-tiered-menu", inputs: ["triggerAction", "isSubmenu"], outputs: ["actionClick", "submenuOpened"] }, { kind: "component", type: HoverMenuComponent, selector: "ui-hover-menu", inputs: ["triggerAction", "isSubmenu"], outputs: ["actionClick", "submenuOpened"] }, { kind: "component", type: ThemeSelectorComponent, selector: "theme-selector", inputs: ["model"] }] }); }
7661
8244
  }
7662
8245
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: FileEditorToolbarComponent, decorators: [{
7663
8246
  type: Component,
7664
- args: [{ selector: 'file-editor-toolbar', template: "@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonLeft\"\r\n (actionClick)=\"scrollLeft()\"\r\n (mousedown)=\"scrollStart('left')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('left')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<div\r\n #container\r\n class=\"uiActionButtonsContainer\"\r\n [ngClass]=\"{\r\n scrollableContent: scrollOnWrap,\r\n verticalToolbar: isVertical,\r\n }\"\r\n>\r\n <ng-container *ngFor=\"let uiActionModel of uiActionModelsWithDescriptions; trackBy: trackByFn\">\r\n @if (uiActionModel.uiAction.subActions && uiActionModel.uiAction.subActions.length > 0) {\r\n <ui-tiered-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-tiered-menu>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"uiActionModel.descriptor!\"\r\n [code]=\"uiActionModel.uiAction.code\"\r\n [disabled]=\"!!uiActionModel.uiAction.disabled\"\r\n [addedCssClass]=\"uiActionModel.cssClass\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n (actionDoubleClick)=\"onActionDoubleClicked($event, uiActionModel)\"\r\n >\r\n </ui-action-button>\r\n }\r\n </ng-container>\r\n</div>\r\n\r\n@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonRight\"\r\n (actionClick)=\"scrollRight()\"\r\n (mousedown)=\"scrollStart('right')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('right')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n", styles: [":host:has(.uiActionButtonsContainer.scrollableContent){display:flex;flex-direction:row;justify-content:space-between;gap:.5rem;width:100%;align-items:center}.uiActionButtonsContainer{display:flex;flex-direction:row;gap:1rem;flex-wrap:wrap}.uiActionButtonsContainer ::ng-deep button{display:flex;gap:1rem;align-items:center;justify-content:center}.uiActionButtonsContainer ::ng-deep .buttonWrapper{position:relative;width:fit-content;height:fit-content}.scrollableContent{flex:1;flex-wrap:nowrap;overflow-x:auto;overflow-y:visible;display:flex;scrollbar-width:none;padding:.5rem 0;align-items:center}.scrollableContent::-webkit-scrollbar{display:none!important}.verticalToolbar{display:flex;flex-direction:column}.verticalToolbar ::ng-deep ui-action-button,.verticalToolbar ::ng-deep button{width:100%;justify-content:flex-start}\n"] }]
8247
+ args: [{ selector: 'file-editor-toolbar', template: "@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonLeft\"\r\n (actionClick)=\"scrollLeft()\"\r\n (mousedown)=\"scrollStart('left')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('left')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<div\r\n #container\r\n class=\"uiActionButtonsContainer\"\r\n [ngClass]=\"{\r\n scrollableContent: scrollOnWrap,\r\n verticalToolbar: isVertical,\r\n }\"\r\n>\r\n <ng-container *ngFor=\"let uiActionModel of uiActionModelsWithDescriptions; trackBy: trackByFn\">\r\n @if (uiActionModel.uiAction.code === 'themeSelector') {\r\n <theme-selector [model]=\"uiActionModel\"></theme-selector>\r\n } @else if (uiActionModel.uiAction.subActions && uiActionModel.uiAction.subActions.length > 0) {\r\n <ng-container\r\n *ngTemplateOutlet=\"menuTypes; context: { uiActionModel: uiActionModel }\"\r\n ></ng-container>\r\n } @else {\r\n <ui-action-button\r\n [descriptor]=\"uiActionModel.descriptor!\"\r\n [code]=\"uiActionModel.uiAction.code\"\r\n [disabled]=\"!!uiActionModel.uiAction.disabled\"\r\n [addedCssClass]=\"uiActionModel.cssClass\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n (actionDoubleClick)=\"onActionDoubleClicked($event, uiActionModel)\"\r\n >\r\n </ui-action-button>\r\n }\r\n </ng-container>\r\n</div>\r\n\r\n@if (isScrollable && scrollOnWrap) {\r\n <ui-action-button\r\n [disabled]=\"!isScrollable\"\r\n [descriptor]=\"buttonRight\"\r\n (actionClick)=\"scrollRight()\"\r\n (mousedown)=\"scrollStart('right')\"\r\n (mouseup)=\"stopScroll()\"\r\n (mouseleave)=\"stopScroll()\"\r\n (touchstart)=\"scrollStart('right')\"\r\n (touchend)=\"stopScroll()\"\r\n />\r\n}\r\n\r\n<ng-template #menuTypes let-uiActionModel=\"uiActionModel\">\r\n @if (uiActionModel?.uiAction?.descriptor?.menuTriggerType == triggerType.HOVER) {\r\n <ui-hover-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-hover-menu>\r\n } @else {\r\n <ui-tiered-menu\r\n #menu\r\n [triggerAction]=\"uiActionModel.uiAction\"\r\n [subActions]=\"uiActionModel.uiAction.subActions!\"\r\n (actionClick)=\"onActionClicked($event, uiActionModel)\"\r\n ></ui-tiered-menu>\r\n }\r\n</ng-template>\r\n", styles: [":host:has(.uiActionButtonsContainer.scrollableContent){display:flex;flex-direction:row;justify-content:space-between;gap:.5rem;width:100%;align-items:center}.uiActionButtonsContainer{display:flex;flex-direction:row;gap:1rem;flex-wrap:wrap}.uiActionButtonsContainer ::ng-deep button{display:flex;gap:1rem;align-items:center;justify-content:center}.uiActionButtonsContainer ::ng-deep .buttonWrapper{position:relative;width:fit-content;height:fit-content}.scrollableContent{flex:1;flex-wrap:nowrap;overflow-x:auto;overflow-y:visible;display:flex;scrollbar-width:none;padding:.5rem 0;align-items:center}.scrollableContent::-webkit-scrollbar{display:none!important}.verticalToolbar{display:flex;flex-direction:column}.verticalToolbar ::ng-deep ui-action-button,.verticalToolbar ::ng-deep button{width:100%;justify-content:flex-start}\n"] }]
7665
8248
  }], propDecorators: { dataUri: [{
7666
8249
  type: Input
7667
8250
  }], actionEvent: [{
@@ -12970,12 +13553,14 @@ class SmartViewContextModule {
12970
13553
  SmartVoiceRecorderComponent,
12971
13554
  HighlightPipe,
12972
13555
  UiActionButtonComponent,
12973
- MenuComponent,
13556
+ ClickMenuComponent,
13557
+ HoverMenuComponent,
12974
13558
  UploadWidgetComponent,
12975
13559
  VoiceRecordWidgetComponent,
12976
13560
  PhotoCaptureWidgetComponent,
12977
13561
  PrimeFileUploaderComponent,
12978
- SmartEmbeddedSlotDirective], imports: [CommonModule,
13562
+ SmartEmbeddedSlotDirective,
13563
+ ThemeSelectorComponent], imports: [CommonModule,
12979
13564
  HttpClientModule,
12980
13565
  MatCommonModule,
12981
13566
  MatButtonModule,
@@ -13033,7 +13618,7 @@ class SmartViewContextModule {
13033
13618
  ComparableDropdownDirective,
13034
13619
  ComparableMultiselectDirective,
13035
13620
  UiActionButtonComponent,
13036
- MenuComponent,
13621
+ ClickMenuComponent,
13037
13622
  UploadWidgetComponent,
13038
13623
  VoiceRecordWidgetComponent,
13039
13624
  PhotoCaptureWidgetComponent,
@@ -13146,12 +13731,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
13146
13731
  SmartVoiceRecorderComponent,
13147
13732
  HighlightPipe,
13148
13733
  UiActionButtonComponent,
13149
- MenuComponent,
13734
+ ClickMenuComponent,
13735
+ HoverMenuComponent,
13150
13736
  UploadWidgetComponent,
13151
13737
  VoiceRecordWidgetComponent,
13152
13738
  PhotoCaptureWidgetComponent,
13153
13739
  PrimeFileUploaderComponent,
13154
13740
  SmartEmbeddedSlotDirective,
13741
+ ThemeSelectorComponent,
13155
13742
  ],
13156
13743
  imports: [
13157
13744
  CommonModule,
@@ -13218,7 +13805,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
13218
13805
  ComparableDropdownDirective,
13219
13806
  ComparableMultiselectDirective,
13220
13807
  UiActionButtonComponent,
13221
- MenuComponent,
13808
+ ClickMenuComponent,
13222
13809
  UploadWidgetComponent,
13223
13810
  VoiceRecordWidgetComponent,
13224
13811
  PhotoCaptureWidgetComponent,
@@ -13400,71 +13987,6 @@ var SmartActionType;
13400
13987
  * Public API Surface of smartdialog
13401
13988
  */
13402
13989
 
13403
- var SessionErrorBehaviour;
13404
- (function (SessionErrorBehaviour) {
13405
- SessionErrorBehaviour[SessionErrorBehaviour["REFRESH"] = 0] = "REFRESH";
13406
- SessionErrorBehaviour[SessionErrorBehaviour["RESTART"] = 1] = "RESTART";
13407
- SessionErrorBehaviour[SessionErrorBehaviour["RESTART_VIEWCONTEXT"] = 2] = "RESTART_VIEWCONTEXT";
13408
- })(SessionErrorBehaviour || (SessionErrorBehaviour = {}));
13409
-
13410
- class SmartSessionTimerService {
13411
- constructor(session) {
13412
- this.session = session;
13413
- this._destroy$ = new Subject();
13414
- this.totalTimeInMinutes = 30;
13415
- this.sessionExpiration = 'sessionExpiracy';
13416
- this.timeChanged = new SmartSubject(this._destroy$);
13417
- this.onTimerExpired = new SmartSubject(this._destroy$);
13418
- this.session.sessionExpiracyChanged.pipe(takeUntil(this._destroy$)).subscribe(() => {
13419
- this.restart();
13420
- });
13421
- }
13422
- ngOnDestroy() {
13423
- this._destroy$.next();
13424
- this._destroy$.complete();
13425
- }
13426
- startTimer() {
13427
- if (this.timer) {
13428
- clearInterval(this.timer);
13429
- }
13430
- const sessionInfoData = this.session.sessionInfoData;
13431
- const lifetimeSeconds = sessionInfoData?.duration;
13432
- if (lifetimeSeconds && lifetimeSeconds !== 0) {
13433
- this.timeLeftInSeconds = lifetimeSeconds;
13434
- }
13435
- else {
13436
- const expiration = new Date(sessionInfoData.expiration);
13437
- const now = new Date();
13438
- this.timeLeftInSeconds = Math.floor((expiration.getTime() - now.getTime()) / 1000);
13439
- }
13440
- this.timer = setInterval(() => {
13441
- this.timeLeftInSeconds--;
13442
- if (this.timeLeftInSeconds === 0) {
13443
- this.timeout();
13444
- }
13445
- this.timeChanged.next();
13446
- }, 1000);
13447
- }
13448
- restart() {
13449
- clearInterval(this.timer);
13450
- this.timer = undefined;
13451
- this.startTimer();
13452
- }
13453
- timeout() {
13454
- clearInterval(this.timer);
13455
- this.timer = undefined;
13456
- this.onTimerExpired.next();
13457
- }
13458
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionTimerService, deps: [{ token: SmartSessionService }], target: i0.ɵɵFactoryTarget.Injectable }); }
13459
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionTimerService, providedIn: 'root' }); }
13460
- }
13461
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionTimerService, decorators: [{
13462
- type: Injectable,
13463
- args: [{
13464
- providedIn: 'root',
13465
- }]
13466
- }], ctorParameters: () => [{ type: SmartSessionService }] });
13467
-
13468
13990
  /**
13469
13991
  * Thrown by `whenReady()` when the viewcontext was rebuilt between the
13470
13992
  * caller's entry into `whenReady()` and the gate releasing. Any uuid the
@@ -13480,9 +14002,10 @@ class ViewContextRebuiltError extends Error {
13480
14002
  }
13481
14003
  }
13482
14004
  class SmartBackendBootstrapService {
13483
- constructor(session, viewContext) {
14005
+ constructor(session, viewContext, uiActionService) {
13484
14006
  this.session = session;
13485
14007
  this.viewContext = viewContext;
14008
+ this.uiActionService = uiActionService;
13486
14009
  this.lastInitFailed = false;
13487
14010
  }
13488
14011
  configure(config) {
@@ -13500,6 +14023,7 @@ class SmartBackendBootstrapService {
13500
14023
  this.viewContext.openSmartLink.subscribe((channel) => {
13501
14024
  this.handleSmartLink(channel);
13502
14025
  });
14026
+ this.uiActionService.setActionErrorHandler(config.onActionError ?? ((_, err) => console.log(err)));
13503
14027
  }
13504
14028
  async handleSmartLink(channel) {
13505
14029
  if (this.config?.onSmartLink) {
@@ -13646,200 +14170,34 @@ class SmartBackendBootstrapService {
13646
14170
  handleSessionError(err) {
13647
14171
  if (!this.config) {
13648
14172
  return Promise.reject(new Error('SmartBackendBootstrapService.configure() must be called before handleSessionError().'));
13649
- }
13650
- if (this.runningSessionError) {
13651
- return this.runningSessionError;
13652
- }
13653
- this.runningSessionError = this.runSessionError(err);
13654
- return this.runningSessionError;
13655
- }
13656
- async runSessionError(err) {
13657
- try {
13658
- if (this.config?.onSessionError) {
13659
- await this.config.onSessionError(err);
13660
- return;
13661
- }
13662
- // Default: clear the session and let the backend rebuild via RESTART_VIEWCONTEXT.
13663
- // No router navigation here — the new viewcontext drives navigation server-side.
13664
- await this.session.clearAndStartNewSession();
13665
- }
13666
- finally {
13667
- this.runningSessionError = undefined;
13668
- }
13669
- }
13670
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartBackendBootstrapService, deps: [{ token: SmartSessionService }, { token: SmartViewContextService }], target: i0.ɵɵFactoryTarget.Injectable }); }
13671
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartBackendBootstrapService, providedIn: 'root' }); }
13672
- }
13673
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartBackendBootstrapService, decorators: [{
13674
- type: Injectable,
13675
- args: [{ providedIn: 'root' }]
13676
- }], ctorParameters: () => [{ type: SmartSessionService }, { type: SmartViewContextService }] });
13677
-
13678
- class SmartSessionTimerComponent {
13679
- constructor(service, bootstrap) {
13680
- this.service = service;
13681
- this.bootstrap = bootstrap;
13682
- this._destroy$ = new Subject();
13683
- }
13684
- ngOnInit() {
13685
- this.bootstrap.whenReady().then(() => {
13686
- this.service.startTimer();
13687
- this.timeInSeconds = this.service.timeLeftInSeconds;
13688
- this.service.timeChanged.pipe(takeUntil(this._destroy$)).subscribe(() => {
13689
- this.timeInSeconds = this.service.timeLeftInSeconds;
13690
- });
13691
- });
13692
- }
13693
- ngOnDestroy() {
13694
- this._destroy$.next();
13695
- this._destroy$.complete();
13696
- }
13697
- formatTime(seconds) {
13698
- let minutes = Math.floor(seconds / 60);
13699
- let remainingSeconds = seconds % 60;
13700
- return `${minutes}:${remainingSeconds < 10 ? '0' : ''}${remainingSeconds}`;
13701
- }
13702
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionTimerComponent, deps: [{ token: SmartSessionTimerService }, { token: SmartBackendBootstrapService }], target: i0.ɵɵFactoryTarget.Component }); }
13703
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartSessionTimerComponent, selector: "smart-session-timer", providers: [SmartSessionTimerService], ngImport: i0, template: "<div class=\"smart-session-timer-container\">\r\n <span class=\"smart-session-timer\" *ngIf=\"timeInSeconds\">\r\n {{ formatTime(timeInSeconds!) }}\r\n </span>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
13704
- }
13705
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionTimerComponent, decorators: [{
13706
- type: Component,
13707
- args: [{ selector: 'smart-session-timer', providers: [SmartSessionTimerService], template: "<div class=\"smart-session-timer-container\">\r\n <span class=\"smart-session-timer\" *ngIf=\"timeInSeconds\">\r\n {{ formatTime(timeInSeconds!) }}\r\n </span>\r\n</div>\r\n" }]
13708
- }], ctorParameters: () => [{ type: SmartSessionTimerService }, { type: SmartBackendBootstrapService }] });
13709
-
13710
- const STRINGS_HU = {
13711
- startErrorMessage: 'A szerver nem elérhető.',
13712
- startErrorRetry: 'Újrapróbálás',
13713
- transportErrorMessage: 'A szerver nem elérhető.',
13714
- transportErrorReload: 'Újratöltés',
13715
- sessionErrorMessage: 'A munkamenet lejárt, kérjük jelentkezzen be újra.',
13716
- sessionErrorAction: 'Bejelentkezés',
13717
- };
13718
- const STRINGS_EN = {
13719
- startErrorMessage: 'The server is unavailable.',
13720
- startErrorRetry: 'Retry',
13721
- transportErrorMessage: 'The server is unavailable.',
13722
- transportErrorReload: 'Reload',
13723
- sessionErrorMessage: 'Your session has expired. Please log in again.',
13724
- sessionErrorAction: 'Log in',
13725
- };
13726
- /**
13727
- * Opt-in default UX for `SmartBackendBootstrapService` error hooks.
13728
- *
13729
- * Spread the result of `hooks(options)` into `bootstrap.configure()` to get a
13730
- * MatSnackBar-based "error + retry" UI without writing the host glue:
13731
- *
13732
- * ```ts
13733
- * bootstrap.configure({
13734
- * ...minimalConfig,
13735
- * ...defaultErrorUi.hooks({ language: 'hu' }),
13736
- * });
13737
- * ```
13738
- *
13739
- * Hosts that want custom logic can omit this service and write their own
13740
- * `onStartError` / `onTransportError` callbacks directly.
13741
- */
13742
- class SmartDefaultErrorUiService {
13743
- constructor() {
13744
- this.snackBar = inject(MatSnackBar);
13745
- this.session = inject(SmartSessionService);
13746
- }
13747
- /** Returns a hooks bundle ready to spread into `bootstrap.configure()`. */
13748
- hooks(options = {}) {
13749
- return {
13750
- onStartError: (err) => this.showStartError(err, options),
13751
- onTransportError: (err) => this.showTransportError(err, options),
13752
- onSessionError: (err) => this.showSessionError(err, options),
13753
- };
13754
- }
13755
- showStartError(_err, options = {}) {
13756
- const s = this.resolveStrings(options);
13757
- const ref = this.snackBar.open(s.startErrorMessage, s.startErrorRetry, {
13758
- duration: 0, // sticky — app is not usable until retry succeeds
13759
- });
13760
- // Full reload, not bootstrap.start(). A bootstrap.start() retry only re-runs
13761
- // the init sequence; any components that already mounted during the failed
13762
- // attempt have rejected `whenReady()` Promises and won't re-trigger their
13763
- // run() when bootstrap eventually succeeds. Reload guarantees a clean mount.
13764
- ref.onAction().subscribe(() => this.verifyServerAndReload());
13765
- }
13766
- showTransportError(_err, options = {}) {
13767
- const s = this.resolveStrings(options);
13768
- const ref = this.snackBar.open(s.transportErrorMessage, s.transportErrorReload, {
13769
- duration: options.transportErrorDuration ?? 0,
13770
- });
13771
- ref.onAction().subscribe(() => this.verifyServerAndReload());
13772
- }
13773
- showSessionError(_err, options = {}) {
13774
- const s = this.resolveStrings(options);
13775
- const ref = this.snackBar.open(s.sessionErrorMessage, s.sessionErrorAction, {
13776
- duration: 0, // sticky — session is invalid until the user takes action
13777
- });
13778
- ref.onAction().subscribe(() => this.recoverSession());
13779
- }
13780
- /**
13781
- * Clears the dead session and reloads. Unlike `verifyServerAndReload`, this
13782
- * does NOT pre-check via `getSession()` — the SID is known to be invalid,
13783
- * so the check would fail. We best-effort `clearAndStartNewSession()`
13784
- * (creates a fresh anonymous session); reload happens regardless so the
13785
- * user is not stuck if the clear fails (e.g., server flapping).
13786
- *
13787
- * Overridable in tests.
13788
- */
13789
- async recoverSession() {
13790
- try {
13791
- await this.session.clearAndStartNewSession();
13792
- }
13793
- catch {
13794
- // Server may also be down; reload anyway and let bootstrap.start() retry.
13795
- }
13796
- this.reloadPage();
13797
- }
13798
- /**
13799
- * Pings `getSession()` before reloading: if the server is still down, the
13800
- * reload would just re-trigger the broken-screen state. The failed check
13801
- * goes through `SmartErrorCatchingInterceptor` and re-fires `onTransportError`,
13802
- * so the user sees a fresh snackbar — they get visible feedback that the
13803
- * server is still unreachable, without paying the cost of a full bundle
13804
- * reload that lands on the same broken state.
13805
- *
13806
- * Overridable in tests.
13807
- */
13808
- async verifyServerAndReload() {
13809
- try {
13810
- await this.session.getSession();
13811
- }
13812
- catch {
13813
- return; // server still unreachable — interceptor re-opens the snackbar
13814
- }
13815
- this.reloadPage();
13816
- }
13817
- /** Overridable in tests. */
13818
- reloadPage() {
13819
- window.location.reload();
13820
- }
13821
- resolveStrings(options) {
13822
- const lang = this.resolveLanguage(options.language);
13823
- const base = lang === 'hu' ? STRINGS_HU : STRINGS_EN;
13824
- return { ...base, ...(options.strings ?? {}) };
14173
+ }
14174
+ if (this.runningSessionError) {
14175
+ return this.runningSessionError;
14176
+ }
14177
+ this.runningSessionError = this.runSessionError(err);
14178
+ return this.runningSessionError;
13825
14179
  }
13826
- resolveLanguage(lang) {
13827
- if (lang === 'hu' || lang === 'en') {
13828
- return lang;
14180
+ async runSessionError(err) {
14181
+ try {
14182
+ if (this.config?.onSessionError) {
14183
+ await this.config.onSessionError(err);
14184
+ return;
14185
+ }
14186
+ // Default: clear the session and let the backend rebuild via RESTART_VIEWCONTEXT.
14187
+ // No router navigation here — the new viewcontext drives navigation server-side.
14188
+ await this.session.clearAndStartNewSession();
14189
+ }
14190
+ finally {
14191
+ this.runningSessionError = undefined;
13829
14192
  }
13830
- return navigator.language?.toLowerCase().startsWith('hu') ? 'hu' : 'en';
13831
14193
  }
13832
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartDefaultErrorUiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
13833
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartDefaultErrorUiService, providedIn: 'root' }); }
14194
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartBackendBootstrapService, deps: [{ token: SmartSessionService }, { token: SmartViewContextService }, { token: UiActionService }], target: i0.ɵɵFactoryTarget.Injectable }); }
14195
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartBackendBootstrapService, providedIn: 'root' }); }
13834
14196
  }
13835
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartDefaultErrorUiService, decorators: [{
14197
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartBackendBootstrapService, decorators: [{
13836
14198
  type: Injectable,
13837
14199
  args: [{ providedIn: 'root' }]
13838
- }] });
13839
-
13840
- /*
13841
- * Public API Surface of smart-session
13842
- */
14200
+ }], ctorParameters: () => [{ type: SmartSessionService }, { type: SmartViewContextService }, { type: UiActionService }] });
13843
14201
 
13844
14202
  class SmartErrorCatchingInterceptor {
13845
14203
  constructor(session, bootstrap) {
@@ -13984,6 +14342,96 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
13984
14342
  type: Injectable
13985
14343
  }], ctorParameters: () => [{ type: SmartSessionService }] });
13986
14344
 
14345
+ class SmartSessionTimerService {
14346
+ constructor(session) {
14347
+ this.session = session;
14348
+ this._destroy$ = new Subject();
14349
+ this.totalTimeInMinutes = 30;
14350
+ this.sessionExpiration = 'sessionExpiracy';
14351
+ this.timeChanged = new SmartSubject(this._destroy$);
14352
+ this.onTimerExpired = new SmartSubject(this._destroy$);
14353
+ this.session.sessionExpiracyChanged.pipe(takeUntil(this._destroy$)).subscribe(() => {
14354
+ this.restart();
14355
+ });
14356
+ }
14357
+ ngOnDestroy() {
14358
+ this._destroy$.next();
14359
+ this._destroy$.complete();
14360
+ }
14361
+ startTimer() {
14362
+ if (this.timer) {
14363
+ clearInterval(this.timer);
14364
+ }
14365
+ const sessionInfoData = this.session.sessionInfoData;
14366
+ const lifetimeSeconds = sessionInfoData?.duration;
14367
+ if (lifetimeSeconds && lifetimeSeconds !== 0) {
14368
+ this.timeLeftInSeconds = lifetimeSeconds;
14369
+ }
14370
+ else {
14371
+ const expiration = new Date(sessionInfoData.expiration);
14372
+ const now = new Date();
14373
+ this.timeLeftInSeconds = Math.floor((expiration.getTime() - now.getTime()) / 1000);
14374
+ }
14375
+ this.timer = setInterval(() => {
14376
+ this.timeLeftInSeconds--;
14377
+ if (this.timeLeftInSeconds === 0) {
14378
+ this.timeout();
14379
+ }
14380
+ this.timeChanged.next();
14381
+ }, 1000);
14382
+ }
14383
+ restart() {
14384
+ clearInterval(this.timer);
14385
+ this.timer = undefined;
14386
+ this.startTimer();
14387
+ }
14388
+ timeout() {
14389
+ clearInterval(this.timer);
14390
+ this.timer = undefined;
14391
+ this.onTimerExpired.next();
14392
+ }
14393
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionTimerService, deps: [{ token: SmartSessionService }], target: i0.ɵɵFactoryTarget.Injectable }); }
14394
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionTimerService, providedIn: 'root' }); }
14395
+ }
14396
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionTimerService, decorators: [{
14397
+ type: Injectable,
14398
+ args: [{
14399
+ providedIn: 'root',
14400
+ }]
14401
+ }], ctorParameters: () => [{ type: SmartSessionService }] });
14402
+
14403
+ class SmartSessionTimerComponent {
14404
+ constructor(service, bootstrap) {
14405
+ this.service = service;
14406
+ this.bootstrap = bootstrap;
14407
+ this._destroy$ = new Subject();
14408
+ }
14409
+ ngOnInit() {
14410
+ this.bootstrap.whenReady().then(() => {
14411
+ this.service.startTimer();
14412
+ this.timeInSeconds = this.service.timeLeftInSeconds;
14413
+ this.service.timeChanged.pipe(takeUntil(this._destroy$)).subscribe(() => {
14414
+ this.timeInSeconds = this.service.timeLeftInSeconds;
14415
+ });
14416
+ });
14417
+ }
14418
+ ngOnDestroy() {
14419
+ this._destroy$.next();
14420
+ this._destroy$.complete();
14421
+ }
14422
+ formatTime(seconds) {
14423
+ let minutes = Math.floor(seconds / 60);
14424
+ let remainingSeconds = seconds % 60;
14425
+ return `${minutes}:${remainingSeconds < 10 ? '0' : ''}${remainingSeconds}`;
14426
+ }
14427
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionTimerComponent, deps: [{ token: SmartSessionTimerService }, { token: SmartBackendBootstrapService }], target: i0.ɵɵFactoryTarget.Component }); }
14428
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartSessionTimerComponent, selector: "smart-session-timer", providers: [SmartSessionTimerService], ngImport: i0, template: "<div class=\"smart-session-timer-container\">\r\n <span class=\"smart-session-timer\" *ngIf=\"timeInSeconds\">\r\n {{ formatTime(timeInSeconds!) }}\r\n </span>\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
14429
+ }
14430
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionTimerComponent, decorators: [{
14431
+ type: Component,
14432
+ args: [{ selector: 'smart-session-timer', providers: [SmartSessionTimerService], template: "<div class=\"smart-session-timer-container\">\r\n <span class=\"smart-session-timer\" *ngIf=\"timeInSeconds\">\r\n {{ formatTime(timeInSeconds!) }}\r\n </span>\r\n</div>\r\n" }]
14433
+ }], ctorParameters: () => [{ type: SmartSessionTimerService }, { type: SmartBackendBootstrapService }] });
14434
+
13987
14435
  class SmartSessionModule {
13988
14436
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
13989
14437
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.11", ngImport: i0, type: SmartSessionModule, declarations: [SmartSessionTimerComponent], imports: [BrowserModule, MatCommonModule, MatExpansionModule, MatButtonModule, SmartIconModule], exports: [SmartSessionTimerComponent] }); }
@@ -18755,11 +19203,11 @@ class SmartTreeComponent {
18755
19203
  return `${cssClass}-${plusProperty}`;
18756
19204
  }
18757
19205
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartTreeComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
18758
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartTreeComponent, selector: "smart-tree", inputs: { treeStyle: "treeStyle", treeService: "treeService" }, host: { properties: { "attr.data-testid": "this.testId" } }, viewQueries: [{ propertyName: "tree", first: true, predicate: ["tree"], descendants: true }, { propertyName: "trigger", predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<div class=\"smartTreeContainer\">\r\n <smart-ui-action-toolbar\r\n *ngIf=\"uiActionModels.length\"\r\n [uiActionModels]=\"uiActionModels\"\r\n ></smart-ui-action-toolbar>\r\n <mat-tree\r\n #tree\r\n *ngIf=\"treeData\"\r\n [dataSource]=\"dataSource\"\r\n [treeControl]=\"treeControl\"\r\n class=\"sm-tree\"\r\n >\r\n <mat-nested-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodeToggle=\"{{ getIfExpanded(node) }}\"\r\n [ngClass]=\"getClassesForTreeNode(node)\"\r\n [ngStyle]=\"getNodeStyle(node)\"\r\n >\r\n <div\r\n [ngStyle]=\"getNodePadding(node)\"\r\n [ngClass]=\"getInnerClassesForTreeNode(node)\"\r\n class=\"mat-tree-node sm-tree-node\"\r\n (click)=\"onNodeClick($event, node)\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n (click)=\"onOpenNode($event, node)\"\r\n [attr.aria-label]=\"'Toggle ' + node.name\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n <div *ngIf=\"hasChild(node.level, node)\">\r\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </div>\r\n </mat-icon>\r\n </button>\r\n <smart-icon [icon]=\"node.icon\"> </smart-icon>\r\n <div class=\"sm-tree-row\" [ngClass]=\"node.classes\">\r\n <div class=\"sm-tree-row-caption\">\r\n {{ node.caption }}\r\n </div>\r\n <div class=\"sm-shortDescription-spacer\"></div>\r\n <div class=\"sm-tree-row-shortDescription\">\r\n {{ node.shortDescription }}\r\n </div>\r\n <div class=\"sm-shortDescription-button-spacer\"></div>\r\n <div *ngIf=\"node.button\" class=\"sm-tree-node-button\" [ngSwitch]=\"node.button.type\">\r\n <button\r\n (click)=\"customButtonClicked($event, node.button)\"\r\n *ngSwitchCase=\"smartTreeNodeButtonType.ICON\"\r\n mat-icon-button\r\n >\r\n <smart-icon title=\"{{ node.button.icon }}\" [icon]=\"node.button.icon\"></smart-icon>\r\n </button>\r\n <div *ngSwitchCase=\"smartTreeNodeButtonType.MENU\">\r\n <button\r\n mat-button\r\n [matMenuTriggerFor]=\"menu\"\r\n (click)=\"customButtonClicked($event, node.button, true)\"\r\n >\r\n <smart-icon *ngIf=\"node.button.icon\" [icon]=\"node.button.icon\"></smart-icon\r\n >{{ node.button.label }}\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button\r\n *ngFor=\"let button of node.button.menuItemButtons\"\r\n (click)=\"customButtonClicked($event, button, true)\"\r\n mat-menu-item\r\n [attr.data-testid]=\"button.code ?? null\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon\r\n >{{ button.label }}\r\n </button>\r\n </mat-menu>\r\n </div>\r\n <button\r\n (click)=\"customButtonClicked($event, node.button)\"\r\n *ngSwitchCase=\"smartTreeNodeButtonType.NORMAL\"\r\n mat-raised-button\r\n >\r\n <smart-icon *ngIf=\"node.button.icon\" [icon]=\"node.button.icon\"></smart-icon>\r\n {{ node.button.icon }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n [class.sm-tree-invisible]=\"!treeControl.isExpanded(node)\"\r\n [ngClass]=\"getClassesForTreeNodeChildren(node)\"\r\n role=\"group\"\r\n >\r\n <ng-container matTreeNodeOutlet></ng-container>\r\n </div>\r\n </mat-nested-tree-node>\r\n </mat-tree>\r\n <div *ngIf=\"!treeData\">\r\n <h3>\r\n {{ errorMessage }}\r\n </h3>\r\n </div>\r\n</div>\r\n", styles: [".smartTreeContainer{display:flex;flex-direction:column;gap:.5rem}.sm-tree-invisible{display:none}.sm-tree ul,.sm-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.sm-tree div[role=group]>.mat-tree-node{padding-left:40px}.sm-tee-node{padding-left:40px}.sm-tree-node-name{padding-left:15px;padding-top:15px;display:flex;flex-direction:column}.sm-tree-node-name-row{padding-left:15px;padding-top:15px;display:flex;flex-direction:row;justify-content:space-between}.sm-tree-node-name-col{padding-left:15px;padding-top:15px;display:flex;flex-direction:column}.sm-tee-node-id{font-weight:lighter}.mat-tree-node:hover{cursor:pointer}::ng-deep .mat-icon-rtl-mirror{display:flex;flex-direction:row}.sm-tree-row{display:flex;flex-direction:row;flex:1;align-items:center}.sm-shortDescription-spacer{flex:1}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1$2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11$1.MatNestedTreeNode, selector: "mat-nested-tree-node", inputs: ["matNestedTreeNode", "disabled", "tabIndex"], exportAs: ["matNestedTreeNode"] }, { kind: "directive", type: i11$1.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i11$1.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i11$1.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i11$1.MatTreeNodeOutlet, selector: "[matTreeNodeOutlet]" }, { kind: "component", type: i5$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }] }); }
19206
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SmartTreeComponent, selector: "smart-tree", inputs: { treeStyle: "treeStyle", treeService: "treeService" }, host: { properties: { "attr.data-testid": "this.testId" } }, viewQueries: [{ propertyName: "tree", first: true, predicate: ["tree"], descendants: true }, { propertyName: "trigger", predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<div class=\"smartTreeContainer\">\r\n <smart-ui-action-toolbar\r\n *ngIf=\"uiActionModels.length\"\r\n [uiActionModels]=\"uiActionModels\"\r\n ></smart-ui-action-toolbar>\r\n <mat-tree\r\n #tree\r\n *ngIf=\"treeData\"\r\n [dataSource]=\"dataSource\"\r\n [treeControl]=\"treeControl\"\r\n class=\"sm-tree\"\r\n >\r\n <mat-nested-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodeToggle=\"{{ getIfExpanded(node) }}\"\r\n [ngClass]=\"getClassesForTreeNode(node)\"\r\n [ngStyle]=\"getNodeStyle(node)\"\r\n >\r\n <div\r\n [ngStyle]=\"getNodePadding(node)\"\r\n [ngClass]=\"getInnerClassesForTreeNode(node)\"\r\n class=\"mat-tree-node sm-tree-node\"\r\n (click)=\"onNodeClick($event, node)\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n (click)=\"onOpenNode($event, node)\"\r\n [attr.aria-label]=\"'Toggle ' + node.name\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n <div *ngIf=\"hasChild(node.level, node)\">\r\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </div>\r\n </mat-icon>\r\n </button>\r\n <smart-icon [icon]=\"node.icon\"> </smart-icon>\r\n <div class=\"sm-tree-row\" [ngClass]=\"node.classes\">\r\n <div class=\"sm-tree-row-caption\">\r\n {{ node.caption }}\r\n </div>\r\n <div class=\"sm-shortDescription-spacer\"></div>\r\n <div class=\"sm-tree-row-shortDescription\">\r\n {{ node.shortDescription }}\r\n </div>\r\n <div class=\"sm-shortDescription-button-spacer\"></div>\r\n <div *ngIf=\"node.button\" class=\"sm-tree-node-button\" [ngSwitch]=\"node.button.type\">\r\n <button\r\n (click)=\"customButtonClicked($event, node.button)\"\r\n *ngSwitchCase=\"smartTreeNodeButtonType.ICON\"\r\n mat-icon-button\r\n >\r\n <smart-icon title=\"{{ node.button.icon }}\" [icon]=\"node.button.icon\"></smart-icon>\r\n </button>\r\n <div *ngSwitchCase=\"smartTreeNodeButtonType.MENU\">\r\n <button\r\n mat-button\r\n [matMenuTriggerFor]=\"menu\"\r\n (click)=\"customButtonClicked($event, node.button, true)\"\r\n >\r\n <smart-icon *ngIf=\"node.button.icon\" [icon]=\"node.button.icon\"></smart-icon\r\n >{{ node.button.label }}\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button\r\n *ngFor=\"let button of node.button.menuItemButtons\"\r\n (click)=\"customButtonClicked($event, button, true)\"\r\n mat-menu-item\r\n [attr.data-testid]=\"button.code ?? null\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon\r\n >{{ button.label }}\r\n </button>\r\n </mat-menu>\r\n </div>\r\n <button\r\n (click)=\"customButtonClicked($event, node.button)\"\r\n *ngSwitchCase=\"smartTreeNodeButtonType.NORMAL\"\r\n mat-raised-button\r\n >\r\n <smart-icon *ngIf=\"node.button.icon\" [icon]=\"node.button.icon\"></smart-icon>\r\n {{ node.button.icon }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n [class.sm-tree-invisible]=\"!treeControl.isExpanded(node)\"\r\n [ngClass]=\"getClassesForTreeNodeChildren(node)\"\r\n role=\"group\"\r\n >\r\n <ng-container matTreeNodeOutlet></ng-container>\r\n </div>\r\n </mat-nested-tree-node>\r\n </mat-tree>\r\n <div *ngIf=\"!treeData\">\r\n <div *ngIf=\"!treeData\" class=\"tree-skeleton\" aria-hidden=\"true\">\r\n <div class=\"skeleton-row\" style=\"--depth: 0; --w: 58%\">\r\n <span class=\"skeleton-caret\"></span>\r\n <span class=\"skeleton-label\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 1; --w: 72%\">\r\n <span class=\"skeleton-caret\"></span>\r\n <span class=\"skeleton-label\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 2; --w: 45%\">\r\n <span class=\"skeleton-label leaf\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 2; --w: 60%\">\r\n <span class=\"skeleton-label leaf\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 1; --w: 50%\">\r\n <span class=\"skeleton-caret\"></span>\r\n <span class=\"skeleton-label\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 2; --w: 65%\">\r\n <span class=\"skeleton-label leaf\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 0; --w: 40%\">\r\n <span class=\"skeleton-caret\"></span>\r\n <span class=\"skeleton-label\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 1; --w: 55%\">\r\n <span class=\"skeleton-label leaf\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".smartTreeContainer{display:flex;flex-direction:column;gap:.5rem}.sm-tree-invisible{display:none}.sm-tree ul,.sm-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.sm-tree div[role=group]>.mat-tree-node{padding-left:40px}.sm-tee-node{padding-left:40px}.sm-tree-node-name{padding-left:15px;padding-top:15px;display:flex;flex-direction:column}.sm-tree-node-name-row{padding-left:15px;padding-top:15px;display:flex;flex-direction:row;justify-content:space-between}.sm-tree-node-name-col{padding-left:15px;padding-top:15px;display:flex;flex-direction:column}.sm-tee-node-id{font-weight:lighter}.mat-tree-node:hover{cursor:pointer}::ng-deep .mat-icon-rtl-mirror{display:flex;flex-direction:row}.sm-tree-row{display:flex;flex-direction:row;flex:1;align-items:center}.sm-shortDescription-spacer{flex:1}.tree-skeleton{--skeleton-bg-color: #c7cbd1;display:flex;flex-direction:column;gap:.5rem;padding:.5rem 0}.skeleton-row{display:flex;align-items:center;gap:.5rem;padding-left:calc(var(--depth, 0) * 1.25rem)}.skeleton-caret{width:.9rem;height:.9rem;border-radius:2px;background:var(--skeleton-bg-color);flex-shrink:0;animation:skeleton-pulse 2s ease-in-out infinite}.skeleton-label{height:1.2rem;width:var(--w);border-radius:4px;background:var(--skeleton-bg-color);animation:skeleton-pulse 2s ease-in-out infinite}.skeleton-label.leaf{margin-left:1.1rem}@keyframes skeleton-pulse{0%,to{opacity:.35}50%{opacity:1}}@media (prefers-reduced-motion: reduce){.skeleton-caret,.skeleton-label{animation:none}}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1$2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11$1.MatNestedTreeNode, selector: "mat-nested-tree-node", inputs: ["matNestedTreeNode", "disabled", "tabIndex"], exportAs: ["matNestedTreeNode"] }, { kind: "directive", type: i11$1.MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: i11$1.MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "component", type: i11$1.MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: i11$1.MatTreeNodeOutlet, selector: "[matTreeNodeOutlet]" }, { kind: "component", type: i5$1.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i5$1.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i5$1.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: SmartIconComponent, selector: "smart-icon", inputs: ["icon", "color", "imageResource"] }, { kind: "component", type: UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }] }); }
18759
19207
  }
18760
19208
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartTreeComponent, decorators: [{
18761
19209
  type: Component,
18762
- args: [{ selector: 'smart-tree', template: "<div class=\"smartTreeContainer\">\r\n <smart-ui-action-toolbar\r\n *ngIf=\"uiActionModels.length\"\r\n [uiActionModels]=\"uiActionModels\"\r\n ></smart-ui-action-toolbar>\r\n <mat-tree\r\n #tree\r\n *ngIf=\"treeData\"\r\n [dataSource]=\"dataSource\"\r\n [treeControl]=\"treeControl\"\r\n class=\"sm-tree\"\r\n >\r\n <mat-nested-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodeToggle=\"{{ getIfExpanded(node) }}\"\r\n [ngClass]=\"getClassesForTreeNode(node)\"\r\n [ngStyle]=\"getNodeStyle(node)\"\r\n >\r\n <div\r\n [ngStyle]=\"getNodePadding(node)\"\r\n [ngClass]=\"getInnerClassesForTreeNode(node)\"\r\n class=\"mat-tree-node sm-tree-node\"\r\n (click)=\"onNodeClick($event, node)\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n (click)=\"onOpenNode($event, node)\"\r\n [attr.aria-label]=\"'Toggle ' + node.name\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n <div *ngIf=\"hasChild(node.level, node)\">\r\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </div>\r\n </mat-icon>\r\n </button>\r\n <smart-icon [icon]=\"node.icon\"> </smart-icon>\r\n <div class=\"sm-tree-row\" [ngClass]=\"node.classes\">\r\n <div class=\"sm-tree-row-caption\">\r\n {{ node.caption }}\r\n </div>\r\n <div class=\"sm-shortDescription-spacer\"></div>\r\n <div class=\"sm-tree-row-shortDescription\">\r\n {{ node.shortDescription }}\r\n </div>\r\n <div class=\"sm-shortDescription-button-spacer\"></div>\r\n <div *ngIf=\"node.button\" class=\"sm-tree-node-button\" [ngSwitch]=\"node.button.type\">\r\n <button\r\n (click)=\"customButtonClicked($event, node.button)\"\r\n *ngSwitchCase=\"smartTreeNodeButtonType.ICON\"\r\n mat-icon-button\r\n >\r\n <smart-icon title=\"{{ node.button.icon }}\" [icon]=\"node.button.icon\"></smart-icon>\r\n </button>\r\n <div *ngSwitchCase=\"smartTreeNodeButtonType.MENU\">\r\n <button\r\n mat-button\r\n [matMenuTriggerFor]=\"menu\"\r\n (click)=\"customButtonClicked($event, node.button, true)\"\r\n >\r\n <smart-icon *ngIf=\"node.button.icon\" [icon]=\"node.button.icon\"></smart-icon\r\n >{{ node.button.label }}\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button\r\n *ngFor=\"let button of node.button.menuItemButtons\"\r\n (click)=\"customButtonClicked($event, button, true)\"\r\n mat-menu-item\r\n [attr.data-testid]=\"button.code ?? null\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon\r\n >{{ button.label }}\r\n </button>\r\n </mat-menu>\r\n </div>\r\n <button\r\n (click)=\"customButtonClicked($event, node.button)\"\r\n *ngSwitchCase=\"smartTreeNodeButtonType.NORMAL\"\r\n mat-raised-button\r\n >\r\n <smart-icon *ngIf=\"node.button.icon\" [icon]=\"node.button.icon\"></smart-icon>\r\n {{ node.button.icon }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n [class.sm-tree-invisible]=\"!treeControl.isExpanded(node)\"\r\n [ngClass]=\"getClassesForTreeNodeChildren(node)\"\r\n role=\"group\"\r\n >\r\n <ng-container matTreeNodeOutlet></ng-container>\r\n </div>\r\n </mat-nested-tree-node>\r\n </mat-tree>\r\n <div *ngIf=\"!treeData\">\r\n <h3>\r\n {{ errorMessage }}\r\n </h3>\r\n </div>\r\n</div>\r\n", styles: [".smartTreeContainer{display:flex;flex-direction:column;gap:.5rem}.sm-tree-invisible{display:none}.sm-tree ul,.sm-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.sm-tree div[role=group]>.mat-tree-node{padding-left:40px}.sm-tee-node{padding-left:40px}.sm-tree-node-name{padding-left:15px;padding-top:15px;display:flex;flex-direction:column}.sm-tree-node-name-row{padding-left:15px;padding-top:15px;display:flex;flex-direction:row;justify-content:space-between}.sm-tree-node-name-col{padding-left:15px;padding-top:15px;display:flex;flex-direction:column}.sm-tee-node-id{font-weight:lighter}.mat-tree-node:hover{cursor:pointer}::ng-deep .mat-icon-rtl-mirror{display:flex;flex-direction:row}.sm-tree-row{display:flex;flex-direction:row;flex:1;align-items:center}.sm-shortDescription-spacer{flex:1}\n"] }]
19210
+ args: [{ selector: 'smart-tree', template: "<div class=\"smartTreeContainer\">\r\n <smart-ui-action-toolbar\r\n *ngIf=\"uiActionModels.length\"\r\n [uiActionModels]=\"uiActionModels\"\r\n ></smart-ui-action-toolbar>\r\n <mat-tree\r\n #tree\r\n *ngIf=\"treeData\"\r\n [dataSource]=\"dataSource\"\r\n [treeControl]=\"treeControl\"\r\n class=\"sm-tree\"\r\n >\r\n <mat-nested-tree-node\r\n *matTreeNodeDef=\"let node; when: hasChild\"\r\n matTreeNodeToggle=\"{{ getIfExpanded(node) }}\"\r\n [ngClass]=\"getClassesForTreeNode(node)\"\r\n [ngStyle]=\"getNodeStyle(node)\"\r\n >\r\n <div\r\n [ngStyle]=\"getNodePadding(node)\"\r\n [ngClass]=\"getInnerClassesForTreeNode(node)\"\r\n class=\"mat-tree-node sm-tree-node\"\r\n (click)=\"onNodeClick($event, node)\"\r\n >\r\n <button\r\n mat-icon-button\r\n matTreeNodeToggle\r\n (click)=\"onOpenNode($event, node)\"\r\n [attr.aria-label]=\"'Toggle ' + node.name\"\r\n >\r\n <mat-icon class=\"mat-icon-rtl-mirror\">\r\n <div *ngIf=\"hasChild(node.level, node)\">\r\n {{ treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\r\n </div>\r\n </mat-icon>\r\n </button>\r\n <smart-icon [icon]=\"node.icon\"> </smart-icon>\r\n <div class=\"sm-tree-row\" [ngClass]=\"node.classes\">\r\n <div class=\"sm-tree-row-caption\">\r\n {{ node.caption }}\r\n </div>\r\n <div class=\"sm-shortDescription-spacer\"></div>\r\n <div class=\"sm-tree-row-shortDescription\">\r\n {{ node.shortDescription }}\r\n </div>\r\n <div class=\"sm-shortDescription-button-spacer\"></div>\r\n <div *ngIf=\"node.button\" class=\"sm-tree-node-button\" [ngSwitch]=\"node.button.type\">\r\n <button\r\n (click)=\"customButtonClicked($event, node.button)\"\r\n *ngSwitchCase=\"smartTreeNodeButtonType.ICON\"\r\n mat-icon-button\r\n >\r\n <smart-icon title=\"{{ node.button.icon }}\" [icon]=\"node.button.icon\"></smart-icon>\r\n </button>\r\n <div *ngSwitchCase=\"smartTreeNodeButtonType.MENU\">\r\n <button\r\n mat-button\r\n [matMenuTriggerFor]=\"menu\"\r\n (click)=\"customButtonClicked($event, node.button, true)\"\r\n >\r\n <smart-icon *ngIf=\"node.button.icon\" [icon]=\"node.button.icon\"></smart-icon\r\n >{{ node.button.label }}\r\n </button>\r\n <mat-menu #menu=\"matMenu\">\r\n <button\r\n *ngFor=\"let button of node.button.menuItemButtons\"\r\n (click)=\"customButtonClicked($event, button, true)\"\r\n mat-menu-item\r\n [attr.data-testid]=\"button.code ?? null\"\r\n >\r\n <smart-icon *ngIf=\"button.icon\" [icon]=\"button.icon\"></smart-icon\r\n >{{ button.label }}\r\n </button>\r\n </mat-menu>\r\n </div>\r\n <button\r\n (click)=\"customButtonClicked($event, node.button)\"\r\n *ngSwitchCase=\"smartTreeNodeButtonType.NORMAL\"\r\n mat-raised-button\r\n >\r\n <smart-icon *ngIf=\"node.button.icon\" [icon]=\"node.button.icon\"></smart-icon>\r\n {{ node.button.icon }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n <div\r\n [class.sm-tree-invisible]=\"!treeControl.isExpanded(node)\"\r\n [ngClass]=\"getClassesForTreeNodeChildren(node)\"\r\n role=\"group\"\r\n >\r\n <ng-container matTreeNodeOutlet></ng-container>\r\n </div>\r\n </mat-nested-tree-node>\r\n </mat-tree>\r\n <div *ngIf=\"!treeData\">\r\n <div *ngIf=\"!treeData\" class=\"tree-skeleton\" aria-hidden=\"true\">\r\n <div class=\"skeleton-row\" style=\"--depth: 0; --w: 58%\">\r\n <span class=\"skeleton-caret\"></span>\r\n <span class=\"skeleton-label\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 1; --w: 72%\">\r\n <span class=\"skeleton-caret\"></span>\r\n <span class=\"skeleton-label\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 2; --w: 45%\">\r\n <span class=\"skeleton-label leaf\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 2; --w: 60%\">\r\n <span class=\"skeleton-label leaf\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 1; --w: 50%\">\r\n <span class=\"skeleton-caret\"></span>\r\n <span class=\"skeleton-label\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 2; --w: 65%\">\r\n <span class=\"skeleton-label leaf\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 0; --w: 40%\">\r\n <span class=\"skeleton-caret\"></span>\r\n <span class=\"skeleton-label\"></span>\r\n </div>\r\n <div class=\"skeleton-row\" style=\"--depth: 1; --w: 55%\">\r\n <span class=\"skeleton-label leaf\"></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".smartTreeContainer{display:flex;flex-direction:column;gap:.5rem}.sm-tree-invisible{display:none}.sm-tree ul,.sm-tree li{margin-top:0;margin-bottom:0;list-style-type:none}.sm-tree div[role=group]>.mat-tree-node{padding-left:40px}.sm-tee-node{padding-left:40px}.sm-tree-node-name{padding-left:15px;padding-top:15px;display:flex;flex-direction:column}.sm-tree-node-name-row{padding-left:15px;padding-top:15px;display:flex;flex-direction:row;justify-content:space-between}.sm-tree-node-name-col{padding-left:15px;padding-top:15px;display:flex;flex-direction:column}.sm-tee-node-id{font-weight:lighter}.mat-tree-node:hover{cursor:pointer}::ng-deep .mat-icon-rtl-mirror{display:flex;flex-direction:row}.sm-tree-row{display:flex;flex-direction:row;flex:1;align-items:center}.sm-shortDescription-spacer{flex:1}.tree-skeleton{--skeleton-bg-color: #c7cbd1;display:flex;flex-direction:column;gap:.5rem;padding:.5rem 0}.skeleton-row{display:flex;align-items:center;gap:.5rem;padding-left:calc(var(--depth, 0) * 1.25rem)}.skeleton-caret{width:.9rem;height:.9rem;border-radius:2px;background:var(--skeleton-bg-color);flex-shrink:0;animation:skeleton-pulse 2s ease-in-out infinite}.skeleton-label{height:1.2rem;width:var(--w);border-radius:4px;background:var(--skeleton-bg-color);animation:skeleton-pulse 2s ease-in-out infinite}.skeleton-label.leaf{margin-left:1.1rem}@keyframes skeleton-pulse{0%,to{opacity:.35}50%{opacity:1}}@media (prefers-reduced-motion: reduce){.skeleton-caret,.skeleton-label{animation:none}}\n"] }]
18763
19211
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { trigger: [{
18764
19212
  type: ViewChildren,
18765
19213
  args: [MatMenuTrigger]
@@ -24237,6 +24685,140 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
24237
24685
  args: [UiActionToolbarComponent]
24238
24686
  }] } });
24239
24687
 
24688
+ const STRINGS_HU = {
24689
+ startErrorMessage: 'A szerver nem elérhető.',
24690
+ startErrorRetry: 'Újrapróbálás',
24691
+ transportErrorMessage: 'A szerver nem elérhető.',
24692
+ transportErrorReload: 'Újratöltés',
24693
+ sessionErrorMessage: 'A munkamenet lejárt, kérjük jelentkezzen be újra.',
24694
+ sessionErrorAction: 'Bejelentkezés',
24695
+ };
24696
+ const STRINGS_EN = {
24697
+ startErrorMessage: 'The server is unavailable.',
24698
+ startErrorRetry: 'Retry',
24699
+ transportErrorMessage: 'The server is unavailable.',
24700
+ transportErrorReload: 'Reload',
24701
+ sessionErrorMessage: 'Your session has expired. Please log in again.',
24702
+ sessionErrorAction: 'Log in',
24703
+ };
24704
+ /**
24705
+ * Opt-in default UX for `SmartBackendBootstrapService` error hooks.
24706
+ *
24707
+ * Spread the result of `hooks(options)` into `bootstrap.configure()` to get a
24708
+ * MatSnackBar-based "error + retry" UI without writing the host glue:
24709
+ *
24710
+ * ```ts
24711
+ * bootstrap.configure({
24712
+ * ...minimalConfig,
24713
+ * ...defaultErrorUi.hooks({ language: 'hu' }),
24714
+ * });
24715
+ * ```
24716
+ *
24717
+ * Hosts that want custom logic can omit this service and write their own
24718
+ * `onStartError` / `onTransportError` callbacks directly.
24719
+ */
24720
+ class SmartDefaultErrorUiService {
24721
+ constructor() {
24722
+ this.snackBar = inject(MatSnackBar);
24723
+ this.session = inject(SmartSessionService);
24724
+ }
24725
+ /** Returns a hooks bundle ready to spread into `bootstrap.configure()`. */
24726
+ hooks(options = {}) {
24727
+ return {
24728
+ onStartError: (err) => this.showStartError(err, options),
24729
+ onTransportError: (err) => this.showTransportError(err, options),
24730
+ onSessionError: (err) => this.showSessionError(err, options),
24731
+ };
24732
+ }
24733
+ showStartError(_err, options = {}) {
24734
+ const s = this.resolveStrings(options);
24735
+ const ref = this.snackBar.open(s.startErrorMessage, s.startErrorRetry, {
24736
+ duration: 0, // sticky — app is not usable until retry succeeds
24737
+ });
24738
+ // Full reload, not bootstrap.start(). A bootstrap.start() retry only re-runs
24739
+ // the init sequence; any components that already mounted during the failed
24740
+ // attempt have rejected `whenReady()` Promises and won't re-trigger their
24741
+ // run() when bootstrap eventually succeeds. Reload guarantees a clean mount.
24742
+ ref.onAction().subscribe(() => this.verifyServerAndReload());
24743
+ }
24744
+ showTransportError(_err, options = {}) {
24745
+ const s = this.resolveStrings(options);
24746
+ const ref = this.snackBar.open(s.transportErrorMessage, s.transportErrorReload, {
24747
+ duration: options.transportErrorDuration ?? 0,
24748
+ });
24749
+ ref.onAction().subscribe(() => this.verifyServerAndReload());
24750
+ }
24751
+ showSessionError(_err, options = {}) {
24752
+ const s = this.resolveStrings(options);
24753
+ const ref = this.snackBar.open(s.sessionErrorMessage, s.sessionErrorAction, {
24754
+ duration: 0, // sticky — session is invalid until the user takes action
24755
+ });
24756
+ ref.onAction().subscribe(() => this.recoverSession());
24757
+ }
24758
+ /**
24759
+ * Clears the dead session and reloads. Unlike `verifyServerAndReload`, this
24760
+ * does NOT pre-check via `getSession()` — the SID is known to be invalid,
24761
+ * so the check would fail. We best-effort `clearAndStartNewSession()`
24762
+ * (creates a fresh anonymous session); reload happens regardless so the
24763
+ * user is not stuck if the clear fails (e.g., server flapping).
24764
+ *
24765
+ * Overridable in tests.
24766
+ */
24767
+ async recoverSession() {
24768
+ try {
24769
+ await this.session.clearAndStartNewSession();
24770
+ }
24771
+ catch {
24772
+ // Server may also be down; reload anyway and let bootstrap.start() retry.
24773
+ }
24774
+ this.reloadPage();
24775
+ }
24776
+ /**
24777
+ * Pings `getSession()` before reloading: if the server is still down, the
24778
+ * reload would just re-trigger the broken-screen state. The failed check
24779
+ * goes through `SmartErrorCatchingInterceptor` and re-fires `onTransportError`,
24780
+ * so the user sees a fresh snackbar — they get visible feedback that the
24781
+ * server is still unreachable, without paying the cost of a full bundle
24782
+ * reload that lands on the same broken state.
24783
+ *
24784
+ * Overridable in tests.
24785
+ */
24786
+ async verifyServerAndReload() {
24787
+ try {
24788
+ await this.session.getSession();
24789
+ }
24790
+ catch {
24791
+ return; // server still unreachable — interceptor re-opens the snackbar
24792
+ }
24793
+ this.reloadPage();
24794
+ }
24795
+ /** Overridable in tests. */
24796
+ reloadPage() {
24797
+ window.location.reload();
24798
+ }
24799
+ resolveStrings(options) {
24800
+ const lang = this.resolveLanguage(options.language);
24801
+ const base = lang === 'hu' ? STRINGS_HU : STRINGS_EN;
24802
+ return { ...base, ...(options.strings ?? {}) };
24803
+ }
24804
+ resolveLanguage(lang) {
24805
+ if (lang === 'hu' || lang === 'en') {
24806
+ return lang;
24807
+ }
24808
+ return navigator.language?.toLowerCase().startsWith('hu') ? 'hu' : 'en';
24809
+ }
24810
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartDefaultErrorUiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
24811
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartDefaultErrorUiService, providedIn: 'root' }); }
24812
+ }
24813
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartDefaultErrorUiService, decorators: [{
24814
+ type: Injectable,
24815
+ args: [{ providedIn: 'root' }]
24816
+ }] });
24817
+
24818
+ /*
24819
+ * Public API Surface of smart-session
24820
+ */
24821
+
24240
24822
  class SmartNavbarService {
24241
24823
  constructor() { }
24242
24824
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SmartNavbarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
@@ -24331,11 +24913,11 @@ class SearchPageComponent extends SmartComponent {
24331
24913
  return this.data?.noResultText !== undefined && this.data?.noResultText !== null;
24332
24914
  }
24333
24915
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SearchPageComponent, deps: [{ token: i0.Injector }, { token: SmartFilterEditorService }, { token: 'searchPageName' }, { token: 'searchComponentName' }, { token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
24334
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: SearchPageComponent, selector: "search-page", providers: [SmartFilterEditorService], viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"searchPageContainer\" [ngClass]=\"data?.cssClassOfPage\">\r\n <h1 class=\"search-page-title\"> {{ data?.pageTitle }} </h1>\r\n <!-- <div class=\"filterContainer\">\r\n <smart-filter [filter]=\"filter\"></smart-filter>\r\n </div> -->\r\n <smart-ui-action-toolbar [uiActionModels]=\"uiActionModels\"></smart-ui-action-toolbar>\r\n <div class=\"filter-editor-container\">\r\n <smart-filter-group-params [service]=\"filterService\"></smart-filter-group-params>\r\n <smart-filter-expression-editor [service]=\"filterService\"></smart-filter-expression-editor>\r\n </div>\r\n <smart-component-layout\r\n *ngIf=\"layout\"\r\n [smartComponentLayout]=\"layout\"\r\n [parentSmartComponent]=\"this\"\r\n ></smart-component-layout>\r\n <div class=\"gridContainer\">\r\n <h2 *ngIf=\"isShowNoResultText()\" class=\"noResultText\">\r\n {{ data?.noResultText }}\r\n </h2>\r\n <smart-grid\r\n *ngIf=\"!isShowNoResultText()\"\r\n #grid\r\n [smartGrid]=\"smartGrid\"\r\n [uuid]=\"uuid!\"\r\n ></smart-grid>\r\n </div>\r\n</div>\r\n", styles: [".searchPageContainer{display:flex;flex-direction:column;gap:1.5rem}.filterContainer{display:flex;flex-direction:row;gap:1rem}.gridContainer{flex-grow:1}.filter-editor-container{display:flex;flex-direction:row}.noResultText{width:100%;text-align:center;padding-top:2rem;padding-bottom:2rem}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: SmartGridComponent, selector: "smart-grid", inputs: ["smartGrid", "uuid", "dev"] }, { kind: "component", type: SmartComponentLayoutComponent, selector: "smart-component-layout", inputs: ["smartComponentLayout", "parentLayoutComponent", "parentSmartComponent", "gridRow"] }, { kind: "component", type: UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: SmartFilterParamsComponent, selector: "smart-filter-group-params", inputs: ["service"] }, { kind: "component", type: SmartFilterEditorContentComponent, selector: "smart-filter-expression-editor", inputs: ["service"] }] }); }
24916
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.11", type: SearchPageComponent, selector: "search-page", providers: [SmartFilterEditorService], viewQueries: [{ propertyName: "grid", first: true, predicate: ["grid"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"searchPageContainer\" [ngClass]=\"data?.cssClassOfPage\">\r\n <h1 class=\"search-page-title\"> {{ data?.pageTitle }} </h1>\r\n <!-- <div class=\"filterContainer\">\r\n <smart-filter [filter]=\"filter\"></smart-filter>\r\n </div> -->\r\n <smart-ui-action-toolbar [uiActionModels]=\"uiActionModels\"></smart-ui-action-toolbar>\r\n @if (filterService.model) {\r\n <div class=\"filter-editor-container\">\r\n <smart-filter-group-params [service]=\"filterService\"></smart-filter-group-params>\r\n <smart-filter-expression-editor [service]=\"filterService\"></smart-filter-expression-editor>\r\n </div>\r\n }\r\n <smart-component-layout\r\n *ngIf=\"layout\"\r\n [smartComponentLayout]=\"layout\"\r\n [parentSmartComponent]=\"this\"\r\n ></smart-component-layout>\r\n <div class=\"gridContainer\">\r\n <h2 *ngIf=\"isShowNoResultText()\" class=\"noResultText\">\r\n {{ data?.noResultText }}\r\n </h2>\r\n <smart-grid\r\n *ngIf=\"!isShowNoResultText()\"\r\n #grid\r\n [smartGrid]=\"smartGrid\"\r\n [uuid]=\"uuid!\"\r\n ></smart-grid>\r\n </div>\r\n</div>\r\n", styles: [".searchPageContainer{display:flex;flex-direction:column;gap:1.5rem}.filterContainer{display:flex;flex-direction:row;gap:1rem}.gridContainer{flex-grow:1}.filter-editor-container{display:flex;flex-direction:row}.noResultText{width:100%;text-align:center;padding-top:2rem;padding-bottom:2rem}\n"], dependencies: [{ kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: SmartGridComponent, selector: "smart-grid", inputs: ["smartGrid", "uuid", "dev"] }, { kind: "component", type: SmartComponentLayoutComponent, selector: "smart-component-layout", inputs: ["smartComponentLayout", "parentLayoutComponent", "parentSmartComponent", "gridRow"] }, { kind: "component", type: UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: SmartFilterParamsComponent, selector: "smart-filter-group-params", inputs: ["service"] }, { kind: "component", type: SmartFilterEditorContentComponent, selector: "smart-filter-expression-editor", inputs: ["service"] }] }); }
24335
24917
  }
24336
24918
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: SearchPageComponent, decorators: [{
24337
24919
  type: Component,
24338
- args: [{ selector: 'search-page', providers: [SmartFilterEditorService], template: "<div class=\"searchPageContainer\" [ngClass]=\"data?.cssClassOfPage\">\r\n <h1 class=\"search-page-title\"> {{ data?.pageTitle }} </h1>\r\n <!-- <div class=\"filterContainer\">\r\n <smart-filter [filter]=\"filter\"></smart-filter>\r\n </div> -->\r\n <smart-ui-action-toolbar [uiActionModels]=\"uiActionModels\"></smart-ui-action-toolbar>\r\n <div class=\"filter-editor-container\">\r\n <smart-filter-group-params [service]=\"filterService\"></smart-filter-group-params>\r\n <smart-filter-expression-editor [service]=\"filterService\"></smart-filter-expression-editor>\r\n </div>\r\n <smart-component-layout\r\n *ngIf=\"layout\"\r\n [smartComponentLayout]=\"layout\"\r\n [parentSmartComponent]=\"this\"\r\n ></smart-component-layout>\r\n <div class=\"gridContainer\">\r\n <h2 *ngIf=\"isShowNoResultText()\" class=\"noResultText\">\r\n {{ data?.noResultText }}\r\n </h2>\r\n <smart-grid\r\n *ngIf=\"!isShowNoResultText()\"\r\n #grid\r\n [smartGrid]=\"smartGrid\"\r\n [uuid]=\"uuid!\"\r\n ></smart-grid>\r\n </div>\r\n</div>\r\n", styles: [".searchPageContainer{display:flex;flex-direction:column;gap:1.5rem}.filterContainer{display:flex;flex-direction:row;gap:1rem}.gridContainer{flex-grow:1}.filter-editor-container{display:flex;flex-direction:row}.noResultText{width:100%;text-align:center;padding-top:2rem;padding-bottom:2rem}\n"] }]
24920
+ args: [{ selector: 'search-page', providers: [SmartFilterEditorService], template: "<div class=\"searchPageContainer\" [ngClass]=\"data?.cssClassOfPage\">\r\n <h1 class=\"search-page-title\"> {{ data?.pageTitle }} </h1>\r\n <!-- <div class=\"filterContainer\">\r\n <smart-filter [filter]=\"filter\"></smart-filter>\r\n </div> -->\r\n <smart-ui-action-toolbar [uiActionModels]=\"uiActionModels\"></smart-ui-action-toolbar>\r\n @if (filterService.model) {\r\n <div class=\"filter-editor-container\">\r\n <smart-filter-group-params [service]=\"filterService\"></smart-filter-group-params>\r\n <smart-filter-expression-editor [service]=\"filterService\"></smart-filter-expression-editor>\r\n </div>\r\n }\r\n <smart-component-layout\r\n *ngIf=\"layout\"\r\n [smartComponentLayout]=\"layout\"\r\n [parentSmartComponent]=\"this\"\r\n ></smart-component-layout>\r\n <div class=\"gridContainer\">\r\n <h2 *ngIf=\"isShowNoResultText()\" class=\"noResultText\">\r\n {{ data?.noResultText }}\r\n </h2>\r\n <smart-grid\r\n *ngIf=\"!isShowNoResultText()\"\r\n #grid\r\n [smartGrid]=\"smartGrid\"\r\n [uuid]=\"uuid!\"\r\n ></smart-grid>\r\n </div>\r\n</div>\r\n", styles: [".searchPageContainer{display:flex;flex-direction:column;gap:1.5rem}.filterContainer{display:flex;flex-direction:row;gap:1rem}.gridContainer{flex-grow:1}.filter-editor-container{display:flex;flex-direction:row}.noResultText{width:100%;text-align:center;padding-top:2rem;padding-bottom:2rem}\n"] }]
24339
24921
  }], ctorParameters: () => [{ type: i0.Injector }, { type: SmartFilterEditorService }, { type: undefined, decorators: [{
24340
24922
  type: Inject,
24341
24923
  args: ['searchPageName']
@@ -24828,5 +25410,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImpo
24828
25410
  * Generated bundle index. Do not edit.
24829
25411
  */
24830
25412
 
24831
- export { APIS$5 as APIS, AbstractMap, AclEditingViewComponent, ApiModule$5 as ApiModule, ApiQueueService, BASE_PATH$7 as BASE_PATH, COLLECTION_FORMATS$7 as COLLECTION_FORMATS, COMPONENT_LIBRARY, CUSTOM_DIAGRAM_OPTIONS, CloseResult, ComparableDropdownDirective, ComparableMultiselectDirective, ComponentFactoryService, ComponentFactoryServiceModule, ComponentLibrary, ComponentType, ComponentWidgetType, Configuration$7 as Configuration, DIALOG_DISABLE_CLOSE, DataChangeKind, DefaultChartOptionsProvider, DefaultUiActionCode_CLOSE, DrawTime, EMPTY_PARAMS, ExpandableSectionButtonIconPosition, ExpandableSectionButtonType, ExpandableSectionComponent, FilterExpressionBoolOperator$1 as FilterExpressionBoolOperator, FilterExpressionBuilderGroupBuilderGroupKindEnum, FilterExpressionDataType, FilterExpressionFieldWidgetType, FilterExpressionOperation, FilterExpressionOrderByOrderEnum, GenericPageComponent, GeoMapDataLoadingMode, GeoMapDataSourceType, GeoMapItemKind, GeoMapOperationMode, GeoMapSelectionMode, GeoMapTextType, GoogleMap, GridColumnContentType, GridDataAccessConfigKindEnum, GridSelectionMode, GridSelectionType, GridUiActionType, GridViewDescriptorKindEnum, HighlightPipe, IS_ASYNC_PARAM_NAME, IconPosition, ImageResourceKindEnum, InvalidSmartlinkComponent, LayoutDirection, LeafletMap, LinkTargetEnum, MAP_ENGINE, MapEngine, MenuComponent, MessageOptionType, MessageTextType, MessageType, NAMED_VALIDATOR, NamedValidatorOperationEnum, NamedValidatorService, NoPermissionPageComponent, PhotoCaptureWidgetComponent, REUSE_ROUTER_SLOT_COMPONENT, ROOT_CONTAINER_UUID, ROUTER_SLOT_ID, RecordingUploaderPropertiesOpenDirectionEnum, SMART_DEFAULT_VIEW_COMPONENTS, SearchPageComponent, SelectionDefinitionTypeEnum, SelectionDefinitionValueSetValueTypeEnum, ServerRequestType, SessionAPIS, SessionErrorBehaviour, SessionService, SharedModule, SmartActionType, SmartBackendBootstrapService, SmartComponent, SmartComponentApiClient, SmartComponentLayoutComponent, SmartComponentLayoutModule, SmartComponentLayoutUtility, SmartDatePipe, SmartDateTimePipe, SmartDefaultErrorUiService, SmartDiagramComponent, SmartDiagramModule, SmartDialog, SmartEmbeddedSlotDirective, SmartExpandableSectionModule, SmartExpandableSectionService, SmartFileEditorComponent, SmartFileUploaderComponent, SmartFilterComponent, SmartFilterEditorContentComponent, SmartFilterEditorModule, SmartFilterEditorService, SmartFilterExpressionItemComponent, SmartFilterExpressionItemsComponent, SmartFilterModule, SmartFilterParamComponent, SmartFilterParamsComponent, SmartFilterPosition, SmartFilterType, SmartFormInputMode, SmartFormTextFieldButtonIconPosition, SmartFormWidgetDirection, SmartFormWidgetType, SmartFormWidgetWidth, SmartGenericPagesModule, SmartGridButtonType, SmartGridComponent, SmartGridDataLayout, SmartGridModule, SmartGridService, SmartGridType, SmartIconComponent, SmartIconModule, SmartIconService, SmartLayoutDef, SmartLinkChannelVariableInPath, SmartLinkMigrationStatusStatusEnum, SmartLinkUuidVariableInPath, SmartMapComponent, SmartMapModule, SmartMultiFileEditorComponent, SmartNavbarComponent, SmartNavbarModule, SmartNavbarService, SmartNavigationModule, SmartNavigationService, SmartNgClientModule, SmartNgClientService, SmartService, SmartSessionModule, SmartSessionService, SmartSessionTimerComponent, SmartSessionTimerService, SmartSubject, SmartTabGroupModule, SmartTable, SmartTableButtonType, SmartTableHeaderPropertyType, SmartTableInterfaceTypeEnum, SmartTableOptionButtonDirection, SmartTableOrder, SmartTableType, SmartTimePipe, SmartTooltipDirective, SmartTreeComponent, SmartTreeNodeButtonType, SmartUserSettinsIconPosition, SmartValidationModule, SmartValidatorName, SmartViewContextErrorDialogButtonLabel, SmartViewContextErrorDialogMessage, SmartViewContextErrorDialogTitle, SmartViewContextModule, SmartViewContextService, SmartViewRedirect, SmartVoiceRecorderComponent, SmartWidgetHintPosition, SmartWidgetHintPositionEnum, SmartWidgetSettings, SmartdialogModule, SmartdialogService, SmartfileuploaderComponent, SmartformComponent, SmartformLayoutDefinitionService, SmartformwidgetComponent, SmarttableComponent, SmarttableModule, SmarttableService, SmarttreeGenericService, SmarttreeModule, SmarttreeService, SubjectSelectorComponent, ToggleLabelPosition, ToolbarDirection, UiActionButtonComponent, UiActionButtonType, UiActionConfirmDialogComponent, UiActionConfirmDialogService, UiActionDescriptorService, UiActionDialogButtonComponent, UiActionDialogType, UiActionFeedbackType, UiActionInputDialogComponent, UiActionInputDialogService, UiActionInputType, UiActionService, UiActionToolbarComponent, UiActionTooltipTooltipPositionEnum, UiBadgeComponent, UiBadgeDirective, UploadWidgetComponent, UploadWidgetType, ValidationResultPageComponent, ValueChangeMode, ViewContextRebuiltError, ViewEventHandlerViewEventTypeEnum, ViewService, ViewState, ViewType, VoiceRecordWidgetComponent, barChart, bubbleChart, createBasicOptions, doughnutChart, horizontalBarChart, horizontalStackedBarChart, multiAxisLineChart, pieChart, polarAreaChart, radarChart, resolveSlot, resolveViewHandler, scatterChart, stackedBarChart, transformDataToBarLikeDataSet, transformDataToBasicDataSets, transformDataToBubble, transformDataToScatter };
25413
+ export { APIS$5 as APIS, AbstractMap, AclEditingViewComponent, ApiModule$5 as ApiModule, ApiQueueService, BASE_PATH$7 as BASE_PATH, COLLECTION_FORMATS$7 as COLLECTION_FORMATS, COMPONENT_LIBRARY, CUSTOM_DIAGRAM_OPTIONS, ClickMenuComponent, CloseResult, ComparableDropdownDirective, ComparableMultiselectDirective, ComponentFactoryService, ComponentFactoryServiceModule, ComponentLibrary, ComponentType, ComponentWidgetType, Configuration$7 as Configuration, DIALOG_DISABLE_CLOSE, DataChangeKind, DefaultChartOptionsProvider, DefaultUiActionCode_CLOSE, DrawTime, EMPTY_PARAMS, ExpandableSectionButtonIconPosition, ExpandableSectionButtonType, ExpandableSectionComponent, FilterExpressionBoolOperator$1 as FilterExpressionBoolOperator, FilterExpressionBuilderGroupBuilderGroupKindEnum, FilterExpressionDataType, FilterExpressionFieldWidgetType, FilterExpressionOperation, FilterExpressionOrderByOrderEnum, GenericPageComponent, GeoMapDataLoadingMode, GeoMapDataSourceType, GeoMapItemKind, GeoMapOperationMode, GeoMapSelectionMode, GeoMapTextType, GoogleMap, GridColumnContentType, GridDataAccessConfigKindEnum, GridSelectionMode, GridSelectionType, GridUiActionType, GridViewDescriptorKindEnum, HighlightPipe, HoverMenuComponent, IS_ASYNC_PARAM_NAME, IconPosition, ImageResourceKindEnum, InvalidSmartlinkComponent, LayoutDirection, LeafletMap, LinkTargetEnum, MAP_ENGINE, MapEngine, MenuTriggerType, MessageOptionType, MessageTextType, MessageType, NAMED_VALIDATOR, NamedValidatorOperationEnum, NamedValidatorService, NoPermissionPageComponent, PhotoCaptureWidgetComponent, REUSE_ROUTER_SLOT_COMPONENT, ROOT_CONTAINER_UUID, ROUTER_SLOT_ID, RecordingUploaderPropertiesOpenDirectionEnum, SMART_DEFAULT_VIEW_COMPONENTS, SearchPageComponent, SelectionDefinitionTypeEnum, SelectionDefinitionValueSetValueTypeEnum, ServerRequestType, SessionAPIS, SessionErrorBehaviour, SessionService, SharedModule, SmartActionType, SmartBackendBootstrapService, SmartComponent, SmartComponentApiClient, SmartComponentLayoutComponent, SmartComponentLayoutModule, SmartComponentLayoutUtility, SmartDatePipe, SmartDateTimePipe, SmartDefaultErrorUiService, SmartDiagramComponent, SmartDiagramModule, SmartDialog, SmartEmbeddedSlotDirective, SmartExpandableSectionModule, SmartExpandableSectionService, SmartFileEditorComponent, SmartFileUploaderComponent, SmartFilterComponent, SmartFilterEditorContentComponent, SmartFilterEditorModule, SmartFilterEditorService, SmartFilterExpressionItemComponent, SmartFilterExpressionItemsComponent, SmartFilterModule, SmartFilterParamComponent, SmartFilterParamsComponent, SmartFilterPosition, SmartFilterType, SmartFormInputMode, SmartFormTextFieldButtonIconPosition, SmartFormWidgetDirection, SmartFormWidgetType, SmartFormWidgetWidth, SmartGenericPagesModule, SmartGridButtonType, SmartGridComponent, SmartGridDataLayout, SmartGridModule, SmartGridService, SmartGridType, SmartIconComponent, SmartIconModule, SmartIconService, SmartLayoutDef, SmartLinkChannelVariableInPath, SmartLinkMigrationStatusStatusEnum, SmartLinkUuidVariableInPath, SmartMapComponent, SmartMapModule, SmartMultiFileEditorComponent, SmartNavbarComponent, SmartNavbarModule, SmartNavbarService, SmartNavigationModule, SmartNavigationService, SmartNgClientModule, SmartNgClientService, SmartService, SmartSessionModule, SmartSessionService, SmartSessionTimerComponent, SmartSessionTimerService, SmartSubject, SmartTabGroupModule, SmartTable, SmartTableButtonType, SmartTableHeaderPropertyType, SmartTableInterfaceTypeEnum, SmartTableOptionButtonDirection, SmartTableOrder, SmartTableType, SmartTimePipe, SmartTooltipDirective, SmartTreeComponent, SmartTreeNodeButtonType, SmartUserSettinsIconPosition, SmartValidationModule, SmartValidatorName, SmartViewContextErrorDialogButtonLabel, SmartViewContextErrorDialogMessage, SmartViewContextErrorDialogTitle, SmartViewContextModule, SmartViewContextService, SmartViewRedirect, SmartVoiceRecorderComponent, SmartWidgetHintPosition, SmartWidgetHintPositionEnum, SmartWidgetSettings, SmartdialogModule, SmartdialogService, SmartfileuploaderComponent, SmartformComponent, SmartformLayoutDefinitionService, SmartformwidgetComponent, SmarttableComponent, SmarttableModule, SmarttableService, SmarttreeGenericService, SmarttreeModule, SmarttreeService, SubjectSelectorComponent, ThemeService, ToggleLabelPosition, ToolbarDirection, UiActionButtonComponent, UiActionButtonType, UiActionConfirmDialogComponent, UiActionConfirmDialogService, UiActionDescriptorService, UiActionDialogButtonComponent, UiActionDialogType, UiActionFeedbackType, UiActionInputDialogComponent, UiActionInputDialogService, UiActionInputType, UiActionService, UiActionToolbarComponent, UiActionTooltipTooltipPositionEnum, UiBadgeComponent, UiBadgeDirective, UploadWidgetComponent, UploadWidgetType, ValidationResultPageComponent, ValueChangeMode, ViewContextRebuiltError, ViewEventHandlerViewEventTypeEnum, ViewService, ViewState, ViewType, VoiceRecordWidgetComponent, barChart, bubbleChart, createBasicOptions, doughnutChart, horizontalBarChart, horizontalStackedBarChart, multiAxisLineChart, pieChart, polarAreaChart, radarChart, resolveSlot, resolveViewHandler, scatterChart, stackedBarChart, transformDataToBarLikeDataSet, transformDataToBasicDataSets, transformDataToBubble, transformDataToScatter };
24832
25414
  //# sourceMappingURL=smartbit4all-ng-client.mjs.map