ngx-histaff-alpha 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/esm2022/lib/app/http-interceptors/auth-interceptor.mjs +10 -6
  2. package/esm2022/lib/app/http-interceptors/base-url-interceptor.mjs +14 -5
  3. package/esm2022/lib/app/http-interceptors/token-interceptor.mjs +22 -20
  4. package/esm2022/lib/app/interfaces/IStatisticAuthData.mjs +2 -0
  5. package/esm2022/lib/app/interfaces/IStatisticSysUser.mjs +2 -0
  6. package/esm2022/lib/app/libraries/d3/core-statistic-widget/core-statistic-widget.component.mjs +141 -28
  7. package/esm2022/lib/app/services/app-config.service.mjs +1 -1
  8. package/esm2022/lib/app/services/app-initialization.service.mjs +3 -2
  9. package/esm2022/lib/app/services/common-http-request.service.mjs +19 -1
  10. package/esm2022/lib/app/services/statistic-auth.service.mjs +49 -0
  11. package/esm2022/lib/app/services/statistic.service.mjs +24 -0
  12. package/esm2022/public-api.mjs +5 -1
  13. package/fesm2022/ngx-histaff-alpha.mjs +264 -55
  14. package/fesm2022/ngx-histaff-alpha.mjs.map +1 -1
  15. package/lib/app/http-interceptors/auth-interceptor.d.ts +4 -2
  16. package/lib/app/http-interceptors/base-url-interceptor.d.ts +1 -0
  17. package/lib/app/http-interceptors/token-interceptor.d.ts +4 -2
  18. package/lib/app/interfaces/IStatisticAuthData.d.ts +9 -0
  19. package/lib/app/interfaces/IStatisticSysUser.d.ts +15 -0
  20. package/lib/app/libraries/core-table/core-table.component.d.ts +1 -1
  21. package/lib/app/libraries/d3/core-statistic-widget/core-statistic-widget.component.d.ts +5 -2
  22. package/lib/app/services/app-config.service.d.ts +1 -1
  23. package/lib/app/services/common-http-request.service.d.ts +2 -0
  24. package/lib/app/services/statistic-auth.service.d.ts +21 -0
  25. package/lib/app/services/statistic.service.d.ts +11 -0
  26. package/package.json +1 -1
  27. package/public-api.d.ts +4 -0
@@ -131,6 +131,11 @@ const skipInterceptorsHeaders = new HttpHeaders({
131
131
  'Access-Control-Allow-Credentials': 'true',
132
132
  'X-Skip-Interceptor': 'true'
133
133
  });
134
+ const baseUrlForStatisticsInterceptorHeader = new HttpHeaders({
135
+ 'Content-Type': 'application/json',
136
+ 'Access-Control-Allow-Credentials': 'true',
137
+ 'X-Statistic-Interceptor': 'true'
138
+ });
134
139
  class CommonHttpRequestService {
135
140
  // private handleError: HandleError;
136
141
  constructor(http) {
@@ -198,6 +203,19 @@ class CommonHttpRequestService {
198
203
  responseType: 'blob' // add 'responseType' to headers
199
204
  }).pipe(map(response => response), last());
200
205
  }
206
+ /* Bellow are methods for statistics */
207
+ makeStatisticPostRequest(name, relativeApiEndPoint, payload) {
208
+ return this.http.post(relativeApiEndPoint, payload, {
209
+ headers: baseUrlForStatisticsInterceptorHeader, observe: 'response', reportProgress: true, withCredentials: true,
210
+ })
211
+ .pipe(last());
212
+ }
213
+ makeStatisticGetRequest(name, relativeApiEndPoint, cacheRequest = false) {
214
+ return this.http.get(relativeApiEndPoint, {
215
+ headers: baseUrlForStatisticsInterceptorHeader, observe: 'response', reportProgress: true, withCredentials: true,
216
+ })
217
+ .pipe(map(response => response), last());
218
+ }
201
219
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CommonHttpRequestService, deps: [{ token: i1.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
202
220
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CommonHttpRequestService, providedIn: 'root' }); }
203
221
  }
@@ -2475,9 +2493,10 @@ class AppInitializationService {
2475
2493
  }
2476
2494
  */
2477
2495
  try {
2478
- fetch('../../assets/app.config.json').then(res => res.json()).then(({ APP_TYPE, BASE_URL, GOLIVE_URL, DEBUG_ENABLED, LOGO_LOGIN, LOGO_HEADER, HOME_BACKGROUND_IMAGE, OAUTH2_OIDC_ENABLED, OAUTH2_OIDC_CLIENT_ID, OAUTH2_OIDC_LOGIN_URI, OAUTH2_OIDC_REDIRECT_URI, OAUTH2_OIDC_SCOPE, SAML2ADFS_ENABLED, SAML2ADFS_IDP, SAML2ADFS_IDENTIFIER, SAML2ADFS_WA_SIGNIN, SAML2ADFS_WA_SIGNOUT, SAML2ADFS_WREPLY, HANGFIRE_PATH, STATIC_FOLDER, AVATAR_FOLDER, }) => {
2496
+ fetch('../../assets/app.config.json').then(res => res.json()).then(({ APP_TYPE, BASE_URL, BASE_URL_FOR_STATISTIC, GOLIVE_URL, DEBUG_ENABLED, LOGO_LOGIN, LOGO_HEADER, HOME_BACKGROUND_IMAGE, OAUTH2_OIDC_ENABLED, OAUTH2_OIDC_CLIENT_ID, OAUTH2_OIDC_LOGIN_URI, OAUTH2_OIDC_REDIRECT_URI, OAUTH2_OIDC_SCOPE, SAML2ADFS_ENABLED, SAML2ADFS_IDP, SAML2ADFS_IDENTIFIER, SAML2ADFS_WA_SIGNIN, SAML2ADFS_WA_SIGNOUT, SAML2ADFS_WREPLY, HANGFIRE_PATH, STATIC_FOLDER, AVATAR_FOLDER, }) => {
2479
2497
  this.appConfigService.APP_TYPE = APP_TYPE;
2480
2498
  this.appConfigService.BASE_URL = BASE_URL;
2499
+ this.appConfigService.BASE_URL_FOR_STATISTIC = BASE_URL_FOR_STATISTIC;
2481
2500
  this.appConfigService.GOLIVE_URL = GOLIVE_URL;
2482
2501
  this.appConfigService.DEBUG_ENABLED = DEBUG_ENABLED;
2483
2502
  this.appConfigService.LOGO_LOGIN = LOGO_LOGIN;
@@ -2685,6 +2704,7 @@ const InitializationCanMatchFn = (route, segments) => {
2685
2704
  };
2686
2705
 
2687
2706
  const InterceptorSkipHeader = 'X-Skip-Interceptor';
2707
+ const InterceptorStatisticHeader = 'X-Statistic-Interceptor';
2688
2708
  class BaseUrlInterceptor {
2689
2709
  constructor(appConfigService) {
2690
2710
  this.appConfigService = appConfigService;
@@ -2697,10 +2717,18 @@ class BaseUrlInterceptor {
2697
2717
  if (!this.appConfigService.BASE_URL) {
2698
2718
  console.error("THE APP LAYPOUT had started rendering before appConfigService.BASE_URL reachs a truely value. Please check AppInitializationService initializing$.next method carefully!!!");
2699
2719
  }
2700
- const addBaseUrlReq = req.clone({
2701
- url: this.appConfigService.BASE_URL + req.url
2702
- });
2703
- return next.handle(addBaseUrlReq);
2720
+ if (req.headers.has(InterceptorStatisticHeader)) {
2721
+ const addBaseUrlReq = req.clone({
2722
+ url: this.appConfigService.BASE_URL_FOR_STATISTIC + req.url
2723
+ });
2724
+ return next.handle(addBaseUrlReq);
2725
+ }
2726
+ else {
2727
+ const addBaseUrlReq = req.clone({
2728
+ url: this.appConfigService.BASE_URL + req.url
2729
+ });
2730
+ return next.handle(addBaseUrlReq);
2731
+ }
2704
2732
  }
2705
2733
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: BaseUrlInterceptor, deps: [{ token: AppConfigService }], target: i0.ɵɵFactoryTarget.Injectable }); }
2706
2734
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: BaseUrlInterceptor, providedIn: 'root' }); }
@@ -2762,13 +2790,81 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
2762
2790
  type: Injectable
2763
2791
  }], ctorParameters: () => [{ type: MessageService }] });
2764
2792
 
2793
+ class StatisticService {
2794
+ constructor(commonHttpRequestService) {
2795
+ this.commonHttpRequestService = commonHttpRequestService;
2796
+ }
2797
+ get(url, cacheRequest = false) {
2798
+ return this.commonHttpRequestService.makeStatisticGetRequest('get', url, cacheRequest);
2799
+ }
2800
+ post(url, payload) {
2801
+ console.log("appService post", url);
2802
+ return this.commonHttpRequestService.makeStatisticPostRequest('post', url, payload);
2803
+ }
2804
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: StatisticService, deps: [{ token: CommonHttpRequestService }], target: i0.ɵɵFactoryTarget.Injectable }); }
2805
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: StatisticService, providedIn: 'root' }); }
2806
+ }
2807
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: StatisticService, decorators: [{
2808
+ type: Injectable,
2809
+ args: [{
2810
+ providedIn: 'root'
2811
+ }]
2812
+ }], ctorParameters: () => [{ type: CommonHttpRequestService }] });
2813
+
2814
+ class StatisticAuthService {
2815
+ constructor(statisticService) {
2816
+ this.statisticService = statisticService;
2817
+ this.data$ = new BehaviorSubject(null);
2818
+ this.authenticated$ = new BehaviorSubject(false);
2819
+ this.refreshTokenSubject = new BehaviorSubject(null);
2820
+ this.refreshingToken$ = new BehaviorSubject(false);
2821
+ }
2822
+ getAuthorizationToken() {
2823
+ return this.data$.value?.accessToken || "";
2824
+ }
2825
+ userLogin(payload) {
2826
+ const url = "/api/Authentication/ClientLogin";
2827
+ return this.statisticService.post(url, payload);
2828
+ }
2829
+ userLogout() {
2830
+ const url = "/api/Authentication/ClientLogout";
2831
+ return this.statisticService.post(url, {});
2832
+ }
2833
+ tryRestoreSession() {
2834
+ const fullUrl = "/api/Authentication/RefreshToken";
2835
+ return this.statisticService.post(fullUrl, { appType: "WEBAPP" });
2836
+ }
2837
+ resolveAuthenticateResponse(x) {
2838
+ if (x.ok && x.status === 200 && x.body?.statusCode === 200) {
2839
+ const body = x.body;
2840
+ if (body.statusCode === 200) {
2841
+ const innerBody = body.innerBody;
2842
+ this.data$.next(innerBody);
2843
+ }
2844
+ }
2845
+ }
2846
+ postLogout() {
2847
+ // Do nothing. just for the interface implementation
2848
+ }
2849
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: StatisticAuthService, deps: [{ token: StatisticService }], target: i0.ɵɵFactoryTarget.Injectable }); }
2850
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: StatisticAuthService, providedIn: 'root' }); }
2851
+ }
2852
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: StatisticAuthService, decorators: [{
2853
+ type: Injectable,
2854
+ args: [{
2855
+ providedIn: 'root'
2856
+ }]
2857
+ }], ctorParameters: () => [{ type: StatisticService }] });
2858
+
2765
2859
  class AuthInterceptor {
2766
- constructor(auth) {
2767
- this.auth = auth;
2860
+ constructor(authService, statisticAuthService) {
2861
+ this.authService = authService;
2862
+ this.statisticAuthService = statisticAuthService;
2768
2863
  }
2769
2864
  intercept(req, next) {
2865
+ const isStatistic = req.headers.has(InterceptorStatisticHeader);
2770
2866
  // Get the auth token from the service.
2771
- const authToken = this.auth.getAuthorizationToken();
2867
+ const authToken = isStatistic ? this.statisticAuthService.getAuthorizationToken() : this.authService.getAuthorizationToken();
2772
2868
  if (authToken === undefined) {
2773
2869
  return next.handle(req);
2774
2870
  }
@@ -2780,7 +2876,7 @@ class AuthInterceptor {
2780
2876
  // send cloned request with header to the next handler.
2781
2877
  return next.handle(authReq);
2782
2878
  }
2783
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: AuthInterceptor, deps: [{ token: AuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
2879
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: AuthInterceptor, deps: [{ token: AuthService }, { token: StatisticAuthService }], target: i0.ɵɵFactoryTarget.Injectable }); }
2784
2880
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: AuthInterceptor, providedIn: 'root' }); }
2785
2881
  }
2786
2882
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: AuthInterceptor, decorators: [{
@@ -2788,16 +2884,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
2788
2884
  args: [{
2789
2885
  providedIn: 'root'
2790
2886
  }]
2791
- }], ctorParameters: () => [{ type: AuthService }] });
2887
+ }], ctorParameters: () => [{ type: AuthService }, { type: StatisticAuthService }] });
2792
2888
 
2793
- /*
2794
- Tannv: This code is based on the original blog post of Alexandru Bereghici
2795
- https://itnext.io/angular-tutorial-implement-refresh-token-with-httpinterceptor-bfa27b966f57
2796
- */
2797
2889
  class TokenInterceptor {
2798
2890
  addAuthenticationToken(request) {
2799
- // Get access token from Local Storage
2800
- const accessToken = this.authService.getAuthorizationToken();
2891
+ const isStatistic = request.headers.has(InterceptorStatisticHeader);
2892
+ const authService = isStatistic ? this.statisticAuthService : this.auth;
2893
+ const accessToken = authService.getAuthorizationToken();
2801
2894
  // If access token is null this means that user is not logged in
2802
2895
  // And we return the original request
2803
2896
  if (!accessToken) {
@@ -2808,8 +2901,9 @@ class TokenInterceptor {
2808
2901
  headers: request.headers.set('Authorization', 'Bearer ' + accessToken)
2809
2902
  });
2810
2903
  }
2811
- constructor(authService, appInitializationService, router) {
2812
- this.authService = authService;
2904
+ constructor(auth, statisticAuthService, appInitializationService, router) {
2905
+ this.auth = auth;
2906
+ this.statisticAuthService = statisticAuthService;
2813
2907
  this.appInitializationService = appInitializationService;
2814
2908
  this.router = router;
2815
2909
  this.refreshTokenInProgress = false;
@@ -2818,6 +2912,8 @@ class TokenInterceptor {
2818
2912
  this.refreshTokenSubject = new BehaviorSubject(null);
2819
2913
  }
2820
2914
  intercept(req, next) {
2915
+ const isStatistic = req.headers.has(InterceptorStatisticHeader);
2916
+ const authService = isStatistic ? this.statisticAuthService : this.auth;
2821
2917
  if (req.url === undefined) {
2822
2918
  return next.handle(req);
2823
2919
  }
@@ -2858,9 +2954,9 @@ class TokenInterceptor {
2858
2954
  if (req.url.toUpperCase().includes('REFRESH_TOKEN') ||
2859
2955
  req.url.toUpperCase().includes('REFRESHTOKEN')) {
2860
2956
  this.appInitializationService.initializing$.next(false);
2861
- this.authService.userLogout().subscribe(x => {
2957
+ authService.userLogout().subscribe(x => {
2862
2958
  if (x.ok && x.status === 200) {
2863
- this.authService.postLogout();
2959
+ authService.postLogout();
2864
2960
  }
2865
2961
  });
2866
2962
  }
@@ -2892,7 +2988,7 @@ class TokenInterceptor {
2892
2988
  this.refreshTokenSubject.next(null);
2893
2989
  // Call auth.refreshAccessToken
2894
2990
  // (this is an Observable that will be returned)
2895
- const refreshTokenReq = this.authService.tryRestoreSession();
2991
+ const refreshTokenReq = authService.tryRestoreSession();
2896
2992
  return refreshTokenReq.pipe(
2897
2993
  /*
2898
2994
  The main difference between switchMap and other flattening operators is the cancelling effect. On each emission the previous inner observable (the result of the function you supplied) is cancelled and the new observable is subscribed. You can remember this by the phrase switch to a new observable.
@@ -2900,8 +2996,8 @@ class TokenInterceptor {
2900
2996
  switchMap((response) => {
2901
2997
  let token = '';
2902
2998
  if (response.ok && response.status === 200) {
2903
- this.authService.data$.next(response.body);
2904
- this.authService.authenticated$.next(true);
2999
+ authService.data$.next(response.body);
3000
+ authService.authenticated$.next(true);
2905
3001
  token = response.body.jwtToken;
2906
3002
  }
2907
3003
  // When the call to refreshToken completes
@@ -2915,9 +3011,9 @@ class TokenInterceptor {
2915
3011
  this.refreshTokenInProgress = false;
2916
3012
  console.log("refreshTokenReq catchError", err);
2917
3013
  debugger;
2918
- this.authService.userLogout().subscribe(x => {
3014
+ authService.userLogout().subscribe(x => {
2919
3015
  if (x.ok && x.status === 200) {
2920
- this.authService.postLogout();
3016
+ authService.postLogout();
2921
3017
  }
2922
3018
  });
2923
3019
  return throwError(() => new Error(err));
@@ -2927,12 +3023,12 @@ class TokenInterceptor {
2927
3023
  // Log when response observable either completes or errors
2928
3024
  finalize(() => { }));
2929
3025
  }
2930
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: TokenInterceptor, deps: [{ token: AuthService }, { token: AppInitializationService }, { token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
3026
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: TokenInterceptor, deps: [{ token: AuthService }, { token: StatisticAuthService }, { token: AppInitializationService }, { token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
2931
3027
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: TokenInterceptor }); }
2932
3028
  }
2933
3029
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: TokenInterceptor, decorators: [{
2934
3030
  type: Injectable
2935
- }], ctorParameters: () => [{ type: AuthService }, { type: AppInitializationService }, { type: i1$1.Router }] });
3031
+ }], ctorParameters: () => [{ type: AuthService }, { type: StatisticAuthService }, { type: AppInitializationService }, { type: i1$1.Router }] });
2936
3032
 
2937
3033
  class ResponseService {
2938
3034
  constructor(alertService, mls) {
@@ -22110,6 +22206,8 @@ class CoreStatisticWidgetComponent {
22110
22206
  this.comparisonTextRectHeight = (this.height / 4 - this.divisorLineMargin.bottom) / 2;
22111
22207
  this.x = d3.scaleLinear().range([0, this.graphWidth]);
22112
22208
  this.y = d3.scaleLinear().range([this.graphHeight, 0]);
22209
+ this.previousValue = 0;
22210
+ this.previousComparisonValue = 0;
22113
22211
  //To remove only the numbers while keeping the ticks on the axes,
22114
22212
  //you can select the text elements of the ticks and hide them using CSS.
22115
22213
  //Here's how you can modify the code to achieve that:
@@ -22139,44 +22237,98 @@ class CoreStatisticWidgetComponent {
22139
22237
  }
22140
22238
  updateMetricName() {
22141
22239
  var nameElement = d3.select("#metric_" + this.metric.id + "_name");
22142
- nameElement.text(this.metric.name);
22240
+ nameElement.transition().text(this.metric.name);
22143
22241
  }
22144
22242
  updateMetricValue() {
22145
- var valueElement = d3.select("metric_" + this.metric.id + "_value");
22243
+ var valueElement = d3.select("#metric_" + this.metric.id + "_value");
22244
+ const start = this.previousValue;
22245
+ const end = this.value;
22146
22246
  switch (this.metric.dataType) {
22147
22247
  case EnumICoreStatisticWidgetDataType.INTEGER:
22148
- valueElement.text(Math.round(this.value).toString());
22248
+ valueElement
22249
+ .transition()
22250
+ .tween("text", () => {
22251
+ const interpolator = d3.interpolateNumber(start, end);
22252
+ return t => {
22253
+ valueElement.text(Math.round(interpolator(t)));
22254
+ };
22255
+ })
22256
+ .duration(500);
22149
22257
  break;
22150
22258
  case EnumICoreStatisticWidgetDataType.DECIMAL:
22151
- valueElement.text(this.value.toString());
22259
+ valueElement
22260
+ .transition()
22261
+ .tween("text", () => {
22262
+ const interpolator = d3.interpolateNumber(start, end);
22263
+ return t => {
22264
+ valueElement.text(Math.round(interpolator(t) * 100) / 100);
22265
+ };
22266
+ })
22267
+ .duration(500);
22152
22268
  break;
22153
22269
  case EnumICoreStatisticWidgetDataType.PERCENTAGE:
22154
- valueElement.text(Math.round(this.value * 10000) / 100 + "%");
22270
+ valueElement
22271
+ .transition()
22272
+ .tween("text", () => {
22273
+ const interpolator = d3.interpolateNumber(start, end);
22274
+ return t => {
22275
+ valueElement.text(Math.round(interpolator(t) * 10000) / 100 + "%");
22276
+ };
22277
+ })
22278
+ .duration(500);
22155
22279
  break;
22156
22280
  default:
22157
- valueElement.text(this.value.toString());
22281
+ valueElement.transition().text(this.value.toString());
22158
22282
  break;
22159
22283
  }
22284
+ this.previousValue = this.value;
22160
22285
  }
22161
22286
  updateMetricComparisonValue() {
22162
- var comparisonValueElement = d3.select("metric_" + this.metric.id + "_comparisonValue");
22287
+ const start = this.previousComparisonValue;
22288
+ const end = this.comparisonValue;
22289
+ var comparisonValueElement = d3.select("#metric_" + this.metric.id + "_comparisonValue");
22290
+ comparisonValueElement.attr("fill", this.comparisonValue >= 0 ? this.comparisonTextFillColor : d3.color("red"));
22163
22291
  switch (this.metric.dataType) {
22164
22292
  case EnumICoreStatisticWidgetDataType.INTEGER:
22165
- comparisonValueElement.text(Math.round(this.comparisonValue).toString());
22293
+ comparisonValueElement
22294
+ .transition()
22295
+ .tween("text", () => {
22296
+ const interpolator = d3.interpolateNumber(start, end);
22297
+ return t => {
22298
+ comparisonValueElement.text(Math.round(interpolator(t)));
22299
+ };
22300
+ })
22301
+ .duration(500);
22166
22302
  break;
22167
22303
  case EnumICoreStatisticWidgetDataType.DECIMAL:
22168
- comparisonValueElement.text(this.comparisonValue.toString());
22304
+ comparisonValueElement
22305
+ .transition()
22306
+ .tween("text", () => {
22307
+ const interpolator = d3.interpolateNumber(start, end);
22308
+ return t => {
22309
+ comparisonValueElement.text(Math.round(interpolator(t) * 100) / 100);
22310
+ };
22311
+ })
22312
+ .duration(500);
22169
22313
  break;
22170
22314
  case EnumICoreStatisticWidgetDataType.PERCENTAGE:
22171
- comparisonValueElement.text(Math.round(this.comparisonValue * 10000) / 100 + "%");
22315
+ comparisonValueElement
22316
+ .transition()
22317
+ .tween("text", () => {
22318
+ const interpolator = d3.interpolateNumber(start, end);
22319
+ return t => {
22320
+ comparisonValueElement.text(Math.round(interpolator(t) * 10000) / 100 + "%");
22321
+ };
22322
+ })
22323
+ .duration(500);
22172
22324
  break;
22173
22325
  default:
22174
- comparisonValueElement.text(this.comparisonValue.toString());
22326
+ comparisonValueElement.transition().text(this.comparisonValue.toString());
22175
22327
  break;
22176
22328
  }
22177
22329
  }
22178
22330
  updateMetricComparisonText() {
22179
- var comparisonTextElement = d3.select("metric_" + this.metric.id + "_comparisonText");
22331
+ var comparisonTextElement = d3.select("#metric_" + this.metric.id + "_comparisonText");
22180
22332
  switch (this.metric.comparisonCode) {
22181
22333
  case EnumHrComparisonCode.WITH_PREVIOUS_MONTH:
22182
22334
  comparisonTextElement.text("vs. previous month");
@@ -22213,14 +22365,15 @@ class CoreStatisticWidgetComponent {
22213
22365
  .x(d => xScale(d.x))
22214
22366
  .y(d => yScale(d.y))
22215
22367
  .defined((d, i) => i >= 0 && i < this.dataset.length);
22216
- this.grayGroup.select("path")
22368
+ d3.select("#metric_" + this.metric.id + "_scatter-plot").select("path")
22217
22369
  .datum(this.dataset)
22218
22370
  .transition()
22219
22371
  .duration(500)
22220
22372
  .attr("d", this.connectingLine);
22221
22373
  // Update circles
22222
- const circles = this.grayGroup.selectAll("circle")
22374
+ const circles = d3.select("#metric_" + this.metric.id + "_scatter-plot").selectAll("circle")
22223
22375
  .data(this.dataset);
22376
+ circles.exit().remove();
22224
22377
  circles.enter()
22225
22378
  .append("circle")
22226
22379
  .merge(circles)
@@ -22245,7 +22398,7 @@ class CoreStatisticWidgetComponent {
22245
22398
  })
22246
22399
  .attr("stroke-width", 3); // Set stroke width
22247
22400
  }
22248
- drawGraph() {
22401
+ async drawGraph() {
22249
22402
  this.svg = d3.select(this.container.nativeElement)
22250
22403
  .append("svg")
22251
22404
  .attr("width", this.outerWidth)
@@ -22310,25 +22463,52 @@ class CoreStatisticWidgetComponent {
22310
22463
  .attr("y", this.valueRectHeight / 2)
22311
22464
  .attr("class", "graph-value")
22312
22465
  .attr("fill", this.valueFillColor)
22313
- .attr("font-size", this.valueRectHeight + "px")
22466
+ .attr("font-size", (this.valueFontSize || this.valueRectHeight) + "px")
22314
22467
  .attr("text-anchor", "middle")
22315
22468
  .attr("alignment-baseline", "middle");
22469
+ const startValue = 0;
22470
+ const endValue = this.value;
22316
22471
  switch (this.metric.dataType) {
22317
22472
  case EnumICoreStatisticWidgetDataType.INTEGER:
22318
- this.valueText.text(Math.round(this.value).toString());
22473
+ this.valueText
22474
+ .transition()
22475
+ .tween("text", () => {
22476
+ const interpolator = d3.interpolateNumber(startValue, endValue);
22477
+ return t => {
22478
+ this.valueText.text(Math.round(interpolator(t)));
22479
+ };
22480
+ })
22481
+ .duration(500);
22319
22482
  break;
22320
22483
  case EnumICoreStatisticWidgetDataType.DECIMAL:
22321
- this.valueText.text(this.value.toString());
22484
+ this.valueText
22485
+ .transition()
22486
+ .tween("text", () => {
22487
+ const interpolator = d3.interpolateNumber(startValue, endValue);
22488
+ return t => {
22489
+ this.valueText.text(Math.round(interpolator(t) * 100) / 100);
22490
+ };
22491
+ })
22492
+ .duration(500);
22322
22493
  break;
22323
22494
  case EnumICoreStatisticWidgetDataType.PERCENTAGE:
22324
- this.valueText.text(Math.round(this.value * 10000) / 100 + "%");
22495
+ this.valueText
22496
+ .transition()
22497
+ .tween("text", () => {
22498
+ const interpolator = d3.interpolateNumber(startValue, endValue);
22499
+ return t => {
22500
+ this.valueText.text(Math.round(interpolator(t) * 10000) / 100 + "%");
22501
+ };
22502
+ })
22503
+ .duration(500);
22325
22504
  break;
22326
22505
  default:
22327
22506
  this.valueText.text(this.value.toString());
22328
22507
  break;
22329
22508
  }
22509
+ this.previousValue = this.value;
22330
22510
  this.grayGroup = this.greenGroup.append("g")
22331
- .attr("id", "scatter-plot")
22511
+ .attr("id", "metric_" + this.metric.id + "_scatter-plot")
22332
22512
  .attr("transform", "translate(" + this.divisorLineMargin.left + ", " + this.height / 2 + ")");
22333
22513
  this.grayGroup.append("rect")
22334
22514
  .attr("class", "graph-container")
@@ -22359,24 +22539,51 @@ class CoreStatisticWidgetComponent {
22359
22539
  .attr("x", this.comparisonValueRectWidth / 2)
22360
22540
  .attr("y", this.comparisonValueRectHeight / 2)
22361
22541
  .attr("class", "graph-value")
22362
- .attr("fill", this.comparisonValueFillColor)
22542
+ .attr("fill", this.comparisonValue >= 0 ? this.comparisonValueFillColor : d3.color("red"))
22363
22543
  .attr("font-size", this.comparisonValueRectHeight + "px")
22364
22544
  .attr("text-anchor", "middle")
22365
22545
  .attr("alignment-baseline", "middle");
22546
+ const startComparisonValue = 0;
22547
+ const endComparisonValue = this.comparisonValue;
22366
22548
  switch (this.metric.dataType) {
22367
22549
  case EnumICoreStatisticWidgetDataType.INTEGER:
22368
- this.comparisonValueText.text(Math.round(this.comparisonValue).toString());
22550
+ comparisonValueText
22551
+ .transition()
22552
+ .tween("text", () => {
22553
+ const interpolator = d3.interpolateNumber(startValue, endValue);
22554
+ return t => {
22555
+ comparisonValueText.text(Math.round(interpolator(t)));
22556
+ };
22557
+ })
22558
+ .duration(500);
22369
22559
  break;
22370
22560
  case EnumICoreStatisticWidgetDataType.DECIMAL:
22371
- this.comparisonValueText.text(this.comparisonValue.toString());
22561
+ comparisonValueText
22562
+ .transition()
22563
+ .tween("text", () => {
22564
+ const interpolator = d3.interpolateNumber(startValue, endValue);
22565
+ return t => {
22566
+ comparisonValueText.text(Math.round(interpolator(t) * 100) / 100);
22567
+ };
22568
+ })
22569
+ .duration(500);
22372
22570
  break;
22373
22571
  case EnumICoreStatisticWidgetDataType.PERCENTAGE:
22374
- this.comparisonValueText.text(Math.round(this.comparisonValue * 10000) / 100 + "%");
22572
+ comparisonValueText
22573
+ .transition()
22574
+ .tween("text", () => {
22575
+ const interpolator = d3.interpolateNumber(startValue, endValue);
22576
+ return t => {
22577
+ comparisonValueText.text(Math.round(interpolator(t) * 10000) / 100 + "%");
22578
+ };
22579
+ })
22580
+ .duration(500);
22375
22581
  break;
22376
22582
  default:
22377
- this.comparisonValueText.text(this.comparisonValue.toString());
22583
+ comparisonValueText.text(this.comparisonValue.toString());
22378
22584
  break;
22379
22585
  }
22586
+ this.previousComparisonValue = this.comparisonValue;
22380
22587
  const comparisonTextGroupTranslateY = this.height * 3 / 4 + this.divisorLineMargin.bottom + this.comparisonTextRectHeight;
22381
22588
  this.comparisonTextGroup = this.greenGroup.append("g")
22382
22589
  .attr("class", "comparison-text-group")
@@ -22439,7 +22646,7 @@ class CoreStatisticWidgetComponent {
22439
22646
  return "#FF8C00"; // Set lowest point to #FF8C00
22440
22647
  if (d === maxPoint)
22441
22648
  return "#315897"; // Set highest point to #315897
22442
- return "gray"; // Set the other points transparent
22649
+ return "none"; // Set the other points transparent
22443
22650
  })
22444
22651
  .attr("stroke", function (d) {
22445
22652
  if (d === minPoint)
@@ -22456,7 +22663,7 @@ class CoreStatisticWidgetComponent {
22456
22663
  });
22457
22664
  }
22458
22665
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CoreStatisticWidgetComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
22459
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.3", type: CoreStatisticWidgetComponent, isStandalone: true, selector: "core-statistic-widget", inputs: { metric: "metric", dataset: "dataset", value: "value", comparisonValue: "comparisonValue", margin: "margin", padding: "padding", outerWidth: "outerWidth", outerHeight: "outerHeight", divisorLineMargin: "divisorLineMargin", titleFillColor: "titleFillColor", divisorLineStrokeColor: "divisorLineStrokeColor", divisorLineStrokeWidth: "divisorLineStrokeWidth", valueFillColor: "valueFillColor", comparisonValueFillColor: "comparisonValueFillColor", comparisonTextFillColor: "comparisonTextFillColor", showAxes: "showAxes" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #container class=\"core-statistic-widget-container\">\r\n \r\n</div>", styles: [""] }); }
22666
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.3", type: CoreStatisticWidgetComponent, isStandalone: true, selector: "core-statistic-widget", inputs: { metric: "metric", dataset: "dataset", value: "value", comparisonValue: "comparisonValue", valueFontSize: "valueFontSize", margin: "margin", padding: "padding", outerWidth: "outerWidth", outerHeight: "outerHeight", divisorLineMargin: "divisorLineMargin", titleFillColor: "titleFillColor", divisorLineStrokeColor: "divisorLineStrokeColor", divisorLineStrokeWidth: "divisorLineStrokeWidth", valueFillColor: "valueFillColor", comparisonValueFillColor: "comparisonValueFillColor", comparisonTextFillColor: "comparisonTextFillColor", showAxes: "showAxes" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div #container class=\"core-statistic-widget-container\">\r\n \r\n</div>", styles: [""] }); }
22460
22667
  }
22461
22668
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImport: i0, type: CoreStatisticWidgetComponent, decorators: [{
22462
22669
  type: Component,
@@ -22473,6 +22680,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
22473
22680
  }], comparisonValue: [{
22474
22681
  type: Input,
22475
22682
  args: [{ required: true }]
22683
+ }], valueFontSize: [{
22684
+ type: Input
22476
22685
  }], margin: [{
22477
22686
  type: Input
22478
22687
  }], padding: [{
@@ -23326,5 +23535,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.3", ngImpor
23326
23535
  * Generated bundle index. Do not edit.
23327
23536
  */
23328
23537
 
23329
- export { AlertComponent, AlertService, AnimatedTextComponent, AnimatedTextService, AppConfigService, AppInitializationService, AppService, AuthService, BaseComponent, BaseDropdownComponent, BaseEditComponent, ButtonGroupComponent, ButtonGroupModule, ButtonGroupService, CORE_VNS_BUTTONS, CacheService, CanActivateFunctionUrlMapperGuard, CanDeactivateGuard, CheckForUpdateService, CommonHttpRequestService, ConfigService, ConfirmDialogStateComponent, ControlBase, CoreAccordionComponent, CoreAccordionService, CoreApiProgressComponent, CoreAttachmentComponent, CoreButtonComponent, CoreButtonGroupComponent, CoreButtonGroupService, CoreButtonGroupVnsComponent, CoreButtonVnsComponent, CoreCheckboxComponent, CoreChecklistComponent, CoreCommonParamKitComponent, CoreCompositionComponent, CoreCompositionService, CoreCompositionState, CoreConfirmDialogComponent, CoreContractSeekerComponent, CoreControlComponent, CoreControlNoGridBufferComponent, CoreControlNoSeekerComponent, CoreControlService, CoreCurrencyInputComponent, CoreDatePickerComponent, CoreDatetimeService, CoreDropdownComponent, CoreEmployeeSeekerComponent, CoreFileUploaderComponent, CoreFormComponent, CoreFormControlBaseComponent, CoreFormControlSeekerComponent, CoreFormLiteComponent, CoreFormService, CoreGridBufferComponent, CoreHeaderParamsComponent, CoreIosSwitcherComponent, CoreLineComponent, CoreListComponent, CoreListLazyComponent, CoreLoadingSurfaceComponent, CoreMccComponent, CoreMonthPickerComponent, CoreMonthSelectorComponent, CoreNavigationTrackerComponent, CoreOrgTreeComponent, CoreOrgTreeService, CoreOrgTreeState, CoreOrgUnitSeekerComponent, CoreOrgchartflexComponent, CorePageEditComponent, CorePageEditLiteComponent, CorePageEditService, CorePageHeaderComponent, CorePageListComponent, CorePageListContentComponent, CorePageListService, CorePageListState, CorePageViewComponent, CorePaginationComponent, CorePaginationFullComponent, CorePaginationFullService, CoreParamControlComponent, CorePermissionActionsComponent, CorePermissionComponent, CorePermissionService, CorePositionConcurrentSeekerComponent, CorePositionSeekerComponent, CoreQueryBuilderComponent, CoreRadioGroupComponent, CoreReducerIconComponent, CoreRoutingHistoryComponent, CoreScrollComponent, CoreScrollLazyComponent, CoreStatisticWidgetComponent, CoreStatusStickerComponent, CoreSubFormGroupComponent, CoreTableComponent, CoreTabsComponent, CoreTagsComponent, CoreTopicPickerComponent, CoreTopicTreeComponent, CoreTreeComponent, CoreTreeGridComponent, CoreWageSeekerComponent, CoreWorkingSeekerComponent, CoreYearPickerComponent, CustomValidators, DATE_VALUE_ACCESSOR, DESKTOP_SCREEN_HEDER_HEIGHT, DateValueAccessor, DecisionComponent, DialogService, DialogStateComponent, DomService, ECoreTableToolClass, ECoreTableToolCode, EnumAlertType, EnumButtonCaptionCode, EnumCoreArticleCategoryTreeaAccessorMode, EnumCoreButtonCode, EnumCoreButtonVNSCode, EnumCoreFileUploaderType, EnumCoreFormControlSeekerSourceType, EnumCoreOrgTreeaAccessorMode, EnumCorePageEditBootstrapClass, EnumCorePageEditFieldType, EnumCorePageEditMode, EnumCoreTablePipeType, EnumCoreViewItemType, EnumErrorType, EnumExType, EnumFilterOperator, EnumFormBaseContolType, EnumHrComparisonCode, EnumICoreStatisticWidgetDataType, EnumIconClass, EnumOparator, EnumPermissionObjectType, EnumProfileInfoSector, EnumRecursiveFields, EnumSignalRType, EnumSortDirection, EnumStyleButtonClass, EnumSwUpdateVersionUpdatesEventType, EvaluateDialogComponent, EvaluateDialogService, FileService, FilterPipe, FooterComponent, FullscreenModalLoaderComponent, FunctionComponent, FunctionEditComponent, FunctionEditService, FunctionIgnoreComponent, FunctionIgnoreEditComponent, GroupFunctionComponent, GroupFunctionEditComponent, GrpcService, HeaderService, HistoryService, HttpErrorHandler, HubConnectionService, HuconcurrentlyComponent, IAlertOptions, ImageErrorResolverDirective, InMemoryComponent, InitializationCanActivateFn, InitializationCanMatchFn, InterceptorSkipHeader, IpServiceService, ItemComponent, JsonService, LanguageChangerComponent, LanguageComponent, LanguageEditComponent, LayoutService, LongTaskService, MOBILE_SCREEN_HEDER_HEIGHT, MapAvatarToServerPipe, MapService, MenuComponent, MenuEditComponent, MenuService, MessageService, ModalService, MultiLanguageService, MutationLogComponent, MutationViewComponent, NavigatorComponent, NavigatorService, NgxHistaffAlphaComponent, NgxHistaffAlphaService, NormalizeHumanNamePipe, OnlineUsersComponent, OrganizationService, PageTitleComponent, PaginationComponent, PortalRouteComponent, PortalRouteEditComponent, PositionComponent, PositionEditService, PositionTransferService, PushNotificationService, RandomAvatarService, RecursiveService, RequestCache, RequestCacheWithMap, ResponseService, RightchatComponent, RoutingService, STICKER_COLOR_SCHEMA, SeekerService, SocketService, StaffProfileComponent, StringService, SysActionComponent, SysActionEditComponent, SysFunctionActionComponent, SysFunctionActionEditComponent, SysFunctionActionMapperComponent, SysFunctionUrlMapperComponent, SysMenuService, SysModuleComponent, SysModuleEditComponent, TLA_CONFIG, TableCellPipe, Textbox, ThreedotsComponent, TimeSheetService, TooltipComponent, TooltipDirective, TopicPermissionService, TopicTreeService, TranslatePipe, UnicodeService, UrlService, UserActivityComponent, UserActivityService, WageComponent, WaittingScreenComponent, alertOptions, attachmentOptions, blob_to_base64_script, defaultPaging, httpInterceptorProviders, liner_to_nested_array_script, longAlertOptions, noneAutoClosedAlertOptions, normalizeHumanName, themeBlue };
23538
+ export { AlertComponent, AlertService, AnimatedTextComponent, AnimatedTextService, AppConfigService, AppInitializationService, AppService, AuthService, BaseComponent, BaseDropdownComponent, BaseEditComponent, ButtonGroupComponent, ButtonGroupModule, ButtonGroupService, CORE_VNS_BUTTONS, CacheService, CanActivateFunctionUrlMapperGuard, CanDeactivateGuard, CheckForUpdateService, CommonHttpRequestService, ConfigService, ConfirmDialogStateComponent, ControlBase, CoreAccordionComponent, CoreAccordionService, CoreApiProgressComponent, CoreAttachmentComponent, CoreButtonComponent, CoreButtonGroupComponent, CoreButtonGroupService, CoreButtonGroupVnsComponent, CoreButtonVnsComponent, CoreCheckboxComponent, CoreChecklistComponent, CoreCommonParamKitComponent, CoreCompositionComponent, CoreCompositionService, CoreCompositionState, CoreConfirmDialogComponent, CoreContractSeekerComponent, CoreControlComponent, CoreControlNoGridBufferComponent, CoreControlNoSeekerComponent, CoreControlService, CoreCurrencyInputComponent, CoreDatePickerComponent, CoreDatetimeService, CoreDropdownComponent, CoreEmployeeSeekerComponent, CoreFileUploaderComponent, CoreFormComponent, CoreFormControlBaseComponent, CoreFormControlSeekerComponent, CoreFormLiteComponent, CoreFormService, CoreGridBufferComponent, CoreHeaderParamsComponent, CoreIosSwitcherComponent, CoreLineComponent, CoreListComponent, CoreListLazyComponent, CoreLoadingSurfaceComponent, CoreMccComponent, CoreMonthPickerComponent, CoreMonthSelectorComponent, CoreNavigationTrackerComponent, CoreOrgTreeComponent, CoreOrgTreeService, CoreOrgTreeState, CoreOrgUnitSeekerComponent, CoreOrgchartflexComponent, CorePageEditComponent, CorePageEditLiteComponent, CorePageEditService, CorePageHeaderComponent, CorePageListComponent, CorePageListContentComponent, CorePageListService, CorePageListState, CorePageViewComponent, CorePaginationComponent, CorePaginationFullComponent, CorePaginationFullService, CoreParamControlComponent, CorePermissionActionsComponent, CorePermissionComponent, CorePermissionService, CorePositionConcurrentSeekerComponent, CorePositionSeekerComponent, CoreQueryBuilderComponent, CoreRadioGroupComponent, CoreReducerIconComponent, CoreRoutingHistoryComponent, CoreScrollComponent, CoreScrollLazyComponent, CoreStatisticWidgetComponent, CoreStatusStickerComponent, CoreSubFormGroupComponent, CoreTableComponent, CoreTabsComponent, CoreTagsComponent, CoreTopicPickerComponent, CoreTopicTreeComponent, CoreTreeComponent, CoreTreeGridComponent, CoreWageSeekerComponent, CoreWorkingSeekerComponent, CoreYearPickerComponent, CustomValidators, DATE_VALUE_ACCESSOR, DESKTOP_SCREEN_HEDER_HEIGHT, DateValueAccessor, DecisionComponent, DialogService, DialogStateComponent, DomService, ECoreTableToolClass, ECoreTableToolCode, EnumAlertType, EnumButtonCaptionCode, EnumCoreArticleCategoryTreeaAccessorMode, EnumCoreButtonCode, EnumCoreButtonVNSCode, EnumCoreFileUploaderType, EnumCoreFormControlSeekerSourceType, EnumCoreOrgTreeaAccessorMode, EnumCorePageEditBootstrapClass, EnumCorePageEditFieldType, EnumCorePageEditMode, EnumCoreTablePipeType, EnumCoreViewItemType, EnumErrorType, EnumExType, EnumFilterOperator, EnumFormBaseContolType, EnumHrComparisonCode, EnumICoreStatisticWidgetDataType, EnumIconClass, EnumOparator, EnumPermissionObjectType, EnumProfileInfoSector, EnumRecursiveFields, EnumSignalRType, EnumSortDirection, EnumStyleButtonClass, EnumSwUpdateVersionUpdatesEventType, EvaluateDialogComponent, EvaluateDialogService, FileService, FilterPipe, FooterComponent, FullscreenModalLoaderComponent, FunctionComponent, FunctionEditComponent, FunctionEditService, FunctionIgnoreComponent, FunctionIgnoreEditComponent, GroupFunctionComponent, GroupFunctionEditComponent, GrpcService, HeaderService, HistoryService, HttpErrorHandler, HubConnectionService, HuconcurrentlyComponent, IAlertOptions, ImageErrorResolverDirective, InMemoryComponent, InitializationCanActivateFn, InitializationCanMatchFn, InterceptorSkipHeader, IpServiceService, ItemComponent, JsonService, LanguageChangerComponent, LanguageComponent, LanguageEditComponent, LayoutService, LongTaskService, MOBILE_SCREEN_HEDER_HEIGHT, MapAvatarToServerPipe, MapService, MenuComponent, MenuEditComponent, MenuService, MessageService, ModalService, MultiLanguageService, MutationLogComponent, MutationViewComponent, NavigatorComponent, NavigatorService, NgxHistaffAlphaComponent, NgxHistaffAlphaService, NormalizeHumanNamePipe, OnlineUsersComponent, OrganizationService, PageTitleComponent, PaginationComponent, PortalRouteComponent, PortalRouteEditComponent, PositionComponent, PositionEditService, PositionTransferService, PushNotificationService, RandomAvatarService, RecursiveService, RequestCache, RequestCacheWithMap, ResponseService, RightchatComponent, RoutingService, STICKER_COLOR_SCHEMA, SeekerService, SocketService, StaffProfileComponent, StatisticAuthService, StatisticService, StringService, SysActionComponent, SysActionEditComponent, SysFunctionActionComponent, SysFunctionActionEditComponent, SysFunctionActionMapperComponent, SysFunctionUrlMapperComponent, SysMenuService, SysModuleComponent, SysModuleEditComponent, TLA_CONFIG, TableCellPipe, Textbox, ThreedotsComponent, TimeSheetService, TooltipComponent, TooltipDirective, TopicPermissionService, TopicTreeService, TranslatePipe, UnicodeService, UrlService, UserActivityComponent, UserActivityService, WageComponent, WaittingScreenComponent, alertOptions, attachmentOptions, blob_to_base64_script, defaultPaging, httpInterceptorProviders, liner_to_nested_array_script, longAlertOptions, noneAutoClosedAlertOptions, normalizeHumanName, themeBlue };
23330
23539
  //# sourceMappingURL=ngx-histaff-alpha.mjs.map