@esfaenza/core 16.2.28 → 19.2.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 (210) hide show
  1. package/components/back-top/back-top.component.d.ts +12 -12
  2. package/components/base/base.component.d.ts +26 -26
  3. package/components/base/embedding.component.d.ts +22 -22
  4. package/components/base/reactive.component.d.ts +9 -9
  5. package/components/breadcrumb/breadcrumb.component.d.ts +26 -26
  6. package/components/components.module.d.ts +32 -32
  7. package/components/error/404/pagenotfound.component.d.ts +15 -15
  8. package/components/error/500/servererror.component.d.ts +20 -20
  9. package/components/error/Angular/angularerror.component.d.ts +25 -25
  10. package/components/es-image-cropper/es-image-cropper.component.d.ts +25 -25
  11. package/components/es-modal/es-modal-head/es-modal-head.component.d.ts +11 -11
  12. package/components/es-modal/es-modal.component.d.ts +18 -18
  13. package/components/external-page/external_pages.component.d.ts +21 -21
  14. package/components/index.d.ts +5 -5
  15. package/components/jace-login/jace-login.component.d.ts +8 -8
  16. package/components/jace-resource/jace-resource.component.d.ts +25 -25
  17. package/components/labeled-span/labeled-span.component.d.ts +11 -11
  18. package/components/navbar/navbar.component.d.ts +58 -58
  19. package/components/navbar/navbar.component.loc.d.ts +8 -8
  20. package/components/page/pages.component.d.ts +23 -23
  21. package/components/public-api.d.ts +21 -21
  22. package/components/redirecter/redirecter.component.d.ts +23 -23
  23. package/components/sidebar/sidebar.component.d.ts +64 -64
  24. package/components/sidebar/sidebar.component.loc.d.ts +8 -8
  25. package/components/user_infos/user_infos.component.d.ts +50 -50
  26. package/components/user_infos/user_infos.component.loc.d.ts +8 -8
  27. package/directives/componentHost/componentHost.directive.d.ts +12 -12
  28. package/directives/directives.module.d.ts +12 -12
  29. package/directives/draggable/draggable.directive.d.ts +13 -13
  30. package/directives/es-modal/es-modal.directive.d.ts +20 -20
  31. package/directives/es-routerLink/es-routerLink.directive.d.ts +13 -13
  32. package/directives/index.d.ts +5 -5
  33. package/directives/public-api.d.ts +7 -7
  34. package/directives/slim-scroll/slim-scroll.directive.d.ts +15 -15
  35. package/directives/widget/widget.directive.d.ts +9 -9
  36. package/domain/index.d.ts +5 -5
  37. package/domain/models/core/ApplicationJob.d.ts +12 -12
  38. package/domain/models/core/ApplicationMenu.d.ts +16 -16
  39. package/domain/models/core/ApplicationRoutes.d.ts +2 -2
  40. package/domain/models/core/EnvOptions.d.ts +15 -15
  41. package/domain/models/core/GenericItem.d.ts +10 -10
  42. package/domain/models/core/KeyValue.d.ts +5 -5
  43. package/domain/models/global_search/SaerchResultContainer.d.ts +5 -5
  44. package/domain/models/global_search/SearchResult.d.ts +10 -10
  45. package/domain/models/jace/AccountScope.d.ts +9 -9
  46. package/domain/models/jace/ActiveModuleView.d.ts +11 -11
  47. package/domain/models/jace/CategoriesWithModules.d.ts +6 -6
  48. package/domain/models/jace/JaceAccount.d.ts +17 -17
  49. package/domain/models/jace/JaceIdentity.d.ts +17 -17
  50. package/domain/models/jace/JaceModule.d.ts +8 -8
  51. package/domain/models/jace/JacePermission.d.ts +10 -10
  52. package/domain/models/jace/JaceRole.d.ts +13 -13
  53. package/domain/models/jace/JaceUser.d.ts +9 -9
  54. package/domain/models/user/UpdateAccountRecoverySettingsDto.d.ts +5 -5
  55. package/domain/models/user/UpdatePasswordDto.d.ts +9 -9
  56. package/domain/models/user/UpdateProfilePictureDto.d.ts +4 -4
  57. package/domain/models/user/UserAccount.d.ts +23 -23
  58. package/domain/public-api.d.ts +22 -22
  59. package/domain/tokens.d.ts +22 -22
  60. package/fesm2022/esfaenza-core-components.mjs +1492 -1480
  61. package/fesm2022/esfaenza-core-components.mjs.map +1 -1
  62. package/fesm2022/esfaenza-core-directives.mjs +269 -269
  63. package/fesm2022/esfaenza-core-directives.mjs.map +1 -1
  64. package/fesm2022/esfaenza-core-domain.mjs +153 -153
  65. package/fesm2022/esfaenza-core-domain.mjs.map +1 -1
  66. package/fesm2022/esfaenza-core-helpers.mjs +38 -38
  67. package/fesm2022/esfaenza-core-helpers.mjs.map +1 -1
  68. package/fesm2022/esfaenza-core-modules.mjs +128 -134
  69. package/fesm2022/esfaenza-core-modules.mjs.map +1 -1
  70. package/fesm2022/esfaenza-core-pipes.mjs +96 -96
  71. package/fesm2022/esfaenza-core-pipes.mjs.map +1 -1
  72. package/fesm2022/esfaenza-core-services.mjs +1760 -1754
  73. package/fesm2022/esfaenza-core-services.mjs.map +1 -1
  74. package/fesm2022/esfaenza-core.mjs +206 -230
  75. package/fesm2022/esfaenza-core.mjs.map +1 -1
  76. package/helpers/classes/ResizeListener.d.ts +12 -12
  77. package/helpers/index.d.ts +5 -5
  78. package/helpers/public-api.d.ts +1 -1
  79. package/index.d.ts +5 -5
  80. package/lib/app.component.d.ts +13 -13
  81. package/lib/core.module.d.ts +85 -86
  82. package/modules/classes/_base.module.d.ts +4 -4
  83. package/modules/classes/_embedding.module.d.ts +11 -11
  84. package/modules/classes/_shared.module.d.ts +28 -29
  85. package/modules/classes/t_c.module.d.ts +18 -19
  86. package/modules/index.d.ts +5 -5
  87. package/modules/public-api.d.ts +4 -4
  88. package/package.json +84 -104
  89. package/pipes/classes/included_in.pipe.d.ts +7 -7
  90. package/pipes/classes/safe_html.pipe.d.ts +10 -10
  91. package/pipes/classes/safe_script.pipe.d.ts +10 -10
  92. package/pipes/classes/safe_style.pipe.d.ts +10 -10
  93. package/pipes/classes/safe_url.pipe.d.ts +10 -10
  94. package/pipes/index.d.ts +5 -5
  95. package/pipes/pipes.module.d.ts +11 -11
  96. package/pipes/public-api.d.ts +6 -6
  97. package/public-api.d.ts +2 -2
  98. package/services/classes/app.accesstoken.d.ts +17 -17
  99. package/services/classes/app.completedjobredirection.d.ts +12 -12
  100. package/services/classes/app.errorhandler.d.ts +11 -11
  101. package/services/classes/app.event.d.ts +10 -10
  102. package/services/classes/app.globalsearch.d.ts +25 -25
  103. package/services/classes/app.httpextensions.d.ts +34 -34
  104. package/services/classes/app.httpextensions.loc.d.ts +8 -8
  105. package/services/classes/app.menufilter.d.ts +14 -14
  106. package/services/classes/app.routeguard.d.ts +10 -10
  107. package/services/classes/app.session.d.ts +15 -15
  108. package/services/classes/app.state.d.ts +55 -55
  109. package/services/classes/preferences/app.cache.persistor.d.ts +25 -25
  110. package/services/classes/preferences/app.preference.persistor.d.ts +25 -25
  111. package/services/classes/preferences/user/app.userpreferences.base.d.ts +25 -25
  112. package/services/index.d.ts +5 -5
  113. package/services/public-api.d.ts +13 -13
  114. package/theme/initial.scss +17 -7
  115. package/esm2022/components/back-top/back-top.component.mjs +0 -43
  116. package/esm2022/components/base/base.component.mjs +0 -67
  117. package/esm2022/components/base/embedding.component.mjs +0 -64
  118. package/esm2022/components/base/reactive.component.mjs +0 -28
  119. package/esm2022/components/breadcrumb/breadcrumb.component.mjs +0 -80
  120. package/esm2022/components/components.module.mjs +0 -97
  121. package/esm2022/components/error/404/pagenotfound.component.mjs +0 -36
  122. package/esm2022/components/error/500/servererror.component.mjs +0 -47
  123. package/esm2022/components/error/Angular/angularerror.component.mjs +0 -62
  124. package/esm2022/components/es-image-cropper/es-image-cropper.component.mjs +0 -82
  125. package/esm2022/components/es-modal/es-modal-head/es-modal-head.component.mjs +0 -22
  126. package/esm2022/components/es-modal/es-modal.component.mjs +0 -40
  127. package/esm2022/components/esfaenza-core-components.mjs +0 -5
  128. package/esm2022/components/external-page/external_pages.component.mjs +0 -48
  129. package/esm2022/components/jace-login/jace-login.component.mjs +0 -31
  130. package/esm2022/components/jace-resource/jace-resource.component.mjs +0 -68
  131. package/esm2022/components/labeled-span/labeled-span.component.mjs +0 -25
  132. package/esm2022/components/navbar/navbar.component.loc.mjs +0 -41
  133. package/esm2022/components/navbar/navbar.component.mjs +0 -223
  134. package/esm2022/components/page/pages.component.mjs +0 -60
  135. package/esm2022/components/public-api.mjs +0 -22
  136. package/esm2022/components/redirecter/redirecter.component.mjs +0 -65
  137. package/esm2022/components/sidebar/sidebar.component.loc.mjs +0 -39
  138. package/esm2022/components/sidebar/sidebar.component.mjs +0 -286
  139. package/esm2022/components/user_infos/user_infos.component.loc.mjs +0 -43
  140. package/esm2022/components/user_infos/user_infos.component.mjs +0 -148
  141. package/esm2022/directives/componentHost/componentHost.directive.mjs +0 -29
  142. package/esm2022/directives/directives.module.mjs +0 -21
  143. package/esm2022/directives/draggable/draggable.directive.mjs +0 -49
  144. package/esm2022/directives/es-modal/es-modal.directive.mjs +0 -79
  145. package/esm2022/directives/es-routerLink/es-routerLink.directive.mjs +0 -55
  146. package/esm2022/directives/esfaenza-core-directives.mjs +0 -5
  147. package/esm2022/directives/public-api.mjs +0 -8
  148. package/esm2022/directives/slim-scroll/slim-scroll.directive.mjs +0 -41
  149. package/esm2022/directives/widget/widget.directive.mjs +0 -37
  150. package/esm2022/domain/esfaenza-core-domain.mjs +0 -5
  151. package/esm2022/domain/models/core/ApplicationJob.mjs +0 -3
  152. package/esm2022/domain/models/core/ApplicationMenu.mjs +0 -26
  153. package/esm2022/domain/models/core/ApplicationRoutes.mjs +0 -3
  154. package/esm2022/domain/models/core/EnvOptions.mjs +0 -13
  155. package/esm2022/domain/models/core/GenericItem.mjs +0 -12
  156. package/esm2022/domain/models/core/KeyValue.mjs +0 -15
  157. package/esm2022/domain/models/global_search/SaerchResultContainer.mjs +0 -6
  158. package/esm2022/domain/models/global_search/SearchResult.mjs +0 -8
  159. package/esm2022/domain/models/jace/AccountScope.mjs +0 -8
  160. package/esm2022/domain/models/jace/ActiveModuleView.mjs +0 -6
  161. package/esm2022/domain/models/jace/CategoriesWithModules.mjs +0 -7
  162. package/esm2022/domain/models/jace/JaceAccount.mjs +0 -3
  163. package/esm2022/domain/models/jace/JaceIdentity.mjs +0 -15
  164. package/esm2022/domain/models/jace/JaceModule.mjs +0 -10
  165. package/esm2022/domain/models/jace/JacePermission.mjs +0 -3
  166. package/esm2022/domain/models/jace/JaceRole.mjs +0 -9
  167. package/esm2022/domain/models/jace/JaceUser.mjs +0 -3
  168. package/esm2022/domain/models/user/UpdateAccountRecoverySettingsDto.mjs +0 -7
  169. package/esm2022/domain/models/user/UpdatePasswordDto.mjs +0 -11
  170. package/esm2022/domain/models/user/UpdateProfilePictureDto.mjs +0 -6
  171. package/esm2022/domain/models/user/UserAccount.mjs +0 -3
  172. package/esm2022/domain/public-api.mjs +0 -23
  173. package/esm2022/domain/tokens.mjs +0 -17
  174. package/esm2022/esfaenza-core.mjs +0 -5
  175. package/esm2022/helpers/classes/ResizeListener.mjs +0 -38
  176. package/esm2022/helpers/esfaenza-core-helpers.mjs +0 -5
  177. package/esm2022/helpers/public-api.mjs +0 -2
  178. package/esm2022/lib/app.component.mjs +0 -34
  179. package/esm2022/lib/core.module.mjs +0 -258
  180. package/esm2022/modules/classes/_base.module.mjs +0 -32
  181. package/esm2022/modules/classes/_embedding.module.mjs +0 -27
  182. package/esm2022/modules/classes/_shared.module.mjs +0 -47
  183. package/esm2022/modules/classes/t_c.module.mjs +0 -85
  184. package/esm2022/modules/esfaenza-core-modules.mjs +0 -5
  185. package/esm2022/modules/public-api.mjs +0 -5
  186. package/esm2022/pipes/classes/included_in.pipe.mjs +0 -20
  187. package/esm2022/pipes/classes/safe_html.pipe.mjs +0 -21
  188. package/esm2022/pipes/classes/safe_script.pipe.mjs +0 -21
  189. package/esm2022/pipes/classes/safe_style.pipe.mjs +0 -21
  190. package/esm2022/pipes/classes/safe_url.pipe.mjs +0 -21
  191. package/esm2022/pipes/esfaenza-core-pipes.mjs +0 -5
  192. package/esm2022/pipes/pipes.module.mjs +0 -20
  193. package/esm2022/pipes/public-api.mjs +0 -7
  194. package/esm2022/public-api.mjs +0 -3
  195. package/esm2022/services/classes/app.accesstoken.mjs +0 -1042
  196. package/esm2022/services/classes/app.completedjobredirection.mjs +0 -18
  197. package/esm2022/services/classes/app.errorhandler.mjs +0 -41
  198. package/esm2022/services/classes/app.event.mjs +0 -27
  199. package/esm2022/services/classes/app.globalsearch.mjs +0 -34
  200. package/esm2022/services/classes/app.httpextensions.loc.mjs +0 -15
  201. package/esm2022/services/classes/app.httpextensions.mjs +0 -90
  202. package/esm2022/services/classes/app.menufilter.mjs +0 -21
  203. package/esm2022/services/classes/app.routeguard.mjs +0 -23
  204. package/esm2022/services/classes/app.session.mjs +0 -40
  205. package/esm2022/services/classes/app.state.mjs +0 -229
  206. package/esm2022/services/classes/preferences/app.cache.persistor.mjs +0 -94
  207. package/esm2022/services/classes/preferences/app.preference.persistor.mjs +0 -94
  208. package/esm2022/services/classes/preferences/user/app.userpreferences.base.mjs +0 -101
  209. package/esm2022/services/esfaenza-core-services.mjs +0 -5
  210. package/esm2022/services/public-api.mjs +0 -14
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Component, ViewEncapsulation, Input, ViewChild, HostListener, Inject, Injectable, ChangeDetectionStrategy, Optional, EventEmitter, Output, NgModule } from '@angular/core';
2
+ import { HostListener, ViewChild, Input, ViewEncapsulation, Component, Inject, Injectable, Optional, ChangeDetectionStrategy, EventEmitter, Output, NgModule } from '@angular/core';
3
3
  import * as i1$1 from '@angular/router';
4
4
  import { NavigationEnd, RouterLink, RouterLinkActive, RouterOutlet, ActivatedRoute, Router, RouterModule } from '@angular/router';
5
5
  import * as i2 from '@angular/common';
6
6
  import { NgIf, NgFor, NgTemplateOutlet, NgClass, Location, CommonModule } from '@angular/common';
7
7
  import { filter, map, mergeMap, takeUntil as takeUntil$1 } from 'rxjs/operators';
8
- import { combineLatest, of, firstValueFrom, ReplaySubject, interval, startWith, takeUntil, takeWhile } from 'rxjs';
8
+ import { combineLatest, of, firstValueFrom, ReplaySubject, interval, startWith, takeUntil, takeWhile, debounceTime } from 'rxjs';
9
9
  import * as i1 from '@esfaenza/core/services';
10
10
  import { AppState } from '@esfaenza/core/services';
11
11
  import * as i3 from '@angular/platform-browser';
@@ -37,1521 +37,1533 @@ import { AppFile, FormsAndValidationsModule } from '@esfaenza/forms-and-validati
37
37
  import * as i7$1 from '@angular/material/tooltip';
38
38
  import { MatTooltipModule } from '@angular/material/tooltip';
39
39
 
40
- // Angular
41
- class BackTop {
42
- constructor() {
43
- this.position = 400;
44
- this.showSpeed = 500;
45
- this.moveSpeed = 1000;
46
- }
47
- ngAfterViewInit() {
48
- this._onWindowScroll();
49
- }
50
- _onClick() {
51
- $("html, body").animate({ scrollTop: 0 }, { duration: this.moveSpeed });
52
- return false;
53
- }
54
- _onWindowScroll() {
55
- let el = this._selector.nativeElement;
56
- window.scrollY > this.position ? $(el).fadeIn(this.showSpeed) : $(el).fadeOut(this.showSpeed);
57
- }
58
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BackTop, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
59
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: BackTop, isStandalone: true, selector: "back-top", inputs: { position: "position", showSpeed: "showSpeed", moveSpeed: "moveSpeed" }, host: { listeners: { "click": "_onClick()", "window:scroll.out-zone": "_onWindowScroll()" } }, viewQueries: [{ propertyName: "_selector", first: true, predicate: ["backTop"], descendants: true }], ngImport: i0, template: "<i #backTop class=\"fa fa-angle-up back-to-top\" title=\"Back to Top\"></i>", styles: [".back-to-top{position:fixed;width:40px;height:40px;cursor:pointer;z-index:9999;display:none;text-decoration:none;right:40px;bottom:40px!important;font-size:30px;text-align:center;opacity:.4;color:#fff;background-color:#242d3abf;border-radius:50%;line-height:34px}.back-to-top:hover{opacity:.8}\n"], encapsulation: i0.ViewEncapsulation.None }); }
60
- }
61
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BackTop, decorators: [{
62
- type: Component,
63
- args: [{ selector: "back-top", encapsulation: ViewEncapsulation.None, standalone: true, template: "<i #backTop class=\"fa fa-angle-up back-to-top\" title=\"Back to Top\"></i>", styles: [".back-to-top{position:fixed;width:40px;height:40px;cursor:pointer;z-index:9999;display:none;text-decoration:none;right:40px;bottom:40px!important;font-size:30px;text-align:center;opacity:.4;color:#fff;background-color:#242d3abf;border-radius:50%;line-height:34px}.back-to-top:hover{opacity:.8}\n"] }]
64
- }], propDecorators: { position: [{
65
- type: Input
66
- }], showSpeed: [{
67
- type: Input
68
- }], moveSpeed: [{
69
- type: Input
70
- }], _selector: [{
71
- type: ViewChild,
72
- args: ["backTop", { static: false }]
73
- }], _onClick: [{
74
- type: HostListener,
75
- args: ["click"]
76
- }], _onWindowScroll: [{
77
- type: HostListener,
78
- args: ["window:scroll.out-zone"]
40
+ // Angular
41
+ class BackTop {
42
+ constructor() {
43
+ this.position = 400;
44
+ this.showSpeed = 500;
45
+ this.moveSpeed = 1000;
46
+ }
47
+ ngAfterViewInit() {
48
+ this._onWindowScroll();
49
+ }
50
+ _onClick() {
51
+ $("html, body").animate({ scrollTop: 0 }, { duration: this.moveSpeed });
52
+ return false;
53
+ }
54
+ _onWindowScroll() {
55
+ let el = this._selector.nativeElement;
56
+ window.scrollY > this.position ? $(el).fadeIn(this.showSpeed) : $(el).fadeOut(this.showSpeed);
57
+ }
58
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BackTop, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
59
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: BackTop, isStandalone: true, selector: "back-top", inputs: { position: "position", showSpeed: "showSpeed", moveSpeed: "moveSpeed" }, host: { listeners: { "click": "_onClick()", "window:scroll.out-zone": "_onWindowScroll()" } }, viewQueries: [{ propertyName: "_selector", first: true, predicate: ["backTop"], descendants: true }], ngImport: i0, template: "<i #backTop class=\"fa fa-angle-up back-to-top\" title=\"Back to Top\"></i>", styles: [".back-to-top{position:fixed;width:40px;height:40px;cursor:pointer;z-index:9999;display:none;text-decoration:none;right:40px;bottom:40px!important;font-size:30px;text-align:center;opacity:.4;color:#fff;background-color:#242d3abf;border-radius:50%;line-height:34px}.back-to-top:hover{opacity:.8}\n"], encapsulation: i0.ViewEncapsulation.None }); }
60
+ }
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BackTop, decorators: [{
62
+ type: Component,
63
+ args: [{ selector: "back-top", encapsulation: ViewEncapsulation.None, standalone: true, template: "<i #backTop class=\"fa fa-angle-up back-to-top\" title=\"Back to Top\"></i>", styles: [".back-to-top{position:fixed;width:40px;height:40px;cursor:pointer;z-index:9999;display:none;text-decoration:none;right:40px;bottom:40px!important;font-size:30px;text-align:center;opacity:.4;color:#fff;background-color:#242d3abf;border-radius:50%;line-height:34px}.back-to-top:hover{opacity:.8}\n"] }]
64
+ }], propDecorators: { position: [{
65
+ type: Input
66
+ }], showSpeed: [{
67
+ type: Input
68
+ }], moveSpeed: [{
69
+ type: Input
70
+ }], _selector: [{
71
+ type: ViewChild,
72
+ args: ["backTop", { static: false }]
73
+ }], _onClick: [{
74
+ type: HostListener,
75
+ args: ["click"]
76
+ }], _onWindowScroll: [{
77
+ type: HostListener,
78
+ args: ["window:scroll.out-zone"]
79
79
  }] } });
80
80
 
81
- // Angular
82
- class Breadcrumb {
83
- constructor(_state, router, _activatedRoute, _titleService, emb) {
84
- this._state = _state;
85
- this.router = router;
86
- this._activatedRoute = _activatedRoute;
87
- this._titleService = _titleService;
88
- this.emb = emb;
89
- this.MainLink = { title: "Dashboard", routerLink: ["/pages/dashboard"] };
90
- this.SubLinks = [];
91
- this.router.events.pipe(filter(event => event instanceof NavigationEnd), map((event) => { return { event: event, route: this._activatedRoute }; }), map((routeWithEvent) => {
92
- while (routeWithEvent.route.firstChild)
93
- routeWithEvent.route = routeWithEvent.route.firstChild;
94
- return routeWithEvent;
95
- }), mergeMap(routeWithEvent => combineLatest(of(routeWithEvent.event.url).pipe(map(url => this.router.parseUrl(url))), routeWithEvent.route.data))).subscribe((treePlusData) => {
96
- let data = treePlusData[1];
97
- let tree = treePlusData[0];
98
- // true = SUB - dettaglio
99
- // false = MAIN - ricerca/dashboard
100
- let internalNavigation = data["InternalNavigation"] || data["internalNavigation"];
101
- let title = data["title"];
102
- this.handleNavigation(title, internalNavigation, tree);
103
- });
104
- this.emb.MessageObserver.pipe(filter(ev => ev.event == "navigation")).subscribe(event => {
105
- let internalNavigation = event?.data?.internalNavigation;
106
- let title = event?.data?.title;
107
- this.handleNavigation(title, internalNavigation);
108
- });
109
- }
110
- handleNavigation(title, internal, tree = null) {
111
- if (internal) {
112
- this.onSubNavigation(tree, title);
113
- }
114
- else {
115
- this.onMainNavigation(tree, title);
116
- }
117
- this._titleService.setTitle(myconfig.AppData.ModuleDescription + (title ? (" > " + title) : ''));
118
- }
119
- ngOnInit() { }
120
- onSubNavigation(tree, title) {
121
- let index = this.SubLinks.indexOf(this.SubLinks.find(f => f.title == title));
122
- let difference = this.SubLinks.length - (index + 1);
123
- if (index != -1 && (index + 1) != this.SubLinks.length) {
124
- for (let i = 0; i < difference; i++)
125
- this.SubLinks.pop();
126
- }
127
- if (index == -1 && this.MainLink.title != title)
128
- this.SubLinks.push({ title: title, routerLink: tree ? this.getRouterLink(tree) : null });
129
- }
130
- onMainNavigation(tree, title) {
131
- this.SubLinks = [];
132
- this.MainLink = { title: title, routerLink: tree ? this.getRouterLink(tree) : null };
133
- }
134
- getRouterLink(tree) {
135
- let segs = tree?.root?.children?.["primary"]?.segments ?? [];
136
- let route = "/" + segs.map(t => t.path).join('/');
137
- let params = segs[segs.length - 1]?.parameters;
138
- return [route, params];
139
- }
140
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Breadcrumb, deps: [{ token: i1.AppState }, { token: i1$1.Router }, { token: i1$1.ActivatedRoute }, { token: i3.Title }, { token: i4.AppEmbeddingExtensions }], target: i0.ɵɵFactoryTarget.Component }); }
141
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: Breadcrumb, isStandalone: true, selector: "breadcrumb", ngImport: i0, template: "<ol class=\"breadcrumb app-no-selection\">\r\n <li class=\"breadcrumb-item text-uppercase breadcrumb-link\" [routerLink]=\"['/pages/dashboard']\">Dashboard</li>\r\n <li *ngIf=\"MainLink?.title != 'Dashboard'\" [routerLink]=\"MainLink.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\">{{MainLink.title}}</li>\r\n \r\n <ng-container *ngFor=\"let link of SubLinks\">\r\n <li *ngIf=\"link.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\" [routerLink]=\"link.routerLink\">{{link.title}}</li>\r\n <li *ngIf=\"!link.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\">{{link.title}}</li>\r\n </ng-container>\r\n</ol>", styles: [".breadcrumb{padding:0;margin:0;background:transparent;color:#344154;font-size:14px}.breadcrumb-item+.breadcrumb-item:before{font-weight:400!important;color:#fff;font-family:\"Font Awesome 6 Pro\";font-size:.6rem;line-height:1.4rem;content:\"\\f054\"}.breadcrumb-item{float:left}.breadcrumb-link{cursor:pointer;font-weight:500;color:#fff!important}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], encapsulation: i0.ViewEncapsulation.None }); }
142
- }
143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Breadcrumb, decorators: [{
144
- type: Component,
145
- args: [{ selector: "breadcrumb", encapsulation: ViewEncapsulation.None, standalone: true, imports: [NgIf, NgFor, RouterLink], template: "<ol class=\"breadcrumb app-no-selection\">\r\n <li class=\"breadcrumb-item text-uppercase breadcrumb-link\" [routerLink]=\"['/pages/dashboard']\">Dashboard</li>\r\n <li *ngIf=\"MainLink?.title != 'Dashboard'\" [routerLink]=\"MainLink.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\">{{MainLink.title}}</li>\r\n \r\n <ng-container *ngFor=\"let link of SubLinks\">\r\n <li *ngIf=\"link.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\" [routerLink]=\"link.routerLink\">{{link.title}}</li>\r\n <li *ngIf=\"!link.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\">{{link.title}}</li>\r\n </ng-container>\r\n</ol>", styles: [".breadcrumb{padding:0;margin:0;background:transparent;color:#344154;font-size:14px}.breadcrumb-item+.breadcrumb-item:before{font-weight:400!important;color:#fff;font-family:\"Font Awesome 6 Pro\";font-size:.6rem;line-height:1.4rem;content:\"\\f054\"}.breadcrumb-item{float:left}.breadcrumb-link{cursor:pointer;font-weight:500;color:#fff!important}\n"] }]
146
- }], ctorParameters: function () { return [{ type: i1.AppState }, { type: i1$1.Router }, { type: i1$1.ActivatedRoute }, { type: i3.Title }, { type: i4.AppEmbeddingExtensions }]; } });
147
- class BreadcrumbItem {
81
+ // Angular
82
+ class Breadcrumb {
83
+ constructor(_state, router, _activatedRoute, _titleService, emb) {
84
+ this._state = _state;
85
+ this.router = router;
86
+ this._activatedRoute = _activatedRoute;
87
+ this._titleService = _titleService;
88
+ this.emb = emb;
89
+ this.MainLink = { title: "Dashboard", routerLink: ["/pages/dashboard"] };
90
+ this.SubLinks = [];
91
+ this.router.events.pipe(filter(event => event instanceof NavigationEnd), map((event) => { return { event: event, route: this._activatedRoute }; }), map((routeWithEvent) => {
92
+ while (routeWithEvent.route.firstChild)
93
+ routeWithEvent.route = routeWithEvent.route.firstChild;
94
+ return routeWithEvent;
95
+ }), mergeMap(routeWithEvent => combineLatest(of(routeWithEvent.event.url).pipe(map(url => this.router.parseUrl(url))), routeWithEvent.route.data))).subscribe((treePlusData) => {
96
+ let data = treePlusData[1];
97
+ let tree = treePlusData[0];
98
+ // true = SUB - dettaglio
99
+ // false = MAIN - ricerca/dashboard
100
+ let internalNavigation = data["InternalNavigation"] || data["internalNavigation"];
101
+ let title = data["title"];
102
+ this.handleNavigation(title, internalNavigation, tree);
103
+ });
104
+ this.emb.MessageObserver.pipe(filter(ev => ev.event == "navigation")).subscribe(event => {
105
+ let internalNavigation = event?.data?.internalNavigation;
106
+ let title = event?.data?.title;
107
+ this.handleNavigation(title, internalNavigation);
108
+ });
109
+ }
110
+ handleNavigation(title, internal, tree = null) {
111
+ if (internal) {
112
+ this.onSubNavigation(tree, title);
113
+ }
114
+ else {
115
+ this.onMainNavigation(tree, title);
116
+ }
117
+ this._titleService.setTitle(myconfig.AppData.ModuleDescription + (title ? (" > " + title) : ''));
118
+ }
119
+ ngOnInit() { }
120
+ onSubNavigation(tree, title) {
121
+ let index = this.SubLinks.indexOf(this.SubLinks.find(f => f.title == title));
122
+ let difference = this.SubLinks.length - (index + 1);
123
+ if (index != -1 && (index + 1) != this.SubLinks.length) {
124
+ for (let i = 0; i < difference; i++)
125
+ this.SubLinks.pop();
126
+ }
127
+ if (index == -1 && this.MainLink.title != title)
128
+ this.SubLinks.push({ title: title, routerLink: tree ? this.getRouterLink(tree) : null });
129
+ }
130
+ onMainNavigation(tree, title) {
131
+ this.SubLinks = [];
132
+ this.MainLink = { title: title, routerLink: tree ? this.getRouterLink(tree) : null };
133
+ }
134
+ getRouterLink(tree) {
135
+ let segs = tree?.root?.children?.["primary"]?.segments ?? [];
136
+ let route = "/" + segs.map(t => t.path).join('/');
137
+ let params = segs[segs.length - 1]?.parameters;
138
+ return [route, params];
139
+ }
140
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: Breadcrumb, deps: [{ token: i1.AppState }, { token: i1$1.Router }, { token: i1$1.ActivatedRoute }, { token: i3.Title }, { token: i4.AppEmbeddingExtensions }], target: i0.ɵɵFactoryTarget.Component }); }
141
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: Breadcrumb, isStandalone: true, selector: "breadcrumb", ngImport: i0, template: "<ol class=\"breadcrumb app-no-selection\">\r\n <li class=\"breadcrumb-item text-uppercase breadcrumb-link\" [routerLink]=\"['/pages/dashboard']\">Dashboard</li>\r\n <li *ngIf=\"MainLink?.title != 'Dashboard'\" [routerLink]=\"MainLink.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\">{{MainLink.title}}</li>\r\n \r\n <ng-container *ngFor=\"let link of SubLinks\">\r\n <li *ngIf=\"link.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\" [routerLink]=\"link.routerLink\">{{link.title}}</li>\r\n <li *ngIf=\"!link.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\">{{link.title}}</li>\r\n </ng-container>\r\n</ol>", styles: [".breadcrumb{padding:0;margin:0;background:transparent;color:#344154;font-size:14px}.breadcrumb-item+.breadcrumb-item:before{font-weight:400!important;color:#fff;font-family:\"Font Awesome 6 Pro\";font-size:.6rem;line-height:1.4rem;content:\"\\f054\"}.breadcrumb-item{float:left}.breadcrumb-link{cursor:pointer;font-weight:500;color:#fff!important}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], encapsulation: i0.ViewEncapsulation.None }); }
142
+ }
143
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: Breadcrumb, decorators: [{
144
+ type: Component,
145
+ args: [{ selector: "breadcrumb", encapsulation: ViewEncapsulation.None, imports: [NgIf, NgFor, RouterLink], template: "<ol class=\"breadcrumb app-no-selection\">\r\n <li class=\"breadcrumb-item text-uppercase breadcrumb-link\" [routerLink]=\"['/pages/dashboard']\">Dashboard</li>\r\n <li *ngIf=\"MainLink?.title != 'Dashboard'\" [routerLink]=\"MainLink.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\">{{MainLink.title}}</li>\r\n \r\n <ng-container *ngFor=\"let link of SubLinks\">\r\n <li *ngIf=\"link.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\" [routerLink]=\"link.routerLink\">{{link.title}}</li>\r\n <li *ngIf=\"!link.routerLink\" class=\"breadcrumb-item text-uppercase breadcrumb-link\">{{link.title}}</li>\r\n </ng-container>\r\n</ol>", styles: [".breadcrumb{padding:0;margin:0;background:transparent;color:#344154;font-size:14px}.breadcrumb-item+.breadcrumb-item:before{font-weight:400!important;color:#fff;font-family:\"Font Awesome 6 Pro\";font-size:.6rem;line-height:1.4rem;content:\"\\f054\"}.breadcrumb-item{float:left}.breadcrumb-link{cursor:pointer;font-weight:500;color:#fff!important}\n"] }]
146
+ }], ctorParameters: () => [{ type: i1.AppState }, { type: i1$1.Router }, { type: i1$1.ActivatedRoute }, { type: i3.Title }, { type: i4.AppEmbeddingExtensions }] });
147
+ class BreadcrumbItem {
148
148
  }
149
149
 
150
- // Angular
151
- class PageNotFoundComponent {
152
- constructor(router, _location, emb, ANONYMOUS_MODE) {
153
- this._location = _location;
154
- this.emb = emb;
155
- this.ANONYMOUS_MODE = ANONYMOUS_MODE;
156
- this.router = router;
157
- }
158
- goPreviousPage() {
159
- this._location.back();
160
- }
161
- goDashboard() {
162
- let url = `/pages/dashboard`;
163
- if (this.emb.Embedded)
164
- this.emb.MainWindow.postMessage({ type: "navigate", url }, "*");
165
- else
166
- this.router.navigate([url]);
167
- }
168
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PageNotFoundComponent, deps: [{ token: i1$1.Router }, { token: i2.Location }, { token: i4.AppEmbeddingExtensions }, { token: ANONYMOUS_MODE }], target: i0.ɵɵFactoryTarget.Component }); }
169
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PageNotFoundComponent, isStandalone: true, selector: "pagenotfound", ngImport: i0, template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-6 col-md-6 col-10 offset-xl-3 offset-md-3 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-1\">404</h1>\r\n <h6 class=\"card-title\">La risorsa richiesta non &egrave; stata trovata ma in futuro potrebbe essere disponibile.</h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-left\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
170
- }
171
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PageNotFoundComponent, decorators: [{
172
- type: Component,
173
- args: [{ selector: "pagenotfound", encapsulation: ViewEncapsulation.None, imports: [NgIf], standalone: true, template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-6 col-md-6 col-10 offset-xl-3 offset-md-3 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-1\">404</h1>\r\n <h6 class=\"card-title\">La risorsa richiesta non &egrave; stata trovata ma in futuro potrebbe essere disponibile.</h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-left\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>" }]
174
- }], ctorParameters: function () { return [{ type: i1$1.Router }, { type: i2.Location }, { type: i4.AppEmbeddingExtensions }, { type: undefined, decorators: [{
175
- type: Inject,
176
- args: [ANONYMOUS_MODE]
177
- }] }]; } });
150
+ // Angular
151
+ class PageNotFoundComponent {
152
+ constructor(router, _location, emb, ANONYMOUS_MODE) {
153
+ this._location = _location;
154
+ this.emb = emb;
155
+ this.ANONYMOUS_MODE = ANONYMOUS_MODE;
156
+ this.router = router;
157
+ }
158
+ goPreviousPage() {
159
+ this._location.back();
160
+ }
161
+ goDashboard() {
162
+ let url = `/pages/dashboard`;
163
+ if (this.emb.Embedded)
164
+ this.emb.MainWindow.postMessage({ type: "navigate", url }, "*");
165
+ else
166
+ this.router.navigate([url]);
167
+ }
168
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PageNotFoundComponent, deps: [{ token: i1$1.Router }, { token: i2.Location }, { token: i4.AppEmbeddingExtensions }, { token: ANONYMOUS_MODE }], target: i0.ɵɵFactoryTarget.Component }); }
169
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: PageNotFoundComponent, isStandalone: true, selector: "pagenotfound", ngImport: i0, template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-6 col-md-6 col-10 offset-xl-3 offset-md-3 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-1\">404</h1>\r\n <h6 class=\"card-title\">La risorsa richiesta non &egrave; stata trovata ma in futuro potrebbe essere disponibile.</h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-left\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
170
+ }
171
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PageNotFoundComponent, decorators: [{
172
+ type: Component,
173
+ args: [{ selector: "pagenotfound", encapsulation: ViewEncapsulation.None, imports: [NgIf], template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-6 col-md-6 col-10 offset-xl-3 offset-md-3 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-1\">404</h1>\r\n <h6 class=\"card-title\">La risorsa richiesta non &egrave; stata trovata ma in futuro potrebbe essere disponibile.</h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-left\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>" }]
174
+ }], ctorParameters: () => [{ type: i1$1.Router }, { type: i2.Location }, { type: i4.AppEmbeddingExtensions }, { type: undefined, decorators: [{
175
+ type: Inject,
176
+ args: [ANONYMOUS_MODE]
177
+ }] }] });
178
178
 
179
- // Angular
180
- class ServerErrorComponent {
181
- constructor(router, route, emb, as, ANONYMOUS_MODE) {
182
- this.router = router;
183
- this.route = route;
184
- this.emb = emb;
185
- this.as = as;
186
- this.ANONYMOUS_MODE = ANONYMOUS_MODE;
187
- this.statusCode = this.route.snapshot.params["statusCode"];
188
- this.statusText = this.b64DecodeUnicode(this.route.snapshot.params["statusText"]);
189
- this.previousUrl = this.route.snapshot.params["fromUrl"];
190
- //Dopo 1 secondo considero la sfilza di errori finita
191
- setTimeout(() => { this.as.handlingError = false; }, 1000);
192
- console.log("Modalità anonima: " + this.ANONYMOUS_MODE);
193
- }
194
- b64DecodeUnicode(str) {
195
- // Going backwards: from bytestream, to percent-encoding, to original string.
196
- return decodeURIComponent(atob(str).split("").map(c => "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2)).join(""));
197
- }
198
- goPreviousPage() {
199
- this.router.navigateByUrl(this.previousUrl);
200
- }
201
- goDashboard() {
202
- let url = `/pages/dashboard`;
203
- if (this.emb.Embedded)
204
- this.emb.MainWindow.postMessage({ type: "navigate", url }, "*");
205
- else
206
- this.router.navigate([url]);
207
- }
208
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ServerErrorComponent, deps: [{ token: i1$1.Router }, { token: i1$1.ActivatedRoute }, { token: i4.AppEmbeddingExtensions }, { token: i1.AppState }, { token: ANONYMOUS_MODE }], target: i0.ɵɵFactoryTarget.Component }); }
209
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ServerErrorComponent, isStandalone: true, selector: "servererror", ngImport: i0, template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-6 col-md-6 col-10 offset-xl-3 offset-md-3 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-1\" *ngIf=\"!statusCode\">&nbsp;&nbsp;&nbsp;</h1>\r\n <h1 class=\"display-1\" *ngIf=\"statusCode\">{{statusCode}}</h1>\r\n <h6 class=\"card-title\" *ngIf=\"!statusText\">&nbsp;&nbsp;&nbsp;</h6>\r\n <h6 class=\"card-title\" style=\"word-wrap:break-word; max-height: 500px; overflow: auto\" *ngIf=\"statusText\">{{statusText}}</h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-left\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
210
- }
211
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ServerErrorComponent, decorators: [{
212
- type: Component,
213
- args: [{ selector: "servererror", encapsulation: ViewEncapsulation.None, standalone: true, imports: [NgIf], template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-6 col-md-6 col-10 offset-xl-3 offset-md-3 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-1\" *ngIf=\"!statusCode\">&nbsp;&nbsp;&nbsp;</h1>\r\n <h1 class=\"display-1\" *ngIf=\"statusCode\">{{statusCode}}</h1>\r\n <h6 class=\"card-title\" *ngIf=\"!statusText\">&nbsp;&nbsp;&nbsp;</h6>\r\n <h6 class=\"card-title\" style=\"word-wrap:break-word; max-height: 500px; overflow: auto\" *ngIf=\"statusText\">{{statusText}}</h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-left\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>" }]
214
- }], ctorParameters: function () { return [{ type: i1$1.Router }, { type: i1$1.ActivatedRoute }, { type: i4.AppEmbeddingExtensions }, { type: i1.AppState }, { type: undefined, decorators: [{
215
- type: Inject,
216
- args: [ANONYMOUS_MODE]
217
- }] }]; } });
179
+ // Angular
180
+ class ServerErrorComponent {
181
+ constructor(router, route, emb, as, ANONYMOUS_MODE) {
182
+ this.router = router;
183
+ this.route = route;
184
+ this.emb = emb;
185
+ this.as = as;
186
+ this.ANONYMOUS_MODE = ANONYMOUS_MODE;
187
+ this.statusCode = this.route.snapshot.params["statusCode"];
188
+ this.statusText = this.b64DecodeUnicode(this.route.snapshot.params["statusText"]);
189
+ this.previousUrl = this.route.snapshot.params["fromUrl"];
190
+ //Dopo 1 secondo considero la sfilza di errori finita
191
+ setTimeout(() => { this.as.handlingError = false; }, 1000);
192
+ console.log("Modalità anonima: " + this.ANONYMOUS_MODE);
193
+ }
194
+ b64DecodeUnicode(str) {
195
+ // Going backwards: from bytestream, to percent-encoding, to original string.
196
+ return decodeURIComponent(atob(str).split("").map(c => "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2)).join(""));
197
+ }
198
+ goPreviousPage() {
199
+ this.router.navigateByUrl(this.previousUrl);
200
+ }
201
+ goDashboard() {
202
+ let url = `/pages/dashboard`;
203
+ if (this.emb.Embedded)
204
+ this.emb.MainWindow.postMessage({ type: "navigate", url }, "*");
205
+ else
206
+ this.router.navigate([url]);
207
+ }
208
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ServerErrorComponent, deps: [{ token: i1$1.Router }, { token: i1$1.ActivatedRoute }, { token: i4.AppEmbeddingExtensions }, { token: i1.AppState }, { token: ANONYMOUS_MODE }], target: i0.ɵɵFactoryTarget.Component }); }
209
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: ServerErrorComponent, isStandalone: true, selector: "servererror", ngImport: i0, template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-6 col-md-6 col-10 offset-xl-3 offset-md-3 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-1\" *ngIf=\"!statusCode\">&nbsp;&nbsp;&nbsp;</h1>\r\n <h1 class=\"display-1\" *ngIf=\"statusCode\">{{statusCode}}</h1>\r\n <h6 class=\"card-title\" *ngIf=\"!statusText\">&nbsp;&nbsp;&nbsp;</h6>\r\n <h6 class=\"card-title\" style=\"word-wrap:break-word; max-height: 500px; overflow: auto\" *ngIf=\"statusText\">{{statusText}}</h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-left\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
210
+ }
211
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ServerErrorComponent, decorators: [{
212
+ type: Component,
213
+ args: [{ selector: "servererror", encapsulation: ViewEncapsulation.None, imports: [NgIf], template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-6 col-md-6 col-10 offset-xl-3 offset-md-3 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-1\" *ngIf=\"!statusCode\">&nbsp;&nbsp;&nbsp;</h1>\r\n <h1 class=\"display-1\" *ngIf=\"statusCode\">{{statusCode}}</h1>\r\n <h6 class=\"card-title\" *ngIf=\"!statusText\">&nbsp;&nbsp;&nbsp;</h6>\r\n <h6 class=\"card-title\" style=\"word-wrap:break-word; max-height: 500px; overflow: auto\" *ngIf=\"statusText\">{{statusText}}</h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-left\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>" }]
214
+ }], ctorParameters: () => [{ type: i1$1.Router }, { type: i1$1.ActivatedRoute }, { type: i4.AppEmbeddingExtensions }, { type: i1.AppState }, { type: undefined, decorators: [{
215
+ type: Inject,
216
+ args: [ANONYMOUS_MODE]
217
+ }] }] });
218
218
 
219
- // Angular
220
- class AngularErrorComponent {
221
- constructor(router, route, http, bts, emb, ANONYMOUS_MODE) {
222
- this.router = router;
223
- this.route = route;
224
- this.http = http;
225
- this.bts = bts;
226
- this.emb = emb;
227
- this.ANONYMOUS_MODE = ANONYMOUS_MODE;
228
- let identity = this.bts.getJaceIdentity();
229
- this.previousUrl = this.route.snapshot.params["fromUrl"];
230
- let calls = (this.http.LastThreeCompletedCalls[0] || "<empty>") + ", " + (this.http.LastThreeCompletedCalls[1] || "<empty>") + ", " + (this.http.LastThreeCompletedCalls[2] || "<empty>");
231
- this.errorFrom = "From page: " + (this.previousUrl || "<missing>");
232
- this.errorLastCalls = "Last three calls: " + calls;
233
- this.identityInfos = "Logged user: " + (identity?.Idtenant || '??') + "-" + (identity?.DsUser || '???????');
234
- this.errorMessage = this.b64DecodeUnicode(this.route.snapshot.params["errorMessage"]);
235
- console.error(this.errorMessage);
236
- console.log("Modalità anonima: " + this.ANONYMOUS_MODE);
237
- }
238
- ngOnInit() {
239
- var item = localStorage.getItem("Reload");
240
- if (item) {
241
- localStorage.removeItem("Reload");
242
- this.router.navigateByUrl(item);
243
- }
244
- }
245
- b64DecodeUnicode(str) {
246
- // Bytestream -> Encoding % -> Stringa originale
247
- return decodeURIComponent(atob(str).split("").map(c => "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2)).join(""));
248
- }
249
- goPreviousPage() {
250
- // Reload per forzare il ricaricamento del javascript (in modo che lo stato dell'applicazione sia a posto)
251
- // all'onInit la pagina prenderà la root a cui navigare dal localStorage
252
- localStorage.setItem("Reload", this.previousUrl);
253
- location.reload();
254
- }
255
- goDashboard() {
256
- let url = `/pages/dashboard`;
257
- if (this.emb.Embedded)
258
- this.emb.MainWindow.postMessage({ type: "navigate", url }, "*");
259
- else
260
- this.router.navigate([url]);
261
- }
262
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AngularErrorComponent, deps: [{ token: i1$1.Router }, { token: i1$1.ActivatedRoute }, { token: i2$1.HTTPService }, { token: i1.TokenService }, { token: i4.AppEmbeddingExtensions }, { token: ANONYMOUS_MODE }], target: i0.ɵɵFactoryTarget.Component }); }
263
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AngularErrorComponent, isStandalone: true, selector: "angularerror", ngImport: i0, template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-8 col-md-10 col-10 offset-xl-2 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-4\">Qualcosa &egrave; andato storto.</h1>\r\n <h6>\r\n <small>\r\n Si &egrave; verificato un errore interno all'applicazione. Questo non dovrebbe accadere. Prova a ricaricare la pagina precedente e rieffettuare le stesse operazioni, se il problema persiste contatta il service desk allegando una breve descrizione delle operazioni che stavi eseguendo e questo messaggio d'errore:\r\n </small>\r\n </h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"identityInfos\"><em>{{identityInfos}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorFrom\"><em>{{errorFrom}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorLastCalls\"><em>{{errorLastCalls}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorMessage\"><em>{{errorMessage}}</em></h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-right app-margin-right-10\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
264
- }
265
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AngularErrorComponent, decorators: [{
266
- type: Component,
267
- args: [{ selector: "angularerror", encapsulation: ViewEncapsulation.None, standalone: true, imports: [NgIf], template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-8 col-md-10 col-10 offset-xl-2 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-4\">Qualcosa &egrave; andato storto.</h1>\r\n <h6>\r\n <small>\r\n Si &egrave; verificato un errore interno all'applicazione. Questo non dovrebbe accadere. Prova a ricaricare la pagina precedente e rieffettuare le stesse operazioni, se il problema persiste contatta il service desk allegando una breve descrizione delle operazioni che stavi eseguendo e questo messaggio d'errore:\r\n </small>\r\n </h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"identityInfos\"><em>{{identityInfos}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorFrom\"><em>{{errorFrom}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorLastCalls\"><em>{{errorLastCalls}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorMessage\"><em>{{errorMessage}}</em></h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-right app-margin-right-10\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>" }]
268
- }], ctorParameters: function () { return [{ type: i1$1.Router }, { type: i1$1.ActivatedRoute }, { type: i2$1.HTTPService }, { type: i1.TokenService }, { type: i4.AppEmbeddingExtensions }, { type: undefined, decorators: [{
269
- type: Inject,
270
- args: [ANONYMOUS_MODE]
271
- }] }]; } });
219
+ // Angular
220
+ class AngularErrorComponent {
221
+ constructor(router, route, http, bts, emb, ANONYMOUS_MODE) {
222
+ this.router = router;
223
+ this.route = route;
224
+ this.http = http;
225
+ this.bts = bts;
226
+ this.emb = emb;
227
+ this.ANONYMOUS_MODE = ANONYMOUS_MODE;
228
+ let identity = this.bts.getJaceIdentity();
229
+ this.previousUrl = this.route.snapshot.params["fromUrl"];
230
+ let calls = (this.http.LastThreeCompletedCalls[0] || "<empty>") + ", " + (this.http.LastThreeCompletedCalls[1] || "<empty>") + ", " + (this.http.LastThreeCompletedCalls[2] || "<empty>");
231
+ this.errorFrom = "From page: " + (this.previousUrl || "<missing>");
232
+ this.errorLastCalls = "Last three calls: " + calls;
233
+ this.identityInfos = "Logged user: " + (identity?.Idtenant || '??') + "-" + (identity?.DsUser || '???????');
234
+ this.errorMessage = this.b64DecodeUnicode(this.route.snapshot.params["errorMessage"]);
235
+ console.error(this.errorMessage);
236
+ console.log("Modalità anonima: " + this.ANONYMOUS_MODE);
237
+ }
238
+ ngOnInit() {
239
+ var item = localStorage.getItem("Reload");
240
+ if (item) {
241
+ localStorage.removeItem("Reload");
242
+ this.router.navigateByUrl(item);
243
+ }
244
+ }
245
+ b64DecodeUnicode(str) {
246
+ // Bytestream -> Encoding % -> Stringa originale
247
+ return decodeURIComponent(atob(str).split("").map(c => "%" + ("00" + c.charCodeAt(0).toString(16)).slice(-2)).join(""));
248
+ }
249
+ goPreviousPage() {
250
+ // Reload per forzare il ricaricamento del javascript (in modo che lo stato dell'applicazione sia a posto)
251
+ // all'onInit la pagina prenderà la root a cui navigare dal localStorage
252
+ localStorage.setItem("Reload", this.previousUrl);
253
+ location.reload();
254
+ }
255
+ goDashboard() {
256
+ let url = `/pages/dashboard`;
257
+ if (this.emb.Embedded)
258
+ this.emb.MainWindow.postMessage({ type: "navigate", url }, "*");
259
+ else
260
+ this.router.navigate([url]);
261
+ }
262
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AngularErrorComponent, deps: [{ token: i1$1.Router }, { token: i1$1.ActivatedRoute }, { token: i2$1.HTTPService }, { token: i1.TokenService }, { token: i4.AppEmbeddingExtensions }, { token: ANONYMOUS_MODE }], target: i0.ɵɵFactoryTarget.Component }); }
263
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: AngularErrorComponent, isStandalone: true, selector: "angularerror", ngImport: i0, template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-8 col-md-10 col-10 offset-xl-2 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-4\">Qualcosa &egrave; andato storto.</h1>\r\n <h6>\r\n <small>\r\n Si &egrave; verificato un errore interno all'applicazione. Questo non dovrebbe accadere. Prova a ricaricare la pagina precedente e rieffettuare le stesse operazioni, se il problema persiste contatta il service desk allegando una breve descrizione delle operazioni che stavi eseguendo e questo messaggio d'errore:\r\n </small>\r\n </h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"identityInfos\"><em>{{identityInfos}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorFrom\"><em>{{errorFrom}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorLastCalls\"><em>{{errorLastCalls}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorMessage\"><em>{{errorMessage}}</em></h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-right app-margin-right-10\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
264
+ }
265
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: AngularErrorComponent, decorators: [{
266
+ type: Component,
267
+ args: [{ selector: "angularerror", encapsulation: ViewEncapsulation.None, imports: [NgIf], template: "<div class=\"container\">\r\n <div class=\"row\">\r\n <div class=\"col-xl-8 col-md-10 col-10 offset-xl-2 offset-xs-1 p-t-10\">\r\n <div class=\"card\">\r\n <div class=\"card-body text-center\">\r\n <h1 class=\"display-4\">Qualcosa &egrave; andato storto.</h1>\r\n <h6>\r\n <small>\r\n Si &egrave; verificato un errore interno all'applicazione. Questo non dovrebbe accadere. Prova a ricaricare la pagina precedente e rieffettuare le stesse operazioni, se il problema persiste contatta il service desk allegando una breve descrizione delle operazioni che stavi eseguendo e questo messaggio d'errore:\r\n </small>\r\n </h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"identityInfos\"><em>{{identityInfos}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorFrom\"><em>{{errorFrom}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorLastCalls\"><em>{{errorLastCalls}}</em></h6>\r\n <h6 class=\"card-title text-danger app-margin-top-10 text-left\" style=\"word-wrap:break-word\" *ngIf=\"errorMessage\"><em>{{errorMessage}}</em></h6>\r\n <div *ngIf=\"!ANONYMOUS_MODE\">\r\n <button type=\"button\" class=\"btn btn-secondary pull-right\" (click)=\"goDashboard()\">Vai alla Dashboard</button>\r\n <button type=\"button\" class=\"btn btn-secondary pull-right app-margin-right-10\" (click)=\"goPreviousPage()\">Torna alla pagina precedente</button>\r\n <div class=\"clearfix\"></div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>" }]
268
+ }], ctorParameters: () => [{ type: i1$1.Router }, { type: i1$1.ActivatedRoute }, { type: i2$1.HTTPService }, { type: i1.TokenService }, { type: i4.AppEmbeddingExtensions }, { type: undefined, decorators: [{
269
+ type: Inject,
270
+ args: [ANONYMOUS_MODE]
271
+ }] }] });
272
272
 
273
- class SideBarLoc extends LocalizationService {
274
- constructor(injector) {
275
- super(injector);
276
- super.set("it->en", "Sessione Scaduta", ["Expired session"]);
277
- super.set("it->en", "Backend Offline", ["Backend Offline"]);
278
- super.set("it->en", "Sembra che il Backend sia momentaneamente offline. Questa pagina si aggiornera' automaticamente non appena la situazione tornera' alla normalita'. Ci scusiamo per il disagio", ["Backend seems to be currently offline. This page will reset itself when the situation goes back to normal. Sorry for the inconvenience"]);
279
- super.set("it->en", "Ripulisci la Cache", ["Clear Caches"]);
280
- super.set("it->en", "Cache Ripulita", ["Cache Cleared"]);
281
- super.set("it->en", "Ambiente di Produzione", ["Production Environment"]);
282
- super.set("it->en", "È disponibile una nuova versione per l'applicazione corrente. Si suggerisce di ricaricare la pagina (CTRL + F5)", ["A new version is available for this application. It is suggested to reload this page (CTRL + F5)"]);
283
- super.set("it->en", "Le informazioni di Sessione (Tenant/Account) sono cambiate a seguito di un login su modulo diverso utilizzando diverso Tenant/Utente sullo stesso browser. Si suggerisce di ricaricare la pagina (CTRL + F5)", ["Session informations (Tenant/Account) has changed after a login to a different module with the same Tenant/Username using the same browser. It is suggested to reload this page (CTRL + F5)"]);
284
- super.set("it->en", "Cambia Modulo", ["Change module"]);
285
- super.set("it->en", "Cambia Tenant", ["Change tenant"]);
286
- super.set("it->en", "Usa notifiche semplici", ["Use simple alerts"]);
287
- super.set("it->en", "Consenti notifiche eleganti", ["Allow fancy alerts"]);
288
- super.set("it->en", "Ambiente di Sviluppo", ["Development Environment"]);
289
- super.set("it->en", "Ambiente di Sviluppo A", ["Development Environment A"]);
290
- super.set("it->en", "Ambiente di Sviluppo B", ["Development Environment B"]);
291
- super.set("it->en", "Ripulisci le Preferenze Utente", ["Clear User Preferences"]);
292
- super.set("it->en", "Preferenze utente ripulite", ["User preferences has been cleared"]);
293
- super.set("it->en", "Ambiente di Staging", ["Staging Environment"]);
294
- super.set("it->en", "Ambiente di Staging A", ["Staging A Environment"]);
295
- super.set("it->en", "L'attuale sessione di lavoro non è più valida.<br>Si prega di eseguire nuovamente il login.", ["Current session has expired.<br>Please login back into the application."]);
296
- super.set("it->en", "Notifiche", ["Notifications"]);
297
- super.set("it->en", "Job Applicativi", ["Application Jobs"]);
298
- super.set("it->en", "Al momento non c'è nulla in esecuzione", ["Nothing being executed at the moment"]);
299
- super.set("it->en", "Job Completato", ["Job Completed"]);
300
- super.set("it->en", "Scrivere almeno 3 caratteri per utilizzare la ricerca globale", ["You must write at least 3 characters in order to use the Global Research"]);
301
- }
302
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SideBarLoc, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
303
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SideBarLoc }); }
304
- }
305
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SideBarLoc, decorators: [{
306
- type: Injectable
307
- }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
273
+ class SideBarLoc extends LocalizationService {
274
+ constructor(injector) {
275
+ super(injector);
276
+ super.set("it->en", "Sessione Scaduta", ["Expired session"]);
277
+ super.set("it->en", "Backend Offline", ["Backend Offline"]);
278
+ super.set("it->en", "Sembra che il Backend sia momentaneamente offline. Questa pagina si aggiornera' automaticamente non appena la situazione tornera' alla normalita'. Ci scusiamo per il disagio", ["Backend seems to be currently offline. This page will reset itself when the situation goes back to normal. Sorry for the inconvenience"]);
279
+ super.set("it->en", "Ripulisci la Cache", ["Clear Caches"]);
280
+ super.set("it->en", "Cache Ripulita", ["Cache Cleared"]);
281
+ super.set("it->en", "Ambiente di Produzione", ["Production Environment"]);
282
+ super.set("it->en", "È disponibile una nuova versione per l'applicazione corrente. Si suggerisce di ricaricare la pagina (CTRL + F5)", ["A new version is available for this application. It is suggested to reload this page (CTRL + F5)"]);
283
+ super.set("it->en", "Le informazioni di Sessione (Tenant/Account) sono cambiate a seguito di un login su modulo diverso utilizzando diverso Tenant/Utente sullo stesso browser. Si suggerisce di ricaricare la pagina (CTRL + F5)", ["Session informations (Tenant/Account) has changed after a login to a different module with the same Tenant/Username using the same browser. It is suggested to reload this page (CTRL + F5)"]);
284
+ super.set("it->en", "Cambia Modulo", ["Change module"]);
285
+ super.set("it->en", "Cambia Tenant", ["Change tenant"]);
286
+ super.set("it->en", "Usa notifiche semplici", ["Use simple alerts"]);
287
+ super.set("it->en", "Consenti notifiche eleganti", ["Allow fancy alerts"]);
288
+ super.set("it->en", "Ambiente di Sviluppo", ["Development Environment"]);
289
+ super.set("it->en", "Ambiente di Sviluppo A", ["Development Environment A"]);
290
+ super.set("it->en", "Ambiente di Sviluppo B", ["Development Environment B"]);
291
+ super.set("it->en", "Ripulisci le Preferenze Utente", ["Clear User Preferences"]);
292
+ super.set("it->en", "Preferenze utente ripulite", ["User preferences has been cleared"]);
293
+ super.set("it->en", "Ambiente di Staging", ["Staging Environment"]);
294
+ super.set("it->en", "Ambiente di Staging A", ["Staging A Environment"]);
295
+ super.set("it->en", "L'attuale sessione di lavoro non è più valida.<br>Si prega di eseguire nuovamente il login.", ["Current session has expired.<br>Please login back into the application."]);
296
+ super.set("it->en", "Notifiche", ["Notifications"]);
297
+ super.set("it->en", "Job Applicativi", ["Application Jobs"]);
298
+ super.set("it->en", "Al momento non c'è nulla in esecuzione", ["Nothing being executed at the moment"]);
299
+ super.set("it->en", "Job Completato", ["Job Completed"]);
300
+ super.set("it->en", "Scrivere almeno 3 caratteri per utilizzare la ricerca globale", ["You must write at least 3 characters in order to use the Global Research"]);
301
+ }
302
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SideBarLoc, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
303
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SideBarLoc }); }
304
+ }
305
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SideBarLoc, decorators: [{
306
+ type: Injectable
307
+ }], ctorParameters: () => [{ type: i0.Injector }] });
308
308
 
309
- // Angular
310
- class Sidebar {
311
- constructor(lc, lcMenu, cdr, _elementRef, _router, _state, zone, utiExts, aac, menuItemsRaw, menuFilteringService, sr, globalSearchService, profile, msgExts) {
312
- this.lc = lc;
313
- this.cdr = cdr;
314
- this._elementRef = _elementRef;
315
- this._router = _router;
316
- this._state = _state;
317
- this.zone = zone;
318
- this.utiExts = utiExts;
319
- this.aac = aac;
320
- this.menuItemsRaw = menuItemsRaw;
321
- this.menuFilteringService = menuFilteringService;
322
- this.sr = sr;
323
- this.globalSearchService = globalSearchService;
324
- this.profile = profile;
325
- this.msgExts = msgExts;
326
- this.isMenuCollapsed = false;
327
- this.isMenuShouldCollapsed = false;
328
- this.applicationVersion = myconfig.AppData.ComponentVersion;
329
- this.applicationName = myconfig.AppData.ModuleDescription;
330
- this.user = "";
331
- this.tenant = "";
332
- //#endregion
333
- //#region Gestione Ricerca Globale
334
- this.SelectedResult = null;
335
- this.ShowSingleTable = false;
336
- this.searchingTerm = false;
337
- this.lc = this.lc.generateFromType(lcMenu);
338
- this._state.subscribe("menu.isCollapsed", (isCollapsed) => {
339
- this.isMenuCollapsed = isCollapsed;
340
- this.cdr.markForCheck();
341
- });
342
- this._state.subscribe("application.DeployAvailable", (available) => {
343
- if (available)
344
- this.ngOnInit();
345
- });
346
- this._router.events.subscribe(event => {
347
- if (event instanceof NavigationEnd) {
348
- let width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
349
- if (width <= 768)
350
- this._state.notifyDataChanged("menu.isCollapsed", true);
351
- window.scrollTo(0, 0);
352
- }
353
- });
354
- this.getUserProfileData();
355
- }
356
- async ngOnInit() {
357
- let tmpMenuItems = this.getMenuItems();
358
- this.menuItems = await firstValueFrom(this.menuFilteringService.filter(tmpMenuItems));
359
- if (this._shouldMenuCollapse())
360
- this.menuCollapse();
361
- this.updateSidebarHeight();
362
- this._state.setSidebarWidth(this.sidebar.nativeElement.offsetWidth);
363
- this.cdr.markForCheck();
364
- }
365
- getMenuItems() {
366
- let menus = this.utiExts.deepClone(this.menuItemsRaw);
367
- // Giro 1 assegno il livello ai root
368
- for (let i = 0; i < menus.length; i++) {
369
- let t = menus[i];
370
- t.level = 1;
371
- t.padding_left = 18;
372
- t.visible = !t.ac || this.aac.has(t.ac);
373
- // Giro ricorsivo
374
- if (t.subMenu && t.subMenu.length > 0)
375
- this.checkSubMenuOverClaims(t, 1);
376
- }
377
- return menus;
378
- }
379
- checkSubMenuOverClaims(menuItem, level) {
380
- for (let i = 0; i < menuItem.subMenu.length; i++) {
381
- let t = menuItem.subMenu[i];
382
- t.level = level + 1;
383
- t.visible = !t.ac || this.aac.has(t.ac);
384
- t.padding_left = t.level * 18;
385
- if (t.subMenu && t.subMenu.length > 0)
386
- this.checkSubMenuOverClaims(t, level + 1);
387
- }
388
- }
389
- //#region JQuery
390
- onWindowResize() {
391
- var isMenuShouldCollapsed = this._shouldMenuCollapse();
392
- if (this.isMenuShouldCollapsed !== isMenuShouldCollapsed) {
393
- this.menuCollapseStateChange(isMenuShouldCollapsed);
394
- }
395
- this.isMenuShouldCollapsed = isMenuShouldCollapsed;
396
- this.updateSidebarHeight();
397
- }
398
- _shouldMenuCollapse() {
399
- return window.innerWidth <= 768;
400
- }
401
- menuCollapse() {
402
- this.menuCollapseStateChange(true);
403
- this._state.setSidebarWidth(this.sidebar.nativeElement.offsetWidth);
404
- }
405
- menuCollapseStateChange(isCollapsed) {
406
- this.isMenuCollapsed = isCollapsed;
407
- this._state.notifyDataChanged("menu.isCollapsed", this.isMenuCollapsed);
408
- }
409
- menuExpand() {
410
- this.menuCollapseStateChange(false);
411
- this._state.setSidebarWidth(this.sidebar.nativeElement.offsetWidth);
412
- }
413
- hoverItem(jQueryevent) {
414
- if (!this.isMenuCollapsed) {
415
- this.showHoverElem = true;
416
- this.hoverElemHeight = jQueryevent.currentTarget.clientHeight;
417
- this.hoverElemTop = jQueryevent.currentTarget.getBoundingClientRect().top;
418
- jQuery(".sidebar-hover-elem").css("top", this.hoverElemTop + "px");
419
- jQuery(".sidebar-hover-elem").css("height", this.hoverElemHeight + "px");
420
- jQuery(".sidebar-hover-elem").addClass("show-hover-elem");
421
- }
422
- }
423
- sendAwayHoverElement() {
424
- this.hoverElemTop = -200;
425
- jQuery(".sidebar-hover-elem").css("top", this.hoverElemTop + "px");
426
- }
427
- updateSidebarHeight() {
428
- let marginTop = 60 + 40;
429
- let footerHeight = 150;
430
- this.menuHeight = this._elementRef.nativeElement.children[0].clientHeight - marginTop - footerHeight;
431
- }
432
- //Nonostante questa funzione sia collegata con (click.out-zone) per qualche motivo angular le esegue comunque nella sua zone
433
- //generando un po' di irresponsività iniziale... succede solo col click... boh
434
- collapseMenu(jQueryevent, item) {
435
- if (this.isMenuCollapsed)
436
- this.menuExpand();
437
- if (!item.level)
438
- console.warn("Livello non presente in un oggetto del menu!");
439
- //N.B: Tutte le funzioni di JQuery le esguo fuori da Angular dato che c'� una buona probabilit� che siano eventi asincroni
440
- this.zone.runOutsideAngular(() => { this.outsideAngularClickHandler(jQueryevent, item); });
441
- return false;
442
- }
443
- outsideAngularClickHandler(jQueryevent, item) {
444
- let levelClass = item.level ? "level-" + (item.level) : "";
445
- let levelClassPlusOne = item.level ? "level-" + (item.level + 1) : "";
446
- let slidePeriod = 400;
447
- var link = jQuery(jQueryevent.currentTarget);
448
- //Se l'elemento non è espanso
449
- if (!link.closest(".sidebar-item-expanded" + "_" + levelClass).length) {
450
- //Tiro su tutti gli elementi dello stesso livello espansi e li chiudo
451
- //Se ho compresso un menu vado a vedere se c'è anche un altro menu di livello pi� basso da richiudere
452
- jQuery("ul.nav-sidebar li" + "." + (levelClassPlusOne)).each(function () {
453
- let closestLi = jQuery(this).closest("li");
454
- if (closestLi.children("ul").length && closestLi.hasClass("sidebar-item-expanded")) {
455
- closestLi.children("ul").slideUp(slidePeriod);
456
- //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
457
- closestLi.removeClass("sidebar-item-expanded" + "_" + (levelClassPlusOne));
458
- closestLi.removeClass("sidebar-item-expanded");
459
- }
460
- });
461
- //Dopodich� richiudo tutti quelli del mio livello attuale
462
- jQuery("ul.nav-sidebar li" + "." + levelClass).each(function () {
463
- let closestLi = jQuery(this).closest("li");
464
- if (closestLi.children("ul").length && closestLi.hasClass("sidebar-item-expanded")) {
465
- closestLi.children("ul").slideUp(slidePeriod);
466
- //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
467
- closestLi.removeClass("sidebar-item-expanded" + "_" + levelClass);
468
- closestLi.removeClass("sidebar-item-expanded");
469
- }
470
- });
471
- //Dopodich� espando quello attuale
472
- link.next().slideDown(slidePeriod);
473
- if (item.subMenu) {
474
- //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
475
- link.closest("li").addClass("sidebar-item-expanded" + "_" + levelClass);
476
- link.closest("li").addClass("sidebar-item-expanded");
477
- }
478
- }
479
- else {
480
- //Altrimenti, se l'elemento è già espanso lo chiudo
481
- if (item.subMenu) {
482
- //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
483
- link.closest("li").removeClass("sidebar-item-expanded" + "_" + levelClass);
484
- link.closest("li").removeClass("sidebar-item-expanded");
485
- }
486
- link.next().slideUp(slidePeriod);
487
- }
488
- }
489
- //#endregion
490
- //#region Footer
491
- onChangeTenant() {
492
- window.location.href = `${myconfig.AuthUrl}/#/login;client=${myconfig.Client}`;
493
- }
494
- onLogout() {
495
- window.location.href = `${myconfig.AuthUrl}/#/logout;client=${myconfig.Client}`;
496
- }
497
- async getUserProfileData() {
498
- var identity = this.sr.getJaceIdentity();
499
- if (identity) {
500
- this.user = identity.FullName;
501
- this.tenant = identity.TenantName;
502
- await this.profile.doReloadProfilePicture();
503
- this.cdr.markForCheck();
504
- }
505
- }
506
- onSearchRequest() {
507
- this.searchingTerm = true;
508
- this.searchResult = null;
509
- if (!this.globalSearchService.Enabled)
510
- return;
511
- if (this.searchTerm.trim().length < 3) {
512
- this.msgExts.simpleWarning(this.lc.loc("Scrivere almeno 3 caratteri per utilizzare la ricerca globale"));
513
- return;
514
- }
515
- this.globalSearchService.search(this.searchTerm).subscribe(t => {
516
- this.searchingTerm = false;
517
- this.searchResult = t;
518
- // Short-circuit in assenza di risultati
519
- if ((this.searchResult.results.length || 0) === 0) {
520
- this.cdr.markForCheck();
521
- return;
522
- }
523
- this.searchResult.results.forEach(t => {
524
- t.est_cols = t.columns.map(c => {
525
- let colLink = this.globalSearchService.generateColumnLink(c);
526
- return new EsTableColumnsDefinition(c.description, c.id, colLink?.routePath, colLink?.routeProperties);
527
- });
528
- this.cdr.markForCheck();
529
- });
530
- });
531
- }
532
- onSearchModelChanged() {
533
- if (!this.searchingTerm)
534
- this.closeSearch();
535
- }
536
- closeSearch() {
537
- this.searchingTerm = false;
538
- this.searchResult = null;
539
- this.cdr.markForCheck();
540
- }
541
- FilterSearchResults(item = null) {
542
- this.SelectedResult = null;
543
- this.ShowSingleTable = true;
544
- requestAnimationFrame(() => {
545
- if (item)
546
- this.SelectedResult = this.searchResult?.results?.find(f => f.description == item.description);
547
- else
548
- this.ShowSingleTable = false;
549
- this.cdr.markForCheck();
550
- });
551
- }
552
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Sidebar, deps: [{ token: i1$2.LocalizationService }, { token: MENU_LOCALIZATION, optional: true }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1$1.Router }, { token: i1.AppState }, { token: i0.NgZone }, { token: i4.UtilityService }, { token: i5.AccessControlService }, { token: MENU }, { token: i1.MenuFilteringService }, { token: i1.TokenService }, { token: i1.GlobalSearchService }, { token: i1.UserPreferencesService }, { token: i4.MessageService }], target: i0.ɵɵFactoryTarget.Component }); }
553
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: Sidebar, isStandalone: true, selector: "sidebar", host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "sidebar", first: true, predicate: ["sidebar"], descendants: true, static: true }], ngImport: i0, template: "<div #sidebar class=\"app-sidebar\" [class.menu-collapsed]=\"isMenuCollapsed\" (mouseleave.out-zone)=\"sendAwayHoverElement();\">\r\n <!--Jace Logo-->\r\n <div class=\"app-logo-container\">\r\n <div class=\"app-pointer\" [routerLink]=\"['/pages/dashboard']\" style=\"margin-bottom: 10px; overflow: hidden\">\r\n <ng-container *ngIf=\"!isMenuCollapsed\">\r\n <img class=\"app-logo-img\" src=\"assets/img/logo/headlogo_small.png\" alt=\"\">\r\n <div class=\"app-logo-font-container\">\r\n <span class=\"app-logo-font\">{{applicationName}}</span>\r\n </div>\r\n </ng-container>\r\n \r\n <img *ngIf=\"isMenuCollapsed\" class=\"app-logo-img-sm\" src=\"assets/img/logo/headlogo_small.png\" alt=\"\">\r\n </div>\r\n </div>\r\n <!--Ricerca globale-->\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-search\">\r\n <form novalidate role=\"search\" class=\"app-search\" (ngSubmit)=\"onSearchRequest()\">\r\n <input type=\"text\" placeholder=\"Ricerca...\" [(ngModel)]=\"searchTerm\" (ngModelChange)=\"onSearchModelChanged()\" name=\"search\" class=\"form-control\" autocomplete=\"off\">\r\n <a><i class=\"far fa-magnifying-glass\"></i></a>\r\n </form>\r\n </div>\r\n <!--Barra laterale con tutte le voci di Menu-->\r\n <ul class=\"nav nav-sidebar flex-column flex-nowrap\" style=\"position: relative; zoom: 1\" slim-scroll [slimScrollOptions]=\"{height: menuHeight + (isMenuCollapsed ? 55 : 0)}\">\r\n <ng-container *ngFor=\"let item of menuItems; let last = last;\">\r\n <li *ngIf=\"item.visible\" class=\"sidebar-list-item level-{{item.level}}\" \r\n [style.margin-bottom]=\"last ? '42px' : '0px'\"\r\n [class.has-sub-menu]=\"item.subMenu\" \r\n [class.sidebar-item-expanded]=\"item.expanded\"\r\n [class.sidebar-item-wip]=\"item.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : { $implicit: item }\"></ng-container>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <!--Selettore Barra dei Menu-->\r\n <div class=\"sidebar-hover-elem\"></div>\r\n <!--Footer *ngIf=\"!isMenuCollapsed\"-->\r\n <div class=\"app-sidebar-footer\">\r\n <!--Minuscolo fade tra sidebar e inizio footer-->\r\n <div class=\"app-sidebar-footer-fade\"></div>\r\n <div [style.padding.px]=\"isMenuCollapsed ? 5 : 15\">\r\n <!--Informazioni utente collegato-->\r\n <div class=\"app-sidebar-footer-user-container\">\r\n <!--Mentre sto ancora caricando la ProfilePic mi assicuro di mostrare un placeholder-->\r\n <div *ngIf=\"!profile.ProfilePicture\" class=\"app-sidebar-footer-user-img-placeholder\">\r\n <i class=\"far fa-2x fa-spinner fa-spin-pulse\" style=\"color: black; margin-top: 5px;\"></i>\r\n </div>\r\n <!--Una volta caricata la ProfilePic nascondo il placeholder e la mostro-->\r\n <ng-container *ngIf=\"profile.ProfilePicture\">\r\n <img [src]=\"profile.ProfilePicture\" alt=\"\" class=\"app-sidebar-footer-user-img app-pointer\" [routerLink]=\"['/pages/profile']\">\r\n <div class=\"app-sidebar-footer-user-status\"></div>\r\n </ng-container>\r\n <!--Username animato quando supera i 15 caratteri-->\r\n <div class=\"app-sidebar-footer-user-name-container\">\r\n <div class=\"username-text\" [class.username-text-animator]=\"user?.length > 15\">{{user}}</div>\r\n <div class=\"tenantname-text\">{{tenant}}</div>\r\n </div>\r\n </div>\r\n <!--Operazioni rapide (Logout, Cambia tenant, Guida, Supporto,...)-->\r\n <div class=\"app-sidebar-footer-quick-ops\" [style.display]=\"isMenuCollapsed ? 'inline' : 'flex'\">\r\n <div (click)=\"onChangeTenant();\" class=\"app-sidebar-footer-op app-no-selection\" [style.margin-top.px]=\"isMenuCollapsed ? 10 : 0\"><i class=\"far fa-right-left\"></i><span *ngIf=\"!isMenuCollapsed\">&nbsp;Cambia Tenant</span></div>\r\n <div (click)=\"onLogout();\" class=\"app-sidebar-footer-op app-no-selection\" [style.margin-top.px]=\"isMenuCollapsed ? 10 : 0\"><i class=\"far fa-right-from-bracket\"></i><span *ngIf=\"!isMenuCollapsed\">&nbsp;Logout</span></div>\r\n </div>\r\n <!--Versione corrente applicazione-->\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-footer-ver\">\r\n v{{applicationVersion}}\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #menuItem let-item>\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"(!item.routerLink && !item.subMenu) || item.wip\" [href]=\"item.link || '#'\" (click)=\"item.wip && $event.preventDefault()\" target=\"_blank\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"item.routerLink && !item.subMenu && !item.wip\" class=\"sidebar-list-link {{item.cssClass || ''}}\" [routerLink]=\"[item.routerLink]\" [queryParams]=\"item.queryParams\" routerLinkActive=\"active-link\" (click.out-zone)=\"collapseMenu($event, item)\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"item.subMenu && !item.wip\" (click.out-zone)=\"collapseMenu($event, item)\" [attr.href]=\"''\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n <b class=\"fa fa-angle-down\"></b>\r\n </a>\r\n\r\n <ul *ngIf=\"item.subMenu\" class=\"sidebar-sublist\">\r\n <ng-container *ngFor=\"let subitem of item.subMenu\" >\r\n <li *ngIf=\"subitem.visible\" class=\"sidebar-sublist-item level-{{item.level}}\" [class.sidebar-item-wip]=\"subitem.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : {$implicit: subitem}\"></ng-container>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n</ng-template>\r\n\r\n<!-- Overlay per la ricerca globale -->\r\n<ng-container *ngIf=\"searchingTerm || searchResult\">\r\n <div class=\"app-absolute app-search-background\">\r\n <div class=\"app-search-result-box\">\r\n <ng-container *ngIf=\"searchingTerm\">\r\n <div class=\"app-search-card\"><i class=\"fa fa-spinner fa-spin\"></i>Sto effettuando la ricerca...</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"searchResult && !searchingTerm\">\r\n <div class=\"row\" style=\"height: 100%;\">\r\n <!-- Spazio a sinistra -->\r\n <div class=\"col-md-1\"></div>\r\n <!-- Blocco con le categorie dei risultati -->\r\n <div class=\"col-md-3\">\r\n <div class=\"app-search-card\">\r\n <div class=\"app-relative\"><a class=\"fa fa-times text-danger app-absolute app-right-0 app-fs-20 app-pointer\" (click)=\"closeSearch();\"></a></div>\r\n <h4>Categorie di Ricerca</h4>\r\n <div class=\"app-pointer app-link\" [class.app-bold]=\"!SelectedResult && !ShowSingleTable\">\r\n <span (click)=\"FilterSearchResults()\">{{SelectedResult ? '-' : '>'}} Mostra Tutto</span>\r\n </div>\r\n <div *ngFor=\"let item of searchResult.results\" class=\"app-pointer app-link\" [class.app-bold]=\"SelectedResult?.description == item.description\">\r\n <span (click)=\"FilterSearchResults(item)\">{{SelectedResult?.description == item.description ? '>' : '-'}} Mostra {{item.description}} ({{item.items?.length}})</span>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Dettaglio risultati -->\r\n <div class=\"col-md-7\" style=\"overflow: auto; height: 100%;\">\r\n <ng-container *ngIf=\"!SelectedResult && !ShowSingleTable\">\r\n <div *ngFor=\"let res of searchResult.results; let i = index;\" class=\"app-search-card\" [style.margin-bottom.px]=\"i == (searchResult.results?.length - 1) ? 2 : 10\">\r\n <h4>{{res.description}}</h4>\r\n <es-table [(ngModel)]=\"res.items\" [DynamicRowColumnsDefinition]=\"res.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"SelectedResult && ShowSingleTable\">\r\n <div class=\"app-search-card\">\r\n <h4>{{SelectedResult.description}}</h4>\r\n <es-table [(ngModel)]=\"SelectedResult.items\" [DynamicRowColumnsDefinition]=\"SelectedResult.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- Spazio a destra -->\r\n <div class=\"col-md-1\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-container>", styles: [".app-sidebar{background:#344154;box-shadow:8px 0 6px -6px #1313130a,12px 0 16px -16px #1313130d;height:100%;min-height:100%;width:230px;overflow:hidden;display:block;z-index:9}.app-sidebar.menu-collapsed{width:50px}.app-sidebar.menu-collapsed a.sidebar-list-link b{display:none}.app-sidebar.menu-collapsed .sidebar-sublist{position:absolute;top:-1px;left:52px;width:0;display:block;overflow:hidden}.sidebar-list-item{display:block;position:relative;float:none;padding:0;border-bottom:1px solid #485974}.sidebar-item-wip{cursor:default}a.sidebar-list-link{display:block;height:42px;padding-top:0!important;text-shadow:none;font-size:13px;letter-spacing:.02em;text-decoration:none;color:#fff;line-height:42px;white-space:nowrap;overflow:hidden;cursor:pointer;transition:all .2s ease}a.sidebar-list-link i{margin-right:16px;width:16px;display:inline-block}a.sidebar-list-link b{display:block;opacity:1;width:14px;height:14px;line-height:14px;text-shadow:none;font-size:18px;position:absolute;right:10px;top:14px;padding:0;text-align:center;transition:transform .2s linear}a.sidebar-list-link:hover{background-color:#2a3544}.sidebar-list-item.sidebar-item-expanded>.sidebar-list-link b,.sidebar-sublist-item.sidebar-item-expanded>.sidebar-list-link b{transform:rotate(180deg)}.sidebar-sublist{display:none;padding:0;list-style:none;position:relative;background-color:#3e4d64}.sidebar-sublist .level-1{background-color:#364357}.sidebar-sublist .level-2{background-color:#2e3a4b}.sidebar-sublist li{display:block;float:none;padding:0;border-bottom:none;position:relative;border-top:1px solid #485974}.sidebar-sublist li a{display:block;text-shadow:none;font-size:13px;text-decoration:none;height:42px;line-height:42px}.sidebar-sublist li a:before{font-family:\"Font Awesome 6 Pro\";content:\"\\f1db\";margin-right:10px;font-size:10px}.sidebar-sublist li a:hover{background-color:#2a3544}.sidebar-item-expanded>ul.sidebar-sublist{display:block;background-color:#3e4d64}.subitem-submenu-link .fa{top:14px}.sidebar-hover-elem{width:4px;background-color:#024a88;position:absolute;top:-90px;left:226px;transition:all .2s ease;transition-property:top,height;height:36px;display:block}.sidebar.menu-collapsed .sidebar-hover-elem{left:46px}.active-link{background-color:#677ea1!important}@media (max-width: 544px){.sidebar.menu-collapsed{width:0}.sidebar-hover-elem,.sidebar-select-elem{display:none}}.app-logo-container{height:60px;background-color:#2a3544;display:flex;position:relative;z-index:10;margin-bottom:-1px;border-bottom:1px solid #485974;color:#fff;padding:10px 0 0 15px}.app-sidebar-search{height:39px;border-bottom:42px solid #344154}.app-logo-placeholder{text-align:center;font-size:1.2rem;text-transform:uppercase;font-weight:700;margin-top:15px!important}.app-logo-font{color:#fffac2;font-family:Work Sans;font-size:15px;line-height:1;text-transform:uppercase;font-weight:700;padding-left:5px;padding-bottom:2px;overflow:hidden}.app-logo-font-container{display:inline-block;vertical-align:bottom;width:calc(var(--sidebar-width) - 70px);margin:0;height:auto;overflow:hidden}.app-logo-img-sm{padding-top:10px}.app-sidebar-footer{position:relative;background-color:#344154}.app-sidebar-footer-fade{top:-42px;position:absolute;background-image:linear-gradient(to top,#344154,#34415400);height:42px;width:230px;z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.app-sidebar-footer-user-container{position:relative;display:flex;margin-top:5px;color:#fff}.app-sidebar-footer-user-img-placeholder{height:40px;min-width:40px;width:40px;text-align:center}.app-sidebar-footer-user-img{height:40px;min-height:40px;min-width:40px;width:40px;border-radius:50%;border:1px solid #485974}.app-sidebar-footer-user-status{background-color:#32cd32;border:1px solid green;border-radius:50%;position:absolute;left:29px;top:29px;height:11px;width:11px}.app-sidebar-footer-user-name-container{width:150px;white-space:nowrap;overflow:hidden;margin-left:10px}.username-text{z-index:1;min-width:140px;display:flex;font-size:16px}.username-text-animator:hover{transform:translate(100%);animation:my-animation 3s linear infinite}@keyframes my-animation{0%{transform:translate(0)}to{transform:translate(-50%)}}.tenantname-text{font-size:12px}.app-sidebar-footer-quick-ops{margin-top:10px;display:flex;justify-content:space-between}.app-sidebar-footer-op{color:#fff;font-weight:700;cursor:pointer}.app-sidebar-footer-ver{text-align:right;margin-top:30px;color:#fff}.app-search{position:relative}.app-search a{position:absolute;top:8px;right:14px;font-size:16px;color:#fff!important}.app-search .form-control{font-size:12px;letter-spacing:.03em;height:40px;color:#fff;padding:7px 40px 7px 20px;background:#3e4d64;box-shadow:none!important;border-top:none!important;border-left:none!important;border-right:none!important;border-bottom:1px solid #485974}.app-sidebar.menu-collapsed .app-sidebar-footer-op{display:block;padding-left:12px;padding-top:5px;margin:0;width:16px}\n"], dependencies: [{ kind: "directive", type: SlimScroll, selector: "[slim-scroll]", inputs: ["slimScrollOptions"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: EsTableModule }, { kind: "component", type: i7.EsTableComponent, selector: "es-table", inputs: ["EsThTdProvider", "CornerMenuOptions", "ColumnsResizable", "ColumnsPinnable", "AutoUpdate", "Height", "EmptySpaceBackgroundColor", "EsTableHandledSearch", "MaxHeight", "ContainerClass", "XLSXExport", "CSVExport", "AllSearch", "HighCellDensity", "Selection", "ShowLoadingOnBootstrap", "Removal", "RemovalCondition", "Export", "ShiftClick", "CountLabel", "HidePaging", "HidePagingCount", "HidePagingButtons", "ContextMenu", "ExportFileName", "TableClass", "ExportFunction", "ExportOnlyVisibleColumns", "HasHeaderGroup", "HasSecondaryHeaderGroup", "HeaderHidden", "BodyHidden", "SelectionDisabled", "SingleSelection", "RowClassAssigner", "OrderByColumn", "MultipleOrderingDirectives", "HiddenColumns", "ColumnsOrdering", "SearchView", "SelectAll", "UseArrayModePaging", "DynamicRowColumnsDefinition", "DynamicOperations", "Hierarchy", "ParentKey", "OwnKey", "StartsExpanded", "SavePreferences", "DefaultAlignment", "PagingStyle", "RowGroupingPagingStyle", "ItemSourceProperty", "UseSelectionCache", "ShowItemGroupsColumns", "Editable", "RangeSelection", "SearchThrottle", "ArraymodeItemsPerPage"], outputs: ["onOrderChanged", "onSearchRequest", "onSelectionChanged", "onRemoval", "onAbortRemoval", "onModelChange", "onOpenContextMenu", "onCornerAction", "onDynamicOperation"] }, { kind: "ngmodule", type: LocalizationModule }, { kind: "pipe", type: i1$2.LocalizePipe, name: "localize" }], viewProviders: [{ provide: LocalizationService, useClass: SideBarLoc }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
554
- }
555
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Sidebar, decorators: [{
556
- type: Component,
557
- args: [{ selector: "sidebar", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [{ provide: LocalizationService, useClass: SideBarLoc }], standalone: true, imports: [NgClass, SlimScroll, NgFor, NgTemplateOutlet, NgIf, RouterLinkActive, RouterLink, FormsModule, EsTableModule, LocalizationModule], template: "<div #sidebar class=\"app-sidebar\" [class.menu-collapsed]=\"isMenuCollapsed\" (mouseleave.out-zone)=\"sendAwayHoverElement();\">\r\n <!--Jace Logo-->\r\n <div class=\"app-logo-container\">\r\n <div class=\"app-pointer\" [routerLink]=\"['/pages/dashboard']\" style=\"margin-bottom: 10px; overflow: hidden\">\r\n <ng-container *ngIf=\"!isMenuCollapsed\">\r\n <img class=\"app-logo-img\" src=\"assets/img/logo/headlogo_small.png\" alt=\"\">\r\n <div class=\"app-logo-font-container\">\r\n <span class=\"app-logo-font\">{{applicationName}}</span>\r\n </div>\r\n </ng-container>\r\n \r\n <img *ngIf=\"isMenuCollapsed\" class=\"app-logo-img-sm\" src=\"assets/img/logo/headlogo_small.png\" alt=\"\">\r\n </div>\r\n </div>\r\n <!--Ricerca globale-->\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-search\">\r\n <form novalidate role=\"search\" class=\"app-search\" (ngSubmit)=\"onSearchRequest()\">\r\n <input type=\"text\" placeholder=\"Ricerca...\" [(ngModel)]=\"searchTerm\" (ngModelChange)=\"onSearchModelChanged()\" name=\"search\" class=\"form-control\" autocomplete=\"off\">\r\n <a><i class=\"far fa-magnifying-glass\"></i></a>\r\n </form>\r\n </div>\r\n <!--Barra laterale con tutte le voci di Menu-->\r\n <ul class=\"nav nav-sidebar flex-column flex-nowrap\" style=\"position: relative; zoom: 1\" slim-scroll [slimScrollOptions]=\"{height: menuHeight + (isMenuCollapsed ? 55 : 0)}\">\r\n <ng-container *ngFor=\"let item of menuItems; let last = last;\">\r\n <li *ngIf=\"item.visible\" class=\"sidebar-list-item level-{{item.level}}\" \r\n [style.margin-bottom]=\"last ? '42px' : '0px'\"\r\n [class.has-sub-menu]=\"item.subMenu\" \r\n [class.sidebar-item-expanded]=\"item.expanded\"\r\n [class.sidebar-item-wip]=\"item.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : { $implicit: item }\"></ng-container>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <!--Selettore Barra dei Menu-->\r\n <div class=\"sidebar-hover-elem\"></div>\r\n <!--Footer *ngIf=\"!isMenuCollapsed\"-->\r\n <div class=\"app-sidebar-footer\">\r\n <!--Minuscolo fade tra sidebar e inizio footer-->\r\n <div class=\"app-sidebar-footer-fade\"></div>\r\n <div [style.padding.px]=\"isMenuCollapsed ? 5 : 15\">\r\n <!--Informazioni utente collegato-->\r\n <div class=\"app-sidebar-footer-user-container\">\r\n <!--Mentre sto ancora caricando la ProfilePic mi assicuro di mostrare un placeholder-->\r\n <div *ngIf=\"!profile.ProfilePicture\" class=\"app-sidebar-footer-user-img-placeholder\">\r\n <i class=\"far fa-2x fa-spinner fa-spin-pulse\" style=\"color: black; margin-top: 5px;\"></i>\r\n </div>\r\n <!--Una volta caricata la ProfilePic nascondo il placeholder e la mostro-->\r\n <ng-container *ngIf=\"profile.ProfilePicture\">\r\n <img [src]=\"profile.ProfilePicture\" alt=\"\" class=\"app-sidebar-footer-user-img app-pointer\" [routerLink]=\"['/pages/profile']\">\r\n <div class=\"app-sidebar-footer-user-status\"></div>\r\n </ng-container>\r\n <!--Username animato quando supera i 15 caratteri-->\r\n <div class=\"app-sidebar-footer-user-name-container\">\r\n <div class=\"username-text\" [class.username-text-animator]=\"user?.length > 15\">{{user}}</div>\r\n <div class=\"tenantname-text\">{{tenant}}</div>\r\n </div>\r\n </div>\r\n <!--Operazioni rapide (Logout, Cambia tenant, Guida, Supporto,...)-->\r\n <div class=\"app-sidebar-footer-quick-ops\" [style.display]=\"isMenuCollapsed ? 'inline' : 'flex'\">\r\n <div (click)=\"onChangeTenant();\" class=\"app-sidebar-footer-op app-no-selection\" [style.margin-top.px]=\"isMenuCollapsed ? 10 : 0\"><i class=\"far fa-right-left\"></i><span *ngIf=\"!isMenuCollapsed\">&nbsp;Cambia Tenant</span></div>\r\n <div (click)=\"onLogout();\" class=\"app-sidebar-footer-op app-no-selection\" [style.margin-top.px]=\"isMenuCollapsed ? 10 : 0\"><i class=\"far fa-right-from-bracket\"></i><span *ngIf=\"!isMenuCollapsed\">&nbsp;Logout</span></div>\r\n </div>\r\n <!--Versione corrente applicazione-->\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-footer-ver\">\r\n v{{applicationVersion}}\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #menuItem let-item>\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"(!item.routerLink && !item.subMenu) || item.wip\" [href]=\"item.link || '#'\" (click)=\"item.wip && $event.preventDefault()\" target=\"_blank\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"item.routerLink && !item.subMenu && !item.wip\" class=\"sidebar-list-link {{item.cssClass || ''}}\" [routerLink]=\"[item.routerLink]\" [queryParams]=\"item.queryParams\" routerLinkActive=\"active-link\" (click.out-zone)=\"collapseMenu($event, item)\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"item.subMenu && !item.wip\" (click.out-zone)=\"collapseMenu($event, item)\" [attr.href]=\"''\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n <b class=\"fa fa-angle-down\"></b>\r\n </a>\r\n\r\n <ul *ngIf=\"item.subMenu\" class=\"sidebar-sublist\">\r\n <ng-container *ngFor=\"let subitem of item.subMenu\" >\r\n <li *ngIf=\"subitem.visible\" class=\"sidebar-sublist-item level-{{item.level}}\" [class.sidebar-item-wip]=\"subitem.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : {$implicit: subitem}\"></ng-container>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n</ng-template>\r\n\r\n<!-- Overlay per la ricerca globale -->\r\n<ng-container *ngIf=\"searchingTerm || searchResult\">\r\n <div class=\"app-absolute app-search-background\">\r\n <div class=\"app-search-result-box\">\r\n <ng-container *ngIf=\"searchingTerm\">\r\n <div class=\"app-search-card\"><i class=\"fa fa-spinner fa-spin\"></i>Sto effettuando la ricerca...</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"searchResult && !searchingTerm\">\r\n <div class=\"row\" style=\"height: 100%;\">\r\n <!-- Spazio a sinistra -->\r\n <div class=\"col-md-1\"></div>\r\n <!-- Blocco con le categorie dei risultati -->\r\n <div class=\"col-md-3\">\r\n <div class=\"app-search-card\">\r\n <div class=\"app-relative\"><a class=\"fa fa-times text-danger app-absolute app-right-0 app-fs-20 app-pointer\" (click)=\"closeSearch();\"></a></div>\r\n <h4>Categorie di Ricerca</h4>\r\n <div class=\"app-pointer app-link\" [class.app-bold]=\"!SelectedResult && !ShowSingleTable\">\r\n <span (click)=\"FilterSearchResults()\">{{SelectedResult ? '-' : '>'}} Mostra Tutto</span>\r\n </div>\r\n <div *ngFor=\"let item of searchResult.results\" class=\"app-pointer app-link\" [class.app-bold]=\"SelectedResult?.description == item.description\">\r\n <span (click)=\"FilterSearchResults(item)\">{{SelectedResult?.description == item.description ? '>' : '-'}} Mostra {{item.description}} ({{item.items?.length}})</span>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Dettaglio risultati -->\r\n <div class=\"col-md-7\" style=\"overflow: auto; height: 100%;\">\r\n <ng-container *ngIf=\"!SelectedResult && !ShowSingleTable\">\r\n <div *ngFor=\"let res of searchResult.results; let i = index;\" class=\"app-search-card\" [style.margin-bottom.px]=\"i == (searchResult.results?.length - 1) ? 2 : 10\">\r\n <h4>{{res.description}}</h4>\r\n <es-table [(ngModel)]=\"res.items\" [DynamicRowColumnsDefinition]=\"res.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"SelectedResult && ShowSingleTable\">\r\n <div class=\"app-search-card\">\r\n <h4>{{SelectedResult.description}}</h4>\r\n <es-table [(ngModel)]=\"SelectedResult.items\" [DynamicRowColumnsDefinition]=\"SelectedResult.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- Spazio a destra -->\r\n <div class=\"col-md-1\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-container>", styles: [".app-sidebar{background:#344154;box-shadow:8px 0 6px -6px #1313130a,12px 0 16px -16px #1313130d;height:100%;min-height:100%;width:230px;overflow:hidden;display:block;z-index:9}.app-sidebar.menu-collapsed{width:50px}.app-sidebar.menu-collapsed a.sidebar-list-link b{display:none}.app-sidebar.menu-collapsed .sidebar-sublist{position:absolute;top:-1px;left:52px;width:0;display:block;overflow:hidden}.sidebar-list-item{display:block;position:relative;float:none;padding:0;border-bottom:1px solid #485974}.sidebar-item-wip{cursor:default}a.sidebar-list-link{display:block;height:42px;padding-top:0!important;text-shadow:none;font-size:13px;letter-spacing:.02em;text-decoration:none;color:#fff;line-height:42px;white-space:nowrap;overflow:hidden;cursor:pointer;transition:all .2s ease}a.sidebar-list-link i{margin-right:16px;width:16px;display:inline-block}a.sidebar-list-link b{display:block;opacity:1;width:14px;height:14px;line-height:14px;text-shadow:none;font-size:18px;position:absolute;right:10px;top:14px;padding:0;text-align:center;transition:transform .2s linear}a.sidebar-list-link:hover{background-color:#2a3544}.sidebar-list-item.sidebar-item-expanded>.sidebar-list-link b,.sidebar-sublist-item.sidebar-item-expanded>.sidebar-list-link b{transform:rotate(180deg)}.sidebar-sublist{display:none;padding:0;list-style:none;position:relative;background-color:#3e4d64}.sidebar-sublist .level-1{background-color:#364357}.sidebar-sublist .level-2{background-color:#2e3a4b}.sidebar-sublist li{display:block;float:none;padding:0;border-bottom:none;position:relative;border-top:1px solid #485974}.sidebar-sublist li a{display:block;text-shadow:none;font-size:13px;text-decoration:none;height:42px;line-height:42px}.sidebar-sublist li a:before{font-family:\"Font Awesome 6 Pro\";content:\"\\f1db\";margin-right:10px;font-size:10px}.sidebar-sublist li a:hover{background-color:#2a3544}.sidebar-item-expanded>ul.sidebar-sublist{display:block;background-color:#3e4d64}.subitem-submenu-link .fa{top:14px}.sidebar-hover-elem{width:4px;background-color:#024a88;position:absolute;top:-90px;left:226px;transition:all .2s ease;transition-property:top,height;height:36px;display:block}.sidebar.menu-collapsed .sidebar-hover-elem{left:46px}.active-link{background-color:#677ea1!important}@media (max-width: 544px){.sidebar.menu-collapsed{width:0}.sidebar-hover-elem,.sidebar-select-elem{display:none}}.app-logo-container{height:60px;background-color:#2a3544;display:flex;position:relative;z-index:10;margin-bottom:-1px;border-bottom:1px solid #485974;color:#fff;padding:10px 0 0 15px}.app-sidebar-search{height:39px;border-bottom:42px solid #344154}.app-logo-placeholder{text-align:center;font-size:1.2rem;text-transform:uppercase;font-weight:700;margin-top:15px!important}.app-logo-font{color:#fffac2;font-family:Work Sans;font-size:15px;line-height:1;text-transform:uppercase;font-weight:700;padding-left:5px;padding-bottom:2px;overflow:hidden}.app-logo-font-container{display:inline-block;vertical-align:bottom;width:calc(var(--sidebar-width) - 70px);margin:0;height:auto;overflow:hidden}.app-logo-img-sm{padding-top:10px}.app-sidebar-footer{position:relative;background-color:#344154}.app-sidebar-footer-fade{top:-42px;position:absolute;background-image:linear-gradient(to top,#344154,#34415400);height:42px;width:230px;z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.app-sidebar-footer-user-container{position:relative;display:flex;margin-top:5px;color:#fff}.app-sidebar-footer-user-img-placeholder{height:40px;min-width:40px;width:40px;text-align:center}.app-sidebar-footer-user-img{height:40px;min-height:40px;min-width:40px;width:40px;border-radius:50%;border:1px solid #485974}.app-sidebar-footer-user-status{background-color:#32cd32;border:1px solid green;border-radius:50%;position:absolute;left:29px;top:29px;height:11px;width:11px}.app-sidebar-footer-user-name-container{width:150px;white-space:nowrap;overflow:hidden;margin-left:10px}.username-text{z-index:1;min-width:140px;display:flex;font-size:16px}.username-text-animator:hover{transform:translate(100%);animation:my-animation 3s linear infinite}@keyframes my-animation{0%{transform:translate(0)}to{transform:translate(-50%)}}.tenantname-text{font-size:12px}.app-sidebar-footer-quick-ops{margin-top:10px;display:flex;justify-content:space-between}.app-sidebar-footer-op{color:#fff;font-weight:700;cursor:pointer}.app-sidebar-footer-ver{text-align:right;margin-top:30px;color:#fff}.app-search{position:relative}.app-search a{position:absolute;top:8px;right:14px;font-size:16px;color:#fff!important}.app-search .form-control{font-size:12px;letter-spacing:.03em;height:40px;color:#fff;padding:7px 40px 7px 20px;background:#3e4d64;box-shadow:none!important;border-top:none!important;border-left:none!important;border-right:none!important;border-bottom:1px solid #485974}.app-sidebar.menu-collapsed .app-sidebar-footer-op{display:block;padding-left:12px;padding-top:5px;margin:0;width:16px}\n"] }]
558
- }], ctorParameters: function () { return [{ type: i1$2.LocalizationService }, { type: i0.Type, decorators: [{
559
- type: Optional
560
- }, {
561
- type: Inject,
562
- args: [MENU_LOCALIZATION]
563
- }] }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1$1.Router }, { type: i1.AppState }, { type: i0.NgZone }, { type: i4.UtilityService }, { type: i5.AccessControlService }, { type: undefined, decorators: [{
564
- type: Inject,
565
- args: [MENU]
566
- }] }, { type: i1.MenuFilteringService }, { type: i1.TokenService }, { type: i1.GlobalSearchService }, { type: i1.UserPreferencesService }, { type: i4.MessageService }]; }, propDecorators: { sidebar: [{
567
- type: ViewChild,
568
- args: ["sidebar", { static: true }]
569
- }], onWindowResize: [{
570
- type: HostListener,
571
- args: ["window:resize"]
309
+ // Angular
310
+ class Sidebar {
311
+ constructor(lc, lcMenu, cdr, _elementRef, _router, _state, zone, utiExts, aac, menuItemsRaw, menuFilteringService, sr, globalSearchService, profile, msgExts) {
312
+ this.lc = lc;
313
+ this.cdr = cdr;
314
+ this._elementRef = _elementRef;
315
+ this._router = _router;
316
+ this._state = _state;
317
+ this.zone = zone;
318
+ this.utiExts = utiExts;
319
+ this.aac = aac;
320
+ this.menuItemsRaw = menuItemsRaw;
321
+ this.menuFilteringService = menuFilteringService;
322
+ this.sr = sr;
323
+ this.globalSearchService = globalSearchService;
324
+ this.profile = profile;
325
+ this.msgExts = msgExts;
326
+ this.isMenuCollapsed = false;
327
+ this.isMenuShouldCollapsed = false;
328
+ this.applicationVersion = myconfig.AppData.ComponentVersion;
329
+ this.applicationName = myconfig.AppData.ModuleDescription;
330
+ this.user = "";
331
+ this.tenant = "";
332
+ //#endregion
333
+ //#region Gestione Ricerca Globale
334
+ this.SelectedResult = null;
335
+ this.ShowSingleTable = false;
336
+ this.searchingTerm = false;
337
+ this.lc = this.lc.generateFromType(lcMenu);
338
+ this._state.subscribe("menu.isCollapsed", (isCollapsed) => {
339
+ this.isMenuCollapsed = isCollapsed;
340
+ this.cdr.markForCheck();
341
+ });
342
+ this._state.subscribe("application.DeployAvailable", (available) => {
343
+ if (available)
344
+ this.ngOnInit();
345
+ });
346
+ this._router.events.subscribe(event => {
347
+ if (event instanceof NavigationEnd) {
348
+ let width = (window.innerWidth > 0) ? window.innerWidth : screen.width;
349
+ if (width <= 768)
350
+ this._state.notifyDataChanged("menu.isCollapsed", true);
351
+ window.scrollTo(0, 0);
352
+ }
353
+ });
354
+ this.getUserProfileData();
355
+ }
356
+ async ngOnInit() {
357
+ let tmpMenuItems = this.getMenuItems();
358
+ this.menuItems = await firstValueFrom(this.menuFilteringService.filter(tmpMenuItems));
359
+ if (this._shouldMenuCollapse())
360
+ this.menuCollapse();
361
+ this.updateSidebarHeight();
362
+ this._state.setSidebarWidth(this.sidebar.nativeElement.offsetWidth);
363
+ this.cdr.markForCheck();
364
+ }
365
+ getMenuItems() {
366
+ let menus = this.utiExts.deepClone(this.menuItemsRaw);
367
+ // Giro 1 assegno il livello ai root
368
+ for (let i = 0; i < menus.length; i++) {
369
+ let t = menus[i];
370
+ t.level = 1;
371
+ t.padding_left = 18;
372
+ t.visible = !t.ac || this.aac.has(t.ac);
373
+ // Giro ricorsivo
374
+ if (t.subMenu && t.subMenu.length > 0)
375
+ this.checkSubMenuOverClaims(t, 1);
376
+ }
377
+ return menus;
378
+ }
379
+ checkSubMenuOverClaims(menuItem, level) {
380
+ for (let i = 0; i < menuItem.subMenu.length; i++) {
381
+ let t = menuItem.subMenu[i];
382
+ t.level = level + 1;
383
+ t.visible = !t.ac || this.aac.has(t.ac);
384
+ t.padding_left = t.level * 18;
385
+ if (t.subMenu && t.subMenu.length > 0)
386
+ this.checkSubMenuOverClaims(t, level + 1);
387
+ }
388
+ }
389
+ //#region JQuery
390
+ onWindowResize() {
391
+ var isMenuShouldCollapsed = this._shouldMenuCollapse();
392
+ if (this.isMenuShouldCollapsed !== isMenuShouldCollapsed) {
393
+ this.menuCollapseStateChange(isMenuShouldCollapsed);
394
+ }
395
+ this.isMenuShouldCollapsed = isMenuShouldCollapsed;
396
+ this.updateSidebarHeight();
397
+ }
398
+ _shouldMenuCollapse() {
399
+ return window.innerWidth <= 768;
400
+ }
401
+ menuCollapse() {
402
+ this.menuCollapseStateChange(true);
403
+ this._state.setSidebarWidth(this.sidebar.nativeElement.offsetWidth);
404
+ }
405
+ menuCollapseStateChange(isCollapsed) {
406
+ this.isMenuCollapsed = isCollapsed;
407
+ this._state.notifyDataChanged("menu.isCollapsed", this.isMenuCollapsed);
408
+ }
409
+ menuExpand() {
410
+ this.menuCollapseStateChange(false);
411
+ this._state.setSidebarWidth(this.sidebar.nativeElement.offsetWidth);
412
+ }
413
+ hoverItem(jQueryevent) {
414
+ if (!this.isMenuCollapsed) {
415
+ this.showHoverElem = true;
416
+ this.hoverElemHeight = jQueryevent.currentTarget.clientHeight;
417
+ this.hoverElemTop = jQueryevent.currentTarget.getBoundingClientRect().top;
418
+ jQuery(".sidebar-hover-elem").css("top", this.hoverElemTop + "px");
419
+ jQuery(".sidebar-hover-elem").css("height", this.hoverElemHeight + "px");
420
+ jQuery(".sidebar-hover-elem").addClass("show-hover-elem");
421
+ }
422
+ }
423
+ sendAwayHoverElement() {
424
+ this.hoverElemTop = -200;
425
+ jQuery(".sidebar-hover-elem").css("top", this.hoverElemTop + "px");
426
+ }
427
+ updateSidebarHeight() {
428
+ let marginTop = 60 + 40;
429
+ let footerHeight = 150;
430
+ this.menuHeight = this._elementRef.nativeElement.children[0].clientHeight - marginTop - footerHeight;
431
+ }
432
+ //Nonostante questa funzione sia collegata con (click.out-zone) per qualche motivo angular le esegue comunque nella sua zone
433
+ //generando un po' di irresponsività iniziale... succede solo col click... boh
434
+ collapseMenu(jQueryevent, item) {
435
+ if (this.isMenuCollapsed)
436
+ this.menuExpand();
437
+ if (!item.level)
438
+ console.warn("Livello non presente in un oggetto del menu!");
439
+ //N.B: Tutte le funzioni di JQuery le esguo fuori da Angular dato che c'� una buona probabilit� che siano eventi asincroni
440
+ this.zone.runOutsideAngular(() => { this.outsideAngularClickHandler(jQueryevent, item); });
441
+ return false;
442
+ }
443
+ outsideAngularClickHandler(jQueryevent, item) {
444
+ let levelClass = item.level ? "level-" + (item.level) : "";
445
+ let levelClassPlusOne = item.level ? "level-" + (item.level + 1) : "";
446
+ let slidePeriod = 400;
447
+ var link = jQuery(jQueryevent.currentTarget);
448
+ //Se l'elemento non è espanso
449
+ if (!link.closest(".sidebar-item-expanded" + "_" + levelClass).length) {
450
+ //Tiro su tutti gli elementi dello stesso livello espansi e li chiudo
451
+ //Se ho compresso un menu vado a vedere se c'è anche un altro menu di livello pi� basso da richiudere
452
+ jQuery("ul.nav-sidebar li" + "." + (levelClassPlusOne)).each(function () {
453
+ let closestLi = jQuery(this).closest("li");
454
+ if (closestLi.children("ul").length && closestLi.hasClass("sidebar-item-expanded")) {
455
+ closestLi.children("ul").slideUp(slidePeriod);
456
+ //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
457
+ closestLi.removeClass("sidebar-item-expanded" + "_" + (levelClassPlusOne));
458
+ closestLi.removeClass("sidebar-item-expanded");
459
+ }
460
+ });
461
+ //Dopodich� richiudo tutti quelli del mio livello attuale
462
+ jQuery("ul.nav-sidebar li" + "." + levelClass).each(function () {
463
+ let closestLi = jQuery(this).closest("li");
464
+ if (closestLi.children("ul").length && closestLi.hasClass("sidebar-item-expanded")) {
465
+ closestLi.children("ul").slideUp(slidePeriod);
466
+ //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
467
+ closestLi.removeClass("sidebar-item-expanded" + "_" + levelClass);
468
+ closestLi.removeClass("sidebar-item-expanded");
469
+ }
470
+ });
471
+ //Dopodich� espando quello attuale
472
+ link.next().slideDown(slidePeriod);
473
+ if (item.subMenu) {
474
+ //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
475
+ link.closest("li").addClass("sidebar-item-expanded" + "_" + levelClass);
476
+ link.closest("li").addClass("sidebar-item-expanded");
477
+ }
478
+ }
479
+ else {
480
+ //Altrimenti, se l'elemento è già espanso lo chiudo
481
+ if (item.subMenu) {
482
+ //Le uso sempre entrambe insieme. La prima è la classe per la logica, la seconda per le animazioni
483
+ link.closest("li").removeClass("sidebar-item-expanded" + "_" + levelClass);
484
+ link.closest("li").removeClass("sidebar-item-expanded");
485
+ }
486
+ link.next().slideUp(slidePeriod);
487
+ }
488
+ }
489
+ //#endregion
490
+ //#region Footer
491
+ onChangeTenant() {
492
+ window.location.href = `${myconfig.AuthUrl}/#/login;client=${myconfig.Client}`;
493
+ }
494
+ onLogout() {
495
+ window.location.href = `${myconfig.AuthUrl}/#/logout;client=${myconfig.Client}`;
496
+ }
497
+ async getUserProfileData() {
498
+ var identity = this.sr.getJaceIdentity();
499
+ if (identity) {
500
+ this.user = identity.FullName;
501
+ this.tenant = identity.TenantName;
502
+ await this.profile.doReloadProfilePicture();
503
+ this.cdr.markForCheck();
504
+ }
505
+ }
506
+ onSearchRequest() {
507
+ this.searchingTerm = true;
508
+ this.searchResult = null;
509
+ if (!this.globalSearchService.Enabled)
510
+ return;
511
+ if (this.searchTerm.trim().length < 3) {
512
+ this.msgExts.simpleWarning(this.lc.loc("Scrivere almeno 3 caratteri per utilizzare la ricerca globale"));
513
+ return;
514
+ }
515
+ this.globalSearchService.search(this.searchTerm).subscribe(t => {
516
+ this.searchingTerm = false;
517
+ this.searchResult = t;
518
+ // Short-circuit in assenza di risultati
519
+ if ((this.searchResult.results.length || 0) === 0) {
520
+ this.cdr.markForCheck();
521
+ return;
522
+ }
523
+ this.searchResult.results.forEach(t => {
524
+ t.est_cols = t.columns.map(c => {
525
+ let colLink = this.globalSearchService.generateColumnLink(c);
526
+ return new EsTableColumnsDefinition(c.description, c.id, colLink?.routePath, colLink?.routeProperties);
527
+ });
528
+ this.cdr.markForCheck();
529
+ });
530
+ });
531
+ }
532
+ onSearchModelChanged() {
533
+ if (!this.searchingTerm)
534
+ this.closeSearch();
535
+ }
536
+ closeSearch() {
537
+ this.searchingTerm = false;
538
+ this.searchResult = null;
539
+ this.cdr.markForCheck();
540
+ }
541
+ FilterSearchResults(item = null) {
542
+ this.SelectedResult = null;
543
+ this.ShowSingleTable = true;
544
+ requestAnimationFrame(() => {
545
+ if (item)
546
+ this.SelectedResult = this.searchResult?.results?.find(f => f.description == item.description);
547
+ else
548
+ this.ShowSingleTable = false;
549
+ this.cdr.markForCheck();
550
+ });
551
+ }
552
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: Sidebar, deps: [{ token: i1$2.LocalizationService }, { token: MENU_LOCALIZATION, optional: true }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i1$1.Router }, { token: i1.AppState }, { token: i0.NgZone }, { token: i4.UtilityService }, { token: i5.AccessControlService }, { token: MENU }, { token: i1.MenuFilteringService }, { token: i1.TokenService }, { token: i1.GlobalSearchService }, { token: i1.UserPreferencesService }, { token: i4.MessageService }], target: i0.ɵɵFactoryTarget.Component }); }
553
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: Sidebar, isStandalone: true, selector: "sidebar", host: { listeners: { "window:resize": "onWindowResize()" } }, viewQueries: [{ propertyName: "sidebar", first: true, predicate: ["sidebar"], descendants: true, static: true }], ngImport: i0, template: "<div #sidebar class=\"app-sidebar\" [class.menu-collapsed]=\"isMenuCollapsed\" (mouseleave.out-zone)=\"sendAwayHoverElement();\">\r\n <!--Jace Logo-->\r\n <div class=\"app-logo-container\">\r\n <div class=\"app-pointer\" [routerLink]=\"['/pages/dashboard']\" style=\"margin-bottom: 10px; overflow: hidden\">\r\n <ng-container *ngIf=\"!isMenuCollapsed\">\r\n <img class=\"app-logo-img\" src=\"assets/img/logo/headlogo_small.png\" alt=\"\">\r\n <div class=\"app-logo-font-container\">\r\n <span class=\"app-logo-font\">{{applicationName}}</span>\r\n </div>\r\n </ng-container>\r\n \r\n <img *ngIf=\"isMenuCollapsed\" class=\"app-logo-img-sm\" src=\"assets/img/logo/headlogo_small.png\" alt=\"\">\r\n </div>\r\n </div>\r\n <!--Ricerca globale-->\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-search\">\r\n <form novalidate role=\"search\" class=\"app-search\" (ngSubmit)=\"onSearchRequest()\">\r\n <input type=\"text\" placeholder=\"Ricerca...\" [(ngModel)]=\"searchTerm\" (ngModelChange)=\"onSearchModelChanged()\" name=\"search\" class=\"form-control\" autocomplete=\"off\">\r\n <a><i class=\"far fa-magnifying-glass\"></i></a>\r\n </form>\r\n </div>\r\n <!--Barra laterale con tutte le voci di Menu-->\r\n <ul class=\"nav nav-sidebar flex-column flex-nowrap\" style=\"position: relative; zoom: 1\" slim-scroll [slimScrollOptions]=\"{height: menuHeight + (isMenuCollapsed ? 55 : 0)}\">\r\n <ng-container *ngFor=\"let item of menuItems; let last = last;\">\r\n <li *ngIf=\"item.visible\" class=\"sidebar-list-item level-{{item.level}}\" \r\n [style.margin-bottom]=\"last ? '42px' : '0px'\"\r\n [class.has-sub-menu]=\"item.subMenu\" \r\n [class.sidebar-item-expanded]=\"item.expanded\"\r\n [class.sidebar-item-wip]=\"item.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : { $implicit: item }\"></ng-container>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <!--Selettore Barra dei Menu-->\r\n <div class=\"sidebar-hover-elem\"></div>\r\n <!--Footer *ngIf=\"!isMenuCollapsed\"-->\r\n <div class=\"app-sidebar-footer\">\r\n <!--Minuscolo fade tra sidebar e inizio footer-->\r\n <div class=\"app-sidebar-footer-fade\"></div>\r\n <div [style.padding.px]=\"isMenuCollapsed ? 5 : 15\">\r\n <!--Informazioni utente collegato-->\r\n <div class=\"app-sidebar-footer-user-container\">\r\n <!--Mentre sto ancora caricando la ProfilePic mi assicuro di mostrare un placeholder-->\r\n <div *ngIf=\"!profile.ProfilePicture\" class=\"app-sidebar-footer-user-img-placeholder\">\r\n <i class=\"far fa-2x fa-spinner fa-spin-pulse\" style=\"color: black; margin-top: 5px;\"></i>\r\n </div>\r\n <!--Una volta caricata la ProfilePic nascondo il placeholder e la mostro-->\r\n <ng-container *ngIf=\"profile.ProfilePicture\">\r\n <img [src]=\"profile.ProfilePicture\" alt=\"\" class=\"app-sidebar-footer-user-img app-pointer\" [routerLink]=\"['/pages/profile']\">\r\n <div class=\"app-sidebar-footer-user-status\"></div>\r\n </ng-container>\r\n <!--Username animato quando supera i 15 caratteri-->\r\n <div class=\"app-sidebar-footer-user-name-container\">\r\n <div class=\"username-text\" [class.username-text-animator]=\"user?.length > 15\">{{user}}</div>\r\n <div class=\"tenantname-text\">{{tenant}}</div>\r\n </div>\r\n </div>\r\n <!--Operazioni rapide (Logout, Cambia tenant, Guida, Supporto,...)-->\r\n <div class=\"app-sidebar-footer-quick-ops\" [style.display]=\"isMenuCollapsed ? 'inline' : 'flex'\">\r\n <div (click)=\"onChangeTenant();\" class=\"app-sidebar-footer-op app-no-selection\" [style.margin-top.px]=\"isMenuCollapsed ? 10 : 0\"><i class=\"far fa-right-left\"></i><span *ngIf=\"!isMenuCollapsed\">&nbsp;Cambia Tenant</span></div>\r\n <div (click)=\"onLogout();\" class=\"app-sidebar-footer-op app-no-selection\" [style.margin-top.px]=\"isMenuCollapsed ? 10 : 0\"><i class=\"far fa-right-from-bracket\"></i><span *ngIf=\"!isMenuCollapsed\">&nbsp;Logout</span></div>\r\n </div>\r\n <!--Versione corrente applicazione-->\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-footer-ver\">\r\n v{{applicationVersion}}\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #menuItem let-item>\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"(!item.routerLink && !item.subMenu) || item.wip\" [href]=\"item.link || '#'\" (click)=\"item.wip && $event.preventDefault()\" target=\"_blank\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"item.routerLink && !item.subMenu && !item.wip\" class=\"sidebar-list-link {{item.cssClass || ''}}\" [routerLink]=\"[item.routerLink]\" [queryParams]=\"item.queryParams\" routerLinkActive=\"active-link\" (click.out-zone)=\"collapseMenu($event, item)\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"item.subMenu && !item.wip\" (click.out-zone)=\"collapseMenu($event, item)\" [attr.href]=\"''\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n <b class=\"fa fa-angle-down\"></b>\r\n </a>\r\n\r\n <ul *ngIf=\"item.subMenu\" class=\"sidebar-sublist\">\r\n <ng-container *ngFor=\"let subitem of item.subMenu\" >\r\n <li *ngIf=\"subitem.visible\" class=\"sidebar-sublist-item level-{{item.level}}\" [class.sidebar-item-wip]=\"subitem.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : {$implicit: subitem}\"></ng-container>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n</ng-template>\r\n\r\n<!-- Overlay per la ricerca globale -->\r\n<ng-container *ngIf=\"searchingTerm || searchResult\">\r\n <div class=\"app-absolute app-search-background\">\r\n <div class=\"app-search-result-box\">\r\n <ng-container *ngIf=\"searchingTerm\">\r\n <div class=\"app-search-card\"><i class=\"fa fa-spinner fa-spin\"></i>Sto effettuando la ricerca...</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"searchResult && !searchingTerm\">\r\n <div class=\"row\" style=\"height: 100%;\">\r\n <!-- Spazio a sinistra -->\r\n <div class=\"col-md-1\"></div>\r\n <!-- Blocco con le categorie dei risultati -->\r\n <div class=\"col-md-3\">\r\n <div class=\"app-search-card\">\r\n <div class=\"app-relative\"><a class=\"fa fa-times text-danger app-absolute app-right-0 app-fs-20 app-pointer\" (click)=\"closeSearch();\"></a></div>\r\n <h4>Categorie di Ricerca</h4>\r\n <div class=\"app-pointer app-link\" [class.app-bold]=\"!SelectedResult && !ShowSingleTable\">\r\n <span (click)=\"FilterSearchResults()\">{{SelectedResult ? '-' : '>'}} Mostra Tutto</span>\r\n </div>\r\n <div *ngFor=\"let item of searchResult.results\" class=\"app-pointer app-link\" [class.app-bold]=\"SelectedResult?.description == item.description\">\r\n <span (click)=\"FilterSearchResults(item)\">{{SelectedResult?.description == item.description ? '>' : '-'}} Mostra {{item.description}} ({{item.items?.length}})</span>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Dettaglio risultati -->\r\n <div class=\"col-md-7\" style=\"overflow: auto; height: 100%;\">\r\n <ng-container *ngIf=\"!SelectedResult && !ShowSingleTable\">\r\n <div *ngFor=\"let res of searchResult.results; let i = index;\" class=\"app-search-card\" [style.margin-bottom.px]=\"i == (searchResult.results?.length - 1) ? 2 : 10\">\r\n <h4>{{res.description}}</h4>\r\n <es-table [(ngModel)]=\"res.items\" [DynamicRowColumnsDefinition]=\"res.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"SelectedResult && ShowSingleTable\">\r\n <div class=\"app-search-card\">\r\n <h4>{{SelectedResult.description}}</h4>\r\n <es-table [(ngModel)]=\"SelectedResult.items\" [DynamicRowColumnsDefinition]=\"SelectedResult.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- Spazio a destra -->\r\n <div class=\"col-md-1\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-container>", styles: [".app-sidebar{background:#344154;box-shadow:8px 0 6px -6px #1313130a,12px 0 16px -16px #1313130d;height:100%;min-height:100%;width:230px;overflow:hidden;display:block;z-index:9}.app-sidebar.menu-collapsed{width:50px}.app-sidebar.menu-collapsed a.sidebar-list-link b{display:none}.app-sidebar.menu-collapsed .sidebar-sublist{position:absolute;top:-1px;left:52px;width:0;display:block;overflow:hidden}.sidebar-list-item{display:block;position:relative;float:none;padding:0;border-bottom:1px solid rgb(71.5,89.375,115.5)}.sidebar-item-wip{cursor:default}a.sidebar-list-link{display:block;height:42px;padding-top:0!important;text-shadow:none;font-size:13px;letter-spacing:.02em;text-decoration:none;color:#fff;line-height:42px;white-space:nowrap;overflow:hidden;cursor:pointer;transition:all .2s ease}a.sidebar-list-link i{margin-right:16px;width:16px;display:inline-block}a.sidebar-list-link b{display:block;opacity:1;width:14px;height:14px;line-height:14px;text-shadow:none;font-size:18px;position:absolute;right:10px;top:14px;padding:0;text-align:center;transition:transform .2s linear}a.sidebar-list-link:hover{background-color:#2a3544}.sidebar-list-item.sidebar-item-expanded>.sidebar-list-link b,.sidebar-sublist-item.sidebar-item-expanded>.sidebar-list-link b{transform:rotate(180deg)}.sidebar-sublist{display:none;padding:0;list-style:none;position:relative;background-color:#3e4d64}.sidebar-sublist .level-1{background-color:#364357}.sidebar-sublist .level-2{background-color:#2e3a4b}.sidebar-sublist li{display:block;float:none;padding:0;border-bottom:none;position:relative;border-top:1px solid rgb(71.5,89.375,115.5)}.sidebar-sublist li a{display:block;text-shadow:none;font-size:13px;text-decoration:none;height:42px;line-height:42px}.sidebar-sublist li a:before{font-family:\"Font Awesome 6 Pro\";content:\"\\f1db\";margin-right:10px;font-size:10px}.sidebar-sublist li a:hover{background-color:#2a3544}.sidebar-item-expanded>ul.sidebar-sublist{display:block;background-color:#3e4d64}.subitem-submenu-link .fa{top:14px}.sidebar-hover-elem{width:4px;background-color:#024a88;position:absolute;top:-90px;left:226px;transition:all .2s ease;transition-property:top,height;height:36px;display:block}.sidebar.menu-collapsed .sidebar-hover-elem{left:46px}.active-link{background-color:#677ea1!important}@media (max-width: 544px){.sidebar.menu-collapsed{width:0}.sidebar-hover-elem,.sidebar-select-elem{display:none}}.app-logo-container{height:60px;background-color:#2a3544;display:flex;position:relative;z-index:10;margin-bottom:-1px;border-bottom:1px solid rgb(71.5,89.375,115.5);color:#fff;padding:10px 0 0 15px}.app-sidebar-search{height:39px;border-bottom:42px solid #344154}.app-logo-placeholder{text-align:center;font-size:1.2rem;text-transform:uppercase;font-weight:700;margin-top:15px!important}.app-logo-font{color:#fffac2;font-family:Work Sans;font-size:15px;line-height:1;text-transform:uppercase;font-weight:700;padding-left:5px;padding-bottom:2px;overflow:hidden}.app-logo-font-container{display:inline-block;vertical-align:bottom;width:calc(var(--sidebar-width) - 70px);margin:0;height:auto;overflow:hidden}.app-logo-img-sm{padding-top:10px}.app-sidebar-footer{position:relative;background-color:#344154}.app-sidebar-footer-fade{top:-42px;position:absolute;background-image:linear-gradient(to top,#344154,#34415400);height:42px;width:230px;z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.app-sidebar-footer-user-container{position:relative;display:flex;margin-top:5px;color:#fff}.app-sidebar-footer-user-img-placeholder{height:40px;min-width:40px;width:40px;text-align:center}.app-sidebar-footer-user-img{height:40px;min-height:40px;min-width:40px;width:40px;border-radius:50%;border:1px solid rgb(71.5,89.375,115.5)}.app-sidebar-footer-user-status{background-color:#32cd32;border:1px solid green;border-radius:50%;position:absolute;left:29px;top:29px;height:11px;width:11px}.app-sidebar-footer-user-name-container{width:150px;white-space:nowrap;overflow:hidden;margin-left:10px}.username-text{z-index:1;min-width:140px;display:flex;font-size:16px}.username-text-animator:hover{transform:translate(100%);animation:my-animation 3s linear infinite}@keyframes my-animation{0%{transform:translate(0)}to{transform:translate(-50%)}}.tenantname-text{font-size:12px}.app-sidebar-footer-quick-ops{margin-top:10px;display:flex;justify-content:space-between}.app-sidebar-footer-op{color:#fff;font-weight:700;cursor:pointer}.app-sidebar-footer-ver{text-align:right;margin-top:30px;color:#fff}.app-search{position:relative}.app-search a{position:absolute;top:8px;right:14px;font-size:16px;color:#fff!important}.app-search .form-control{font-size:12px;letter-spacing:.03em;height:40px;color:#fff;padding:7px 40px 7px 20px;background:#3e4d64;box-shadow:none!important;border-top:none!important;border-left:none!important;border-right:none!important;border-bottom:1px solid rgb(71.5,89.375,115.5)}.app-sidebar.menu-collapsed .app-sidebar-footer-op{display:block;padding-left:12px;padding-top:5px;margin:0;width:16px}\n"], dependencies: [{ kind: "directive", type: SlimScroll, selector: "[slim-scroll]", inputs: ["slimScrollOptions"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: RouterLinkActive, selector: "[routerLinkActive]", inputs: ["routerLinkActiveOptions", "ariaCurrentWhenActive", "routerLinkActive"], outputs: ["isActiveChange"], exportAs: ["routerLinkActive"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: EsTableModule }, { kind: "component", type: i7.EsTableComponent, selector: "es-table", inputs: ["EsThTdProvider", "CornerMenuOptions", "ColumnsResizable", "ColumnsPinnable", "AutoUpdate", "Height", "EmptySpaceBackgroundColor", "EsTableHandledSearch", "MaxHeight", "ContainerClass", "XLSXExport", "CSVExport", "AllSearch", "HighCellDensity", "Selection", "ShowLoadingOnBootstrap", "Removal", "RemovalCondition", "Export", "ShiftClick", "CountLabel", "HidePaging", "HidePagingCount", "HidePagingButtons", "ContextMenu", "ExportFileName", "TableClass", "ExportFunction", "ExportOnlyVisibleColumns", "HasHeaderGroup", "HasSecondaryHeaderGroup", "HeaderHidden", "BodyHidden", "SelectionDisabled", "SingleSelection", "RowClassAssigner", "OrderByColumn", "MultipleOrderingDirectives", "HiddenColumns", "ColumnsOrdering", "SearchView", "SelectAll", "UseArrayModePaging", "DynamicRowColumnsDefinition", "DynamicOperations", "Hierarchy", "ParentKey", "OwnKey", "StartsExpanded", "SavePreferences", "DefaultAlignment", "PagingStyle", "RowGroupingPagingStyle", "ItemSourceProperty", "UseSelectionCache", "ShowItemGroupsColumns", "Editable", "RangeSelection", "SearchThrottle", "ArraymodeItemsPerPage"], outputs: ["onOrderChanged", "onSearchRequest", "onSelectionChanged", "onRemoval", "onAbortRemoval", "onModelChange", "onOpenContextMenu", "onCornerAction", "onDynamicOperation"] }, { kind: "ngmodule", type: LocalizationModule }, { kind: "pipe", type: i1$2.LocalizePipe, name: "localize" }], viewProviders: [{ provide: LocalizationService, useClass: SideBarLoc }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
554
+ }
555
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: Sidebar, decorators: [{
556
+ type: Component,
557
+ args: [{ selector: "sidebar", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [{ provide: LocalizationService, useClass: SideBarLoc }], imports: [SlimScroll, NgFor, NgTemplateOutlet, NgIf, RouterLinkActive, RouterLink, FormsModule, EsTableModule, LocalizationModule], template: "<div #sidebar class=\"app-sidebar\" [class.menu-collapsed]=\"isMenuCollapsed\" (mouseleave.out-zone)=\"sendAwayHoverElement();\">\r\n <!--Jace Logo-->\r\n <div class=\"app-logo-container\">\r\n <div class=\"app-pointer\" [routerLink]=\"['/pages/dashboard']\" style=\"margin-bottom: 10px; overflow: hidden\">\r\n <ng-container *ngIf=\"!isMenuCollapsed\">\r\n <img class=\"app-logo-img\" src=\"assets/img/logo/headlogo_small.png\" alt=\"\">\r\n <div class=\"app-logo-font-container\">\r\n <span class=\"app-logo-font\">{{applicationName}}</span>\r\n </div>\r\n </ng-container>\r\n \r\n <img *ngIf=\"isMenuCollapsed\" class=\"app-logo-img-sm\" src=\"assets/img/logo/headlogo_small.png\" alt=\"\">\r\n </div>\r\n </div>\r\n <!--Ricerca globale-->\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-search\">\r\n <form novalidate role=\"search\" class=\"app-search\" (ngSubmit)=\"onSearchRequest()\">\r\n <input type=\"text\" placeholder=\"Ricerca...\" [(ngModel)]=\"searchTerm\" (ngModelChange)=\"onSearchModelChanged()\" name=\"search\" class=\"form-control\" autocomplete=\"off\">\r\n <a><i class=\"far fa-magnifying-glass\"></i></a>\r\n </form>\r\n </div>\r\n <!--Barra laterale con tutte le voci di Menu-->\r\n <ul class=\"nav nav-sidebar flex-column flex-nowrap\" style=\"position: relative; zoom: 1\" slim-scroll [slimScrollOptions]=\"{height: menuHeight + (isMenuCollapsed ? 55 : 0)}\">\r\n <ng-container *ngFor=\"let item of menuItems; let last = last;\">\r\n <li *ngIf=\"item.visible\" class=\"sidebar-list-item level-{{item.level}}\" \r\n [style.margin-bottom]=\"last ? '42px' : '0px'\"\r\n [class.has-sub-menu]=\"item.subMenu\" \r\n [class.sidebar-item-expanded]=\"item.expanded\"\r\n [class.sidebar-item-wip]=\"item.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : { $implicit: item }\"></ng-container>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n <!--Selettore Barra dei Menu-->\r\n <div class=\"sidebar-hover-elem\"></div>\r\n <!--Footer *ngIf=\"!isMenuCollapsed\"-->\r\n <div class=\"app-sidebar-footer\">\r\n <!--Minuscolo fade tra sidebar e inizio footer-->\r\n <div class=\"app-sidebar-footer-fade\"></div>\r\n <div [style.padding.px]=\"isMenuCollapsed ? 5 : 15\">\r\n <!--Informazioni utente collegato-->\r\n <div class=\"app-sidebar-footer-user-container\">\r\n <!--Mentre sto ancora caricando la ProfilePic mi assicuro di mostrare un placeholder-->\r\n <div *ngIf=\"!profile.ProfilePicture\" class=\"app-sidebar-footer-user-img-placeholder\">\r\n <i class=\"far fa-2x fa-spinner fa-spin-pulse\" style=\"color: black; margin-top: 5px;\"></i>\r\n </div>\r\n <!--Una volta caricata la ProfilePic nascondo il placeholder e la mostro-->\r\n <ng-container *ngIf=\"profile.ProfilePicture\">\r\n <img [src]=\"profile.ProfilePicture\" alt=\"\" class=\"app-sidebar-footer-user-img app-pointer\" [routerLink]=\"['/pages/profile']\">\r\n <div class=\"app-sidebar-footer-user-status\"></div>\r\n </ng-container>\r\n <!--Username animato quando supera i 15 caratteri-->\r\n <div class=\"app-sidebar-footer-user-name-container\">\r\n <div class=\"username-text\" [class.username-text-animator]=\"user?.length > 15\">{{user}}</div>\r\n <div class=\"tenantname-text\">{{tenant}}</div>\r\n </div>\r\n </div>\r\n <!--Operazioni rapide (Logout, Cambia tenant, Guida, Supporto,...)-->\r\n <div class=\"app-sidebar-footer-quick-ops\" [style.display]=\"isMenuCollapsed ? 'inline' : 'flex'\">\r\n <div (click)=\"onChangeTenant();\" class=\"app-sidebar-footer-op app-no-selection\" [style.margin-top.px]=\"isMenuCollapsed ? 10 : 0\"><i class=\"far fa-right-left\"></i><span *ngIf=\"!isMenuCollapsed\">&nbsp;Cambia Tenant</span></div>\r\n <div (click)=\"onLogout();\" class=\"app-sidebar-footer-op app-no-selection\" [style.margin-top.px]=\"isMenuCollapsed ? 10 : 0\"><i class=\"far fa-right-from-bracket\"></i><span *ngIf=\"!isMenuCollapsed\">&nbsp;Logout</span></div>\r\n </div>\r\n <!--Versione corrente applicazione-->\r\n <div *ngIf=\"!isMenuCollapsed\" class=\"app-sidebar-footer-ver\">\r\n v{{applicationVersion}}\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #menuItem let-item>\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"(!item.routerLink && !item.subMenu) || item.wip\" [href]=\"item.link || '#'\" (click)=\"item.wip && $event.preventDefault()\" target=\"_blank\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"item.routerLink && !item.subMenu && !item.wip\" class=\"sidebar-list-link {{item.cssClass || ''}}\" [routerLink]=\"[item.routerLink]\" [queryParams]=\"item.queryParams\" routerLinkActive=\"active-link\" (click.out-zone)=\"collapseMenu($event, item)\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n </a>\r\n\r\n <a [style.padding-left.px]=\"item.padding_left\" *ngIf=\"item.subMenu && !item.wip\" (click.out-zone)=\"collapseMenu($event, item)\" [attr.href]=\"''\" class=\"sidebar-list-link {{item.cssClass || ''}}\" (mouseenter.out-zone)=\"hoverItem($event)\">\r\n <i *ngIf=\"item.icon\" class=\"{{ item.icon }}\"></i><span>{{ item.title | localize : lc }}</span>\r\n <b class=\"fa fa-angle-down\"></b>\r\n </a>\r\n\r\n <ul *ngIf=\"item.subMenu\" class=\"sidebar-sublist\">\r\n <ng-container *ngFor=\"let subitem of item.subMenu\" >\r\n <li *ngIf=\"subitem.visible\" class=\"sidebar-sublist-item level-{{item.level}}\" [class.sidebar-item-wip]=\"subitem.wip\">\r\n <ng-container *ngTemplateOutlet=\"menuItem; context : {$implicit: subitem}\"></ng-container>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n</ng-template>\r\n\r\n<!-- Overlay per la ricerca globale -->\r\n<ng-container *ngIf=\"searchingTerm || searchResult\">\r\n <div class=\"app-absolute app-search-background\">\r\n <div class=\"app-search-result-box\">\r\n <ng-container *ngIf=\"searchingTerm\">\r\n <div class=\"app-search-card\"><i class=\"fa fa-spinner fa-spin\"></i>Sto effettuando la ricerca...</div>\r\n </ng-container>\r\n <ng-container *ngIf=\"searchResult && !searchingTerm\">\r\n <div class=\"row\" style=\"height: 100%;\">\r\n <!-- Spazio a sinistra -->\r\n <div class=\"col-md-1\"></div>\r\n <!-- Blocco con le categorie dei risultati -->\r\n <div class=\"col-md-3\">\r\n <div class=\"app-search-card\">\r\n <div class=\"app-relative\"><a class=\"fa fa-times text-danger app-absolute app-right-0 app-fs-20 app-pointer\" (click)=\"closeSearch();\"></a></div>\r\n <h4>Categorie di Ricerca</h4>\r\n <div class=\"app-pointer app-link\" [class.app-bold]=\"!SelectedResult && !ShowSingleTable\">\r\n <span (click)=\"FilterSearchResults()\">{{SelectedResult ? '-' : '>'}} Mostra Tutto</span>\r\n </div>\r\n <div *ngFor=\"let item of searchResult.results\" class=\"app-pointer app-link\" [class.app-bold]=\"SelectedResult?.description == item.description\">\r\n <span (click)=\"FilterSearchResults(item)\">{{SelectedResult?.description == item.description ? '>' : '-'}} Mostra {{item.description}} ({{item.items?.length}})</span>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Dettaglio risultati -->\r\n <div class=\"col-md-7\" style=\"overflow: auto; height: 100%;\">\r\n <ng-container *ngIf=\"!SelectedResult && !ShowSingleTable\">\r\n <div *ngFor=\"let res of searchResult.results; let i = index;\" class=\"app-search-card\" [style.margin-bottom.px]=\"i == (searchResult.results?.length - 1) ? 2 : 10\">\r\n <h4>{{res.description}}</h4>\r\n <es-table [(ngModel)]=\"res.items\" [DynamicRowColumnsDefinition]=\"res.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"SelectedResult && ShowSingleTable\">\r\n <div class=\"app-search-card\">\r\n <h4>{{SelectedResult.description}}</h4>\r\n <es-table [(ngModel)]=\"SelectedResult.items\" [DynamicRowColumnsDefinition]=\"SelectedResult.est_cols\" [ArraymodeItemsPerPage]=\"10\"></es-table>\r\n </div>\r\n </ng-container>\r\n </div>\r\n <!-- Spazio a destra -->\r\n <div class=\"col-md-1\"></div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-container>", styles: [".app-sidebar{background:#344154;box-shadow:8px 0 6px -6px #1313130a,12px 0 16px -16px #1313130d;height:100%;min-height:100%;width:230px;overflow:hidden;display:block;z-index:9}.app-sidebar.menu-collapsed{width:50px}.app-sidebar.menu-collapsed a.sidebar-list-link b{display:none}.app-sidebar.menu-collapsed .sidebar-sublist{position:absolute;top:-1px;left:52px;width:0;display:block;overflow:hidden}.sidebar-list-item{display:block;position:relative;float:none;padding:0;border-bottom:1px solid rgb(71.5,89.375,115.5)}.sidebar-item-wip{cursor:default}a.sidebar-list-link{display:block;height:42px;padding-top:0!important;text-shadow:none;font-size:13px;letter-spacing:.02em;text-decoration:none;color:#fff;line-height:42px;white-space:nowrap;overflow:hidden;cursor:pointer;transition:all .2s ease}a.sidebar-list-link i{margin-right:16px;width:16px;display:inline-block}a.sidebar-list-link b{display:block;opacity:1;width:14px;height:14px;line-height:14px;text-shadow:none;font-size:18px;position:absolute;right:10px;top:14px;padding:0;text-align:center;transition:transform .2s linear}a.sidebar-list-link:hover{background-color:#2a3544}.sidebar-list-item.sidebar-item-expanded>.sidebar-list-link b,.sidebar-sublist-item.sidebar-item-expanded>.sidebar-list-link b{transform:rotate(180deg)}.sidebar-sublist{display:none;padding:0;list-style:none;position:relative;background-color:#3e4d64}.sidebar-sublist .level-1{background-color:#364357}.sidebar-sublist .level-2{background-color:#2e3a4b}.sidebar-sublist li{display:block;float:none;padding:0;border-bottom:none;position:relative;border-top:1px solid rgb(71.5,89.375,115.5)}.sidebar-sublist li a{display:block;text-shadow:none;font-size:13px;text-decoration:none;height:42px;line-height:42px}.sidebar-sublist li a:before{font-family:\"Font Awesome 6 Pro\";content:\"\\f1db\";margin-right:10px;font-size:10px}.sidebar-sublist li a:hover{background-color:#2a3544}.sidebar-item-expanded>ul.sidebar-sublist{display:block;background-color:#3e4d64}.subitem-submenu-link .fa{top:14px}.sidebar-hover-elem{width:4px;background-color:#024a88;position:absolute;top:-90px;left:226px;transition:all .2s ease;transition-property:top,height;height:36px;display:block}.sidebar.menu-collapsed .sidebar-hover-elem{left:46px}.active-link{background-color:#677ea1!important}@media (max-width: 544px){.sidebar.menu-collapsed{width:0}.sidebar-hover-elem,.sidebar-select-elem{display:none}}.app-logo-container{height:60px;background-color:#2a3544;display:flex;position:relative;z-index:10;margin-bottom:-1px;border-bottom:1px solid rgb(71.5,89.375,115.5);color:#fff;padding:10px 0 0 15px}.app-sidebar-search{height:39px;border-bottom:42px solid #344154}.app-logo-placeholder{text-align:center;font-size:1.2rem;text-transform:uppercase;font-weight:700;margin-top:15px!important}.app-logo-font{color:#fffac2;font-family:Work Sans;font-size:15px;line-height:1;text-transform:uppercase;font-weight:700;padding-left:5px;padding-bottom:2px;overflow:hidden}.app-logo-font-container{display:inline-block;vertical-align:bottom;width:calc(var(--sidebar-width) - 70px);margin:0;height:auto;overflow:hidden}.app-logo-img-sm{padding-top:10px}.app-sidebar-footer{position:relative;background-color:#344154}.app-sidebar-footer-fade{top:-42px;position:absolute;background-image:linear-gradient(to top,#344154,#34415400);height:42px;width:230px;z-index:100;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}.app-sidebar-footer-user-container{position:relative;display:flex;margin-top:5px;color:#fff}.app-sidebar-footer-user-img-placeholder{height:40px;min-width:40px;width:40px;text-align:center}.app-sidebar-footer-user-img{height:40px;min-height:40px;min-width:40px;width:40px;border-radius:50%;border:1px solid rgb(71.5,89.375,115.5)}.app-sidebar-footer-user-status{background-color:#32cd32;border:1px solid green;border-radius:50%;position:absolute;left:29px;top:29px;height:11px;width:11px}.app-sidebar-footer-user-name-container{width:150px;white-space:nowrap;overflow:hidden;margin-left:10px}.username-text{z-index:1;min-width:140px;display:flex;font-size:16px}.username-text-animator:hover{transform:translate(100%);animation:my-animation 3s linear infinite}@keyframes my-animation{0%{transform:translate(0)}to{transform:translate(-50%)}}.tenantname-text{font-size:12px}.app-sidebar-footer-quick-ops{margin-top:10px;display:flex;justify-content:space-between}.app-sidebar-footer-op{color:#fff;font-weight:700;cursor:pointer}.app-sidebar-footer-ver{text-align:right;margin-top:30px;color:#fff}.app-search{position:relative}.app-search a{position:absolute;top:8px;right:14px;font-size:16px;color:#fff!important}.app-search .form-control{font-size:12px;letter-spacing:.03em;height:40px;color:#fff;padding:7px 40px 7px 20px;background:#3e4d64;box-shadow:none!important;border-top:none!important;border-left:none!important;border-right:none!important;border-bottom:1px solid rgb(71.5,89.375,115.5)}.app-sidebar.menu-collapsed .app-sidebar-footer-op{display:block;padding-left:12px;padding-top:5px;margin:0;width:16px}\n"] }]
558
+ }], ctorParameters: () => [{ type: i1$2.LocalizationService }, { type: i0.Type, decorators: [{
559
+ type: Optional
560
+ }, {
561
+ type: Inject,
562
+ args: [MENU_LOCALIZATION]
563
+ }] }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i1$1.Router }, { type: i1.AppState }, { type: i0.NgZone }, { type: i4.UtilityService }, { type: i5.AccessControlService }, { type: undefined, decorators: [{
564
+ type: Inject,
565
+ args: [MENU]
566
+ }] }, { type: i1.MenuFilteringService }, { type: i1.TokenService }, { type: i1.GlobalSearchService }, { type: i1.UserPreferencesService }, { type: i4.MessageService }], propDecorators: { sidebar: [{
567
+ type: ViewChild,
568
+ args: ["sidebar", { static: true }]
569
+ }], onWindowResize: [{
570
+ type: HostListener,
571
+ args: ["window:resize"]
572
572
  }] } });
573
573
 
574
- class NavBarLoc extends LocalizationService {
575
- constructor(injector) {
576
- super(injector);
577
- super.set("it->en", "Sessione Scaduta", ["Expired session"]);
578
- super.set("it->en", "Backend Offline", ["Backend Offline"]);
579
- super.set("it->en", "Sembra che il Backend sia momentaneamente offline. Questa pagina si aggiornera' automaticamente non appena la situazione tornera' alla normalita'. Ci scusiamo per il disagio", ["Backend seems to be currently offline. This page will reset itself when the situation goes back to normal. Sorry for the inconvenience"]);
580
- super.set("it->en", "Ripulisci la Cache", ["Clear Caches"]);
581
- super.set("it->en", "Cache Ripulita", ["Cache Cleared"]);
582
- super.set("it->en", "Ambiente di Produzione", ["Production Environment"]);
583
- super.set("it->en", "È disponibile una nuova versione per l'applicazione corrente. Si suggerisce di ricaricare la pagina (CTRL + F5)", ["A new version is available for this application. It is suggested to reload this page (CTRL + F5)"]);
584
- super.set("it->en", "Le informazioni di Sessione (Tenant/Account) sono cambiate a seguito di un login su modulo diverso utilizzando diverso Tenant/Utente sullo stesso browser. Si suggerisce di ricaricare la pagina (CTRL + F5)", ["Session informations (Tenant/Account) has changed after a login to a different module with the same Tenant/Username using the same browser. It is suggested to reload this page (CTRL + F5)"]);
585
- super.set("it->en", "Cambia Modulo", ["Change module"]);
586
- super.set("it->en", "Cambia Tenant", ["Change tenant"]);
587
- super.set("it->en", "Usa notifiche semplici", ["Use simple alerts"]);
588
- super.set("it->en", "Consenti notifiche eleganti", ["Allow fancy alerts"]);
589
- super.set("it->en", "Ambiente di Sviluppo", ["Development Environment"]);
590
- super.set("it->en", "Ambiente di Sviluppo A", ["Development Environment A"]);
591
- super.set("it->en", "Ambiente di Sviluppo B", ["Development Environment B"]);
592
- super.set("it->en", "Ripulisci le Preferenze Utente", ["Clear User Preferences"]);
593
- super.set("it->en", "Preferenze utente ripulite", ["User preferences has been cleared"]);
594
- super.set("it->en", "Ambiente di Staging", ["Staging Environment"]);
595
- super.set("it->en", "Ambiente di Staging A", ["Staging A Environment"]);
596
- super.set("it->en", "L'attuale sessione di lavoro non è più valida.<br>Si prega di eseguire nuovamente il login.", ["Current session has expired.<br>Please login back into the application."]);
597
- super.set("it->en", "Notifiche", ["Notifications"]);
598
- super.set("it->en", "Job Applicativi", ["Application Jobs"]);
599
- super.set("it->en", "Al momento non c'è nulla in esecuzione", ["Nothing being executed at the moment"]);
600
- super.set("it->en", "Job Completato", ["Job Completed"]);
601
- super.set("it->en", "Scrivere almeno 3 caratteri per utilizzare la ricerca globale", ["You must write at least 3 characters in order to use the Global Research"]);
602
- super.set("it->en", "Ripulisci la Cache di tutti", ["Clear Caches of everyone"]);
603
- super.set("it->en", "Ripulisci le Preferenze di tutti", ["Clear Preferences of everyone"]);
604
- }
605
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NavBarLoc, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
606
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NavBarLoc }); }
607
- }
608
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NavBarLoc, decorators: [{
609
- type: Injectable
610
- }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
574
+ class NavBarLoc extends LocalizationService {
575
+ constructor(injector) {
576
+ super(injector);
577
+ super.set("it->en", "Sessione Scaduta", ["Expired session"]);
578
+ super.set("it->en", "Backend Offline", ["Backend Offline"]);
579
+ super.set("it->en", "Sembra che il Backend sia momentaneamente offline. Questa pagina si aggiornera' automaticamente non appena la situazione tornera' alla normalita'. Ci scusiamo per il disagio", ["Backend seems to be currently offline. This page will reset itself when the situation goes back to normal. Sorry for the inconvenience"]);
580
+ super.set("it->en", "Ripulisci la Cache", ["Clear Caches"]);
581
+ super.set("it->en", "Cache Ripulita", ["Cache Cleared"]);
582
+ super.set("it->en", "Ambiente di Produzione", ["Production Environment"]);
583
+ super.set("it->en", "È disponibile una nuova versione per l'applicazione corrente. Si suggerisce di ricaricare la pagina (CTRL + F5)", ["A new version is available for this application. It is suggested to reload this page (CTRL + F5)"]);
584
+ super.set("it->en", "Le informazioni di Sessione (Tenant/Account) sono cambiate a seguito di un login su modulo diverso utilizzando diverso Tenant/Utente sullo stesso browser. Si suggerisce di ricaricare la pagina (CTRL + F5)", ["Session informations (Tenant/Account) has changed after a login to a different module with the same Tenant/Username using the same browser. It is suggested to reload this page (CTRL + F5)"]);
585
+ super.set("it->en", "Cambia Modulo", ["Change module"]);
586
+ super.set("it->en", "Cambia Tenant", ["Change tenant"]);
587
+ super.set("it->en", "Usa notifiche semplici", ["Use simple alerts"]);
588
+ super.set("it->en", "Consenti notifiche eleganti", ["Allow fancy alerts"]);
589
+ super.set("it->en", "Ambiente di Sviluppo", ["Development Environment"]);
590
+ super.set("it->en", "Ambiente di Sviluppo A", ["Development Environment A"]);
591
+ super.set("it->en", "Ambiente di Sviluppo B", ["Development Environment B"]);
592
+ super.set("it->en", "Ripulisci le Preferenze Utente", ["Clear User Preferences"]);
593
+ super.set("it->en", "Preferenze utente ripulite", ["User preferences has been cleared"]);
594
+ super.set("it->en", "Ambiente di Staging", ["Staging Environment"]);
595
+ super.set("it->en", "Ambiente di Staging A", ["Staging A Environment"]);
596
+ super.set("it->en", "L'attuale sessione di lavoro non è più valida.<br>Si prega di eseguire nuovamente il login.", ["Current session has expired.<br>Please login back into the application."]);
597
+ super.set("it->en", "Notifiche", ["Notifications"]);
598
+ super.set("it->en", "Job Applicativi", ["Application Jobs"]);
599
+ super.set("it->en", "Al momento non c'è nulla in esecuzione", ["Nothing being executed at the moment"]);
600
+ super.set("it->en", "Job Completato", ["Job Completed"]);
601
+ super.set("it->en", "Scrivere almeno 3 caratteri per utilizzare la ricerca globale", ["You must write at least 3 characters in order to use the Global Research"]);
602
+ super.set("it->en", "Ripulisci la Cache di tutti", ["Clear Caches of everyone"]);
603
+ super.set("it->en", "Ripulisci le Preferenze di tutti", ["Clear Preferences of everyone"]);
604
+ }
605
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NavBarLoc, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
606
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NavBarLoc }); }
607
+ }
608
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NavBarLoc, decorators: [{
609
+ type: Injectable
610
+ }], ctorParameters: () => [{ type: i0.Injector }] });
611
611
 
612
- // Angular
613
- class ReactiveComponent {
614
- constructor() {
615
- this.Subscriptions = [];
616
- this.destroyed$ = new ReplaySubject(1);
617
- }
618
- // TODO: Check
619
- //takeUntilDestroyed = new pipe(() => takeUntil(this.destroyed$))
620
- ngOnDestroy() {
621
- this.destroyed$.next(true);
622
- this.destroyed$.complete();
623
- if (!this.Subscriptions)
624
- return;
625
- for (let i = 0; i < this.Subscriptions.length; i++)
626
- this.Subscriptions[i].unsubscribe();
627
- }
628
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ReactiveComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
629
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ReactiveComponent, selector: "ng-component", ngImport: i0, template: '', isInline: true }); }
630
- }
631
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ReactiveComponent, decorators: [{
632
- type: Component,
633
- args: [{ template: '' }]
612
+ // Angular
613
+ class ReactiveComponent {
614
+ constructor() {
615
+ this.Subscriptions = [];
616
+ this.destroyed$ = new ReplaySubject(1);
617
+ }
618
+ // TODO: Check
619
+ //takeUntilDestroyed = new pipe(() => takeUntil(this.destroyed$))
620
+ ngOnDestroy() {
621
+ this.destroyed$.next(true);
622
+ this.destroyed$.complete();
623
+ if (!this.Subscriptions)
624
+ return;
625
+ for (let i = 0; i < this.Subscriptions.length; i++)
626
+ this.Subscriptions[i].unsubscribe();
627
+ }
628
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ReactiveComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
629
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: ReactiveComponent, isStandalone: false, selector: "ng-component", ngImport: i0, template: '', isInline: true }); }
630
+ }
631
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ReactiveComponent, decorators: [{
632
+ type: Component,
633
+ args: [{
634
+ template: '',
635
+ standalone: false
636
+ }]
634
637
  }] });
635
638
 
636
- // Angular
637
- // Chiamate ai Repository
638
- const GET_Jace_GetActiveJaceModules = "/api/Jace/GetActiveJaceModules";
639
- const GET_Cache_ClearAllCaches = "/api/Cache/ClearAllCaches";
640
- const GET_Cache_ClearAllClientsCaches = "/api/Cache/ClearAllClientsCaches";
641
- const GET_Cache_ClearAllClientsPreferences = "/api/Cache/ClearAllClientsPreferences";
642
- class Navbar extends ReactiveComponent {
643
- constructor(prefsService, cacheService, MessageDef, notifications, msgExts, lc, http, cdr, _state, sr, router, cjrService, extensionComponents, loginUrlLegacy, fakeToken, ANONYMOUS_MODE) {
644
- super();
645
- this.prefsService = prefsService;
646
- this.cacheService = cacheService;
647
- this.MessageDef = MessageDef;
648
- this.notifications = notifications;
649
- this.msgExts = msgExts;
650
- this.lc = lc;
651
- this.http = http;
652
- this.cdr = cdr;
653
- this._state = _state;
654
- this.sr = sr;
655
- this.router = router;
656
- this.cjrService = cjrService;
657
- this.extensionComponents = extensionComponents;
658
- this.loginUrlLegacy = loginUrlLegacy;
659
- this.fakeToken = fakeToken;
660
- this.ANONYMOUS_MODE = ANONYMOUS_MODE;
661
- this.applicationVersion = myconfig.AppData.ComponentVersion;
662
- this.applicationEnvironment = myconfig.AppData.ComponentEnvironment;
663
- this.isMenuCollapsed = false;
664
- this.anomaliesProcessing = false;
665
- this.newVersionWarned = false;
666
- this._state.subscribe("menu.isCollapsed", (isCollapsed) => { this.isMenuCollapsed = isCollapsed; });
667
- this._state.subscribe("app.completedJob", (jobDescription) => {
668
- this.msgExts.simpleSuccess(this.lc.loc("Job Completato") + (jobDescription ? (": " + jobDescription) : ''), "toastr");
669
- this.cdr.markForCheck();
670
- });
671
- this._state.subscribe("app.startedJob", (_) => { this.cdr.markForCheck(); });
672
- this._state.subscribe("app.progressJob", (_) => { this.cdr.markForCheck(); });
673
- this.handleBaseNotifications();
674
- this.getActiveJaceModules();
675
- // Appena la pagina parte, poi ogni secondo, controllo l'identity per verificare se rimane la stessa
676
- interval(1000).pipe(startWith(0), takeUntil(this.destroyed$), takeWhile(_ => !myconfig.redirectInProgress)).subscribe(t => {
677
- this.checkIdentity();
678
- });
679
- }
680
- ngOnDestroy() {
681
- super.ngOnDestroy();
682
- //Quando viene distrutta la navbar devo distruggere anche il client di signalr perchè vuol dire che ho chiuso la pagina
683
- this.notifications.disconnect();
684
- }
685
- handleBaseNotifications() {
686
- this.notifications.send(this.MessageDef.OUT_QueryJobStatus, null);
687
- this.notifications.observe(this.MessageDef.IN_SendVersion).pipe(takeUntil(this.destroyed$)).subscribe((message) => {
688
- if (message != myconfig.AppData.ComponentVersion && !this.newVersionWarned) {
689
- this.msgExts.simpleWarning(this.lc.loc("È disponibile una nuova versione per l'applicazione corrente. Si suggerisce di ricaricare la pagina (CTRL + F5)"));
690
- this.newVersionWarned = true;
691
- }
692
- });
693
- this.notifications.observe(this.MessageDef.IN_ClearCache).pipe(takeUntil(this.destroyed$)).subscribe((message) => {
694
- this.clearCacheClient(false);
695
- });
696
- this.notifications.observe(this.MessageDef.IN_ClearPreferecnes).pipe(takeUntil(this.destroyed$)).subscribe((message) => {
697
- this.clearUserPreferences(false);
698
- });
699
- }
700
- checkIdentity() {
701
- let id = this.sr.getJaceIdentity();
702
- let idLast = this.CurrentIdentity;
703
- if (!id)
704
- return;
705
- this.checkSessionTimeout(id);
706
- if (this.CurrentIdentity && (id.IdAccount != idLast?.IdAccount || id.IdUser != idLast?.IdUser || id.Idtenant != idLast?.Idtenant)) {
707
- this.msgExts.simpleWarning(this.lc.loc("Le informazioni di Sessione (Tenant/Account) sono cambiate a seguito di un login su modulo diverso utilizzando diverso Tenant/Utente sullo stesso browser. Si suggerisce di ricaricare la pagina (CTRL + F5)"));
708
- this.cdr.markForCheck();
709
- }
710
- this.CurrentIdentity = id;
711
- }
712
- getActiveJaceModules() {
713
- if (this.fakeToken) {
714
- this.Modules = [new ActiveModuleView("Modulo Esempio 1"), new ActiveModuleView("Modulo Esempio 2"), new ActiveModuleView("Modulo Esempio 3")];
715
- this._state.Modules = this.Modules;
716
- return;
717
- }
718
- this.http.get(GET_Jace_GetActiveJaceModules).subscribe(res => {
719
- this.Modules = res;
720
- this._state.Modules = this.Modules;
721
- });
722
- }
723
- checkSessionTimeout(identity) {
724
- if (dayjs() >= dayjs(identity.ExpirationTime).subtract(10, 'minutes') && !myconfig.redirectInProgress) {
725
- myconfig.redirectInProgress = true;
726
- this.msgExts.expiredSessionMessage(this.lc.loc('Expired session'), this.lc.loc("L'attuale sessione di lavoro non è più valida.<br>Si prega di eseguire nuovamente il login."), () => {
727
- myconfig.redirectInProgress = false;
728
- console.log("checkSessionTimeout - redirecting to login");
729
- this.router.navigate(["login"]);
730
- });
731
- }
732
- }
733
- ngAfterViewInit() {
734
- this._state.setHeaderHeight(this.navbar.nativeElement.offsetHeight);
735
- }
736
- goToDashboard() {
737
- window.open(myconfig.JaceDashboardUrl, '_blank').focus();
738
- }
739
- toggleMenu() {
740
- this.isMenuCollapsed = !this.isMenuCollapsed;
741
- this._state.notifyDataChanged("menu.isCollapsed", this.isMenuCollapsed);
742
- }
743
- logout() {
744
- if (this.loginUrlLegacy)
745
- window.location.href = `${myconfig.AuthUrl}/logout?client=${myconfig.Client}`;
746
- else
747
- window.location.href = `${myconfig.AuthUrl}/#/logout;client=${myconfig.Client}`;
748
- }
749
- changeModule() {
750
- window.location.href = myconfig.JaceDashboardUrl;
751
- }
752
- changeTenant() {
753
- if (this.loginUrlLegacy)
754
- window.location.href = `${myconfig.AuthUrl}/login/tenant?client=${myconfig.Client}`;
755
- else
756
- window.location.href = `${myconfig.AuthUrl}/#/login;client=${myconfig.Client}`;
757
- }
758
- clearUserPreferences(warn = true) {
759
- this.prefsService.clear().subscribe();
760
- if (warn)
761
- this.msgExts.simpleSuccess(this.lc.loc("Preferenze utente ripulite"));
762
- else
763
- console.info("@esfaenza/core: Forceful preferecnes clear request received");
764
- }
765
- clearCacheClient(warn = true) {
766
- this.cacheService.clear().subscribe();
767
- this.http.resetHttpUntimedCacheStorage();
768
- this.http.resetHttpTimedCacheStorage();
769
- if (warn)
770
- this.msgExts.simpleSuccess(this.lc.loc("Cache Ripulita"));
771
- else
772
- console.info("@esfaenza/core: Forceful cache clear request received");
773
- }
774
- clearCacheServer() {
775
- this.http.get(GET_Cache_ClearAllCaches).subscribe(_ => {
776
- this.msgExts.simpleSuccess(this.lc.loc("Cache Ripulita"));
777
- });
778
- }
779
- clearAll() {
780
- this.cacheService.clear().subscribe();
781
- this.http.resetHttpUntimedCacheStorage();
782
- this.http.resetHttpTimedCacheStorage();
783
- this.http.get(GET_Cache_ClearAllCaches).subscribe(_ => {
784
- this.msgExts.simpleSuccess(this.lc.loc("Cache Ripulita"));
785
- });
786
- }
787
- forceClearConnectedClientAssets(muo) {
788
- if (muo == "cache") {
789
- this.http.get(GET_Cache_ClearAllClientsCaches).subscribe(_ => {
790
- this.msgExts.simpleSuccess(this.lc.loc("Cache Ripulita"));
791
- });
792
- }
793
- else if (muo == "preferences") {
794
- this.http.get(GET_Cache_ClearAllClientsPreferences).subscribe(_ => {
795
- this.msgExts.simpleSuccess(this.lc.loc("Preferenze utente ripulite"));
796
- });
797
- }
798
- }
799
- clearMessages() {
800
- this.msgExts.clearMessages();
801
- }
802
- completedJobClicked(job) {
803
- this.cjrService.redirect(job);
804
- }
805
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Navbar, deps: [{ token: i1$3.PreferencesService }, { token: i1$3.CacheService }, { token: i2$2.BaseMessageService }, { token: i2$2.NotificationsService }, { token: i4.MessageService }, { token: i1$2.LocalizationService }, { token: i2$1.HTTPService }, { token: i0.ChangeDetectorRef }, { token: i1.AppState }, { token: i1.TokenService }, { token: i1$1.Router }, { token: i1.CompletedJobRedirectionService }, { token: NAVBAR_EXTENSIONS }, { token: LOGIN_URL_LEGACY }, { token: USE_FAKE_ACCESS_TOKEN }, { token: ANONYMOUS_MODE }], target: i0.ɵɵFactoryTarget.Component }); }
806
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: Navbar, isStandalone: true, selector: "navbar", viewQueries: [{ propertyName: "navbar", first: true, predicate: ["navbar"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<nav #navbar class=\"nav enuma-navbar\">\r\n <div class=\"d-flex\" style=\"width: 100%;\">\r\n <!-- Collapse men\u00F9 a sinistra -->\r\n <div><a (click)=\"toggleMenu()\" class=\"far fa-bars nav-icon app-padding-left-15\" style=\"padding-top: 8px;\"></a></div>\r\n\r\n <!-- Breadcrumb -->\r\n <div class=\"app-padding-left-15\" style=\"padding-top: 8px;\"><ng-content></ng-content></div>\r\n\r\n <div style=\"margin-left: auto; display: flex;\">\r\n <!--Notifications (Jobs)-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <div *ngIf=\"_state.jobsInProgress > 0\" class=\"fa-beat-fade nav-jobs-icon-notification\"></div>\r\n <a [class.fa-shake]=\"_state.jobsInProgress > 0\" class=\"far fa-bell module-nav-menu-link dropdown-toggle app-pointer\" style=\"--fa-animation-duration: 3s; --fa-animation-iteration-count: 1;\" dropdownToggle></a>\r\n <ul *dropdownMenu class=\"nav-jobs-menu\" role=\"menu\">\r\n <div class=\"nav-jobs-menu-header\">\r\n <span style=\"margin-right: auto;\">{{'Job Applicativi' | localize : lc}}</span>\r\n <span class=\"app-margin-right-5\">{{'Notifiche' | localize : lc}}:</span>\r\n <span class=\"m-t-min-2\"><mat-slide-toggle [(ngModel)]=\"_state.notifyOnCompletedJobs\" (click)=\"clearMessages(); $event.stopPropagation();\"></mat-slide-toggle></span>\r\n </div>\r\n <div class=\"nav-jobs-menu-list\">\r\n <div *ngIf=\"_state.allJobs.length == 0\" class=\"nav-jobs-menu-list-empty\">\r\n <div>{{\"Al momento non c'\u00E8 nulla in esecuzione\" | localize : lc}}</div>\r\n </div>\r\n <div *ngFor=\"let job of _state.allJobs; let last = last\" [class.app-margin-bottom-5]=\"!last\">\r\n <span class=\"nav-jobs-menu-list-description\">\r\n <span *ngIf=\"!job.completed\" title=\"{{job.description}}\">{{job.smalldescription}}</span>\r\n <span *ngIf=\"job.completed\" title=\"{{job.description}}\" class=\"app-link app-no-selection app-inline app-pointer\" (click)=\"completedJobClicked(job); $event.stopPropagation();\">{{job.smalldescription}}</span>\r\n <strong class=\"pull-right\" *ngIf=\"!job.completed\">{{job.percentage}}%</strong>\r\n <strong class=\"pull-right\" *ngIf=\"job.completed\">{{'Completed' | localize : lc}}</strong>\r\n </span>\r\n <div class=\"progress progress-sm\">\r\n <progressbar *ngIf=\"!job.completed\" [max]=\"100\" [value]=\"job.percentage\" [striped]=\"true\" [animate]=\"true\"></progressbar>\r\n <progressbar *ngIf=\"job.completed\" type=\"success\" [max]=\"100\" [value]=\"100\" [striped]=\"false\" [animate]=\"false\"></progressbar>\r\n </div>\r\n </div>\r\n </div>\r\n </ul>\r\n </div>\r\n \r\n <!--Other Modules-->\r\n <div *ngIf=\"!ANONYMOUS_MODE\" class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <a class=\"far fa-cubes module-nav-menu-link dropdown-toggle app-pointer\" (click)=\"goToDashboard()\"></a>\r\n </div>\r\n\r\n <!--Quick Actions-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <a class=\"far fa-folder-gear module-nav-menu-link dropdown-toggle app-pointer\" dropdownToggle></a>\r\n <ul *dropdownMenu class=\"dropdown-menu dropdown-menu-right-user app-no-padding\" role=\"menu\">\r\n <li class=\"d-flex dropdown-title-bg\">\r\n <div class=\"dropdown-title\">Gestisci Cache Utente</div>\r\n </li>\r\n <li class=\"dropdown-top\"></li>\r\n <li class=\"dropdown-item app-pointer\" (click)=\"clearUserPreferences()\">\r\n <i class=\"far fa-user-times app-margin-right-10\"></i>{{'Ripulisci le Preferenze Utente' | localize : lc}}\r\n </li>\r\n <li class=\"dropdown-item app-pointer\" (click)=\"clearAll()\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci la Cache' | localize : lc}}\r\n </li>\r\n <li *ac=\"'R:Jace Admin'\" class=\"dropdown-item app-pointer\" (click)=\"forceClearConnectedClientAssets('cache')\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci la Cache di tutti' | localize : lc}}\r\n </li>\r\n <li *ac=\"'R:Jace Admin'\" class=\"dropdown-item app-pointer\" (click)=\"forceClearConnectedClientAssets('preferences')\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci le Preferenze di tutti' | localize : lc}}\r\n </li>\r\n <li class=\"dropdown-bot\"></li>\r\n </ul>\r\n </div>\r\n \r\n <!--Punti di estensione per Calendar, Chatroom e chi pi\u00F9 ne ha pi\u00F9 ne metta...-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" *ngFor=\"let comp of extensionComponents\">\r\n <ng-template [componentHost]=\"comp\"></ng-template>\r\n </div>\r\n </div>\r\n\r\n <!--Ambiente-->\r\n <div>\r\n <div class=\"nav-environment app-no-selection\">\r\n <ng-container *ngIf=\"['Dev', 2].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevA', 3].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevB', 4].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo B' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Stage', 5].includes(applicationEnvironment)\">{{'Ambiente di Staging' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['StageA', 6].includes(applicationEnvironment)\">{{'Ambiente di Staging A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Prod', 1].includes(applicationEnvironment)\">{{'Ambiente di Produzione' | localize : lc}}</ng-container>\r\n </div>\r\n </div>\r\n\r\n <!--Debugging ruoli e permessi-->\r\n <div [hidden]=\"true\">\r\n <div>Permissions:</div>\r\n <div *ngFor=\"let p of CurrentIdentity?.Permissions\">{{p}}</div>\r\n <div>Roles:</div>\r\n <div *ngFor=\"let r of CurrentIdentity?.Roles\">{{r}}</div>\r\n </div>\r\n </div>\r\n</nav>\r\n\r\n<!-- Template per l'icona dell'utente -->\r\n<ng-template #userIcon let-context>\r\n <img src='../assets/img/users/user.jpg' alt=\"user-img\" class=\"img-circle user-img\">\r\n <img src='../assets/img/events/christmas.png' alt=\"user-img\" class=\"img-circle user-img app-absolute app-right-0\" [style.right.px]=\"context?.right || undefined\" *ngIf=\"_state.christmasTime\">\r\n <img src='../assets/img/events/halloween.png' alt=\"user-img\" class=\"img-circle user-img app-absolute app-right-0\" [style.right.px]=\"context?.right || undefined\" *ngIf=\"_state.halloweenTime\">\r\n</ng-template>\r\n\r\n<!-- Template per le informaizoni di debug: Ambiente, ruoli, permessi ecc -->\r\n<ng-template #debugInfos>\r\n <div>{{CurrentIdentity?.FullName}} - ({{CurrentIdentity?.TenantName}})</div>\r\n <div hidden>{{applicationEnvironment}}</div>\r\n <div class=\"text-sm-center\">\r\n <ng-container *ngIf=\"['Dev', 2].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevA', 3].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevB', 4].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo B' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Stage', 5].includes(applicationEnvironment)\">{{'Ambiente di Staging' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['StageA', 6].includes(applicationEnvironment)\">{{'Ambiente di Staging A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Prod', 1].includes(applicationEnvironment)\">{{'Ambiente di Produzione' | localize : lc}}</ng-container>\r\n </div>\r\n <div [hidden]=\"true\">\r\n <div>Permissions:</div>\r\n <div *ngFor=\"let p of CurrentIdentity?.Permissions\">{{p}}</div>\r\n <div>Roles:</div>\r\n <div *ngFor=\"let r of CurrentIdentity?.Roles\">{{r}}</div>\r\n </div>\r\n</ng-template>", styles: [".nav-jobs-icon{position:absolute;left:-20px;margin:0;padding:0;top:10px;color:#fff!important;font-size:20px}.nav-jobs-icon-notification{top:7px;left:-7px;position:absolute;background-color:#0056b3;border-radius:50%;height:8px;width:8px}.nav-jobs-menu{width:350px;height:250px;background:#fff;margin:2px 0 0;padding:5px;border:1px solid #3e4d64}.nav-jobs-menu-header{background-color:#344154;padding:8px;font-size:14px;margin-top:-5px;margin-left:-5px;margin-right:-5px;display:flex}.nav-jobs-menu-header span{color:#fffc}.nav-jobs-menu-list{position:relative;overflow:auto;width:auto;height:203px;padding:5px}.nav-jobs-menu-list-description{font-size:13px;color:#666}.nav-jobs-menu-list-empty{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:15px;text-align:center}.user-menu{font-size:14px}.user-menu .dropdown-toggle:after{display:none}.user-menu .dropdown-menu{right:0;top:auto!important;left:auto!important;margin-top:10px;padding-top:0;overflow:hidden;border-radius:0;font-size:14px;box-shadow:0 6px 12px #0003;transform:none!important}.user-menu .dropdown-menu a{color:#024a88}.user-menu .dropdown-menu a:hover{color:#fff8a9;background-color:red}.user-menu .dropdown-menu a i{margin-right:8px}.navbar-help{font-size:20px!important;color:#ffffff80!important;border:1px solid rgba(255,255,255,.1);margin-left:5px!important;padding:5px 10px 2px 11px!important;border-radius:50%;background-color:#ffffff0d;cursor:pointer;width:31px;height:31px}.navbar-fill{margin-top:-5px;margin-bottom:-5px;margin-left:10px;width:calc(100% - 530px)}.navbar-fillable{width:calc(100% - 231px)}.navbar-floating-label{position:absolute;top:-9px;left:-5px;background:#242d3a;padding-left:5px;padding-right:5px;color:#ffffffe6!important}.module-nav-menu-link{color:#fff!important;font-size:20px;padding-top:8px;padding-right:5px;cursor:pointer}.module-board-menu{position:relative;top:1px;background-color:#1f1f1f;padding:15px}.dropdown-title-bg{background-color:#344154;border:1px solid #3e4d64;border-bottom:0px}.dropdown-title{color:#fff;margin:auto;padding:8px 0;font-size:18px}.dropdown-menu{background-color:#fff;border:none}.dropdown-divider{border-top:1px solid #eeeeee}.dropdown-item{background-color:#fff;color:#0056b3}.dropdown-item:hover{color:#004a9a!important;background-color:#eee}.dropdown-top{background-color:#fff;height:0;margin-bottom:.5rem;overflow:hidden;border-top:1px solid #eeeeee}.dropdown-bot{background-color:#fff;height:0;margin-top:.5rem;overflow:hidden;border-top:1px solid #eeeeee}.enuma-navbar{height:60px;align-items:center;background-color:#2a3544;box-shadow:0 8px 6px -6px #1313130a,0 12px 16px -16px #1313130d;margin-bottom:-1px;border-bottom:1px solid #191E29}.nav-environment{color:#fff;background-color:#3e4d64;text-align:center;padding:5px 10px;margin:2px 10px 0 0}.nav-icon{color:#fff!important;font-size:20px;cursor:pointer}.nav-right-section{position:absolute;right:10px;top:10px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i9.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i9.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i9.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ProgressbarModule }, { kind: "component", type: i11.ProgressbarComponent, selector: "progressbar", inputs: ["max", "animate", "striped", "type", "value"] }, { kind: "directive", type: ComponentHostDirective, selector: "[componentHost]", inputs: ["componentHost", "Inputs"] }, { kind: "ngmodule", type: EsTableModule }, { kind: "ngmodule", type: LocalizationModule }, { kind: "pipe", type: i1$2.LocalizePipe, name: "localize" }, { kind: "ngmodule", type: AccessControlModule }, { kind: "directive", type: i5.AccessControlDirective, selector: "[ac]", inputs: ["ac", "acAbsolute"] }], viewProviders: [{ provide: LocalizationService, useClass: NavBarLoc }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
807
- }
808
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Navbar, decorators: [{
809
- type: Component,
810
- args: [{ selector: "navbar", viewProviders: [{ provide: LocalizationService, useClass: NavBarLoc }], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FormsModule, BsDropdownModule, MatSlideToggleModule, NgIf, NgFor, ProgressbarModule, ComponentHostDirective, EsTableModule, LocalizationModule, AccessControlModule], template: "<nav #navbar class=\"nav enuma-navbar\">\r\n <div class=\"d-flex\" style=\"width: 100%;\">\r\n <!-- Collapse men\u00F9 a sinistra -->\r\n <div><a (click)=\"toggleMenu()\" class=\"far fa-bars nav-icon app-padding-left-15\" style=\"padding-top: 8px;\"></a></div>\r\n\r\n <!-- Breadcrumb -->\r\n <div class=\"app-padding-left-15\" style=\"padding-top: 8px;\"><ng-content></ng-content></div>\r\n\r\n <div style=\"margin-left: auto; display: flex;\">\r\n <!--Notifications (Jobs)-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <div *ngIf=\"_state.jobsInProgress > 0\" class=\"fa-beat-fade nav-jobs-icon-notification\"></div>\r\n <a [class.fa-shake]=\"_state.jobsInProgress > 0\" class=\"far fa-bell module-nav-menu-link dropdown-toggle app-pointer\" style=\"--fa-animation-duration: 3s; --fa-animation-iteration-count: 1;\" dropdownToggle></a>\r\n <ul *dropdownMenu class=\"nav-jobs-menu\" role=\"menu\">\r\n <div class=\"nav-jobs-menu-header\">\r\n <span style=\"margin-right: auto;\">{{'Job Applicativi' | localize : lc}}</span>\r\n <span class=\"app-margin-right-5\">{{'Notifiche' | localize : lc}}:</span>\r\n <span class=\"m-t-min-2\"><mat-slide-toggle [(ngModel)]=\"_state.notifyOnCompletedJobs\" (click)=\"clearMessages(); $event.stopPropagation();\"></mat-slide-toggle></span>\r\n </div>\r\n <div class=\"nav-jobs-menu-list\">\r\n <div *ngIf=\"_state.allJobs.length == 0\" class=\"nav-jobs-menu-list-empty\">\r\n <div>{{\"Al momento non c'\u00E8 nulla in esecuzione\" | localize : lc}}</div>\r\n </div>\r\n <div *ngFor=\"let job of _state.allJobs; let last = last\" [class.app-margin-bottom-5]=\"!last\">\r\n <span class=\"nav-jobs-menu-list-description\">\r\n <span *ngIf=\"!job.completed\" title=\"{{job.description}}\">{{job.smalldescription}}</span>\r\n <span *ngIf=\"job.completed\" title=\"{{job.description}}\" class=\"app-link app-no-selection app-inline app-pointer\" (click)=\"completedJobClicked(job); $event.stopPropagation();\">{{job.smalldescription}}</span>\r\n <strong class=\"pull-right\" *ngIf=\"!job.completed\">{{job.percentage}}%</strong>\r\n <strong class=\"pull-right\" *ngIf=\"job.completed\">{{'Completed' | localize : lc}}</strong>\r\n </span>\r\n <div class=\"progress progress-sm\">\r\n <progressbar *ngIf=\"!job.completed\" [max]=\"100\" [value]=\"job.percentage\" [striped]=\"true\" [animate]=\"true\"></progressbar>\r\n <progressbar *ngIf=\"job.completed\" type=\"success\" [max]=\"100\" [value]=\"100\" [striped]=\"false\" [animate]=\"false\"></progressbar>\r\n </div>\r\n </div>\r\n </div>\r\n </ul>\r\n </div>\r\n \r\n <!--Other Modules-->\r\n <div *ngIf=\"!ANONYMOUS_MODE\" class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <a class=\"far fa-cubes module-nav-menu-link dropdown-toggle app-pointer\" (click)=\"goToDashboard()\"></a>\r\n </div>\r\n\r\n <!--Quick Actions-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <a class=\"far fa-folder-gear module-nav-menu-link dropdown-toggle app-pointer\" dropdownToggle></a>\r\n <ul *dropdownMenu class=\"dropdown-menu dropdown-menu-right-user app-no-padding\" role=\"menu\">\r\n <li class=\"d-flex dropdown-title-bg\">\r\n <div class=\"dropdown-title\">Gestisci Cache Utente</div>\r\n </li>\r\n <li class=\"dropdown-top\"></li>\r\n <li class=\"dropdown-item app-pointer\" (click)=\"clearUserPreferences()\">\r\n <i class=\"far fa-user-times app-margin-right-10\"></i>{{'Ripulisci le Preferenze Utente' | localize : lc}}\r\n </li>\r\n <li class=\"dropdown-item app-pointer\" (click)=\"clearAll()\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci la Cache' | localize : lc}}\r\n </li>\r\n <li *ac=\"'R:Jace Admin'\" class=\"dropdown-item app-pointer\" (click)=\"forceClearConnectedClientAssets('cache')\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci la Cache di tutti' | localize : lc}}\r\n </li>\r\n <li *ac=\"'R:Jace Admin'\" class=\"dropdown-item app-pointer\" (click)=\"forceClearConnectedClientAssets('preferences')\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci le Preferenze di tutti' | localize : lc}}\r\n </li>\r\n <li class=\"dropdown-bot\"></li>\r\n </ul>\r\n </div>\r\n \r\n <!--Punti di estensione per Calendar, Chatroom e chi pi\u00F9 ne ha pi\u00F9 ne metta...-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" *ngFor=\"let comp of extensionComponents\">\r\n <ng-template [componentHost]=\"comp\"></ng-template>\r\n </div>\r\n </div>\r\n\r\n <!--Ambiente-->\r\n <div>\r\n <div class=\"nav-environment app-no-selection\">\r\n <ng-container *ngIf=\"['Dev', 2].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevA', 3].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevB', 4].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo B' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Stage', 5].includes(applicationEnvironment)\">{{'Ambiente di Staging' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['StageA', 6].includes(applicationEnvironment)\">{{'Ambiente di Staging A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Prod', 1].includes(applicationEnvironment)\">{{'Ambiente di Produzione' | localize : lc}}</ng-container>\r\n </div>\r\n </div>\r\n\r\n <!--Debugging ruoli e permessi-->\r\n <div [hidden]=\"true\">\r\n <div>Permissions:</div>\r\n <div *ngFor=\"let p of CurrentIdentity?.Permissions\">{{p}}</div>\r\n <div>Roles:</div>\r\n <div *ngFor=\"let r of CurrentIdentity?.Roles\">{{r}}</div>\r\n </div>\r\n </div>\r\n</nav>\r\n\r\n<!-- Template per l'icona dell'utente -->\r\n<ng-template #userIcon let-context>\r\n <img src='../assets/img/users/user.jpg' alt=\"user-img\" class=\"img-circle user-img\">\r\n <img src='../assets/img/events/christmas.png' alt=\"user-img\" class=\"img-circle user-img app-absolute app-right-0\" [style.right.px]=\"context?.right || undefined\" *ngIf=\"_state.christmasTime\">\r\n <img src='../assets/img/events/halloween.png' alt=\"user-img\" class=\"img-circle user-img app-absolute app-right-0\" [style.right.px]=\"context?.right || undefined\" *ngIf=\"_state.halloweenTime\">\r\n</ng-template>\r\n\r\n<!-- Template per le informaizoni di debug: Ambiente, ruoli, permessi ecc -->\r\n<ng-template #debugInfos>\r\n <div>{{CurrentIdentity?.FullName}} - ({{CurrentIdentity?.TenantName}})</div>\r\n <div hidden>{{applicationEnvironment}}</div>\r\n <div class=\"text-sm-center\">\r\n <ng-container *ngIf=\"['Dev', 2].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevA', 3].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevB', 4].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo B' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Stage', 5].includes(applicationEnvironment)\">{{'Ambiente di Staging' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['StageA', 6].includes(applicationEnvironment)\">{{'Ambiente di Staging A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Prod', 1].includes(applicationEnvironment)\">{{'Ambiente di Produzione' | localize : lc}}</ng-container>\r\n </div>\r\n <div [hidden]=\"true\">\r\n <div>Permissions:</div>\r\n <div *ngFor=\"let p of CurrentIdentity?.Permissions\">{{p}}</div>\r\n <div>Roles:</div>\r\n <div *ngFor=\"let r of CurrentIdentity?.Roles\">{{r}}</div>\r\n </div>\r\n</ng-template>", styles: [".nav-jobs-icon{position:absolute;left:-20px;margin:0;padding:0;top:10px;color:#fff!important;font-size:20px}.nav-jobs-icon-notification{top:7px;left:-7px;position:absolute;background-color:#0056b3;border-radius:50%;height:8px;width:8px}.nav-jobs-menu{width:350px;height:250px;background:#fff;margin:2px 0 0;padding:5px;border:1px solid #3e4d64}.nav-jobs-menu-header{background-color:#344154;padding:8px;font-size:14px;margin-top:-5px;margin-left:-5px;margin-right:-5px;display:flex}.nav-jobs-menu-header span{color:#fffc}.nav-jobs-menu-list{position:relative;overflow:auto;width:auto;height:203px;padding:5px}.nav-jobs-menu-list-description{font-size:13px;color:#666}.nav-jobs-menu-list-empty{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:15px;text-align:center}.user-menu{font-size:14px}.user-menu .dropdown-toggle:after{display:none}.user-menu .dropdown-menu{right:0;top:auto!important;left:auto!important;margin-top:10px;padding-top:0;overflow:hidden;border-radius:0;font-size:14px;box-shadow:0 6px 12px #0003;transform:none!important}.user-menu .dropdown-menu a{color:#024a88}.user-menu .dropdown-menu a:hover{color:#fff8a9;background-color:red}.user-menu .dropdown-menu a i{margin-right:8px}.navbar-help{font-size:20px!important;color:#ffffff80!important;border:1px solid rgba(255,255,255,.1);margin-left:5px!important;padding:5px 10px 2px 11px!important;border-radius:50%;background-color:#ffffff0d;cursor:pointer;width:31px;height:31px}.navbar-fill{margin-top:-5px;margin-bottom:-5px;margin-left:10px;width:calc(100% - 530px)}.navbar-fillable{width:calc(100% - 231px)}.navbar-floating-label{position:absolute;top:-9px;left:-5px;background:#242d3a;padding-left:5px;padding-right:5px;color:#ffffffe6!important}.module-nav-menu-link{color:#fff!important;font-size:20px;padding-top:8px;padding-right:5px;cursor:pointer}.module-board-menu{position:relative;top:1px;background-color:#1f1f1f;padding:15px}.dropdown-title-bg{background-color:#344154;border:1px solid #3e4d64;border-bottom:0px}.dropdown-title{color:#fff;margin:auto;padding:8px 0;font-size:18px}.dropdown-menu{background-color:#fff;border:none}.dropdown-divider{border-top:1px solid #eeeeee}.dropdown-item{background-color:#fff;color:#0056b3}.dropdown-item:hover{color:#004a9a!important;background-color:#eee}.dropdown-top{background-color:#fff;height:0;margin-bottom:.5rem;overflow:hidden;border-top:1px solid #eeeeee}.dropdown-bot{background-color:#fff;height:0;margin-top:.5rem;overflow:hidden;border-top:1px solid #eeeeee}.enuma-navbar{height:60px;align-items:center;background-color:#2a3544;box-shadow:0 8px 6px -6px #1313130a,0 12px 16px -16px #1313130d;margin-bottom:-1px;border-bottom:1px solid #191E29}.nav-environment{color:#fff;background-color:#3e4d64;text-align:center;padding:5px 10px;margin:2px 10px 0 0}.nav-icon{color:#fff!important;font-size:20px;cursor:pointer}.nav-right-section{position:absolute;right:10px;top:10px}\n"] }]
811
- }], ctorParameters: function () { return [{ type: i1$3.PreferencesService }, { type: i1$3.CacheService }, { type: i2$2.BaseMessageService }, { type: i2$2.NotificationsService }, { type: i4.MessageService }, { type: i1$2.LocalizationService }, { type: i2$1.HTTPService }, { type: i0.ChangeDetectorRef }, { type: i1.AppState }, { type: i1.TokenService }, { type: i1$1.Router }, { type: i1.CompletedJobRedirectionService }, { type: undefined, decorators: [{
812
- type: Inject,
813
- args: [NAVBAR_EXTENSIONS]
814
- }] }, { type: undefined, decorators: [{
815
- type: Inject,
816
- args: [LOGIN_URL_LEGACY]
817
- }] }, { type: undefined, decorators: [{
818
- type: Inject,
819
- args: [USE_FAKE_ACCESS_TOKEN]
820
- }] }, { type: undefined, decorators: [{
821
- type: Inject,
822
- args: [ANONYMOUS_MODE]
823
- }] }]; }, propDecorators: { navbar: [{
824
- type: ViewChild,
825
- args: ["navbar", { static: false }]
639
+ // Angular
640
+ // Chiamate ai Repository
641
+ const GET_Jace_GetActiveJaceModules = "/api/Jace/GetActiveJaceModules";
642
+ const GET_Cache_ClearAllCaches = "/api/Cache/ClearAllCaches";
643
+ const GET_Cache_ClearAllClientsCaches = "/api/Cache/ClearAllClientsCaches";
644
+ const GET_Cache_ClearAllClientsPreferences = "/api/Cache/ClearAllClientsPreferences";
645
+ class Navbar extends ReactiveComponent {
646
+ constructor(prefsService, cacheService, MessageDef, notifications, msgExts, lc, http, cdr, _state, sr, router, cjrService, extensionComponents, loginUrlLegacy, fakeToken, ANONYMOUS_MODE) {
647
+ super();
648
+ this.prefsService = prefsService;
649
+ this.cacheService = cacheService;
650
+ this.MessageDef = MessageDef;
651
+ this.notifications = notifications;
652
+ this.msgExts = msgExts;
653
+ this.lc = lc;
654
+ this.http = http;
655
+ this.cdr = cdr;
656
+ this._state = _state;
657
+ this.sr = sr;
658
+ this.router = router;
659
+ this.cjrService = cjrService;
660
+ this.extensionComponents = extensionComponents;
661
+ this.loginUrlLegacy = loginUrlLegacy;
662
+ this.fakeToken = fakeToken;
663
+ this.ANONYMOUS_MODE = ANONYMOUS_MODE;
664
+ this.applicationVersion = myconfig.AppData.ComponentVersion;
665
+ this.applicationEnvironment = myconfig.AppData.ComponentEnvironment;
666
+ this.isMenuCollapsed = false;
667
+ this.anomaliesProcessing = false;
668
+ this.newVersionWarned = false;
669
+ this._state.subscribe("menu.isCollapsed", (isCollapsed) => { this.isMenuCollapsed = isCollapsed; });
670
+ this._state.subscribe("app.completedJob", (jobDescription) => {
671
+ this.msgExts.simpleSuccess(this.lc.loc("Job Completato") + (jobDescription ? (": " + jobDescription) : ''), "toastr");
672
+ this.cdr.markForCheck();
673
+ });
674
+ this._state.subscribe("app.startedJob", (_) => { this.cdr.markForCheck(); });
675
+ this._state.subscribe("app.progressJob", (_) => { this.cdr.markForCheck(); });
676
+ this.handleBaseNotifications();
677
+ this.getActiveJaceModules();
678
+ // Appena la pagina parte, poi ogni secondo, controllo l'identity per verificare se rimane la stessa
679
+ interval(1000).pipe(startWith(0), takeUntil(this.destroyed$), takeWhile(_ => !myconfig.redirectInProgress)).subscribe(t => {
680
+ this.checkIdentity();
681
+ });
682
+ }
683
+ ngOnDestroy() {
684
+ super.ngOnDestroy();
685
+ //Quando viene distrutta la navbar devo distruggere anche il client di signalr perchè vuol dire che ho chiuso la pagina
686
+ this.notifications.disconnect();
687
+ }
688
+ handleBaseNotifications() {
689
+ this.notifications.send(this.MessageDef.OUT_QueryJobStatus, null);
690
+ this.notifications.observe(this.MessageDef.IN_SendVersion).pipe(takeUntil(this.destroyed$)).subscribe((message) => {
691
+ if (message != myconfig.AppData.ComponentVersion && !this.newVersionWarned) {
692
+ this.msgExts.simpleWarning(this.lc.loc("È disponibile una nuova versione per l'applicazione corrente. Si suggerisce di ricaricare la pagina (CTRL + F5)"));
693
+ this.newVersionWarned = true;
694
+ }
695
+ });
696
+ this.notifications.observe(this.MessageDef.IN_ClearCache).pipe(takeUntil(this.destroyed$)).subscribe((message) => {
697
+ this.clearCacheClient(false);
698
+ });
699
+ this.notifications.observe(this.MessageDef.IN_ClearPreferecnes).pipe(takeUntil(this.destroyed$)).subscribe((message) => {
700
+ this.clearUserPreferences(false);
701
+ });
702
+ }
703
+ checkIdentity() {
704
+ let id = this.sr.getJaceIdentity();
705
+ let idLast = this.CurrentIdentity;
706
+ if (!id)
707
+ return;
708
+ this.checkSessionTimeout(id);
709
+ if (this.CurrentIdentity && (id.IdAccount != idLast?.IdAccount || id.IdUser != idLast?.IdUser || id.Idtenant != idLast?.Idtenant)) {
710
+ this.msgExts.simpleWarning(this.lc.loc("Le informazioni di Sessione (Tenant/Account) sono cambiate a seguito di un login su modulo diverso utilizzando diverso Tenant/Utente sullo stesso browser. Si suggerisce di ricaricare la pagina (CTRL + F5)"));
711
+ this.cdr.markForCheck();
712
+ }
713
+ this.CurrentIdentity = id;
714
+ }
715
+ getActiveJaceModules() {
716
+ if (this.fakeToken) {
717
+ this.Modules = [new ActiveModuleView("Modulo Esempio 1"), new ActiveModuleView("Modulo Esempio 2"), new ActiveModuleView("Modulo Esempio 3")];
718
+ this._state.Modules = this.Modules;
719
+ return;
720
+ }
721
+ this.http.get(GET_Jace_GetActiveJaceModules).subscribe(res => {
722
+ this.Modules = res;
723
+ this._state.Modules = this.Modules;
724
+ });
725
+ }
726
+ checkSessionTimeout(identity) {
727
+ if (dayjs() >= dayjs(identity.ExpirationTime).subtract(10, 'minutes') && !myconfig.redirectInProgress) {
728
+ myconfig.redirectInProgress = true;
729
+ this.msgExts.expiredSessionMessage(this.lc.loc('Expired session'), this.lc.loc("L'attuale sessione di lavoro non è più valida.<br>Si prega di eseguire nuovamente il login."), () => {
730
+ myconfig.redirectInProgress = false;
731
+ console.log("checkSessionTimeout - redirecting to login");
732
+ this.router.navigate(["login"]);
733
+ });
734
+ }
735
+ }
736
+ ngAfterViewInit() {
737
+ this._state.setHeaderHeight(this.navbar.nativeElement.offsetHeight);
738
+ }
739
+ goToDashboard() {
740
+ window.open(myconfig.JaceDashboardUrl, '_blank').focus();
741
+ }
742
+ toggleMenu() {
743
+ this.isMenuCollapsed = !this.isMenuCollapsed;
744
+ this._state.notifyDataChanged("menu.isCollapsed", this.isMenuCollapsed);
745
+ }
746
+ logout() {
747
+ if (this.loginUrlLegacy)
748
+ window.location.href = `${myconfig.AuthUrl}/logout?client=${myconfig.Client}`;
749
+ else
750
+ window.location.href = `${myconfig.AuthUrl}/#/logout;client=${myconfig.Client}`;
751
+ }
752
+ changeModule() {
753
+ window.location.href = myconfig.JaceDashboardUrl;
754
+ }
755
+ changeTenant() {
756
+ if (this.loginUrlLegacy)
757
+ window.location.href = `${myconfig.AuthUrl}/login/tenant?client=${myconfig.Client}`;
758
+ else
759
+ window.location.href = `${myconfig.AuthUrl}/#/login;client=${myconfig.Client}`;
760
+ }
761
+ clearUserPreferences(warn = true) {
762
+ this.prefsService.clear().subscribe();
763
+ if (warn)
764
+ this.msgExts.simpleSuccess(this.lc.loc("Preferenze utente ripulite"));
765
+ else
766
+ console.info("@esfaenza/core: Forceful preferecnes clear request received");
767
+ }
768
+ clearCacheClient(warn = true) {
769
+ this.cacheService.clear().subscribe();
770
+ this.http.resetHttpUntimedCacheStorage();
771
+ this.http.resetHttpTimedCacheStorage();
772
+ if (warn)
773
+ this.msgExts.simpleSuccess(this.lc.loc("Cache Ripulita"));
774
+ else
775
+ console.info("@esfaenza/core: Forceful cache clear request received");
776
+ }
777
+ clearCacheServer() {
778
+ this.http.get(GET_Cache_ClearAllCaches).subscribe(_ => {
779
+ this.msgExts.simpleSuccess(this.lc.loc("Cache Ripulita"));
780
+ });
781
+ }
782
+ clearAll() {
783
+ this.cacheService.clear().subscribe();
784
+ this.http.resetHttpUntimedCacheStorage();
785
+ this.http.resetHttpTimedCacheStorage();
786
+ this.http.get(GET_Cache_ClearAllCaches).subscribe(_ => {
787
+ this.msgExts.simpleSuccess(this.lc.loc("Cache Ripulita"));
788
+ });
789
+ }
790
+ forceClearConnectedClientAssets(muo) {
791
+ if (muo == "cache") {
792
+ this.http.get(GET_Cache_ClearAllClientsCaches).subscribe(_ => {
793
+ this.msgExts.simpleSuccess(this.lc.loc("Cache Ripulita"));
794
+ });
795
+ }
796
+ else if (muo == "preferences") {
797
+ this.http.get(GET_Cache_ClearAllClientsPreferences).subscribe(_ => {
798
+ this.msgExts.simpleSuccess(this.lc.loc("Preferenze utente ripulite"));
799
+ });
800
+ }
801
+ }
802
+ clearMessages() {
803
+ this.msgExts.clearMessages();
804
+ }
805
+ completedJobClicked(job) {
806
+ this.cjrService.redirect(job);
807
+ }
808
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: Navbar, deps: [{ token: i1$3.PreferencesService }, { token: i1$3.CacheService }, { token: i2$2.BaseMessageService }, { token: i2$2.NotificationsService }, { token: i4.MessageService }, { token: i1$2.LocalizationService }, { token: i2$1.HTTPService }, { token: i0.ChangeDetectorRef }, { token: i1.AppState }, { token: i1.TokenService }, { token: i1$1.Router }, { token: i1.CompletedJobRedirectionService }, { token: NAVBAR_EXTENSIONS }, { token: LOGIN_URL_LEGACY }, { token: USE_FAKE_ACCESS_TOKEN }, { token: ANONYMOUS_MODE }], target: i0.ɵɵFactoryTarget.Component }); }
809
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: Navbar, isStandalone: true, selector: "navbar", viewQueries: [{ propertyName: "navbar", first: true, predicate: ["navbar"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<nav #navbar class=\"nav enuma-navbar\">\r\n <div class=\"d-flex\" style=\"width: 100%;\">\r\n <!-- Collapse men\u00F9 a sinistra -->\r\n <div><a (click)=\"toggleMenu()\" class=\"far fa-bars nav-icon app-padding-left-15\" style=\"padding-top: 8px;\"></a></div>\r\n\r\n <!-- Breadcrumb -->\r\n <div class=\"app-padding-left-15\" style=\"padding-top: 8px;\"><ng-content></ng-content></div>\r\n\r\n <div style=\"margin-left: auto; display: flex;\">\r\n <!--Notifications (Jobs)-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <div *ngIf=\"_state.jobsInProgress > 0\" class=\"fa-beat-fade nav-jobs-icon-notification\"></div>\r\n <a [class.fa-shake]=\"_state.jobsInProgress > 0\" class=\"far fa-bell module-nav-menu-link dropdown-toggle app-pointer\" style=\"--fa-animation-duration: 3s; --fa-animation-iteration-count: 1;\" dropdownToggle></a>\r\n <ul *dropdownMenu class=\"nav-jobs-menu\" role=\"menu\">\r\n <div class=\"nav-jobs-menu-header\">\r\n <span style=\"margin-right: auto;\">{{'Job Applicativi' | localize : lc}}</span>\r\n <span class=\"app-margin-right-5\">{{'Notifiche' | localize : lc}}:</span>\r\n <span class=\"m-t-min-2\"><mat-slide-toggle [(ngModel)]=\"_state.notifyOnCompletedJobs\" (click)=\"clearMessages(); $event.stopPropagation();\"></mat-slide-toggle></span>\r\n </div>\r\n <div class=\"nav-jobs-menu-list\">\r\n <div *ngIf=\"_state.allJobs.length == 0\" class=\"nav-jobs-menu-list-empty\">\r\n <div>{{\"Al momento non c'\u00E8 nulla in esecuzione\" | localize : lc}}</div>\r\n </div>\r\n <div *ngFor=\"let job of _state.allJobs; let last = last\" [class.app-margin-bottom-5]=\"!last\">\r\n <span class=\"nav-jobs-menu-list-description\">\r\n <span *ngIf=\"!job.completed\" title=\"{{job.description}}\">{{job.smalldescription}}</span>\r\n <span *ngIf=\"job.completed\" title=\"{{job.description}}\" class=\"app-link app-no-selection app-inline app-pointer\" (click)=\"completedJobClicked(job); $event.stopPropagation();\">{{job.smalldescription}}</span>\r\n <strong class=\"pull-right\" *ngIf=\"!job.completed\">{{job.percentage}}%</strong>\r\n <strong class=\"pull-right\" *ngIf=\"job.completed\">{{'Completed' | localize : lc}}</strong>\r\n </span>\r\n <div class=\"progress progress-sm\">\r\n <progressbar *ngIf=\"!job.completed\" [max]=\"100\" [value]=\"job.percentage\" [striped]=\"true\" [animate]=\"true\"></progressbar>\r\n <progressbar *ngIf=\"job.completed\" type=\"success\" [max]=\"100\" [value]=\"100\" [striped]=\"false\" [animate]=\"false\"></progressbar>\r\n </div>\r\n </div>\r\n </div>\r\n </ul>\r\n </div>\r\n \r\n <!--Other Modules-->\r\n <div *ngIf=\"!ANONYMOUS_MODE\" class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <a class=\"far fa-cubes module-nav-menu-link dropdown-toggle app-pointer\" (click)=\"goToDashboard()\"></a>\r\n </div>\r\n\r\n <!--Quick Actions-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <a class=\"far fa-folder-gear module-nav-menu-link dropdown-toggle app-pointer\" dropdownToggle></a>\r\n <ul *dropdownMenu class=\"dropdown-menu dropdown-menu-right-user app-no-padding\" role=\"menu\">\r\n <li class=\"d-flex dropdown-title-bg\">\r\n <div class=\"dropdown-title\">Gestisci Cache Utente</div>\r\n </li>\r\n <li class=\"dropdown-top\"></li>\r\n <li class=\"dropdown-item app-pointer\" (click)=\"clearUserPreferences()\">\r\n <i class=\"far fa-user-times app-margin-right-10\"></i>{{'Ripulisci le Preferenze Utente' | localize : lc}}\r\n </li>\r\n <li class=\"dropdown-item app-pointer\" (click)=\"clearAll()\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci la Cache' | localize : lc}}\r\n </li>\r\n <li *ac=\"'R:Jace Admin'\" class=\"dropdown-item app-pointer\" (click)=\"forceClearConnectedClientAssets('cache')\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci la Cache di tutti' | localize : lc}}\r\n </li>\r\n <li *ac=\"'R:Jace Admin'\" class=\"dropdown-item app-pointer\" (click)=\"forceClearConnectedClientAssets('preferences')\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci le Preferenze di tutti' | localize : lc}}\r\n </li>\r\n <li class=\"dropdown-bot\"></li>\r\n </ul>\r\n </div>\r\n \r\n <!--Punti di estensione per Calendar, Chatroom e chi pi\u00F9 ne ha pi\u00F9 ne metta...-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" *ngFor=\"let comp of extensionComponents\">\r\n <ng-template [componentHost]=\"comp\"></ng-template>\r\n </div>\r\n </div>\r\n\r\n <!--Ambiente-->\r\n <div>\r\n <div class=\"nav-environment app-no-selection\">\r\n <ng-container *ngIf=\"['Dev', 2].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevA', 3].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevB', 4].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo B' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Stage', 5].includes(applicationEnvironment)\">{{'Ambiente di Staging' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['StageA', 6].includes(applicationEnvironment)\">{{'Ambiente di Staging A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Prod', 1].includes(applicationEnvironment)\">{{'Ambiente di Produzione' | localize : lc}}</ng-container>\r\n </div>\r\n </div>\r\n\r\n <!--Debugging ruoli e permessi-->\r\n <div [hidden]=\"true\">\r\n <div>Permissions:</div>\r\n <div *ngFor=\"let p of CurrentIdentity?.Permissions\">{{p}}</div>\r\n <div>Roles:</div>\r\n <div *ngFor=\"let r of CurrentIdentity?.Roles\">{{r}}</div>\r\n </div>\r\n </div>\r\n</nav>\r\n\r\n<!-- Template per l'icona dell'utente -->\r\n<ng-template #userIcon let-context>\r\n <img src='../assets/img/users/user.jpg' alt=\"user-img\" class=\"img-circle user-img\">\r\n <img src='../assets/img/events/christmas.png' alt=\"user-img\" class=\"img-circle user-img app-absolute app-right-0\" [style.right.px]=\"context?.right || undefined\" *ngIf=\"_state.christmasTime\">\r\n <img src='../assets/img/events/halloween.png' alt=\"user-img\" class=\"img-circle user-img app-absolute app-right-0\" [style.right.px]=\"context?.right || undefined\" *ngIf=\"_state.halloweenTime\">\r\n</ng-template>\r\n\r\n<!-- Template per le informaizoni di debug: Ambiente, ruoli, permessi ecc -->\r\n<ng-template #debugInfos>\r\n <div>{{CurrentIdentity?.FullName}} - ({{CurrentIdentity?.TenantName}})</div>\r\n <div hidden>{{applicationEnvironment}}</div>\r\n <div class=\"text-sm-center\">\r\n <ng-container *ngIf=\"['Dev', 2].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevA', 3].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevB', 4].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo B' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Stage', 5].includes(applicationEnvironment)\">{{'Ambiente di Staging' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['StageA', 6].includes(applicationEnvironment)\">{{'Ambiente di Staging A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Prod', 1].includes(applicationEnvironment)\">{{'Ambiente di Produzione' | localize : lc}}</ng-container>\r\n </div>\r\n <div [hidden]=\"true\">\r\n <div>Permissions:</div>\r\n <div *ngFor=\"let p of CurrentIdentity?.Permissions\">{{p}}</div>\r\n <div>Roles:</div>\r\n <div *ngFor=\"let r of CurrentIdentity?.Roles\">{{r}}</div>\r\n </div>\r\n</ng-template>", styles: [".nav-jobs-icon{position:absolute;left:-20px;margin:0;padding:0;top:10px;color:#fff!important;font-size:20px}.nav-jobs-icon-notification{top:7px;left:-7px;position:absolute;background-color:#0056b3;border-radius:50%;height:8px;width:8px}.nav-jobs-menu{width:350px;height:250px;background:#fff;margin:2px 0 0;padding:5px;border:1px solid rgb(61.75,77.1875,99.75)}.nav-jobs-menu-header{background-color:#344154;padding:8px;font-size:14px;margin-top:-5px;margin-left:-5px;margin-right:-5px;display:flex}.nav-jobs-menu-header span{color:#fffc}.nav-jobs-menu-list{position:relative;overflow:auto;width:auto;height:203px;padding:5px}.nav-jobs-menu-list-description{font-size:13px;color:#666}.nav-jobs-menu-list-empty{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:15px;text-align:center}.user-menu{font-size:14px}.user-menu .dropdown-toggle:after{display:none}.user-menu .dropdown-menu{right:0;top:auto!important;left:auto!important;margin-top:10px;padding-top:0;overflow:hidden;border-radius:0;font-size:14px;box-shadow:0 6px 12px #0003;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.user-menu .dropdown-menu a{color:#024a88}.user-menu .dropdown-menu a:hover{color:#fff8a9;background-color:red}.user-menu .dropdown-menu a i{margin-right:8px}.navbar-help{font-size:20px!important;color:#ffffff80!important;border:1px solid rgba(255,255,255,.1);margin-left:5px!important;padding:5px 10px 2px 11px!important;border-radius:50%;background-color:#ffffff0d;cursor:pointer;width:31px;height:31px}.navbar-fill{margin-top:-5px;margin-bottom:-5px;margin-left:10px;width:calc(100% - 530px)}.navbar-fillable{width:calc(100% - 231px)}.navbar-floating-label{position:absolute;top:-9px;left:-5px;background:#242d3a;padding-left:5px;padding-right:5px;color:#ffffffe6!important}.module-nav-menu-link{color:#fff!important;font-size:20px;padding-top:8px;padding-right:5px;cursor:pointer}.module-board-menu{position:relative;top:1px;background-color:#1f1f1f;padding:15px}.dropdown-title-bg{background-color:#344154;border:1px solid rgb(61.75,77.1875,99.75);border-bottom:0px}.dropdown-title{color:#fff;margin:auto;padding:8px 0;font-size:18px}.dropdown-menu{background-color:#fff;border:none}.dropdown-divider{border-top:1px solid #eeeeee}.dropdown-item{background-color:#fff;color:#0056b3}.dropdown-item:hover{color:#004a9a!important;background-color:#eee}.dropdown-top{background-color:#fff;height:0;margin-bottom:.5rem;overflow:hidden;border-top:1px solid #eeeeee}.dropdown-bot{background-color:#fff;height:0;margin-top:.5rem;overflow:hidden;border-top:1px solid #eeeeee}.enuma-navbar{height:60px;align-items:center;background-color:#2a3544;box-shadow:0 8px 6px -6px #1313130a,0 12px 16px -16px #1313130d;margin-bottom:-1px;border-bottom:1px solid #191E29}.nav-environment{color:#fff;background-color:#3e4d64;text-align:center;padding:5px 10px;margin:2px 10px 0 0}.nav-icon{color:#fff!important;font-size:20px;cursor:pointer}.nav-right-section{position:absolute;right:10px;top:10px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: BsDropdownModule }, { kind: "directive", type: i9.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i9.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i9.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i10.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ProgressbarModule }, { kind: "component", type: i11.ProgressbarComponent, selector: "progressbar", inputs: ["max", "animate", "striped", "type", "value"] }, { kind: "directive", type: ComponentHostDirective, selector: "[componentHost]", inputs: ["componentHost", "Inputs"] }, { kind: "ngmodule", type: EsTableModule }, { kind: "ngmodule", type: LocalizationModule }, { kind: "pipe", type: i1$2.LocalizePipe, name: "localize" }, { kind: "ngmodule", type: AccessControlModule }, { kind: "directive", type: i5.AccessControlDirective, selector: "[ac]", inputs: ["ac", "acAbsolute"] }], viewProviders: [{ provide: LocalizationService, useClass: NavBarLoc }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
810
+ }
811
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: Navbar, decorators: [{
812
+ type: Component,
813
+ args: [{ selector: "navbar", viewProviders: [{ provide: LocalizationService, useClass: NavBarLoc }], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, BsDropdownModule, MatSlideToggleModule, NgIf, NgFor, ProgressbarModule, ComponentHostDirective, EsTableModule, LocalizationModule, AccessControlModule], template: "<nav #navbar class=\"nav enuma-navbar\">\r\n <div class=\"d-flex\" style=\"width: 100%;\">\r\n <!-- Collapse men\u00F9 a sinistra -->\r\n <div><a (click)=\"toggleMenu()\" class=\"far fa-bars nav-icon app-padding-left-15\" style=\"padding-top: 8px;\"></a></div>\r\n\r\n <!-- Breadcrumb -->\r\n <div class=\"app-padding-left-15\" style=\"padding-top: 8px;\"><ng-content></ng-content></div>\r\n\r\n <div style=\"margin-left: auto; display: flex;\">\r\n <!--Notifications (Jobs)-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <div *ngIf=\"_state.jobsInProgress > 0\" class=\"fa-beat-fade nav-jobs-icon-notification\"></div>\r\n <a [class.fa-shake]=\"_state.jobsInProgress > 0\" class=\"far fa-bell module-nav-menu-link dropdown-toggle app-pointer\" style=\"--fa-animation-duration: 3s; --fa-animation-iteration-count: 1;\" dropdownToggle></a>\r\n <ul *dropdownMenu class=\"nav-jobs-menu\" role=\"menu\">\r\n <div class=\"nav-jobs-menu-header\">\r\n <span style=\"margin-right: auto;\">{{'Job Applicativi' | localize : lc}}</span>\r\n <span class=\"app-margin-right-5\">{{'Notifiche' | localize : lc}}:</span>\r\n <span class=\"m-t-min-2\"><mat-slide-toggle [(ngModel)]=\"_state.notifyOnCompletedJobs\" (click)=\"clearMessages(); $event.stopPropagation();\"></mat-slide-toggle></span>\r\n </div>\r\n <div class=\"nav-jobs-menu-list\">\r\n <div *ngIf=\"_state.allJobs.length == 0\" class=\"nav-jobs-menu-list-empty\">\r\n <div>{{\"Al momento non c'\u00E8 nulla in esecuzione\" | localize : lc}}</div>\r\n </div>\r\n <div *ngFor=\"let job of _state.allJobs; let last = last\" [class.app-margin-bottom-5]=\"!last\">\r\n <span class=\"nav-jobs-menu-list-description\">\r\n <span *ngIf=\"!job.completed\" title=\"{{job.description}}\">{{job.smalldescription}}</span>\r\n <span *ngIf=\"job.completed\" title=\"{{job.description}}\" class=\"app-link app-no-selection app-inline app-pointer\" (click)=\"completedJobClicked(job); $event.stopPropagation();\">{{job.smalldescription}}</span>\r\n <strong class=\"pull-right\" *ngIf=\"!job.completed\">{{job.percentage}}%</strong>\r\n <strong class=\"pull-right\" *ngIf=\"job.completed\">{{'Completed' | localize : lc}}</strong>\r\n </span>\r\n <div class=\"progress progress-sm\">\r\n <progressbar *ngIf=\"!job.completed\" [max]=\"100\" [value]=\"job.percentage\" [striped]=\"true\" [animate]=\"true\"></progressbar>\r\n <progressbar *ngIf=\"job.completed\" type=\"success\" [max]=\"100\" [value]=\"100\" [striped]=\"false\" [animate]=\"false\"></progressbar>\r\n </div>\r\n </div>\r\n </div>\r\n </ul>\r\n </div>\r\n \r\n <!--Other Modules-->\r\n <div *ngIf=\"!ANONYMOUS_MODE\" class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <a class=\"far fa-cubes module-nav-menu-link dropdown-toggle app-pointer\" (click)=\"goToDashboard()\"></a>\r\n </div>\r\n\r\n <!--Quick Actions-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" dropdown container=\"body\" placement=\"bottom right\">\r\n <a class=\"far fa-folder-gear module-nav-menu-link dropdown-toggle app-pointer\" dropdownToggle></a>\r\n <ul *dropdownMenu class=\"dropdown-menu dropdown-menu-right-user app-no-padding\" role=\"menu\">\r\n <li class=\"d-flex dropdown-title-bg\">\r\n <div class=\"dropdown-title\">Gestisci Cache Utente</div>\r\n </li>\r\n <li class=\"dropdown-top\"></li>\r\n <li class=\"dropdown-item app-pointer\" (click)=\"clearUserPreferences()\">\r\n <i class=\"far fa-user-times app-margin-right-10\"></i>{{'Ripulisci le Preferenze Utente' | localize : lc}}\r\n </li>\r\n <li class=\"dropdown-item app-pointer\" (click)=\"clearAll()\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci la Cache' | localize : lc}}\r\n </li>\r\n <li *ac=\"'R:Jace Admin'\" class=\"dropdown-item app-pointer\" (click)=\"forceClearConnectedClientAssets('cache')\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci la Cache di tutti' | localize : lc}}\r\n </li>\r\n <li *ac=\"'R:Jace Admin'\" class=\"dropdown-item app-pointer\" (click)=\"forceClearConnectedClientAssets('preferences')\">\r\n <i class=\"far fa-broom-wide app-margin-right-10\"></i>{{'Ripulisci le Preferenze di tutti' | localize : lc}}\r\n </li>\r\n <li class=\"dropdown-bot\"></li>\r\n </ul>\r\n </div>\r\n \r\n <!--Punti di estensione per Calendar, Chatroom e chi pi\u00F9 ne ha pi\u00F9 ne metta...-->\r\n <div class=\"user-menu app-no-selection app-margin-right-15\" *ngFor=\"let comp of extensionComponents\">\r\n <ng-template [componentHost]=\"comp\"></ng-template>\r\n </div>\r\n </div>\r\n\r\n <!--Ambiente-->\r\n <div>\r\n <div class=\"nav-environment app-no-selection\">\r\n <ng-container *ngIf=\"['Dev', 2].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevA', 3].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevB', 4].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo B' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Stage', 5].includes(applicationEnvironment)\">{{'Ambiente di Staging' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['StageA', 6].includes(applicationEnvironment)\">{{'Ambiente di Staging A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Prod', 1].includes(applicationEnvironment)\">{{'Ambiente di Produzione' | localize : lc}}</ng-container>\r\n </div>\r\n </div>\r\n\r\n <!--Debugging ruoli e permessi-->\r\n <div [hidden]=\"true\">\r\n <div>Permissions:</div>\r\n <div *ngFor=\"let p of CurrentIdentity?.Permissions\">{{p}}</div>\r\n <div>Roles:</div>\r\n <div *ngFor=\"let r of CurrentIdentity?.Roles\">{{r}}</div>\r\n </div>\r\n </div>\r\n</nav>\r\n\r\n<!-- Template per l'icona dell'utente -->\r\n<ng-template #userIcon let-context>\r\n <img src='../assets/img/users/user.jpg' alt=\"user-img\" class=\"img-circle user-img\">\r\n <img src='../assets/img/events/christmas.png' alt=\"user-img\" class=\"img-circle user-img app-absolute app-right-0\" [style.right.px]=\"context?.right || undefined\" *ngIf=\"_state.christmasTime\">\r\n <img src='../assets/img/events/halloween.png' alt=\"user-img\" class=\"img-circle user-img app-absolute app-right-0\" [style.right.px]=\"context?.right || undefined\" *ngIf=\"_state.halloweenTime\">\r\n</ng-template>\r\n\r\n<!-- Template per le informaizoni di debug: Ambiente, ruoli, permessi ecc -->\r\n<ng-template #debugInfos>\r\n <div>{{CurrentIdentity?.FullName}} - ({{CurrentIdentity?.TenantName}})</div>\r\n <div hidden>{{applicationEnvironment}}</div>\r\n <div class=\"text-sm-center\">\r\n <ng-container *ngIf=\"['Dev', 2].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevA', 3].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['DevB', 4].includes(applicationEnvironment)\">{{'Ambiente di Sviluppo B' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Stage', 5].includes(applicationEnvironment)\">{{'Ambiente di Staging' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['StageA', 6].includes(applicationEnvironment)\">{{'Ambiente di Staging A' | localize : lc}}</ng-container>\r\n <ng-container *ngIf=\"['Prod', 1].includes(applicationEnvironment)\">{{'Ambiente di Produzione' | localize : lc}}</ng-container>\r\n </div>\r\n <div [hidden]=\"true\">\r\n <div>Permissions:</div>\r\n <div *ngFor=\"let p of CurrentIdentity?.Permissions\">{{p}}</div>\r\n <div>Roles:</div>\r\n <div *ngFor=\"let r of CurrentIdentity?.Roles\">{{r}}</div>\r\n </div>\r\n</ng-template>", styles: [".nav-jobs-icon{position:absolute;left:-20px;margin:0;padding:0;top:10px;color:#fff!important;font-size:20px}.nav-jobs-icon-notification{top:7px;left:-7px;position:absolute;background-color:#0056b3;border-radius:50%;height:8px;width:8px}.nav-jobs-menu{width:350px;height:250px;background:#fff;margin:2px 0 0;padding:5px;border:1px solid rgb(61.75,77.1875,99.75)}.nav-jobs-menu-header{background-color:#344154;padding:8px;font-size:14px;margin-top:-5px;margin-left:-5px;margin-right:-5px;display:flex}.nav-jobs-menu-header span{color:#fffc}.nav-jobs-menu-list{position:relative;overflow:auto;width:auto;height:203px;padding:5px}.nav-jobs-menu-list-description{font-size:13px;color:#666}.nav-jobs-menu-list-empty{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:15px;text-align:center}.user-menu{font-size:14px}.user-menu .dropdown-toggle:after{display:none}.user-menu .dropdown-menu{right:0;top:auto!important;left:auto!important;margin-top:10px;padding-top:0;overflow:hidden;border-radius:0;font-size:14px;box-shadow:0 6px 12px #0003;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.user-menu .dropdown-menu a{color:#024a88}.user-menu .dropdown-menu a:hover{color:#fff8a9;background-color:red}.user-menu .dropdown-menu a i{margin-right:8px}.navbar-help{font-size:20px!important;color:#ffffff80!important;border:1px solid rgba(255,255,255,.1);margin-left:5px!important;padding:5px 10px 2px 11px!important;border-radius:50%;background-color:#ffffff0d;cursor:pointer;width:31px;height:31px}.navbar-fill{margin-top:-5px;margin-bottom:-5px;margin-left:10px;width:calc(100% - 530px)}.navbar-fillable{width:calc(100% - 231px)}.navbar-floating-label{position:absolute;top:-9px;left:-5px;background:#242d3a;padding-left:5px;padding-right:5px;color:#ffffffe6!important}.module-nav-menu-link{color:#fff!important;font-size:20px;padding-top:8px;padding-right:5px;cursor:pointer}.module-board-menu{position:relative;top:1px;background-color:#1f1f1f;padding:15px}.dropdown-title-bg{background-color:#344154;border:1px solid rgb(61.75,77.1875,99.75);border-bottom:0px}.dropdown-title{color:#fff;margin:auto;padding:8px 0;font-size:18px}.dropdown-menu{background-color:#fff;border:none}.dropdown-divider{border-top:1px solid #eeeeee}.dropdown-item{background-color:#fff;color:#0056b3}.dropdown-item:hover{color:#004a9a!important;background-color:#eee}.dropdown-top{background-color:#fff;height:0;margin-bottom:.5rem;overflow:hidden;border-top:1px solid #eeeeee}.dropdown-bot{background-color:#fff;height:0;margin-top:.5rem;overflow:hidden;border-top:1px solid #eeeeee}.enuma-navbar{height:60px;align-items:center;background-color:#2a3544;box-shadow:0 8px 6px -6px #1313130a,0 12px 16px -16px #1313130d;margin-bottom:-1px;border-bottom:1px solid #191E29}.nav-environment{color:#fff;background-color:#3e4d64;text-align:center;padding:5px 10px;margin:2px 10px 0 0}.nav-icon{color:#fff!important;font-size:20px;cursor:pointer}.nav-right-section{position:absolute;right:10px;top:10px}\n"] }]
814
+ }], ctorParameters: () => [{ type: i1$3.PreferencesService }, { type: i1$3.CacheService }, { type: i2$2.BaseMessageService }, { type: i2$2.NotificationsService }, { type: i4.MessageService }, { type: i1$2.LocalizationService }, { type: i2$1.HTTPService }, { type: i0.ChangeDetectorRef }, { type: i1.AppState }, { type: i1.TokenService }, { type: i1$1.Router }, { type: i1.CompletedJobRedirectionService }, { type: undefined, decorators: [{
815
+ type: Inject,
816
+ args: [NAVBAR_EXTENSIONS]
817
+ }] }, { type: undefined, decorators: [{
818
+ type: Inject,
819
+ args: [LOGIN_URL_LEGACY]
820
+ }] }, { type: undefined, decorators: [{
821
+ type: Inject,
822
+ args: [USE_FAKE_ACCESS_TOKEN]
823
+ }] }, { type: undefined, decorators: [{
824
+ type: Inject,
825
+ args: [ANONYMOUS_MODE]
826
+ }] }], propDecorators: { navbar: [{
827
+ type: ViewChild,
828
+ args: ["navbar", { static: false }]
826
829
  }] } });
827
830
 
828
- // Angular
829
- class PagesComponent {
830
- constructor(sanitizer, _state, _location, router) {
831
- this.sanitizer = sanitizer;
832
- this._state = _state;
833
- this._location = _location;
834
- this.router = router;
835
- this.isMenuCollapsed = false;
836
- this.maxHeight = 0;
837
- this.dynamicCSSUrl = null;
838
- this.loadedModuleCss = "";
839
- this._state.subscribe("menu.isCollapsed", (isCollapsed) => {
840
- this.isMenuCollapsed = isCollapsed;
841
- });
842
- }
843
- ngOnInit() {
844
- this.getCurrentPageName();
845
- this.getHeight();
846
- }
847
- getCurrentPageName() {
848
- var url = this._location.path();
849
- setTimeout(function () {
850
- window.scrollTo(0, 0);
851
- jQuery('a[href="#' + url + '"]').closest("li").closest("ul").closest("li").addClass("sidebar-item-expanded");
852
- });
853
- }
854
- hideMenu() {
855
- this._state.notifyDataChanged("menu.isCollapsed", true);
856
- }
857
- getHeight() {
858
- var html = document.documentElement;
859
- this.maxHeight = html.clientHeight - 60;
860
- }
861
- onResize(event) {
862
- this.getHeight();
863
- }
864
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagesComponent, deps: [{ token: i3.DomSanitizer }, { token: i1.AppState }, { token: i2.Location }, { token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
865
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: PagesComponent, isStandalone: true, selector: "pages", host: { listeners: { "window:resize": "onResize($event)" } }, ngImport: i0, template: "<div class=\"pages-container\">\r\n <sidebar></sidebar>\r\n <div style=\"width: 100%;\">\r\n <navbar>\r\n <breadcrumb></breadcrumb>\r\n </navbar>\r\n <div class=\"main-wrapper\" [style.max-height.px]=\"maxHeight\" [ngClass]=\"{'menu-collapsed': isMenuCollapsed}\">\r\n <div class=\"az-overlay\" *ngIf=\"!isMenuCollapsed\" (click)=\"hideMenu()\"></div>\r\n <div class=\"main\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n <back-top [position]=\"200\"></back-top>\r\n </div>\r\n </div>\r\n</div>", styles: [".main-wrapper{padding:20px 40px;position:relative;width:calc(100vw - 230px);height:100%;overflow:auto}.main{height:100%;min-height:650px}.az-overlay{position:fixed;inset:0;z-index:8;background:#242d3a33;width:100%;height:100%;display:none}.pages-container{height:100vh;width:100vw;display:flex}@media (max-width: 544px){.main-wrapper,.main-wrapper.menu-collapsed{margin-left:0;padding:30px 20px}.az-overlay{display:block}.footer .footer-main,.footer .created{float:none}}@media (min-width: 544px) and (max-width: 768px){.az-overlay{display:block}}\n"], dependencies: [{ kind: "component", type: Navbar, selector: "navbar" }, { kind: "component", type: Sidebar, selector: "sidebar" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: Breadcrumb, selector: "breadcrumb" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: BackTop, selector: "back-top", inputs: ["position", "showSpeed", "moveSpeed"] }], encapsulation: i0.ViewEncapsulation.None }); }
866
- }
867
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: PagesComponent, decorators: [{
868
- type: Component,
869
- args: [{ selector: "pages", encapsulation: ViewEncapsulation.None, standalone: true, imports: [Navbar, Sidebar, NgClass, NgIf, Breadcrumb, RouterOutlet, BackTop], template: "<div class=\"pages-container\">\r\n <sidebar></sidebar>\r\n <div style=\"width: 100%;\">\r\n <navbar>\r\n <breadcrumb></breadcrumb>\r\n </navbar>\r\n <div class=\"main-wrapper\" [style.max-height.px]=\"maxHeight\" [ngClass]=\"{'menu-collapsed': isMenuCollapsed}\">\r\n <div class=\"az-overlay\" *ngIf=\"!isMenuCollapsed\" (click)=\"hideMenu()\"></div>\r\n <div class=\"main\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n <back-top [position]=\"200\"></back-top>\r\n </div>\r\n </div>\r\n</div>", styles: [".main-wrapper{padding:20px 40px;position:relative;width:calc(100vw - 230px);height:100%;overflow:auto}.main{height:100%;min-height:650px}.az-overlay{position:fixed;inset:0;z-index:8;background:#242d3a33;width:100%;height:100%;display:none}.pages-container{height:100vh;width:100vw;display:flex}@media (max-width: 544px){.main-wrapper,.main-wrapper.menu-collapsed{margin-left:0;padding:30px 20px}.az-overlay{display:block}.footer .footer-main,.footer .created{float:none}}@media (min-width: 544px) and (max-width: 768px){.az-overlay{display:block}}\n"] }]
870
- }], ctorParameters: function () { return [{ type: i3.DomSanitizer }, { type: i1.AppState }, { type: i2.Location }, { type: i1$1.Router }]; }, propDecorators: { onResize: [{
871
- type: HostListener,
872
- args: ['window:resize', ['$event']]
831
+ // Angular
832
+ class PagesComponent {
833
+ constructor(sanitizer, _state, _location, router) {
834
+ this.sanitizer = sanitizer;
835
+ this._state = _state;
836
+ this._location = _location;
837
+ this.router = router;
838
+ this.isMenuCollapsed = false;
839
+ this.maxHeight = 0;
840
+ this.dynamicCSSUrl = null;
841
+ this.loadedModuleCss = "";
842
+ this._state.subscribe("menu.isCollapsed", (isCollapsed) => {
843
+ this.isMenuCollapsed = isCollapsed;
844
+ });
845
+ }
846
+ ngOnInit() {
847
+ this.getCurrentPageName();
848
+ this.getHeight();
849
+ }
850
+ getCurrentPageName() {
851
+ var url = this._location.path();
852
+ setTimeout(function () {
853
+ window.scrollTo(0, 0);
854
+ jQuery('a[href="#' + url + '"]').closest("li").closest("ul").closest("li").addClass("sidebar-item-expanded");
855
+ });
856
+ }
857
+ hideMenu() {
858
+ this._state.notifyDataChanged("menu.isCollapsed", true);
859
+ }
860
+ getHeight() {
861
+ var html = document.documentElement;
862
+ this.maxHeight = html.clientHeight - 60;
863
+ }
864
+ onResize(event) {
865
+ this.getHeight();
866
+ }
867
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PagesComponent, deps: [{ token: i3.DomSanitizer }, { token: i1.AppState }, { token: i2.Location }, { token: i1$1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
868
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: PagesComponent, isStandalone: true, selector: "pages", host: { listeners: { "window:resize": "onResize($event)" } }, ngImport: i0, template: "<div class=\"pages-container\">\r\n <sidebar></sidebar>\r\n <div style=\"width: 100%;\">\r\n <navbar>\r\n <breadcrumb></breadcrumb>\r\n </navbar>\r\n <div class=\"main-wrapper\" [style.max-height.px]=\"maxHeight\" [ngClass]=\"{'menu-collapsed': isMenuCollapsed}\">\r\n <div class=\"az-overlay\" *ngIf=\"!isMenuCollapsed\" (click)=\"hideMenu()\"></div>\r\n <div class=\"main\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n <back-top [position]=\"200\"></back-top>\r\n </div>\r\n </div>\r\n</div>", styles: [".main-wrapper{padding:20px 40px;position:relative;width:calc(100vw - 230px);height:100%;overflow:auto}.main{height:100%;min-height:650px}.az-overlay{position:fixed;inset:0;z-index:8;background:#242d3a33;width:100%;height:100%;display:none}.pages-container{height:100vh;width:100vw;display:flex}@media (max-width: 544px){.main-wrapper,.main-wrapper.menu-collapsed{margin-left:0;padding:30px 20px}.az-overlay{display:block}.footer .footer-main,.footer .created{float:none}}@media (min-width: 544px) and (max-width: 768px){.az-overlay{display:block}}\n"], dependencies: [{ kind: "component", type: Navbar, selector: "navbar" }, { kind: "component", type: Sidebar, selector: "sidebar" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: Breadcrumb, selector: "breadcrumb" }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: BackTop, selector: "back-top", inputs: ["position", "showSpeed", "moveSpeed"] }], encapsulation: i0.ViewEncapsulation.None }); }
869
+ }
870
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PagesComponent, decorators: [{
871
+ type: Component,
872
+ args: [{ selector: "pages", encapsulation: ViewEncapsulation.None, imports: [Navbar, Sidebar, NgClass, NgIf, Breadcrumb, RouterOutlet, BackTop], template: "<div class=\"pages-container\">\r\n <sidebar></sidebar>\r\n <div style=\"width: 100%;\">\r\n <navbar>\r\n <breadcrumb></breadcrumb>\r\n </navbar>\r\n <div class=\"main-wrapper\" [style.max-height.px]=\"maxHeight\" [ngClass]=\"{'menu-collapsed': isMenuCollapsed}\">\r\n <div class=\"az-overlay\" *ngIf=\"!isMenuCollapsed\" (click)=\"hideMenu()\"></div>\r\n <div class=\"main\">\r\n <router-outlet></router-outlet>\r\n </div>\r\n <back-top [position]=\"200\"></back-top>\r\n </div>\r\n </div>\r\n</div>", styles: [".main-wrapper{padding:20px 40px;position:relative;width:calc(100vw - 230px);height:100%;overflow:auto}.main{height:100%;min-height:650px}.az-overlay{position:fixed;inset:0;z-index:8;background:#242d3a33;width:100%;height:100%;display:none}.pages-container{height:100vh;width:100vw;display:flex}@media (max-width: 544px){.main-wrapper,.main-wrapper.menu-collapsed{margin-left:0;padding:30px 20px}.az-overlay{display:block}.footer .footer-main,.footer .created{float:none}}@media (min-width: 544px) and (max-width: 768px){.az-overlay{display:block}}\n"] }]
873
+ }], ctorParameters: () => [{ type: i3.DomSanitizer }, { type: i1.AppState }, { type: i2.Location }, { type: i1$1.Router }], propDecorators: { onResize: [{
874
+ type: HostListener,
875
+ args: ['window:resize', ['$event']]
873
876
  }] } });
874
877
 
875
- // Angular
876
- class ExternalPagesComponent {
877
- constructor(aac, lc, http, _state, route, bts) {
878
- this.aac = aac;
879
- this.lc = lc;
880
- this.http = http;
881
- this._state = _state;
882
- this.route = route;
883
- this.bts = bts;
884
- this.Username = "";
885
- this.Password = "";
886
- this.Tenant = "";
887
- this.Username = this.route.snapshot.params["user"];
888
- this.Password = this.route.snapshot.params["pswd"];
889
- this.Tenant = this.route.snapshot.params["tnt"];
890
- }
891
- ngOnInit() {
892
- console.log("Caricamento pagina nell'IFRAME completato!");
893
- console.log("[" + this.Tenant + "]" + this.Username + " - " + this.Password);
894
- // Le info di login che ho passato sono le stesse delle info di login salvate nel token --> È un redirect da un sito esterno ma il token c'è già. Esco
895
- // Ho un token di login e non ho nessuna info sull'utente da usare --> È un redirect da Jace, quindi sono a posto. Esco
896
- let currentIdentity = this.bts.getJaceIdentity();
897
- if ((!(this.Tenant + this.Username + this.Password) || currentIdentity.Idtenant == this.Tenant && currentIdentity.DsUser == this.Username)) {
898
- this.aac.initializeIdentity(currentIdentity);
899
- return;
900
- }
901
- // Altrimenti devo effettuare il login
902
- // Non è utilizzata, porcoddinci
903
- let LoginDTO = { tenant: "FX", username: this.Username, password: this.Password, client_id: "jacedev" };
904
- this.http.post(`${myconfig.AuthUrl}/api/login/dologin`, LoginDTO).subscribe(t => {
905
- });
906
- }
907
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ExternalPagesComponent, deps: [{ token: i5.AccessControlService }, { token: i1$2.LocalizationService }, { token: i2$1.HTTPService }, { token: i1.AppState }, { token: i1$1.ActivatedRoute }, { token: i1.TokenService }], target: i0.ɵɵFactoryTarget.Component }); }
908
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: ExternalPagesComponent, isStandalone: true, selector: "external-pages", ngImport: i0, template: "<router-outlet></router-outlet>", dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
909
- }
910
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ExternalPagesComponent, decorators: [{
911
- type: Component,
912
- args: [{ selector: "external-pages", standalone: true, imports: [RouterOutlet], template: "<router-outlet></router-outlet>" }]
913
- }], ctorParameters: function () { return [{ type: i5.AccessControlService }, { type: i1$2.LocalizationService }, { type: i2$1.HTTPService }, { type: i1.AppState }, { type: i1$1.ActivatedRoute }, { type: i1.TokenService }]; } });
878
+ // Angular
879
+ class ExternalPagesComponent {
880
+ constructor(aac, lc, http, _state, route, bts) {
881
+ this.aac = aac;
882
+ this.lc = lc;
883
+ this.http = http;
884
+ this._state = _state;
885
+ this.route = route;
886
+ this.bts = bts;
887
+ this.Username = "";
888
+ this.Password = "";
889
+ this.Tenant = "";
890
+ this.Username = this.route.snapshot.params["user"];
891
+ this.Password = this.route.snapshot.params["pswd"];
892
+ this.Tenant = this.route.snapshot.params["tnt"];
893
+ }
894
+ ngOnInit() {
895
+ console.log("Caricamento pagina nell'IFRAME completato!");
896
+ console.log("[" + this.Tenant + "]" + this.Username + " - " + this.Password);
897
+ // Le info di login che ho passato sono le stesse delle info di login salvate nel token --> È un redirect da un sito esterno ma il token c'è già. Esco
898
+ // Ho un token di login e non ho nessuna info sull'utente da usare --> È un redirect da Jace, quindi sono a posto. Esco
899
+ let currentIdentity = this.bts.getJaceIdentity();
900
+ if ((!(this.Tenant + this.Username + this.Password) || currentIdentity.Idtenant == this.Tenant && currentIdentity.DsUser == this.Username)) {
901
+ this.aac.initializeIdentity(currentIdentity);
902
+ return;
903
+ }
904
+ // Altrimenti devo effettuare il login
905
+ // Non è utilizzata, porcoddinci
906
+ let LoginDTO = { tenant: "FX", username: this.Username, password: this.Password, client_id: "jacedev" };
907
+ this.http.post(`${myconfig.AuthUrl}/api/login/dologin`, LoginDTO).subscribe(t => {
908
+ });
909
+ }
910
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ExternalPagesComponent, deps: [{ token: i5.AccessControlService }, { token: i1$2.LocalizationService }, { token: i2$1.HTTPService }, { token: i1.AppState }, { token: i1$1.ActivatedRoute }, { token: i1.TokenService }], target: i0.ɵɵFactoryTarget.Component }); }
911
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: ExternalPagesComponent, isStandalone: true, selector: "external-pages", ngImport: i0, template: "<router-outlet></router-outlet>", dependencies: [{ kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] }); }
912
+ }
913
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ExternalPagesComponent, decorators: [{
914
+ type: Component,
915
+ args: [{ selector: "external-pages", imports: [RouterOutlet], template: "<router-outlet></router-outlet>" }]
916
+ }], ctorParameters: () => [{ type: i5.AccessControlService }, { type: i1$2.LocalizationService }, { type: i2$1.HTTPService }, { type: i1.AppState }, { type: i1$1.ActivatedRoute }, { type: i1.TokenService }] });
914
917
 
915
- // Angular
916
- class JaceLoginComponent {
917
- constructor(loginUrlLegacy) {
918
- this.loginUrlLegacy = loginUrlLegacy;
919
- }
920
- ngOnInit() {
921
- if (myconfig.AuthUrl) {
922
- if (this.loginUrlLegacy)
923
- window.location.href = `${myconfig.AuthUrl}/login/form?client=${myconfig.Client}`;
924
- else {
925
- // logout ripulisce il token e risbatte al login
926
- window.location.href = `${myconfig.AuthUrl}/#/logout;client=${myconfig.Client}`;
927
- }
928
- }
929
- else
930
- console.error("myconfig.AuthUrl is not provided");
931
- }
932
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JaceLoginComponent, deps: [{ token: LOGIN_URL_LEGACY }], target: i0.ɵɵFactoryTarget.Component }); }
933
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: JaceLoginComponent, isStandalone: true, selector: "login", ngImport: i0, template: "<div class=\"login-container\">\r\n <div class=\"redirecting-div\">\r\n <div class=\"redirecting-message\"><h1>Redirecting to login...</h1></div>\r\n <div class=\"signal\"></div>\r\n </div>\r\n</div>\r\n", styles: [".redirecting-div{background:#3d3d3d!important;display:flex;align-items:center;justify-content:center;min-height:100vh}.redirecting-div h1{color:#fbc925;font-family:Passion One}.redirecting-message{align-self:center}\n"], encapsulation: i0.ViewEncapsulation.None }); }
934
- }
935
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JaceLoginComponent, decorators: [{
936
- type: Component,
937
- args: [{ selector: "login", encapsulation: ViewEncapsulation.None, standalone: true, template: "<div class=\"login-container\">\r\n <div class=\"redirecting-div\">\r\n <div class=\"redirecting-message\"><h1>Redirecting to login...</h1></div>\r\n <div class=\"signal\"></div>\r\n </div>\r\n</div>\r\n", styles: [".redirecting-div{background:#3d3d3d!important;display:flex;align-items:center;justify-content:center;min-height:100vh}.redirecting-div h1{color:#fbc925;font-family:Passion One}.redirecting-message{align-self:center}\n"] }]
938
- }], ctorParameters: function () { return [{ type: undefined, decorators: [{
939
- type: Inject,
940
- args: [LOGIN_URL_LEGACY]
941
- }] }]; } });
918
+ // Angular
919
+ class JaceLoginComponent {
920
+ constructor(loginUrlLegacy) {
921
+ this.loginUrlLegacy = loginUrlLegacy;
922
+ }
923
+ ngOnInit() {
924
+ if (myconfig.AuthUrl) {
925
+ if (this.loginUrlLegacy)
926
+ window.location.href = `${myconfig.AuthUrl}/login/form?client=${myconfig.Client}`;
927
+ else {
928
+ // logout ripulisce il token e risbatte al login
929
+ window.location.href = `${myconfig.AuthUrl}/#/logout;client=${myconfig.Client}`;
930
+ }
931
+ }
932
+ else
933
+ console.error("myconfig.AuthUrl is not provided");
934
+ }
935
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JaceLoginComponent, deps: [{ token: LOGIN_URL_LEGACY }], target: i0.ɵɵFactoryTarget.Component }); }
936
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: JaceLoginComponent, isStandalone: true, selector: "login", ngImport: i0, template: "<div class=\"login-container\">\r\n <div class=\"redirecting-div\">\r\n <div class=\"redirecting-message\"><h1>Redirecting to login...</h1></div>\r\n <div class=\"signal\"></div>\r\n </div>\r\n</div>\r\n", styles: [".redirecting-div{background:#3d3d3d!important;display:flex;align-items:center;justify-content:center;min-height:100vh}.redirecting-div h1{color:#fbc925;font-family:Passion One}.redirecting-message{align-self:center}\n"], encapsulation: i0.ViewEncapsulation.None }); }
937
+ }
938
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JaceLoginComponent, decorators: [{
939
+ type: Component,
940
+ args: [{ selector: "login", encapsulation: ViewEncapsulation.None, standalone: true, template: "<div class=\"login-container\">\r\n <div class=\"redirecting-div\">\r\n <div class=\"redirecting-message\"><h1>Redirecting to login...</h1></div>\r\n <div class=\"signal\"></div>\r\n </div>\r\n</div>\r\n", styles: [".redirecting-div{background:#3d3d3d!important;display:flex;align-items:center;justify-content:center;min-height:100vh}.redirecting-div h1{color:#fbc925;font-family:Passion One}.redirecting-message{align-self:center}\n"] }]
941
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
942
+ type: Inject,
943
+ args: [LOGIN_URL_LEGACY]
944
+ }] }] });
942
945
 
943
- // Angular
944
- class RedirecterComponent {
945
- constructor(_state, route, router, redirectMap, emb) {
946
- this._state = _state;
947
- this.route = route;
948
- this.router = router;
949
- this.redirectMap = redirectMap;
950
- this.emb = emb;
951
- this.Error = "";
952
- this.wrongTenant = false;
953
- this.tenant = route.snapshot.params["tenant"];
954
- if (this.tenant && this._state.getJaceIDentity().Idtenant != this.tenant) {
955
- console.error("tenant mismatch in redirector");
956
- this.router.navigate(["login"]);
957
- this.wrongTenant = true;
958
- }
959
- }
960
- ngOnInit() {
961
- if (this.wrongTenant)
962
- return;
963
- let url = this.route.snapshot.params["url"];
964
- //§ = 167... non so perché ma scrivendolo esplicitamente non funziona
965
- let parts = url.includes(String.fromCharCode(167)) ? url.split(String.fromCharCode(167)).filter(s => !!s) : url.split('+').filter(s => !!s);
966
- if (parts.length < 2) {
967
- this.Error = "L'url passato è incompleto. Impossibile riconoscerlo";
968
- return;
969
- }
970
- else {
971
- var redirectItem = this.redirectMap[parts[0]];
972
- if (!redirectItem) {
973
- this.Error = "L'url passato fa riferimento a un oggetto non navigabile. Impossibile procedere";
974
- return;
975
- }
976
- if (redirectItem.params.length != parts.length - 1) {
977
- this.Error = "Il numero di parametri richiesti per navigare all'entità richiesta è diverso dal numero di parametri passato";
978
- return;
979
- }
980
- let url = (this.emb.Embedded ? "pages_ext/" : "pages/") + redirectItem.url;
981
- let parObject = {};
982
- redirectItem.params.forEach((t, i) => parObject[t] = parts[i + 1]);
983
- console.log(`Navigating to ${url} with the current parameters: ${JSON.stringify(parObject)}`);
984
- this.router.navigate([url, parObject]);
985
- }
986
- }
987
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RedirecterComponent, deps: [{ token: i1.AppState }, { token: i1$1.ActivatedRoute }, { token: i1$1.Router }, { token: REDIRECT_MAP, optional: true }, { token: i4.AppEmbeddingExtensions }], target: i0.ɵɵFactoryTarget.Component }); }
988
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: RedirecterComponent, isStandalone: true, selector: "redirecter", ngImport: i0, template: "<div *ngIf=\"Error\">{{Error}}</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
989
- }
990
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: RedirecterComponent, decorators: [{
991
- type: Component,
992
- args: [{ selector: "redirecter", encapsulation: ViewEncapsulation.None, standalone: true, imports: [NgIf], template: "<div *ngIf=\"Error\">{{Error}}</div>" }]
993
- }], ctorParameters: function () { return [{ type: i1.AppState }, { type: i1$1.ActivatedRoute }, { type: i1$1.Router }, { type: undefined, decorators: [{
994
- type: Optional
995
- }, {
996
- type: Inject,
997
- args: [REDIRECT_MAP]
998
- }] }, { type: i4.AppEmbeddingExtensions }]; } });
946
+ // Angular
947
+ class RedirecterComponent {
948
+ constructor(_state, route, router, redirectMap, emb) {
949
+ this._state = _state;
950
+ this.route = route;
951
+ this.router = router;
952
+ this.redirectMap = redirectMap;
953
+ this.emb = emb;
954
+ this.Error = "";
955
+ this.wrongTenant = false;
956
+ this.tenant = route.snapshot.params["tenant"];
957
+ if (this.tenant && this._state.getJaceIDentity().Idtenant != this.tenant) {
958
+ console.error("tenant mismatch in redirector");
959
+ this.router.navigate(["login"]);
960
+ this.wrongTenant = true;
961
+ }
962
+ }
963
+ ngOnInit() {
964
+ if (this.wrongTenant)
965
+ return;
966
+ let url = this.route.snapshot.params["url"];
967
+ //§ = 167... non so perché ma scrivendolo esplicitamente non funziona
968
+ let parts = url.includes(String.fromCharCode(167)) ? url.split(String.fromCharCode(167)).filter(s => !!s) : url.split('+').filter(s => !!s);
969
+ if (parts.length < 2) {
970
+ this.Error = "L'url passato è incompleto. Impossibile riconoscerlo";
971
+ return;
972
+ }
973
+ else {
974
+ var redirectItem = this.redirectMap[parts[0]];
975
+ if (!redirectItem) {
976
+ this.Error = "L'url passato fa riferimento a un oggetto non navigabile. Impossibile procedere";
977
+ return;
978
+ }
979
+ if (redirectItem.params.length != parts.length - 1) {
980
+ this.Error = "Il numero di parametri richiesti per navigare all'entità richiesta è diverso dal numero di parametri passato";
981
+ return;
982
+ }
983
+ let url = (this.emb.Embedded ? "pages_ext/" : "pages/") + redirectItem.url;
984
+ let parObject = {};
985
+ redirectItem.params.forEach((t, i) => parObject[t] = parts[i + 1]);
986
+ console.log(`Navigating to ${url} with the current parameters: ${JSON.stringify(parObject)}`);
987
+ this.router.navigate([url, parObject]);
988
+ }
989
+ }
990
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: RedirecterComponent, deps: [{ token: i1.AppState }, { token: i1$1.ActivatedRoute }, { token: i1$1.Router }, { token: REDIRECT_MAP, optional: true }, { token: i4.AppEmbeddingExtensions }], target: i0.ɵɵFactoryTarget.Component }); }
991
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: RedirecterComponent, isStandalone: true, selector: "redirecter", ngImport: i0, template: "<div *ngIf=\"Error\">{{Error}}</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None }); }
992
+ }
993
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: RedirecterComponent, decorators: [{
994
+ type: Component,
995
+ args: [{ selector: "redirecter", encapsulation: ViewEncapsulation.None, imports: [NgIf], template: "<div *ngIf=\"Error\">{{Error}}</div>" }]
996
+ }], ctorParameters: () => [{ type: i1.AppState }, { type: i1$1.ActivatedRoute }, { type: i1$1.Router }, { type: undefined, decorators: [{
997
+ type: Optional
998
+ }, {
999
+ type: Inject,
1000
+ args: [REDIRECT_MAP]
1001
+ }] }, { type: i4.AppEmbeddingExtensions }] });
999
1002
 
1000
- // Angular
1001
- class BaseComponent extends ReactiveComponent {
1002
- constructor(injector) {
1003
- super();
1004
- this.NavigationParameters = null;
1005
- this.QueryParameters = null;
1006
- let _activatedRoute = injector.get(ActivatedRoute);
1007
- let _state = injector.get(AppState);
1008
- this._emb = injector.get(AppEmbeddingExtensions);
1009
- this._location = injector.get(Location);
1010
- this._router = injector.get(Router);
1011
- _state.registerNavigationIfMeaningful(_activatedRoute.snapshot);
1012
- // Parametri in maniera "dinamica"
1013
- _activatedRoute.params.pipe(takeUntil$1(this.destroyed$)).subscribe(t => { this.NavigationParameters = t; });
1014
- _activatedRoute.queryParams.pipe(takeUntil$1(this.destroyed$)).subscribe(t => { this.QueryParameters = t; });
1015
- this.gatherRouteInformations(_activatedRoute);
1016
- // Per i componenti navigabili non embeddati è inutile mandare il messaggio di navigazione
1017
- // Così come per quelli per cui non esiste un titolo (cioè compoennti verso cui non si è navigato direttamente)
1018
- if (!this._emb.Embedded || !this.NavigationTitle)
1019
- return;
1020
- this._emb.MainWindow.postMessage({ type: "navigation", url: this.CompletePath, internalNavigation: this.InternalNavigation, title: this.NavigationTitle }, "*");
1021
- }
1022
- gatherRouteInformations(_activatedRoute) {
1023
- // Angular 15 -> 16: non si lavora più coi segmenti. Tiro fuori l'url del router e li rigenero
1024
- let segs = _activatedRoute.snapshot._routerState.url.split('/').filter((t, i) => i != 0).map(t => { return { path: t }; });
1025
- this.CompletePath = "/" + segs.map(t => t.path).join('/');
1026
- this.ComponentPath = "/" + segs.filter((t, i) => i != 0).map(t => t.path).join('/');
1027
- this.BasePath = "/" + segs[0].path;
1028
- this.InternalNavigation = _activatedRoute.snapshot.data["internalNavigation"] || false;
1029
- this.NavigationTitle = _activatedRoute.snapshot.data["title"] || "";
1030
- }
1031
- navigate(command, extras) {
1032
- let commands = command;
1033
- // Fix della path esattamente come in esRouterLink
1034
- commands = Array.isArray(commands) ? commands : [commands];
1035
- let route = commands[0];
1036
- if (!route.startsWith("/" + EMBEDDED_ROUTE) && !route.startsWith("/" + ROUTE))
1037
- commands[0] = this.BasePath + commands[0];
1038
- this._router.navigate(command, extras);
1039
- }
1040
- back() {
1041
- if (this._emb.Embedded) {
1042
- this._emb.MainWindow.postMessage({ type: "navigate-back" }, "*");
1043
- setTimeout(() => { this._location.back(); });
1044
- }
1045
- else
1046
- this._location.back();
1047
- }
1048
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BaseComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
1049
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: BaseComponent, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
1050
- }
1051
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: BaseComponent, decorators: [{
1052
- type: Component,
1053
- args: [{ template: '' }]
1054
- }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
1003
+ // Angular
1004
+ class BaseComponent extends ReactiveComponent {
1005
+ constructor(injector) {
1006
+ super();
1007
+ this.NavigationParameters = null;
1008
+ this.QueryParameters = null;
1009
+ let _activatedRoute = injector.get(ActivatedRoute);
1010
+ let _state = injector.get(AppState);
1011
+ this._emb = injector.get(AppEmbeddingExtensions);
1012
+ this._location = injector.get(Location);
1013
+ this._router = injector.get(Router);
1014
+ _state.registerNavigationIfMeaningful(_activatedRoute.snapshot);
1015
+ // Parametri in maniera "dinamica"
1016
+ _activatedRoute.params.pipe(takeUntil$1(this.destroyed$)).subscribe(t => { this.NavigationParameters = t; });
1017
+ _activatedRoute.queryParams.pipe(takeUntil$1(this.destroyed$)).subscribe(t => { this.QueryParameters = t; });
1018
+ this.gatherRouteInformations(_activatedRoute);
1019
+ // Per i componenti navigabili non embeddati è inutile mandare il messaggio di navigazione
1020
+ // Così come per quelli per cui non esiste un titolo (cioè compoennti verso cui non si è navigato direttamente)
1021
+ if (!this._emb.Embedded || !this.NavigationTitle)
1022
+ return;
1023
+ this._emb.MainWindow.postMessage({ type: "navigation", url: this.CompletePath, internalNavigation: this.InternalNavigation, title: this.NavigationTitle }, "*");
1024
+ }
1025
+ gatherRouteInformations(_activatedRoute) {
1026
+ // Angular 15 -> 16: non si lavora più coi segmenti. Tiro fuori l'url del router e li rigenero
1027
+ let segs = _activatedRoute.snapshot._routerState.url.split('/').filter((t, i) => i != 0).map(t => { return { path: t }; });
1028
+ this.CompletePath = "/" + segs.map(t => t.path).join('/');
1029
+ this.ComponentPath = "/" + segs.filter((t, i) => i != 0).map(t => t.path).join('/');
1030
+ this.BasePath = "/" + segs[0].path;
1031
+ this.InternalNavigation = _activatedRoute.snapshot.data["internalNavigation"] || false;
1032
+ this.NavigationTitle = _activatedRoute.snapshot.data["title"] || "";
1033
+ }
1034
+ navigate(command, extras) {
1035
+ let commands = command;
1036
+ // Fix della path esattamente come in esRouterLink
1037
+ commands = Array.isArray(commands) ? commands : [commands];
1038
+ let route = commands[0];
1039
+ if (!route.startsWith("/" + EMBEDDED_ROUTE) && !route.startsWith("/" + ROUTE))
1040
+ commands[0] = this.BasePath + commands[0];
1041
+ this._router.navigate(command, extras);
1042
+ }
1043
+ back() {
1044
+ if (this._emb.Embedded) {
1045
+ this._emb.MainWindow.postMessage({ type: "navigate-back" }, "*");
1046
+ setTimeout(() => { this._location.back(); });
1047
+ }
1048
+ else
1049
+ this._location.back();
1050
+ }
1051
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component }); }
1052
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: BaseComponent, isStandalone: false, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true }); }
1053
+ }
1054
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseComponent, decorators: [{
1055
+ type: Component,
1056
+ args: [{
1057
+ template: '',
1058
+ standalone: false
1059
+ }]
1060
+ }], ctorParameters: () => [{ type: i0.Injector }] });
1055
1061
 
1056
- // Angular
1057
- class JaceResourceComponent {
1058
- constructor(cdr, _state, sanitizer) {
1059
- this.cdr = cdr;
1060
- this._state = _state;
1061
- this.sanitizer = sanitizer;
1062
- this.Module = "";
1063
- this.ModuleKeyType = 'altid';
1064
- this.Page = "";
1065
- this.Height = 0;
1066
- this.sanitizedSourceResource = null;
1067
- }
1068
- ngOnInit() {
1069
- console.log("Initializing jace resource for " + this.Module);
1070
- if (this._state.Modules?.length > 0)
1071
- this.afterModulesRetrieve(this._state.Modules);
1072
- else {
1073
- this._state.subscribe("modules.Retrieved", (modules) => {
1074
- this.afterModulesRetrieve(modules);
1075
- this.cdr.markForCheck();
1076
- });
1077
- }
1078
- }
1079
- ngAfterViewInit() {
1080
- requestAnimationFrame(() => {
1081
- this.Height = window.innerHeight - 80;
1082
- this.cdr.markForCheck();
1083
- });
1084
- }
1085
- afterModulesRetrieve(modules) {
1086
- let module = modules.find(t => (this.ModuleKeyType == 'id' ? t.idmodule : this.ModuleKeyType == 'altid' ? t.altname : "") == this.Module);
1087
- if (!module) {
1088
- console.error(`Impossibile trovare il modulo con ${this.ModuleKeyType} uguale a ${this.Module}`);
1089
- this.sanitizedSourceResource = null;
1090
- }
1091
- if (this.Page.startsWith("pages") || this.Page.startsWith("/pages")) {
1092
- console.error(`L'url della pagina da visitare non deve partire con 'pages', scrivere solo {modulo}/{pagina}`);
1093
- this.sanitizedSourceResource = null;
1094
- }
1095
- let moduleUrl = myconfig.AuthUrl.includes("localhost") ? `http://localhost:${this.Localhost}` : module.uiurl;
1096
- let parameters = this.Params ? Object.keys(this.Params).map(k => `${k}=${this.Params[k]}`).join(';') : '';
1097
- let finalUrl = `${moduleUrl}/#/pages_ext/${this.Page}${(parameters ? (';' + parameters) : '')}`;
1098
- console.log("@esfaenza/core: Jace-resource navigating to " + finalUrl);
1099
- this.sanitizedSourceResource = this.sanitizer.bypassSecurityTrustResourceUrl(finalUrl);
1100
- }
1101
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JaceResourceComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.AppState }, { token: i3.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
1102
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: JaceResourceComponent, isStandalone: true, selector: "jace-resource", inputs: { Module: "Module", ModuleKeyType: "ModuleKeyType", Page: "Page", Localhost: "Localhost", Params: "Params" }, ngImport: i0, template: "<iframe *ngIf=\"!!sanitizedSourceResource && this.Height > 0\" id=\"externalFrame\" style=\"width: 100%; border: none;\" [style.height.px]=\"Height\"\r\n [src]=\"sanitizedSourceResource\">\r\n</iframe>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1103
- }
1104
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: JaceResourceComponent, decorators: [{
1105
- type: Component,
1106
- args: [{ selector: "jace-resource", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [NgIf], template: "<iframe *ngIf=\"!!sanitizedSourceResource && this.Height > 0\" id=\"externalFrame\" style=\"width: 100%; border: none;\" [style.height.px]=\"Height\"\r\n [src]=\"sanitizedSourceResource\">\r\n</iframe>" }]
1107
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.AppState }, { type: i3.DomSanitizer }]; }, propDecorators: { Module: [{
1108
- type: Input
1109
- }], ModuleKeyType: [{
1110
- type: Input
1111
- }], Page: [{
1112
- type: Input
1113
- }], Localhost: [{
1114
- type: Input
1115
- }], Params: [{
1116
- type: Input
1062
+ // Angular
1063
+ class JaceResourceComponent {
1064
+ constructor(cdr, _state, sanitizer) {
1065
+ this.cdr = cdr;
1066
+ this._state = _state;
1067
+ this.sanitizer = sanitizer;
1068
+ this.Module = "";
1069
+ this.ModuleKeyType = 'altid';
1070
+ this.Page = "";
1071
+ this.Height = 0;
1072
+ this.sanitizedSourceResource = null;
1073
+ }
1074
+ ngOnInit() {
1075
+ console.log("Initializing jace resource for " + this.Module);
1076
+ if (this._state.Modules?.length > 0)
1077
+ this.afterModulesRetrieve(this._state.Modules);
1078
+ else {
1079
+ this._state.subscribe("modules.Retrieved", (modules) => {
1080
+ this.afterModulesRetrieve(modules);
1081
+ this.cdr.markForCheck();
1082
+ });
1083
+ }
1084
+ }
1085
+ ngAfterViewInit() {
1086
+ requestAnimationFrame(() => {
1087
+ this.Height = window.innerHeight - 80;
1088
+ this.cdr.markForCheck();
1089
+ });
1090
+ }
1091
+ afterModulesRetrieve(modules) {
1092
+ let module = modules.find(t => (this.ModuleKeyType == 'id' ? t.idmodule : this.ModuleKeyType == 'altid' ? t.altname : "") == this.Module);
1093
+ if (!module) {
1094
+ console.error(`Impossibile trovare il modulo con ${this.ModuleKeyType} uguale a ${this.Module}`);
1095
+ this.sanitizedSourceResource = null;
1096
+ }
1097
+ if (this.Page.startsWith("pages") || this.Page.startsWith("/pages")) {
1098
+ console.error(`L'url della pagina da visitare non deve partire con 'pages', scrivere solo {modulo}/{pagina}`);
1099
+ this.sanitizedSourceResource = null;
1100
+ }
1101
+ let moduleUrl = myconfig.AuthUrl.includes("localhost") ? `http://localhost:${this.Localhost}` : module.uiurl;
1102
+ let parameters = this.Params ? Object.keys(this.Params).map(k => `${k}=${this.Params[k]}`).join(';') : '';
1103
+ let finalUrl = `${moduleUrl}/#/pages_ext/${this.Page}${(parameters ? (';' + parameters) : '')}`;
1104
+ console.log("@esfaenza/core: Jace-resource navigating to " + finalUrl);
1105
+ this.sanitizedSourceResource = this.sanitizer.bypassSecurityTrustResourceUrl(finalUrl);
1106
+ }
1107
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JaceResourceComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.AppState }, { token: i3.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
1108
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: JaceResourceComponent, isStandalone: true, selector: "jace-resource", inputs: { Module: "Module", ModuleKeyType: "ModuleKeyType", Page: "Page", Localhost: "Localhost", Params: "Params" }, ngImport: i0, template: "<iframe *ngIf=\"!!sanitizedSourceResource && this.Height > 0\" id=\"externalFrame\" style=\"width: 100%; border: none;\" [style.height.px]=\"Height\"\r\n [src]=\"sanitizedSourceResource\">\r\n</iframe>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
1109
+ }
1110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: JaceResourceComponent, decorators: [{
1111
+ type: Component,
1112
+ args: [{ selector: "jace-resource", encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgIf], template: "<iframe *ngIf=\"!!sanitizedSourceResource && this.Height > 0\" id=\"externalFrame\" style=\"width: 100%; border: none;\" [style.height.px]=\"Height\"\r\n [src]=\"sanitizedSourceResource\">\r\n</iframe>" }]
1113
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.AppState }, { type: i3.DomSanitizer }], propDecorators: { Module: [{
1114
+ type: Input
1115
+ }], ModuleKeyType: [{
1116
+ type: Input
1117
+ }], Page: [{
1118
+ type: Input
1119
+ }], Localhost: [{
1120
+ type: Input
1121
+ }], Params: [{
1122
+ type: Input
1117
1123
  }] } });
1118
1124
 
1119
- // Angular
1120
- class EsModalComponent {
1121
- constructor(_state) {
1122
- this._state = _state;
1123
- this.Size = "M";
1124
- this.IgnoreBackdrop = false;
1125
- this.Backdrop = true;
1126
- this.HasOverlap = false;
1127
- this.onShow = new EventEmitter();
1128
- this.onHide = new EventEmitter();
1129
- }
1130
- show() { this.Modal.show(); }
1131
- hide() { this.Modal.hide(); }
1132
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EsModalComponent, deps: [{ token: i1.AppState }], target: i0.ɵɵFactoryTarget.Component }); }
1133
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EsModalComponent, isStandalone: true, selector: "es-modal", inputs: { Size: "Size", IgnoreBackdrop: "IgnoreBackdrop", Backdrop: "Backdrop", HasOverlap: "HasOverlap" }, outputs: { onShow: "onShow", onHide: "onHide" }, viewQueries: [{ propertyName: "Modal", first: true, predicate: ["modalRef"], descendants: true }], ngImport: i0, template: "<div esModal #modalRef=\"es-modal\"\r\n class=\"modal fade\"\r\n role=\"dialog\"\r\n aria-hidden=\"true\"\r\n (onShow)=\"onShow.emit()\"\r\n (onHide)=\"onHide.emit()\"\r\n [config]=\"{backdrop: Backdrop, ignoreBackdropClick: IgnoreBackdrop}\">\r\n <div class=\"modal-dialog\"\r\n [class.modal-sm]=\"Size == 'S'\"\r\n [class.modal-md]=\"Size == 'M'\"\r\n [class.modal-lg]=\"Size == 'L'\"\r\n [class.modal-xl]=\"Size == 'XL'\"\r\n [class.modal-xxl]=\"Size == 'XXL'\"\r\n [class.modal-feminist]=\"Size == 'HOLYSHIT'\"\r\n emaDraggable>\r\n <div class=\"modal-content\" [class.app-bg-lightgrey]=\"HasOverlap\"\r\n style=\"cursor: default;\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: EsModalDirective, selector: "[esModal]", exportAs: ["es-modal"] }, { kind: "directive", type: Draggable, selector: "[emaDraggable]", inputs: ["emaDraggable"] }] }); }
1134
- }
1135
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EsModalComponent, decorators: [{
1136
- type: Component,
1137
- args: [{ selector: "es-modal", standalone: true, imports: [EsModalDirective, Draggable], template: "<div esModal #modalRef=\"es-modal\"\r\n class=\"modal fade\"\r\n role=\"dialog\"\r\n aria-hidden=\"true\"\r\n (onShow)=\"onShow.emit()\"\r\n (onHide)=\"onHide.emit()\"\r\n [config]=\"{backdrop: Backdrop, ignoreBackdropClick: IgnoreBackdrop}\">\r\n <div class=\"modal-dialog\"\r\n [class.modal-sm]=\"Size == 'S'\"\r\n [class.modal-md]=\"Size == 'M'\"\r\n [class.modal-lg]=\"Size == 'L'\"\r\n [class.modal-xl]=\"Size == 'XL'\"\r\n [class.modal-xxl]=\"Size == 'XXL'\"\r\n [class.modal-feminist]=\"Size == 'HOLYSHIT'\"\r\n emaDraggable>\r\n <div class=\"modal-content\" [class.app-bg-lightgrey]=\"HasOverlap\"\r\n style=\"cursor: default;\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n</div>" }]
1138
- }], ctorParameters: function () { return [{ type: i1.AppState }]; }, propDecorators: { Size: [{
1139
- type: Input
1140
- }], IgnoreBackdrop: [{
1141
- type: Input
1142
- }], Backdrop: [{
1143
- type: Input
1144
- }], HasOverlap: [{
1145
- type: Input
1146
- }], onShow: [{
1147
- type: Output
1148
- }], onHide: [{
1149
- type: Output
1150
- }], Modal: [{
1151
- type: ViewChild,
1152
- args: ["modalRef"]
1125
+ // Angular
1126
+ class EsModalComponent {
1127
+ constructor(_state) {
1128
+ this._state = _state;
1129
+ this.Size = "M";
1130
+ this.IgnoreBackdrop = false;
1131
+ this.Backdrop = true;
1132
+ this.HasOverlap = false;
1133
+ this.onShow = new EventEmitter();
1134
+ this.onHide = new EventEmitter();
1135
+ }
1136
+ show() { this.Modal.show(); }
1137
+ hide() { this.Modal.hide(); }
1138
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsModalComponent, deps: [{ token: i1.AppState }], target: i0.ɵɵFactoryTarget.Component }); }
1139
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: EsModalComponent, isStandalone: true, selector: "es-modal", inputs: { Size: "Size", IgnoreBackdrop: "IgnoreBackdrop", Backdrop: "Backdrop", HasOverlap: "HasOverlap" }, outputs: { onShow: "onShow", onHide: "onHide" }, viewQueries: [{ propertyName: "Modal", first: true, predicate: ["modalRef"], descendants: true }], ngImport: i0, template: "<div esModal #modalRef=\"es-modal\"\r\n class=\"modal fade\"\r\n role=\"dialog\"\r\n aria-hidden=\"true\"\r\n (onShow)=\"onShow.emit()\"\r\n (onHide)=\"onHide.emit()\"\r\n [config]=\"{backdrop: Backdrop, ignoreBackdropClick: IgnoreBackdrop}\">\r\n <div class=\"modal-dialog\"\r\n [class.modal-sm]=\"Size == 'S'\"\r\n [class.modal-md]=\"Size == 'M'\"\r\n [class.modal-lg]=\"Size == 'L'\"\r\n [class.modal-xl]=\"Size == 'XL'\"\r\n [class.modal-xxl]=\"Size == 'XXL'\"\r\n [class.modal-feminist]=\"Size == 'HOLYSHIT'\"\r\n emaDraggable>\r\n <div class=\"modal-content\" [class.app-bg-lightgrey]=\"HasOverlap\"\r\n style=\"cursor: default;\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n</div>", dependencies: [{ kind: "directive", type: EsModalDirective, selector: "[esModal]", exportAs: ["es-modal"] }, { kind: "directive", type: Draggable, selector: "[emaDraggable]", inputs: ["emaDraggable"] }] }); }
1140
+ }
1141
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsModalComponent, decorators: [{
1142
+ type: Component,
1143
+ args: [{ selector: "es-modal", imports: [EsModalDirective, Draggable], template: "<div esModal #modalRef=\"es-modal\"\r\n class=\"modal fade\"\r\n role=\"dialog\"\r\n aria-hidden=\"true\"\r\n (onShow)=\"onShow.emit()\"\r\n (onHide)=\"onHide.emit()\"\r\n [config]=\"{backdrop: Backdrop, ignoreBackdropClick: IgnoreBackdrop}\">\r\n <div class=\"modal-dialog\"\r\n [class.modal-sm]=\"Size == 'S'\"\r\n [class.modal-md]=\"Size == 'M'\"\r\n [class.modal-lg]=\"Size == 'L'\"\r\n [class.modal-xl]=\"Size == 'XL'\"\r\n [class.modal-xxl]=\"Size == 'XXL'\"\r\n [class.modal-feminist]=\"Size == 'HOLYSHIT'\"\r\n emaDraggable>\r\n <div class=\"modal-content\" [class.app-bg-lightgrey]=\"HasOverlap\"\r\n style=\"cursor: default;\">\r\n <ng-content></ng-content>\r\n </div>\r\n </div>\r\n</div>" }]
1144
+ }], ctorParameters: () => [{ type: i1.AppState }], propDecorators: { Size: [{
1145
+ type: Input
1146
+ }], IgnoreBackdrop: [{
1147
+ type: Input
1148
+ }], Backdrop: [{
1149
+ type: Input
1150
+ }], HasOverlap: [{
1151
+ type: Input
1152
+ }], onShow: [{
1153
+ type: Output
1154
+ }], onHide: [{
1155
+ type: Output
1156
+ }], Modal: [{
1157
+ type: ViewChild,
1158
+ args: ["modalRef"]
1153
1159
  }] } });
1154
1160
 
1155
- // Angular
1156
- class EsModalHeadComponent {
1157
- constructor(_state) {
1158
- this._state = _state;
1159
- this.Close = new EventEmitter();
1160
- }
1161
- CloseFunction() {
1162
- this.Close.emit();
1163
- }
1164
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EsModalHeadComponent, deps: [{ token: i1.AppState }], target: i0.ɵɵFactoryTarget.Component }); }
1165
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EsModalHeadComponent, isStandalone: true, selector: "es-modal-head", outputs: { Close: "Close" }, ngImport: i0, template: "<div class=\"modal-header\">\r\n <div class=\"modal-title modal-head pull-left\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"close modal-close-button\"\r\n (click)=\"CloseFunction();\" \r\n aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </div>\r\n</div>", styles: [".modal-head{font-size:1.25rem}.modal-close-button{margin:auto;padding:0 10px}\n"] }); }
1166
- }
1167
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EsModalHeadComponent, decorators: [{
1168
- type: Component,
1169
- args: [{ selector: "es-modal-head", standalone: true, template: "<div class=\"modal-header\">\r\n <div class=\"modal-title modal-head pull-left\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"close modal-close-button\"\r\n (click)=\"CloseFunction();\" \r\n aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </div>\r\n</div>", styles: [".modal-head{font-size:1.25rem}.modal-close-button{margin:auto;padding:0 10px}\n"] }]
1170
- }], ctorParameters: function () { return [{ type: i1.AppState }]; }, propDecorators: { Close: [{
1171
- type: Output
1161
+ // Angular
1162
+ class EsModalHeadComponent {
1163
+ constructor(_state) {
1164
+ this._state = _state;
1165
+ this.Close = new EventEmitter();
1166
+ }
1167
+ CloseFunction() {
1168
+ this.Close.emit();
1169
+ }
1170
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsModalHeadComponent, deps: [{ token: i1.AppState }], target: i0.ɵɵFactoryTarget.Component }); }
1171
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: EsModalHeadComponent, isStandalone: true, selector: "es-modal-head", outputs: { Close: "Close" }, ngImport: i0, template: "<div class=\"modal-header\">\r\n <div class=\"modal-title modal-head pull-left\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"close modal-close-button\"\r\n (click)=\"CloseFunction();\" \r\n aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </div>\r\n</div>", styles: [".modal-head{font-size:1.25rem}.modal-close-button{margin:auto;padding:0 10px}\n"] }); }
1172
+ }
1173
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsModalHeadComponent, decorators: [{
1174
+ type: Component,
1175
+ args: [{ selector: "es-modal-head", standalone: true, template: "<div class=\"modal-header\">\r\n <div class=\"modal-title modal-head pull-left\">\r\n <ng-content></ng-content>\r\n </div>\r\n <div class=\"close modal-close-button\"\r\n (click)=\"CloseFunction();\" \r\n aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </div>\r\n</div>", styles: [".modal-head{font-size:1.25rem}.modal-close-button{margin:auto;padding:0 10px}\n"] }]
1176
+ }], ctorParameters: () => [{ type: i1.AppState }], propDecorators: { Close: [{
1177
+ type: Output
1172
1178
  }] } });
1173
1179
 
1174
- class LabeledSpanComponent {
1175
- constructor() {
1176
- this.H_MODE = "Horizontal";
1177
- this.V_MODE = "Vertical";
1178
- this.First = false;
1179
- this.Label = "";
1180
- this.Display = "Horizontal";
1181
- }
1182
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LabeledSpanComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1183
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LabeledSpanComponent, isStandalone: true, selector: "labeled-span", inputs: { First: "First", Label: "Label", Display: "Display" }, ngImport: i0, template: "<div [class.app-margin-top-10]=\"First\" \r\n [style.display]=\"Display == V_MODE ? 'inline-grid' : 'block'\"\r\n [style.margin-right.px]=\"Display == V_MODE ? 10 : 0\">\r\n <strong class=\"text-uppercase\" style=\"font-size: .7rem !important;\">\r\n {{Label}}<span *ngIf=\"Display == H_MODE\">:&nbsp;&nbsp;</span>\r\n </strong>\r\n <span><ng-content></ng-content></span>\r\n</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1184
- }
1185
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LabeledSpanComponent, decorators: [{
1186
- type: Component,
1187
- args: [{ selector: "labeled-span", standalone: true, imports: [NgIf], template: "<div [class.app-margin-top-10]=\"First\" \r\n [style.display]=\"Display == V_MODE ? 'inline-grid' : 'block'\"\r\n [style.margin-right.px]=\"Display == V_MODE ? 10 : 0\">\r\n <strong class=\"text-uppercase\" style=\"font-size: .7rem !important;\">\r\n {{Label}}<span *ngIf=\"Display == H_MODE\">:&nbsp;&nbsp;</span>\r\n </strong>\r\n <span><ng-content></ng-content></span>\r\n</div>" }]
1188
- }], ctorParameters: function () { return []; }, propDecorators: { First: [{
1189
- type: Input
1190
- }], Label: [{
1191
- type: Input
1192
- }], Display: [{
1193
- type: Input
1180
+ class LabeledSpanComponent {
1181
+ constructor() {
1182
+ this.H_MODE = "Horizontal";
1183
+ this.V_MODE = "Vertical";
1184
+ this.First = false;
1185
+ this.Label = "";
1186
+ this.Display = "Horizontal";
1187
+ }
1188
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LabeledSpanComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1189
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: LabeledSpanComponent, isStandalone: true, selector: "labeled-span", inputs: { First: "First", Label: "Label", Display: "Display" }, ngImport: i0, template: "<div [class.app-margin-top-10]=\"First\" \r\n [style.display]=\"Display == V_MODE ? 'inline-grid' : 'block'\"\r\n [style.margin-right.px]=\"Display == V_MODE ? 10 : 0\">\r\n <strong class=\"text-uppercase\" style=\"font-size: .7rem !important;\">\r\n {{Label}}<span *ngIf=\"Display == H_MODE\">:&nbsp;&nbsp;</span>\r\n </strong>\r\n <span><ng-content></ng-content></span>\r\n</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1190
+ }
1191
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: LabeledSpanComponent, decorators: [{
1192
+ type: Component,
1193
+ args: [{ selector: "labeled-span", imports: [NgIf], template: "<div [class.app-margin-top-10]=\"First\" \r\n [style.display]=\"Display == V_MODE ? 'inline-grid' : 'block'\"\r\n [style.margin-right.px]=\"Display == V_MODE ? 10 : 0\">\r\n <strong class=\"text-uppercase\" style=\"font-size: .7rem !important;\">\r\n {{Label}}<span *ngIf=\"Display == H_MODE\">:&nbsp;&nbsp;</span>\r\n </strong>\r\n <span><ng-content></ng-content></span>\r\n</div>" }]
1194
+ }], ctorParameters: () => [], propDecorators: { First: [{
1195
+ type: Input
1196
+ }], Label: [{
1197
+ type: Input
1198
+ }], Display: [{
1199
+ type: Input
1194
1200
  }] } });
1195
1201
 
1196
- class EsImageCropperComponent {
1197
- constructor() {
1198
- this.canvasRotation = 0;
1199
- this.scale = 1;
1200
- this.transform = {};
1201
- }
1202
- get OutputImage() {
1203
- if (this.ProfileImage?.nativefiles)
1204
- return this._OutputImage;
1205
- else
1206
- return null;
1207
- }
1208
- onResetImage() {
1209
- this.ProfileImage = new AppFile();
1210
- this._OutputImage = null;
1211
- }
1212
- onImageCropped(event) {
1213
- this._OutputImage = event.blob;
1214
- }
1215
- onRotateLeft() {
1216
- this.canvasRotation--;
1217
- this.doFlipAfterRotate();
1218
- }
1219
- onRotateRight() {
1220
- this.canvasRotation++;
1221
- this.doFlipAfterRotate();
1222
- }
1223
- onFlipHorizontal() {
1224
- this.transform = {
1225
- ...this.transform,
1226
- flipH: !this.transform.flipH,
1227
- };
1228
- }
1229
- onFlipVertical() {
1230
- this.transform = {
1231
- ...this.transform,
1232
- flipV: !this.transform.flipV,
1233
- };
1234
- }
1235
- doFlipAfterRotate() {
1236
- const flippedH = this.transform.flipH;
1237
- const flippedV = this.transform.flipV;
1238
- this.transform = {
1239
- ...this.transform,
1240
- flipH: flippedV,
1241
- flipV: flippedH,
1242
- };
1243
- }
1244
- onZoomOut() {
1245
- this.scale -= 0.1;
1246
- this.transform = {
1247
- ...this.transform,
1248
- scale: this.scale,
1249
- };
1250
- }
1251
- onZoomIn() {
1252
- this.scale += 0.1;
1253
- this.transform = {
1254
- ...this.transform,
1255
- scale: this.scale,
1256
- };
1257
- }
1258
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EsImageCropperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1259
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EsImageCropperComponent, isStandalone: true, selector: "es-image-cropper", inputs: { Height: "Height", Width: "Width" }, ngImport: i0, template: "<div *ngIf=\"ProfileImage?.nativefiles?.length > 0\" [style.width.px]=\"Width\">\r\n <div class=\"d-flex\">\r\n <button (click)=\"onRotateLeft()\" class=\"btn btn-primary\"><i class=\"fa fa-undo\"></i></button>\r\n <button (click)=\"onRotateRight()\" class=\"btn btn-primary\"><i class=\"fa fa-repeat\"></i></button>\r\n <button (click)=\"onFlipHorizontal()\" class=\"btn btn-primary\"><i class=\"fa fa-arrows-h\"></i></button>\r\n <button (click)=\"onFlipVertical()\" class=\"btn btn-primary\"><i class=\"fa fa-arrows-v\"></i></button>\r\n <button (click)=\"onZoomIn()\" class=\"btn btn-primary\"><i class=\"fa fa-search-plus\"></i></button>\r\n <button (click)=\"onZoomOut()\" class=\"btn btn-primary\"><i class=\"fa fa-search-minus\"></i></button>\r\n <button (click)=\"onResetImage()\" class=\"btn btn-danger\" style=\"margin-left: auto; margin-right: 0px;\"><i class=\"fa fa-times\"></i></button>\r\n </div>\r\n</div>\r\n<div class=\"app-margin-top-10\" [style.max-height.px]=\"Height\" [style.width.px]=\"Width\">\r\n <form-file *ngIf=\"!(ProfileImage?.nativefiles?.length > 0)\" [LabelInputRatio]=\"'0 12'\" [FancyMode]=\"true\" [(ngModel)]=\"ProfileImage\" name=\"imageToCrop\"></form-file>\r\n <ng-container *ngIf=\"ProfileImage?.nativefiles?.length > 0\">\r\n <image-cropper style=\"--cropper-outline-color: rgba(0,0,0)\"\r\n [backgroundColor]=\"'#91a3b0'\"\r\n [imageFile]=\"ProfileImage.nativefiles[0]\"\r\n [aspectRatio]=\"4 / 3\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"true\"\r\n [cropperStaticWidth]=\"320\"\r\n [cropperStaticHeight]=\"320\"\r\n [onlyScaleDown]=\"true\"\r\n [roundCropper]=\"true\"\r\n [canvasRotation]=\"canvasRotation\"\r\n [allowMoveImage]=\"true\"\r\n [(transform)]=\"transform\"\r\n (imageCropped)=\"onImageCropped($event)\">\r\n </image-cropper>\r\n </ng-container>\r\n</div>", styles: [".btn{width:40px;margin-right:10px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FormsAndValidationsModule }, { kind: "component", type: i2$3.FormFileComponent, selector: "form-file", inputs: ["Multiple", "AllowDownload", "MaxSize", "FancyMode", "ReadFile"] }] }); }
1260
- }
1261
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EsImageCropperComponent, decorators: [{
1262
- type: Component,
1263
- args: [{ selector: "es-image-cropper", standalone: true, imports: [NgIf, ImageCropperComponent, FormsModule, FormsAndValidationsModule], template: "<div *ngIf=\"ProfileImage?.nativefiles?.length > 0\" [style.width.px]=\"Width\">\r\n <div class=\"d-flex\">\r\n <button (click)=\"onRotateLeft()\" class=\"btn btn-primary\"><i class=\"fa fa-undo\"></i></button>\r\n <button (click)=\"onRotateRight()\" class=\"btn btn-primary\"><i class=\"fa fa-repeat\"></i></button>\r\n <button (click)=\"onFlipHorizontal()\" class=\"btn btn-primary\"><i class=\"fa fa-arrows-h\"></i></button>\r\n <button (click)=\"onFlipVertical()\" class=\"btn btn-primary\"><i class=\"fa fa-arrows-v\"></i></button>\r\n <button (click)=\"onZoomIn()\" class=\"btn btn-primary\"><i class=\"fa fa-search-plus\"></i></button>\r\n <button (click)=\"onZoomOut()\" class=\"btn btn-primary\"><i class=\"fa fa-search-minus\"></i></button>\r\n <button (click)=\"onResetImage()\" class=\"btn btn-danger\" style=\"margin-left: auto; margin-right: 0px;\"><i class=\"fa fa-times\"></i></button>\r\n </div>\r\n</div>\r\n<div class=\"app-margin-top-10\" [style.max-height.px]=\"Height\" [style.width.px]=\"Width\">\r\n <form-file *ngIf=\"!(ProfileImage?.nativefiles?.length > 0)\" [LabelInputRatio]=\"'0 12'\" [FancyMode]=\"true\" [(ngModel)]=\"ProfileImage\" name=\"imageToCrop\"></form-file>\r\n <ng-container *ngIf=\"ProfileImage?.nativefiles?.length > 0\">\r\n <image-cropper style=\"--cropper-outline-color: rgba(0,0,0)\"\r\n [backgroundColor]=\"'#91a3b0'\"\r\n [imageFile]=\"ProfileImage.nativefiles[0]\"\r\n [aspectRatio]=\"4 / 3\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"true\"\r\n [cropperStaticWidth]=\"320\"\r\n [cropperStaticHeight]=\"320\"\r\n [onlyScaleDown]=\"true\"\r\n [roundCropper]=\"true\"\r\n [canvasRotation]=\"canvasRotation\"\r\n [allowMoveImage]=\"true\"\r\n [(transform)]=\"transform\"\r\n (imageCropped)=\"onImageCropped($event)\">\r\n </image-cropper>\r\n </ng-container>\r\n</div>", styles: [".btn{width:40px;margin-right:10px}\n"] }]
1264
- }], ctorParameters: function () { return []; }, propDecorators: { Height: [{
1265
- type: Input
1266
- }], Width: [{
1267
- type: Input
1202
+ class EsImageCropperComponent {
1203
+ constructor() {
1204
+ this.canvasRotation = 0;
1205
+ this.scale = 1;
1206
+ this.transform = {};
1207
+ }
1208
+ get OutputImage() {
1209
+ if (this.ProfileImage?.nativefiles)
1210
+ return this._OutputImage;
1211
+ else
1212
+ return null;
1213
+ }
1214
+ onResetImage() {
1215
+ this.ProfileImage = new AppFile();
1216
+ this._OutputImage = null;
1217
+ }
1218
+ onImageCropped(event) {
1219
+ this._OutputImage = event.blob;
1220
+ }
1221
+ onRotateLeft() {
1222
+ this.canvasRotation--;
1223
+ this.doFlipAfterRotate();
1224
+ }
1225
+ onRotateRight() {
1226
+ this.canvasRotation++;
1227
+ this.doFlipAfterRotate();
1228
+ }
1229
+ onFlipHorizontal() {
1230
+ this.transform = {
1231
+ ...this.transform,
1232
+ flipH: !this.transform.flipH,
1233
+ };
1234
+ }
1235
+ onFlipVertical() {
1236
+ this.transform = {
1237
+ ...this.transform,
1238
+ flipV: !this.transform.flipV,
1239
+ };
1240
+ }
1241
+ doFlipAfterRotate() {
1242
+ const flippedH = this.transform.flipH;
1243
+ const flippedV = this.transform.flipV;
1244
+ this.transform = {
1245
+ ...this.transform,
1246
+ flipH: flippedV,
1247
+ flipV: flippedH,
1248
+ };
1249
+ }
1250
+ onZoomOut() {
1251
+ this.scale -= 0.1;
1252
+ this.transform = {
1253
+ ...this.transform,
1254
+ scale: this.scale,
1255
+ };
1256
+ }
1257
+ onZoomIn() {
1258
+ this.scale += 0.1;
1259
+ this.transform = {
1260
+ ...this.transform,
1261
+ scale: this.scale,
1262
+ };
1263
+ }
1264
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsImageCropperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1265
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: EsImageCropperComponent, isStandalone: true, selector: "es-image-cropper", inputs: { Height: "Height", Width: "Width" }, ngImport: i0, template: "<div *ngIf=\"ProfileImage?.nativefiles?.length > 0\" [style.width.px]=\"Width\">\r\n <div class=\"d-flex\">\r\n <button (click)=\"onRotateLeft()\" class=\"btn btn-primary\"><i class=\"fa fa-undo\"></i></button>\r\n <button (click)=\"onRotateRight()\" class=\"btn btn-primary\"><i class=\"fa fa-repeat\"></i></button>\r\n <button (click)=\"onFlipHorizontal()\" class=\"btn btn-primary\"><i class=\"fa fa-arrows-h\"></i></button>\r\n <button (click)=\"onFlipVertical()\" class=\"btn btn-primary\"><i class=\"fa fa-arrows-v\"></i></button>\r\n <button (click)=\"onZoomIn()\" class=\"btn btn-primary\"><i class=\"fa fa-search-plus\"></i></button>\r\n <button (click)=\"onZoomOut()\" class=\"btn btn-primary\"><i class=\"fa fa-search-minus\"></i></button>\r\n <button (click)=\"onResetImage()\" class=\"btn btn-danger\" style=\"margin-left: auto; margin-right: 0px;\"><i class=\"fa fa-times\"></i></button>\r\n </div>\r\n</div>\r\n<div class=\"app-margin-top-10\" [style.max-height.px]=\"Height\" [style.width.px]=\"Width\">\r\n <form-file *ngIf=\"!(ProfileImage?.nativefiles?.length > 0)\" [LabelInputRatio]=\"'0 12'\" [FancyMode]=\"true\" [(ngModel)]=\"ProfileImage\" name=\"imageToCrop\"></form-file>\r\n <ng-container *ngIf=\"ProfileImage?.nativefiles?.length > 0\">\r\n <image-cropper style=\"--cropper-outline-color: rgba(0,0,0)\"\r\n [backgroundColor]=\"'#91a3b0'\"\r\n [imageFile]=\"ProfileImage.nativefiles[0]\"\r\n [aspectRatio]=\"4 / 3\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"true\"\r\n [cropperStaticWidth]=\"320\"\r\n [cropperStaticHeight]=\"320\"\r\n [onlyScaleDown]=\"true\"\r\n [roundCropper]=\"true\"\r\n [canvasRotation]=\"canvasRotation\"\r\n [allowMoveImage]=\"true\"\r\n [(transform)]=\"transform\"\r\n (imageCropped)=\"onImageCropped($event)\">\r\n </image-cropper>\r\n </ng-container>\r\n</div>", styles: [".btn{width:40px;margin-right:10px}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ImageCropperComponent, selector: "image-cropper", inputs: ["imageChangedEvent", "imageURL", "imageBase64", "imageFile", "imageAltText", "options", "cropperFrameAriaLabel", "output", "format", "autoCrop", "cropper", "transform", "maintainAspectRatio", "aspectRatio", "resetCropOnAspectRatioChange", "resizeToWidth", "resizeToHeight", "cropperMinWidth", "cropperMinHeight", "cropperMaxHeight", "cropperMaxWidth", "cropperStaticWidth", "cropperStaticHeight", "canvasRotation", "initialStepSize", "roundCropper", "onlyScaleDown", "imageQuality", "backgroundColor", "containWithinAspectRatio", "hideResizeSquares", "allowMoveImage", "checkImageType", "alignImage", "disabled", "hidden"], outputs: ["imageCropped", "startCropImage", "imageLoaded", "cropperReady", "loadImageFailed", "transformChange", "cropperChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FormsAndValidationsModule }, { kind: "component", type: i2$3.EsFormFileComponent, selector: "form-file", inputs: ["Multiple", "AllowDownload", "MaxSize", "FancyMode", "ReadFile"] }] }); }
1266
+ }
1267
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsImageCropperComponent, decorators: [{
1268
+ type: Component,
1269
+ args: [{ selector: "es-image-cropper", imports: [NgIf, ImageCropperComponent, FormsModule, FormsAndValidationsModule], template: "<div *ngIf=\"ProfileImage?.nativefiles?.length > 0\" [style.width.px]=\"Width\">\r\n <div class=\"d-flex\">\r\n <button (click)=\"onRotateLeft()\" class=\"btn btn-primary\"><i class=\"fa fa-undo\"></i></button>\r\n <button (click)=\"onRotateRight()\" class=\"btn btn-primary\"><i class=\"fa fa-repeat\"></i></button>\r\n <button (click)=\"onFlipHorizontal()\" class=\"btn btn-primary\"><i class=\"fa fa-arrows-h\"></i></button>\r\n <button (click)=\"onFlipVertical()\" class=\"btn btn-primary\"><i class=\"fa fa-arrows-v\"></i></button>\r\n <button (click)=\"onZoomIn()\" class=\"btn btn-primary\"><i class=\"fa fa-search-plus\"></i></button>\r\n <button (click)=\"onZoomOut()\" class=\"btn btn-primary\"><i class=\"fa fa-search-minus\"></i></button>\r\n <button (click)=\"onResetImage()\" class=\"btn btn-danger\" style=\"margin-left: auto; margin-right: 0px;\"><i class=\"fa fa-times\"></i></button>\r\n </div>\r\n</div>\r\n<div class=\"app-margin-top-10\" [style.max-height.px]=\"Height\" [style.width.px]=\"Width\">\r\n <form-file *ngIf=\"!(ProfileImage?.nativefiles?.length > 0)\" [LabelInputRatio]=\"'0 12'\" [FancyMode]=\"true\" [(ngModel)]=\"ProfileImage\" name=\"imageToCrop\"></form-file>\r\n <ng-container *ngIf=\"ProfileImage?.nativefiles?.length > 0\">\r\n <image-cropper style=\"--cropper-outline-color: rgba(0,0,0)\"\r\n [backgroundColor]=\"'#91a3b0'\"\r\n [imageFile]=\"ProfileImage.nativefiles[0]\"\r\n [aspectRatio]=\"4 / 3\"\r\n [maintainAspectRatio]=\"true\"\r\n [containWithinAspectRatio]=\"true\"\r\n [cropperStaticWidth]=\"320\"\r\n [cropperStaticHeight]=\"320\"\r\n [onlyScaleDown]=\"true\"\r\n [roundCropper]=\"true\"\r\n [canvasRotation]=\"canvasRotation\"\r\n [allowMoveImage]=\"true\"\r\n [(transform)]=\"transform\"\r\n (imageCropped)=\"onImageCropped($event)\">\r\n </image-cropper>\r\n </ng-container>\r\n</div>", styles: [".btn{width:40px;margin-right:10px}\n"] }]
1270
+ }], ctorParameters: () => [], propDecorators: { Height: [{
1271
+ type: Input
1272
+ }], Width: [{
1273
+ type: Input
1268
1274
  }] } });
1269
1275
 
1270
- // Angular
1271
- const COMPONENTS = [
1272
- BackTop,
1273
- Breadcrumb,
1274
- PageNotFoundComponent,
1275
- ServerErrorComponent,
1276
- AngularErrorComponent,
1277
- PagesComponent,
1278
- ExternalPagesComponent,
1279
- JaceLoginComponent,
1280
- Navbar,
1281
- RedirecterComponent,
1282
- Sidebar,
1283
- JaceResourceComponent,
1284
- EsModalComponent,
1285
- EsModalHeadComponent,
1286
- LabeledSpanComponent,
1287
- EsImageCropperComponent
1288
- ];
1289
- class ComponentsModule {
1290
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1291
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: ComponentsModule, imports: [CommonModule, RouterModule, FormsModule, DirectivesModule, LocalizationModule, ProgressbarModule, MatSlideToggleModule, BsDropdownModule, EsTableModule, ModalModule, BackTop,
1292
- Breadcrumb,
1293
- PageNotFoundComponent,
1294
- ServerErrorComponent,
1295
- AngularErrorComponent,
1296
- PagesComponent,
1297
- ExternalPagesComponent,
1298
- JaceLoginComponent,
1299
- Navbar,
1300
- RedirecterComponent,
1301
- Sidebar,
1302
- JaceResourceComponent,
1303
- EsModalComponent,
1304
- EsModalHeadComponent,
1305
- LabeledSpanComponent,
1306
- EsImageCropperComponent], exports: [BackTop,
1307
- Breadcrumb,
1308
- PageNotFoundComponent,
1309
- ServerErrorComponent,
1310
- AngularErrorComponent,
1311
- PagesComponent,
1312
- ExternalPagesComponent,
1313
- JaceLoginComponent,
1314
- Navbar,
1315
- RedirecterComponent,
1316
- Sidebar,
1317
- JaceResourceComponent,
1318
- EsModalComponent,
1319
- EsModalHeadComponent,
1320
- LabeledSpanComponent,
1321
- EsImageCropperComponent] }); }
1322
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ComponentsModule, imports: [CommonModule, RouterModule, FormsModule, DirectivesModule, LocalizationModule, ProgressbarModule, MatSlideToggleModule, BsDropdownModule, EsTableModule, ModalModule, PagesComponent,
1323
- Navbar,
1324
- Sidebar,
1325
- EsImageCropperComponent] }); }
1326
- }
1327
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ComponentsModule, decorators: [{
1328
- type: NgModule,
1329
- args: [{
1330
- imports: [CommonModule, RouterModule, FormsModule, DirectivesModule, LocalizationModule, ProgressbarModule, MatSlideToggleModule, BsDropdownModule, EsTableModule, ModalModule, ...COMPONENTS],
1331
- exports: [...COMPONENTS]
1332
- }]
1276
+ // Angular
1277
+ const COMPONENTS = [
1278
+ BackTop,
1279
+ Breadcrumb,
1280
+ PageNotFoundComponent,
1281
+ ServerErrorComponent,
1282
+ AngularErrorComponent,
1283
+ PagesComponent,
1284
+ ExternalPagesComponent,
1285
+ JaceLoginComponent,
1286
+ Navbar,
1287
+ RedirecterComponent,
1288
+ Sidebar,
1289
+ JaceResourceComponent,
1290
+ EsModalComponent,
1291
+ EsModalHeadComponent,
1292
+ LabeledSpanComponent,
1293
+ EsImageCropperComponent
1294
+ ];
1295
+ class ComponentsModule {
1296
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
1297
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.2.14", ngImport: i0, type: ComponentsModule, imports: [CommonModule, RouterModule, FormsModule, DirectivesModule, LocalizationModule, ProgressbarModule, MatSlideToggleModule, BsDropdownModule, EsTableModule, ModalModule, BackTop,
1298
+ Breadcrumb,
1299
+ PageNotFoundComponent,
1300
+ ServerErrorComponent,
1301
+ AngularErrorComponent,
1302
+ PagesComponent,
1303
+ ExternalPagesComponent,
1304
+ JaceLoginComponent,
1305
+ Navbar,
1306
+ RedirecterComponent,
1307
+ Sidebar,
1308
+ JaceResourceComponent,
1309
+ EsModalComponent,
1310
+ EsModalHeadComponent,
1311
+ LabeledSpanComponent,
1312
+ EsImageCropperComponent], exports: [BackTop,
1313
+ Breadcrumb,
1314
+ PageNotFoundComponent,
1315
+ ServerErrorComponent,
1316
+ AngularErrorComponent,
1317
+ PagesComponent,
1318
+ ExternalPagesComponent,
1319
+ JaceLoginComponent,
1320
+ Navbar,
1321
+ RedirecterComponent,
1322
+ Sidebar,
1323
+ JaceResourceComponent,
1324
+ EsModalComponent,
1325
+ EsModalHeadComponent,
1326
+ LabeledSpanComponent,
1327
+ EsImageCropperComponent] }); }
1328
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ComponentsModule, imports: [CommonModule, RouterModule, FormsModule, DirectivesModule, LocalizationModule, ProgressbarModule, MatSlideToggleModule, BsDropdownModule, EsTableModule, ModalModule, PagesComponent,
1329
+ Navbar,
1330
+ Sidebar,
1331
+ EsImageCropperComponent] }); }
1332
+ }
1333
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ComponentsModule, decorators: [{
1334
+ type: NgModule,
1335
+ args: [{
1336
+ imports: [CommonModule, RouterModule, FormsModule, DirectivesModule, LocalizationModule, ProgressbarModule, MatSlideToggleModule, BsDropdownModule, EsTableModule, ModalModule, ...COMPONENTS],
1337
+ exports: [...COMPONENTS]
1338
+ }]
1333
1339
  }] });
1334
1340
 
1335
- // Angular
1336
- class EmbeddingComponent extends BaseComponent {
1337
- constructor(injector, emb, location) {
1338
- super(injector);
1339
- this.injector = injector;
1340
- this.emb = emb;
1341
- this.location = location;
1342
- // TODO: Automatizzare
1343
- this.LocalhostModuleMap = {
1344
- "crm": "31813",
1345
- "sii": "21645"
1346
- };
1347
- this.EmbeddingSuccesfull = true;
1348
- }
1349
- ngOnInit() {
1350
- debugger;
1351
- let route = this.injector.get(ActivatedRoute);
1352
- this.Module = route.snapshot.params["module"];
1353
- this.Localhost = this.LocalhostModuleMap[this.Module];
1354
- route.url.subscribe((_) => {
1355
- this.gatherRouteInformations(route);
1356
- if (this.Page && this.emb.IsReloadAllowed()) {
1357
- this.Page = this.Pars = null;
1358
- requestAnimationFrame(() => { this.assignPageLoadParameters(); });
1359
- }
1360
- else
1361
- this.assignPageLoadParameters();
1362
- });
1363
- }
1364
- assignPageLoadParameters() {
1365
- // Esempio di Complete path: "/pages/embed/crm/leads/leads_search"
1366
- // Esempio di slices: ["", "pages", "embed", "crm", "leads", "leads_search"]
1367
- // Io devo sostanzialmente prendere dal nome del modulo ("crm") in poi. Nome del modulo embeddato eslcuso
1368
- console.log("Embedding...");
1369
- this.Page = this.CompletePath.split("/").slice(4).join("/");
1370
- console.log("Page: " + this.Page);
1371
- let navParKeys = Object.keys(this.NavigationParameters)?.filter(p => p != "module");
1372
- this.Pars = (navParKeys?.length || 0) == 0 ? "" : ";" + navParKeys.map(t => `${t}=${this.NavigationParameters[t]}`).join(";");
1373
- console.log("Pars: " + this.Pars);
1374
- let queryParKeys = Object.keys(this.QueryParameters);
1375
- this.QueryPars = (queryParKeys?.length || 0) == 0 ? "" : "?" + queryParKeys.map(t => `${t}=${this.QueryParameters[t]}`).join(";");
1376
- console.log("QueryPars: " + this.QueryPars);
1377
- let QueryPAramsWithoutIgnoreStorage = queryParKeys.map(t => t == "ignoreStorage" ? null : `${t}=${this.QueryParameters[t]}`).filter(t => !!t).join(";");
1378
- // Per rimuovere eventuali ignoreStorage se sto navigando a una ricerca
1379
- this.location.replaceState(this.CompletePath + this.Pars + (QueryPAramsWithoutIgnoreStorage ? '?' + QueryPAramsWithoutIgnoreStorage : ""));
1380
- this.EmbeddingSuccesfull = !!this.Page && !!this.Module && !!this.Localhost;
1381
- }
1382
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EmbeddingComponent, deps: [{ token: i0.Injector }, { token: i4.AppEmbeddingExtensions }, { token: i2.Location }], target: i0.ɵɵFactoryTarget.Component }); }
1383
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EmbeddingComponent, isStandalone: true, selector: "embedding", usesInheritance: true, ngImport: i0, template: "<jace-resource *ngIf=\"EmbeddingSuccesfull && Page\" [Module]=\"Module\" [Localhost]=\"Localhost\" Page=\"{{Page}}{{Pars}}{{QueryPars}}\"></jace-resource>\r\n<div *ngIf=\"!EmbeddingSuccesfull\">\r\n Errori nell'embeddare risorsa {{Page}};{{Pars}} del modulo {{Module}} (Localhost {{Localhost}})\r\n</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: JaceResourceComponent, selector: "jace-resource", inputs: ["Module", "ModuleKeyType", "Page", "Localhost", "Params"] }] }); }
1384
- }
1385
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EmbeddingComponent, decorators: [{
1386
- type: Component,
1387
- args: [{ selector: 'embedding', standalone: true, imports: [NgIf, JaceResourceComponent], template: "<jace-resource *ngIf=\"EmbeddingSuccesfull && Page\" [Module]=\"Module\" [Localhost]=\"Localhost\" Page=\"{{Page}}{{Pars}}{{QueryPars}}\"></jace-resource>\r\n<div *ngIf=\"!EmbeddingSuccesfull\">\r\n Errori nell'embeddare risorsa {{Page}};{{Pars}} del modulo {{Module}} (Localhost {{Localhost}})\r\n</div>" }]
1388
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i4.AppEmbeddingExtensions }, { type: i2.Location }]; } });
1341
+ // Angular
1342
+ class EmbeddingComponent extends BaseComponent {
1343
+ constructor(injector, emb, location) {
1344
+ super(injector);
1345
+ this.injector = injector;
1346
+ this.emb = emb;
1347
+ this.location = location;
1348
+ // TODO: Automatizzare
1349
+ this.LocalhostModuleMap = {
1350
+ "crm": "31813",
1351
+ "sii": "21645"
1352
+ };
1353
+ this.EmbeddingSuccesfull = true;
1354
+ }
1355
+ ngOnInit() {
1356
+ let route = this.injector.get(ActivatedRoute);
1357
+ combineLatest([route.url, route.params]).pipe(debounceTime(100)).subscribe((res) => {
1358
+ this.Module = res[1]["module"];
1359
+ this.Localhost = this.LocalhostModuleMap[this.Module];
1360
+ this.gatherRouteInformations(route);
1361
+ console.log(`Recognized a new navigation to the embedding component: ${this.Module} - ${this.CompletePath}`);
1362
+ let reloadAllowed = this.emb.IsReloadAllowed();
1363
+ if (this.Page && reloadAllowed) {
1364
+ this.Page = this.Pars = null;
1365
+ requestAnimationFrame(() => { this.assignPageLoadParameters(); });
1366
+ }
1367
+ else
1368
+ this.assignPageLoadParameters(reloadAllowed);
1369
+ });
1370
+ }
1371
+ assignPageLoadParameters(reloadAllowed = true) {
1372
+ // Esempio di Complete path: "/pages/embed/crm/leads/leads_search"
1373
+ // Esempio di slices: ["", "pages", "embed", "crm", "leads", "leads_search"]
1374
+ // Io devo sostanzialmente prendere dal nome del modulo ("crm") in poi. Nome del modulo embeddato eslcuso
1375
+ console.log("Embedding...");
1376
+ if (reloadAllowed)
1377
+ this.EmbeddingSuccesfull = false;
1378
+ // Per seccare e ricreare il componente che altrimenti non prenderebbe gli input nuovi
1379
+ requestAnimationFrame(() => {
1380
+ this.Page = this.CompletePath.split("/").slice(4).join("/");
1381
+ console.log("Page: " + this.Page);
1382
+ let navParKeys = Object.keys(this.NavigationParameters)?.filter(p => p != "module");
1383
+ this.Pars = (navParKeys?.length || 0) == 0 ? "" : ";" + navParKeys.map(t => `${t}=${this.NavigationParameters[t]}`).join(";");
1384
+ console.log("Pars: " + this.Pars);
1385
+ let queryParKeys = Object.keys(this.QueryParameters);
1386
+ this.QueryPars = (queryParKeys?.length || 0) == 0 ? "" : "?" + queryParKeys.map(t => `${t}=${this.QueryParameters[t]}`).join(";");
1387
+ console.log("QueryPars: " + this.QueryPars);
1388
+ let QueryPAramsWithoutIgnoreStorage = queryParKeys.map(t => t == "ignoreStorage" ? null : `${t}=${this.QueryParameters[t]}`).filter(t => !!t).join(";");
1389
+ // Per rimuovere eventuali ignoreStorage se sto navigando a una ricerca
1390
+ this.location.replaceState(this.CompletePath + this.Pars + (QueryPAramsWithoutIgnoreStorage ? '?' + QueryPAramsWithoutIgnoreStorage : ""));
1391
+ this.EmbeddingSuccesfull = !!this.Page && !!this.Module && !!this.Localhost;
1392
+ });
1393
+ }
1394
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EmbeddingComponent, deps: [{ token: i0.Injector }, { token: i4.AppEmbeddingExtensions }, { token: i2.Location }], target: i0.ɵɵFactoryTarget.Component }); }
1395
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: EmbeddingComponent, isStandalone: true, selector: "embedding", usesInheritance: true, ngImport: i0, template: "<jace-resource *ngIf=\"EmbeddingSuccesfull && Page\" [Module]=\"Module\" [Localhost]=\"Localhost\" Page=\"{{Page}}{{Pars}}{{QueryPars}}\"></jace-resource>\r\n<div *ngIf=\"!EmbeddingSuccesfull\">\r\n Errori nell'embeddare risorsa {{Page}};{{Pars}} del modulo {{Module}} (Localhost {{Localhost}})\r\n</div>", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: JaceResourceComponent, selector: "jace-resource", inputs: ["Module", "ModuleKeyType", "Page", "Localhost", "Params"] }] }); }
1396
+ }
1397
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EmbeddingComponent, decorators: [{
1398
+ type: Component,
1399
+ args: [{ selector: 'embedding', imports: [NgIf, JaceResourceComponent], template: "<jace-resource *ngIf=\"EmbeddingSuccesfull && Page\" [Module]=\"Module\" [Localhost]=\"Localhost\" Page=\"{{Page}}{{Pars}}{{QueryPars}}\"></jace-resource>\r\n<div *ngIf=\"!EmbeddingSuccesfull\">\r\n Errori nell'embeddare risorsa {{Page}};{{Pars}} del modulo {{Module}} (Localhost {{Localhost}})\r\n</div>" }]
1400
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i4.AppEmbeddingExtensions }, { type: i2.Location }] });
1389
1401
 
1390
- class UserInfoComponentLoc extends LocalizationService {
1391
- constructor(injector) {
1392
- super(injector);
1393
- super.set("en->it", "Name", ["Nome"]);
1394
- super.set("en->it", "Last Login Date", ["Data ultimo accesso"]);
1395
- super.set("en->it", "ID Account", ["Codice Account"]);
1396
- super.set("en->it", "ID User", ["Codice Utente"]);
1397
- super.set("en->it", "Description", ["Descrizione"]);
1398
- super.set("en->it", "Tenant Name", ["Nome Tenant"]);
1399
- super.set("en->it", "Delete", ["Cancella"]);
1400
- super.set("en->it", "Save", ["Salva"]);
1401
- super.set("en->it", "Clear User Preferences", ["Ripulisci Preferenze Utente"]);
1402
- super.set("en->it", "Old Password", ["Vecchia Password"]);
1403
- super.set("en->it", "New Password", ["Nuova Password"]);
1404
- super.set("en->it", "Confirm Password", ["Conferma nuova password"]);
1405
- super.set("en->it", "Phone Number", ["Numero di Cellulare"]);
1406
- super.set("en->it", "Email", ["Email"]);
1407
- super.set("en->it", "Change password for all tenants", ["Cambia password per tutti i Tenant"]);
1408
- super.set("en->it", "Change password for external systems", ["Cambia password per sistemi esterni"]);
1409
- super.set("en->it", "Change", ["Modifica"]);
1410
- super.set("en->it", "Recovery Info", ["Informazioni di Recupero"]);
1411
- super.set("en->it", "Visibility Info", ["Info Visibilita'"]);
1412
- super.set("en->it", "Roles", ["Ruoli"]);
1413
- super.set("en->it", "Permissions", ["Permessi"]);
1414
- super.set("en->it", "Preference", ["Preferenze"]);
1415
- super.set("en->it", "Reset", ["Reimposta"]);
1416
- super.set("en->it", "Upload Image", ["Carica Immagine"]);
1417
- super.set("en->it", "Show Advanced", ["Mostra Avanzate"]);
1418
- super.set("en->it", "Change Profile Picture", ["Cambia Immagine del Profilo"]);
1419
- super.set("en->it", "Delete Profile Picture", ["Rimuovi Immagine del Profilo"]);
1420
- super.set("en->it", "Password", ["Password"]);
1421
- super.set("en->it", "Error", ["Errore"]);
1422
- }
1423
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserInfoComponentLoc, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
1424
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserInfoComponentLoc }); }
1425
- }
1426
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserInfoComponentLoc, decorators: [{
1427
- type: Injectable
1428
- }], ctorParameters: function () { return [{ type: i0.Injector }]; } });
1402
+ class UserInfoComponentLoc extends LocalizationService {
1403
+ constructor(injector) {
1404
+ super(injector);
1405
+ super.set("en->it", "Name", ["Nome"]);
1406
+ super.set("en->it", "Last Login Date", ["Data ultimo accesso"]);
1407
+ super.set("en->it", "ID Account", ["Codice Account"]);
1408
+ super.set("en->it", "ID User", ["Codice Utente"]);
1409
+ super.set("en->it", "Description", ["Descrizione"]);
1410
+ super.set("en->it", "Tenant Name", ["Nome Tenant"]);
1411
+ super.set("en->it", "Delete", ["Cancella"]);
1412
+ super.set("en->it", "Save", ["Salva"]);
1413
+ super.set("en->it", "Clear User Preferences", ["Ripulisci Preferenze Utente"]);
1414
+ super.set("en->it", "Old Password", ["Vecchia Password"]);
1415
+ super.set("en->it", "New Password", ["Nuova Password"]);
1416
+ super.set("en->it", "Confirm Password", ["Conferma nuova password"]);
1417
+ super.set("en->it", "Phone Number", ["Numero di Cellulare"]);
1418
+ super.set("en->it", "Email", ["Email"]);
1419
+ super.set("en->it", "Change password for all tenants", ["Cambia password per tutti i Tenant"]);
1420
+ super.set("en->it", "Change password for external systems", ["Cambia password per sistemi esterni"]);
1421
+ super.set("en->it", "Change", ["Modifica"]);
1422
+ super.set("en->it", "Recovery Info", ["Informazioni di Recupero"]);
1423
+ super.set("en->it", "Visibility Info", ["Info Visibilita'"]);
1424
+ super.set("en->it", "Roles", ["Ruoli"]);
1425
+ super.set("en->it", "Permissions", ["Permessi"]);
1426
+ super.set("en->it", "Preference", ["Preferenze"]);
1427
+ super.set("en->it", "Reset", ["Reimposta"]);
1428
+ super.set("en->it", "Upload Image", ["Carica Immagine"]);
1429
+ super.set("en->it", "Show Advanced", ["Mostra Avanzate"]);
1430
+ super.set("en->it", "Change Profile Picture", ["Cambia Immagine del Profilo"]);
1431
+ super.set("en->it", "Delete Profile Picture", ["Rimuovi Immagine del Profilo"]);
1432
+ super.set("en->it", "Password", ["Password"]);
1433
+ super.set("en->it", "Error", ["Errore"]);
1434
+ }
1435
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: UserInfoComponentLoc, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); }
1436
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: UserInfoComponentLoc }); }
1437
+ }
1438
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: UserInfoComponentLoc, decorators: [{
1439
+ type: Injectable
1440
+ }], ctorParameters: () => [{ type: i0.Injector }] });
1429
1441
 
1430
- // Angular
1431
- class UserInfosComponent extends BaseComponent {
1432
- constructor(inj, tks, msgExts, expExts, utiExts, lc, _state, profile) {
1433
- super(inj);
1434
- this.inj = inj;
1435
- this.tks = tks;
1436
- this.msgExts = msgExts;
1437
- this.expExts = expExts;
1438
- this.utiExts = utiExts;
1439
- this.lc = lc;
1440
- this._state = _state;
1441
- this.profile = profile;
1442
- this.UpdateProfilePictureDTO = null;
1443
- this.UpdateRecoverySettingsDTO = null;
1444
- this.UpdatePasswordDTO = null;
1445
- }
1446
- ngOnInit() {
1447
- this.getAccountDetails();
1448
- }
1449
- async getAccountDetails() {
1450
- // Recupero le informazioni Account partendo dalla identity
1451
- let identity = this.tks.getJaceIdentity();
1452
- if (identity) {
1453
- this.AccountRoles = identity.Roles;
1454
- this.AccountPermissions = identity.Permissions;
1455
- this.AccountDetails = await this.profile.getAccountProfile();
1456
- }
1457
- }
1458
- onShowAccountRoles() {
1459
- this.dlgShowAccountRoles.show();
1460
- }
1461
- onUpdateProfilePicture() {
1462
- this.UpdateProfilePictureDTO = null;
1463
- requestAnimationFrame(() => {
1464
- this.UpdateProfilePictureDTO = { image: null };
1465
- this.dlgUpdateProfilePicture.show();
1466
- });
1467
- }
1468
- async doUpdateProfilePicture() {
1469
- let res = await this.profile.doUpdateProfilePicture(new File([this.imageCropper.OutputImage], "profile.png"));
1470
- this.msgExts.manageCallResultResponse(res, "Modifica eseguita con Successo", "Errori nella modifica", () => {
1471
- this.dlgUpdateProfilePicture.hide();
1472
- });
1473
- }
1474
- //#endregion
1475
- //#region Delete Profile Picture
1476
- onDeleteProfilePicture() {
1477
- this.msgExts.simpleWarningWithChoice("Conferma eliminazione", "Si e' certi di voler rimuovere l'immagine profilo?", () => {
1478
- this.doDeleteProfilePicture();
1479
- });
1480
- }
1481
- async doDeleteProfilePicture() {
1482
- let res = await this.profile.doDeleteProfilePicture();
1483
- this.msgExts.manageCallResultResponse(res, "Immagine profilo rimossa con successo", "Errori nella rimozione della immagine profilo", () => {
1484
- this.dlgUpdateProfilePicture.hide();
1485
- });
1486
- }
1487
- onUpdateRecoverySettings() {
1488
- this.UpdateRecoverySettingsDTO = null;
1489
- requestAnimationFrame(() => {
1490
- this.UpdateRecoverySettingsDTO = { email: this.AccountDetails.recoveryemail };
1491
- this.dlgUpdateRecoverySettings.show();
1492
- });
1493
- }
1494
- async doUpdateRecoverySettings() {
1495
- let res = await this.profile.doUpdateRecoverySettings(this.UpdateRecoverySettingsDTO.email);
1496
- this.msgExts.manageCallResultResponse(res, "Modifica eseguita con Successo", "Errori nella modifica", () => {
1497
- this.getAccountDetails();
1498
- this.dlgUpdateRecoverySettings.hide();
1499
- });
1500
- }
1501
- onUpdatePassword() {
1502
- this.UpdatePasswordDTO = null;
1503
- requestAnimationFrame(() => {
1504
- this.CustomError = "";
1505
- this.UpdatePasswordDTO = new UpdatePasswordDto();
1506
- this.dlgUpdatePassword.show();
1507
- });
1508
- }
1509
- async doUpdatePassword() {
1510
- if (this.UpdatePasswordDTO.newpwd != this.UpdatePasswordDTO.confirmpwd)
1511
- this.CustomError = "Le password inserite non coincidono.";
1512
- else {
1513
- let res = await this.profile.doUpdatePassword(this.UpdatePasswordDTO.oldpwd, this.UpdatePasswordDTO.newpwd, this.UpdatePasswordDTO.confirmpwd);
1514
- this.msgExts.manageCallResultResponse(res, "Password modificata con Successo", "Errori nella modifica della Password", () => { this.dlgUpdatePassword.hide(); });
1515
- }
1516
- }
1517
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserInfosComponent, deps: [{ token: i0.Injector }, { token: i1.TokenService }, { token: i4.MessageService }, { token: i4.ExportService }, { token: i4.UtilityService }, { token: i1$2.LocalizationService }, { token: i1.AppState }, { token: i1.UserPreferencesService }], target: i0.ɵɵFactoryTarget.Component }); }
1518
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UserInfosComponent, isStandalone: true, selector: "user-infos", viewQueries: [{ propertyName: "dlgShowAccountRoles", first: true, predicate: ["dlgShowAccountRoles"], descendants: true }, { propertyName: "dlgUpdateProfilePicture", first: true, predicate: ["dlgUpdateProfilePicture"], descendants: true }, { propertyName: "imageCropper", first: true, predicate: ["imageCropper"], descendants: true }, { propertyName: "dlgUpdateRecoverySettings", first: true, predicate: ["dlgUpdateRecoverySettings"], descendants: true }, { propertyName: "dlgUpdatePassword", first: true, predicate: ["dlgUpdatePassword"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div style=\"height: 100%; width: 100%; display: flex;\">\r\n <div style=\"margin: auto;\">\r\n <div class=\"user-img-container\">\r\n <img [src]=\"profile.ProfilePicture\" alt=\"user-img\" class=\"user-img\" />\r\n <div class=\"app-pointer user-img-btn\">\r\n <div class=\"app-opacity user-img-btn-body\" (click)=\"onUpdateProfilePicture();\">\r\n <i class=\"far fa-pen\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"app-margin-top-15\" style=\"position: relative;\" *ngIf=\"AccountDetails\">\r\n <div class=\"card card-body app-no-margin app-padding-15\">\r\n <div class=\"row\">\r\n <div *ac=\"'R:Jace Admin'\" class=\"user-roles-btn\" [matTooltip]=\"'Visualizza Ruoli e Permessi'\" matTooltipPosition=\"above\" (click)=\"onShowAccountRoles();\">\r\n <i class=\"far fa-book-user\"></i>\r\n </div>\r\n <div class=\"col-md-6\"><labeled-span [Label]=\"'Utente' | localize : lc\" Display=\"Vertical\">{{AccountDetails.username}}</labeled-span></div>\r\n <div class=\"col-md-6\"><labeled-span [Label]=\"'Tenant' | localize : lc\" Display=\"Vertical\">{{AccountDetails.tenantid}}</labeled-span></div>\r\n <div class=\"col-md-6 app-margin-top-10\"><labeled-span [Label]=\"'Nome' | localize : lc\" Display=\"Vertical\">{{AccountDetails.firstname}}</labeled-span></div>\r\n <div class=\"col-md-6 app-margin-top-10\"><labeled-span [Label]=\"'Cognome' | localize : lc\" Display=\"Vertical\">{{AccountDetails.lastname}}</labeled-span> </div>\r\n <div class=\"col-md-12 app-margin-top-10\"><labeled-span [Label]=\"'Email' | localize : lc\" Display=\"Vertical\">{{AccountDetails.recoveryemail || 'Non disponibile'}}</labeled-span></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"app-margin-top-10 row\">\r\n <div class=\"col-md-6\" style=\"padding-right: 5px;\">\r\n <button type=\"button\" style=\"width: 100%;\" class=\"btn btn-primary\" (click)=\"onUpdatePassword()\">Modifica Password</button>\r\n </div>\r\n <div class=\"col-md-6\" style=\"padding-left: 5px;\">\r\n <button type=\"button\" style=\"width: 100%;\" class=\"btn btn-primary\" (click)=\"onUpdateRecoverySettings()\">Modifica Email</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!--Update Password-->\r\n<es-modal #dlgUpdatePassword [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgUpdatePassword.hide();\">\r\n <h5 class=\"modal-title pull-left\">Modifica Password</h5>\r\n </es-modal-head>\r\n <form *ngIf=\"UpdatePasswordDTO\" #formUpdatePassword=\"ngForm\" (ngSubmit)=\"formUpdatePassword.valid && doUpdatePassword()\">\r\n <div class=\"modal-body lastfix\">\r\n <form-input [Password]=\"true\" [Label]=\"'Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.oldpwd\" name=\"oldpw\" required></form-input>\r\n <form-input [Password]=\"true\" [Label]=\"'Nuova Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.newpwd\" name=\"newpw\" required></form-input>\r\n <form-input [Password]=\"true\" [Label]=\"'Conferma Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.confirmpwd\" name=\"confpw\" required></form-input>\r\n <!--Validazione Custom-->\r\n <div *ngIf=\"CustomError\" class=\"app-white-text app-margin-top-15 app-margin-bottom-0 card app-padding-10 card-danger\">\r\n <strong>{{'Error' | localize : lc}}:&nbsp;</strong>{{CustomError}}\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-10\" (click)=\"dlgUpdatePassword.hide();\">{{'Cancel' | localize : lc}}</button>\r\n <button type=\"submit\" class=\"btn btn-primary\">Conferma</button>\r\n </div>\r\n </form>\r\n</es-modal>\r\n\r\n<!--Update Extra Info-->\r\n<es-modal #dlgUpdateRecoverySettings [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgUpdateRecoverySettings.hide();\">\r\n <h5 class=\"modal-title pull-left\">{{'Modifica Email' | localize : lc}}</h5>\r\n </es-modal-head>\r\n <form *ngIf=\"UpdateRecoverySettingsDTO\" #formUpdateInfos=\"ngForm\" (ngSubmit)=\"formUpdateInfos.valid && doUpdateRecoverySettings()\">\r\n <div class=\"modal-body lastfix\">\r\n <form-input [LabelInputRatio]=\"'3 9'\" [Label]=\"'Email' | localize: lc\" [(ngModel)]=\"UpdateRecoverySettingsDTO.email\" name=\"email\"></form-input>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-10\" (click)=\"dlgUpdateRecoverySettings.hide();\">{{'Cancel' | localize : lc}}</button>\r\n <button type=\"submit\" class=\"btn btn-primary\">Conferma</button>\r\n </div>\r\n </form>\r\n</es-modal>\r\n\r\n<!--Upload Picture-->\r\n<es-modal #dlgUpdateProfilePicture [Size]=\"'XL'\">\r\n <es-modal-head (Close)=\"dlgUpdateProfilePicture.hide();\">\r\n <h5 class=\"modal-title pull-left\">Carica immagine</h5>\r\n </es-modal-head>\r\n <div class=\"modal-body d-flex\">\r\n <div style=\"margin: auto;\">\r\n <es-image-cropper #imageCropper [Height]=\"600\" [Width]=\"800\"></es-image-cropper>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"dlgUpdateProfilePicture.hide()\">Annulla</button>\r\n <button type=\"submit\" class=\"btn btn-primary\" (click)=\"doUpdateProfilePicture()\">Conferma</button>\r\n </div>\r\n</es-modal>\r\n\r\n<!--Ruoli e Permessi-->\r\n<es-modal #dlgShowAccountRoles [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgShowAccountRoles.hide();\">\r\n <h5 class=\"modal-title pull-left\">{{'Ruoli e Permessi' | localize : lc}}</h5>\r\n </es-modal-head>\r\n <div class=\"modal-body\" style=\"max-height: 600px; overflow-y: auto;\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\" *ngIf=\"AccountRoles\">\r\n <labeled-span [Label]=\"'Ruoli'\" Display=\"Vertical\">\r\n <div *ngFor=\"let r of AccountRoles;\">{{r}}</div>\r\n </labeled-span>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"AccountPermissions\">\r\n <labeled-span [Label]=\"'Permessi'\" Display=\"Vertical\">\r\n <div *ngFor=\"let p of AccountPermissions;\">{{p}}</div>\r\n </labeled-span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"dlgShowAccountRoles.hide();\">{{'Chiudi' | localize : lc}}</button>\r\n </div>\r\n</es-modal>", styles: [".app-wideplus{width:100%;text-align:center;border:1px solid #ccc;border-radius:5px;padding:5px}.btn-outline-main-modified{color:#242d3a;border-color:#242d3a;background:transparent}.btn-outline-main-modified:hover{color:#fff;background:#242d3a;border-color:#242d3a}.user-img-container{position:relative;width:200px;margin:auto}.user-img{object-fit:cover;max-height:200px;min-height:200px;min-width:200px;max-width:200px;border-radius:50%;box-shadow:0 8px 6px #1313130a,0 12px 16px #1313130d}.user-img-btn{position:absolute;right:0;width:40px;height:40px;margin-top:-50px}.user-img-btn-body{background-color:#0056b3;color:#fff;border-radius:50%;text-align:center;height:100%;font-size:1.2rem;line-height:2.5rem}.user-roles-btn{position:absolute;top:0;right:2px;font-size:1.2rem;padding:5px;z-index:1;color:#0056b3;cursor:pointer;width:auto}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsAndValidationsModule }, { kind: "component", type: i2$3.FormInputComponent, selector: "form-input", inputs: ["Password"], outputs: ["onSuffixAction", "onPrefixAction"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: LocalizationModule }, { kind: "pipe", type: i1$2.LocalizePipe, name: "localize" }, { kind: "component", type: EsModalComponent, selector: "es-modal", inputs: ["Size", "IgnoreBackdrop", "Backdrop", "HasOverlap"], outputs: ["onShow", "onHide"] }, { kind: "component", type: EsModalHeadComponent, selector: "es-modal-head", outputs: ["Close"] }, { kind: "component", type: EsImageCropperComponent, selector: "es-image-cropper", inputs: ["Height", "Width"] }, { kind: "component", type: LabeledSpanComponent, selector: "labeled-span", inputs: ["First", "Label", "Display"] }, { kind: "ngmodule", type: ExtensionsModule }, { kind: "ngmodule", type: AccessControlModule }, { kind: "directive", type: i5.AccessControlDirective, selector: "[ac]", inputs: ["ac", "acAbsolute"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7$1.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }], viewProviders: [{ provide: LocalizationService, useClass: UserInfoComponentLoc }] }); }
1519
- }
1520
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UserInfosComponent, decorators: [{
1521
- type: Component,
1522
- args: [{ selector: "user-infos", viewProviders: [{ provide: LocalizationService, useClass: UserInfoComponentLoc }], standalone: true, imports: [
1523
- FormsModule,
1524
- FormsAndValidationsModule,
1525
- NgIf,
1526
- NgFor,
1527
- LocalizationModule,
1528
- EsModalComponent,
1529
- EsModalHeadComponent,
1530
- EsImageCropperComponent,
1531
- LabeledSpanComponent,
1532
- ExtensionsModule,
1533
- AccessControlModule,
1534
- MatTooltipModule
1535
- ], template: "<div style=\"height: 100%; width: 100%; display: flex;\">\r\n <div style=\"margin: auto;\">\r\n <div class=\"user-img-container\">\r\n <img [src]=\"profile.ProfilePicture\" alt=\"user-img\" class=\"user-img\" />\r\n <div class=\"app-pointer user-img-btn\">\r\n <div class=\"app-opacity user-img-btn-body\" (click)=\"onUpdateProfilePicture();\">\r\n <i class=\"far fa-pen\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"app-margin-top-15\" style=\"position: relative;\" *ngIf=\"AccountDetails\">\r\n <div class=\"card card-body app-no-margin app-padding-15\">\r\n <div class=\"row\">\r\n <div *ac=\"'R:Jace Admin'\" class=\"user-roles-btn\" [matTooltip]=\"'Visualizza Ruoli e Permessi'\" matTooltipPosition=\"above\" (click)=\"onShowAccountRoles();\">\r\n <i class=\"far fa-book-user\"></i>\r\n </div>\r\n <div class=\"col-md-6\"><labeled-span [Label]=\"'Utente' | localize : lc\" Display=\"Vertical\">{{AccountDetails.username}}</labeled-span></div>\r\n <div class=\"col-md-6\"><labeled-span [Label]=\"'Tenant' | localize : lc\" Display=\"Vertical\">{{AccountDetails.tenantid}}</labeled-span></div>\r\n <div class=\"col-md-6 app-margin-top-10\"><labeled-span [Label]=\"'Nome' | localize : lc\" Display=\"Vertical\">{{AccountDetails.firstname}}</labeled-span></div>\r\n <div class=\"col-md-6 app-margin-top-10\"><labeled-span [Label]=\"'Cognome' | localize : lc\" Display=\"Vertical\">{{AccountDetails.lastname}}</labeled-span> </div>\r\n <div class=\"col-md-12 app-margin-top-10\"><labeled-span [Label]=\"'Email' | localize : lc\" Display=\"Vertical\">{{AccountDetails.recoveryemail || 'Non disponibile'}}</labeled-span></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"app-margin-top-10 row\">\r\n <div class=\"col-md-6\" style=\"padding-right: 5px;\">\r\n <button type=\"button\" style=\"width: 100%;\" class=\"btn btn-primary\" (click)=\"onUpdatePassword()\">Modifica Password</button>\r\n </div>\r\n <div class=\"col-md-6\" style=\"padding-left: 5px;\">\r\n <button type=\"button\" style=\"width: 100%;\" class=\"btn btn-primary\" (click)=\"onUpdateRecoverySettings()\">Modifica Email</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!--Update Password-->\r\n<es-modal #dlgUpdatePassword [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgUpdatePassword.hide();\">\r\n <h5 class=\"modal-title pull-left\">Modifica Password</h5>\r\n </es-modal-head>\r\n <form *ngIf=\"UpdatePasswordDTO\" #formUpdatePassword=\"ngForm\" (ngSubmit)=\"formUpdatePassword.valid && doUpdatePassword()\">\r\n <div class=\"modal-body lastfix\">\r\n <form-input [Password]=\"true\" [Label]=\"'Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.oldpwd\" name=\"oldpw\" required></form-input>\r\n <form-input [Password]=\"true\" [Label]=\"'Nuova Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.newpwd\" name=\"newpw\" required></form-input>\r\n <form-input [Password]=\"true\" [Label]=\"'Conferma Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.confirmpwd\" name=\"confpw\" required></form-input>\r\n <!--Validazione Custom-->\r\n <div *ngIf=\"CustomError\" class=\"app-white-text app-margin-top-15 app-margin-bottom-0 card app-padding-10 card-danger\">\r\n <strong>{{'Error' | localize : lc}}:&nbsp;</strong>{{CustomError}}\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-10\" (click)=\"dlgUpdatePassword.hide();\">{{'Cancel' | localize : lc}}</button>\r\n <button type=\"submit\" class=\"btn btn-primary\">Conferma</button>\r\n </div>\r\n </form>\r\n</es-modal>\r\n\r\n<!--Update Extra Info-->\r\n<es-modal #dlgUpdateRecoverySettings [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgUpdateRecoverySettings.hide();\">\r\n <h5 class=\"modal-title pull-left\">{{'Modifica Email' | localize : lc}}</h5>\r\n </es-modal-head>\r\n <form *ngIf=\"UpdateRecoverySettingsDTO\" #formUpdateInfos=\"ngForm\" (ngSubmit)=\"formUpdateInfos.valid && doUpdateRecoverySettings()\">\r\n <div class=\"modal-body lastfix\">\r\n <form-input [LabelInputRatio]=\"'3 9'\" [Label]=\"'Email' | localize: lc\" [(ngModel)]=\"UpdateRecoverySettingsDTO.email\" name=\"email\"></form-input>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-10\" (click)=\"dlgUpdateRecoverySettings.hide();\">{{'Cancel' | localize : lc}}</button>\r\n <button type=\"submit\" class=\"btn btn-primary\">Conferma</button>\r\n </div>\r\n </form>\r\n</es-modal>\r\n\r\n<!--Upload Picture-->\r\n<es-modal #dlgUpdateProfilePicture [Size]=\"'XL'\">\r\n <es-modal-head (Close)=\"dlgUpdateProfilePicture.hide();\">\r\n <h5 class=\"modal-title pull-left\">Carica immagine</h5>\r\n </es-modal-head>\r\n <div class=\"modal-body d-flex\">\r\n <div style=\"margin: auto;\">\r\n <es-image-cropper #imageCropper [Height]=\"600\" [Width]=\"800\"></es-image-cropper>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"dlgUpdateProfilePicture.hide()\">Annulla</button>\r\n <button type=\"submit\" class=\"btn btn-primary\" (click)=\"doUpdateProfilePicture()\">Conferma</button>\r\n </div>\r\n</es-modal>\r\n\r\n<!--Ruoli e Permessi-->\r\n<es-modal #dlgShowAccountRoles [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgShowAccountRoles.hide();\">\r\n <h5 class=\"modal-title pull-left\">{{'Ruoli e Permessi' | localize : lc}}</h5>\r\n </es-modal-head>\r\n <div class=\"modal-body\" style=\"max-height: 600px; overflow-y: auto;\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\" *ngIf=\"AccountRoles\">\r\n <labeled-span [Label]=\"'Ruoli'\" Display=\"Vertical\">\r\n <div *ngFor=\"let r of AccountRoles;\">{{r}}</div>\r\n </labeled-span>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"AccountPermissions\">\r\n <labeled-span [Label]=\"'Permessi'\" Display=\"Vertical\">\r\n <div *ngFor=\"let p of AccountPermissions;\">{{p}}</div>\r\n </labeled-span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"dlgShowAccountRoles.hide();\">{{'Chiudi' | localize : lc}}</button>\r\n </div>\r\n</es-modal>", styles: [".app-wideplus{width:100%;text-align:center;border:1px solid #ccc;border-radius:5px;padding:5px}.btn-outline-main-modified{color:#242d3a;border-color:#242d3a;background:transparent}.btn-outline-main-modified:hover{color:#fff;background:#242d3a;border-color:#242d3a}.user-img-container{position:relative;width:200px;margin:auto}.user-img{object-fit:cover;max-height:200px;min-height:200px;min-width:200px;max-width:200px;border-radius:50%;box-shadow:0 8px 6px #1313130a,0 12px 16px #1313130d}.user-img-btn{position:absolute;right:0;width:40px;height:40px;margin-top:-50px}.user-img-btn-body{background-color:#0056b3;color:#fff;border-radius:50%;text-align:center;height:100%;font-size:1.2rem;line-height:2.5rem}.user-roles-btn{position:absolute;top:0;right:2px;font-size:1.2rem;padding:5px;z-index:1;color:#0056b3;cursor:pointer;width:auto}\n"] }]
1536
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.TokenService }, { type: i4.MessageService }, { type: i4.ExportService }, { type: i4.UtilityService }, { type: i1$2.LocalizationService }, { type: i1.AppState }, { type: i1.UserPreferencesService }]; }, propDecorators: { dlgShowAccountRoles: [{
1537
- type: ViewChild,
1538
- args: ["dlgShowAccountRoles"]
1539
- }], dlgUpdateProfilePicture: [{
1540
- type: ViewChild,
1541
- args: ["dlgUpdateProfilePicture"]
1542
- }], imageCropper: [{
1543
- type: ViewChild,
1544
- args: ['imageCropper']
1545
- }], dlgUpdateRecoverySettings: [{
1546
- type: ViewChild,
1547
- args: ["dlgUpdateRecoverySettings"]
1548
- }], dlgUpdatePassword: [{
1549
- type: ViewChild,
1550
- args: ["dlgUpdatePassword"]
1442
+ // Angular
1443
+ class UserInfosComponent extends BaseComponent {
1444
+ constructor(inj, tks, msgExts, expExts, utiExts, lc, _state, profile) {
1445
+ super(inj);
1446
+ this.inj = inj;
1447
+ this.tks = tks;
1448
+ this.msgExts = msgExts;
1449
+ this.expExts = expExts;
1450
+ this.utiExts = utiExts;
1451
+ this.lc = lc;
1452
+ this._state = _state;
1453
+ this.profile = profile;
1454
+ this.UpdateProfilePictureDTO = null;
1455
+ this.UpdateRecoverySettingsDTO = null;
1456
+ this.UpdatePasswordDTO = null;
1457
+ }
1458
+ ngOnInit() {
1459
+ this.getAccountDetails();
1460
+ }
1461
+ async getAccountDetails() {
1462
+ // Recupero le informazioni Account partendo dalla identity
1463
+ let identity = this.tks.getJaceIdentity();
1464
+ if (identity) {
1465
+ this.AccountRoles = identity.Roles;
1466
+ this.AccountPermissions = identity.Permissions;
1467
+ this.AccountDetails = await this.profile.getAccountProfile();
1468
+ }
1469
+ }
1470
+ onShowAccountRoles() {
1471
+ this.dlgShowAccountRoles.show();
1472
+ }
1473
+ onUpdateProfilePicture() {
1474
+ this.UpdateProfilePictureDTO = null;
1475
+ requestAnimationFrame(() => {
1476
+ this.UpdateProfilePictureDTO = { image: null };
1477
+ this.dlgUpdateProfilePicture.show();
1478
+ });
1479
+ }
1480
+ async doUpdateProfilePicture() {
1481
+ let res = await this.profile.doUpdateProfilePicture(new File([this.imageCropper.OutputImage], "profile.png"));
1482
+ this.msgExts.manageCallResultResponse(res, "Modifica eseguita con Successo", "Errori nella modifica", () => {
1483
+ this.dlgUpdateProfilePicture.hide();
1484
+ });
1485
+ }
1486
+ //#endregion
1487
+ //#region Delete Profile Picture
1488
+ onDeleteProfilePicture() {
1489
+ this.msgExts.simpleWarningWithChoice("Conferma eliminazione", "Si e' certi di voler rimuovere l'immagine profilo?", () => {
1490
+ this.doDeleteProfilePicture();
1491
+ });
1492
+ }
1493
+ async doDeleteProfilePicture() {
1494
+ let res = await this.profile.doDeleteProfilePicture();
1495
+ this.msgExts.manageCallResultResponse(res, "Immagine profilo rimossa con successo", "Errori nella rimozione della immagine profilo", () => {
1496
+ this.dlgUpdateProfilePicture.hide();
1497
+ });
1498
+ }
1499
+ onUpdateRecoverySettings() {
1500
+ this.UpdateRecoverySettingsDTO = null;
1501
+ requestAnimationFrame(() => {
1502
+ this.UpdateRecoverySettingsDTO = { email: this.AccountDetails.recoveryemail };
1503
+ this.dlgUpdateRecoverySettings.show();
1504
+ });
1505
+ }
1506
+ async doUpdateRecoverySettings() {
1507
+ let res = await this.profile.doUpdateRecoverySettings(this.UpdateRecoverySettingsDTO.email);
1508
+ this.msgExts.manageCallResultResponse(res, "Modifica eseguita con Successo", "Errori nella modifica", () => {
1509
+ this.getAccountDetails();
1510
+ this.dlgUpdateRecoverySettings.hide();
1511
+ });
1512
+ }
1513
+ onUpdatePassword() {
1514
+ this.UpdatePasswordDTO = null;
1515
+ requestAnimationFrame(() => {
1516
+ this.CustomError = "";
1517
+ this.UpdatePasswordDTO = new UpdatePasswordDto();
1518
+ this.dlgUpdatePassword.show();
1519
+ });
1520
+ }
1521
+ async doUpdatePassword() {
1522
+ if (this.UpdatePasswordDTO.newpwd != this.UpdatePasswordDTO.confirmpwd)
1523
+ this.CustomError = "Le password inserite non coincidono.";
1524
+ else {
1525
+ let res = await this.profile.doUpdatePassword(this.UpdatePasswordDTO.oldpwd, this.UpdatePasswordDTO.newpwd, this.UpdatePasswordDTO.confirmpwd);
1526
+ this.msgExts.manageCallResultResponse(res, "Password modificata con Successo", "Errori nella modifica della Password", () => { this.dlgUpdatePassword.hide(); });
1527
+ }
1528
+ }
1529
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: UserInfosComponent, deps: [{ token: i0.Injector }, { token: i1.TokenService }, { token: i4.MessageService }, { token: i4.ExportService }, { token: i4.UtilityService }, { token: i1$2.LocalizationService }, { token: i1.AppState }, { token: i1.UserPreferencesService }], target: i0.ɵɵFactoryTarget.Component }); }
1530
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: UserInfosComponent, isStandalone: true, selector: "user-infos", viewQueries: [{ propertyName: "dlgShowAccountRoles", first: true, predicate: ["dlgShowAccountRoles"], descendants: true }, { propertyName: "dlgUpdateProfilePicture", first: true, predicate: ["dlgUpdateProfilePicture"], descendants: true }, { propertyName: "imageCropper", first: true, predicate: ["imageCropper"], descendants: true }, { propertyName: "dlgUpdateRecoverySettings", first: true, predicate: ["dlgUpdateRecoverySettings"], descendants: true }, { propertyName: "dlgUpdatePassword", first: true, predicate: ["dlgUpdatePassword"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div style=\"height: 100%; width: 100%; display: flex;\">\r\n <div style=\"margin: auto;\">\r\n <div class=\"user-img-container\">\r\n <img [src]=\"profile.ProfilePicture\" alt=\"user-img\" class=\"user-img\" />\r\n <div class=\"app-pointer user-img-btn\">\r\n <div class=\"app-opacity user-img-btn-body\" (click)=\"onUpdateProfilePicture();\">\r\n <i class=\"far fa-pen\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"app-margin-top-15\" style=\"position: relative;\" *ngIf=\"AccountDetails\">\r\n <div class=\"card card-body app-no-margin app-padding-15\">\r\n <div class=\"row\">\r\n <div *ac=\"'R:Jace Admin'\" class=\"user-roles-btn\" [matTooltip]=\"'Visualizza Ruoli e Permessi'\" matTooltipPosition=\"above\" (click)=\"onShowAccountRoles();\">\r\n <i class=\"far fa-book-user\"></i>\r\n </div>\r\n <div class=\"col-md-6\"><labeled-span [Label]=\"'Utente' | localize : lc\" Display=\"Vertical\">{{AccountDetails.username}}</labeled-span></div>\r\n <div class=\"col-md-6\"><labeled-span [Label]=\"'Tenant' | localize : lc\" Display=\"Vertical\">{{AccountDetails.tenantid}}</labeled-span></div>\r\n <div class=\"col-md-6 app-margin-top-10\"><labeled-span [Label]=\"'Nome' | localize : lc\" Display=\"Vertical\">{{AccountDetails.firstname}}</labeled-span></div>\r\n <div class=\"col-md-6 app-margin-top-10\"><labeled-span [Label]=\"'Cognome' | localize : lc\" Display=\"Vertical\">{{AccountDetails.lastname}}</labeled-span> </div>\r\n <div class=\"col-md-12 app-margin-top-10\"><labeled-span [Label]=\"'Email' | localize : lc\" Display=\"Vertical\">{{AccountDetails.recoveryemail || 'Non disponibile'}}</labeled-span></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"app-margin-top-10 row\">\r\n <div class=\"col-md-6\" style=\"padding-right: 5px;\">\r\n <button type=\"button\" style=\"width: 100%;\" class=\"btn btn-primary\" (click)=\"onUpdatePassword()\">Modifica Password</button>\r\n </div>\r\n <div class=\"col-md-6\" style=\"padding-left: 5px;\">\r\n <button type=\"button\" style=\"width: 100%;\" class=\"btn btn-primary\" (click)=\"onUpdateRecoverySettings()\">Modifica Email</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!--Update Password-->\r\n<es-modal #dlgUpdatePassword [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgUpdatePassword.hide();\">\r\n <h5 class=\"modal-title pull-left\">Modifica Password</h5>\r\n </es-modal-head>\r\n <form *ngIf=\"UpdatePasswordDTO\" #formUpdatePassword=\"ngForm\" (ngSubmit)=\"formUpdatePassword.valid && doUpdatePassword()\">\r\n <div class=\"modal-body lastfix\">\r\n <form-input [Password]=\"true\" [Label]=\"'Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.oldpwd\" name=\"oldpw\" required></form-input>\r\n <form-input [Password]=\"true\" [Label]=\"'Nuova Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.newpwd\" name=\"newpw\" required></form-input>\r\n <form-input [Password]=\"true\" [Label]=\"'Conferma Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.confirmpwd\" name=\"confpw\" required></form-input>\r\n <!--Validazione Custom-->\r\n <div *ngIf=\"CustomError\" class=\"app-white-text app-margin-top-15 app-margin-bottom-0 card app-padding-10 card-danger\">\r\n <strong>{{'Error' | localize : lc}}:&nbsp;</strong>{{CustomError}}\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-10\" (click)=\"dlgUpdatePassword.hide();\">{{'Cancel' | localize : lc}}</button>\r\n <button type=\"submit\" class=\"btn btn-primary\">Conferma</button>\r\n </div>\r\n </form>\r\n</es-modal>\r\n\r\n<!--Update Extra Info-->\r\n<es-modal #dlgUpdateRecoverySettings [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgUpdateRecoverySettings.hide();\">\r\n <h5 class=\"modal-title pull-left\">{{'Modifica Email' | localize : lc}}</h5>\r\n </es-modal-head>\r\n <form *ngIf=\"UpdateRecoverySettingsDTO\" #formUpdateInfos=\"ngForm\" (ngSubmit)=\"formUpdateInfos.valid && doUpdateRecoverySettings()\">\r\n <div class=\"modal-body lastfix\">\r\n <form-input [LabelInputRatio]=\"'3 9'\" [Label]=\"'Email' | localize: lc\" [(ngModel)]=\"UpdateRecoverySettingsDTO.email\" name=\"email\"></form-input>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-10\" (click)=\"dlgUpdateRecoverySettings.hide();\">{{'Cancel' | localize : lc}}</button>\r\n <button type=\"submit\" class=\"btn btn-primary\">Conferma</button>\r\n </div>\r\n </form>\r\n</es-modal>\r\n\r\n<!--Upload Picture-->\r\n<es-modal #dlgUpdateProfilePicture [Size]=\"'XL'\">\r\n <es-modal-head (Close)=\"dlgUpdateProfilePicture.hide();\">\r\n <h5 class=\"modal-title pull-left\">Carica immagine</h5>\r\n </es-modal-head>\r\n <div class=\"modal-body d-flex\">\r\n <div style=\"margin: auto;\">\r\n <es-image-cropper #imageCropper [Height]=\"600\" [Width]=\"800\"></es-image-cropper>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"dlgUpdateProfilePicture.hide()\">Annulla</button>\r\n <button type=\"submit\" class=\"btn btn-primary\" (click)=\"doUpdateProfilePicture()\">Conferma</button>\r\n </div>\r\n</es-modal>\r\n\r\n<!--Ruoli e Permessi-->\r\n<es-modal #dlgShowAccountRoles [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgShowAccountRoles.hide();\">\r\n <h5 class=\"modal-title pull-left\">{{'Ruoli e Permessi' | localize : lc}}</h5>\r\n </es-modal-head>\r\n <div class=\"modal-body\" style=\"max-height: 600px; overflow-y: auto;\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\" *ngIf=\"AccountRoles\">\r\n <labeled-span [Label]=\"'Ruoli'\" Display=\"Vertical\">\r\n <div *ngFor=\"let r of AccountRoles;\">{{r}}</div>\r\n </labeled-span>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"AccountPermissions\">\r\n <labeled-span [Label]=\"'Permessi'\" Display=\"Vertical\">\r\n <div *ngFor=\"let p of AccountPermissions;\">{{p}}</div>\r\n </labeled-span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"dlgShowAccountRoles.hide();\">{{'Chiudi' | localize : lc}}</button>\r\n </div>\r\n</es-modal>", styles: [".app-wideplus{width:100%;text-align:center;border:1px solid #ccc;border-radius:5px;padding:5px}.btn-outline-main-modified{color:#242d3a;border-color:#242d3a;background:transparent}.btn-outline-main-modified:hover{color:#fff;background:#242d3a;border-color:#242d3a}.user-img-container{position:relative;width:200px;margin:auto}.user-img{object-fit:cover;max-height:200px;min-height:200px;min-width:200px;max-width:200px;border-radius:50%;box-shadow:0 8px 6px #1313130a,0 12px 16px #1313130d}.user-img-btn{position:absolute;right:0;width:40px;height:40px;margin-top:-50px}.user-img-btn-body{background-color:#0056b3;color:#fff;border-radius:50%;text-align:center;height:100%;font-size:1.2rem;line-height:2.5rem}.user-roles-btn{position:absolute;top:0;right:2px;font-size:1.2rem;padding:5px;z-index:1;color:#0056b3;cursor:pointer;width:auto}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsAndValidationsModule }, { kind: "component", type: i2$3.EsFormInputComponent, selector: "form-input", inputs: ["minlength", "maxlength", "pattern", "Password"], outputs: ["onSuffixAction", "onPrefixAction"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: LocalizationModule }, { kind: "pipe", type: i1$2.LocalizePipe, name: "localize" }, { kind: "component", type: EsModalComponent, selector: "es-modal", inputs: ["Size", "IgnoreBackdrop", "Backdrop", "HasOverlap"], outputs: ["onShow", "onHide"] }, { kind: "component", type: EsModalHeadComponent, selector: "es-modal-head", outputs: ["Close"] }, { kind: "component", type: EsImageCropperComponent, selector: "es-image-cropper", inputs: ["Height", "Width"] }, { kind: "component", type: LabeledSpanComponent, selector: "labeled-span", inputs: ["First", "Label", "Display"] }, { kind: "ngmodule", type: ExtensionsModule }, { kind: "ngmodule", type: AccessControlModule }, { kind: "directive", type: i5.AccessControlDirective, selector: "[ac]", inputs: ["ac", "acAbsolute"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i7$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], viewProviders: [{ provide: LocalizationService, useClass: UserInfoComponentLoc }] }); }
1531
+ }
1532
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: UserInfosComponent, decorators: [{
1533
+ type: Component,
1534
+ args: [{ selector: "user-infos", viewProviders: [{ provide: LocalizationService, useClass: UserInfoComponentLoc }], imports: [
1535
+ FormsModule,
1536
+ FormsAndValidationsModule,
1537
+ NgIf,
1538
+ NgFor,
1539
+ LocalizationModule,
1540
+ EsModalComponent,
1541
+ EsModalHeadComponent,
1542
+ EsImageCropperComponent,
1543
+ LabeledSpanComponent,
1544
+ ExtensionsModule,
1545
+ AccessControlModule,
1546
+ MatTooltipModule
1547
+ ], template: "<div style=\"height: 100%; width: 100%; display: flex;\">\r\n <div style=\"margin: auto;\">\r\n <div class=\"user-img-container\">\r\n <img [src]=\"profile.ProfilePicture\" alt=\"user-img\" class=\"user-img\" />\r\n <div class=\"app-pointer user-img-btn\">\r\n <div class=\"app-opacity user-img-btn-body\" (click)=\"onUpdateProfilePicture();\">\r\n <i class=\"far fa-pen\"></i>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"app-margin-top-15\" style=\"position: relative;\" *ngIf=\"AccountDetails\">\r\n <div class=\"card card-body app-no-margin app-padding-15\">\r\n <div class=\"row\">\r\n <div *ac=\"'R:Jace Admin'\" class=\"user-roles-btn\" [matTooltip]=\"'Visualizza Ruoli e Permessi'\" matTooltipPosition=\"above\" (click)=\"onShowAccountRoles();\">\r\n <i class=\"far fa-book-user\"></i>\r\n </div>\r\n <div class=\"col-md-6\"><labeled-span [Label]=\"'Utente' | localize : lc\" Display=\"Vertical\">{{AccountDetails.username}}</labeled-span></div>\r\n <div class=\"col-md-6\"><labeled-span [Label]=\"'Tenant' | localize : lc\" Display=\"Vertical\">{{AccountDetails.tenantid}}</labeled-span></div>\r\n <div class=\"col-md-6 app-margin-top-10\"><labeled-span [Label]=\"'Nome' | localize : lc\" Display=\"Vertical\">{{AccountDetails.firstname}}</labeled-span></div>\r\n <div class=\"col-md-6 app-margin-top-10\"><labeled-span [Label]=\"'Cognome' | localize : lc\" Display=\"Vertical\">{{AccountDetails.lastname}}</labeled-span> </div>\r\n <div class=\"col-md-12 app-margin-top-10\"><labeled-span [Label]=\"'Email' | localize : lc\" Display=\"Vertical\">{{AccountDetails.recoveryemail || 'Non disponibile'}}</labeled-span></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"app-margin-top-10 row\">\r\n <div class=\"col-md-6\" style=\"padding-right: 5px;\">\r\n <button type=\"button\" style=\"width: 100%;\" class=\"btn btn-primary\" (click)=\"onUpdatePassword()\">Modifica Password</button>\r\n </div>\r\n <div class=\"col-md-6\" style=\"padding-left: 5px;\">\r\n <button type=\"button\" style=\"width: 100%;\" class=\"btn btn-primary\" (click)=\"onUpdateRecoverySettings()\">Modifica Email</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!--Update Password-->\r\n<es-modal #dlgUpdatePassword [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgUpdatePassword.hide();\">\r\n <h5 class=\"modal-title pull-left\">Modifica Password</h5>\r\n </es-modal-head>\r\n <form *ngIf=\"UpdatePasswordDTO\" #formUpdatePassword=\"ngForm\" (ngSubmit)=\"formUpdatePassword.valid && doUpdatePassword()\">\r\n <div class=\"modal-body lastfix\">\r\n <form-input [Password]=\"true\" [Label]=\"'Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.oldpwd\" name=\"oldpw\" required></form-input>\r\n <form-input [Password]=\"true\" [Label]=\"'Nuova Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.newpwd\" name=\"newpw\" required></form-input>\r\n <form-input [Password]=\"true\" [Label]=\"'Conferma Password' | localize: lc\" [(ngModel)]=\"UpdatePasswordDTO.confirmpwd\" name=\"confpw\" required></form-input>\r\n <!--Validazione Custom-->\r\n <div *ngIf=\"CustomError\" class=\"app-white-text app-margin-top-15 app-margin-bottom-0 card app-padding-10 card-danger\">\r\n <strong>{{'Error' | localize : lc}}:&nbsp;</strong>{{CustomError}}\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-10\" (click)=\"dlgUpdatePassword.hide();\">{{'Cancel' | localize : lc}}</button>\r\n <button type=\"submit\" class=\"btn btn-primary\">Conferma</button>\r\n </div>\r\n </form>\r\n</es-modal>\r\n\r\n<!--Update Extra Info-->\r\n<es-modal #dlgUpdateRecoverySettings [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgUpdateRecoverySettings.hide();\">\r\n <h5 class=\"modal-title pull-left\">{{'Modifica Email' | localize : lc}}</h5>\r\n </es-modal-head>\r\n <form *ngIf=\"UpdateRecoverySettingsDTO\" #formUpdateInfos=\"ngForm\" (ngSubmit)=\"formUpdateInfos.valid && doUpdateRecoverySettings()\">\r\n <div class=\"modal-body lastfix\">\r\n <form-input [LabelInputRatio]=\"'3 9'\" [Label]=\"'Email' | localize: lc\" [(ngModel)]=\"UpdateRecoverySettingsDTO.email\" name=\"email\"></form-input>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary app-margin-right-10\" (click)=\"dlgUpdateRecoverySettings.hide();\">{{'Cancel' | localize : lc}}</button>\r\n <button type=\"submit\" class=\"btn btn-primary\">Conferma</button>\r\n </div>\r\n </form>\r\n</es-modal>\r\n\r\n<!--Upload Picture-->\r\n<es-modal #dlgUpdateProfilePicture [Size]=\"'XL'\">\r\n <es-modal-head (Close)=\"dlgUpdateProfilePicture.hide();\">\r\n <h5 class=\"modal-title pull-left\">Carica immagine</h5>\r\n </es-modal-head>\r\n <div class=\"modal-body d-flex\">\r\n <div style=\"margin: auto;\">\r\n <es-image-cropper #imageCropper [Height]=\"600\" [Width]=\"800\"></es-image-cropper>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"dlgUpdateProfilePicture.hide()\">Annulla</button>\r\n <button type=\"submit\" class=\"btn btn-primary\" (click)=\"doUpdateProfilePicture()\">Conferma</button>\r\n </div>\r\n</es-modal>\r\n\r\n<!--Ruoli e Permessi-->\r\n<es-modal #dlgShowAccountRoles [Size]=\"'L'\">\r\n <es-modal-head (Close)=\"dlgShowAccountRoles.hide();\">\r\n <h5 class=\"modal-title pull-left\">{{'Ruoli e Permessi' | localize : lc}}</h5>\r\n </es-modal-head>\r\n <div class=\"modal-body\" style=\"max-height: 600px; overflow-y: auto;\">\r\n <div class=\"row\">\r\n <div class=\"col-md-6\" *ngIf=\"AccountRoles\">\r\n <labeled-span [Label]=\"'Ruoli'\" Display=\"Vertical\">\r\n <div *ngFor=\"let r of AccountRoles;\">{{r}}</div>\r\n </labeled-span>\r\n </div>\r\n <div class=\"col-md-6\" *ngIf=\"AccountPermissions\">\r\n <labeled-span [Label]=\"'Permessi'\" Display=\"Vertical\">\r\n <div *ngFor=\"let p of AccountPermissions;\">{{p}}</div>\r\n </labeled-span>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"dlgShowAccountRoles.hide();\">{{'Chiudi' | localize : lc}}</button>\r\n </div>\r\n</es-modal>", styles: [".app-wideplus{width:100%;text-align:center;border:1px solid #ccc;border-radius:5px;padding:5px}.btn-outline-main-modified{color:#242d3a;border-color:#242d3a;background:transparent}.btn-outline-main-modified:hover{color:#fff;background:#242d3a;border-color:#242d3a}.user-img-container{position:relative;width:200px;margin:auto}.user-img{object-fit:cover;max-height:200px;min-height:200px;min-width:200px;max-width:200px;border-radius:50%;box-shadow:0 8px 6px #1313130a,0 12px 16px #1313130d}.user-img-btn{position:absolute;right:0;width:40px;height:40px;margin-top:-50px}.user-img-btn-body{background-color:#0056b3;color:#fff;border-radius:50%;text-align:center;height:100%;font-size:1.2rem;line-height:2.5rem}.user-roles-btn{position:absolute;top:0;right:2px;font-size:1.2rem;padding:5px;z-index:1;color:#0056b3;cursor:pointer;width:auto}\n"] }]
1548
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.TokenService }, { type: i4.MessageService }, { type: i4.ExportService }, { type: i4.UtilityService }, { type: i1$2.LocalizationService }, { type: i1.AppState }, { type: i1.UserPreferencesService }], propDecorators: { dlgShowAccountRoles: [{
1549
+ type: ViewChild,
1550
+ args: ["dlgShowAccountRoles"]
1551
+ }], dlgUpdateProfilePicture: [{
1552
+ type: ViewChild,
1553
+ args: ["dlgUpdateProfilePicture"]
1554
+ }], imageCropper: [{
1555
+ type: ViewChild,
1556
+ args: ['imageCropper']
1557
+ }], dlgUpdateRecoverySettings: [{
1558
+ type: ViewChild,
1559
+ args: ["dlgUpdateRecoverySettings"]
1560
+ }], dlgUpdatePassword: [{
1561
+ type: ViewChild,
1562
+ args: ["dlgUpdatePassword"]
1551
1563
  }] } });
1552
1564
 
1553
- /**
1554
- * Generated bundle index. Do not edit.
1565
+ /**
1566
+ * Generated bundle index. Do not edit.
1555
1567
  */
1556
1568
 
1557
1569
  export { AngularErrorComponent, BackTop, BaseComponent, Breadcrumb, BreadcrumbItem, ComponentsModule, EmbeddingComponent, EsImageCropperComponent, EsModalComponent, EsModalHeadComponent, ExternalPagesComponent, JaceLoginComponent, JaceResourceComponent, LabeledSpanComponent, Navbar, PageNotFoundComponent, PagesComponent, ReactiveComponent, RedirecterComponent, ServerErrorComponent, Sidebar, UserInfosComponent };