@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.
- package/esm2022/lib/session/smart-backend-bootstrap.config.mjs +1 -1
- package/esm2022/lib/session/smart-backend-bootstrap.service.mjs +7 -4
- package/esm2022/lib/session/smart-error-catching.interceptor.mjs +3 -3
- package/esm2022/lib/session/smart-session.service.mjs +48 -23
- package/esm2022/lib/smart-generic-pages/search-page/search-page.component.mjs +3 -3
- package/esm2022/lib/smart-tree/smarttree.component.mjs +3 -3
- package/esm2022/lib/theme/theme.service.mjs +48 -0
- package/esm2022/lib/view-context/api/api/view.service.mjs +211 -1
- package/esm2022/lib/view-context/api/api-default/binaryContentData.mjs +2 -0
- package/esm2022/lib/view-context/api/model/deviceInfo.mjs +1 -1
- package/esm2022/lib/view-context/api/model/iconPosition.mjs +1 -1
- package/esm2022/lib/view-context/api/model/menuTriggerType.mjs +17 -0
- package/esm2022/lib/view-context/api/model/models.mjs +7 -1
- package/esm2022/lib/view-context/api/model/namedValidator.mjs +1 -1
- package/esm2022/lib/view-context/api/model/publishedViewData.mjs +13 -0
- package/esm2022/lib/view-context/api/model/shellProperty.mjs +13 -0
- package/esm2022/lib/view-context/api/model/smartLinkData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/themeDefinition.mjs +2 -0
- package/esm2022/lib/view-context/api/model/themeDescriptor.mjs +2 -0
- package/esm2022/lib/view-context/api/model/themeShellDescriptor.mjs +2 -0
- package/esm2022/lib/view-context/api/model/uiAction.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionDefinition.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionDefinitionEntry.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionSchedule.mjs +1 -1
- package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +1 -1
- package/esm2022/lib/view-context/api/model/view.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewData.mjs +1 -1
- package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +1 -1
- package/esm2022/lib/view-context/projects.mjs +3 -2
- package/esm2022/lib/view-context/smart-ui-action/components/menu/click/menu.component.mjs +205 -0
- package/esm2022/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.mjs +205 -0
- package/esm2022/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.mjs +35 -0
- package/esm2022/lib/view-context/smart-ui-action/file-editor-toolbar/file-editor-toolbar.component.mjs +6 -4
- package/esm2022/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.mjs +18 -10
- package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +10 -7
- package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +13 -3
- package/esm2022/lib/view-context/smart-view-context.module.mjs +13 -7
- package/esm2022/lib/view-context/smart-view-context.service.mjs +14 -5
- package/esm2022/projects.mjs +2 -1
- package/fesm2022/smartbit4all-ng-client.mjs +895 -313
- package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
- package/lib/session/smart-backend-bootstrap.config.d.ts +9 -1
- package/lib/session/smart-backend-bootstrap.service.d.ts +3 -1
- package/lib/session/smart-error-catching.interceptor.d.ts +2 -1
- package/lib/session/smart-session.service.d.ts +18 -1
- package/lib/theme/theme.service.d.ts +17 -0
- package/lib/view-context/api/api/view.service.d.ts +94 -0
- package/lib/view-context/api/api-default/binaryContentData.d.ts +2 -0
- package/lib/view-context/api/model/deviceInfo.d.ts +1 -0
- package/lib/view-context/api/model/menuTriggerType.d.ts +15 -0
- package/lib/view-context/api/model/models.d.ts +6 -0
- package/lib/view-context/api/model/publishedViewData.d.ts +14 -0
- package/lib/view-context/api/model/shellProperty.d.ts +15 -0
- package/lib/view-context/api/model/themeDefinition.d.ts +22 -0
- package/lib/view-context/api/model/themeDescriptor.d.ts +16 -0
- package/lib/view-context/api/model/themeShellDescriptor.d.ts +17 -0
- package/lib/view-context/api/model/uiActionDescriptor.d.ts +2 -0
- package/lib/view-context/projects.d.ts +2 -1
- package/lib/view-context/smart-ui-action/components/menu/{menu.component.d.ts → click/menu.component.d.ts} +8 -7
- package/lib/view-context/smart-ui-action/components/menu/hover/hover-menu.component.d.ts +43 -0
- package/lib/view-context/smart-ui-action/components/theme-selector/theme-selector.component.d.ts +16 -0
- package/lib/view-context/smart-ui-action/ui-action-button/ui-action-button.component.d.ts +1 -0
- package/lib/view-context/smart-ui-action/ui-action-toolbar.component.d.ts +2 -1
- package/lib/view-context/smart-ui-action/ui-action.service.d.ts +3 -1
- package/lib/view-context/smart-view-context.module.d.ts +56 -54
- package/lib/view-context/smart-view-context.service.d.ts +4 -2
- package/package.json +1 -1
- package/projects.d.ts +1 -0
- package/smartbit4all-ng-client-6.0.10.tgz +0 -0
- package/esm2022/lib/view-context/smart-ui-action/components/menu/menu.component.mjs +0 -199
- 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,
|
|
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
|
-
|
|
1050
|
+
const refreshToken = localStorage.getItem('refreshToken');
|
|
1044
1051
|
if (!refreshToken) {
|
|
1045
|
-
|
|
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
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
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
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
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
|
-
|
|
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.
|
|
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'] =
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
6309
|
-
|
|
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:
|
|
6862
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: HoverMenuComponent, decorators: [{
|
|
6312
6863
|
type: Component,
|
|
6313
|
-
args: [{ selector: 'ui-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
13556
|
+
ClickMenuComponent,
|
|
13557
|
+
HoverMenuComponent,
|
|
12974
13558
|
UploadWidgetComponent,
|
|
12975
13559
|
VoiceRecordWidgetComponent,
|
|
12976
13560
|
PhotoCaptureWidgetComponent,
|
|
12977
13561
|
PrimeFileUploaderComponent,
|
|
12978
|
-
SmartEmbeddedSlotDirective
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
13827
|
-
|
|
13828
|
-
|
|
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:
|
|
13833
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type:
|
|
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:
|
|
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 <
|
|
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: "
|
|
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
|
|
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,
|
|
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
|