@taon-dev/ui 21.0.3 → 21.0.5

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 (191) hide show
  1. package/VERIFIED-BUILD-DATA.jsonc +2 -2
  2. package/browser/fesm2022/ui-browser-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs +15 -0
  3. package/browser/fesm2022/ui-browser-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs.map +1 -0
  4. package/browser/fesm2022/ui-browser-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs +15 -0
  5. package/browser/fesm2022/ui-browser-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs.map +1 -0
  6. package/browser/fesm2022/ui-browser.mjs +1123 -155
  7. package/browser/fesm2022/ui-browser.mjs.map +1 -1
  8. package/browser/package.json +1 -1
  9. package/browser/types/ui-browser.d.ts +252 -38
  10. package/browser-prod/fesm2022/ui-browser-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs +15 -0
  11. package/browser-prod/fesm2022/ui-browser-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs.map +1 -0
  12. package/browser-prod/fesm2022/ui-browser-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs +15 -0
  13. package/browser-prod/fesm2022/ui-browser-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs.map +1 -0
  14. package/browser-prod/fesm2022/ui-browser-prod.mjs +1129 -155
  15. package/browser-prod/fesm2022/ui-browser-prod.mjs.map +1 -1
  16. package/browser-prod/package.json +1 -1
  17. package/browser-prod/types/ui-browser-prod.d.ts +248 -38
  18. package/html/app/main/main.container.html +6 -0
  19. package/html/app/main/routes/session/tracking/tracking.component.html +7 -4
  20. package/html/assets/generated/pwa/html-pwa.html +53 -53
  21. package/html/lib/taon-admin-layout/taon-admin-layout.component.html +74 -57
  22. package/html/lib/taon-backoffice-notifications/taon-backoffice-notifications.component.html +3 -0
  23. package/html/lib/taon-backoffice-notifications/taon-error-details-dialog.component.html +36 -0
  24. package/html/lib/taon-confirm-dialog/taon-confirm-dialog.component.html +34 -0
  25. package/html/lib/taon-datatable/taon-datatable.component.html +161 -0
  26. package/html/lib/taon-draggable-button-panel/taon-draggable-button-panel.component.html +49 -62
  27. package/lib/build-info._auto-generated_.d.ts +1 -1
  28. package/lib/build-info._auto-generated_.js +1 -1
  29. package/lib/directives/taon-horizontal-wheel-scrolling.directive.d.ts +13 -0
  30. package/lib/env/env.angular-node-app.js.map +1 -1
  31. package/lib/env/env.docs-webapp.js.map +1 -1
  32. package/lib/env/env.electron-app.js.map +1 -1
  33. package/lib/env/env.mobile-app.js.map +1 -1
  34. package/lib/env/env.npm-lib-and-cli-tool.js.map +1 -1
  35. package/lib/env/env.vscode-plugin.js.map +1 -1
  36. package/lib/index._auto-generated_.d.ts +13 -1
  37. package/lib/index._auto-generated_.js +13 -1
  38. package/lib/index._auto-generated_.js.map +1 -1
  39. package/lib/my-organization-proj.js +1 -2
  40. package/lib/my-organization-proj.js.map +1 -1
  41. package/lib/package.json +1 -1
  42. package/lib/taon-admin-layout/index.js +2 -2
  43. package/lib/taon-admin-layout/taon-admin-layout.component.d.ts +36 -32
  44. package/lib/taon-admin-layout/taon-admin-layout.models.d.ts +13 -1
  45. package/lib/taon-admin-layout/taon-admin-layout.models.js +13 -2
  46. package/lib/taon-admin-layout/taon-admin-layout.models.js.map +1 -1
  47. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.d.ts +15 -0
  48. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js +15 -0
  49. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js.map +1 -0
  50. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.d.ts +15 -0
  51. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js +15 -0
  52. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js.map +1 -0
  53. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.d.ts +4 -0
  54. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js +5 -0
  55. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js.map +1 -0
  56. package/lib/taon-backoffice-notifications/index.d.ts +4 -0
  57. package/lib/taon-backoffice-notifications/index.js +24 -0
  58. package/lib/taon-backoffice-notifications/index.js.map +1 -0
  59. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.component.d.ts +10 -0
  60. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.d.ts +11 -0
  61. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.js +3 -0
  62. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.js.map +1 -0
  63. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.service.d.ts +9 -0
  64. package/lib/taon-backoffice-notifications/taon-error-details-dialog.component.d.ts +24 -0
  65. package/lib/taon-backoffice-notifications/taon-error-toast.component.d.ts +10 -0
  66. package/lib/taon-confirm-dialog/taon-confirm-dialog.component.d.ts +12 -0
  67. package/lib/taon-confirm-dialog/taon-confirm-dialog.models.d.ts +1 -0
  68. package/lib/taon-confirm-dialog/taon-confirm-dialog.models.js +3 -0
  69. package/lib/taon-confirm-dialog/taon-confirm-dialog.models.js.map +1 -0
  70. package/lib/taon-datatable/index.d.ts +1 -0
  71. package/lib/taon-datatable/index.js +5 -0
  72. package/lib/taon-datatable/index.js.map +1 -0
  73. package/lib/taon-datatable/taon-datatable.component.d.ts +63 -0
  74. package/lib/taon-datatable/taon-datatable.models.d.ts +1 -0
  75. package/lib/taon-datatable/taon-datatable.models.js +3 -0
  76. package/lib/taon-datatable/taon-datatable.models.js.map +1 -0
  77. package/lib/taon-datatable/taon-datatable.routes.d.ts +7 -0
  78. package/lib/taon-draggable-button-panel/index.js +2 -2
  79. package/lib/taon-draggable-button-panel/taon-draggable-button-panel.component.d.ts +5 -0
  80. package/lib-esm/lib/build-info._auto-generated_.d.ts +1 -1
  81. package/lib-esm/lib/build-info._auto-generated_.js +1 -1
  82. package/lib-esm/lib/env/env.angular-node-app.js.map +1 -1
  83. package/lib-esm/lib/env/env.docs-webapp.js.map +1 -1
  84. package/lib-esm/lib/env/env.electron-app.js.map +1 -1
  85. package/lib-esm/lib/env/env.mobile-app.js.map +1 -1
  86. package/lib-esm/lib/env/env.npm-lib-and-cli-tool.js.map +1 -1
  87. package/lib-esm/lib/env/env.vscode-plugin.js.map +1 -1
  88. package/lib-esm/lib/index._auto-generated_.d.ts +4 -0
  89. package/lib-esm/lib/index._auto-generated_.js +13 -1
  90. package/lib-esm/lib/index._auto-generated_.js.map +1 -1
  91. package/lib-esm/lib/my-organization-proj.js +1 -2
  92. package/lib-esm/lib/my-organization-proj.js.map +1 -1
  93. package/lib-esm/lib/taon-admin-layout/index.d.ts +1 -1
  94. package/lib-esm/lib/taon-admin-layout/index.js +1 -1
  95. package/lib-esm/lib/taon-admin-layout/taon-admin-layout.models.d.ts +13 -1
  96. package/lib-esm/lib/taon-admin-layout/taon-admin-layout.models.js +11 -1
  97. package/lib-esm/lib/taon-admin-layout/taon-admin-layout.models.js.map +1 -1
  98. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.d.ts +15 -0
  99. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js +13 -0
  100. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js.map +1 -0
  101. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.d.ts +15 -0
  102. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js +13 -0
  103. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js.map +1 -0
  104. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.d.ts +4 -0
  105. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js +4 -0
  106. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js.map +1 -0
  107. package/lib-esm/lib/taon-backoffice-notifications/index.d.ts +1 -0
  108. package/lib-esm/lib/taon-backoffice-notifications/index.js +8 -0
  109. package/lib-esm/lib/taon-backoffice-notifications/index.js.map +1 -0
  110. package/lib-esm/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.d.ts +11 -0
  111. package/lib-esm/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.js +2 -0
  112. package/lib-esm/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.js.map +1 -0
  113. package/lib-esm/lib/taon-confirm-dialog/taon-confirm-dialog.models.d.ts +1 -0
  114. package/lib-esm/lib/taon-confirm-dialog/taon-confirm-dialog.models.js +2 -0
  115. package/lib-esm/lib/taon-confirm-dialog/taon-confirm-dialog.models.js.map +1 -0
  116. package/lib-esm/lib/taon-datatable/index.d.ts +1 -0
  117. package/lib-esm/lib/taon-datatable/index.js +2 -0
  118. package/lib-esm/lib/taon-datatable/index.js.map +1 -0
  119. package/lib-esm/lib/taon-datatable/taon-datatable.models.d.ts +1 -0
  120. package/lib-esm/lib/taon-datatable/taon-datatable.models.js +2 -0
  121. package/lib-esm/lib/taon-datatable/taon-datatable.models.js.map +1 -0
  122. package/lib-esm/lib/taon-draggable-button-panel/index.d.ts +1 -1
  123. package/lib-esm/lib/taon-draggable-button-panel/index.js +1 -1
  124. package/lib-prod/build-info._auto-generated_.d.ts +1 -1
  125. package/lib-prod/build-info._auto-generated_.js +1 -1
  126. package/lib-prod/env/env.angular-node-app.js.map +1 -1
  127. package/lib-prod/env/env.docs-webapp.js.map +1 -1
  128. package/lib-prod/env/env.electron-app.js.map +1 -1
  129. package/lib-prod/env/env.mobile-app.js.map +1 -1
  130. package/lib-prod/env/env.npm-lib-and-cli-tool.js.map +1 -1
  131. package/lib-prod/env/env.vscode-plugin.js.map +1 -1
  132. package/lib-prod/index._auto-generated_.d.ts +4 -0
  133. package/lib-prod/index._auto-generated_.js +13 -1
  134. package/lib-prod/index._auto-generated_.js.map +1 -1
  135. package/lib-prod/my-organization-proj.js +1 -2
  136. package/lib-prod/my-organization-proj.js.map +1 -1
  137. package/lib-prod/package.json +1 -1
  138. package/lib-prod/taon-admin-layout/index.d.ts +1 -1
  139. package/lib-prod/taon-admin-layout/index.js +1 -1
  140. package/lib-prod/taon-admin-layout/taon-admin-layout.models.d.ts +13 -1
  141. package/lib-prod/taon-admin-layout/taon-admin-layout.models.js +11 -1
  142. package/lib-prod/taon-admin-layout/taon-admin-layout.models.js.map +1 -1
  143. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.d.ts +15 -0
  144. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js +13 -0
  145. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js.map +1 -0
  146. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.d.ts +15 -0
  147. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js +13 -0
  148. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js.map +1 -0
  149. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.d.ts +4 -0
  150. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js +4 -0
  151. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js.map +1 -0
  152. package/lib-prod/taon-backoffice-notifications/index.d.ts +1 -0
  153. package/lib-prod/taon-backoffice-notifications/index.js +8 -0
  154. package/lib-prod/taon-backoffice-notifications/index.js.map +1 -0
  155. package/lib-prod/taon-backoffice-notifications/taon-backoffice-notifications.models.d.ts +11 -0
  156. package/lib-prod/taon-backoffice-notifications/taon-backoffice-notifications.models.js +2 -0
  157. package/lib-prod/taon-backoffice-notifications/taon-backoffice-notifications.models.js.map +1 -0
  158. package/lib-prod/taon-confirm-dialog/taon-confirm-dialog.models.d.ts +0 -0
  159. package/lib-prod/taon-confirm-dialog/taon-confirm-dialog.models.js +3 -0
  160. package/lib-prod/taon-confirm-dialog/taon-confirm-dialog.models.js.map +1 -0
  161. package/lib-prod/taon-datatable/index.d.ts +1 -0
  162. package/lib-prod/taon-datatable/index.js +2 -0
  163. package/lib-prod/taon-datatable/index.js.map +1 -0
  164. package/lib-prod/taon-datatable/taon-datatable.models.d.ts +0 -0
  165. package/lib-prod/taon-datatable/taon-datatable.models.js +3 -0
  166. package/lib-prod/taon-datatable/taon-datatable.models.js.map +1 -0
  167. package/lib-prod/taon-draggable-button-panel/index.d.ts +1 -1
  168. package/lib-prod/taon-draggable-button-panel/index.js +1 -1
  169. package/package.json +1 -1
  170. package/scss/lib/taon-admin-layout/taon-admin-layout.component.scss +282 -26
  171. package/scss/lib/taon-backoffice-notifications/taon-backoffice-notifications.component.scss +3 -0
  172. package/scss/lib/taon-backoffice-notifications/taon-error-details-dialog.component.scss +62 -0
  173. package/scss/lib/taon-confirm-dialog/taon-confirm-dialog.component.scss +3 -0
  174. package/scss/lib/taon-datatable/taon-datatable.component.scss +11 -0
  175. package/scss/lib/taon-draggable-button-panel/taon-draggable-button-panel.component.scss +3 -3
  176. package/websql/fesm2022/ui-websql-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs +15 -0
  177. package/websql/fesm2022/ui-websql-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs.map +1 -0
  178. package/websql/fesm2022/ui-websql-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs +15 -0
  179. package/websql/fesm2022/ui-websql-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs.map +1 -0
  180. package/websql/fesm2022/ui-websql.mjs +1123 -155
  181. package/websql/fesm2022/ui-websql.mjs.map +1 -1
  182. package/websql/package.json +1 -1
  183. package/websql/types/ui-websql.d.ts +252 -38
  184. package/websql-prod/fesm2022/ui-websql-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs +15 -0
  185. package/websql-prod/fesm2022/ui-websql-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs.map +1 -0
  186. package/websql-prod/fesm2022/ui-websql-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs +15 -0
  187. package/websql-prod/fesm2022/ui-websql-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs.map +1 -0
  188. package/websql-prod/fesm2022/ui-websql-prod.mjs +1129 -155
  189. package/websql-prod/fesm2022/ui-websql-prod.mjs.map +1 -1
  190. package/websql-prod/package.json +1 -1
  191. package/websql-prod/types/ui-websql-prod.d.ts +248 -38
@@ -1,22 +1,41 @@
1
- import { decodeEnv, UtilsJson__NS__getValue } from 'tnp-core/websql-prod';
1
+ import { decodeEnv, UtilsJson__NS__getValue, ___NS__isFunction, ___NS__isBoolean, ___NS__isEqual, ___NS__upperCase } from 'tnp-core/websql-prod';
2
2
  import { Translation } from '@taon-dev/i18n/websql-prod';
3
3
  import { BaseCommandLineFeature } from 'tnp-helpers/websql-prod';
4
- import { CommonModule } from '@angular/common';
5
4
  import * as i0 from '@angular/core';
6
- import { signal, Input, ChangeDetectionStrategy, Component, ViewChild, EventEmitter, Output } from '@angular/core';
7
- import * as i2$1 from '@angular/material/expansion';
5
+ import { inject, ElementRef, Directive, signal, Input, ChangeDetectionStrategy, Component, HostListener, ViewChild, Injectable, DestroyRef, ChangeDetectorRef, EventEmitter, Output } from '@angular/core';
6
+ import * as i2$1 from '@angular/common';
7
+ import { CommonModule, NgIf } from '@angular/common';
8
+ import * as i3 from '@angular/material/expansion';
8
9
  import { MatExpansionModule } from '@angular/material/expansion';
9
- import * as i3 from '@angular/material/icon';
10
+ import * as i4 from '@angular/material/icon';
10
11
  import { MatIconModule } from '@angular/material/icon';
11
12
  import * as i1 from '@angular/router';
12
13
  import { NavigationEnd, RouterOutlet, RouterLink } from '@angular/router';
13
- import { filter } from 'rxjs';
14
+ import { filter, BehaviorSubject, Subject, switchMap, debounceTime, distinctUntilChanged, tap, of, from, map, catchError, finalize, firstValueFrom, take } from 'rxjs';
14
15
  import * as i2 from '@angular/material/tabs';
15
16
  import { MatTabsModule } from '@angular/material/tabs';
16
- import { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
17
- import * as i2$2 from '@angular/material/button';
17
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
18
+ import { Resource__NS__listenErrors, getDefaultModel } from 'ng2-rest/websql-prod';
19
+ import { TaonAdminService, getHttpStatus, ClassHelpers__NS__getName, Symbols__NS__old__NS__X_TOTAL_COUNT } from 'taon/websql-prod';
20
+ import { HotToastRef, HotToastService } from '@ngneat/hot-toast';
21
+ import * as i1$1 from '@angular/material/dialog';
22
+ import { MAT_DIALOG_DATA, MatDialogModule, MatDialog, MatDialogRef } from '@angular/material/dialog';
23
+ import * as i3$1 from '@angular/material/button';
18
24
  import { MatButtonModule } from '@angular/material/button';
19
- import * as i4 from '@angular/material/tooltip';
25
+ import * as i3$2 from '@angular/material/button-toggle';
26
+ import { MatButtonToggleModule } from '@angular/material/button-toggle';
27
+ import * as i2$2 from '@angular/forms';
28
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
29
+ import * as i4$1 from '@angular/material/form-field';
30
+ import { MatFormFieldModule } from '@angular/material/form-field';
31
+ import * as i6 from '@angular/material/input';
32
+ import { MatInputModule } from '@angular/material/input';
33
+ import { MatPaginatorModule } from '@angular/material/paginator';
34
+ import { MatSelectModule } from '@angular/material/select';
35
+ import * as i7 from '@ng-matero/extensions/grid';
36
+ import { MtxGridModule } from '@ng-matero/extensions/grid';
37
+ import { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
38
+ import * as i4$2 from '@angular/material/tooltip';
20
39
  import { MatTooltipModule } from '@angular/material/tooltip';
21
40
 
22
41
  // THIS FILE IS GENERATED - DO NOT MODIFY
@@ -883,12 +902,12 @@ const CURRENT_PACKAGE_TAON_VERSION = 'v21';
883
902
  /**
884
903
  * Autogenerated by current cli tool. Use *tnp release* to bump version.
885
904
  */
886
- const CURRENT_PACKAGE_VERSION = '21.0.3';
905
+ const CURRENT_PACKAGE_VERSION = '21.0.5';
887
906
  // THIS FILE IS GENERATED - DO NOT MODIFY
888
907
 
889
- const t = Translation.for('src/lib/my-organization-proj.ts', { "src/lib/my-organization-proj.ts": { "en-US": async () => (await import('./ui-websql-prod-my-organization-proj.ts.en-US.i18n.data-CoSik70Y.mjs')).default, "pl-PL": async () => (await import('./ui-websql-prod-my-organization-proj.ts.pl-PL.i18n.data-BZPsT3Zk.mjs')).default } });
908
+ const t$1 = Translation.for('src/lib/my-organization-proj.ts', { "src/lib/my-organization-proj.ts": { "en-US": async () => (await import('./ui-websql-prod-my-organization-proj.ts.en-US.i18n.data-CoSik70Y.mjs')).default, "pl-PL": async () => (await import('./ui-websql-prod-my-organization-proj.ts.pl-PL.i18n.data-BZPsT3Zk.mjs')).default } });
890
909
  function myOrgProj() {
891
- t.gettext('My Translated Company Name!');
910
+ t$1.gettext('My Translated Company Name!');
892
911
  }
893
912
 
894
913
  //#region tnp-helpers cli template
@@ -980,6 +999,67 @@ async function startCli(argsv, filename) {
980
999
  return (void 0);
981
1000
  }
982
1001
 
1002
+ //#region imports
1003
+ //#endregion
1004
+ class TaonHorizontalWheelScrollDirective {
1005
+ constructor() {
1006
+ //#region fields
1007
+ this.elementRef = inject((ElementRef));
1008
+ this.wheelAccumulator = 0;
1009
+ /**
1010
+ * Amount of wheel movement required before triggering
1011
+ * Material's previous/next pagination.
1012
+ */
1013
+ this.wheelThreshold = 40;
1014
+ //#endregion
1015
+ //#region wheel
1016
+ this.onWheel = (event) => {
1017
+ const delta = Math.abs(event.deltaX) > Math.abs(event.deltaY)
1018
+ ? event.deltaX
1019
+ : event.deltaY;
1020
+ if (!delta) {
1021
+ return;
1022
+ }
1023
+ this.wheelAccumulator += delta;
1024
+ if (Math.abs(this.wheelAccumulator) < this.wheelThreshold) {
1025
+ return;
1026
+ }
1027
+ const direction = this.wheelAccumulator > 0 ? 'after' : 'before';
1028
+ this.wheelAccumulator = 0;
1029
+ // @ts-ignore
1030
+ const pagination = this.elementRef.nativeElement.querySelector(`.mat-mdc-tab-header-pagination-${direction}`);
1031
+ if (!pagination) {
1032
+ return;
1033
+ }
1034
+ const disabled = pagination.classList.contains('mat-mdc-tab-header-pagination-disabled');
1035
+ if (disabled) {
1036
+ return;
1037
+ }
1038
+ event.preventDefault();
1039
+ pagination.click();
1040
+ };
1041
+ }
1042
+ //#endregion
1043
+ //#region lifecycle
1044
+ ngAfterViewInit() {
1045
+ this.elementRef.nativeElement.addEventListener('wheel', this.onWheel, {
1046
+ passive: false,
1047
+ });
1048
+ }
1049
+ ngOnDestroy() {
1050
+ this.elementRef.nativeElement.removeEventListener('wheel', this.onWheel);
1051
+ }
1052
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonHorizontalWheelScrollDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1053
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.0.9", type: TaonHorizontalWheelScrollDirective, isStandalone: true, selector: "[taonHorizontalWheelScroll]", ngImport: i0 }); }
1054
+ }
1055
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonHorizontalWheelScrollDirective, decorators: [{
1056
+ type: Directive,
1057
+ args: [{
1058
+ selector: '[taonHorizontalWheelScroll]',
1059
+ standalone: true,
1060
+ }]
1061
+ }] });
1062
+
983
1063
  ;
984
1064
  // THIS FILE IS GENERATED - DO NOT MODIFY
985
1065
 
@@ -1243,33 +1323,68 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
1243
1323
  //#region imports
1244
1324
  //#endregion
1245
1325
  class TaonAdminLayoutComponent {
1326
+ get isDialogMode() {
1327
+ const windowElement = this.getWindowElement();
1328
+ if (!windowElement) {
1329
+ return false;
1330
+ }
1331
+ return !windowElement.classList.contains('taon-fullscreen');
1332
+ }
1246
1333
  get basePathSegments() {
1247
1334
  return this.basePath.split('/').filter(Boolean);
1248
1335
  }
1336
+ get normalizedBasePath() {
1337
+ const value = '/' + this.basePath.split('/').filter(Boolean).join('/');
1338
+ return value === '/' ? '/' : value;
1339
+ }
1249
1340
  //#endregion
1250
1341
  //#region constructor
1251
- constructor(router) {
1342
+ constructor(router, hostElement) {
1252
1343
  this.router = router;
1344
+ this.hostElement = hostElement;
1253
1345
  this.basePath = '';
1254
- /**
1255
- * Children discovered for each level-1 route.
1256
- *
1257
- * Session -> [Tracking, Providers]
1258
- * Users -> [Manager]
1259
- */
1346
+ this.layoutWidth = signal(undefined, ...(ngDevMode ? [{ debugName: "layoutWidth" }] : []));
1347
+ this.layoutHeight = signal(undefined, ...(ngDevMode ? [{ debugName: "layoutHeight" }] : []));
1260
1348
  this.level2Routes = signal(new Map(), ...(ngDevMode ? [{ debugName: "level2Routes" }] : []));
1261
1349
  this.currentUrl = signal('', ...(ngDevMode ? [{ debugName: "currentUrl" }] : []));
1262
1350
  this.loadingRoutes = signal(new Set(), ...(ngDevMode ? [{ debugName: "loadingRoutes" }] : []));
1263
1351
  this.asideOpened = signal(window.innerWidth >= 768, ...(ngDevMode ? [{ debugName: "asideOpened" }] : []));
1352
+ this.resizing = false;
1353
+ this.resizeStartX = 0;
1354
+ this.resizeStartY = 0;
1355
+ this.resizeStartWidth = 0;
1356
+ this.resizeStartHeight = 0;
1357
+ this.minDialogWidth = 500;
1358
+ this.minDialogHeight = 350;
1359
+ this.resize = (event) => {
1360
+ if (!this.resizing) {
1361
+ return;
1362
+ }
1363
+ const windowElement = this.getWindowElement();
1364
+ if (!windowElement) {
1365
+ return;
1366
+ }
1367
+ const windowRect = windowElement.getBoundingClientRect();
1368
+ const deltaX = event.clientX - this.resizeStartX;
1369
+ const deltaY = event.clientY - this.resizeStartY;
1370
+ const maxWidth = window.innerWidth - windowRect.left;
1371
+ const maxHeight = window.innerHeight - windowRect.top;
1372
+ const width = Math.min(maxWidth, Math.max(this.minDialogWidth, this.resizeStartWidth + deltaX));
1373
+ const height = Math.min(maxHeight, Math.max(this.minDialogHeight, this.resizeStartHeight + deltaY));
1374
+ windowElement.style.width = `${width}px`;
1375
+ windowElement.style.height = `${height}px`;
1376
+ };
1377
+ this.stopResize = () => {
1378
+ if (!this.resizing) {
1379
+ return;
1380
+ }
1381
+ this.resizing = false;
1382
+ window.removeEventListener('pointermove', this.resize);
1383
+ window.removeEventListener('pointerup', this.stopResize);
1384
+ };
1264
1385
  }
1265
1386
  //#endregion
1266
- //#region methods
1267
- toggleAside() {
1268
- this.asideOpened.update(opened => !opened);
1269
- }
1270
- closeAside() {
1271
- this.asideOpened.set(false);
1272
- }
1387
+ //#region lifecycle
1273
1388
  async ngOnInit() {
1274
1389
  await this.loadCurrentLevel1Route();
1275
1390
  this.router.events
@@ -1278,9 +1393,152 @@ class TaonAdminLayoutComponent {
1278
1393
  await this.loadCurrentLevel1Route();
1279
1394
  });
1280
1395
  }
1281
- // ---------------------------------------------------------------------------
1282
- // LEVEL 1
1283
- // ---------------------------------------------------------------------------
1396
+ ngAfterViewInit() {
1397
+ setTimeout(() => {
1398
+ const windowElement = this.getWindowElement();
1399
+ // console.log('[windowElement] should not be undefined', windowElement);
1400
+ this.updateLayoutSize();
1401
+ this.startWindowObservers();
1402
+ }, 500); // TODO QUICK_FIX
1403
+ }
1404
+ // private waitForWindowElement(
1405
+ // callback: (windowElement: HTMLElement) => void,
1406
+ // ): void {
1407
+ // const check = () => {
1408
+ // console.log('Waiting for window element...');
1409
+ // const windowElement = this.getWindowElement();
1410
+ // if (windowElement) {
1411
+ // callback(windowElement);
1412
+ // return;
1413
+ // }
1414
+ // requestAnimationFrame(check);
1415
+ // };
1416
+ // check();
1417
+ // }
1418
+ ngOnDestroy() {
1419
+ this.resizeObserver?.disconnect();
1420
+ this.mutationObserver?.disconnect();
1421
+ window.removeEventListener('pointermove', this.resize);
1422
+ window.removeEventListener('pointerup', this.stopResize);
1423
+ }
1424
+ //#endregion
1425
+ //#region window / layout
1426
+ getWindowElement() {
1427
+ return (document.querySelector('.taon-window') ??
1428
+ document.querySelector('.taon-window-full') ??
1429
+ undefined);
1430
+ }
1431
+ getDraggablePanelElement() {
1432
+ return (document.querySelector('.taon-draggable-panel') ?? undefined);
1433
+ }
1434
+ startWindowObservers() {
1435
+ this.resizeObserver?.disconnect();
1436
+ this.mutationObserver?.disconnect();
1437
+ const host = this.hostElement.nativeElement;
1438
+ const windowElement = this.getWindowElement();
1439
+ // console.log('WINDOW', this.getWindowElement());
1440
+ // console.log('PANEL', this.getDraggablePanelElement());
1441
+ // ================================================================
1442
+ // SIZE CHANGES
1443
+ // ================================================================
1444
+ const observedElement = windowElement ?? host.parentElement;
1445
+ if (observedElement) {
1446
+ this.resizeObserver = new ResizeObserver(() => {
1447
+ this.updateLayoutSize();
1448
+ });
1449
+ this.resizeObserver.observe(observedElement);
1450
+ }
1451
+ // ================================================================
1452
+ // DIALOG <-> FULLSCREEN STATE CHANGES
1453
+ // ================================================================
1454
+ if (windowElement) {
1455
+ this.mutationObserver = new MutationObserver(mutations => {
1456
+ const classChanged = mutations.some(mutation => mutation.type === 'attributes' &&
1457
+ mutation.attributeName === 'class');
1458
+ // console.log('Class changed:', classChanged);
1459
+ if (!classChanged) {
1460
+ return;
1461
+ }
1462
+ this.windowModeChanged(windowElement);
1463
+ });
1464
+ this.mutationObserver.observe(windowElement, {
1465
+ attributes: true,
1466
+ attributeFilter: ['class'],
1467
+ });
1468
+ }
1469
+ }
1470
+ windowModeChanged(windowElement) {
1471
+ const fullscreen = windowElement.classList.contains('taon-fullscreen');
1472
+ if (fullscreen) {
1473
+ this.clearWindowResize(windowElement);
1474
+ }
1475
+ requestAnimationFrame(() => {
1476
+ this.updateLayoutSize();
1477
+ });
1478
+ }
1479
+ clearWindowResize(windowElement) {
1480
+ windowElement.style.removeProperty('width');
1481
+ windowElement.style.removeProperty('height');
1482
+ }
1483
+ windowResized() {
1484
+ this.updateLayoutSize();
1485
+ }
1486
+ updateLayoutSize() {
1487
+ const host = this.hostElement.nativeElement;
1488
+ const hostRect = host.getBoundingClientRect();
1489
+ const windowElement = this.getWindowElement();
1490
+ const dialogMode = !!windowElement && !windowElement.classList.contains('taon-fullscreen');
1491
+ // ================================================================
1492
+ // NORMAL / FULLSCREEN
1493
+ // ================================================================
1494
+ if (!dialogMode) {
1495
+ this.layoutWidth.set(Math.floor(hostRect.width));
1496
+ this.layoutHeight.set(Math.max(0, Math.floor(window.innerHeight - hostRect.top)));
1497
+ return;
1498
+ }
1499
+ // ================================================================
1500
+ // DIALOG
1501
+ // ================================================================
1502
+ const windowRect = windowElement.getBoundingClientRect();
1503
+ this.layoutWidth.set(Math.max(0, Math.floor(windowRect.right - hostRect.left)));
1504
+ this.layoutHeight.set(Math.max(0, Math.floor(windowRect.bottom - hostRect.top)));
1505
+ }
1506
+ //#endregion
1507
+ //#region dialog resizing
1508
+ startResize(event) {
1509
+ if (!this.isDialogMode) {
1510
+ return;
1511
+ }
1512
+ const windowElement = this.getWindowElement();
1513
+ if (!windowElement) {
1514
+ return;
1515
+ }
1516
+ event.preventDefault();
1517
+ event.stopPropagation();
1518
+ const windowRect = windowElement.getBoundingClientRect();
1519
+ this.resizing = true;
1520
+ this.resizeStartX = event.clientX;
1521
+ this.resizeStartY = event.clientY;
1522
+ this.resizeStartWidth = windowRect.width;
1523
+ this.resizeStartHeight = windowRect.height;
1524
+ window.addEventListener('pointermove', this.resize);
1525
+ window.addEventListener('pointerup', this.stopResize);
1526
+ }
1527
+ //#endregion
1528
+ //#region aside
1529
+ toggleAside() {
1530
+ this.asideOpened.update(opened => !opened);
1531
+ }
1532
+ closeAside() {
1533
+ this.asideOpened.set(false);
1534
+ }
1535
+ closeAsideOnMobile() {
1536
+ if (window.innerWidth < 768) {
1537
+ this.closeAside();
1538
+ }
1539
+ }
1540
+ //#endregion
1541
+ //#region level 1
1284
1542
  async level1Clicked(route) {
1285
1543
  if (!route.path) {
1286
1544
  return;
@@ -1291,6 +1549,20 @@ class TaonAdminLayoutComponent {
1291
1549
  this.closeAsideOnMobile();
1292
1550
  }
1293
1551
  }
1552
+ async panelExpanded(route, expanded) {
1553
+ if (!expanded) {
1554
+ return;
1555
+ }
1556
+ await this.ensureLevel2Loaded(route);
1557
+ }
1558
+ isLevel1Active(route) {
1559
+ if (!route.path) {
1560
+ return false;
1561
+ }
1562
+ return this.isPathActive([route.path]);
1563
+ }
1564
+ //#endregion
1565
+ //#region level 2
1294
1566
  async level2Clicked(level1, level2) {
1295
1567
  if (!level1.path || !level2.path) {
1296
1568
  return;
@@ -1298,6 +1570,20 @@ class TaonAdminLayoutComponent {
1298
1570
  await this.navigateTo([level1.path, level2.path]);
1299
1571
  this.closeAsideOnMobile();
1300
1572
  }
1573
+ getLevel2Routes(route) {
1574
+ return this.level2Routes().get(route) ?? [];
1575
+ }
1576
+ isLevel2Active(level1, level2) {
1577
+ if (!level1.path || !level2.path) {
1578
+ return false;
1579
+ }
1580
+ return this.isPathActive([level1.path, level2.path]);
1581
+ }
1582
+ level2Link(level1, level2) {
1583
+ return [this.normalizedBasePath, level1.path, level2.path];
1584
+ }
1585
+ //#endregion
1586
+ //#region navigation
1301
1587
  outletBaseMatrixParams() {
1302
1588
  if (!this.outlet) {
1303
1589
  return {};
@@ -1310,11 +1596,6 @@ class TaonAdminLayoutComponent {
1310
1596
  }
1311
1597
  async navigateTo(routeSegments) {
1312
1598
  const segments = [...this.basePathSegments, ...routeSegments];
1313
- /**
1314
- * Named / auxiliary outlet:
1315
- *
1316
- * /products/123(admin:main/session/providers)
1317
- */
1318
1599
  if (this.outlet) {
1319
1600
  const [firstSegment, ...remainingSegments] = segments;
1320
1601
  if (!firstSegment) {
@@ -1324,61 +1605,15 @@ class TaonAdminLayoutComponent {
1324
1605
  return this.router.navigate([
1325
1606
  {
1326
1607
  outlets: {
1327
- [this.outlet]: [
1328
- firstSegment,
1329
- /**
1330
- * Angular interprets an object following
1331
- * a segment as matrix parameters.
1332
- */
1333
- matrixParams,
1334
- ...remainingSegments,
1335
- ],
1608
+ [this.outlet]: [firstSegment, matrixParams, ...remainingSegments],
1336
1609
  },
1337
1610
  },
1338
1611
  ]);
1339
1612
  }
1340
- /**
1341
- * Normal primary outlet:
1342
- *
1343
- * /main/session/providers
1344
- */
1345
1613
  return this.router.navigate(['/', ...segments]);
1346
1614
  }
1347
- closeAsideOnMobile() {
1348
- if (window.innerWidth < 768) {
1349
- this.closeAside();
1350
- }
1351
- }
1352
- async panelExpanded(route, expanded) {
1353
- if (!expanded) {
1354
- return;
1355
- }
1356
- await this.ensureLevel2Loaded(route);
1357
- }
1358
- isLevel1Active(route) {
1359
- if (!route.path) {
1360
- return false;
1361
- }
1362
- return this.isPathActive([route.path]);
1363
- }
1364
- // ---------------------------------------------------------------------------
1365
- // LEVEL 2
1366
- // ---------------------------------------------------------------------------
1367
- getLevel2Routes(route) {
1368
- return this.level2Routes().get(route) ?? [];
1369
- }
1370
- isLevel2Active(level1, level2) {
1371
- if (!level1.path || !level2.path) {
1372
- return false;
1373
- }
1374
- return this.isPathActive([level1.path, level2.path]);
1375
- }
1376
- level2Link(level1, level2) {
1377
- return [this.normalizedBasePath, level1.path, level2.path];
1378
- }
1379
- // ---------------------------------------------------------------------------
1380
- // ROUTE LOADING
1381
- // ---------------------------------------------------------------------------
1615
+ //#endregion
1616
+ //#region route loading
1382
1617
  async ensureLevel2Loaded(level1) {
1383
1618
  if (this.level2Routes().has(level1)) {
1384
1619
  return;
@@ -1389,23 +1624,6 @@ class TaonAdminLayoutComponent {
1389
1624
  this.setLoading(level1, true);
1390
1625
  try {
1391
1626
  const lazyRoutes = await this.loadRouteChildren(level1);
1392
- /**
1393
- * Your lazy modules have this shape:
1394
- *
1395
- * [
1396
- * {
1397
- * path: '',
1398
- * component: SessionComponent,
1399
- * children: [
1400
- * { path: 'tracking' },
1401
- * { path: 'providers' }
1402
- * ]
1403
- * }
1404
- * ]
1405
- *
1406
- * The path:'' wrapper DOES NOT represent a navigation
1407
- * level, so unwrap it.
1408
- */
1409
1627
  const level2 = this.unwrapEmptyPathRoutes(lazyRoutes);
1410
1628
  const map = new Map(this.level2Routes());
1411
1629
  map.set(level1, level2);
@@ -1425,21 +1643,6 @@ class TaonAdminLayoutComponent {
1425
1643
  }
1426
1644
  return [];
1427
1645
  }
1428
- /**
1429
- * Removes structural path:'' wrappers.
1430
- *
1431
- * [
1432
- * {
1433
- * path: '',
1434
- * component: SessionComponent,
1435
- * children: [...]
1436
- * }
1437
- * ]
1438
- *
1439
- * becomes:
1440
- *
1441
- * [...]
1442
- */
1443
1646
  unwrapEmptyPathRoutes(routes) {
1444
1647
  const result = [];
1445
1648
  for (const route of routes) {
@@ -1447,9 +1650,6 @@ class TaonAdminLayoutComponent {
1447
1650
  result.push(...this.unwrapEmptyPathRoutes(route.children));
1448
1651
  continue;
1449
1652
  }
1450
- /**
1451
- * redirects etc. shouldn't become menu entries.
1452
- */
1453
1653
  if (route.redirectTo !== undefined || route.data?.['hideInNavigation']) {
1454
1654
  continue;
1455
1655
  }
@@ -1457,9 +1657,8 @@ class TaonAdminLayoutComponent {
1457
1657
  }
1458
1658
  return result;
1459
1659
  }
1460
- // ---------------------------------------------------------------------------
1461
- // DIRECT URL SUPPORT
1462
- // ---------------------------------------------------------------------------
1660
+ //#endregion
1661
+ //#region direct url support
1463
1662
  async loadCurrentLevel1Route() {
1464
1663
  const relativeSegments = this.currentRelativeSegments();
1465
1664
  const level1Path = relativeSegments[0];
@@ -1471,18 +1670,23 @@ class TaonAdminLayoutComponent {
1471
1670
  await this.ensureLevel2Loaded(level1);
1472
1671
  }
1473
1672
  }
1474
- // ---------------------------------------------------------------------------
1475
- // HELPERS
1476
- // ---------------------------------------------------------------------------
1673
+ //#endregion
1674
+ //#region helpers
1477
1675
  label(route) {
1478
1676
  return route.data?.['menuItem'] ?? this.startCase(route.path ?? '');
1479
1677
  }
1678
+ color(route) {
1679
+ return route.data?.['color'];
1680
+ }
1480
1681
  icon(route) {
1481
1682
  return route.data?.['icon'];
1482
1683
  }
1483
1684
  isLoading(route) {
1484
1685
  return this.loadingRoutes().has(route);
1485
1686
  }
1687
+ isExpandable(route) {
1688
+ return route.data?.['expandable'] !== false;
1689
+ }
1486
1690
  isPathActive(routeSegments) {
1487
1691
  const current = this.currentRelativeSegments();
1488
1692
  if (current.length < routeSegments.length) {
@@ -1503,16 +1707,6 @@ class TaonAdminLayoutComponent {
1503
1707
  }
1504
1708
  return group.segments.map(segment => segment.path);
1505
1709
  }
1506
- isExpandable(route) {
1507
- return route.data?.['expandable'] !== false;
1508
- }
1509
- get normalizedBasePath() {
1510
- const value = '/' + this.basePath.split('/').filter(Boolean).join('/');
1511
- return value === '/' ? '/' : value;
1512
- }
1513
- cleanUrl(url) {
1514
- return url.split('?')[0].split('#')[0];
1515
- }
1516
1710
  setLoading(route, loading) {
1517
1711
  const set = new Set(this.loadingRoutes());
1518
1712
  if (loading) {
@@ -1528,8 +1722,8 @@ class TaonAdminLayoutComponent {
1528
1722
  .replace(/[-_]+/g, ' ')
1529
1723
  .replace(/\b\w/g, char => char.toUpperCase());
1530
1724
  }
1531
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonAdminLayoutComponent, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
1532
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: TaonAdminLayoutComponent, isStandalone: true, selector: "taon-admin-layout", inputs: { routes: "routes", basePath: "basePath", outlet: "outlet" }, ngImport: i0, template: "<div class=\"flex h-dvh min-h-0 flex-col overflow-hidden\">\n <!-- ============================================================= -->\n <!-- HEADER -->\n <!-- ============================================================= -->\n\n <header\n class=\"flex h-16 shrink-0 items-center border-b border-gray-200 bg-white\">\n <!-- hamburger ALWAYS visible -->\n <button\n mat-icon-button\n type=\"button\"\n aria-label=\"Toggle admin menu\"\n class=\"mx-2 shrink-0 cursor-pointer\"\n (click)=\"toggleAside()\">\n <mat-icon>menu</mat-icon>\n </button>\n\n <div class=\"min-w-0 flex-1\">\n <ng-content select=\"[header]\" />\n </div>\n </header>\n\n <!-- ============================================================= -->\n <!-- BODY -->\n <!-- ============================================================= -->\n\n <div class=\"relative flex min-h-0 flex-1 overflow-hidden\">\n <!-- =========================================================== -->\n <!-- MOBILE BACKDROP -->\n <!-- =========================================================== -->\n\n @if (asideOpened()) {\n <div\n class=\"absolute inset-0 z-20 bg-black/30 md:hidden\"\n (click)=\"closeAside()\"></div>\n }\n\n <!-- =========================================================== -->\n <!-- ASIDE -->\n <!-- =========================================================== -->\n\n <aside\n class=\"absolute inset-y-0 left-0 z-30 flex min-h-0 flex-col border-r border-gray-200 bg-white transition-[width,transform] duration-200 md:relative md:inset-auto md:z-auto md:translate-x-0\"\n [class.w-72]=\"asideOpened()\"\n [class.-translate-x-full]=\"!asideOpened()\"\n [class.translate-x-0]=\"asideOpened()\"\n [class.md:w-72]=\"asideOpened()\"\n [class.md:w-0]=\"!asideOpened()\"\n [class.md:overflow-hidden]=\"!asideOpened()\">\n <!-- ========================================================= -->\n <!-- SCROLLABLE ASIDE CONTENT -->\n <!-- ========================================================= -->\n\n <div class=\"min-h-0 flex-1 overflow-y-auto\">\n <mat-accordion class=\"admin-menu\">\n @for (level1 of routes; track level1.path) {\n <!-- =================================================== -->\n <!-- EXPANDABLE LEVEL 1 -->\n <!-- =================================================== -->\n\n @if (isExpandable(level1)) {\n <mat-expansion-panel\n [expanded]=\"isLevel1Active(level1)\"\n (expandedChange)=\"panelExpanded(level1, $event)\">\n <!-- ================================================= -->\n <!-- LEVEL 1 -->\n <!-- ================================================= -->\n\n <mat-expansion-panel-header (click)=\"level1Clicked(level1)\">\n <mat-panel-title>\n <div class=\"flex items-center gap-3\">\n @if (icon(level1)) {\n <mat-icon>\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span [class.font-semibold]=\"isLevel1Active(level1)\">\n {{ label(level1) }}\n </span>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <!-- ================================================= -->\n <!-- LEVEL 2 -->\n <!-- ================================================= -->\n\n <div class=\"flex flex-col\">\n @if (isLoading(level1)) {\n <div class=\"px-4 py-2 text-sm text-gray-400\">\n Loading...\n </div>\n } @else {\n @for (\n level2 of getLevel2Routes(level1);\n track level2.path\n ) {\n <a\n (click)=\"level2Clicked(level1, level2)\"\n class=\"flex cursor-pointer items-center gap-3 px-6 py-2.5 text-sm transition-colors hover:bg-gray-100\"\n [class.bg-gray-100]=\"isLevel2Active(level1, level2)\"\n [class.font-semibold]=\"isLevel2Active(level1, level2)\">\n @if (icon(level2)) {\n <mat-icon>\n {{ icon(level2) }}\n </mat-icon>\n }\n\n <span>\n {{ label(level2) }}\n </span>\n </a>\n }\n }\n </div>\n </mat-expansion-panel>\n } @else {\n <!-- ================================================= -->\n <!-- NON-EXPANDABLE LEVEL 1 -->\n <!-- ================================================= -->\n\n <a\n (click)=\"level1Clicked(level1)\"\n class=\"flex h-14 cursor-pointer items-center gap-3 px-6 transition-colors hover:bg-gray-100\"\n [class.bg-gray-100]=\"isLevel1Active(level1)\"\n [class.font-semibold]=\"isLevel1Active(level1)\">\n @if (icon(level1)) {\n <mat-icon>\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span>\n {{ label(level1) }}\n </span>\n </a>\n }\n }\n </mat-accordion>\n </div>\n\n <!-- ========================================================= -->\n <!-- ASIDE FOOTER - ALWAYS VISIBLE -->\n <!-- ========================================================= -->\n\n <footer class=\"shrink-0 border-t border-gray-200 bg-white p-3\">\n <ng-content select=\"[asideFooter]\" />\n </footer>\n </aside>\n\n <!-- =========================================================== -->\n <!-- MAIN -->\n <!-- =========================================================== -->\n\n <main class=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n <!-- ========================================================= -->\n <!-- LEVEL 3+ TABS -->\n <!-- ========================================================= -->\n\n <taon-admin-page-tabs\n class=\"shrink-0\"\n [routes]=\"routes\"\n [basePath]=\"basePath\"\n [outlet]=\"outlet\" />\n\n <!-- ========================================================= -->\n <!-- ROUTER CONTENT -->\n <!-- ========================================================= -->\n\n <div class=\"min-h-0 flex-1 overflow-y-auto p-4 md:p-6\">\n <router-outlet />\n </div>\n </main>\n </div>\n</div>\n", styles: [":host{display:block;height:100%;min-height:0}.admin-menu mat-expansion-panel{border-radius:0!important;box-shadow:none!important;border-bottom:1px solid var(--mat-sys-outline-variant);margin-top:0!important;margin-bottom:0!important}.admin-menu mat-expansion-panel:first-of-type,.admin-menu mat-expansion-panel:last-of-type{border-radius:0!important}.admin-menu mat-expansion-panel-header{border-radius:0!important}.admin-aside{position:absolute;inset-block:0;left:0;z-index:30;display:flex;flex-direction:column;width:18rem;min-height:0;background:#fff;border-right:1px solid var(--mat-sys-outline-variant);transform:translate(-100%);transition:transform .2s ease,width .2s ease;overflow:hidden}.admin-aside-open{transform:translate(0)}@media(min-width:768px){.admin-aside{position:relative;inset:auto;z-index:auto;width:0;transform:none}.admin-aside-open{width:18rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i2$1.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i2$1.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i2$1.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i2$1.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: TaonAdminPageTabsComponent, selector: "taon-admin-page-tabs", inputs: ["routes", "basePath", "outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1725
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonAdminLayoutComponent, deps: [{ token: i1.Router }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
1726
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: TaonAdminLayoutComponent, isStandalone: true, selector: "taon-admin-layout", inputs: { routes: "routes", basePath: "basePath", outlet: "outlet" }, host: { listeners: { "window:resize": "windowResized()" } }, ngImport: i0, template: "<div\n #layout\n class=\"admin-layout\"\n [class.admin-layout-dialog]=\"isDialogMode\"\n [style.width.px]=\"layoutWidth() || null\"\n [style.height.px]=\"layoutHeight() || null\">\n <!-- ============================================================= -->\n <!-- HEADER -->\n <!-- ============================================================= -->\n\n <header class=\"admin-header\">\n <button\n mat-icon-button\n type=\"button\"\n aria-label=\"Toggle admin menu\"\n class=\"admin-menu-button\"\n (click)=\"toggleAside()\">\n <mat-icon>menu</mat-icon>\n </button>\n\n <div class=\"admin-header-content\">\n <ng-content select=\"[header]\" />\n </div>\n </header>\n\n <!-- ============================================================= -->\n <!-- BODY -->\n <!-- ============================================================= -->\n\n <div class=\"admin-body\">\n <!-- =========================================================== -->\n <!-- MOBILE BACKDROP -->\n <!-- =========================================================== -->\n\n @if (asideOpened()) {\n <div\n class=\"admin-aside-backdrop\"\n (click)=\"closeAside()\"></div>\n }\n\n <!-- =========================================================== -->\n <!-- ASIDE -->\n <!-- =========================================================== -->\n\n <aside\n class=\"admin-aside\"\n [class.admin-aside-open]=\"asideOpened()\">\n <!-- ========================================================= -->\n <!-- SCROLLABLE ASIDE CONTENT -->\n <!-- ========================================================= -->\n\n <div class=\"admin-aside-content\">\n <mat-accordion class=\"admin-menu\">\n @for (level1 of routes; track level1.path) {\n @if (isExpandable(level1)) {\n <mat-expansion-panel\n [expanded]=\"isLevel1Active(level1)\"\n (expandedChange)=\"panelExpanded(level1, $event)\">\n <mat-expansion-panel-header (click)=\"level1Clicked(level1)\">\n <mat-panel-title>\n <div class=\"admin-menu-item\">\n @if (icon(level1)) {\n <mat-icon\n [ngStyle]=\"{\n color: color(level1),\n }\">\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span\n [class.font-semibold]=\"isLevel1Active(level1)\"\n [ngStyle]=\"{\n color: color(level1),\n }\">\n {{ label(level1) }}\n </span>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"admin-level2\">\n @if (isLoading(level1)) {\n <div class=\"admin-loading\">Loading...</div>\n } @else {\n @for (\n level2 of getLevel2Routes(level1);\n track level2.path\n ) {\n <a\n class=\"admin-level2-item\"\n [class.admin-level2-item-active]=\"\n isLevel2Active(level1, level2)\n \"\n (click)=\"level2Clicked(level1, level2)\">\n @if (icon(level2)) {\n <mat-icon\n [ngStyle]=\"{\n color: color(level2),\n }\">\n {{ icon(level2) }}\n </mat-icon>\n }\n\n <span\n [ngStyle]=\"{\n color: color(level2),\n }\">\n {{ label(level2) }}\n </span>\n </a>\n }\n }\n </div>\n </mat-expansion-panel>\n } @else {\n <a\n class=\"admin-level1-item\"\n [class.admin-level1-item-active]=\"isLevel1Active(level1)\"\n (click)=\"level1Clicked(level1)\">\n @if (icon(level1)) {\n <mat-icon\n [ngStyle]=\"{\n color: color(level1),\n }\">\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span\n [ngStyle]=\"{\n color: color(level1),\n }\">\n {{ label(level1) }}\n </span>\n </a>\n }\n }\n </mat-accordion>\n </div>\n\n <!-- ========================================================= -->\n <!-- ASIDE FOOTER -->\n <!-- ========================================================= -->\n\n <footer class=\"admin-aside-footer\">\n <ng-content select=\"[asideFooter]\" />\n </footer>\n </aside>\n\n <!-- =========================================================== -->\n <!-- MAIN -->\n <!-- =========================================================== -->\n\n <main class=\"admin-main\">\n <!-- ========================================================= -->\n <!-- LEVEL 3+ TABS -->\n <!-- ========================================================= -->\n\n <taon-admin-page-tabs\n class=\"admin-tabs\"\n [routes]=\"routes\"\n [basePath]=\"basePath\"\n [outlet]=\"outlet\" />\n\n <!-- ========================================================= -->\n <!-- SCROLLABLE CONTENT -->\n <!-- ========================================================= -->\n\n <div class=\"admin-content\">\n <router-outlet />\n </div>\n\n <!-- ========================================================= -->\n <!-- CONTENT FOOTER -->\n <!-- ========================================================= -->\n\n <footer class=\"admin-content-footer\">\n <ng-content select=\"[contentFooter]\" />\n </footer>\n </main>\n </div>\n\n <!-- ============================================================= -->\n <!-- DIALOG RESIZE HANDLE -->\n <!-- ============================================================= -->\n\n @if (isDialogMode) {\n <div\n class=\"admin-resize-handle\"\n (pointerdown)=\"startResize($event)\"></div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-width:0;min-height:0}.admin-layout{position:relative;display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden;background:#fff}.admin-layout-dialog{min-width:500px;min-height:350px}.admin-header{display:flex;align-items:center;flex:0 0 64px;height:64px;border-bottom:1px solid var(--mat-sys-outline-variant);background:#fff}.admin-menu-button{flex:0 0 auto;margin-left:8px;margin-right:8px;cursor:pointer}.admin-header-content{flex:1 1 auto;min-width:0}.admin-body{position:relative;display:flex;flex:1 1 auto;min-width:0;min-height:0;overflow:hidden}.admin-aside{position:absolute;top:0;bottom:0;left:0;z-index:30;display:flex;flex-direction:column;width:288px;min-height:0;overflow:hidden;background:#fff;border-right:1px solid var(--mat-sys-outline-variant);transform:translate(-100%);transition:transform .2s ease,width .2s ease}.admin-aside-open{transform:translate(0)}.admin-aside-content{flex:1 1 auto;min-height:0;overflow-x:hidden;overflow-y:auto}.admin-aside-footer{flex:0 0 auto;padding:12px;border-top:1px solid var(--mat-sys-outline-variant);background:#fff}.admin-menu{display:block}.admin-menu mat-expansion-panel{margin-top:0!important;margin-bottom:0!important;border-radius:0!important;box-shadow:none!important;border-bottom:1px solid var(--mat-sys-outline-variant)}.admin-menu mat-expansion-panel:first-of-type,.admin-menu mat-expansion-panel:last-of-type,.admin-menu mat-expansion-panel-header{border-radius:0!important}.admin-menu-item{display:flex;align-items:center;gap:12px}.admin-level2{display:flex;flex-direction:column}.admin-level2-item{display:flex;align-items:center;gap:12px;padding:10px 24px;cursor:pointer}.admin-level2-item:hover,.admin-level2-item-active{background:#f5f5f5}.admin-level2-item-active{font-weight:600}.admin-level1-item{display:flex;align-items:center;height:56px;gap:12px;padding:0 24px;cursor:pointer}.admin-level1-item:hover,.admin-level1-item-active{background:#f5f5f5}.admin-level1-item-active{font-weight:600}.admin-loading{padding:8px 16px;opacity:.6}.admin-main{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0;overflow:hidden}.admin-tabs{display:block;flex:0 0 auto}.admin-content{flex:1 1 auto;min-width:0;min-height:0;padding:24px;overflow-x:auto;overflow-y:auto}.admin-content-footer{flex:0 0 auto;padding:12px 24px;border-top:1px solid var(--mat-sys-outline-variant);background:#fff}.admin-aside-backdrop{position:absolute;inset:0;z-index:20;background:#0000004d}@media(min-width:768px){.admin-aside{position:relative;top:auto;bottom:auto;left:auto;z-index:auto;width:0;transform:none}.admin-aside-open{width:288px;min-width:288px}.admin-aside-backdrop{display:none}}.admin-resize-handle{position:absolute;right:0;bottom:0;z-index:100;width:18px;height:18px;cursor:nwse-resize}.admin-resize-handle:after{content:\"\";position:absolute;right:4px;bottom:4px;width:8px;height:8px;border-right:2px solid #777;border-bottom:2px solid #777}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "directive", type: i3.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i3.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i3.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i3.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: TaonAdminPageTabsComponent, selector: "taon-admin-page-tabs", inputs: ["routes", "basePath", "outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1533
1727
  }
1534
1728
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonAdminLayoutComponent, decorators: [{
1535
1729
  type: Component,
@@ -1540,18 +1734,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
1540
1734
  MatExpansionModule,
1541
1735
  MatIconModule,
1542
1736
  TaonAdminPageTabsComponent,
1543
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex h-dvh min-h-0 flex-col overflow-hidden\">\n <!-- ============================================================= -->\n <!-- HEADER -->\n <!-- ============================================================= -->\n\n <header\n class=\"flex h-16 shrink-0 items-center border-b border-gray-200 bg-white\">\n <!-- hamburger ALWAYS visible -->\n <button\n mat-icon-button\n type=\"button\"\n aria-label=\"Toggle admin menu\"\n class=\"mx-2 shrink-0 cursor-pointer\"\n (click)=\"toggleAside()\">\n <mat-icon>menu</mat-icon>\n </button>\n\n <div class=\"min-w-0 flex-1\">\n <ng-content select=\"[header]\" />\n </div>\n </header>\n\n <!-- ============================================================= -->\n <!-- BODY -->\n <!-- ============================================================= -->\n\n <div class=\"relative flex min-h-0 flex-1 overflow-hidden\">\n <!-- =========================================================== -->\n <!-- MOBILE BACKDROP -->\n <!-- =========================================================== -->\n\n @if (asideOpened()) {\n <div\n class=\"absolute inset-0 z-20 bg-black/30 md:hidden\"\n (click)=\"closeAside()\"></div>\n }\n\n <!-- =========================================================== -->\n <!-- ASIDE -->\n <!-- =========================================================== -->\n\n <aside\n class=\"absolute inset-y-0 left-0 z-30 flex min-h-0 flex-col border-r border-gray-200 bg-white transition-[width,transform] duration-200 md:relative md:inset-auto md:z-auto md:translate-x-0\"\n [class.w-72]=\"asideOpened()\"\n [class.-translate-x-full]=\"!asideOpened()\"\n [class.translate-x-0]=\"asideOpened()\"\n [class.md:w-72]=\"asideOpened()\"\n [class.md:w-0]=\"!asideOpened()\"\n [class.md:overflow-hidden]=\"!asideOpened()\">\n <!-- ========================================================= -->\n <!-- SCROLLABLE ASIDE CONTENT -->\n <!-- ========================================================= -->\n\n <div class=\"min-h-0 flex-1 overflow-y-auto\">\n <mat-accordion class=\"admin-menu\">\n @for (level1 of routes; track level1.path) {\n <!-- =================================================== -->\n <!-- EXPANDABLE LEVEL 1 -->\n <!-- =================================================== -->\n\n @if (isExpandable(level1)) {\n <mat-expansion-panel\n [expanded]=\"isLevel1Active(level1)\"\n (expandedChange)=\"panelExpanded(level1, $event)\">\n <!-- ================================================= -->\n <!-- LEVEL 1 -->\n <!-- ================================================= -->\n\n <mat-expansion-panel-header (click)=\"level1Clicked(level1)\">\n <mat-panel-title>\n <div class=\"flex items-center gap-3\">\n @if (icon(level1)) {\n <mat-icon>\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span [class.font-semibold]=\"isLevel1Active(level1)\">\n {{ label(level1) }}\n </span>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <!-- ================================================= -->\n <!-- LEVEL 2 -->\n <!-- ================================================= -->\n\n <div class=\"flex flex-col\">\n @if (isLoading(level1)) {\n <div class=\"px-4 py-2 text-sm text-gray-400\">\n Loading...\n </div>\n } @else {\n @for (\n level2 of getLevel2Routes(level1);\n track level2.path\n ) {\n <a\n (click)=\"level2Clicked(level1, level2)\"\n class=\"flex cursor-pointer items-center gap-3 px-6 py-2.5 text-sm transition-colors hover:bg-gray-100\"\n [class.bg-gray-100]=\"isLevel2Active(level1, level2)\"\n [class.font-semibold]=\"isLevel2Active(level1, level2)\">\n @if (icon(level2)) {\n <mat-icon>\n {{ icon(level2) }}\n </mat-icon>\n }\n\n <span>\n {{ label(level2) }}\n </span>\n </a>\n }\n }\n </div>\n </mat-expansion-panel>\n } @else {\n <!-- ================================================= -->\n <!-- NON-EXPANDABLE LEVEL 1 -->\n <!-- ================================================= -->\n\n <a\n (click)=\"level1Clicked(level1)\"\n class=\"flex h-14 cursor-pointer items-center gap-3 px-6 transition-colors hover:bg-gray-100\"\n [class.bg-gray-100]=\"isLevel1Active(level1)\"\n [class.font-semibold]=\"isLevel1Active(level1)\">\n @if (icon(level1)) {\n <mat-icon>\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span>\n {{ label(level1) }}\n </span>\n </a>\n }\n }\n </mat-accordion>\n </div>\n\n <!-- ========================================================= -->\n <!-- ASIDE FOOTER - ALWAYS VISIBLE -->\n <!-- ========================================================= -->\n\n <footer class=\"shrink-0 border-t border-gray-200 bg-white p-3\">\n <ng-content select=\"[asideFooter]\" />\n </footer>\n </aside>\n\n <!-- =========================================================== -->\n <!-- MAIN -->\n <!-- =========================================================== -->\n\n <main class=\"flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden\">\n <!-- ========================================================= -->\n <!-- LEVEL 3+ TABS -->\n <!-- ========================================================= -->\n\n <taon-admin-page-tabs\n class=\"shrink-0\"\n [routes]=\"routes\"\n [basePath]=\"basePath\"\n [outlet]=\"outlet\" />\n\n <!-- ========================================================= -->\n <!-- ROUTER CONTENT -->\n <!-- ========================================================= -->\n\n <div class=\"min-h-0 flex-1 overflow-y-auto p-4 md:p-6\">\n <router-outlet />\n </div>\n </main>\n </div>\n</div>\n", styles: [":host{display:block;height:100%;min-height:0}.admin-menu mat-expansion-panel{border-radius:0!important;box-shadow:none!important;border-bottom:1px solid var(--mat-sys-outline-variant);margin-top:0!important;margin-bottom:0!important}.admin-menu mat-expansion-panel:first-of-type,.admin-menu mat-expansion-panel:last-of-type{border-radius:0!important}.admin-menu mat-expansion-panel-header{border-radius:0!important}.admin-aside{position:absolute;inset-block:0;left:0;z-index:30;display:flex;flex-direction:column;width:18rem;min-height:0;background:#fff;border-right:1px solid var(--mat-sys-outline-variant);transform:translate(-100%);transition:transform .2s ease,width .2s ease;overflow:hidden}.admin-aside-open{transform:translate(0)}@media(min-width:768px){.admin-aside{position:relative;inset:auto;z-index:auto;width:0;transform:none}.admin-aside-open{width:18rem}}\n"] }]
1544
- }], ctorParameters: () => [{ type: i1.Router }], propDecorators: { routes: [{
1737
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #layout\n class=\"admin-layout\"\n [class.admin-layout-dialog]=\"isDialogMode\"\n [style.width.px]=\"layoutWidth() || null\"\n [style.height.px]=\"layoutHeight() || null\">\n <!-- ============================================================= -->\n <!-- HEADER -->\n <!-- ============================================================= -->\n\n <header class=\"admin-header\">\n <button\n mat-icon-button\n type=\"button\"\n aria-label=\"Toggle admin menu\"\n class=\"admin-menu-button\"\n (click)=\"toggleAside()\">\n <mat-icon>menu</mat-icon>\n </button>\n\n <div class=\"admin-header-content\">\n <ng-content select=\"[header]\" />\n </div>\n </header>\n\n <!-- ============================================================= -->\n <!-- BODY -->\n <!-- ============================================================= -->\n\n <div class=\"admin-body\">\n <!-- =========================================================== -->\n <!-- MOBILE BACKDROP -->\n <!-- =========================================================== -->\n\n @if (asideOpened()) {\n <div\n class=\"admin-aside-backdrop\"\n (click)=\"closeAside()\"></div>\n }\n\n <!-- =========================================================== -->\n <!-- ASIDE -->\n <!-- =========================================================== -->\n\n <aside\n class=\"admin-aside\"\n [class.admin-aside-open]=\"asideOpened()\">\n <!-- ========================================================= -->\n <!-- SCROLLABLE ASIDE CONTENT -->\n <!-- ========================================================= -->\n\n <div class=\"admin-aside-content\">\n <mat-accordion class=\"admin-menu\">\n @for (level1 of routes; track level1.path) {\n @if (isExpandable(level1)) {\n <mat-expansion-panel\n [expanded]=\"isLevel1Active(level1)\"\n (expandedChange)=\"panelExpanded(level1, $event)\">\n <mat-expansion-panel-header (click)=\"level1Clicked(level1)\">\n <mat-panel-title>\n <div class=\"admin-menu-item\">\n @if (icon(level1)) {\n <mat-icon\n [ngStyle]=\"{\n color: color(level1),\n }\">\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span\n [class.font-semibold]=\"isLevel1Active(level1)\"\n [ngStyle]=\"{\n color: color(level1),\n }\">\n {{ label(level1) }}\n </span>\n </div>\n </mat-panel-title>\n </mat-expansion-panel-header>\n\n <div class=\"admin-level2\">\n @if (isLoading(level1)) {\n <div class=\"admin-loading\">Loading...</div>\n } @else {\n @for (\n level2 of getLevel2Routes(level1);\n track level2.path\n ) {\n <a\n class=\"admin-level2-item\"\n [class.admin-level2-item-active]=\"\n isLevel2Active(level1, level2)\n \"\n (click)=\"level2Clicked(level1, level2)\">\n @if (icon(level2)) {\n <mat-icon\n [ngStyle]=\"{\n color: color(level2),\n }\">\n {{ icon(level2) }}\n </mat-icon>\n }\n\n <span\n [ngStyle]=\"{\n color: color(level2),\n }\">\n {{ label(level2) }}\n </span>\n </a>\n }\n }\n </div>\n </mat-expansion-panel>\n } @else {\n <a\n class=\"admin-level1-item\"\n [class.admin-level1-item-active]=\"isLevel1Active(level1)\"\n (click)=\"level1Clicked(level1)\">\n @if (icon(level1)) {\n <mat-icon\n [ngStyle]=\"{\n color: color(level1),\n }\">\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span\n [ngStyle]=\"{\n color: color(level1),\n }\">\n {{ label(level1) }}\n </span>\n </a>\n }\n }\n </mat-accordion>\n </div>\n\n <!-- ========================================================= -->\n <!-- ASIDE FOOTER -->\n <!-- ========================================================= -->\n\n <footer class=\"admin-aside-footer\">\n <ng-content select=\"[asideFooter]\" />\n </footer>\n </aside>\n\n <!-- =========================================================== -->\n <!-- MAIN -->\n <!-- =========================================================== -->\n\n <main class=\"admin-main\">\n <!-- ========================================================= -->\n <!-- LEVEL 3+ TABS -->\n <!-- ========================================================= -->\n\n <taon-admin-page-tabs\n class=\"admin-tabs\"\n [routes]=\"routes\"\n [basePath]=\"basePath\"\n [outlet]=\"outlet\" />\n\n <!-- ========================================================= -->\n <!-- SCROLLABLE CONTENT -->\n <!-- ========================================================= -->\n\n <div class=\"admin-content\">\n <router-outlet />\n </div>\n\n <!-- ========================================================= -->\n <!-- CONTENT FOOTER -->\n <!-- ========================================================= -->\n\n <footer class=\"admin-content-footer\">\n <ng-content select=\"[contentFooter]\" />\n </footer>\n </main>\n </div>\n\n <!-- ============================================================= -->\n <!-- DIALOG RESIZE HANDLE -->\n <!-- ============================================================= -->\n\n @if (isDialogMode) {\n <div\n class=\"admin-resize-handle\"\n (pointerdown)=\"startResize($event)\"></div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%;min-width:0;min-height:0}.admin-layout{position:relative;display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden;background:#fff}.admin-layout-dialog{min-width:500px;min-height:350px}.admin-header{display:flex;align-items:center;flex:0 0 64px;height:64px;border-bottom:1px solid var(--mat-sys-outline-variant);background:#fff}.admin-menu-button{flex:0 0 auto;margin-left:8px;margin-right:8px;cursor:pointer}.admin-header-content{flex:1 1 auto;min-width:0}.admin-body{position:relative;display:flex;flex:1 1 auto;min-width:0;min-height:0;overflow:hidden}.admin-aside{position:absolute;top:0;bottom:0;left:0;z-index:30;display:flex;flex-direction:column;width:288px;min-height:0;overflow:hidden;background:#fff;border-right:1px solid var(--mat-sys-outline-variant);transform:translate(-100%);transition:transform .2s ease,width .2s ease}.admin-aside-open{transform:translate(0)}.admin-aside-content{flex:1 1 auto;min-height:0;overflow-x:hidden;overflow-y:auto}.admin-aside-footer{flex:0 0 auto;padding:12px;border-top:1px solid var(--mat-sys-outline-variant);background:#fff}.admin-menu{display:block}.admin-menu mat-expansion-panel{margin-top:0!important;margin-bottom:0!important;border-radius:0!important;box-shadow:none!important;border-bottom:1px solid var(--mat-sys-outline-variant)}.admin-menu mat-expansion-panel:first-of-type,.admin-menu mat-expansion-panel:last-of-type,.admin-menu mat-expansion-panel-header{border-radius:0!important}.admin-menu-item{display:flex;align-items:center;gap:12px}.admin-level2{display:flex;flex-direction:column}.admin-level2-item{display:flex;align-items:center;gap:12px;padding:10px 24px;cursor:pointer}.admin-level2-item:hover,.admin-level2-item-active{background:#f5f5f5}.admin-level2-item-active{font-weight:600}.admin-level1-item{display:flex;align-items:center;height:56px;gap:12px;padding:0 24px;cursor:pointer}.admin-level1-item:hover,.admin-level1-item-active{background:#f5f5f5}.admin-level1-item-active{font-weight:600}.admin-loading{padding:8px 16px;opacity:.6}.admin-main{display:flex;flex-direction:column;flex:1 1 auto;min-width:0;min-height:0;overflow:hidden}.admin-tabs{display:block;flex:0 0 auto}.admin-content{flex:1 1 auto;min-width:0;min-height:0;padding:24px;overflow-x:auto;overflow-y:auto}.admin-content-footer{flex:0 0 auto;padding:12px 24px;border-top:1px solid var(--mat-sys-outline-variant);background:#fff}.admin-aside-backdrop{position:absolute;inset:0;z-index:20;background:#0000004d}@media(min-width:768px){.admin-aside{position:relative;top:auto;bottom:auto;left:auto;z-index:auto;width:0;transform:none}.admin-aside-open{width:288px;min-width:288px}.admin-aside-backdrop{display:none}}.admin-resize-handle{position:absolute;right:0;bottom:0;z-index:100;width:18px;height:18px;cursor:nwse-resize}.admin-resize-handle:after{content:\"\";position:absolute;right:4px;bottom:4px;width:8px;height:8px;border-right:2px solid #777;border-bottom:2px solid #777}\n"] }]
1738
+ }], ctorParameters: () => [{ type: i1.Router }, { type: i0.ElementRef }], propDecorators: { routes: [{
1545
1739
  type: Input,
1546
1740
  args: [{ required: true }]
1547
1741
  }], basePath: [{
1548
1742
  type: Input
1549
1743
  }], outlet: [{
1550
1744
  type: Input
1745
+ }], windowResized: [{
1746
+ type: HostListener,
1747
+ args: ['window:resize']
1551
1748
  }] } });
1552
1749
 
1553
- function adminLazyRoutes(loader) {
1750
+ const TaonBaselineBackofficeOutletName = 'admin';
1751
+ function adminLazyRoute(options) {
1752
+ const { path, loader, menuItem, icon, color, expandable, hideInNavigation } = options;
1554
1753
  return {
1754
+ path,
1755
+ data: {
1756
+ menuItem,
1757
+ color,
1758
+ icon,
1759
+ expandable,
1760
+ hideInNavigation,
1761
+ },
1555
1762
  loadChildren: loader,
1556
1763
  loadAdminChildren: loader,
1557
1764
  };
@@ -1574,6 +1781,645 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
1574
1781
  args: [RouterOutlet]
1575
1782
  }] } });
1576
1783
 
1784
+ //#region imports
1785
+ class TaonErrorDetailsDialogComponent {
1786
+ constructor() {
1787
+ //#region injections
1788
+ this.data = inject(MAT_DIALOG_DATA);
1789
+ //#endregion
1790
+ //#region constants
1791
+ this.editorStorageKey = 'taon-error-details-editor';
1792
+ //#endregion
1793
+ //#region state
1794
+ this.editor = this.loadEditor();
1795
+ this.stackLines = this.parseStackTrace(this.data.details);
1796
+ }
1797
+ //#endregion
1798
+ //#region editor
1799
+ setEditor(editor) {
1800
+ this.editor = editor;
1801
+ localStorage.setItem(this.editorStorageKey, editor);
1802
+ }
1803
+ loadEditor() {
1804
+ const editor = localStorage.getItem(this.editorStorageKey);
1805
+ if (editor === 'vscode' || editor === 'vscodium') {
1806
+ return editor;
1807
+ }
1808
+ return 'vscode';
1809
+ }
1810
+ //#endregion
1811
+ //#region stack trace
1812
+ parseStackTrace(stack) {
1813
+ return stack
1814
+ .split('\n')
1815
+ .map(text => text.trimEnd())
1816
+ .filter(text => text.trim().length > 0)
1817
+ .map(text => this.parseStackTraceLine(text));
1818
+ }
1819
+ parseStackTraceLine(text) {
1820
+ /**
1821
+ * Matches:
1822
+ *
1823
+ * /Users/test/file.ts:10:20
1824
+ *
1825
+ * C:\projects\test\file.ts:10:20
1826
+ *
1827
+ * at something (/Users/test/file.ts:10:20)
1828
+ */
1829
+ const match = text.match(/((?:[A-Za-z]:[\\/]|\/)[^()\n]+?):(\d+):(\d+)/);
1830
+ if (!match) {
1831
+ return {
1832
+ text,
1833
+ };
1834
+ }
1835
+ return {
1836
+ text,
1837
+ file: match[1],
1838
+ line: Number(match[2]),
1839
+ column: Number(match[3]),
1840
+ };
1841
+ }
1842
+ //#endregion
1843
+ //#region open editor
1844
+ openStackLine(stackLine) {
1845
+ if (!stackLine.file || !stackLine.line) {
1846
+ return;
1847
+ }
1848
+ const url = this.createEditorUrl(stackLine.file, stackLine.line, stackLine.column);
1849
+ window.location.href = url;
1850
+ }
1851
+ createEditorUrl(file, line, column) {
1852
+ const protocol = this.editor === 'vscodium' ? 'vscodium' : 'vscode';
1853
+ const location = [file, line, column]
1854
+ .filter(value => value !== undefined)
1855
+ .join(':');
1856
+ return `${protocol}://file${location}`;
1857
+ }
1858
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonErrorDetailsDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1859
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: TaonErrorDetailsDialogComponent, isStandalone: true, selector: "taon-error-details-dialog", ngImport: i0, template: "<h2 mat-dialog-title>Error details</h2>\n\n<mat-dialog-content>\n <div class=\"error-message\">\n {{ data.message }}\n </div>\n\n <div class=\"editor-selector\">\n <span class=\"editor-selector-label\"> I am using editor: </span>\n\n <mat-button-toggle-group\n [value]=\"editor\"\n (change)=\"setEditor($event.value)\"\n aria-label=\"Code editor\">\n <mat-button-toggle value=\"vscode\"> VS Code </mat-button-toggle>\n\n <mat-button-toggle value=\"vscodium\"> VSCodium </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <pre\n class=\"error-details\"><code>@for (stackLine of stackLines; track $index) {\n@if (stackLine.file) {<a\n class=\"stack-link\"\n title=\"Open {{ stackLine.file }}:{{ stackLine.line }}:{{ stackLine.column }}\"\n (click)=\"openStackLine(stackLine)\">{{ stackLine.text }}</a>} @else {{{ stackLine.text }}}{{ '\\n' }}\n}</code></pre>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button\n mat-button\n mat-dialog-close>\n Close\n </button>\n</mat-dialog-actions>\n", styles: [".error-message{margin-bottom:16px;font-weight:500}.editor-selector{display:flex;align-items:center;gap:12px;margin-bottom:12px}.editor-selector-label{font-size:13px}.error-details{box-sizing:border-box;max-width:100%;max-height:60vh;margin:0;padding:16px;overflow-y:auto;overflow-x:hidden;border-radius:6px;background:#0000000f;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.stack-link{cursor:pointer;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px}.stack-link:hover{background:#00000014}.stack-line{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word}\n"], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1$1.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i1$1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1$1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1$1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i3$2.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "disabledInteractive", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i3$2.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }] }); }
1860
+ }
1861
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonErrorDetailsDialogComponent, decorators: [{
1862
+ type: Component,
1863
+ args: [{ selector: 'taon-error-details-dialog', standalone: true, imports: [MatDialogModule, MatButtonModule, MatButtonToggleModule], template: "<h2 mat-dialog-title>Error details</h2>\n\n<mat-dialog-content>\n <div class=\"error-message\">\n {{ data.message }}\n </div>\n\n <div class=\"editor-selector\">\n <span class=\"editor-selector-label\"> I am using editor: </span>\n\n <mat-button-toggle-group\n [value]=\"editor\"\n (change)=\"setEditor($event.value)\"\n aria-label=\"Code editor\">\n <mat-button-toggle value=\"vscode\"> VS Code </mat-button-toggle>\n\n <mat-button-toggle value=\"vscodium\"> VSCodium </mat-button-toggle>\n </mat-button-toggle-group>\n </div>\n\n <pre\n class=\"error-details\"><code>@for (stackLine of stackLines; track $index) {\n@if (stackLine.file) {<a\n class=\"stack-link\"\n title=\"Open {{ stackLine.file }}:{{ stackLine.line }}:{{ stackLine.column }}\"\n (click)=\"openStackLine(stackLine)\">{{ stackLine.text }}</a>} @else {{{ stackLine.text }}}{{ '\\n' }}\n}</code></pre>\n</mat-dialog-content>\n\n<mat-dialog-actions align=\"end\">\n <button\n mat-button\n mat-dialog-close>\n Close\n </button>\n</mat-dialog-actions>\n", styles: [".error-message{margin-bottom:16px;font-weight:500}.editor-selector{display:flex;align-items:center;gap:12px;margin-bottom:12px}.editor-selector-label{font-size:13px}.error-details{box-sizing:border-box;max-width:100%;max-height:60vh;margin:0;padding:16px;overflow-y:auto;overflow-x:hidden;border-radius:6px;background:#0000000f;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px;line-height:1.5;white-space:pre-wrap;overflow-wrap:anywhere}.stack-link{cursor:pointer;text-decoration:underline;text-decoration-style:dotted;text-underline-offset:2px}.stack-link:hover{background:#00000014}.stack-line{white-space:pre-wrap;overflow-wrap:anywhere;word-break:break-word}\n"] }]
1864
+ }] });
1865
+
1866
+ class TaonErrorToastComponent {
1867
+ constructor() {
1868
+ this.toastRef = inject(HotToastRef);
1869
+ this.dialog = inject(MatDialog);
1870
+ this.data = this.toastRef.data;
1871
+ }
1872
+ showDetails() {
1873
+ this.dialog.open(TaonErrorDetailsDialogComponent, {
1874
+ width: '800px',
1875
+ maxWidth: '95vw',
1876
+ data: {
1877
+ message: this.data.title,
1878
+ details: this.data.details,
1879
+ },
1880
+ });
1881
+ this.toastRef.close();
1882
+ }
1883
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonErrorToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1884
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.9", type: TaonErrorToastComponent, isStandalone: true, selector: "taon-error-toast", ngImport: i0, template: `
1885
+ <div
1886
+ class="taon-error-toast"
1887
+ (click)="showDetails()">
1888
+ <div>{{ data.title }}</div>
1889
+
1890
+ <small> Click for details </small>
1891
+ </div>
1892
+ `, isInline: true, styles: [".taon-error-toast{cursor:pointer}small{display:block;margin-top:4px;opacity:.7}\n"] }); }
1893
+ }
1894
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonErrorToastComponent, decorators: [{
1895
+ type: Component,
1896
+ args: [{ selector: 'taon-error-toast', standalone: true, template: `
1897
+ <div
1898
+ class="taon-error-toast"
1899
+ (click)="showDetails()">
1900
+ <div>{{ data.title }}</div>
1901
+
1902
+ <small> Click for details </small>
1903
+ </div>
1904
+ `, styles: [".taon-error-toast{cursor:pointer}small{display:block;margin-top:4px;opacity:.7}\n"] }]
1905
+ }] });
1906
+
1907
+ //#region imports
1908
+ //#endregion
1909
+ class TaonBackofficeNotificationsService {
1910
+ constructor() {
1911
+ //#region injections
1912
+ this.toast = inject(HotToastService);
1913
+ }
1914
+ //#endregion
1915
+ //#region private methods
1916
+ normalize(input) {
1917
+ return typeof input === 'string' ? { title: input } : input;
1918
+ }
1919
+ //#endregion
1920
+ //#region notifications
1921
+ success(input) {
1922
+ const { title } = this.normalize(input);
1923
+ return this.toast.success(title);
1924
+ }
1925
+ error(input) {
1926
+ const { title, details } = this.normalize(input);
1927
+ // Normal error - exactly as before
1928
+ if (!details) {
1929
+ return this.toast.error(title);
1930
+ }
1931
+ // Error with clickable details
1932
+ return this.toast.error(TaonErrorToastComponent, {
1933
+ data: {
1934
+ title,
1935
+ details,
1936
+ },
1937
+ });
1938
+ }
1939
+ warn(input) {
1940
+ const { title } = this.normalize(input);
1941
+ return this.toast.warning(title);
1942
+ }
1943
+ info(input) {
1944
+ const { title } = this.normalize(input);
1945
+ return this.toast.info(title);
1946
+ }
1947
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonBackofficeNotificationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1948
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonBackofficeNotificationsService, providedIn: 'root' }); }
1949
+ }
1950
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonBackofficeNotificationsService, decorators: [{
1951
+ type: Injectable,
1952
+ args: [{
1953
+ providedIn: 'root',
1954
+ }]
1955
+ }] });
1956
+
1957
+ //#region imports
1958
+ //#endregion
1959
+ const t = Translation.for('src/lib/taon-backoffice-notifications/taon-backoffice-notifications.component.ts', { "src/lib/taon-backoffice-notifications/taon-backoffice-notifications.component.ts": { "en-US": async () => (await import('./ui-websql-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs')).default, "pl-PL": async () => (await import('./ui-websql-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs')).default } });
1960
+ class TaonBackofficeNotificationsComponent {
1961
+ //#endregion
1962
+ //#region constructor
1963
+ constructor() {
1964
+ //#region injections
1965
+ this.t = t.for(this);
1966
+ this.notification = inject(TaonBackofficeNotificationsService);
1967
+ this.destroyRef = inject(DestroyRef);
1968
+ this.taonAdminService = inject(TaonAdminService);
1969
+ Resource__NS__listenErrors
1970
+ .pipe(takeUntilDestroyed(this.destroyRef))
1971
+ .subscribe((error) => {
1972
+ if (___NS__isFunction(this.filter)) {
1973
+ error = this.filter(error);
1974
+ }
1975
+ const jsonMsg = error?.body?.json;
1976
+ if (!jsonMsg?.message) {
1977
+ console.log({ error });
1978
+ }
1979
+ const statusCode = jsonMsg.status ?? error.statusCode;
1980
+ const httpStatus = getHttpStatus(statusCode, jsonMsg.message);
1981
+ if (this.taonAdminService.shouldSkipShowingError(httpStatus)) {
1982
+ console.log(`[@taon-dev/sudo] Skipping notificaiton for message "${jsonMsg.message}" (code=${statusCode})`);
1983
+ }
1984
+ else {
1985
+ this.notification.error({
1986
+ title: jsonMsg?.message || t.gettext('Unknown error'),
1987
+ details: jsonMsg?.details,
1988
+ });
1989
+ }
1990
+ });
1991
+ }
1992
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonBackofficeNotificationsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1993
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.9", type: TaonBackofficeNotificationsComponent, isStandalone: true, selector: "taon-backoffice-notifications", inputs: { filter: "filter" }, ngImport: i0, template: "<!-- <p>\n notyfications works!\n</p> -->\n", styles: [":host{display:none}\n"] }); }
1994
+ }
1995
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonBackofficeNotificationsComponent, decorators: [{
1996
+ type: Component,
1997
+ args: [{ selector: 'taon-backoffice-notifications', standalone: true, template: "<!-- <p>\n notyfications works!\n</p> -->\n", styles: [":host{display:none}\n"] }]
1998
+ }], ctorParameters: () => [], propDecorators: { filter: [{
1999
+ type: Input
2000
+ }] } });
2001
+
2002
+ class TaonConfirmDialogComponent {
2003
+ constructor() {
2004
+ this.data = inject(MAT_DIALOG_DATA);
2005
+ this.dialogRef = inject((MatDialogRef));
2006
+ }
2007
+ cancel() {
2008
+ this.dialogRef.close(false);
2009
+ }
2010
+ confirm() {
2011
+ this.dialogRef.close(true);
2012
+ }
2013
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonConfirmDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2014
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: TaonConfirmDialogComponent, isStandalone: true, selector: "taon-confirm-dialog", ngImport: i0, template: "<div\n class=\"flex min-w-[320px] max-w-[560px] flex-col gap-6 p-6 text-gray-900 dark:text-gray-100 sm:p-7\">\n <!-- Header -->\n <h2 class=\"m-0 text-xl leading-snug font-medium sm:text-2xl\">\n {{ data.title }}\n </h2>\n\n <!-- Message -->\n @if (data.message) {\n <p\n class=\"m-0 whitespace-pre-line text-base leading-relaxed text-gray-600 dark:text-gray-300 sm:text-lg\">\n {{ data.message }}\n </p>\n }\n\n <!-- Actions -->\n <div class=\"flex flex-wrap items-center justify-end gap-3\">\n <button\n mat-button\n type=\"button\"\n (click)=\"cancel()\">\n {{ data.cancelText || 'Cancel' }}\n </button>\n\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"!rounded-full !px-6\"\n (click)=\"confirm()\">\n {{ data.confirmText || 'OK' }}\n </button>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }] }); }
2015
+ }
2016
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonConfirmDialogComponent, decorators: [{
2017
+ type: Component,
2018
+ args: [{ selector: 'taon-confirm-dialog', standalone: true, imports: [MatDialogModule, MatButtonModule], template: "<div\n class=\"flex min-w-[320px] max-w-[560px] flex-col gap-6 p-6 text-gray-900 dark:text-gray-100 sm:p-7\">\n <!-- Header -->\n <h2 class=\"m-0 text-xl leading-snug font-medium sm:text-2xl\">\n {{ data.title }}\n </h2>\n\n <!-- Message -->\n @if (data.message) {\n <p\n class=\"m-0 whitespace-pre-line text-base leading-relaxed text-gray-600 dark:text-gray-300 sm:text-lg\">\n {{ data.message }}\n </p>\n }\n\n <!-- Actions -->\n <div class=\"flex flex-wrap items-center justify-end gap-3\">\n <button\n mat-button\n type=\"button\"\n (click)=\"cancel()\">\n {{ data.cancelText || 'Cancel' }}\n </button>\n\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n class=\"!rounded-full !px-6\"\n (click)=\"confirm()\">\n {{ data.confirmText || 'OK' }}\n </button>\n </div>\n</div>\n" }]
2019
+ }] });
2020
+
2021
+ //namespace TaonConfirmDialogModels
2022
+ //end of namespace TaonConfirmDialogModels
2023
+
2024
+ //#region imports
2025
+ //#endregion
2026
+ const defaultColumns = [
2027
+ {
2028
+ header: 'ID',
2029
+ field: 'id',
2030
+ },
2031
+ {
2032
+ header: 'NAME',
2033
+ field: 'name',
2034
+ },
2035
+ ];
2036
+ class TaonDatatableComponent {
2037
+ constructor() {
2038
+ //#region fields & getters
2039
+ this.cdr = inject(ChangeDetectorRef);
2040
+ this.destroyRef = inject(DestroyRef);
2041
+ //#region inputs
2042
+ this.pageNumber = 1;
2043
+ this.pageSize = 10;
2044
+ this.pageSizeOptions = [5, 10, 20, 50, 100];
2045
+ this.allowedColumns = [];
2046
+ this.columns = defaultColumns;
2047
+ this.hideSearch = false;
2048
+ this.hideAddButton = false;
2049
+ this.safe = false;
2050
+ this.searchMode = 'advanced';
2051
+ //#endregion
2052
+ //#region outputs
2053
+ this.expansionChange = new EventEmitter();
2054
+ this.addingItem = new EventEmitter();
2055
+ //#endregion
2056
+ //#region fields
2057
+ this.rows = [];
2058
+ this.totalElements = 0;
2059
+ this.isLoading = false;
2060
+ this.expandable = false;
2061
+ this.advancedSearchOpened = false;
2062
+ this.searchValue = '';
2063
+ this.columnFilters = {};
2064
+ this.reload$ = new BehaviorSubject(undefined);
2065
+ this.searchChange$ = new Subject();
2066
+ this.data$ = this.reload$.pipe(switchMap(() => this.loadData()));
2067
+ this.expandedRows = new Set();
2068
+ }
2069
+ set data(value) {
2070
+ this._data = value ?? undefined;
2071
+ if (this._data) {
2072
+ this.pageNumber = 1;
2073
+ this.reload();
2074
+ }
2075
+ }
2076
+ get data() {
2077
+ return this._data;
2078
+ }
2079
+ get offlineMode() {
2080
+ return this.data !== undefined;
2081
+ }
2082
+ //#endregion
2083
+ //#region getters
2084
+ get entity() {
2085
+ return this.entityCrudController?.entityClassResolveFn();
2086
+ }
2087
+ get filterableColumns() {
2088
+ return this.columns.filter(column => Boolean(column.field));
2089
+ }
2090
+ //#endregion
2091
+ //#endregion
2092
+ //#region expansion
2093
+ onExpansionChange(event) {
2094
+ // console.log(event);
2095
+ // adapt this depending on exact MtxGrid event shape
2096
+ if (event.expanded) {
2097
+ this.expandedRows.add(event.data);
2098
+ }
2099
+ else {
2100
+ this.expandedRows.delete(event.data);
2101
+ }
2102
+ this.expansionChange.emit(event);
2103
+ }
2104
+ isExpanded(row) {
2105
+ return this.expandedRows.has(row);
2106
+ }
2107
+ //#endregion
2108
+ //#region hooks
2109
+ ngOnInit() {
2110
+ this.prepareColumns();
2111
+ // console.log({ columns: this.columns });
2112
+ this.expandable = Boolean(this.expansionTemplate);
2113
+ this.showPaginator = ___NS__isBoolean(this.showPaginator)
2114
+ ? this.showPaginator
2115
+ : Boolean(this.entity) || this.offlineMode;
2116
+ this.searchChange$
2117
+ .pipe(debounceTime(400), distinctUntilChanged(), tap(search => {
2118
+ this.searchValue = search;
2119
+ this.pageNumber = 1;
2120
+ this.reload();
2121
+ }), takeUntilDestroyed(this.destroyRef))
2122
+ .subscribe();
2123
+ this.data$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(rows => {
2124
+ this.rows = rows;
2125
+ this.cdr.markForCheck();
2126
+ });
2127
+ }
2128
+ //#endregion
2129
+ //#region search
2130
+ searchChanged(value) {
2131
+ this.searchChange$.next(value);
2132
+ }
2133
+ clearSearch() {
2134
+ this.searchValue = '';
2135
+ this.columnFilters = {};
2136
+ this.pageNumber = 1;
2137
+ this.reload();
2138
+ }
2139
+ applyAdvancedFilters() {
2140
+ this.pageNumber = 1;
2141
+ this.reload();
2142
+ }
2143
+ toggleAdvancedSearch() {
2144
+ this.advancedSearchOpened = !this.advancedSearchOpened;
2145
+ }
2146
+ //#endregion
2147
+ //#region pagination
2148
+ getNextPage(event) {
2149
+ this.pageNumber = event.pageIndex + 1;
2150
+ this.pageSize = event.pageSize;
2151
+ this.reload();
2152
+ }
2153
+ //#endregion
2154
+ //#region sorting
2155
+ sortChanged(event) {
2156
+ const field = event?.active ?? event?.field;
2157
+ const direction = event?.direction ?? '';
2158
+ this.sort = {
2159
+ field,
2160
+ direction,
2161
+ };
2162
+ this.pageNumber = 1;
2163
+ this.reload();
2164
+ }
2165
+ //#endregion
2166
+ //#region data
2167
+ reload() {
2168
+ this.reload$.next();
2169
+ }
2170
+ getFieldValue(row, field) {
2171
+ return field.split('.').reduce((value, key) => value?.[key], row);
2172
+ }
2173
+ loadOfflineData() {
2174
+ let rows = [...(this.data ?? [])];
2175
+ //#region global search
2176
+ const search = this.searchValue.trim().toLowerCase();
2177
+ if (search) {
2178
+ rows = rows.filter(row => this.columns.some(column => {
2179
+ if (!column.field) {
2180
+ return false;
2181
+ }
2182
+ const value = this.getFieldValue(row, String(column.field));
2183
+ return String(value ?? '')
2184
+ .toLowerCase()
2185
+ .includes(search);
2186
+ }));
2187
+ }
2188
+ //#endregion
2189
+ //#region column filters
2190
+ const filters = this.cleanFilters(this.columnFilters);
2191
+ for (const [field, filterValue] of Object.entries(filters)) {
2192
+ const normalizedFilter = filterValue.toLowerCase();
2193
+ rows = rows.filter(row => {
2194
+ const value = this.getFieldValue(row, field);
2195
+ return String(value ?? '')
2196
+ .toLowerCase()
2197
+ .includes(normalizedFilter);
2198
+ });
2199
+ }
2200
+ //#endregion
2201
+ //#region sorting
2202
+ if (this.sort?.field && this.sort.direction) {
2203
+ const field = String(this.sort.field);
2204
+ const direction = this.sort.direction === 'desc' ? -1 : 1;
2205
+ rows.sort((a, b) => {
2206
+ const aValue = this.getFieldValue(a, field);
2207
+ const bValue = this.getFieldValue(b, field);
2208
+ if (aValue === bValue) {
2209
+ return 0;
2210
+ }
2211
+ if (aValue === undefined || aValue === null) {
2212
+ return -1 * direction;
2213
+ }
2214
+ if (bValue === undefined || bValue === null) {
2215
+ return 1 * direction;
2216
+ }
2217
+ if (typeof aValue === 'number' && typeof bValue === 'number') {
2218
+ return (aValue - bValue) * direction;
2219
+ }
2220
+ return (String(aValue).localeCompare(String(bValue), undefined, {
2221
+ numeric: true,
2222
+ sensitivity: 'base',
2223
+ }) * direction);
2224
+ });
2225
+ }
2226
+ //#endregion
2227
+ //#region pagination
2228
+ this.totalElements = rows.length;
2229
+ const start = (this.pageNumber - 1) * this.pageSize;
2230
+ const end = start + this.pageSize;
2231
+ return this.prepareRows(rows.slice(start, end));
2232
+ //#endregion
2233
+ }
2234
+ loadData() {
2235
+ if (this.offlineMode) {
2236
+ return of(this.loadOfflineData());
2237
+ }
2238
+ if (!this.entity || !this.entityCrudController) {
2239
+ this.totalElements = 0;
2240
+ return of([]);
2241
+ }
2242
+ this.isLoading = true;
2243
+ this.cdr.markForCheck();
2244
+ const query = {
2245
+ pageNumber: this.pageNumber,
2246
+ pageSize: this.pageSize,
2247
+ search: this.searchValue,
2248
+ filters: this.cleanFilters(this.columnFilters),
2249
+ sort: this.sort,
2250
+ callQueryMethod: this.callQueryMethod,
2251
+ };
2252
+ //#region handle info when not allowed method on controller level
2253
+ if (!this.safe && !this.entityCrudController.paginationQuery(query)) {
2254
+ throw new Error(`Please enable paginationQuery() method in your
2255
+ controller ${ClassHelpers__NS__getName(this.entityCrudController)}
2256
+
2257
+ @Controller({ allowedMethods: ['paginationQuery'] })
2258
+ class ${ClassHelpers__NS__getName(this.entityCrudController)} ..
2259
+ `);
2260
+ }
2261
+ if (this.safe && !this.entityCrudController.paginationQuerySafe(query)) {
2262
+ throw new Error(`Please enable paginationQuerySafe() method in your controller
2263
+ ${ClassHelpers__NS__getName(this.entityCrudController)}
2264
+
2265
+ @Controller({ allowedMethods: ['paginationQuerySafe'] })
2266
+ class ${ClassHelpers__NS__getName(this.entityCrudController)} ..
2267
+ `);
2268
+ }
2269
+ //#endregion
2270
+ return from((this.safe
2271
+ ? this.entityCrudController.paginationQuerySafe
2272
+ : this.entityCrudController.paginationQuery)(query).request()
2273
+ .observable).pipe(tap(response => {
2274
+ this.totalElements =
2275
+ Number(response.headers.get(Symbols__NS__old__NS__X_TOTAL_COUNT)) || 0;
2276
+ }), map(response => this.prepareRows(response.body.json)), catchError(error => {
2277
+ console.error(`[taon-datatable] Unable to load data from ` +
2278
+ `${ClassHelpers__NS__getName(this.entityCrudController)} ${this.safe ? 'paginationQuerySafe' : 'paginationQuery'}`, error);
2279
+ return of([]);
2280
+ }), finalize(() => {
2281
+ this.isLoading = false;
2282
+ this.cdr.markForCheck();
2283
+ }));
2284
+ }
2285
+ //#endregion
2286
+ //#region helpers
2287
+ cleanFilters(filters) {
2288
+ return Object.fromEntries(Object.entries(filters)
2289
+ .filter(([, value]) => value !== undefined &&
2290
+ value !== null &&
2291
+ String(value).trim() !== '')
2292
+ .map(([key, value]) => [key, String(value).trim()]));
2293
+ }
2294
+ prepareRows(rows) {
2295
+ return rows.map(row => {
2296
+ // const result = {
2297
+ // ...row,
2298
+ // };
2299
+ // for (const key of Object.keys(result)) {
2300
+ // if (___NS__isObject(result[key])) {
2301
+ // result[key] = json5.stringify(result[key]);
2302
+ // }
2303
+ // }
2304
+ return row;
2305
+ });
2306
+ }
2307
+ prepareColumns() {
2308
+ const entityClass = this.entity;
2309
+ if (!entityClass) {
2310
+ return;
2311
+ }
2312
+ const usingDefaultColumns = ___NS__isEqual(this.columns, defaultColumns);
2313
+ if (!usingDefaultColumns) {
2314
+ return;
2315
+ }
2316
+ try {
2317
+ const props = Object.keys(getDefaultModel(entityClass) || {});
2318
+ let columns = props
2319
+ .filter(prop => this.allowedColumns.length > 0
2320
+ ? this.allowedColumns.includes(prop)
2321
+ : true)
2322
+ .map(prop => ({
2323
+ header: ___NS__upperCase(prop),
2324
+ field: prop,
2325
+ }));
2326
+ const extra = this.allowedColumns.filter(field => !props.includes(field));
2327
+ columns = [
2328
+ ...columns,
2329
+ ...extra.map(field => ({
2330
+ header: ___NS__upperCase(field),
2331
+ field,
2332
+ })),
2333
+ ];
2334
+ this.columns = columns;
2335
+ }
2336
+ catch (error) {
2337
+ console.error('[taon-datatable] Unable to generate columns', error);
2338
+ }
2339
+ }
2340
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonDatatableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2341
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: TaonDatatableComponent, isStandalone: true, selector: "taon-datatable", inputs: { pageNumber: "pageNumber", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions", allowedColumns: "allowedColumns", expansionTemplate: "expansionTemplate", entityCrudController: "entityCrudController", columns: "columns", hideSearch: "hideSearch", hideAddButton: "hideAddButton", safe: "safe", searchMode: "searchMode", callQueryMethod: "callQueryMethod", data: "data", showPaginator: "showPaginator" }, outputs: { expansionChange: "expansionChange", addingItem: "addingItem" }, ngImport: i0, template: "<div class=\"flex w-full flex-col gap-3\">\n <!-- #region toolbar -->\n @if (!hideSearch) {\n <div\n class=\"flex w-full flex-col gap-2 rounded-lg border border-gray-200 bg-white p-3 shadow-sm dark:border-gray-700 dark:bg-gray-900 md:flex-row md:items-center\">\n <!-- global search -->\n <mat-form-field\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n class=\"min-w-0 flex-1\">\n <mat-icon matPrefix> search </mat-icon>\n\n <input\n matInput\n placeholder=\"Search...\"\n [value]=\"searchValue\"\n (input)=\"searchChanged($any($event.target).value)\" />\n\n @if (searchValue) {\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"clearSearch()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n\n <!-- advanced search -->\n @if (searchMode === 'advanced') {\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleAdvancedSearch()\">\n <mat-icon> tune </mat-icon>\n\n Filters\n\n @if (advancedSearchOpened) {\n <mat-icon> expand_less </mat-icon>\n } @else {\n <mat-icon> expand_more </mat-icon>\n }\n </button>\n }\n\n <!-- refresh -->\n <button\n mat-icon-button\n type=\"button\"\n title=\"Refresh\"\n (click)=\"reload()\">\n <mat-icon> refresh </mat-icon>\n </button>\n\n <!-- add -->\n @if (!hideAddButton) {\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"addingItem.emit()\">\n <mat-icon> add </mat-icon>\n\n Add\n </button>\n }\n </div>\n }\n <!-- #endregion -->\n\n <!-- #region advanced filters -->\n @if (!hideSearch && searchMode === 'advanced' && advancedSearchOpened) {\n <div\n class=\"grid grid-cols-1 gap-3 rounded-lg border border-gray-200 bg-gray-50 p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n @for (column of filterableColumns; track column.field) {\n <mat-form-field\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n class=\"w-full\">\n <mat-label>\n {{ column.header }}\n </mat-label>\n\n <input\n matInput\n [(ngModel)]=\"columnFilters[$any(column.field)]\"\n (keyup.enter)=\"applyAdvancedFilters()\" />\n </mat-form-field>\n }\n\n <div\n class=\"flex items-center justify-end gap-2 md:col-span-2 lg:col-span-3 xl:col-span-4\">\n <button\n mat-button\n type=\"button\"\n (click)=\"clearSearch()\">\n <mat-icon> filter_alt_off </mat-icon>\n\n Clear\n </button>\n\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"applyAdvancedFilters()\">\n <mat-icon> filter_alt </mat-icon>\n\n Apply filters\n </button>\n </div>\n </div>\n }\n <!-- #endregion -->\n\n <!-- #region grid -->\n <div\n class=\"relative min-h-[250px] overflow-hidden rounded-lg border border-gray-200 bg-white shadow-sm dark:border-gray-700 dark:bg-gray-900\">\n @if (isLoading) {\n <div\n class=\"absolute inset-0 z-10 flex items-center justify-center bg-white/60 backdrop-blur-[1px] dark:bg-gray-900/60\">\n <div\n class=\"flex items-center gap-2 rounded-md bg-white px-4 py-2 shadow dark:bg-gray-800\">\n <mat-icon class=\"animate-spin\"> refresh </mat-icon>\n\n Loading...\n </div>\n </div>\n }\n\n <mtx-grid\n [data]=\"rows\"\n [columns]=\"columns\"\n [expandable]=\"expandable\"\n [expansionTemplate]=\"lazyExpansionTemplate\"\n [length]=\"totalElements\"\n [pageOnFront]=\"false\"\n [pageIndex]=\"pageNumber - 1\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showPaginator]=\"showPaginator\"\n (expansionChange)=\"onExpansionChange($event)\"\n (page)=\"getNextPage($event)\"\n (sortChange)=\"sortChanged($event)\">\n </mtx-grid>\n\n <ng-template\n #lazyExpansionTemplate\n let-row>\n @if (isExpanded(row)) {\n <ng-container\n [ngTemplateOutlet]=\"expansionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\">\n </ng-container>\n }\n </ng-template>\n </div>\n <!-- #endregion -->\n</div>\n", styles: [":host{display:block;width:100%;min-height:250px}:host ::ng-deep .mat-mdc-form-field{margin:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$2.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: i2$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4$1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4$1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4$1.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i4$1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "ngmodule", type: MtxGridModule }, { kind: "component", type: i7.MtxGrid, selector: "mtx-grid", inputs: ["displayedColumns", "columns", "data", "length", "loading", "trackBy", "columnResizable", "emptyValuePlaceholder", "pageOnFront", "showPaginator", "pageDisabled", "showFirstLastButtons", "pageIndex", "pageSize", "pageSizeOptions", "hidePageSize", "paginationTemplate", "sortOnFront", "sortActive", "sortDirection", "sortDisableClear", "sortDisabled", "sortStart", "rowHover", "rowStriped", "expandable", "expansionTemplate", "multiSelectable", "multiSelectionWithClick", "rowSelectable", "hideRowSelectionCheckbox", "disableRowClickSelection", "rowSelectionFormatter", "rowClassFormatter", "rowSelected", "cellSelectable", "showToolbar", "toolbarTitle", "toolbarTemplate", "columnHideable", "columnHideableChecked", "columnSortable", "columnPinnable", "columnPinOptions", "showColumnMenuButton", "columnMenuButtonText", "columnMenuButtonType", "columnMenuButtonColor", "columnMenuButtonClass", "columnMenuButtonIcon", "columnMenuButtonFontIcon", "columnMenuButtonSvgIcon", "showColumnMenuHeader", "columnMenuHeaderText", "columnMenuHeaderTemplate", "showColumnMenuFooter", "columnMenuFooterText", "columnMenuFooterTemplate", "noResultText", "noResultTemplate", "headerTemplate", "headerExtraTemplate", "cellTemplate", "useContentRowTemplate", "useContentHeaderRowTemplate", "useContentFooterRowTemplate", "showSummary", "summaryTemplate", "showSidebar", "sidebarTemplate", "showStatusbar", "statusbarTemplate"], outputs: ["page", "sortChange", "rowClick", "rowContextMenu", "expansionChange", "rowSelectedChange", "cellSelectedChange", "columnChange"], exportAs: ["mtxGrid"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2342
+ }
2343
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonDatatableComponent, decorators: [{
2344
+ type: Component,
2345
+ args: [{ selector: 'taon-datatable', standalone: true, imports: [
2346
+ CommonModule,
2347
+ FormsModule,
2348
+ ReactiveFormsModule,
2349
+ MatButtonModule,
2350
+ MatFormFieldModule,
2351
+ MatIconModule,
2352
+ MatInputModule,
2353
+ MatPaginatorModule,
2354
+ MatSelectModule,
2355
+ MtxGridModule,
2356
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex w-full flex-col gap-3\">\n <!-- #region toolbar -->\n @if (!hideSearch) {\n <div\n class=\"flex w-full flex-col gap-2 rounded-lg border border-gray-200 bg-white p-3 shadow-sm dark:border-gray-700 dark:bg-gray-900 md:flex-row md:items-center\">\n <!-- global search -->\n <mat-form-field\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n class=\"min-w-0 flex-1\">\n <mat-icon matPrefix> search </mat-icon>\n\n <input\n matInput\n placeholder=\"Search...\"\n [value]=\"searchValue\"\n (input)=\"searchChanged($any($event.target).value)\" />\n\n @if (searchValue) {\n <button\n mat-icon-button\n matSuffix\n type=\"button\"\n (click)=\"clearSearch()\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n\n <!-- advanced search -->\n @if (searchMode === 'advanced') {\n <button\n mat-stroked-button\n type=\"button\"\n (click)=\"toggleAdvancedSearch()\">\n <mat-icon> tune </mat-icon>\n\n Filters\n\n @if (advancedSearchOpened) {\n <mat-icon> expand_less </mat-icon>\n } @else {\n <mat-icon> expand_more </mat-icon>\n }\n </button>\n }\n\n <!-- refresh -->\n <button\n mat-icon-button\n type=\"button\"\n title=\"Refresh\"\n (click)=\"reload()\">\n <mat-icon> refresh </mat-icon>\n </button>\n\n <!-- add -->\n @if (!hideAddButton) {\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"addingItem.emit()\">\n <mat-icon> add </mat-icon>\n\n Add\n </button>\n }\n </div>\n }\n <!-- #endregion -->\n\n <!-- #region advanced filters -->\n @if (!hideSearch && searchMode === 'advanced' && advancedSearchOpened) {\n <div\n class=\"grid grid-cols-1 gap-3 rounded-lg border border-gray-200 bg-gray-50 p-4 shadow-sm dark:border-gray-700 dark:bg-gray-800 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n @for (column of filterableColumns; track column.field) {\n <mat-form-field\n appearance=\"outline\"\n subscriptSizing=\"dynamic\"\n class=\"w-full\">\n <mat-label>\n {{ column.header }}\n </mat-label>\n\n <input\n matInput\n [(ngModel)]=\"columnFilters[$any(column.field)]\"\n (keyup.enter)=\"applyAdvancedFilters()\" />\n </mat-form-field>\n }\n\n <div\n class=\"flex items-center justify-end gap-2 md:col-span-2 lg:col-span-3 xl:col-span-4\">\n <button\n mat-button\n type=\"button\"\n (click)=\"clearSearch()\">\n <mat-icon> filter_alt_off </mat-icon>\n\n Clear\n </button>\n\n <button\n mat-flat-button\n color=\"primary\"\n type=\"button\"\n (click)=\"applyAdvancedFilters()\">\n <mat-icon> filter_alt </mat-icon>\n\n Apply filters\n </button>\n </div>\n </div>\n }\n <!-- #endregion -->\n\n <!-- #region grid -->\n <div\n class=\"relative min-h-[250px] overflow-hidden rounded-lg border border-gray-200 bg-white shadow-sm dark:border-gray-700 dark:bg-gray-900\">\n @if (isLoading) {\n <div\n class=\"absolute inset-0 z-10 flex items-center justify-center bg-white/60 backdrop-blur-[1px] dark:bg-gray-900/60\">\n <div\n class=\"flex items-center gap-2 rounded-md bg-white px-4 py-2 shadow dark:bg-gray-800\">\n <mat-icon class=\"animate-spin\"> refresh </mat-icon>\n\n Loading...\n </div>\n </div>\n }\n\n <mtx-grid\n [data]=\"rows\"\n [columns]=\"columns\"\n [expandable]=\"expandable\"\n [expansionTemplate]=\"lazyExpansionTemplate\"\n [length]=\"totalElements\"\n [pageOnFront]=\"false\"\n [pageIndex]=\"pageNumber - 1\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showPaginator]=\"showPaginator\"\n (expansionChange)=\"onExpansionChange($event)\"\n (page)=\"getNextPage($event)\"\n (sortChange)=\"sortChanged($event)\">\n </mtx-grid>\n\n <ng-template\n #lazyExpansionTemplate\n let-row>\n @if (isExpanded(row)) {\n <ng-container\n [ngTemplateOutlet]=\"expansionTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\">\n </ng-container>\n }\n </ng-template>\n </div>\n <!-- #endregion -->\n</div>\n", styles: [":host{display:block;width:100%;min-height:250px}:host ::ng-deep .mat-mdc-form-field{margin:0}\n"] }]
2357
+ }], propDecorators: { pageNumber: [{
2358
+ type: Input
2359
+ }], pageSize: [{
2360
+ type: Input
2361
+ }], pageSizeOptions: [{
2362
+ type: Input
2363
+ }], allowedColumns: [{
2364
+ type: Input
2365
+ }], expansionTemplate: [{
2366
+ type: Input
2367
+ }], entityCrudController: [{
2368
+ type: Input
2369
+ }], columns: [{
2370
+ type: Input
2371
+ }], hideSearch: [{
2372
+ type: Input
2373
+ }], hideAddButton: [{
2374
+ type: Input
2375
+ }], safe: [{
2376
+ type: Input
2377
+ }], searchMode: [{
2378
+ type: Input
2379
+ }], callQueryMethod: [{
2380
+ type: Input
2381
+ }], data: [{
2382
+ type: Input
2383
+ }], expansionChange: [{
2384
+ type: Output
2385
+ }], addingItem: [{
2386
+ type: Output
2387
+ }], showPaginator: [{
2388
+ type: Input
2389
+ }] } });
2390
+
2391
+ var taonDatatable_component = /*#__PURE__*/Object.freeze({
2392
+ __proto__: null,
2393
+ TaonDatatableComponent: TaonDatatableComponent
2394
+ });
2395
+
2396
+ //namespace TaonDatatableModels
2397
+ //end of namespace TaonDatatableModels
2398
+
2399
+ //#endregion
2400
+ const TaonDatatableRoutes = [
2401
+ {
2402
+ path: '',
2403
+ loadComponent: () => Promise.resolve().then(function () { return taonDatatable_component; }).then(m => m.TaonDatatableComponent),
2404
+ children: [
2405
+ // adminLazyRoute({
2406
+ // path: 'dashboard',
2407
+ // menuItem: 'Dashboard',
2408
+ // icon: 'dashboard',
2409
+ // expandable: false,
2410
+ // loader: () =>
2411
+ // import('./anothermodule.routes').then(m => m.DashboardRoutes),
2412
+ // }),
2413
+ ],
2414
+ },
2415
+ ];
2416
+ /**
2417
+ * By default exporting TaonDatatableRoutes,
2418
+ * the command `taon generate:app:routes`
2419
+ * will automatically add them to the root routes in ./src/app.ts.
2420
+ */
2421
+ // export default TaonDatatableRoutes;
2422
+
1577
2423
  var TaonDraggableButtonPanelState;
1578
2424
  (function (TaonDraggableButtonPanelState) {
1579
2425
  TaonDraggableButtonPanelState["CLICKABLE_BUTTON"] = "CLICKABLE_BUTTON";
@@ -1584,6 +2430,8 @@ var TaonDraggableButtonPanelState;
1584
2430
  //namespace TaonDraggableButtonPanelModels
1585
2431
  //end of namespace TaonDraggableButtonPanelModels
1586
2432
 
2433
+ //#region imports
2434
+ //#endregion
1587
2435
  class TaonDraggableButtonPanelComponent {
1588
2436
  set state(state) {
1589
2437
  this.currentState.set(state);
@@ -1599,11 +2447,60 @@ class TaonDraggableButtonPanelComponent {
1599
2447
  */
1600
2448
  this.stateParamName = 'state';
1601
2449
  this.stateChange = new EventEmitter();
2450
+ this.forceFullScreen = signal(window.innerWidth < 900, ...(ngDevMode ? [{ debugName: "forceFullScreen" }] : []));
2451
+ this.resizeListener = () => {
2452
+ const wasForceFullScreen = this.forceFullScreen();
2453
+ const forceFullScreen = window.innerWidth < 900;
2454
+ this.forceFullScreen.set(forceFullScreen);
2455
+ // Desktop -> mobile: remove old CDK drag x/y transform.
2456
+ if (!wasForceFullScreen && forceFullScreen) {
2457
+ this.resetDragPosition();
2458
+ }
2459
+ };
1602
2460
  this.currentState = signal(TaonDraggableButtonPanelState.CLICKABLE_BUTTON, ...(ngDevMode ? [{ debugName: "currentState" }] : []));
1603
2461
  }
1604
2462
  async ngOnInit() {
2463
+ window.addEventListener('resize', this.resizeListener);
2464
+ /**
2465
+ * IMPORTANT:
2466
+ *
2467
+ * The component may be created while Angular is still processing
2468
+ * the application's initial navigation.
2469
+ *
2470
+ * For example:
2471
+ *
2472
+ * / -> redirectTo: /app
2473
+ *
2474
+ * If we create:
2475
+ *
2476
+ * (admin:main)
2477
+ *
2478
+ * before that redirect finishes, the auxiliary outlet navigation
2479
+ * may effectively replace/interfere with the primary navigation,
2480
+ * producing:
2481
+ *
2482
+ * /(admin:main)
2483
+ *
2484
+ * instead of:
2485
+ *
2486
+ * /app(admin:main)
2487
+ */
2488
+ await this.waitForInitialNavigation();
2489
+ /**
2490
+ * Ensure the auxiliary outlet exists only AFTER the primary
2491
+ * application route has settled.
2492
+ */
1605
2493
  await this.ensureOutletBasePath();
2494
+ /**
2495
+ * The outlet may already contain persisted state, e.g.
2496
+ *
2497
+ * (admin:main;state=WINDOW/dashboard)
2498
+ */
1606
2499
  this.restoreStateFromUrl();
2500
+ /**
2501
+ * From this point on keep the component state synchronized
2502
+ * with subsequent router navigations.
2503
+ */
1607
2504
  this.routerSubscription = this.router.events
1608
2505
  .pipe(filter(event => event instanceof NavigationEnd))
1609
2506
  .subscribe(() => {
@@ -1611,18 +2508,77 @@ class TaonDraggableButtonPanelComponent {
1611
2508
  });
1612
2509
  }
1613
2510
  ngOnDestroy() {
2511
+ window.removeEventListener('resize', this.resizeListener);
1614
2512
  this.routerSubscription?.unsubscribe();
1615
2513
  }
2514
+ toogleFullscreen(event) {
2515
+ event.stopImmediatePropagation();
2516
+ event.stopPropagation();
2517
+ event.preventDefault();
2518
+ if (this.forceFullScreen()) {
2519
+ return;
2520
+ }
2521
+ if (this.currentState() === TaonDraggableButtonPanelState.WINDOW) {
2522
+ this.resetDragPosition();
2523
+ void this.setState(TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED);
2524
+ }
2525
+ else if ([
2526
+ TaonDraggableButtonPanelState.FULL_SCREEN_DRAGGABLE,
2527
+ TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED,
2528
+ ].includes(this.currentState())) {
2529
+ this.resetDragPosition();
2530
+ void this.setState(TaonDraggableButtonPanelState.WINDOW);
2531
+ }
2532
+ }
2533
+ effectiveState() {
2534
+ if (this.forceFullScreen() &&
2535
+ this.currentState() !== TaonDraggableButtonPanelState.CLICKABLE_BUTTON) {
2536
+ return TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED;
2537
+ }
2538
+ return this.currentState();
2539
+ }
2540
+ // ===========================================================================
2541
+ // INITIAL ROUTING
2542
+ // ===========================================================================
2543
+ async waitForInitialNavigation() {
2544
+ /**
2545
+ * Router already completed at least one navigation.
2546
+ */
2547
+ if (this.router.navigated) {
2548
+ return;
2549
+ }
2550
+ /**
2551
+ * Wait until redirects/lazy routing/etc. belonging to the initial
2552
+ * navigation have settled.
2553
+ */
2554
+ await firstValueFrom(this.router.events.pipe(filter(event => event instanceof NavigationEnd), take(1)));
2555
+ }
1616
2556
  async ensureOutletBasePath() {
1617
2557
  if (!this.outlet || !this.basePath) {
1618
2558
  return;
1619
2559
  }
2560
+ /**
2561
+ * IMPORTANT:
2562
+ *
2563
+ * Parse the URL only AFTER initial navigation has completed.
2564
+ *
2565
+ * At this point:
2566
+ *
2567
+ * /
2568
+ *
2569
+ * may already have become:
2570
+ *
2571
+ * /app
2572
+ */
1620
2573
  const tree = this.router.parseUrl(this.router.url);
1621
2574
  /**
1622
- * Outlet already exists — don't touch it.
2575
+ * Outlet already exists — preserve it exactly as it is.
1623
2576
  *
1624
- * For example:
1625
- * (admin:main/session/providers)
2577
+ * Examples:
2578
+ *
2579
+ * /app(admin:main)
2580
+ *
2581
+ * /app(admin:main;state=WINDOW/dashboard)
1626
2582
  */
1627
2583
  if (tree.root.children[this.outlet]) {
1628
2584
  return;
@@ -1631,6 +2587,18 @@ class TaonDraggableButtonPanelComponent {
1631
2587
  if (!baseSegments.length) {
1632
2588
  return;
1633
2589
  }
2590
+ /**
2591
+ * Add the auxiliary outlet while preserving the current
2592
+ * primary route.
2593
+ *
2594
+ * Example:
2595
+ *
2596
+ * /app
2597
+ *
2598
+ * becomes:
2599
+ *
2600
+ * /app(admin:main)
2601
+ */
1634
2602
  await this.router.navigate([
1635
2603
  {
1636
2604
  outlets: {
@@ -1670,6 +2638,9 @@ class TaonDraggableButtonPanelComponent {
1670
2638
  void this.setState(TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED);
1671
2639
  }
1672
2640
  isDraggingEnabled() {
2641
+ if (this.forceFullScreen()) {
2642
+ return false;
2643
+ }
1673
2644
  return (this.currentState() === TaonDraggableButtonPanelState.WINDOW ||
1674
2645
  this.currentState() ===
1675
2646
  TaonDraggableButtonPanelState.FULL_SCREEN_DRAGGABLE);
@@ -1687,11 +2658,11 @@ class TaonDraggableButtonPanelComponent {
1687
2658
  return;
1688
2659
  }
1689
2660
  /**
1690
- * We store the panel state on the first segment:
2661
+ * State is stored on the first auxiliary outlet segment:
1691
2662
  *
1692
2663
  * admin:
1693
2664
  *
1694
- * main;state=WINDOW/session/providers
2665
+ * main;state=WINDOW/dashboard
1695
2666
  * └────────────────┘
1696
2667
  */
1697
2668
  const rootSegment = outletGroup.segments[0];
@@ -1703,15 +2674,14 @@ class TaonDraggableButtonPanelComponent {
1703
2674
  return;
1704
2675
  }
1705
2676
  /**
1706
- * URL restoration should NOT go through
1707
- * the transition state machine.
2677
+ * URL restoration should NOT go through the transition
2678
+ * state machine.
1708
2679
  *
1709
- * A bookmarked URL is authoritative.
2680
+ * A bookmarked/refreshed URL is authoritative.
1710
2681
  */
1711
2682
  this.currentState.set(state);
1712
2683
  /**
1713
- * Fullscreen must never inherit an old
1714
- * CdkDrag transform.
2684
+ * Fullscreen must never inherit an old CdkDrag transform.
1715
2685
  */
1716
2686
  if (state === TaonDraggableButtonPanelState.FULL_SCREEN_DRAGGABLE ||
1717
2687
  state === TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED) {
@@ -1729,15 +2699,15 @@ class TaonDraggableButtonPanelComponent {
1729
2699
  /**
1730
2700
  * The outlet might not yet exist.
1731
2701
  *
1732
- * In that case there is nowhere sensible
1733
- * to attach its matrix parameter.
2702
+ * In that case there is nowhere sensible to attach
2703
+ * its matrix parameter.
1734
2704
  */
1735
2705
  if (!outletGroup || outletGroup.segments.length === 0) {
1736
2706
  return;
1737
2707
  }
1738
2708
  const rootSegment = outletGroup.segments[0];
1739
2709
  /**
1740
- * Preserve any existing matrix params.
2710
+ * Preserve any existing matrix parameters.
1741
2711
  */
1742
2712
  rootSegment.parameters = {
1743
2713
  ...rootSegment.parameters,
@@ -1784,17 +2754,18 @@ class TaonDraggableButtonPanelComponent {
1784
2754
  return transitions[current].includes(next);
1785
2755
  }
1786
2756
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonDraggableButtonPanelComponent, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component }); }
1787
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: TaonDraggableButtonPanelComponent, isStandalone: true, selector: "taon-draggable-button-panel", inputs: { basePath: "basePath", buttonIcon: "buttonIcon", title: "title", outlet: "outlet", stateParamName: "stateParamName", state: "state" }, outputs: { stateChange: "stateChange" }, viewQueries: [{ propertyName: "drag", first: true, predicate: CdkDrag, descendants: true }], ngImport: i0, template: "@if (currentState() === State.CLICKABLE_BUTTON) {\n <!-- ============================================================ -->\n <!-- BUTTON -->\n <!-- ============================================================ -->\n\n <button\n mat-icon-button\n type=\"button\"\n [matTooltip]=\"title\"\n (click)=\"open()\">\n <mat-icon>\n {{ buttonIcon }}\n </mat-icon>\n </button>\n} @else {\n <!-- ============================================================ -->\n <!-- PANEL -->\n <!-- ============================================================ -->\n\n <section\n cdkDrag\n [cdkDragDisabled]=\"!isDraggingEnabled()\"\n class=\"taon-draggable-panel\"\n [class.taon-window]=\"currentState() === State.WINDOW\"\n [class.taon-fullscreen]=\"\n currentState() === State.FULL_SCREEN_DRAGGABLE ||\n currentState() === State.FULL_SCREEN_LOCKED\n \">\n <!-- ========================================================== -->\n <!-- WINDOW BAR / DRAG HANDLE -->\n <!-- ========================================================== -->\n\n <header\n cdkDragHandle\n class=\"taon-window-bar\">\n <div class=\"flex min-w-0 flex-1 items-center gap-2\">\n <mat-icon class=\"text-gray-500\"> admin_panel_settings </mat-icon>\n\n <span class=\"truncate font-medium\">\n {{ title }}\n </span>\n </div>\n\n <div class=\"flex shrink-0 items-center\">\n <!-- WINDOW MODE -->\n\n @if (currentState() !== State.WINDOW) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Window mode\"\n (click)=\"windowMode()\">\n <mat-icon> filter_none </mat-icon>\n </button>\n }\n\n <!-- FULLSCREEN -->\n\n @if (currentState() === State.WINDOW) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Full screen\"\n (click)=\"fullScreenDraggable()\">\n <mat-icon> fullscreen </mat-icon>\n </button>\n }\n\n <!-- LOCK -->\n\n @if (currentState() !== State.FULL_SCREEN_LOCKED) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Lock full screen\"\n (click)=\"lockFullScreen()\">\n <mat-icon> lock_open </mat-icon>\n </button>\n } @else {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Unlock\"\n (click)=\"fullScreenDraggable()\">\n <mat-icon> lock </mat-icon>\n </button>\n }\n\n <!-- RETURN TO BUTTON -->\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Close admin panel\"\n (click)=\"returnToButton()\">\n <mat-icon> close </mat-icon>\n </button>\n </div>\n </header>\n\n <!-- ========================================================== -->\n <!-- CONTENT -->\n <!-- ========================================================== -->\n\n <div class=\"min-h-0 flex-1 overflow-hidden\">\n <ng-content />\n </div>\n </section>\n}\n", styles: [":host{display:contents}.taon-draggable-panel{position:fixed;display:flex;flex-direction:column;min-width:320px;min-height:240px;overflow:hidden;background:#fff;border:1px solid #e5e7eb;box-shadow:0 20px 50px #00000026;z-index:1000}.taon-window{width:50vw;height:50vh;left:25vw;top:25vh;border-radius:6px}.taon-fullscreen{width:100vw;height:100dvh;left:0;top:0;border-radius:0}.taon-window-bar{height:48px;display:flex;align-items:center;flex-shrink:0;padding-left:12px;border-bottom:1px solid #e5e7eb;background:#fafafa;-webkit-user-select:none;user-select:none;cursor:move}\n"], dependencies: [{ kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i2$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2757
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.9", type: TaonDraggableButtonPanelComponent, isStandalone: true, selector: "taon-draggable-button-panel", inputs: { basePath: "basePath", buttonIcon: "buttonIcon", title: "title", outlet: "outlet", stateParamName: "stateParamName", state: "state" }, outputs: { stateChange: "stateChange" }, viewQueries: [{ propertyName: "drag", first: true, predicate: CdkDrag, descendants: true }], ngImport: i0, template: "@if (currentState() === State.CLICKABLE_BUTTON) {\n <!-- #region BUTTON - works on desktop AND mobile -->\n <button\n class=\"taon-admin-panel-toogle-open-button\"\n mat-icon-button\n type=\"button\"\n [matTooltip]=\"title\"\n (click)=\"open()\">\n <mat-icon>\n {{ buttonIcon }}\n </mat-icon>\n </button>\n <!-- #endregion -->\n} @else {\n <section\n cdkDrag\n [cdkDragDisabled]=\"!isDraggingEnabled()\"\n class=\"taon-draggable-panel\"\n [class.taon-window]=\"effectiveState() === State.WINDOW\"\n [class.taon-window-full]=\"effectiveState() !== State.WINDOW\"\n [class.taon-fullscreen]=\"\n effectiveState() === State.FULL_SCREEN_DRAGGABLE ||\n effectiveState() === State.FULL_SCREEN_LOCKED\n \">\n <header\n cdkDragHandle\n (dblclick)=\"toogleFullscreen($event)\"\n class=\"taon-window-bar\">\n <div class=\"flex min-w-0 flex-1 items-center gap-2\">\n <mat-icon class=\"text-gray-500\"> admin_panel_settings </mat-icon>\n\n <span class=\"truncate font-medium\">\n {{ title }}\n </span>\n </div>\n\n <!-- #region window buttons -->\n <div class=\"flex shrink-0 items-center\">\n <!-- Desktop-only window/fullscreen controls -->\n @if (!forceFullScreen()) {\n @if (currentState() !== State.WINDOW) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Window mode\"\n (click)=\"windowMode()\">\n <mat-icon>filter_none</mat-icon>\n </button>\n }\n\n @if (currentState() === State.WINDOW) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Full screen\"\n (click)=\"fullScreenDraggable()\">\n <mat-icon>fullscreen</mat-icon>\n </button>\n }\n\n @if (currentState() !== State.FULL_SCREEN_LOCKED) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Lock full screen\"\n (click)=\"lockFullScreen()\">\n <mat-icon>lock_open</mat-icon>\n </button>\n } @else {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Unlock\"\n (click)=\"fullScreenDraggable()\">\n <mat-icon>lock</mat-icon>\n </button>\n }\n }\n\n <!-- ALWAYS available -->\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Close admin panel\"\n (click)=\"returnToButton()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n <!-- #endregion -->\n </header>\n\n <div class=\"min-h-0 flex-1 overflow-hidden\">\n <ng-content />\n </div>\n </section>\n}\n", styles: [":host{display:contents}.taon-draggable-panel{position:fixed;display:flex;flex-direction:column;min-width:320px;min-height:240px;overflow:hidden;background:#fff;border:1px solid #e5e7eb;box-shadow:0 20px 50px #00000026;z-index:1000}.taon-window{width:70vw;height:70vh;left:15vw;top:25vh;border-radius:6px}.taon-fullscreen{width:100vw;height:100dvh;left:0;top:0;border-radius:0}.taon-window-bar{height:48px;display:flex;align-items:center;flex-shrink:0;padding-left:12px;border-bottom:1px solid #e5e7eb;background:#fafafa;-webkit-user-select:none;user-select:none;cursor:move}\n"], dependencies: [{ kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1788
2758
  }
1789
2759
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonDraggableButtonPanelComponent, decorators: [{
1790
2760
  type: Component,
1791
2761
  args: [{ selector: 'taon-draggable-button-panel', standalone: true, imports: [
1792
2762
  CdkDrag,
1793
2763
  CdkDragHandle,
2764
+ NgIf,
1794
2765
  MatButtonModule,
1795
2766
  MatIconModule,
1796
2767
  MatTooltipModule,
1797
- ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (currentState() === State.CLICKABLE_BUTTON) {\n <!-- ============================================================ -->\n <!-- BUTTON -->\n <!-- ============================================================ -->\n\n <button\n mat-icon-button\n type=\"button\"\n [matTooltip]=\"title\"\n (click)=\"open()\">\n <mat-icon>\n {{ buttonIcon }}\n </mat-icon>\n </button>\n} @else {\n <!-- ============================================================ -->\n <!-- PANEL -->\n <!-- ============================================================ -->\n\n <section\n cdkDrag\n [cdkDragDisabled]=\"!isDraggingEnabled()\"\n class=\"taon-draggable-panel\"\n [class.taon-window]=\"currentState() === State.WINDOW\"\n [class.taon-fullscreen]=\"\n currentState() === State.FULL_SCREEN_DRAGGABLE ||\n currentState() === State.FULL_SCREEN_LOCKED\n \">\n <!-- ========================================================== -->\n <!-- WINDOW BAR / DRAG HANDLE -->\n <!-- ========================================================== -->\n\n <header\n cdkDragHandle\n class=\"taon-window-bar\">\n <div class=\"flex min-w-0 flex-1 items-center gap-2\">\n <mat-icon class=\"text-gray-500\"> admin_panel_settings </mat-icon>\n\n <span class=\"truncate font-medium\">\n {{ title }}\n </span>\n </div>\n\n <div class=\"flex shrink-0 items-center\">\n <!-- WINDOW MODE -->\n\n @if (currentState() !== State.WINDOW) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Window mode\"\n (click)=\"windowMode()\">\n <mat-icon> filter_none </mat-icon>\n </button>\n }\n\n <!-- FULLSCREEN -->\n\n @if (currentState() === State.WINDOW) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Full screen\"\n (click)=\"fullScreenDraggable()\">\n <mat-icon> fullscreen </mat-icon>\n </button>\n }\n\n <!-- LOCK -->\n\n @if (currentState() !== State.FULL_SCREEN_LOCKED) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Lock full screen\"\n (click)=\"lockFullScreen()\">\n <mat-icon> lock_open </mat-icon>\n </button>\n } @else {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Unlock\"\n (click)=\"fullScreenDraggable()\">\n <mat-icon> lock </mat-icon>\n </button>\n }\n\n <!-- RETURN TO BUTTON -->\n\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Close admin panel\"\n (click)=\"returnToButton()\">\n <mat-icon> close </mat-icon>\n </button>\n </div>\n </header>\n\n <!-- ========================================================== -->\n <!-- CONTENT -->\n <!-- ========================================================== -->\n\n <div class=\"min-h-0 flex-1 overflow-hidden\">\n <ng-content />\n </div>\n </section>\n}\n", styles: [":host{display:contents}.taon-draggable-panel{position:fixed;display:flex;flex-direction:column;min-width:320px;min-height:240px;overflow:hidden;background:#fff;border:1px solid #e5e7eb;box-shadow:0 20px 50px #00000026;z-index:1000}.taon-window{width:50vw;height:50vh;left:25vw;top:25vh;border-radius:6px}.taon-fullscreen{width:100vw;height:100dvh;left:0;top:0;border-radius:0}.taon-window-bar{height:48px;display:flex;align-items:center;flex-shrink:0;padding-left:12px;border-bottom:1px solid #e5e7eb;background:#fafafa;-webkit-user-select:none;user-select:none;cursor:move}\n"] }]
2768
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (currentState() === State.CLICKABLE_BUTTON) {\n <!-- #region BUTTON - works on desktop AND mobile -->\n <button\n class=\"taon-admin-panel-toogle-open-button\"\n mat-icon-button\n type=\"button\"\n [matTooltip]=\"title\"\n (click)=\"open()\">\n <mat-icon>\n {{ buttonIcon }}\n </mat-icon>\n </button>\n <!-- #endregion -->\n} @else {\n <section\n cdkDrag\n [cdkDragDisabled]=\"!isDraggingEnabled()\"\n class=\"taon-draggable-panel\"\n [class.taon-window]=\"effectiveState() === State.WINDOW\"\n [class.taon-window-full]=\"effectiveState() !== State.WINDOW\"\n [class.taon-fullscreen]=\"\n effectiveState() === State.FULL_SCREEN_DRAGGABLE ||\n effectiveState() === State.FULL_SCREEN_LOCKED\n \">\n <header\n cdkDragHandle\n (dblclick)=\"toogleFullscreen($event)\"\n class=\"taon-window-bar\">\n <div class=\"flex min-w-0 flex-1 items-center gap-2\">\n <mat-icon class=\"text-gray-500\"> admin_panel_settings </mat-icon>\n\n <span class=\"truncate font-medium\">\n {{ title }}\n </span>\n </div>\n\n <!-- #region window buttons -->\n <div class=\"flex shrink-0 items-center\">\n <!-- Desktop-only window/fullscreen controls -->\n @if (!forceFullScreen()) {\n @if (currentState() !== State.WINDOW) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Window mode\"\n (click)=\"windowMode()\">\n <mat-icon>filter_none</mat-icon>\n </button>\n }\n\n @if (currentState() === State.WINDOW) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Full screen\"\n (click)=\"fullScreenDraggable()\">\n <mat-icon>fullscreen</mat-icon>\n </button>\n }\n\n @if (currentState() !== State.FULL_SCREEN_LOCKED) {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Lock full screen\"\n (click)=\"lockFullScreen()\">\n <mat-icon>lock_open</mat-icon>\n </button>\n } @else {\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Unlock\"\n (click)=\"fullScreenDraggable()\">\n <mat-icon>lock</mat-icon>\n </button>\n }\n }\n\n <!-- ALWAYS available -->\n <button\n mat-icon-button\n type=\"button\"\n matTooltip=\"Close admin panel\"\n (click)=\"returnToButton()\">\n <mat-icon>close</mat-icon>\n </button>\n </div>\n <!-- #endregion -->\n </header>\n\n <div class=\"min-h-0 flex-1 overflow-hidden\">\n <ng-content />\n </div>\n </section>\n}\n", styles: [":host{display:contents}.taon-draggable-panel{position:fixed;display:flex;flex-direction:column;min-width:320px;min-height:240px;overflow:hidden;background:#fff;border:1px solid #e5e7eb;box-shadow:0 20px 50px #00000026;z-index:1000}.taon-window{width:70vw;height:70vh;left:15vw;top:25vh;border-radius:6px}.taon-fullscreen{width:100vw;height:100dvh;left:0;top:0;border-radius:0}.taon-window-bar{height:48px;display:flex;align-items:center;flex-shrink:0;padding-left:12px;border-bottom:1px solid #e5e7eb;background:#fafafa;-webkit-user-select:none;user-select:none;cursor:move}\n"] }]
1798
2769
  }], ctorParameters: () => [{ type: i1.Router }], propDecorators: { drag: [{
1799
2770
  type: ViewChild,
1800
2771
  args: [CdkDrag]
@@ -1827,6 +2798,9 @@ const TaonDraggableButtonPanelRoutes = [
1827
2798
  // },
1828
2799
  ];
1829
2800
 
2801
+ ;
2802
+ // THIS FILE IS GENERATED - DO NOT MODIFY
2803
+
1830
2804
  // @ts-nocheck
1831
2805
  // This file is auto-generated during init process. Do not modify.
1832
2806
  // This disable this auto generate file.
@@ -1840,5 +2814,5 @@ var index = {};
1840
2814
  * Generated bundle index. Do not edit.
1841
2815
  */
1842
2816
 
1843
- export { APP_ID, BUILD_BASE_HREF, BUILD_FRAMEWORK_CLI_NAME, CURRENT_PACKAGE_TAON_VERSION, CURRENT_PACKAGE_VERSION, ENV_ANGULAR_NODE_APP_BUILD_BASE_HREF, ENV_ANGULAR_NODE_APP_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_ANGULAR_NODE_APP_BUILD_GEN_ONLY_CLIENT_CODE, ENV_ANGULAR_NODE_APP_BUILD_OVERRIDE_OUTPUT_PATH, ENV_ANGULAR_NODE_APP_BUILD_PROD, ENV_ANGULAR_NODE_APP_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_ANGULAR_NODE_APP_BUILD_PWA_NAME, ENV_ANGULAR_NODE_APP_BUILD_PWA_SHORT_NAME, ENV_ANGULAR_NODE_APP_BUILD_PWA_START_URL, ENV_ANGULAR_NODE_APP_BUILD_SSR, ENV_ANGULAR_NODE_APP_BUILD_WATCH, ENV_ANGULAR_NODE_APP_BUILD_WEBSQL, ENV_ANGULAR_NODE_APP_CONTAINER_END, ENV_ANGULAR_NODE_APP_CONTAINER_ONLY, ENV_ANGULAR_NODE_APP_CONTAINER_SKIP, ENV_ANGULAR_NODE_APP_CONTAINER_SKIP_RELEASED, ENV_ANGULAR_NODE_APP_CONTAINER_START, ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_SKIP, ENV_ANGULAR_NODE_APP_DOCKER_ADDITIONAL_CONTAINER, ENV_ANGULAR_NODE_APP_DOCKER_SKIP_START_IN_ORDER, ENV_ANGULAR_NODE_APP_DOCKER_SKIP_USING_MYSQL_DB, ENV_ANGULAR_NODE_APP_FINISH_CALLBACK, ENV_ANGULAR_NODE_APP_INIT_BRANDING, ENV_ANGULAR_NODE_APP_INIT_STRUCT, ENV_ANGULAR_NODE_APP_IS_CI_PROCESS, ENV_ANGULAR_NODE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_ANGULAR_NODE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_ANGULAR_NODE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_ANGULAR_NODE_APP_PURPOSE, ENV_ANGULAR_NODE_APP_RECURSIVE_ACTION, ENV_ANGULAR_NODE_APP_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_ANGULAR_NODE_APP_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_ANGULAR_NODE_APP_RELEASE_CLI_COMPRESS, ENV_ANGULAR_NODE_APP_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_ANGULAR_NODE_APP_RELEASE_CLI_MINIFY, ENV_ANGULAR_NODE_APP_RELEASE_CLI_OBSCURE, ENV_ANGULAR_NODE_APP_RELEASE_CLI_UGLIFY, ENV_ANGULAR_NODE_APP_RELEASE_ENV_NAME, ENV_ANGULAR_NODE_APP_RELEASE_ENV_NUMBER, ENV_ANGULAR_NODE_APP_RELEASE_INSTALL_LOCALLY, ENV_ANGULAR_NODE_APP_RELEASE_LIB_COMPRESS, ENV_ANGULAR_NODE_APP_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_ANGULAR_NODE_APP_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_ANGULAR_NODE_APP_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_ANGULAR_NODE_APP_RELEASE_LIB_REMOVE_DTS, ENV_ANGULAR_NODE_APP_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_ANGULAR_NODE_APP_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_ANGULAR_NODE_APP_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_ANGULAR_NODE_APP_RELEASE_RELEASE_TYPE, ENV_ANGULAR_NODE_APP_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_ANGULAR_NODE_APP_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_ANGULAR_NODE_APP_RELEASE_RESOLVED_NEW_VERSION, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_CODE_CUTTING, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_DEPLOY, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_NPM_PUBLISH, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_RELEASE_QUESTION, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_TAG_GIT_PUSH, ENV_ANGULAR_NODE_APP_RELEASE_TAON_INSTANCE_IP, ENV_ANGULAR_NODE_APP_RELEASE_TARGET_ARTIFACT, ENV_ANGULAR_NODE_APP_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_ANGULAR_NODE_APP_WEBSITE_DOMAIN, ENV_ANGULAR_NODE_APP_WEBSITE_TITLE, ENV_ANGULAR_NODE_APP_WEBSITE_USE_DOMAIN, ENV_DOCS_WEBAPP_BUILD_BASE_HREF, ENV_DOCS_WEBAPP_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_DOCS_WEBAPP_BUILD_GEN_ONLY_CLIENT_CODE, ENV_DOCS_WEBAPP_BUILD_OVERRIDE_OUTPUT_PATH, ENV_DOCS_WEBAPP_BUILD_PROD, ENV_DOCS_WEBAPP_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_DOCS_WEBAPP_BUILD_PWA_NAME, ENV_DOCS_WEBAPP_BUILD_PWA_SHORT_NAME, ENV_DOCS_WEBAPP_BUILD_PWA_START_URL, ENV_DOCS_WEBAPP_BUILD_SSR, ENV_DOCS_WEBAPP_BUILD_WATCH, ENV_DOCS_WEBAPP_BUILD_WEBSQL, ENV_DOCS_WEBAPP_CONTAINER_END, ENV_DOCS_WEBAPP_CONTAINER_ONLY, ENV_DOCS_WEBAPP_CONTAINER_SKIP, ENV_DOCS_WEBAPP_CONTAINER_SKIP_RELEASED, ENV_DOCS_WEBAPP_CONTAINER_START, ENV_DOCS_WEBAPP_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_DOCS_WEBAPP_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_DOCS_WEBAPP_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_DOCS_WEBAPP_COPY_TO_MANAGER_SKIP, ENV_DOCS_WEBAPP_DOCKER_ADDITIONAL_CONTAINER, ENV_DOCS_WEBAPP_DOCKER_SKIP_START_IN_ORDER, ENV_DOCS_WEBAPP_DOCKER_SKIP_USING_MYSQL_DB, ENV_DOCS_WEBAPP_FINISH_CALLBACK, ENV_DOCS_WEBAPP_INIT_BRANDING, ENV_DOCS_WEBAPP_INIT_STRUCT, ENV_DOCS_WEBAPP_IS_CI_PROCESS, ENV_DOCS_WEBAPP_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_DOCS_WEBAPP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_DOCS_WEBAPP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_DOCS_WEBAPP_PURPOSE, ENV_DOCS_WEBAPP_RECURSIVE_ACTION, ENV_DOCS_WEBAPP_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_DOCS_WEBAPP_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_DOCS_WEBAPP_RELEASE_CLI_COMPRESS, ENV_DOCS_WEBAPP_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_DOCS_WEBAPP_RELEASE_CLI_MINIFY, ENV_DOCS_WEBAPP_RELEASE_CLI_OBSCURE, ENV_DOCS_WEBAPP_RELEASE_CLI_UGLIFY, ENV_DOCS_WEBAPP_RELEASE_ENV_NAME, ENV_DOCS_WEBAPP_RELEASE_ENV_NUMBER, ENV_DOCS_WEBAPP_RELEASE_INSTALL_LOCALLY, ENV_DOCS_WEBAPP_RELEASE_LIB_COMPRESS, ENV_DOCS_WEBAPP_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_DOCS_WEBAPP_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_DOCS_WEBAPP_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_DOCS_WEBAPP_RELEASE_LIB_REMOVE_DTS, ENV_DOCS_WEBAPP_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_DOCS_WEBAPP_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_DOCS_WEBAPP_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_DOCS_WEBAPP_RELEASE_RELEASE_TYPE, ENV_DOCS_WEBAPP_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_DOCS_WEBAPP_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_DOCS_WEBAPP_RELEASE_RESOLVED_NEW_VERSION, ENV_DOCS_WEBAPP_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_DOCS_WEBAPP_RELEASE_SKIP_CODE_CUTTING, ENV_DOCS_WEBAPP_RELEASE_SKIP_DEPLOY, ENV_DOCS_WEBAPP_RELEASE_SKIP_NPM_PUBLISH, ENV_DOCS_WEBAPP_RELEASE_SKIP_RELEASE_QUESTION, ENV_DOCS_WEBAPP_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_DOCS_WEBAPP_RELEASE_SKIP_TAG_GIT_PUSH, ENV_DOCS_WEBAPP_RELEASE_TAON_INSTANCE_IP, ENV_DOCS_WEBAPP_RELEASE_TARGET_ARTIFACT, ENV_DOCS_WEBAPP_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_DOCS_WEBAPP_WEBSITE_DOMAIN, ENV_DOCS_WEBAPP_WEBSITE_TITLE, ENV_DOCS_WEBAPP_WEBSITE_USE_DOMAIN, ENV_ELECTRON_APP_BUILD_BASE_HREF, ENV_ELECTRON_APP_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_ELECTRON_APP_BUILD_GEN_ONLY_CLIENT_CODE, ENV_ELECTRON_APP_BUILD_OVERRIDE_OUTPUT_PATH, ENV_ELECTRON_APP_BUILD_PROD, ENV_ELECTRON_APP_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_ELECTRON_APP_BUILD_PWA_NAME, ENV_ELECTRON_APP_BUILD_PWA_SHORT_NAME, ENV_ELECTRON_APP_BUILD_PWA_START_URL, ENV_ELECTRON_APP_BUILD_SSR, ENV_ELECTRON_APP_BUILD_WATCH, ENV_ELECTRON_APP_BUILD_WEBSQL, ENV_ELECTRON_APP_CONTAINER_END, ENV_ELECTRON_APP_CONTAINER_ONLY, ENV_ELECTRON_APP_CONTAINER_SKIP, ENV_ELECTRON_APP_CONTAINER_SKIP_RELEASED, ENV_ELECTRON_APP_CONTAINER_START, ENV_ELECTRON_APP_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_ELECTRON_APP_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_ELECTRON_APP_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_ELECTRON_APP_COPY_TO_MANAGER_SKIP, ENV_ELECTRON_APP_DOCKER_ADDITIONAL_CONTAINER, ENV_ELECTRON_APP_DOCKER_SKIP_START_IN_ORDER, ENV_ELECTRON_APP_DOCKER_SKIP_USING_MYSQL_DB, ENV_ELECTRON_APP_FINISH_CALLBACK, ENV_ELECTRON_APP_INIT_BRANDING, ENV_ELECTRON_APP_INIT_STRUCT, ENV_ELECTRON_APP_IS_CI_PROCESS, ENV_ELECTRON_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_ELECTRON_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_ELECTRON_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_ELECTRON_APP_PURPOSE, ENV_ELECTRON_APP_RECURSIVE_ACTION, ENV_ELECTRON_APP_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_ELECTRON_APP_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_ELECTRON_APP_RELEASE_CLI_COMPRESS, ENV_ELECTRON_APP_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_ELECTRON_APP_RELEASE_CLI_MINIFY, ENV_ELECTRON_APP_RELEASE_CLI_OBSCURE, ENV_ELECTRON_APP_RELEASE_CLI_UGLIFY, ENV_ELECTRON_APP_RELEASE_ENV_NAME, ENV_ELECTRON_APP_RELEASE_ENV_NUMBER, ENV_ELECTRON_APP_RELEASE_INSTALL_LOCALLY, ENV_ELECTRON_APP_RELEASE_LIB_COMPRESS, ENV_ELECTRON_APP_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_ELECTRON_APP_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_ELECTRON_APP_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_ELECTRON_APP_RELEASE_LIB_REMOVE_DTS, ENV_ELECTRON_APP_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_ELECTRON_APP_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_ELECTRON_APP_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_ELECTRON_APP_RELEASE_RELEASE_TYPE, ENV_ELECTRON_APP_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_ELECTRON_APP_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_ELECTRON_APP_RELEASE_RESOLVED_NEW_VERSION, ENV_ELECTRON_APP_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_ELECTRON_APP_RELEASE_SKIP_CODE_CUTTING, ENV_ELECTRON_APP_RELEASE_SKIP_DEPLOY, ENV_ELECTRON_APP_RELEASE_SKIP_NPM_PUBLISH, ENV_ELECTRON_APP_RELEASE_SKIP_RELEASE_QUESTION, ENV_ELECTRON_APP_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_ELECTRON_APP_RELEASE_SKIP_TAG_GIT_PUSH, ENV_ELECTRON_APP_RELEASE_TAON_INSTANCE_IP, ENV_ELECTRON_APP_RELEASE_TARGET_ARTIFACT, ENV_ELECTRON_APP_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_ELECTRON_APP_WEBSITE_DOMAIN, ENV_ELECTRON_APP_WEBSITE_TITLE, ENV_ELECTRON_APP_WEBSITE_USE_DOMAIN, ENV_MOBILE_APP_BUILD_BASE_HREF, ENV_MOBILE_APP_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_MOBILE_APP_BUILD_GEN_ONLY_CLIENT_CODE, ENV_MOBILE_APP_BUILD_OVERRIDE_OUTPUT_PATH, ENV_MOBILE_APP_BUILD_PROD, ENV_MOBILE_APP_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_MOBILE_APP_BUILD_PWA_NAME, ENV_MOBILE_APP_BUILD_PWA_SHORT_NAME, ENV_MOBILE_APP_BUILD_PWA_START_URL, ENV_MOBILE_APP_BUILD_SSR, ENV_MOBILE_APP_BUILD_WATCH, ENV_MOBILE_APP_BUILD_WEBSQL, ENV_MOBILE_APP_CONTAINER_END, ENV_MOBILE_APP_CONTAINER_ONLY, ENV_MOBILE_APP_CONTAINER_SKIP, ENV_MOBILE_APP_CONTAINER_SKIP_RELEASED, ENV_MOBILE_APP_CONTAINER_START, ENV_MOBILE_APP_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_MOBILE_APP_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_MOBILE_APP_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_MOBILE_APP_COPY_TO_MANAGER_SKIP, ENV_MOBILE_APP_DOCKER_ADDITIONAL_CONTAINER, ENV_MOBILE_APP_DOCKER_SKIP_START_IN_ORDER, ENV_MOBILE_APP_DOCKER_SKIP_USING_MYSQL_DB, ENV_MOBILE_APP_FINISH_CALLBACK, ENV_MOBILE_APP_INIT_BRANDING, ENV_MOBILE_APP_INIT_STRUCT, ENV_MOBILE_APP_IS_CI_PROCESS, ENV_MOBILE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_MOBILE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_MOBILE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_MOBILE_APP_PURPOSE, ENV_MOBILE_APP_RECURSIVE_ACTION, ENV_MOBILE_APP_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_MOBILE_APP_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_MOBILE_APP_RELEASE_CLI_COMPRESS, ENV_MOBILE_APP_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_MOBILE_APP_RELEASE_CLI_MINIFY, ENV_MOBILE_APP_RELEASE_CLI_OBSCURE, ENV_MOBILE_APP_RELEASE_CLI_UGLIFY, ENV_MOBILE_APP_RELEASE_ENV_NAME, ENV_MOBILE_APP_RELEASE_ENV_NUMBER, ENV_MOBILE_APP_RELEASE_INSTALL_LOCALLY, ENV_MOBILE_APP_RELEASE_LIB_COMPRESS, ENV_MOBILE_APP_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_MOBILE_APP_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_MOBILE_APP_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_MOBILE_APP_RELEASE_LIB_REMOVE_DTS, ENV_MOBILE_APP_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_MOBILE_APP_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_MOBILE_APP_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_MOBILE_APP_RELEASE_RELEASE_TYPE, ENV_MOBILE_APP_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_MOBILE_APP_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_MOBILE_APP_RELEASE_RESOLVED_NEW_VERSION, ENV_MOBILE_APP_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_MOBILE_APP_RELEASE_SKIP_CODE_CUTTING, ENV_MOBILE_APP_RELEASE_SKIP_DEPLOY, ENV_MOBILE_APP_RELEASE_SKIP_NPM_PUBLISH, ENV_MOBILE_APP_RELEASE_SKIP_RELEASE_QUESTION, ENV_MOBILE_APP_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_MOBILE_APP_RELEASE_SKIP_TAG_GIT_PUSH, ENV_MOBILE_APP_RELEASE_TAON_INSTANCE_IP, ENV_MOBILE_APP_RELEASE_TARGET_ARTIFACT, ENV_MOBILE_APP_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_MOBILE_APP_WEBSITE_DOMAIN, ENV_MOBILE_APP_WEBSITE_TITLE, ENV_MOBILE_APP_WEBSITE_USE_DOMAIN, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_BASE_HREF, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_GEN_ONLY_CLIENT_CODE, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_OVERRIDE_OUTPUT_PATH, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_PROD, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_PWA_NAME, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_PWA_SHORT_NAME, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_PWA_START_URL, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_SSR, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_WATCH, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_WEBSQL, ENV_NPM_LIB_AND_CLI_TOOL_CONTAINER_END, ENV_NPM_LIB_AND_CLI_TOOL_CONTAINER_ONLY, ENV_NPM_LIB_AND_CLI_TOOL_CONTAINER_SKIP, ENV_NPM_LIB_AND_CLI_TOOL_CONTAINER_SKIP_RELEASED, ENV_NPM_LIB_AND_CLI_TOOL_CONTAINER_START, ENV_NPM_LIB_AND_CLI_TOOL_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_NPM_LIB_AND_CLI_TOOL_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_NPM_LIB_AND_CLI_TOOL_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_NPM_LIB_AND_CLI_TOOL_COPY_TO_MANAGER_SKIP, ENV_NPM_LIB_AND_CLI_TOOL_DOCKER_ADDITIONAL_CONTAINER, ENV_NPM_LIB_AND_CLI_TOOL_DOCKER_SKIP_START_IN_ORDER, ENV_NPM_LIB_AND_CLI_TOOL_DOCKER_SKIP_USING_MYSQL_DB, ENV_NPM_LIB_AND_CLI_TOOL_FINISH_CALLBACK, ENV_NPM_LIB_AND_CLI_TOOL_INIT_BRANDING, ENV_NPM_LIB_AND_CLI_TOOL_INIT_STRUCT, ENV_NPM_LIB_AND_CLI_TOOL_IS_CI_PROCESS, ENV_NPM_LIB_AND_CLI_TOOL_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_NPM_LIB_AND_CLI_TOOL_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_NPM_LIB_AND_CLI_TOOL_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_NPM_LIB_AND_CLI_TOOL_PURPOSE, ENV_NPM_LIB_AND_CLI_TOOL_RECURSIVE_ACTION, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_CLI_COMPRESS, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_CLI_MINIFY, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_CLI_OBSCURE, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_CLI_UGLIFY, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_ENV_NAME, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_ENV_NUMBER, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_INSTALL_LOCALLY, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_COMPRESS, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_REMOVE_DTS, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_RELEASE_TYPE, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_RESOLVED_NEW_VERSION, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_CODE_CUTTING, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_DEPLOY, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_NPM_PUBLISH, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_RELEASE_QUESTION, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_TAG_GIT_PUSH, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_TAON_INSTANCE_IP, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_TARGET_ARTIFACT, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_NPM_LIB_AND_CLI_TOOL_WEBSITE_DOMAIN, ENV_NPM_LIB_AND_CLI_TOOL_WEBSITE_TITLE, ENV_NPM_LIB_AND_CLI_TOOL_WEBSITE_USE_DOMAIN, ENV_VSCODE_PLUGIN_BUILD_BASE_HREF, ENV_VSCODE_PLUGIN_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_VSCODE_PLUGIN_BUILD_GEN_ONLY_CLIENT_CODE, ENV_VSCODE_PLUGIN_BUILD_OVERRIDE_OUTPUT_PATH, ENV_VSCODE_PLUGIN_BUILD_PROD, ENV_VSCODE_PLUGIN_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_VSCODE_PLUGIN_BUILD_PWA_NAME, ENV_VSCODE_PLUGIN_BUILD_PWA_SHORT_NAME, ENV_VSCODE_PLUGIN_BUILD_PWA_START_URL, ENV_VSCODE_PLUGIN_BUILD_SSR, ENV_VSCODE_PLUGIN_BUILD_WATCH, ENV_VSCODE_PLUGIN_BUILD_WEBSQL, ENV_VSCODE_PLUGIN_CONTAINER_END, ENV_VSCODE_PLUGIN_CONTAINER_ONLY, ENV_VSCODE_PLUGIN_CONTAINER_SKIP, ENV_VSCODE_PLUGIN_CONTAINER_SKIP_RELEASED, ENV_VSCODE_PLUGIN_CONTAINER_START, ENV_VSCODE_PLUGIN_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_VSCODE_PLUGIN_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_VSCODE_PLUGIN_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_VSCODE_PLUGIN_COPY_TO_MANAGER_SKIP, ENV_VSCODE_PLUGIN_DOCKER_ADDITIONAL_CONTAINER, ENV_VSCODE_PLUGIN_DOCKER_SKIP_START_IN_ORDER, ENV_VSCODE_PLUGIN_DOCKER_SKIP_USING_MYSQL_DB, ENV_VSCODE_PLUGIN_FINISH_CALLBACK, ENV_VSCODE_PLUGIN_INIT_BRANDING, ENV_VSCODE_PLUGIN_INIT_STRUCT, ENV_VSCODE_PLUGIN_IS_CI_PROCESS, ENV_VSCODE_PLUGIN_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_VSCODE_PLUGIN_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_VSCODE_PLUGIN_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_VSCODE_PLUGIN_PURPOSE, ENV_VSCODE_PLUGIN_RECURSIVE_ACTION, ENV_VSCODE_PLUGIN_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_VSCODE_PLUGIN_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_VSCODE_PLUGIN_RELEASE_CLI_COMPRESS, ENV_VSCODE_PLUGIN_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_VSCODE_PLUGIN_RELEASE_CLI_MINIFY, ENV_VSCODE_PLUGIN_RELEASE_CLI_OBSCURE, ENV_VSCODE_PLUGIN_RELEASE_CLI_UGLIFY, ENV_VSCODE_PLUGIN_RELEASE_ENV_NAME, ENV_VSCODE_PLUGIN_RELEASE_ENV_NUMBER, ENV_VSCODE_PLUGIN_RELEASE_INSTALL_LOCALLY, ENV_VSCODE_PLUGIN_RELEASE_LIB_COMPRESS, ENV_VSCODE_PLUGIN_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_VSCODE_PLUGIN_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_VSCODE_PLUGIN_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_VSCODE_PLUGIN_RELEASE_LIB_REMOVE_DTS, ENV_VSCODE_PLUGIN_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_VSCODE_PLUGIN_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_VSCODE_PLUGIN_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_VSCODE_PLUGIN_RELEASE_RELEASE_TYPE, ENV_VSCODE_PLUGIN_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_VSCODE_PLUGIN_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_VSCODE_PLUGIN_RELEASE_RESOLVED_NEW_VERSION, ENV_VSCODE_PLUGIN_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_VSCODE_PLUGIN_RELEASE_SKIP_CODE_CUTTING, ENV_VSCODE_PLUGIN_RELEASE_SKIP_DEPLOY, ENV_VSCODE_PLUGIN_RELEASE_SKIP_NPM_PUBLISH, ENV_VSCODE_PLUGIN_RELEASE_SKIP_RELEASE_QUESTION, ENV_VSCODE_PLUGIN_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_VSCODE_PLUGIN_RELEASE_SKIP_TAG_GIT_PUSH, ENV_VSCODE_PLUGIN_RELEASE_TAON_INSTANCE_IP, ENV_VSCODE_PLUGIN_RELEASE_TARGET_ARTIFACT, ENV_VSCODE_PLUGIN_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_VSCODE_PLUGIN_WEBSITE_DOMAIN, ENV_VSCODE_PLUGIN_WEBSITE_TITLE, ENV_VSCODE_PLUGIN_WEBSITE_USE_DOMAIN, PROJECT_NPM_NAME, TaonAdminLayoutComponent, TaonAdminPageTabsComponent, TaonBaseAdminLayoutPage, TaonDraggableButtonPanelComponent, TaonDraggableButtonPanelRoutes, TaonDraggableButtonPanelState, adminLazyRoutes, myOrgProj, startCli };
2817
+ export { APP_ID, BUILD_BASE_HREF, BUILD_FRAMEWORK_CLI_NAME, CURRENT_PACKAGE_TAON_VERSION, CURRENT_PACKAGE_VERSION, ENV_ANGULAR_NODE_APP_BUILD_BASE_HREF, ENV_ANGULAR_NODE_APP_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_ANGULAR_NODE_APP_BUILD_GEN_ONLY_CLIENT_CODE, ENV_ANGULAR_NODE_APP_BUILD_OVERRIDE_OUTPUT_PATH, ENV_ANGULAR_NODE_APP_BUILD_PROD, ENV_ANGULAR_NODE_APP_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_ANGULAR_NODE_APP_BUILD_PWA_NAME, ENV_ANGULAR_NODE_APP_BUILD_PWA_SHORT_NAME, ENV_ANGULAR_NODE_APP_BUILD_PWA_START_URL, ENV_ANGULAR_NODE_APP_BUILD_SSR, ENV_ANGULAR_NODE_APP_BUILD_WATCH, ENV_ANGULAR_NODE_APP_BUILD_WEBSQL, ENV_ANGULAR_NODE_APP_CONTAINER_END, ENV_ANGULAR_NODE_APP_CONTAINER_ONLY, ENV_ANGULAR_NODE_APP_CONTAINER_SKIP, ENV_ANGULAR_NODE_APP_CONTAINER_SKIP_RELEASED, ENV_ANGULAR_NODE_APP_CONTAINER_START, ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_ANGULAR_NODE_APP_COPY_TO_MANAGER_SKIP, ENV_ANGULAR_NODE_APP_DOCKER_ADDITIONAL_CONTAINER, ENV_ANGULAR_NODE_APP_DOCKER_SKIP_START_IN_ORDER, ENV_ANGULAR_NODE_APP_DOCKER_SKIP_USING_MYSQL_DB, ENV_ANGULAR_NODE_APP_FINISH_CALLBACK, ENV_ANGULAR_NODE_APP_INIT_BRANDING, ENV_ANGULAR_NODE_APP_INIT_STRUCT, ENV_ANGULAR_NODE_APP_IS_CI_PROCESS, ENV_ANGULAR_NODE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_ANGULAR_NODE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_ANGULAR_NODE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_ANGULAR_NODE_APP_PURPOSE, ENV_ANGULAR_NODE_APP_RECURSIVE_ACTION, ENV_ANGULAR_NODE_APP_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_ANGULAR_NODE_APP_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_ANGULAR_NODE_APP_RELEASE_CLI_COMPRESS, ENV_ANGULAR_NODE_APP_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_ANGULAR_NODE_APP_RELEASE_CLI_MINIFY, ENV_ANGULAR_NODE_APP_RELEASE_CLI_OBSCURE, ENV_ANGULAR_NODE_APP_RELEASE_CLI_UGLIFY, ENV_ANGULAR_NODE_APP_RELEASE_ENV_NAME, ENV_ANGULAR_NODE_APP_RELEASE_ENV_NUMBER, ENV_ANGULAR_NODE_APP_RELEASE_INSTALL_LOCALLY, ENV_ANGULAR_NODE_APP_RELEASE_LIB_COMPRESS, ENV_ANGULAR_NODE_APP_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_ANGULAR_NODE_APP_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_ANGULAR_NODE_APP_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_ANGULAR_NODE_APP_RELEASE_LIB_REMOVE_DTS, ENV_ANGULAR_NODE_APP_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_ANGULAR_NODE_APP_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_ANGULAR_NODE_APP_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_ANGULAR_NODE_APP_RELEASE_RELEASE_TYPE, ENV_ANGULAR_NODE_APP_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_ANGULAR_NODE_APP_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_ANGULAR_NODE_APP_RELEASE_RESOLVED_NEW_VERSION, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_CODE_CUTTING, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_DEPLOY, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_NPM_PUBLISH, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_RELEASE_QUESTION, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_ANGULAR_NODE_APP_RELEASE_SKIP_TAG_GIT_PUSH, ENV_ANGULAR_NODE_APP_RELEASE_TAON_INSTANCE_IP, ENV_ANGULAR_NODE_APP_RELEASE_TARGET_ARTIFACT, ENV_ANGULAR_NODE_APP_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_ANGULAR_NODE_APP_WEBSITE_DOMAIN, ENV_ANGULAR_NODE_APP_WEBSITE_TITLE, ENV_ANGULAR_NODE_APP_WEBSITE_USE_DOMAIN, ENV_DOCS_WEBAPP_BUILD_BASE_HREF, ENV_DOCS_WEBAPP_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_DOCS_WEBAPP_BUILD_GEN_ONLY_CLIENT_CODE, ENV_DOCS_WEBAPP_BUILD_OVERRIDE_OUTPUT_PATH, ENV_DOCS_WEBAPP_BUILD_PROD, ENV_DOCS_WEBAPP_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_DOCS_WEBAPP_BUILD_PWA_NAME, ENV_DOCS_WEBAPP_BUILD_PWA_SHORT_NAME, ENV_DOCS_WEBAPP_BUILD_PWA_START_URL, ENV_DOCS_WEBAPP_BUILD_SSR, ENV_DOCS_WEBAPP_BUILD_WATCH, ENV_DOCS_WEBAPP_BUILD_WEBSQL, ENV_DOCS_WEBAPP_CONTAINER_END, ENV_DOCS_WEBAPP_CONTAINER_ONLY, ENV_DOCS_WEBAPP_CONTAINER_SKIP, ENV_DOCS_WEBAPP_CONTAINER_SKIP_RELEASED, ENV_DOCS_WEBAPP_CONTAINER_START, ENV_DOCS_WEBAPP_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_DOCS_WEBAPP_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_DOCS_WEBAPP_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_DOCS_WEBAPP_COPY_TO_MANAGER_SKIP, ENV_DOCS_WEBAPP_DOCKER_ADDITIONAL_CONTAINER, ENV_DOCS_WEBAPP_DOCKER_SKIP_START_IN_ORDER, ENV_DOCS_WEBAPP_DOCKER_SKIP_USING_MYSQL_DB, ENV_DOCS_WEBAPP_FINISH_CALLBACK, ENV_DOCS_WEBAPP_INIT_BRANDING, ENV_DOCS_WEBAPP_INIT_STRUCT, ENV_DOCS_WEBAPP_IS_CI_PROCESS, ENV_DOCS_WEBAPP_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_DOCS_WEBAPP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_DOCS_WEBAPP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_DOCS_WEBAPP_PURPOSE, ENV_DOCS_WEBAPP_RECURSIVE_ACTION, ENV_DOCS_WEBAPP_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_DOCS_WEBAPP_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_DOCS_WEBAPP_RELEASE_CLI_COMPRESS, ENV_DOCS_WEBAPP_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_DOCS_WEBAPP_RELEASE_CLI_MINIFY, ENV_DOCS_WEBAPP_RELEASE_CLI_OBSCURE, ENV_DOCS_WEBAPP_RELEASE_CLI_UGLIFY, ENV_DOCS_WEBAPP_RELEASE_ENV_NAME, ENV_DOCS_WEBAPP_RELEASE_ENV_NUMBER, ENV_DOCS_WEBAPP_RELEASE_INSTALL_LOCALLY, ENV_DOCS_WEBAPP_RELEASE_LIB_COMPRESS, ENV_DOCS_WEBAPP_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_DOCS_WEBAPP_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_DOCS_WEBAPP_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_DOCS_WEBAPP_RELEASE_LIB_REMOVE_DTS, ENV_DOCS_WEBAPP_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_DOCS_WEBAPP_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_DOCS_WEBAPP_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_DOCS_WEBAPP_RELEASE_RELEASE_TYPE, ENV_DOCS_WEBAPP_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_DOCS_WEBAPP_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_DOCS_WEBAPP_RELEASE_RESOLVED_NEW_VERSION, ENV_DOCS_WEBAPP_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_DOCS_WEBAPP_RELEASE_SKIP_CODE_CUTTING, ENV_DOCS_WEBAPP_RELEASE_SKIP_DEPLOY, ENV_DOCS_WEBAPP_RELEASE_SKIP_NPM_PUBLISH, ENV_DOCS_WEBAPP_RELEASE_SKIP_RELEASE_QUESTION, ENV_DOCS_WEBAPP_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_DOCS_WEBAPP_RELEASE_SKIP_TAG_GIT_PUSH, ENV_DOCS_WEBAPP_RELEASE_TAON_INSTANCE_IP, ENV_DOCS_WEBAPP_RELEASE_TARGET_ARTIFACT, ENV_DOCS_WEBAPP_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_DOCS_WEBAPP_WEBSITE_DOMAIN, ENV_DOCS_WEBAPP_WEBSITE_TITLE, ENV_DOCS_WEBAPP_WEBSITE_USE_DOMAIN, ENV_ELECTRON_APP_BUILD_BASE_HREF, ENV_ELECTRON_APP_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_ELECTRON_APP_BUILD_GEN_ONLY_CLIENT_CODE, ENV_ELECTRON_APP_BUILD_OVERRIDE_OUTPUT_PATH, ENV_ELECTRON_APP_BUILD_PROD, ENV_ELECTRON_APP_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_ELECTRON_APP_BUILD_PWA_NAME, ENV_ELECTRON_APP_BUILD_PWA_SHORT_NAME, ENV_ELECTRON_APP_BUILD_PWA_START_URL, ENV_ELECTRON_APP_BUILD_SSR, ENV_ELECTRON_APP_BUILD_WATCH, ENV_ELECTRON_APP_BUILD_WEBSQL, ENV_ELECTRON_APP_CONTAINER_END, ENV_ELECTRON_APP_CONTAINER_ONLY, ENV_ELECTRON_APP_CONTAINER_SKIP, ENV_ELECTRON_APP_CONTAINER_SKIP_RELEASED, ENV_ELECTRON_APP_CONTAINER_START, ENV_ELECTRON_APP_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_ELECTRON_APP_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_ELECTRON_APP_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_ELECTRON_APP_COPY_TO_MANAGER_SKIP, ENV_ELECTRON_APP_DOCKER_ADDITIONAL_CONTAINER, ENV_ELECTRON_APP_DOCKER_SKIP_START_IN_ORDER, ENV_ELECTRON_APP_DOCKER_SKIP_USING_MYSQL_DB, ENV_ELECTRON_APP_FINISH_CALLBACK, ENV_ELECTRON_APP_INIT_BRANDING, ENV_ELECTRON_APP_INIT_STRUCT, ENV_ELECTRON_APP_IS_CI_PROCESS, ENV_ELECTRON_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_ELECTRON_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_ELECTRON_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_ELECTRON_APP_PURPOSE, ENV_ELECTRON_APP_RECURSIVE_ACTION, ENV_ELECTRON_APP_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_ELECTRON_APP_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_ELECTRON_APP_RELEASE_CLI_COMPRESS, ENV_ELECTRON_APP_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_ELECTRON_APP_RELEASE_CLI_MINIFY, ENV_ELECTRON_APP_RELEASE_CLI_OBSCURE, ENV_ELECTRON_APP_RELEASE_CLI_UGLIFY, ENV_ELECTRON_APP_RELEASE_ENV_NAME, ENV_ELECTRON_APP_RELEASE_ENV_NUMBER, ENV_ELECTRON_APP_RELEASE_INSTALL_LOCALLY, ENV_ELECTRON_APP_RELEASE_LIB_COMPRESS, ENV_ELECTRON_APP_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_ELECTRON_APP_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_ELECTRON_APP_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_ELECTRON_APP_RELEASE_LIB_REMOVE_DTS, ENV_ELECTRON_APP_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_ELECTRON_APP_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_ELECTRON_APP_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_ELECTRON_APP_RELEASE_RELEASE_TYPE, ENV_ELECTRON_APP_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_ELECTRON_APP_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_ELECTRON_APP_RELEASE_RESOLVED_NEW_VERSION, ENV_ELECTRON_APP_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_ELECTRON_APP_RELEASE_SKIP_CODE_CUTTING, ENV_ELECTRON_APP_RELEASE_SKIP_DEPLOY, ENV_ELECTRON_APP_RELEASE_SKIP_NPM_PUBLISH, ENV_ELECTRON_APP_RELEASE_SKIP_RELEASE_QUESTION, ENV_ELECTRON_APP_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_ELECTRON_APP_RELEASE_SKIP_TAG_GIT_PUSH, ENV_ELECTRON_APP_RELEASE_TAON_INSTANCE_IP, ENV_ELECTRON_APP_RELEASE_TARGET_ARTIFACT, ENV_ELECTRON_APP_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_ELECTRON_APP_WEBSITE_DOMAIN, ENV_ELECTRON_APP_WEBSITE_TITLE, ENV_ELECTRON_APP_WEBSITE_USE_DOMAIN, ENV_MOBILE_APP_BUILD_BASE_HREF, ENV_MOBILE_APP_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_MOBILE_APP_BUILD_GEN_ONLY_CLIENT_CODE, ENV_MOBILE_APP_BUILD_OVERRIDE_OUTPUT_PATH, ENV_MOBILE_APP_BUILD_PROD, ENV_MOBILE_APP_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_MOBILE_APP_BUILD_PWA_NAME, ENV_MOBILE_APP_BUILD_PWA_SHORT_NAME, ENV_MOBILE_APP_BUILD_PWA_START_URL, ENV_MOBILE_APP_BUILD_SSR, ENV_MOBILE_APP_BUILD_WATCH, ENV_MOBILE_APP_BUILD_WEBSQL, ENV_MOBILE_APP_CONTAINER_END, ENV_MOBILE_APP_CONTAINER_ONLY, ENV_MOBILE_APP_CONTAINER_SKIP, ENV_MOBILE_APP_CONTAINER_SKIP_RELEASED, ENV_MOBILE_APP_CONTAINER_START, ENV_MOBILE_APP_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_MOBILE_APP_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_MOBILE_APP_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_MOBILE_APP_COPY_TO_MANAGER_SKIP, ENV_MOBILE_APP_DOCKER_ADDITIONAL_CONTAINER, ENV_MOBILE_APP_DOCKER_SKIP_START_IN_ORDER, ENV_MOBILE_APP_DOCKER_SKIP_USING_MYSQL_DB, ENV_MOBILE_APP_FINISH_CALLBACK, ENV_MOBILE_APP_INIT_BRANDING, ENV_MOBILE_APP_INIT_STRUCT, ENV_MOBILE_APP_IS_CI_PROCESS, ENV_MOBILE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_MOBILE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_MOBILE_APP_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_MOBILE_APP_PURPOSE, ENV_MOBILE_APP_RECURSIVE_ACTION, ENV_MOBILE_APP_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_MOBILE_APP_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_MOBILE_APP_RELEASE_CLI_COMPRESS, ENV_MOBILE_APP_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_MOBILE_APP_RELEASE_CLI_MINIFY, ENV_MOBILE_APP_RELEASE_CLI_OBSCURE, ENV_MOBILE_APP_RELEASE_CLI_UGLIFY, ENV_MOBILE_APP_RELEASE_ENV_NAME, ENV_MOBILE_APP_RELEASE_ENV_NUMBER, ENV_MOBILE_APP_RELEASE_INSTALL_LOCALLY, ENV_MOBILE_APP_RELEASE_LIB_COMPRESS, ENV_MOBILE_APP_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_MOBILE_APP_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_MOBILE_APP_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_MOBILE_APP_RELEASE_LIB_REMOVE_DTS, ENV_MOBILE_APP_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_MOBILE_APP_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_MOBILE_APP_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_MOBILE_APP_RELEASE_RELEASE_TYPE, ENV_MOBILE_APP_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_MOBILE_APP_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_MOBILE_APP_RELEASE_RESOLVED_NEW_VERSION, ENV_MOBILE_APP_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_MOBILE_APP_RELEASE_SKIP_CODE_CUTTING, ENV_MOBILE_APP_RELEASE_SKIP_DEPLOY, ENV_MOBILE_APP_RELEASE_SKIP_NPM_PUBLISH, ENV_MOBILE_APP_RELEASE_SKIP_RELEASE_QUESTION, ENV_MOBILE_APP_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_MOBILE_APP_RELEASE_SKIP_TAG_GIT_PUSH, ENV_MOBILE_APP_RELEASE_TAON_INSTANCE_IP, ENV_MOBILE_APP_RELEASE_TARGET_ARTIFACT, ENV_MOBILE_APP_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_MOBILE_APP_WEBSITE_DOMAIN, ENV_MOBILE_APP_WEBSITE_TITLE, ENV_MOBILE_APP_WEBSITE_USE_DOMAIN, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_BASE_HREF, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_GEN_ONLY_CLIENT_CODE, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_OVERRIDE_OUTPUT_PATH, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_PROD, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_PWA_NAME, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_PWA_SHORT_NAME, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_PWA_START_URL, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_SSR, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_WATCH, ENV_NPM_LIB_AND_CLI_TOOL_BUILD_WEBSQL, ENV_NPM_LIB_AND_CLI_TOOL_CONTAINER_END, ENV_NPM_LIB_AND_CLI_TOOL_CONTAINER_ONLY, ENV_NPM_LIB_AND_CLI_TOOL_CONTAINER_SKIP, ENV_NPM_LIB_AND_CLI_TOOL_CONTAINER_SKIP_RELEASED, ENV_NPM_LIB_AND_CLI_TOOL_CONTAINER_START, ENV_NPM_LIB_AND_CLI_TOOL_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_NPM_LIB_AND_CLI_TOOL_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_NPM_LIB_AND_CLI_TOOL_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_NPM_LIB_AND_CLI_TOOL_COPY_TO_MANAGER_SKIP, ENV_NPM_LIB_AND_CLI_TOOL_DOCKER_ADDITIONAL_CONTAINER, ENV_NPM_LIB_AND_CLI_TOOL_DOCKER_SKIP_START_IN_ORDER, ENV_NPM_LIB_AND_CLI_TOOL_DOCKER_SKIP_USING_MYSQL_DB, ENV_NPM_LIB_AND_CLI_TOOL_FINISH_CALLBACK, ENV_NPM_LIB_AND_CLI_TOOL_INIT_BRANDING, ENV_NPM_LIB_AND_CLI_TOOL_INIT_STRUCT, ENV_NPM_LIB_AND_CLI_TOOL_IS_CI_PROCESS, ENV_NPM_LIB_AND_CLI_TOOL_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_NPM_LIB_AND_CLI_TOOL_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_NPM_LIB_AND_CLI_TOOL_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_NPM_LIB_AND_CLI_TOOL_PURPOSE, ENV_NPM_LIB_AND_CLI_TOOL_RECURSIVE_ACTION, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_CLI_COMPRESS, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_CLI_MINIFY, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_CLI_OBSCURE, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_CLI_UGLIFY, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_ENV_NAME, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_ENV_NUMBER, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_INSTALL_LOCALLY, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_COMPRESS, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_REMOVE_DTS, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_RELEASE_TYPE, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_RESOLVED_NEW_VERSION, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_CODE_CUTTING, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_DEPLOY, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_NPM_PUBLISH, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_RELEASE_QUESTION, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_SKIP_TAG_GIT_PUSH, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_TAON_INSTANCE_IP, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_TARGET_ARTIFACT, ENV_NPM_LIB_AND_CLI_TOOL_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_NPM_LIB_AND_CLI_TOOL_WEBSITE_DOMAIN, ENV_NPM_LIB_AND_CLI_TOOL_WEBSITE_TITLE, ENV_NPM_LIB_AND_CLI_TOOL_WEBSITE_USE_DOMAIN, ENV_VSCODE_PLUGIN_BUILD_BASE_HREF, ENV_VSCODE_PLUGIN_BUILD_ELECTRON_SHOW_DEV_TOOLS, ENV_VSCODE_PLUGIN_BUILD_GEN_ONLY_CLIENT_CODE, ENV_VSCODE_PLUGIN_BUILD_OVERRIDE_OUTPUT_PATH, ENV_VSCODE_PLUGIN_BUILD_PROD, ENV_VSCODE_PLUGIN_BUILD_PWA_DISABLE_SERVICE_WORKER, ENV_VSCODE_PLUGIN_BUILD_PWA_NAME, ENV_VSCODE_PLUGIN_BUILD_PWA_SHORT_NAME, ENV_VSCODE_PLUGIN_BUILD_PWA_START_URL, ENV_VSCODE_PLUGIN_BUILD_SSR, ENV_VSCODE_PLUGIN_BUILD_WATCH, ENV_VSCODE_PLUGIN_BUILD_WEBSQL, ENV_VSCODE_PLUGIN_CONTAINER_END, ENV_VSCODE_PLUGIN_CONTAINER_ONLY, ENV_VSCODE_PLUGIN_CONTAINER_SKIP, ENV_VSCODE_PLUGIN_CONTAINER_SKIP_RELEASED, ENV_VSCODE_PLUGIN_CONTAINER_START, ENV_VSCODE_PLUGIN_COPY_TO_MANAGER_BEFORE_COPY_HOOK, ENV_VSCODE_PLUGIN_COPY_TO_MANAGER_COPY_TO_LOCATIONS, ENV_VSCODE_PLUGIN_COPY_TO_MANAGER_COPY_TO_PROJECTS, ENV_VSCODE_PLUGIN_COPY_TO_MANAGER_SKIP, ENV_VSCODE_PLUGIN_DOCKER_ADDITIONAL_CONTAINER, ENV_VSCODE_PLUGIN_DOCKER_SKIP_START_IN_ORDER, ENV_VSCODE_PLUGIN_DOCKER_SKIP_USING_MYSQL_DB, ENV_VSCODE_PLUGIN_FINISH_CALLBACK, ENV_VSCODE_PLUGIN_INIT_BRANDING, ENV_VSCODE_PLUGIN_INIT_STRUCT, ENV_VSCODE_PLUGIN_IS_CI_PROCESS, ENV_VSCODE_PLUGIN_LOADING_PRE_ANGULAR_BOOTSTRAP_BACKGROUND, ENV_VSCODE_PLUGIN_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER, ENV_VSCODE_PLUGIN_LOADING_PRE_ANGULAR_BOOTSTRAP_LOADER_NAME, ENV_VSCODE_PLUGIN_PURPOSE, ENV_VSCODE_PLUGIN_RECURSIVE_ACTION, ENV_VSCODE_PLUGIN_RELEASE_AUTO_RELEASE_TASK_NAME, ENV_VSCODE_PLUGIN_RELEASE_AUTO_RELEASE_USING_CONFIG, ENV_VSCODE_PLUGIN_RELEASE_CLI_COMPRESS, ENV_VSCODE_PLUGIN_RELEASE_CLI_INCLUDE_NODE_MODULES, ENV_VSCODE_PLUGIN_RELEASE_CLI_MINIFY, ENV_VSCODE_PLUGIN_RELEASE_CLI_OBSCURE, ENV_VSCODE_PLUGIN_RELEASE_CLI_UGLIFY, ENV_VSCODE_PLUGIN_RELEASE_ENV_NAME, ENV_VSCODE_PLUGIN_RELEASE_ENV_NUMBER, ENV_VSCODE_PLUGIN_RELEASE_INSTALL_LOCALLY, ENV_VSCODE_PLUGIN_RELEASE_LIB_COMPRESS, ENV_VSCODE_PLUGIN_RELEASE_LIB_DO_NOT_INCLUDE_LIB_FILES, ENV_VSCODE_PLUGIN_RELEASE_LIB_INCLUDE_SOURCE_MAPS, ENV_VSCODE_PLUGIN_RELEASE_LIB_OBSCURE_FILE_BY_FILE, ENV_VSCODE_PLUGIN_RELEASE_LIB_REMOVE_DTS, ENV_VSCODE_PLUGIN_RELEASE_LIB_UGLIFY_FILE_BY_FILE, ENV_VSCODE_PLUGIN_RELEASE_NODE_BACKEND_APP_MINIFY, ENV_VSCODE_PLUGIN_RELEASE_PUSH_TO_ALL_ORIGINS_WHEN_LOCAL_RELEASE_BRANCH, ENV_VSCODE_PLUGIN_RELEASE_RELEASE_TYPE, ENV_VSCODE_PLUGIN_RELEASE_RELEASE_VERSION_BUMP_TYPE, ENV_VSCODE_PLUGIN_RELEASE_REMOVE_RELEASE_OUTPUT_AFTER_LOCAL_INSTALL, ENV_VSCODE_PLUGIN_RELEASE_RESOLVED_NEW_VERSION, ENV_VSCODE_PLUGIN_RELEASE_SKIP_BUILDING_ARTIFACTS, ENV_VSCODE_PLUGIN_RELEASE_SKIP_CODE_CUTTING, ENV_VSCODE_PLUGIN_RELEASE_SKIP_DEPLOY, ENV_VSCODE_PLUGIN_RELEASE_SKIP_NPM_PUBLISH, ENV_VSCODE_PLUGIN_RELEASE_SKIP_RELEASE_QUESTION, ENV_VSCODE_PLUGIN_RELEASE_SKIP_RESOLVING_GIT_CHANGES, ENV_VSCODE_PLUGIN_RELEASE_SKIP_TAG_GIT_PUSH, ENV_VSCODE_PLUGIN_RELEASE_TAON_INSTANCE_IP, ENV_VSCODE_PLUGIN_RELEASE_TARGET_ARTIFACT, ENV_VSCODE_PLUGIN_RELEASE_USE_LOCAL_RELEASE_BRANCH, ENV_VSCODE_PLUGIN_WEBSITE_DOMAIN, ENV_VSCODE_PLUGIN_WEBSITE_TITLE, ENV_VSCODE_PLUGIN_WEBSITE_USE_DOMAIN, PROJECT_NPM_NAME, TaonAdminLayoutComponent, TaonAdminPageTabsComponent, TaonBackofficeNotificationsComponent, TaonBackofficeNotificationsService, TaonBaseAdminLayoutPage, TaonBaselineBackofficeOutletName, TaonConfirmDialogComponent, TaonDatatableComponent, TaonDatatableRoutes, TaonDraggableButtonPanelComponent, TaonDraggableButtonPanelRoutes, TaonDraggableButtonPanelState, TaonErrorDetailsDialogComponent, TaonErrorToastComponent, TaonHorizontalWheelScrollDirective, adminLazyRoute, myOrgProj, startCli };
1844
2818
  //# sourceMappingURL=ui-websql-prod.mjs.map