@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 } from 'tnp-core/websql';
1
+ import { decodeEnv, UtilsJson, _ } from 'tnp-core/websql';
2
2
  import { Translation } from '@taon-dev/i18n/websql';
3
3
  import { BaseCommandLineFeature } from 'tnp-helpers/websql';
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, getDefaultModel } from 'ng2-rest/websql';
19
+ import { TaonAdminService, getHttpStatus, ClassHelpers, Symbols } from 'taon/websql';
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-my-organization-proj.ts.en-US.i18n.data-CoSik70Y.mjs')).default, "pl-PL": async () => (await import('./ui-websql-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-my-organization-proj.ts.en-US.i18n.data-CoSik70Y.mjs')).default, "pl-PL": async () => (await import('./ui-websql-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,639 @@ 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-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs')).default, "pl-PL": async () => (await import('./ui-websql-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.listenErrors
1970
+ .pipe(takeUntilDestroyed(this.destroyRef))
1971
+ .subscribe((error) => {
1972
+ if (_.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
+ //#region imports
2022
+ //#endregion
2023
+ const defaultColumns = [
2024
+ {
2025
+ header: 'ID',
2026
+ field: 'id',
2027
+ },
2028
+ {
2029
+ header: 'NAME',
2030
+ field: 'name',
2031
+ },
2032
+ ];
2033
+ class TaonDatatableComponent {
2034
+ constructor() {
2035
+ //#region fields & getters
2036
+ this.cdr = inject(ChangeDetectorRef);
2037
+ this.destroyRef = inject(DestroyRef);
2038
+ //#region inputs
2039
+ this.pageNumber = 1;
2040
+ this.pageSize = 10;
2041
+ this.pageSizeOptions = [5, 10, 20, 50, 100];
2042
+ this.allowedColumns = [];
2043
+ this.columns = defaultColumns;
2044
+ this.hideSearch = false;
2045
+ this.hideAddButton = false;
2046
+ this.safe = false;
2047
+ this.searchMode = 'advanced';
2048
+ //#endregion
2049
+ //#region outputs
2050
+ this.expansionChange = new EventEmitter();
2051
+ this.addingItem = new EventEmitter();
2052
+ //#endregion
2053
+ //#region fields
2054
+ this.rows = [];
2055
+ this.totalElements = 0;
2056
+ this.isLoading = false;
2057
+ this.expandable = false;
2058
+ this.advancedSearchOpened = false;
2059
+ this.searchValue = '';
2060
+ this.columnFilters = {};
2061
+ this.reload$ = new BehaviorSubject(undefined);
2062
+ this.searchChange$ = new Subject();
2063
+ this.data$ = this.reload$.pipe(switchMap(() => this.loadData()));
2064
+ this.expandedRows = new Set();
2065
+ }
2066
+ set data(value) {
2067
+ this._data = value ?? undefined;
2068
+ if (this._data) {
2069
+ this.pageNumber = 1;
2070
+ this.reload();
2071
+ }
2072
+ }
2073
+ get data() {
2074
+ return this._data;
2075
+ }
2076
+ get offlineMode() {
2077
+ return this.data !== undefined;
2078
+ }
2079
+ //#endregion
2080
+ //#region getters
2081
+ get entity() {
2082
+ return this.entityCrudController?.entityClassResolveFn();
2083
+ }
2084
+ get filterableColumns() {
2085
+ return this.columns.filter(column => Boolean(column.field));
2086
+ }
2087
+ //#endregion
2088
+ //#endregion
2089
+ //#region expansion
2090
+ onExpansionChange(event) {
2091
+ // console.log(event);
2092
+ // adapt this depending on exact MtxGrid event shape
2093
+ if (event.expanded) {
2094
+ this.expandedRows.add(event.data);
2095
+ }
2096
+ else {
2097
+ this.expandedRows.delete(event.data);
2098
+ }
2099
+ this.expansionChange.emit(event);
2100
+ }
2101
+ isExpanded(row) {
2102
+ return this.expandedRows.has(row);
2103
+ }
2104
+ //#endregion
2105
+ //#region hooks
2106
+ ngOnInit() {
2107
+ this.prepareColumns();
2108
+ // console.log({ columns: this.columns });
2109
+ this.expandable = Boolean(this.expansionTemplate);
2110
+ this.showPaginator = _.isBoolean(this.showPaginator)
2111
+ ? this.showPaginator
2112
+ : Boolean(this.entity) || this.offlineMode;
2113
+ this.searchChange$
2114
+ .pipe(debounceTime(400), distinctUntilChanged(), tap(search => {
2115
+ this.searchValue = search;
2116
+ this.pageNumber = 1;
2117
+ this.reload();
2118
+ }), takeUntilDestroyed(this.destroyRef))
2119
+ .subscribe();
2120
+ this.data$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(rows => {
2121
+ this.rows = rows;
2122
+ this.cdr.markForCheck();
2123
+ });
2124
+ }
2125
+ //#endregion
2126
+ //#region search
2127
+ searchChanged(value) {
2128
+ this.searchChange$.next(value);
2129
+ }
2130
+ clearSearch() {
2131
+ this.searchValue = '';
2132
+ this.columnFilters = {};
2133
+ this.pageNumber = 1;
2134
+ this.reload();
2135
+ }
2136
+ applyAdvancedFilters() {
2137
+ this.pageNumber = 1;
2138
+ this.reload();
2139
+ }
2140
+ toggleAdvancedSearch() {
2141
+ this.advancedSearchOpened = !this.advancedSearchOpened;
2142
+ }
2143
+ //#endregion
2144
+ //#region pagination
2145
+ getNextPage(event) {
2146
+ this.pageNumber = event.pageIndex + 1;
2147
+ this.pageSize = event.pageSize;
2148
+ this.reload();
2149
+ }
2150
+ //#endregion
2151
+ //#region sorting
2152
+ sortChanged(event) {
2153
+ const field = event?.active ?? event?.field;
2154
+ const direction = event?.direction ?? '';
2155
+ this.sort = {
2156
+ field,
2157
+ direction,
2158
+ };
2159
+ this.pageNumber = 1;
2160
+ this.reload();
2161
+ }
2162
+ //#endregion
2163
+ //#region data
2164
+ reload() {
2165
+ this.reload$.next();
2166
+ }
2167
+ getFieldValue(row, field) {
2168
+ return field.split('.').reduce((value, key) => value?.[key], row);
2169
+ }
2170
+ loadOfflineData() {
2171
+ let rows = [...(this.data ?? [])];
2172
+ //#region global search
2173
+ const search = this.searchValue.trim().toLowerCase();
2174
+ if (search) {
2175
+ rows = rows.filter(row => this.columns.some(column => {
2176
+ if (!column.field) {
2177
+ return false;
2178
+ }
2179
+ const value = this.getFieldValue(row, String(column.field));
2180
+ return String(value ?? '')
2181
+ .toLowerCase()
2182
+ .includes(search);
2183
+ }));
2184
+ }
2185
+ //#endregion
2186
+ //#region column filters
2187
+ const filters = this.cleanFilters(this.columnFilters);
2188
+ for (const [field, filterValue] of Object.entries(filters)) {
2189
+ const normalizedFilter = filterValue.toLowerCase();
2190
+ rows = rows.filter(row => {
2191
+ const value = this.getFieldValue(row, field);
2192
+ return String(value ?? '')
2193
+ .toLowerCase()
2194
+ .includes(normalizedFilter);
2195
+ });
2196
+ }
2197
+ //#endregion
2198
+ //#region sorting
2199
+ if (this.sort?.field && this.sort.direction) {
2200
+ const field = String(this.sort.field);
2201
+ const direction = this.sort.direction === 'desc' ? -1 : 1;
2202
+ rows.sort((a, b) => {
2203
+ const aValue = this.getFieldValue(a, field);
2204
+ const bValue = this.getFieldValue(b, field);
2205
+ if (aValue === bValue) {
2206
+ return 0;
2207
+ }
2208
+ if (aValue === undefined || aValue === null) {
2209
+ return -1 * direction;
2210
+ }
2211
+ if (bValue === undefined || bValue === null) {
2212
+ return 1 * direction;
2213
+ }
2214
+ if (typeof aValue === 'number' && typeof bValue === 'number') {
2215
+ return (aValue - bValue) * direction;
2216
+ }
2217
+ return (String(aValue).localeCompare(String(bValue), undefined, {
2218
+ numeric: true,
2219
+ sensitivity: 'base',
2220
+ }) * direction);
2221
+ });
2222
+ }
2223
+ //#endregion
2224
+ //#region pagination
2225
+ this.totalElements = rows.length;
2226
+ const start = (this.pageNumber - 1) * this.pageSize;
2227
+ const end = start + this.pageSize;
2228
+ return this.prepareRows(rows.slice(start, end));
2229
+ //#endregion
2230
+ }
2231
+ loadData() {
2232
+ if (this.offlineMode) {
2233
+ return of(this.loadOfflineData());
2234
+ }
2235
+ if (!this.entity || !this.entityCrudController) {
2236
+ this.totalElements = 0;
2237
+ return of([]);
2238
+ }
2239
+ this.isLoading = true;
2240
+ this.cdr.markForCheck();
2241
+ const query = {
2242
+ pageNumber: this.pageNumber,
2243
+ pageSize: this.pageSize,
2244
+ search: this.searchValue,
2245
+ filters: this.cleanFilters(this.columnFilters),
2246
+ sort: this.sort,
2247
+ callQueryMethod: this.callQueryMethod,
2248
+ };
2249
+ //#region handle info when not allowed method on controller level
2250
+ if (!this.safe && !this.entityCrudController.paginationQuery(query)) {
2251
+ throw new Error(`Please enable paginationQuery() method in your
2252
+ controller ${ClassHelpers.getName(this.entityCrudController)}
2253
+
2254
+ @Controller({ allowedMethods: ['paginationQuery'] })
2255
+ class ${ClassHelpers.getName(this.entityCrudController)} ..
2256
+ `);
2257
+ }
2258
+ if (this.safe && !this.entityCrudController.paginationQuerySafe(query)) {
2259
+ throw new Error(`Please enable paginationQuerySafe() method in your controller
2260
+ ${ClassHelpers.getName(this.entityCrudController)}
2261
+
2262
+ @Controller({ allowedMethods: ['paginationQuerySafe'] })
2263
+ class ${ClassHelpers.getName(this.entityCrudController)} ..
2264
+ `);
2265
+ }
2266
+ //#endregion
2267
+ return from((this.safe
2268
+ ? this.entityCrudController.paginationQuerySafe
2269
+ : this.entityCrudController.paginationQuery)(query).request()
2270
+ .observable).pipe(tap(response => {
2271
+ this.totalElements =
2272
+ Number(response.headers.get(Symbols.old.X_TOTAL_COUNT)) || 0;
2273
+ }), map(response => this.prepareRows(response.body.json)), catchError(error => {
2274
+ console.error(`[taon-datatable] Unable to load data from ` +
2275
+ `${ClassHelpers.getName(this.entityCrudController)} ${this.safe ? 'paginationQuerySafe' : 'paginationQuery'}`, error);
2276
+ return of([]);
2277
+ }), finalize(() => {
2278
+ this.isLoading = false;
2279
+ this.cdr.markForCheck();
2280
+ }));
2281
+ }
2282
+ //#endregion
2283
+ //#region helpers
2284
+ cleanFilters(filters) {
2285
+ return Object.fromEntries(Object.entries(filters)
2286
+ .filter(([, value]) => value !== undefined &&
2287
+ value !== null &&
2288
+ String(value).trim() !== '')
2289
+ .map(([key, value]) => [key, String(value).trim()]));
2290
+ }
2291
+ prepareRows(rows) {
2292
+ return rows.map(row => {
2293
+ // const result = {
2294
+ // ...row,
2295
+ // };
2296
+ // for (const key of Object.keys(result)) {
2297
+ // if (_.isObject(result[key])) {
2298
+ // result[key] = json5.stringify(result[key]);
2299
+ // }
2300
+ // }
2301
+ return row;
2302
+ });
2303
+ }
2304
+ prepareColumns() {
2305
+ const entityClass = this.entity;
2306
+ if (!entityClass) {
2307
+ return;
2308
+ }
2309
+ const usingDefaultColumns = _.isEqual(this.columns, defaultColumns);
2310
+ if (!usingDefaultColumns) {
2311
+ return;
2312
+ }
2313
+ try {
2314
+ const props = Object.keys(getDefaultModel(entityClass) || {});
2315
+ let columns = props
2316
+ .filter(prop => this.allowedColumns.length > 0
2317
+ ? this.allowedColumns.includes(prop)
2318
+ : true)
2319
+ .map(prop => ({
2320
+ header: _.upperCase(prop),
2321
+ field: prop,
2322
+ }));
2323
+ const extra = this.allowedColumns.filter(field => !props.includes(field));
2324
+ columns = [
2325
+ ...columns,
2326
+ ...extra.map(field => ({
2327
+ header: _.upperCase(field),
2328
+ field,
2329
+ })),
2330
+ ];
2331
+ this.columns = columns;
2332
+ }
2333
+ catch (error) {
2334
+ console.error('[taon-datatable] Unable to generate columns', error);
2335
+ }
2336
+ }
2337
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonDatatableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2338
+ 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 }); }
2339
+ }
2340
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonDatatableComponent, decorators: [{
2341
+ type: Component,
2342
+ args: [{ selector: 'taon-datatable', standalone: true, imports: [
2343
+ CommonModule,
2344
+ FormsModule,
2345
+ ReactiveFormsModule,
2346
+ MatButtonModule,
2347
+ MatFormFieldModule,
2348
+ MatIconModule,
2349
+ MatInputModule,
2350
+ MatPaginatorModule,
2351
+ MatSelectModule,
2352
+ MtxGridModule,
2353
+ ], 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"] }]
2354
+ }], propDecorators: { pageNumber: [{
2355
+ type: Input
2356
+ }], pageSize: [{
2357
+ type: Input
2358
+ }], pageSizeOptions: [{
2359
+ type: Input
2360
+ }], allowedColumns: [{
2361
+ type: Input
2362
+ }], expansionTemplate: [{
2363
+ type: Input
2364
+ }], entityCrudController: [{
2365
+ type: Input
2366
+ }], columns: [{
2367
+ type: Input
2368
+ }], hideSearch: [{
2369
+ type: Input
2370
+ }], hideAddButton: [{
2371
+ type: Input
2372
+ }], safe: [{
2373
+ type: Input
2374
+ }], searchMode: [{
2375
+ type: Input
2376
+ }], callQueryMethod: [{
2377
+ type: Input
2378
+ }], data: [{
2379
+ type: Input
2380
+ }], expansionChange: [{
2381
+ type: Output
2382
+ }], addingItem: [{
2383
+ type: Output
2384
+ }], showPaginator: [{
2385
+ type: Input
2386
+ }] } });
2387
+
2388
+ var taonDatatable_component = /*#__PURE__*/Object.freeze({
2389
+ __proto__: null,
2390
+ TaonDatatableComponent: TaonDatatableComponent
2391
+ });
2392
+
2393
+ //#endregion
2394
+ const TaonDatatableRoutes = [
2395
+ {
2396
+ path: '',
2397
+ loadComponent: () => Promise.resolve().then(function () { return taonDatatable_component; }).then(m => m.TaonDatatableComponent),
2398
+ children: [
2399
+ // adminLazyRoute({
2400
+ // path: 'dashboard',
2401
+ // menuItem: 'Dashboard',
2402
+ // icon: 'dashboard',
2403
+ // expandable: false,
2404
+ // loader: () =>
2405
+ // import('./anothermodule.routes').then(m => m.DashboardRoutes),
2406
+ // }),
2407
+ ],
2408
+ },
2409
+ ];
2410
+ /**
2411
+ * By default exporting TaonDatatableRoutes,
2412
+ * the command `taon generate:app:routes`
2413
+ * will automatically add them to the root routes in ./src/app.ts.
2414
+ */
2415
+ // export default TaonDatatableRoutes;
2416
+
1577
2417
  var TaonDraggableButtonPanelState;
1578
2418
  (function (TaonDraggableButtonPanelState) {
1579
2419
  TaonDraggableButtonPanelState["CLICKABLE_BUTTON"] = "CLICKABLE_BUTTON";
@@ -1582,6 +2422,8 @@ var TaonDraggableButtonPanelState;
1582
2422
  TaonDraggableButtonPanelState["FULL_SCREEN_LOCKED"] = "FULL_SCREEN_LOCKED";
1583
2423
  })(TaonDraggableButtonPanelState || (TaonDraggableButtonPanelState = {}));
1584
2424
 
2425
+ //#region imports
2426
+ //#endregion
1585
2427
  class TaonDraggableButtonPanelComponent {
1586
2428
  set state(state) {
1587
2429
  this.currentState.set(state);
@@ -1597,11 +2439,60 @@ class TaonDraggableButtonPanelComponent {
1597
2439
  */
1598
2440
  this.stateParamName = 'state';
1599
2441
  this.stateChange = new EventEmitter();
2442
+ this.forceFullScreen = signal(window.innerWidth < 900, ...(ngDevMode ? [{ debugName: "forceFullScreen" }] : []));
2443
+ this.resizeListener = () => {
2444
+ const wasForceFullScreen = this.forceFullScreen();
2445
+ const forceFullScreen = window.innerWidth < 900;
2446
+ this.forceFullScreen.set(forceFullScreen);
2447
+ // Desktop -> mobile: remove old CDK drag x/y transform.
2448
+ if (!wasForceFullScreen && forceFullScreen) {
2449
+ this.resetDragPosition();
2450
+ }
2451
+ };
1600
2452
  this.currentState = signal(TaonDraggableButtonPanelState.CLICKABLE_BUTTON, ...(ngDevMode ? [{ debugName: "currentState" }] : []));
1601
2453
  }
1602
2454
  async ngOnInit() {
2455
+ window.addEventListener('resize', this.resizeListener);
2456
+ /**
2457
+ * IMPORTANT:
2458
+ *
2459
+ * The component may be created while Angular is still processing
2460
+ * the application's initial navigation.
2461
+ *
2462
+ * For example:
2463
+ *
2464
+ * / -> redirectTo: /app
2465
+ *
2466
+ * If we create:
2467
+ *
2468
+ * (admin:main)
2469
+ *
2470
+ * before that redirect finishes, the auxiliary outlet navigation
2471
+ * may effectively replace/interfere with the primary navigation,
2472
+ * producing:
2473
+ *
2474
+ * /(admin:main)
2475
+ *
2476
+ * instead of:
2477
+ *
2478
+ * /app(admin:main)
2479
+ */
2480
+ await this.waitForInitialNavigation();
2481
+ /**
2482
+ * Ensure the auxiliary outlet exists only AFTER the primary
2483
+ * application route has settled.
2484
+ */
1603
2485
  await this.ensureOutletBasePath();
2486
+ /**
2487
+ * The outlet may already contain persisted state, e.g.
2488
+ *
2489
+ * (admin:main;state=WINDOW/dashboard)
2490
+ */
1604
2491
  this.restoreStateFromUrl();
2492
+ /**
2493
+ * From this point on keep the component state synchronized
2494
+ * with subsequent router navigations.
2495
+ */
1605
2496
  this.routerSubscription = this.router.events
1606
2497
  .pipe(filter(event => event instanceof NavigationEnd))
1607
2498
  .subscribe(() => {
@@ -1609,18 +2500,77 @@ class TaonDraggableButtonPanelComponent {
1609
2500
  });
1610
2501
  }
1611
2502
  ngOnDestroy() {
2503
+ window.removeEventListener('resize', this.resizeListener);
1612
2504
  this.routerSubscription?.unsubscribe();
1613
2505
  }
2506
+ toogleFullscreen(event) {
2507
+ event.stopImmediatePropagation();
2508
+ event.stopPropagation();
2509
+ event.preventDefault();
2510
+ if (this.forceFullScreen()) {
2511
+ return;
2512
+ }
2513
+ if (this.currentState() === TaonDraggableButtonPanelState.WINDOW) {
2514
+ this.resetDragPosition();
2515
+ void this.setState(TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED);
2516
+ }
2517
+ else if ([
2518
+ TaonDraggableButtonPanelState.FULL_SCREEN_DRAGGABLE,
2519
+ TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED,
2520
+ ].includes(this.currentState())) {
2521
+ this.resetDragPosition();
2522
+ void this.setState(TaonDraggableButtonPanelState.WINDOW);
2523
+ }
2524
+ }
2525
+ effectiveState() {
2526
+ if (this.forceFullScreen() &&
2527
+ this.currentState() !== TaonDraggableButtonPanelState.CLICKABLE_BUTTON) {
2528
+ return TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED;
2529
+ }
2530
+ return this.currentState();
2531
+ }
2532
+ // ===========================================================================
2533
+ // INITIAL ROUTING
2534
+ // ===========================================================================
2535
+ async waitForInitialNavigation() {
2536
+ /**
2537
+ * Router already completed at least one navigation.
2538
+ */
2539
+ if (this.router.navigated) {
2540
+ return;
2541
+ }
2542
+ /**
2543
+ * Wait until redirects/lazy routing/etc. belonging to the initial
2544
+ * navigation have settled.
2545
+ */
2546
+ await firstValueFrom(this.router.events.pipe(filter(event => event instanceof NavigationEnd), take(1)));
2547
+ }
1614
2548
  async ensureOutletBasePath() {
1615
2549
  if (!this.outlet || !this.basePath) {
1616
2550
  return;
1617
2551
  }
2552
+ /**
2553
+ * IMPORTANT:
2554
+ *
2555
+ * Parse the URL only AFTER initial navigation has completed.
2556
+ *
2557
+ * At this point:
2558
+ *
2559
+ * /
2560
+ *
2561
+ * may already have become:
2562
+ *
2563
+ * /app
2564
+ */
1618
2565
  const tree = this.router.parseUrl(this.router.url);
1619
2566
  /**
1620
- * Outlet already exists — don't touch it.
2567
+ * Outlet already exists — preserve it exactly as it is.
1621
2568
  *
1622
- * For example:
1623
- * (admin:main/session/providers)
2569
+ * Examples:
2570
+ *
2571
+ * /app(admin:main)
2572
+ *
2573
+ * /app(admin:main;state=WINDOW/dashboard)
1624
2574
  */
1625
2575
  if (tree.root.children[this.outlet]) {
1626
2576
  return;
@@ -1629,6 +2579,18 @@ class TaonDraggableButtonPanelComponent {
1629
2579
  if (!baseSegments.length) {
1630
2580
  return;
1631
2581
  }
2582
+ /**
2583
+ * Add the auxiliary outlet while preserving the current
2584
+ * primary route.
2585
+ *
2586
+ * Example:
2587
+ *
2588
+ * /app
2589
+ *
2590
+ * becomes:
2591
+ *
2592
+ * /app(admin:main)
2593
+ */
1632
2594
  await this.router.navigate([
1633
2595
  {
1634
2596
  outlets: {
@@ -1668,6 +2630,9 @@ class TaonDraggableButtonPanelComponent {
1668
2630
  void this.setState(TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED);
1669
2631
  }
1670
2632
  isDraggingEnabled() {
2633
+ if (this.forceFullScreen()) {
2634
+ return false;
2635
+ }
1671
2636
  return (this.currentState() === TaonDraggableButtonPanelState.WINDOW ||
1672
2637
  this.currentState() ===
1673
2638
  TaonDraggableButtonPanelState.FULL_SCREEN_DRAGGABLE);
@@ -1685,11 +2650,11 @@ class TaonDraggableButtonPanelComponent {
1685
2650
  return;
1686
2651
  }
1687
2652
  /**
1688
- * We store the panel state on the first segment:
2653
+ * State is stored on the first auxiliary outlet segment:
1689
2654
  *
1690
2655
  * admin:
1691
2656
  *
1692
- * main;state=WINDOW/session/providers
2657
+ * main;state=WINDOW/dashboard
1693
2658
  * └────────────────┘
1694
2659
  */
1695
2660
  const rootSegment = outletGroup.segments[0];
@@ -1701,15 +2666,14 @@ class TaonDraggableButtonPanelComponent {
1701
2666
  return;
1702
2667
  }
1703
2668
  /**
1704
- * URL restoration should NOT go through
1705
- * the transition state machine.
2669
+ * URL restoration should NOT go through the transition
2670
+ * state machine.
1706
2671
  *
1707
- * A bookmarked URL is authoritative.
2672
+ * A bookmarked/refreshed URL is authoritative.
1708
2673
  */
1709
2674
  this.currentState.set(state);
1710
2675
  /**
1711
- * Fullscreen must never inherit an old
1712
- * CdkDrag transform.
2676
+ * Fullscreen must never inherit an old CdkDrag transform.
1713
2677
  */
1714
2678
  if (state === TaonDraggableButtonPanelState.FULL_SCREEN_DRAGGABLE ||
1715
2679
  state === TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED) {
@@ -1727,15 +2691,15 @@ class TaonDraggableButtonPanelComponent {
1727
2691
  /**
1728
2692
  * The outlet might not yet exist.
1729
2693
  *
1730
- * In that case there is nowhere sensible
1731
- * to attach its matrix parameter.
2694
+ * In that case there is nowhere sensible to attach
2695
+ * its matrix parameter.
1732
2696
  */
1733
2697
  if (!outletGroup || outletGroup.segments.length === 0) {
1734
2698
  return;
1735
2699
  }
1736
2700
  const rootSegment = outletGroup.segments[0];
1737
2701
  /**
1738
- * Preserve any existing matrix params.
2702
+ * Preserve any existing matrix parameters.
1739
2703
  */
1740
2704
  rootSegment.parameters = {
1741
2705
  ...rootSegment.parameters,
@@ -1782,17 +2746,18 @@ class TaonDraggableButtonPanelComponent {
1782
2746
  return transitions[current].includes(next);
1783
2747
  }
1784
2748
  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 }); }
1785
- 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 }); }
2749
+ 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 }); }
1786
2750
  }
1787
2751
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonDraggableButtonPanelComponent, decorators: [{
1788
2752
  type: Component,
1789
2753
  args: [{ selector: 'taon-draggable-button-panel', standalone: true, imports: [
1790
2754
  CdkDrag,
1791
2755
  CdkDragHandle,
2756
+ NgIf,
1792
2757
  MatButtonModule,
1793
2758
  MatIconModule,
1794
2759
  MatTooltipModule,
1795
- ], 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"] }]
2760
+ ], 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"] }]
1796
2761
  }], ctorParameters: () => [{ type: i1.Router }], propDecorators: { drag: [{
1797
2762
  type: ViewChild,
1798
2763
  args: [CdkDrag]
@@ -1825,6 +2790,9 @@ const TaonDraggableButtonPanelRoutes = [
1825
2790
  // },
1826
2791
  ];
1827
2792
 
2793
+ ;
2794
+ // THIS FILE IS GENERATED - DO NOT MODIFY
2795
+
1828
2796
  // @ts-nocheck
1829
2797
  // This file is auto-generated during init process. Do not modify.
1830
2798
  // This disable this auto generate file.
@@ -1838,5 +2806,5 @@ var index = {};
1838
2806
  * Generated bundle index. Do not edit.
1839
2807
  */
1840
2808
 
1841
- 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 };
2809
+ 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 };
1842
2810
  //# sourceMappingURL=ui-websql.mjs.map