@taon-dev/ui 21.0.2 → 21.0.4

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 (189) hide show
  1. package/VERIFIED-BUILD-DATA.jsonc +3 -3
  2. package/browser/fesm2022/ui-browser-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs +15 -0
  3. package/browser/fesm2022/ui-browser-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs.map +1 -0
  4. package/browser/fesm2022/ui-browser-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs +15 -0
  5. package/browser/fesm2022/ui-browser-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs.map +1 -0
  6. package/browser/fesm2022/ui-browser.mjs +857 -30
  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 +213 -6
  10. package/browser-prod/fesm2022/ui-browser-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs +15 -0
  11. package/browser-prod/fesm2022/ui-browser-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs.map +1 -0
  12. package/browser-prod/fesm2022/ui-browser-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs +15 -0
  13. package/browser-prod/fesm2022/ui-browser-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs.map +1 -0
  14. package/browser-prod/fesm2022/ui-browser-prod.mjs +863 -30
  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 +209 -6
  18. package/html/app/main/routes/session/tracking/tracking.component.html +7 -4
  19. package/html/assets/generated/pwa/html-pwa.html +53 -53
  20. package/html/lib/taon-admin-layout/taon-admin-layout.component.html +8 -6
  21. package/html/lib/taon-backoffice-notifications/taon-backoffice-notifications.component.html +3 -0
  22. package/html/lib/taon-backoffice-notifications/taon-error-details-dialog.component.html +36 -0
  23. package/html/lib/taon-confirm-dialog/taon-confirm-dialog.component.html +34 -0
  24. package/html/lib/taon-datatable/taon-datatable.component.html +147 -0
  25. package/html/lib/taon-draggable-button-panel/taon-draggable-button-panel.component.html +48 -62
  26. package/lib/build-info._auto-generated_.d.ts +1 -1
  27. package/lib/build-info._auto-generated_.js +1 -1
  28. package/lib/directives/taon-horizontal-wheel-scrolling.directive.d.ts +13 -0
  29. package/lib/env/env.angular-node-app.js.map +1 -1
  30. package/lib/env/env.docs-webapp.js.map +1 -1
  31. package/lib/env/env.electron-app.js.map +1 -1
  32. package/lib/env/env.mobile-app.js.map +1 -1
  33. package/lib/env/env.npm-lib-and-cli-tool.js.map +1 -1
  34. package/lib/env/env.vscode-plugin.js.map +1 -1
  35. package/lib/index._auto-generated_.d.ts +13 -1
  36. package/lib/index._auto-generated_.js +13 -1
  37. package/lib/index._auto-generated_.js.map +1 -1
  38. package/lib/my-organization-proj.js +1 -2
  39. package/lib/my-organization-proj.js.map +1 -1
  40. package/lib/package.json +1 -1
  41. package/lib/taon-admin-layout/index.js +2 -2
  42. package/lib/taon-admin-layout/taon-admin-layout.component.d.ts +1 -0
  43. package/lib/taon-admin-layout/taon-admin-layout.models.d.ts +13 -1
  44. package/lib/taon-admin-layout/taon-admin-layout.models.js +13 -2
  45. package/lib/taon-admin-layout/taon-admin-layout.models.js.map +1 -1
  46. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.d.ts +15 -0
  47. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js +15 -0
  48. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js.map +1 -0
  49. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.d.ts +15 -0
  50. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js +15 -0
  51. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js.map +1 -0
  52. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.d.ts +4 -0
  53. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js +5 -0
  54. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js.map +1 -0
  55. package/lib/taon-backoffice-notifications/index.d.ts +4 -0
  56. package/lib/taon-backoffice-notifications/index.js +24 -0
  57. package/lib/taon-backoffice-notifications/index.js.map +1 -0
  58. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.component.d.ts +9 -0
  59. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.d.ts +11 -0
  60. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.js +3 -0
  61. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.js.map +1 -0
  62. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.service.d.ts +9 -0
  63. package/lib/taon-backoffice-notifications/taon-error-details-dialog.component.d.ts +24 -0
  64. package/lib/taon-backoffice-notifications/taon-error-toast.component.d.ts +10 -0
  65. package/lib/taon-confirm-dialog/taon-confirm-dialog.component.d.ts +12 -0
  66. package/lib/taon-confirm-dialog/taon-confirm-dialog.models.d.ts +1 -0
  67. package/lib/taon-confirm-dialog/taon-confirm-dialog.models.js +3 -0
  68. package/lib/taon-confirm-dialog/taon-confirm-dialog.models.js.map +1 -0
  69. package/lib/taon-datatable/index.d.ts +1 -0
  70. package/lib/taon-datatable/index.js +5 -0
  71. package/lib/taon-datatable/index.js.map +1 -0
  72. package/lib/taon-datatable/taon-datatable.component.d.ts +60 -0
  73. package/lib/taon-datatable/taon-datatable.models.d.ts +1 -0
  74. package/lib/taon-datatable/taon-datatable.models.js +3 -0
  75. package/lib/taon-datatable/taon-datatable.models.js.map +1 -0
  76. package/lib/taon-datatable/taon-datatable.routes.d.ts +7 -0
  77. package/lib/taon-draggable-button-panel/index.js +2 -2
  78. package/lib/taon-draggable-button-panel/taon-draggable-button-panel.component.d.ts +5 -0
  79. package/lib-esm/lib/build-info._auto-generated_.d.ts +1 -1
  80. package/lib-esm/lib/build-info._auto-generated_.js +1 -1
  81. package/lib-esm/lib/env/env.angular-node-app.js.map +1 -1
  82. package/lib-esm/lib/env/env.docs-webapp.js.map +1 -1
  83. package/lib-esm/lib/env/env.electron-app.js.map +1 -1
  84. package/lib-esm/lib/env/env.mobile-app.js.map +1 -1
  85. package/lib-esm/lib/env/env.npm-lib-and-cli-tool.js.map +1 -1
  86. package/lib-esm/lib/env/env.vscode-plugin.js.map +1 -1
  87. package/lib-esm/lib/index._auto-generated_.d.ts +4 -0
  88. package/lib-esm/lib/index._auto-generated_.js +13 -1
  89. package/lib-esm/lib/index._auto-generated_.js.map +1 -1
  90. package/lib-esm/lib/my-organization-proj.js +1 -2
  91. package/lib-esm/lib/my-organization-proj.js.map +1 -1
  92. package/lib-esm/lib/taon-admin-layout/index.d.ts +1 -1
  93. package/lib-esm/lib/taon-admin-layout/index.js +1 -1
  94. package/lib-esm/lib/taon-admin-layout/taon-admin-layout.models.d.ts +13 -1
  95. package/lib-esm/lib/taon-admin-layout/taon-admin-layout.models.js +11 -1
  96. package/lib-esm/lib/taon-admin-layout/taon-admin-layout.models.js.map +1 -1
  97. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.d.ts +15 -0
  98. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js +13 -0
  99. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js.map +1 -0
  100. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.d.ts +15 -0
  101. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js +13 -0
  102. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js.map +1 -0
  103. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.d.ts +4 -0
  104. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js +4 -0
  105. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js.map +1 -0
  106. package/lib-esm/lib/taon-backoffice-notifications/index.d.ts +1 -0
  107. package/lib-esm/lib/taon-backoffice-notifications/index.js +8 -0
  108. package/lib-esm/lib/taon-backoffice-notifications/index.js.map +1 -0
  109. package/lib-esm/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.d.ts +11 -0
  110. package/lib-esm/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.js +2 -0
  111. package/lib-esm/lib/taon-backoffice-notifications/taon-backoffice-notifications.models.js.map +1 -0
  112. package/lib-esm/lib/taon-confirm-dialog/taon-confirm-dialog.models.d.ts +1 -0
  113. package/lib-esm/lib/taon-confirm-dialog/taon-confirm-dialog.models.js +2 -0
  114. package/lib-esm/lib/taon-confirm-dialog/taon-confirm-dialog.models.js.map +1 -0
  115. package/lib-esm/lib/taon-datatable/index.d.ts +1 -0
  116. package/lib-esm/lib/taon-datatable/index.js +2 -0
  117. package/lib-esm/lib/taon-datatable/index.js.map +1 -0
  118. package/lib-esm/lib/taon-datatable/taon-datatable.models.d.ts +1 -0
  119. package/lib-esm/lib/taon-datatable/taon-datatable.models.js +2 -0
  120. package/lib-esm/lib/taon-datatable/taon-datatable.models.js.map +1 -0
  121. package/lib-esm/lib/taon-draggable-button-panel/index.d.ts +1 -1
  122. package/lib-esm/lib/taon-draggable-button-panel/index.js +1 -1
  123. package/lib-prod/build-info._auto-generated_.d.ts +1 -1
  124. package/lib-prod/build-info._auto-generated_.js +1 -1
  125. package/lib-prod/env/env.angular-node-app.js.map +1 -1
  126. package/lib-prod/env/env.docs-webapp.js.map +1 -1
  127. package/lib-prod/env/env.electron-app.js.map +1 -1
  128. package/lib-prod/env/env.mobile-app.js.map +1 -1
  129. package/lib-prod/env/env.npm-lib-and-cli-tool.js.map +1 -1
  130. package/lib-prod/env/env.vscode-plugin.js.map +1 -1
  131. package/lib-prod/index._auto-generated_.d.ts +4 -0
  132. package/lib-prod/index._auto-generated_.js +13 -1
  133. package/lib-prod/index._auto-generated_.js.map +1 -1
  134. package/lib-prod/my-organization-proj.js +1 -2
  135. package/lib-prod/my-organization-proj.js.map +1 -1
  136. package/lib-prod/package.json +1 -1
  137. package/lib-prod/taon-admin-layout/index.d.ts +1 -1
  138. package/lib-prod/taon-admin-layout/index.js +1 -1
  139. package/lib-prod/taon-admin-layout/taon-admin-layout.models.d.ts +13 -1
  140. package/lib-prod/taon-admin-layout/taon-admin-layout.models.js +11 -1
  141. package/lib-prod/taon-admin-layout/taon-admin-layout.models.js.map +1 -1
  142. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.d.ts +15 -0
  143. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js +13 -0
  144. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js.map +1 -0
  145. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.d.ts +15 -0
  146. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js +13 -0
  147. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js.map +1 -0
  148. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.d.ts +4 -0
  149. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js +4 -0
  150. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.translation.js.map +1 -0
  151. package/lib-prod/taon-backoffice-notifications/index.d.ts +1 -0
  152. package/lib-prod/taon-backoffice-notifications/index.js +8 -0
  153. package/lib-prod/taon-backoffice-notifications/index.js.map +1 -0
  154. package/lib-prod/taon-backoffice-notifications/taon-backoffice-notifications.models.d.ts +11 -0
  155. package/lib-prod/taon-backoffice-notifications/taon-backoffice-notifications.models.js +2 -0
  156. package/lib-prod/taon-backoffice-notifications/taon-backoffice-notifications.models.js.map +1 -0
  157. package/lib-prod/taon-confirm-dialog/taon-confirm-dialog.models.d.ts +0 -0
  158. package/lib-prod/taon-confirm-dialog/taon-confirm-dialog.models.js +3 -0
  159. package/lib-prod/taon-confirm-dialog/taon-confirm-dialog.models.js.map +1 -0
  160. package/lib-prod/taon-datatable/index.d.ts +1 -0
  161. package/lib-prod/taon-datatable/index.js +2 -0
  162. package/lib-prod/taon-datatable/index.js.map +1 -0
  163. package/lib-prod/taon-datatable/taon-datatable.models.d.ts +0 -0
  164. package/lib-prod/taon-datatable/taon-datatable.models.js +3 -0
  165. package/lib-prod/taon-datatable/taon-datatable.models.js.map +1 -0
  166. package/lib-prod/taon-draggable-button-panel/index.d.ts +1 -1
  167. package/lib-prod/taon-draggable-button-panel/index.js +1 -1
  168. package/package.json +1 -1
  169. package/scss/lib/taon-backoffice-notifications/taon-backoffice-notifications.component.scss +3 -0
  170. package/scss/lib/taon-backoffice-notifications/taon-error-details-dialog.component.scss +62 -0
  171. package/scss/lib/taon-confirm-dialog/taon-confirm-dialog.component.scss +3 -0
  172. package/scss/lib/taon-datatable/taon-datatable.component.scss +11 -0
  173. package/scss/lib/taon-draggable-button-panel/taon-draggable-button-panel.component.scss +3 -3
  174. package/websql/fesm2022/ui-websql-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs +15 -0
  175. package/websql/fesm2022/ui-websql-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs.map +1 -0
  176. package/websql/fesm2022/ui-websql-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs +15 -0
  177. package/websql/fesm2022/ui-websql-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs.map +1 -0
  178. package/websql/fesm2022/ui-websql.mjs +857 -30
  179. package/websql/fesm2022/ui-websql.mjs.map +1 -1
  180. package/websql/package.json +1 -1
  181. package/websql/types/ui-websql.d.ts +213 -6
  182. package/websql-prod/fesm2022/ui-websql-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs +15 -0
  183. package/websql-prod/fesm2022/ui-websql-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs.map +1 -0
  184. package/websql-prod/fesm2022/ui-websql-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs +15 -0
  185. package/websql-prod/fesm2022/ui-websql-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs.map +1 -0
  186. package/websql-prod/fesm2022/ui-websql-prod.mjs +863 -30
  187. package/websql-prod/fesm2022/ui-websql-prod.mjs.map +1 -1
  188. package/websql-prod/package.json +1 -1
  189. package/websql-prod/types/ui-websql-prod.d.ts +209 -6
@@ -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, 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 { takeUntilDestroyed } from '@angular/core/rxjs-interop';
18
+ import { Resource, getDefaultModel } from 'ng2-rest/websql';
19
+ import { HotToastRef, HotToastService } from '@ngneat/hot-toast';
20
+ import * as i1$1 from '@angular/material/dialog';
21
+ import { MAT_DIALOG_DATA, MatDialogModule, MatDialog, MatDialogRef } from '@angular/material/dialog';
17
22
  import * as i2$2 from '@angular/material/button';
18
23
  import { MatButtonModule } from '@angular/material/button';
19
- import * as i4 from '@angular/material/tooltip';
24
+ import * as i3$1 from '@angular/material/button-toggle';
25
+ import { MatButtonToggleModule } from '@angular/material/button-toggle';
26
+ import * as i1$2 from '@angular/forms';
27
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
28
+ import * as i3$2 from '@angular/material/form-field';
29
+ import { MatFormFieldModule } from '@angular/material/form-field';
30
+ import * as i5 from '@angular/material/input';
31
+ import { MatInputModule } from '@angular/material/input';
32
+ import { MatPaginatorModule } from '@angular/material/paginator';
33
+ import { MatSelectModule } from '@angular/material/select';
34
+ import * as i6 from '@ng-matero/extensions/grid';
35
+ import { MtxGridModule } from '@ng-matero/extensions/grid';
36
+ import { ClassHelpers, Symbols } from 'taon/websql';
37
+ import { CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
38
+ import * as i4$1 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.2';
905
+ const CURRENT_PACKAGE_VERSION = '21.0.4';
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
 
@@ -1477,6 +1557,9 @@ class TaonAdminLayoutComponent {
1477
1557
  label(route) {
1478
1558
  return route.data?.['menuItem'] ?? this.startCase(route.path ?? '');
1479
1559
  }
1560
+ color(route) {
1561
+ return route.data?.['color'];
1562
+ }
1480
1563
  icon(route) {
1481
1564
  return route.data?.['icon'];
1482
1565
  }
@@ -1529,7 +1612,7 @@ class TaonAdminLayoutComponent {
1529
1612
  .replace(/\b\w/g, char => char.toUpperCase());
1530
1613
  }
1531
1614
  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 }); }
1615
+ 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 [ngStyle]=\"{ color: color(level1) }\">\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span\n [class.font-semibold]=\"isLevel1Active(level1)\"\n [ngStyle]=\"{ color: color(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 [ngStyle]=\"{ color: color(level2) }\">\n {{ icon(level2) }}\n </mat-icon>\n }\n\n <span [ngStyle]=\"{ color: color(level2) }\">\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 [ngStyle]=\"{ color: color(level1) }\">\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span [ngStyle]=\"{ color: color(level1) }\">\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: 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
1616
  }
1534
1617
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonAdminLayoutComponent, decorators: [{
1535
1618
  type: Component,
@@ -1540,7 +1623,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
1540
1623
  MatExpansionModule,
1541
1624
  MatIconModule,
1542
1625
  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"] }]
1626
+ ], 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 [ngStyle]=\"{ color: color(level1) }\">\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span\n [class.font-semibold]=\"isLevel1Active(level1)\"\n [ngStyle]=\"{ color: color(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 [ngStyle]=\"{ color: color(level2) }\">\n {{ icon(level2) }}\n </mat-icon>\n }\n\n <span [ngStyle]=\"{ color: color(level2) }\">\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 [ngStyle]=\"{ color: color(level1) }\">\n {{ icon(level1) }}\n </mat-icon>\n }\n\n <span [ngStyle]=\"{ color: color(level1) }\">\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
1627
  }], ctorParameters: () => [{ type: i1.Router }], propDecorators: { routes: [{
1545
1628
  type: Input,
1546
1629
  args: [{ required: true }]
@@ -1550,8 +1633,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
1550
1633
  type: Input
1551
1634
  }] } });
1552
1635
 
1553
- function adminLazyRoutes(loader) {
1636
+ const TaonBaselineBackofficeOutletName = 'admin';
1637
+ function adminLazyRoute(options) {
1638
+ const { path, loader, menuItem, icon, color, expandable, hideInNavigation } = options;
1554
1639
  return {
1640
+ path,
1641
+ data: {
1642
+ menuItem,
1643
+ color,
1644
+ icon,
1645
+ expandable,
1646
+ hideInNavigation,
1647
+ },
1555
1648
  loadChildren: loader,
1556
1649
  loadAdminChildren: loader,
1557
1650
  };
@@ -1574,6 +1667,612 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImpor
1574
1667
  args: [RouterOutlet]
1575
1668
  }] } });
1576
1669
 
1670
+ //#region imports
1671
+ class TaonErrorDetailsDialogComponent {
1672
+ constructor() {
1673
+ //#region injections
1674
+ this.data = inject(MAT_DIALOG_DATA);
1675
+ //#endregion
1676
+ //#region constants
1677
+ this.editorStorageKey = 'taon-error-details-editor';
1678
+ //#endregion
1679
+ //#region state
1680
+ this.editor = this.loadEditor();
1681
+ this.stackLines = this.parseStackTrace(this.data.details);
1682
+ }
1683
+ //#endregion
1684
+ //#region editor
1685
+ setEditor(editor) {
1686
+ this.editor = editor;
1687
+ localStorage.setItem(this.editorStorageKey, editor);
1688
+ }
1689
+ loadEditor() {
1690
+ const editor = localStorage.getItem(this.editorStorageKey);
1691
+ if (editor === 'vscode' || editor === 'vscodium') {
1692
+ return editor;
1693
+ }
1694
+ return 'vscode';
1695
+ }
1696
+ //#endregion
1697
+ //#region stack trace
1698
+ parseStackTrace(stack) {
1699
+ return stack
1700
+ .split('\n')
1701
+ .map(text => text.trimEnd())
1702
+ .filter(text => text.trim().length > 0)
1703
+ .map(text => this.parseStackTraceLine(text));
1704
+ }
1705
+ parseStackTraceLine(text) {
1706
+ /**
1707
+ * Matches:
1708
+ *
1709
+ * /Users/test/file.ts:10:20
1710
+ *
1711
+ * C:\projects\test\file.ts:10:20
1712
+ *
1713
+ * at something (/Users/test/file.ts:10:20)
1714
+ */
1715
+ const match = text.match(/((?:[A-Za-z]:[\\/]|\/)[^()\n]+?):(\d+):(\d+)/);
1716
+ if (!match) {
1717
+ return {
1718
+ text,
1719
+ };
1720
+ }
1721
+ return {
1722
+ text,
1723
+ file: match[1],
1724
+ line: Number(match[2]),
1725
+ column: Number(match[3]),
1726
+ };
1727
+ }
1728
+ //#endregion
1729
+ //#region open editor
1730
+ openStackLine(stackLine) {
1731
+ if (!stackLine.file || !stackLine.line) {
1732
+ return;
1733
+ }
1734
+ const url = this.createEditorUrl(stackLine.file, stackLine.line, stackLine.column);
1735
+ window.location.href = url;
1736
+ }
1737
+ createEditorUrl(file, line, column) {
1738
+ const protocol = this.editor === 'vscodium' ? 'vscodium' : 'vscode';
1739
+ const location = [file, line, column]
1740
+ .filter(value => value !== undefined)
1741
+ .join(':');
1742
+ return `${protocol}://file${location}`;
1743
+ }
1744
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonErrorDetailsDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1745
+ 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: i2$2.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$1.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$1.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled", "disabledInteractive"], outputs: ["change"], exportAs: ["matButtonToggle"] }] }); }
1746
+ }
1747
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonErrorDetailsDialogComponent, decorators: [{
1748
+ type: Component,
1749
+ 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"] }]
1750
+ }] });
1751
+
1752
+ class TaonErrorToastComponent {
1753
+ constructor() {
1754
+ this.toastRef = inject(HotToastRef);
1755
+ this.dialog = inject(MatDialog);
1756
+ this.data = this.toastRef.data;
1757
+ }
1758
+ showDetails() {
1759
+ this.dialog.open(TaonErrorDetailsDialogComponent, {
1760
+ width: '800px',
1761
+ maxWidth: '95vw',
1762
+ data: {
1763
+ message: this.data.title,
1764
+ details: this.data.details,
1765
+ },
1766
+ });
1767
+ this.toastRef.close();
1768
+ }
1769
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonErrorToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1770
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.0.9", type: TaonErrorToastComponent, isStandalone: true, selector: "taon-error-toast", ngImport: i0, template: `
1771
+ <div
1772
+ class="taon-error-toast"
1773
+ (click)="showDetails()">
1774
+ <div>{{ data.title }}</div>
1775
+
1776
+ <small> Click for details </small>
1777
+ </div>
1778
+ `, isInline: true, styles: [".taon-error-toast{cursor:pointer}small{display:block;margin-top:4px;opacity:.7}\n"] }); }
1779
+ }
1780
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonErrorToastComponent, decorators: [{
1781
+ type: Component,
1782
+ args: [{ selector: 'taon-error-toast', standalone: true, template: `
1783
+ <div
1784
+ class="taon-error-toast"
1785
+ (click)="showDetails()">
1786
+ <div>{{ data.title }}</div>
1787
+
1788
+ <small> Click for details </small>
1789
+ </div>
1790
+ `, styles: [".taon-error-toast{cursor:pointer}small{display:block;margin-top:4px;opacity:.7}\n"] }]
1791
+ }] });
1792
+
1793
+ //#region imports
1794
+ //#endregion
1795
+ class TaonBackofficeNotificationsService {
1796
+ constructor() {
1797
+ //#region injections
1798
+ this.toast = inject(HotToastService);
1799
+ }
1800
+ //#endregion
1801
+ //#region private methods
1802
+ normalize(input) {
1803
+ return typeof input === 'string' ? { title: input } : input;
1804
+ }
1805
+ //#endregion
1806
+ //#region notifications
1807
+ success(input) {
1808
+ const { title } = this.normalize(input);
1809
+ return this.toast.success(title);
1810
+ }
1811
+ error(input) {
1812
+ const { title, details } = this.normalize(input);
1813
+ // Normal error - exactly as before
1814
+ if (!details) {
1815
+ return this.toast.error(title);
1816
+ }
1817
+ // Error with clickable details
1818
+ return this.toast.error(TaonErrorToastComponent, {
1819
+ data: {
1820
+ title,
1821
+ details,
1822
+ },
1823
+ });
1824
+ }
1825
+ warn(input) {
1826
+ const { title } = this.normalize(input);
1827
+ return this.toast.warning(title);
1828
+ }
1829
+ info(input) {
1830
+ const { title } = this.normalize(input);
1831
+ return this.toast.info(title);
1832
+ }
1833
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonBackofficeNotificationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
1834
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonBackofficeNotificationsService, providedIn: 'root' }); }
1835
+ }
1836
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonBackofficeNotificationsService, decorators: [{
1837
+ type: Injectable,
1838
+ args: [{
1839
+ providedIn: 'root',
1840
+ }]
1841
+ }] });
1842
+
1843
+ //#region imports
1844
+ //#endregion
1845
+ 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-uyZjV7Qx.mjs')).default, "pl-PL": async () => (await import('./ui-websql-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs')).default } });
1846
+ class TaonBackofficeNotificationsComponent {
1847
+ //#endregion
1848
+ //#region constructor
1849
+ constructor() {
1850
+ //#region injections
1851
+ this.t = t.for(this);
1852
+ this.notification = inject(TaonBackofficeNotificationsService);
1853
+ this.destroyRef = inject(DestroyRef);
1854
+ Resource.listenErrors
1855
+ .pipe(takeUntilDestroyed(this.destroyRef))
1856
+ .subscribe((error) => {
1857
+ if (_.isFunction(this.filter)) {
1858
+ error = this.filter(error);
1859
+ }
1860
+ const jsonMsg = error?.body?.json;
1861
+ if (!jsonMsg?.message) {
1862
+ console.log({ error });
1863
+ }
1864
+ this.notification.error({
1865
+ title: jsonMsg?.message || t.gettext('Unknown error'),
1866
+ details: jsonMsg?.details,
1867
+ });
1868
+ });
1869
+ }
1870
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonBackofficeNotificationsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1871
+ 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"] }); }
1872
+ }
1873
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonBackofficeNotificationsComponent, decorators: [{
1874
+ type: Component,
1875
+ args: [{ selector: 'taon-backoffice-notifications', standalone: true, template: "<!-- <p>\n notyfications works!\n</p> -->\n", styles: [":host{display:none}\n"] }]
1876
+ }], ctorParameters: () => [], propDecorators: { filter: [{
1877
+ type: Input
1878
+ }] } });
1879
+
1880
+ class TaonConfirmDialogComponent {
1881
+ constructor() {
1882
+ this.data = inject(MAT_DIALOG_DATA);
1883
+ this.dialogRef = inject((MatDialogRef));
1884
+ }
1885
+ cancel() {
1886
+ this.dialogRef.close(false);
1887
+ }
1888
+ confirm() {
1889
+ this.dialogRef.close(true);
1890
+ }
1891
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonConfirmDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1892
+ 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: i2$2.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"] }] }); }
1893
+ }
1894
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonConfirmDialogComponent, decorators: [{
1895
+ type: Component,
1896
+ 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" }]
1897
+ }] });
1898
+
1899
+ //#region imports
1900
+ //#endregion
1901
+ const defaultColumns = [
1902
+ {
1903
+ header: 'ID',
1904
+ field: 'id',
1905
+ },
1906
+ {
1907
+ header: 'NAME',
1908
+ field: 'name',
1909
+ },
1910
+ ];
1911
+ class TaonDatatableComponent {
1912
+ constructor() {
1913
+ this.cdr = inject(ChangeDetectorRef);
1914
+ this.destroyRef = inject(DestroyRef);
1915
+ //#region inputs
1916
+ this.pageNumber = 1;
1917
+ this.pageSize = 10;
1918
+ this.pageSizeOptions = [5, 10, 20, 50, 100];
1919
+ this.allowedColumns = [];
1920
+ this.columns = defaultColumns;
1921
+ this.hideSearch = false;
1922
+ this.hideAddButton = false;
1923
+ this.safe = false;
1924
+ this.searchMode = 'advanced';
1925
+ //#endregion
1926
+ //#region outputs
1927
+ this.expansionChange = new EventEmitter();
1928
+ this.addingItem = new EventEmitter();
1929
+ //#endregion
1930
+ //#region fields
1931
+ this.rows = [];
1932
+ this.totalElements = 0;
1933
+ this.isLoading = false;
1934
+ this.expandable = false;
1935
+ this.advancedSearchOpened = false;
1936
+ this.searchValue = '';
1937
+ this.columnFilters = {};
1938
+ this.reload$ = new BehaviorSubject(undefined);
1939
+ this.searchChange$ = new Subject();
1940
+ this.data$ = this.reload$.pipe(switchMap(() => this.loadData()));
1941
+ }
1942
+ set data(value) {
1943
+ this._data = value ?? undefined;
1944
+ if (this._data) {
1945
+ this.pageNumber = 1;
1946
+ this.reload();
1947
+ }
1948
+ }
1949
+ get data() {
1950
+ return this._data;
1951
+ }
1952
+ get offlineMode() {
1953
+ return this.data !== undefined;
1954
+ }
1955
+ //#endregion
1956
+ //#region getters
1957
+ get entity() {
1958
+ return this.entityCrudController?.entityClassResolveFn();
1959
+ }
1960
+ get filterableColumns() {
1961
+ return this.columns.filter(column => Boolean(column.field));
1962
+ }
1963
+ //#endregion
1964
+ //#region init
1965
+ ngOnInit() {
1966
+ this.prepareColumns();
1967
+ // console.log({ columns: this.columns });
1968
+ this.expandable = Boolean(this.expansionTemplate);
1969
+ this.showPaginator = _.isBoolean(this.showPaginator)
1970
+ ? this.showPaginator
1971
+ : Boolean(this.entity) || this.offlineMode;
1972
+ this.searchChange$
1973
+ .pipe(debounceTime(400), distinctUntilChanged(), tap(search => {
1974
+ this.searchValue = search;
1975
+ this.pageNumber = 1;
1976
+ this.reload();
1977
+ }), takeUntilDestroyed(this.destroyRef))
1978
+ .subscribe();
1979
+ this.data$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(rows => {
1980
+ this.rows = rows;
1981
+ this.cdr.markForCheck();
1982
+ });
1983
+ }
1984
+ //#endregion
1985
+ //#region search
1986
+ searchChanged(value) {
1987
+ this.searchChange$.next(value);
1988
+ }
1989
+ clearSearch() {
1990
+ this.searchValue = '';
1991
+ this.columnFilters = {};
1992
+ this.pageNumber = 1;
1993
+ this.reload();
1994
+ }
1995
+ applyAdvancedFilters() {
1996
+ this.pageNumber = 1;
1997
+ this.reload();
1998
+ }
1999
+ toggleAdvancedSearch() {
2000
+ this.advancedSearchOpened = !this.advancedSearchOpened;
2001
+ }
2002
+ //#endregion
2003
+ //#region pagination
2004
+ getNextPage(event) {
2005
+ this.pageNumber = event.pageIndex + 1;
2006
+ this.pageSize = event.pageSize;
2007
+ this.reload();
2008
+ }
2009
+ //#endregion
2010
+ //#region sorting
2011
+ sortChanged(event) {
2012
+ const field = event?.active ?? event?.field;
2013
+ const direction = event?.direction ?? '';
2014
+ this.sort = {
2015
+ field,
2016
+ direction,
2017
+ };
2018
+ this.pageNumber = 1;
2019
+ this.reload();
2020
+ }
2021
+ //#endregion
2022
+ //#region data
2023
+ reload() {
2024
+ this.reload$.next();
2025
+ }
2026
+ getFieldValue(row, field) {
2027
+ return field.split('.').reduce((value, key) => value?.[key], row);
2028
+ }
2029
+ loadOfflineData() {
2030
+ let rows = [...(this.data ?? [])];
2031
+ //#region global search
2032
+ const search = this.searchValue.trim().toLowerCase();
2033
+ if (search) {
2034
+ rows = rows.filter(row => this.columns.some(column => {
2035
+ if (!column.field) {
2036
+ return false;
2037
+ }
2038
+ const value = this.getFieldValue(row, String(column.field));
2039
+ return String(value ?? '')
2040
+ .toLowerCase()
2041
+ .includes(search);
2042
+ }));
2043
+ }
2044
+ //#endregion
2045
+ //#region column filters
2046
+ const filters = this.cleanFilters(this.columnFilters);
2047
+ for (const [field, filterValue] of Object.entries(filters)) {
2048
+ const normalizedFilter = filterValue.toLowerCase();
2049
+ rows = rows.filter(row => {
2050
+ const value = this.getFieldValue(row, field);
2051
+ return String(value ?? '')
2052
+ .toLowerCase()
2053
+ .includes(normalizedFilter);
2054
+ });
2055
+ }
2056
+ //#endregion
2057
+ //#region sorting
2058
+ if (this.sort?.field && this.sort.direction) {
2059
+ const field = String(this.sort.field);
2060
+ const direction = this.sort.direction === 'desc' ? -1 : 1;
2061
+ rows.sort((a, b) => {
2062
+ const aValue = this.getFieldValue(a, field);
2063
+ const bValue = this.getFieldValue(b, field);
2064
+ if (aValue === bValue) {
2065
+ return 0;
2066
+ }
2067
+ if (aValue === undefined || aValue === null) {
2068
+ return -1 * direction;
2069
+ }
2070
+ if (bValue === undefined || bValue === null) {
2071
+ return 1 * direction;
2072
+ }
2073
+ if (typeof aValue === 'number' && typeof bValue === 'number') {
2074
+ return (aValue - bValue) * direction;
2075
+ }
2076
+ return (String(aValue).localeCompare(String(bValue), undefined, {
2077
+ numeric: true,
2078
+ sensitivity: 'base',
2079
+ }) * direction);
2080
+ });
2081
+ }
2082
+ //#endregion
2083
+ //#region pagination
2084
+ this.totalElements = rows.length;
2085
+ const start = (this.pageNumber - 1) * this.pageSize;
2086
+ const end = start + this.pageSize;
2087
+ return this.prepareRows(rows.slice(start, end));
2088
+ //#endregion
2089
+ }
2090
+ loadData() {
2091
+ if (this.offlineMode) {
2092
+ return of(this.loadOfflineData());
2093
+ }
2094
+ if (!this.entity || !this.entityCrudController) {
2095
+ this.totalElements = 0;
2096
+ return of([]);
2097
+ }
2098
+ this.isLoading = true;
2099
+ this.cdr.markForCheck();
2100
+ const query = {
2101
+ pageNumber: this.pageNumber,
2102
+ pageSize: this.pageSize,
2103
+ search: this.searchValue,
2104
+ filters: this.cleanFilters(this.columnFilters),
2105
+ sort: this.sort,
2106
+ callQueryMethod: this.callQueryMethod,
2107
+ };
2108
+ //#region handle info when not allowed method on controller level
2109
+ if (!this.safe && !this.entityCrudController.paginationQuery(query)) {
2110
+ throw new Error(`Please enable paginationQuery() method in your
2111
+ controller ${ClassHelpers.getName(this.entityCrudController)}
2112
+
2113
+ @Controller({ allowedMethods: ['paginationQuery'] })
2114
+ class ${ClassHelpers.getName(this.entityCrudController)} ..
2115
+ `);
2116
+ }
2117
+ if (this.safe && !this.entityCrudController.paginationQuerySafe(query)) {
2118
+ throw new Error(`Please enable paginationQuerySafe() method in your controller
2119
+ ${ClassHelpers.getName(this.entityCrudController)}
2120
+
2121
+ @Controller({ allowedMethods: ['paginationQuerySafe'] })
2122
+ class ${ClassHelpers.getName(this.entityCrudController)} ..
2123
+ `);
2124
+ }
2125
+ //#endregion
2126
+ return from((this.safe
2127
+ ? this.entityCrudController.paginationQuerySafe
2128
+ : this.entityCrudController.paginationQuery)(query).request()
2129
+ .observable).pipe(tap(response => {
2130
+ this.totalElements =
2131
+ Number(response.headers.get(Symbols.old.X_TOTAL_COUNT)) || 0;
2132
+ }), map(response => this.prepareRows(response.body.json)), catchError(error => {
2133
+ console.error(`[taon-datatable] Unable to load data from ` +
2134
+ `${ClassHelpers.getName(this.entityCrudController)} ${this.safe ? 'paginationQuerySafe' : 'paginationQuery'}`, error);
2135
+ return of([]);
2136
+ }), finalize(() => {
2137
+ this.isLoading = false;
2138
+ this.cdr.markForCheck();
2139
+ }));
2140
+ }
2141
+ //#endregion
2142
+ //#region helpers
2143
+ cleanFilters(filters) {
2144
+ return Object.fromEntries(Object.entries(filters)
2145
+ .filter(([, value]) => value !== undefined &&
2146
+ value !== null &&
2147
+ String(value).trim() !== '')
2148
+ .map(([key, value]) => [key, String(value).trim()]));
2149
+ }
2150
+ prepareRows(rows) {
2151
+ return rows.map(row => {
2152
+ // const result = {
2153
+ // ...row,
2154
+ // };
2155
+ // for (const key of Object.keys(result)) {
2156
+ // if (_.isObject(result[key])) {
2157
+ // result[key] = json5.stringify(result[key]);
2158
+ // }
2159
+ // }
2160
+ return row;
2161
+ });
2162
+ }
2163
+ prepareColumns() {
2164
+ const entityClass = this.entity;
2165
+ if (!entityClass) {
2166
+ return;
2167
+ }
2168
+ const usingDefaultColumns = _.isEqual(this.columns, defaultColumns);
2169
+ if (!usingDefaultColumns) {
2170
+ return;
2171
+ }
2172
+ try {
2173
+ const props = Object.keys(getDefaultModel(entityClass) || {});
2174
+ let columns = props
2175
+ .filter(prop => this.allowedColumns.length > 0
2176
+ ? this.allowedColumns.includes(prop)
2177
+ : true)
2178
+ .map(prop => ({
2179
+ header: _.upperCase(prop),
2180
+ field: prop,
2181
+ }));
2182
+ const extra = this.allowedColumns.filter(field => !props.includes(field));
2183
+ columns = [
2184
+ ...columns,
2185
+ ...extra.map(field => ({
2186
+ header: _.upperCase(field),
2187
+ field,
2188
+ })),
2189
+ ];
2190
+ this.columns = columns;
2191
+ }
2192
+ catch (error) {
2193
+ console.error('[taon-datatable] Unable to generate columns', error);
2194
+ }
2195
+ }
2196
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonDatatableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2197
+ 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 <!-- 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\n <!-- 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\n <!-- 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]=\"expansionTemplate\"\n [length]=\"totalElements\"\n [pageOnFront]=\"false\"\n [pageIndex]=\"pageNumber - 1\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showPaginator]=\"showPaginator\"\n (expansionChange)=\"expansionChange.emit($event)\"\n (page)=\"getNextPage($event)\"\n (sortChange)=\"sortChanged($event)\">\n </mtx-grid>\n </div>\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: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$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: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$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: i2$2.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: i2$2.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3$2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3$2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3$2.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i3$2.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: i5.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: i6.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 }); }
2198
+ }
2199
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonDatatableComponent, decorators: [{
2200
+ type: Component,
2201
+ args: [{ selector: 'taon-datatable', standalone: true, imports: [
2202
+ CommonModule,
2203
+ FormsModule,
2204
+ ReactiveFormsModule,
2205
+ MatButtonModule,
2206
+ MatFormFieldModule,
2207
+ MatIconModule,
2208
+ MatInputModule,
2209
+ MatPaginatorModule,
2210
+ MatSelectModule,
2211
+ MtxGridModule,
2212
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex w-full flex-col gap-3\">\n <!-- 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\n <!-- 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\n <!-- 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]=\"expansionTemplate\"\n [length]=\"totalElements\"\n [pageOnFront]=\"false\"\n [pageIndex]=\"pageNumber - 1\"\n [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\"\n [showPaginator]=\"showPaginator\"\n (expansionChange)=\"expansionChange.emit($event)\"\n (page)=\"getNextPage($event)\"\n (sortChange)=\"sortChanged($event)\">\n </mtx-grid>\n </div>\n</div>\n", styles: [":host{display:block;width:100%;min-height:250px}:host ::ng-deep .mat-mdc-form-field{margin:0}\n"] }]
2213
+ }], propDecorators: { pageNumber: [{
2214
+ type: Input
2215
+ }], pageSize: [{
2216
+ type: Input
2217
+ }], pageSizeOptions: [{
2218
+ type: Input
2219
+ }], allowedColumns: [{
2220
+ type: Input
2221
+ }], expansionTemplate: [{
2222
+ type: Input
2223
+ }], entityCrudController: [{
2224
+ type: Input
2225
+ }], columns: [{
2226
+ type: Input
2227
+ }], hideSearch: [{
2228
+ type: Input
2229
+ }], hideAddButton: [{
2230
+ type: Input
2231
+ }], safe: [{
2232
+ type: Input
2233
+ }], searchMode: [{
2234
+ type: Input
2235
+ }], callQueryMethod: [{
2236
+ type: Input
2237
+ }], data: [{
2238
+ type: Input
2239
+ }], expansionChange: [{
2240
+ type: Output
2241
+ }], addingItem: [{
2242
+ type: Output
2243
+ }], showPaginator: [{
2244
+ type: Input
2245
+ }] } });
2246
+
2247
+ var taonDatatable_component = /*#__PURE__*/Object.freeze({
2248
+ __proto__: null,
2249
+ TaonDatatableComponent: TaonDatatableComponent
2250
+ });
2251
+
2252
+ //#endregion
2253
+ const TaonDatatableRoutes = [
2254
+ {
2255
+ path: '',
2256
+ loadComponent: () => Promise.resolve().then(function () { return taonDatatable_component; }).then(m => m.TaonDatatableComponent),
2257
+ children: [
2258
+ // adminLazyRoute({
2259
+ // path: 'dashboard',
2260
+ // menuItem: 'Dashboard',
2261
+ // icon: 'dashboard',
2262
+ // expandable: false,
2263
+ // loader: () =>
2264
+ // import('./anothermodule.routes').then(m => m.DashboardRoutes),
2265
+ // }),
2266
+ ],
2267
+ },
2268
+ ];
2269
+ /**
2270
+ * By default exporting TaonDatatableRoutes,
2271
+ * the command `taon generate:app:routes`
2272
+ * will automatically add them to the root routes in ./src/app.ts.
2273
+ */
2274
+ // export default TaonDatatableRoutes;
2275
+
1577
2276
  var TaonDraggableButtonPanelState;
1578
2277
  (function (TaonDraggableButtonPanelState) {
1579
2278
  TaonDraggableButtonPanelState["CLICKABLE_BUTTON"] = "CLICKABLE_BUTTON";
@@ -1582,6 +2281,8 @@ var TaonDraggableButtonPanelState;
1582
2281
  TaonDraggableButtonPanelState["FULL_SCREEN_LOCKED"] = "FULL_SCREEN_LOCKED";
1583
2282
  })(TaonDraggableButtonPanelState || (TaonDraggableButtonPanelState = {}));
1584
2283
 
2284
+ //#region imports
2285
+ //#endregion
1585
2286
  class TaonDraggableButtonPanelComponent {
1586
2287
  set state(state) {
1587
2288
  this.currentState.set(state);
@@ -1597,11 +2298,60 @@ class TaonDraggableButtonPanelComponent {
1597
2298
  */
1598
2299
  this.stateParamName = 'state';
1599
2300
  this.stateChange = new EventEmitter();
2301
+ this.forceFullScreen = signal(window.innerWidth < 900, ...(ngDevMode ? [{ debugName: "forceFullScreen" }] : []));
2302
+ this.resizeListener = () => {
2303
+ const wasForceFullScreen = this.forceFullScreen();
2304
+ const forceFullScreen = window.innerWidth < 900;
2305
+ this.forceFullScreen.set(forceFullScreen);
2306
+ // Desktop -> mobile: remove old CDK drag x/y transform.
2307
+ if (!wasForceFullScreen && forceFullScreen) {
2308
+ this.resetDragPosition();
2309
+ }
2310
+ };
1600
2311
  this.currentState = signal(TaonDraggableButtonPanelState.CLICKABLE_BUTTON, ...(ngDevMode ? [{ debugName: "currentState" }] : []));
1601
2312
  }
1602
2313
  async ngOnInit() {
2314
+ window.addEventListener('resize', this.resizeListener);
2315
+ /**
2316
+ * IMPORTANT:
2317
+ *
2318
+ * The component may be created while Angular is still processing
2319
+ * the application's initial navigation.
2320
+ *
2321
+ * For example:
2322
+ *
2323
+ * / -> redirectTo: /app
2324
+ *
2325
+ * If we create:
2326
+ *
2327
+ * (admin:main)
2328
+ *
2329
+ * before that redirect finishes, the auxiliary outlet navigation
2330
+ * may effectively replace/interfere with the primary navigation,
2331
+ * producing:
2332
+ *
2333
+ * /(admin:main)
2334
+ *
2335
+ * instead of:
2336
+ *
2337
+ * /app(admin:main)
2338
+ */
2339
+ await this.waitForInitialNavigation();
2340
+ /**
2341
+ * Ensure the auxiliary outlet exists only AFTER the primary
2342
+ * application route has settled.
2343
+ */
1603
2344
  await this.ensureOutletBasePath();
2345
+ /**
2346
+ * The outlet may already contain persisted state, e.g.
2347
+ *
2348
+ * (admin:main;state=WINDOW/dashboard)
2349
+ */
1604
2350
  this.restoreStateFromUrl();
2351
+ /**
2352
+ * From this point on keep the component state synchronized
2353
+ * with subsequent router navigations.
2354
+ */
1605
2355
  this.routerSubscription = this.router.events
1606
2356
  .pipe(filter(event => event instanceof NavigationEnd))
1607
2357
  .subscribe(() => {
@@ -1609,18 +2359,77 @@ class TaonDraggableButtonPanelComponent {
1609
2359
  });
1610
2360
  }
1611
2361
  ngOnDestroy() {
2362
+ window.removeEventListener('resize', this.resizeListener);
1612
2363
  this.routerSubscription?.unsubscribe();
1613
2364
  }
2365
+ toogleFullscreen(event) {
2366
+ event.stopImmediatePropagation();
2367
+ event.stopPropagation();
2368
+ event.preventDefault();
2369
+ if (this.forceFullScreen()) {
2370
+ return;
2371
+ }
2372
+ if (this.currentState() === TaonDraggableButtonPanelState.WINDOW) {
2373
+ this.resetDragPosition();
2374
+ void this.setState(TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED);
2375
+ }
2376
+ else if ([
2377
+ TaonDraggableButtonPanelState.FULL_SCREEN_DRAGGABLE,
2378
+ TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED,
2379
+ ].includes(this.currentState())) {
2380
+ this.resetDragPosition();
2381
+ void this.setState(TaonDraggableButtonPanelState.WINDOW);
2382
+ }
2383
+ }
2384
+ effectiveState() {
2385
+ if (this.forceFullScreen() &&
2386
+ this.currentState() !== TaonDraggableButtonPanelState.CLICKABLE_BUTTON) {
2387
+ return TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED;
2388
+ }
2389
+ return this.currentState();
2390
+ }
2391
+ // ===========================================================================
2392
+ // INITIAL ROUTING
2393
+ // ===========================================================================
2394
+ async waitForInitialNavigation() {
2395
+ /**
2396
+ * Router already completed at least one navigation.
2397
+ */
2398
+ if (this.router.navigated) {
2399
+ return;
2400
+ }
2401
+ /**
2402
+ * Wait until redirects/lazy routing/etc. belonging to the initial
2403
+ * navigation have settled.
2404
+ */
2405
+ await firstValueFrom(this.router.events.pipe(filter(event => event instanceof NavigationEnd), take(1)));
2406
+ }
1614
2407
  async ensureOutletBasePath() {
1615
2408
  if (!this.outlet || !this.basePath) {
1616
2409
  return;
1617
2410
  }
2411
+ /**
2412
+ * IMPORTANT:
2413
+ *
2414
+ * Parse the URL only AFTER initial navigation has completed.
2415
+ *
2416
+ * At this point:
2417
+ *
2418
+ * /
2419
+ *
2420
+ * may already have become:
2421
+ *
2422
+ * /app
2423
+ */
1618
2424
  const tree = this.router.parseUrl(this.router.url);
1619
2425
  /**
1620
- * Outlet already exists — don't touch it.
2426
+ * Outlet already exists — preserve it exactly as it is.
1621
2427
  *
1622
- * For example:
1623
- * (admin:main/session/providers)
2428
+ * Examples:
2429
+ *
2430
+ * /app(admin:main)
2431
+ *
2432
+ * /app(admin:main;state=WINDOW/dashboard)
1624
2433
  */
1625
2434
  if (tree.root.children[this.outlet]) {
1626
2435
  return;
@@ -1629,6 +2438,18 @@ class TaonDraggableButtonPanelComponent {
1629
2438
  if (!baseSegments.length) {
1630
2439
  return;
1631
2440
  }
2441
+ /**
2442
+ * Add the auxiliary outlet while preserving the current
2443
+ * primary route.
2444
+ *
2445
+ * Example:
2446
+ *
2447
+ * /app
2448
+ *
2449
+ * becomes:
2450
+ *
2451
+ * /app(admin:main)
2452
+ */
1632
2453
  await this.router.navigate([
1633
2454
  {
1634
2455
  outlets: {
@@ -1668,6 +2489,9 @@ class TaonDraggableButtonPanelComponent {
1668
2489
  void this.setState(TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED);
1669
2490
  }
1670
2491
  isDraggingEnabled() {
2492
+ if (this.forceFullScreen()) {
2493
+ return false;
2494
+ }
1671
2495
  return (this.currentState() === TaonDraggableButtonPanelState.WINDOW ||
1672
2496
  this.currentState() ===
1673
2497
  TaonDraggableButtonPanelState.FULL_SCREEN_DRAGGABLE);
@@ -1685,11 +2509,11 @@ class TaonDraggableButtonPanelComponent {
1685
2509
  return;
1686
2510
  }
1687
2511
  /**
1688
- * We store the panel state on the first segment:
2512
+ * State is stored on the first auxiliary outlet segment:
1689
2513
  *
1690
2514
  * admin:
1691
2515
  *
1692
- * main;state=WINDOW/session/providers
2516
+ * main;state=WINDOW/dashboard
1693
2517
  * └────────────────┘
1694
2518
  */
1695
2519
  const rootSegment = outletGroup.segments[0];
@@ -1701,15 +2525,14 @@ class TaonDraggableButtonPanelComponent {
1701
2525
  return;
1702
2526
  }
1703
2527
  /**
1704
- * URL restoration should NOT go through
1705
- * the transition state machine.
2528
+ * URL restoration should NOT go through the transition
2529
+ * state machine.
1706
2530
  *
1707
- * A bookmarked URL is authoritative.
2531
+ * A bookmarked/refreshed URL is authoritative.
1708
2532
  */
1709
2533
  this.currentState.set(state);
1710
2534
  /**
1711
- * Fullscreen must never inherit an old
1712
- * CdkDrag transform.
2535
+ * Fullscreen must never inherit an old CdkDrag transform.
1713
2536
  */
1714
2537
  if (state === TaonDraggableButtonPanelState.FULL_SCREEN_DRAGGABLE ||
1715
2538
  state === TaonDraggableButtonPanelState.FULL_SCREEN_LOCKED) {
@@ -1727,15 +2550,15 @@ class TaonDraggableButtonPanelComponent {
1727
2550
  /**
1728
2551
  * The outlet might not yet exist.
1729
2552
  *
1730
- * In that case there is nowhere sensible
1731
- * to attach its matrix parameter.
2553
+ * In that case there is nowhere sensible to attach
2554
+ * its matrix parameter.
1732
2555
  */
1733
2556
  if (!outletGroup || outletGroup.segments.length === 0) {
1734
2557
  return;
1735
2558
  }
1736
2559
  const rootSegment = outletGroup.segments[0];
1737
2560
  /**
1738
- * Preserve any existing matrix params.
2561
+ * Preserve any existing matrix parameters.
1739
2562
  */
1740
2563
  rootSegment.parameters = {
1741
2564
  ...rootSegment.parameters,
@@ -1782,17 +2605,18 @@ class TaonDraggableButtonPanelComponent {
1782
2605
  return transitions[current].includes(next);
1783
2606
  }
1784
2607
  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 }); }
2608
+ 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-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: 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: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4$1.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1786
2609
  }
1787
2610
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.9", ngImport: i0, type: TaonDraggableButtonPanelComponent, decorators: [{
1788
2611
  type: Component,
1789
2612
  args: [{ selector: 'taon-draggable-button-panel', standalone: true, imports: [
1790
2613
  CdkDrag,
1791
2614
  CdkDragHandle,
2615
+ NgIf,
1792
2616
  MatButtonModule,
1793
2617
  MatIconModule,
1794
2618
  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"] }]
2619
+ ], 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-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
2620
  }], ctorParameters: () => [{ type: i1.Router }], propDecorators: { drag: [{
1797
2621
  type: ViewChild,
1798
2622
  args: [CdkDrag]
@@ -1825,6 +2649,9 @@ const TaonDraggableButtonPanelRoutes = [
1825
2649
  // },
1826
2650
  ];
1827
2651
 
2652
+ ;
2653
+ // THIS FILE IS GENERATED - DO NOT MODIFY
2654
+
1828
2655
  // @ts-nocheck
1829
2656
  // This file is auto-generated during init process. Do not modify.
1830
2657
  // This disable this auto generate file.
@@ -1838,5 +2665,5 @@ var index = {};
1838
2665
  * Generated bundle index. Do not edit.
1839
2666
  */
1840
2667
 
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 };
2668
+ 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
2669
  //# sourceMappingURL=ui-websql.mjs.map