@taon-dev/ui 21.0.4 → 21.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) 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 → ui-browser-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs} +2 -2
  3. package/browser/fesm2022/{ui-browser-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs.map → ui-browser-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs.map} +1 -1
  4. package/browser/fesm2022/{ui-browser-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs → ui-browser-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs} +2 -2
  5. package/browser/fesm2022/{ui-browser-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs.map → ui-browser-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs.map} +1 -1
  6. package/browser/fesm2022/ui-browser.mjs +289 -148
  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 +42 -35
  10. package/browser-prod/fesm2022/{ui-browser-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs → ui-browser-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs} +2 -2
  11. package/browser-prod/fesm2022/{ui-browser-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs.map → ui-browser-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs.map} +1 -1
  12. package/browser-prod/fesm2022/{ui-browser-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs → ui-browser-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs} +2 -2
  13. package/browser-prod/fesm2022/{ui-browser-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs.map → ui-browser-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs.map} +1 -1
  14. package/browser-prod/fesm2022/ui-browser-prod.mjs +290 -149
  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 +42 -35
  18. package/html/app/main/main.container.html +6 -0
  19. package/html/lib/taon-admin-layout/taon-admin-layout.component.html +72 -57
  20. package/html/lib/taon-datatable/taon-datatable.component.html +19 -5
  21. package/html/lib/taon-draggable-button-panel/taon-draggable-button-panel.component.html +1 -0
  22. package/lib/build-info._auto-generated_.d.ts +1 -1
  23. package/lib/build-info._auto-generated_.js +1 -1
  24. package/lib/package.json +1 -1
  25. package/lib/taon-admin-layout/index.js +2 -2
  26. package/lib/taon-admin-layout/taon-admin-layout.component.d.ts +35 -32
  27. package/lib/taon-admin-layout/taon-admin-layout.models.d.ts +1 -1
  28. package/lib/taon-admin-layout/taon-admin-layout.models.js.map +1 -1
  29. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js +1 -1
  30. package/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js +1 -1
  31. package/lib/taon-backoffice-notifications/taon-backoffice-notifications.component.d.ts +1 -0
  32. package/lib/taon-datatable/index.js +2 -2
  33. package/lib/taon-datatable/taon-datatable.component.d.ts +3 -0
  34. package/lib/taon-draggable-button-panel/index.js +2 -2
  35. package/lib-esm/lib/build-info._auto-generated_.d.ts +1 -1
  36. package/lib-esm/lib/build-info._auto-generated_.js +1 -1
  37. package/lib-esm/lib/taon-admin-layout/index.d.ts +1 -1
  38. package/lib-esm/lib/taon-admin-layout/index.js +1 -1
  39. package/lib-esm/lib/taon-admin-layout/taon-admin-layout.models.d.ts +1 -1
  40. package/lib-esm/lib/taon-admin-layout/taon-admin-layout.models.js.map +1 -1
  41. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js +1 -1
  42. package/lib-esm/lib/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js +1 -1
  43. package/lib-esm/lib/taon-datatable/index.d.ts +1 -1
  44. package/lib-esm/lib/taon-datatable/index.js +1 -1
  45. package/lib-esm/lib/taon-draggable-button-panel/index.d.ts +1 -1
  46. package/lib-esm/lib/taon-draggable-button-panel/index.js +1 -1
  47. package/lib-prod/build-info._auto-generated_.d.ts +1 -1
  48. package/lib-prod/build-info._auto-generated_.js +1 -1
  49. package/lib-prod/package.json +1 -1
  50. package/lib-prod/taon-admin-layout/index.d.ts +1 -1
  51. package/lib-prod/taon-admin-layout/index.js +1 -1
  52. package/lib-prod/taon-admin-layout/taon-admin-layout.models.d.ts +1 -1
  53. package/lib-prod/taon-admin-layout/taon-admin-layout.models.js.map +1 -1
  54. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.en-US.i18n.data.js +1 -1
  55. package/lib-prod/taon-backoffice-notifications/i18n/taon-backoffice-notifications.component.ts.pl-PL.i18n.data.js +1 -1
  56. package/lib-prod/taon-datatable/index.d.ts +1 -1
  57. package/lib-prod/taon-datatable/index.js +1 -1
  58. package/lib-prod/taon-draggable-button-panel/index.d.ts +1 -1
  59. package/lib-prod/taon-draggable-button-panel/index.js +1 -1
  60. package/package.json +1 -1
  61. package/scss/lib/taon-admin-layout/taon-admin-layout.component.scss +282 -26
  62. package/websql/fesm2022/{ui-websql-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs → ui-websql-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs} +2 -2
  63. package/websql/fesm2022/{ui-websql-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs.map → ui-websql-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs.map} +1 -1
  64. package/websql/fesm2022/{ui-websql-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs → ui-websql-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs} +2 -2
  65. package/websql/fesm2022/{ui-websql-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs.map → ui-websql-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs.map} +1 -1
  66. package/websql/fesm2022/ui-websql.mjs +289 -148
  67. package/websql/fesm2022/ui-websql.mjs.map +1 -1
  68. package/websql/package.json +1 -1
  69. package/websql/types/ui-websql.d.ts +42 -35
  70. package/websql-prod/fesm2022/{ui-websql-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs → ui-websql-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs} +2 -2
  71. package/websql-prod/fesm2022/{ui-websql-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-uyZjV7Qx.mjs.map → ui-websql-prod-taon-backoffice-notifications.component.ts.en-US.i18n.data-DdHr5V8R.mjs.map} +1 -1
  72. package/websql-prod/fesm2022/{ui-websql-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs → ui-websql-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs} +2 -2
  73. package/websql-prod/fesm2022/{ui-websql-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-s0tK5HDk.mjs.map → ui-websql-prod-taon-backoffice-notifications.component.ts.pl-PL.i18n.data-CD5ZqDCD.mjs.map} +1 -1
  74. package/websql-prod/fesm2022/ui-websql-prod.mjs +290 -149
  75. package/websql-prod/fesm2022/ui-websql-prod.mjs.map +1 -1
  76. package/websql-prod/package.json +1 -1
  77. package/websql-prod/types/ui-websql-prod.d.ts +42 -35
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@taon-dev/ui/browser-prod",
3
- "version": "21.0.4",
3
+ "version": "21.0.5",
4
4
  "peerDependencies": {
5
5
  "@angular/common": "^21.0.0",
6
6
  "@angular/core": "^21.0.0"
@@ -1,6 +1,6 @@
1
1
  // @ts-nocheck
2
2
  import * as i0 from '@angular/core';
3
- import { AfterViewInit, OnDestroy, OnInit, TemplateRef, EventEmitter } from '@angular/core';
3
+ import { AfterViewInit, OnDestroy, OnInit, ElementRef, TemplateRef, EventEmitter } from '@angular/core';
4
4
  import { CoreModels__NS__DeepPartial } from 'tnp-core/browser-prod';
5
5
  import { Routes, Route, Router, RouterOutlet } from '@angular/router';
6
6
  import { Translation } from '@taon-dev/i18n/browser-prod';
@@ -448,7 +448,7 @@ declare const CURRENT_PACKAGE_TAON_VERSION = "v21";
448
448
  /**
449
449
  * Autogenerated by current cli tool. Use *tnp release* to bump version.
450
450
  */
451
- declare const CURRENT_PACKAGE_VERSION = "21.0.4";
451
+ declare const CURRENT_PACKAGE_VERSION = "21.0.5";
452
452
 
453
453
  declare function myOrgProj(): void;
454
454
 
@@ -492,69 +492,72 @@ interface PlPlTraslationOverrideSrcLibMyOrganizationProjTs {
492
492
 
493
493
  type LibOverride = CoreModels__NS__DeepPartial<EnUsTraslationOverrideSrcLibMyOrganizationProjTs | PlPlTraslationOverrideSrcLibMyOrganizationProjTs>;
494
494
 
495
- declare class TaonAdminLayoutComponent implements OnInit {
495
+ declare class TaonAdminLayoutComponent implements OnInit, AfterViewInit, OnDestroy {
496
496
  private readonly router;
497
+ private readonly hostElement;
497
498
  routes: Routes;
498
499
  basePath: string;
499
500
  outlet: string;
500
- /**
501
- * Children discovered for each level-1 route.
502
- *
503
- * Session -> [Tracking, Providers]
504
- * Users -> [Manager]
505
- */
501
+ protected readonly layoutWidth: i0.WritableSignal<number>;
502
+ protected readonly layoutHeight: i0.WritableSignal<number>;
506
503
  protected readonly level2Routes: i0.WritableSignal<Map<Route, Routes>>;
507
504
  protected readonly currentUrl: i0.WritableSignal<string>;
508
505
  protected readonly loadingRoutes: i0.WritableSignal<Set<Route>>;
509
506
  protected readonly asideOpened: i0.WritableSignal<boolean>;
507
+ private resizeObserver?;
508
+ private mutationObserver?;
509
+ private resizing;
510
+ private resizeStartX;
511
+ private resizeStartY;
512
+ private resizeStartWidth;
513
+ private resizeStartHeight;
514
+ private readonly minDialogWidth;
515
+ private readonly minDialogHeight;
516
+ protected get isDialogMode(): boolean;
510
517
  private get basePathSegments();
511
- constructor(router: Router);
518
+ protected get normalizedBasePath(): string;
519
+ constructor(router: Router, hostElement: ElementRef<HTMLElement>);
520
+ ngOnInit(): Promise<void>;
521
+ ngAfterViewInit(): void;
522
+ ngOnDestroy(): void;
523
+ private getWindowElement;
524
+ private getDraggablePanelElement;
525
+ private startWindowObservers;
526
+ private windowModeChanged;
527
+ private clearWindowResize;
528
+ protected windowResized(): void;
529
+ private updateLayoutSize;
530
+ protected startResize(event: PointerEvent): void;
531
+ private readonly resize;
532
+ private readonly stopResize;
512
533
  protected toggleAside(): void;
513
534
  protected closeAside(): void;
514
- ngOnInit(): Promise<void>;
515
- protected level1Clicked(route: Route): Promise<void>;
516
- protected level2Clicked(level1: Route, level2: Route): Promise<void>;
517
- private outletBaseMatrixParams;
518
- private navigateTo;
519
535
  private closeAsideOnMobile;
536
+ protected level1Clicked(route: Route): Promise<void>;
520
537
  protected panelExpanded(route: Route, expanded: boolean): Promise<void>;
521
538
  protected isLevel1Active(route: Route): boolean;
539
+ protected level2Clicked(level1: Route, level2: Route): Promise<void>;
522
540
  protected getLevel2Routes(route: Route): Routes;
523
541
  protected isLevel2Active(level1: Route, level2: Route): boolean;
524
542
  protected level2Link(level1: Route, level2: Route): string[];
543
+ private outletBaseMatrixParams;
544
+ private navigateTo;
525
545
  private ensureLevel2Loaded;
526
546
  private loadRouteChildren;
527
- /**
528
- * Removes structural path:'' wrappers.
529
- *
530
- * [
531
- * {
532
- * path: '',
533
- * component: SessionComponent,
534
- * children: [...]
535
- * }
536
- * ]
537
- *
538
- * becomes:
539
- *
540
- * [...]
541
- */
542
547
  private unwrapEmptyPathRoutes;
543
548
  private loadCurrentLevel1Route;
544
549
  protected label(route: Route): string;
545
550
  protected color(route: Route): string;
546
551
  protected icon(route: Route): string | undefined;
547
552
  protected isLoading(route: Route): boolean;
553
+ protected isExpandable(route: Route): boolean;
548
554
  private isPathActive;
549
555
  private currentRelativeSegments;
550
556
  private currentOutletSegments;
551
- protected isExpandable(route: Route): boolean;
552
- protected get normalizedBasePath(): string;
553
- private cleanUrl;
554
557
  private setLoading;
555
558
  private startCase;
556
559
  static ɵfac: i0.ɵɵFactoryDeclaration<TaonAdminLayoutComponent, never>;
557
- static ɵcmp: i0.ɵɵComponentDeclaration<TaonAdminLayoutComponent, "taon-admin-layout", never, { "routes": { "alias": "routes"; "required": true; }; "basePath": { "alias": "basePath"; "required": false; }; "outlet": { "alias": "outlet"; "required": false; }; }, {}, never, ["[header]", "[asideFooter]"], true, never>;
560
+ static ɵcmp: i0.ɵɵComponentDeclaration<TaonAdminLayoutComponent, "taon-admin-layout", never, { "routes": { "alias": "routes"; "required": true; }; "basePath": { "alias": "basePath"; "required": false; }; "outlet": { "alias": "outlet"; "required": false; }; }, {}, never, ["[header]", "[asideFooter]", "[contentFooter]"], true, never>;
558
561
  }
559
562
 
560
563
  interface TaonAdminRoute extends Route {
@@ -566,7 +569,7 @@ interface TaonAdminRoute extends Route {
566
569
  loadAdminChildren?: () => Promise<TaonAdminRoutes>;
567
570
  }
568
571
  type TaonAdminRoutes = TaonAdminRoute[];
569
- type MaterialIcon = 'manage_accounts' | 'dashboard' | 'home' | 'settings' | 'admin_panel_settings' | 'person' | 'people' | 'group' | 'groups' | 'account_circle' | 'login' | 'logout' | 'lock' | 'lock_open' | 'security' | 'key' | 'verified_user' | 'shield' | 'email' | 'mail' | 'inbox' | 'send' | 'campaign' | 'notifications' | 'article' | 'description' | 'edit' | 'add' | 'delete' | 'delete_forever' | 'restore_from_trash' | 'content_copy' | 'save' | 'search' | 'filter_list' | 'refresh' | 'sync' | 'more_vert' | 'more_horiz' | 'menu' | 'close' | 'check' | 'done' | 'warning' | 'error' | 'info' | 'help' | 'visibility' | 'visibility_off' | 'folder' | 'folder_open' | 'upload' | 'download' | 'cloud' | 'cloud_upload' | 'storage' | 'database' | 'dns' | 'code' | 'terminal' | 'api' | 'extension' | 'web' | 'language' | 'public' | 'link' | 'shopping_cart' | 'shopping_bag' | 'store' | 'inventory' | 'inventory_2' | 'payments' | 'payment' | 'credit_card' | 'receipt' | 'receipt_long' | 'sell' | 'local_shipping' | 'analytics' | 'bar_chart' | 'pie_chart' | 'query_stats' | 'monitoring' | 'trending_up' | 'history' | 'schedule' | 'calendar_month' | 'build' | 'tune' | 'apps' | 'widgets' | 'category' | 'supervisor_account' | 'approval' | 'family_group' | 'recent_actors';
572
+ type MaterialIcon = 'manage_accounts' | 'dashboard' | 'home' | 'settings' | 'admin_panel_settings' | 'person' | 'people' | 'group' | 'groups' | 'account_circle' | 'login' | 'logout' | 'lock' | 'lock_open' | 'security' | 'key' | 'verified_user' | 'shield' | 'email' | 'mail' | 'inbox' | 'send' | 'campaign' | 'notifications' | 'article' | 'description' | 'edit' | 'add' | 'delete' | 'delete_forever' | 'restore_from_trash' | 'content_copy' | 'save' | 'search' | 'filter_list' | 'refresh' | 'sync' | 'more_vert' | 'more_horiz' | 'menu' | 'close' | 'check' | 'done' | 'warning' | 'error' | 'info' | 'help' | 'visibility' | 'visibility_off' | 'folder' | 'folder_open' | 'upload' | 'download' | 'cloud' | 'cloud_upload' | 'storage' | 'database' | 'dns' | 'code' | 'terminal' | 'api' | 'extension' | 'web' | 'language' | 'public' | 'link' | 'shopping_cart' | 'shopping_bag' | 'store' | 'inventory' | 'inventory_2' | 'payments' | 'payment' | 'credit_card' | 'receipt' | 'receipt_long' | 'sell' | 'local_shipping' | 'analytics' | 'bar_chart' | 'pie_chart' | 'query_stats' | 'monitoring' | 'trending_up' | 'history' | 'schedule' | 'calendar_month' | 'build' | 'tune' | 'apps' | 'widgets' | 'category' | 'supervisor_account' | 'approval' | 'family_group' | 'recent_actors' | 'perm_media';
570
573
  interface TaonAdminRouteOptions {
571
574
  path: string;
572
575
  color?: string;
@@ -657,6 +660,7 @@ declare class TaonBackofficeNotificationsComponent {
657
660
  t: Translation;
658
661
  private readonly notification;
659
662
  private readonly destroyRef;
663
+ private readonly taonAdminService;
660
664
  filter: (err: HttpResponseError<RestErrorResponseWrapper>) => HttpResponseError<RestErrorResponseWrapper>;
661
665
  constructor();
662
666
  static ɵfac: i0.ɵɵFactoryDeclaration<TaonBackofficeNotificationsComponent, never>;
@@ -777,8 +781,11 @@ declare class TaonDatatableComponent implements OnInit {
777
781
  private readonly reload$;
778
782
  private readonly searchChange$;
779
783
  readonly data$: Observable<any[]>;
784
+ expandedRows: Set<any>;
780
785
  get entity(): typeof TaonBaseEntity | undefined;
781
786
  get filterableColumns(): MtxGridColumn[];
787
+ onExpansionChange(event: any): void;
788
+ isExpanded(row: any): boolean;
782
789
  ngOnInit(): void;
783
790
  searchChanged(value: string): void;
784
791
  clearSearch(): void;
@@ -15,4 +15,10 @@
15
15
  class="text-xs text-gray-500">
16
16
  Taon Admin v1.0
17
17
  </div>
18
+
19
+ <div
20
+ contentFooter
21
+ class="text-xs text-gray-500">
22
+ Conetn footer Admin v1.0
23
+ </div>
18
24
  </taon-admin-layout>
@@ -1,21 +1,24 @@
1
- <div class="flex h-dvh min-h-0 flex-col overflow-hidden">
1
+ <div
2
+ #layout
3
+ class="admin-layout"
4
+ [class.admin-layout-dialog]="isDialogMode"
5
+ [style.width.px]="layoutWidth() || null"
6
+ [style.height.px]="layoutHeight() || null">
2
7
  <!-- ============================================================= -->
3
8
  <!-- HEADER -->
4
9
  <!-- ============================================================= -->
5
10
 
6
- <header
7
- class="flex h-16 shrink-0 items-center border-b border-gray-200 bg-white">
8
- <!-- hamburger ALWAYS visible -->
11
+ <header class="admin-header">
9
12
  <button
10
13
  mat-icon-button
11
14
  type="button"
12
15
  aria-label="Toggle admin menu"
13
- class="mx-2 shrink-0 cursor-pointer"
16
+ class="admin-menu-button"
14
17
  (click)="toggleAside()">
15
18
  <mat-icon>menu</mat-icon>
16
19
  </button>
17
20
 
18
- <div class="min-w-0 flex-1">
21
+ <div class="admin-header-content">
19
22
  <ng-content select="[header]" />
20
23
  </div>
21
24
  </header>
@@ -24,14 +27,14 @@
24
27
  <!-- BODY -->
25
28
  <!-- ============================================================= -->
26
29
 
27
- <div class="relative flex min-h-0 flex-1 overflow-hidden">
30
+ <div class="admin-body">
28
31
  <!-- =========================================================== -->
29
32
  <!-- MOBILE BACKDROP -->
30
33
  <!-- =========================================================== -->
31
34
 
32
35
  @if (asideOpened()) {
33
36
  <div
34
- class="absolute inset-0 z-20 bg-black/30 md:hidden"
37
+ class="admin-aside-backdrop"
35
38
  (click)="closeAside()"></div>
36
39
  }
37
40
 
@@ -40,76 +43,69 @@
40
43
  <!-- =========================================================== -->
41
44
 
42
45
  <aside
43
- 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"
44
- [class.w-72]="asideOpened()"
45
- [class.-translate-x-full]="!asideOpened()"
46
- [class.translate-x-0]="asideOpened()"
47
- [class.md:w-72]="asideOpened()"
48
- [class.md:w-0]="!asideOpened()"
49
- [class.md:overflow-hidden]="!asideOpened()">
46
+ class="admin-aside"
47
+ [class.admin-aside-open]="asideOpened()">
50
48
  <!-- ========================================================= -->
51
49
  <!-- SCROLLABLE ASIDE CONTENT -->
52
50
  <!-- ========================================================= -->
53
51
 
54
- <div class="min-h-0 flex-1 overflow-y-auto">
52
+ <div class="admin-aside-content">
55
53
  <mat-accordion class="admin-menu">
56
54
  @for (level1 of routes; track level1.path) {
57
- <!-- =================================================== -->
58
- <!-- EXPANDABLE LEVEL 1 -->
59
- <!-- =================================================== -->
60
-
61
55
  @if (isExpandable(level1)) {
62
56
  <mat-expansion-panel
63
57
  [expanded]="isLevel1Active(level1)"
64
58
  (expandedChange)="panelExpanded(level1, $event)">
65
- <!-- ================================================= -->
66
- <!-- LEVEL 1 -->
67
- <!-- ================================================= -->
68
-
69
59
  <mat-expansion-panel-header (click)="level1Clicked(level1)">
70
60
  <mat-panel-title>
71
- <div class="flex items-center gap-3">
61
+ <div class="admin-menu-item">
72
62
  @if (icon(level1)) {
73
- <mat-icon [ngStyle]="{ color: color(level1) }">
63
+ <mat-icon
64
+ [ngStyle]="{
65
+ color: color(level1),
66
+ }">
74
67
  {{ icon(level1) }}
75
68
  </mat-icon>
76
69
  }
77
70
 
78
71
  <span
79
72
  [class.font-semibold]="isLevel1Active(level1)"
80
- [ngStyle]="{ color: color(level1) }">
73
+ [ngStyle]="{
74
+ color: color(level1),
75
+ }">
81
76
  {{ label(level1) }}
82
77
  </span>
83
78
  </div>
84
79
  </mat-panel-title>
85
80
  </mat-expansion-panel-header>
86
81
 
87
- <!-- ================================================= -->
88
- <!-- LEVEL 2 -->
89
- <!-- ================================================= -->
90
-
91
- <div class="flex flex-col">
82
+ <div class="admin-level2">
92
83
  @if (isLoading(level1)) {
93
- <div class="px-4 py-2 text-sm text-gray-400">
94
- Loading...
95
- </div>
84
+ <div class="admin-loading">Loading...</div>
96
85
  } @else {
97
86
  @for (
98
87
  level2 of getLevel2Routes(level1);
99
88
  track level2.path
100
89
  ) {
101
90
  <a
102
- (click)="level2Clicked(level1, level2)"
103
- class="flex cursor-pointer items-center gap-3 px-6 py-2.5 text-sm transition-colors hover:bg-gray-100"
104
- [class.bg-gray-100]="isLevel2Active(level1, level2)"
105
- [class.font-semibold]="isLevel2Active(level1, level2)">
91
+ class="admin-level2-item"
92
+ [class.admin-level2-item-active]="
93
+ isLevel2Active(level1, level2)
94
+ "
95
+ (click)="level2Clicked(level1, level2)">
106
96
  @if (icon(level2)) {
107
- <mat-icon [ngStyle]="{ color: color(level2) }">
97
+ <mat-icon
98
+ [ngStyle]="{
99
+ color: color(level2),
100
+ }">
108
101
  {{ icon(level2) }}
109
102
  </mat-icon>
110
103
  }
111
104
 
112
- <span [ngStyle]="{ color: color(level2) }">
105
+ <span
106
+ [ngStyle]="{
107
+ color: color(level2),
108
+ }">
113
109
  {{ label(level2) }}
114
110
  </span>
115
111
  </a>
@@ -118,22 +114,23 @@
118
114
  </div>
119
115
  </mat-expansion-panel>
120
116
  } @else {
121
- <!-- ================================================= -->
122
- <!-- NON-EXPANDABLE LEVEL 1 -->
123
- <!-- ================================================= -->
124
-
125
117
  <a
126
- (click)="level1Clicked(level1)"
127
- class="flex h-14 cursor-pointer items-center gap-3 px-6 transition-colors hover:bg-gray-100"
128
- [class.bg-gray-100]="isLevel1Active(level1)"
129
- [class.font-semibold]="isLevel1Active(level1)">
118
+ class="admin-level1-item"
119
+ [class.admin-level1-item-active]="isLevel1Active(level1)"
120
+ (click)="level1Clicked(level1)">
130
121
  @if (icon(level1)) {
131
- <mat-icon [ngStyle]="{ color: color(level1) }">
122
+ <mat-icon
123
+ [ngStyle]="{
124
+ color: color(level1),
125
+ }">
132
126
  {{ icon(level1) }}
133
127
  </mat-icon>
134
128
  }
135
129
 
136
- <span [ngStyle]="{ color: color(level1) }">
130
+ <span
131
+ [ngStyle]="{
132
+ color: color(level1),
133
+ }">
137
134
  {{ label(level1) }}
138
135
  </span>
139
136
  </a>
@@ -143,10 +140,10 @@
143
140
  </div>
144
141
 
145
142
  <!-- ========================================================= -->
146
- <!-- ASIDE FOOTER - ALWAYS VISIBLE -->
143
+ <!-- ASIDE FOOTER -->
147
144
  <!-- ========================================================= -->
148
145
 
149
- <footer class="shrink-0 border-t border-gray-200 bg-white p-3">
146
+ <footer class="admin-aside-footer">
150
147
  <ng-content select="[asideFooter]" />
151
148
  </footer>
152
149
  </aside>
@@ -155,24 +152,42 @@
155
152
  <!-- MAIN -->
156
153
  <!-- =========================================================== -->
157
154
 
158
- <main class="flex min-h-0 min-w-0 flex-1 flex-col overflow-hidden">
155
+ <main class="admin-main">
159
156
  <!-- ========================================================= -->
160
157
  <!-- LEVEL 3+ TABS -->
161
158
  <!-- ========================================================= -->
162
159
 
163
160
  <taon-admin-page-tabs
164
- class="shrink-0"
161
+ class="admin-tabs"
165
162
  [routes]="routes"
166
163
  [basePath]="basePath"
167
164
  [outlet]="outlet" />
168
165
 
169
166
  <!-- ========================================================= -->
170
- <!-- ROUTER CONTENT -->
167
+ <!-- SCROLLABLE CONTENT -->
171
168
  <!-- ========================================================= -->
172
169
 
173
- <div class="min-h-0 flex-1 overflow-y-auto p-4 md:p-6">
170
+ <div class="admin-content">
174
171
  <router-outlet />
175
172
  </div>
173
+
174
+ <!-- ========================================================= -->
175
+ <!-- CONTENT FOOTER -->
176
+ <!-- ========================================================= -->
177
+
178
+ <footer class="admin-content-footer">
179
+ <ng-content select="[contentFooter]" />
180
+ </footer>
176
181
  </main>
177
182
  </div>
183
+
184
+ <!-- ============================================================= -->
185
+ <!-- DIALOG RESIZE HANDLE -->
186
+ <!-- ============================================================= -->
187
+
188
+ @if (isDialogMode) {
189
+ <div
190
+ class="admin-resize-handle"
191
+ (pointerdown)="startResize($event)"></div>
192
+ }
178
193
  </div>
@@ -1,5 +1,5 @@
1
1
  <div class="flex w-full flex-col gap-3">
2
- <!-- toolbar -->
2
+ <!-- #region toolbar -->
3
3
  @if (!hideSearch) {
4
4
  <div
5
5
  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">
@@ -68,8 +68,9 @@
68
68
  }
69
69
  </div>
70
70
  }
71
+ <!-- #endregion -->
71
72
 
72
- <!-- advanced filters -->
73
+ <!-- #region advanced filters -->
73
74
  @if (!hideSearch && searchMode === 'advanced' && advancedSearchOpened) {
74
75
  <div
75
76
  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">
@@ -112,8 +113,9 @@
112
113
  </div>
113
114
  </div>
114
115
  }
116
+ <!-- #endregion -->
115
117
 
116
- <!-- grid -->
118
+ <!-- #region grid -->
117
119
  <div
118
120
  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">
119
121
  @if (isLoading) {
@@ -132,16 +134,28 @@
132
134
  [data]="rows"
133
135
  [columns]="columns"
134
136
  [expandable]="expandable"
135
- [expansionTemplate]="expansionTemplate"
137
+ [expansionTemplate]="lazyExpansionTemplate"
136
138
  [length]="totalElements"
137
139
  [pageOnFront]="false"
138
140
  [pageIndex]="pageNumber - 1"
139
141
  [pageSize]="pageSize"
140
142
  [pageSizeOptions]="pageSizeOptions"
141
143
  [showPaginator]="showPaginator"
142
- (expansionChange)="expansionChange.emit($event)"
144
+ (expansionChange)="onExpansionChange($event)"
143
145
  (page)="getNextPage($event)"
144
146
  (sortChange)="sortChanged($event)">
145
147
  </mtx-grid>
148
+
149
+ <ng-template
150
+ #lazyExpansionTemplate
151
+ let-row>
152
+ @if (isExpanded(row)) {
153
+ <ng-container
154
+ [ngTemplateOutlet]="expansionTemplate"
155
+ [ngTemplateOutletContext]="{ $implicit: row }">
156
+ </ng-container>
157
+ }
158
+ </ng-template>
146
159
  </div>
160
+ <!-- #endregion -->
147
161
  </div>
@@ -17,6 +17,7 @@
17
17
  [cdkDragDisabled]="!isDraggingEnabled()"
18
18
  class="taon-draggable-panel"
19
19
  [class.taon-window]="effectiveState() === State.WINDOW"
20
+ [class.taon-window-full]="effectiveState() !== State.WINDOW"
20
21
  [class.taon-fullscreen]="
21
22
  effectiveState() === State.FULL_SCREEN_DRAGGABLE ||
22
23
  effectiveState() === State.FULL_SCREEN_LOCKED
@@ -21,4 +21,4 @@ export declare const CURRENT_PACKAGE_TAON_VERSION = "v21";
21
21
  /**
22
22
  * Autogenerated by current cli tool. Use *tnp release* to bump version.
23
23
  */
24
- export declare const CURRENT_PACKAGE_VERSION = "21.0.4";
24
+ export declare const CURRENT_PACKAGE_VERSION = "21.0.5";
@@ -25,6 +25,6 @@ exports.CURRENT_PACKAGE_TAON_VERSION = 'v21';
25
25
  /**
26
26
  * Autogenerated by current cli tool. Use *tnp release* to bump version.
27
27
  */
28
- exports.CURRENT_PACKAGE_VERSION = '21.0.4';
28
+ exports.CURRENT_PACKAGE_VERSION = '21.0.5';
29
29
  // THIS FILE IS GENERATED - DO NOT MODIFY
30
30
  //# sourceMappingURL=build-info._auto-generated_.js.map
package/lib/package.json CHANGED
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "name": "@taon-dev/ui/lib",
3
- "version": "21.0.4"
3
+ "version": "21.0.5"
4
4
  }
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dummy1790536668255 = dummy1790536668255;
4
- function dummy1790536668255() { }
3
+ exports.dummy1791556646453 = dummy1791556646453;
4
+ function dummy1791556646453() { }
5
5
  //# sourceMappingURL=index.js.map
@@ -1,64 +1,67 @@
1
- import { OnInit } from '@angular/core';
1
+ import { AfterViewInit, ElementRef, OnDestroy, OnInit } from '@angular/core';
2
2
  import { Route, Router, Routes } from '@angular/router';
3
- export declare class TaonAdminLayoutComponent implements OnInit {
3
+ export declare class TaonAdminLayoutComponent implements OnInit, AfterViewInit, OnDestroy {
4
4
  private readonly router;
5
+ private readonly hostElement;
5
6
  routes: Routes;
6
7
  basePath: string;
7
8
  outlet: string;
8
- /**
9
- * Children discovered for each level-1 route.
10
- *
11
- * Session -> [Tracking, Providers]
12
- * Users -> [Manager]
13
- */
9
+ protected readonly layoutWidth: import("@angular/core", { with: { "resolution-mode": "import" } }).WritableSignal<number>;
10
+ protected readonly layoutHeight: import("@angular/core", { with: { "resolution-mode": "import" } }).WritableSignal<number>;
14
11
  protected readonly level2Routes: import("@angular/core", { with: { "resolution-mode": "import" } }).WritableSignal<Map<Route, Routes>>;
15
12
  protected readonly currentUrl: import("@angular/core", { with: { "resolution-mode": "import" } }).WritableSignal<string>;
16
13
  protected readonly loadingRoutes: import("@angular/core", { with: { "resolution-mode": "import" } }).WritableSignal<Set<Route>>;
17
14
  protected readonly asideOpened: import("@angular/core", { with: { "resolution-mode": "import" } }).WritableSignal<boolean>;
15
+ private resizeObserver?;
16
+ private mutationObserver?;
17
+ private resizing;
18
+ private resizeStartX;
19
+ private resizeStartY;
20
+ private resizeStartWidth;
21
+ private resizeStartHeight;
22
+ private readonly minDialogWidth;
23
+ private readonly minDialogHeight;
24
+ protected get isDialogMode(): boolean;
18
25
  private get basePathSegments();
19
- constructor(router: Router);
26
+ protected get normalizedBasePath(): string;
27
+ constructor(router: Router, hostElement: ElementRef<HTMLElement>);
28
+ ngOnInit(): Promise<void>;
29
+ ngAfterViewInit(): void;
30
+ ngOnDestroy(): void;
31
+ private getWindowElement;
32
+ private getDraggablePanelElement;
33
+ private startWindowObservers;
34
+ private windowModeChanged;
35
+ private clearWindowResize;
36
+ protected windowResized(): void;
37
+ private updateLayoutSize;
38
+ protected startResize(event: PointerEvent): void;
39
+ private readonly resize;
40
+ private readonly stopResize;
20
41
  protected toggleAside(): void;
21
42
  protected closeAside(): void;
22
- ngOnInit(): Promise<void>;
23
- protected level1Clicked(route: Route): Promise<void>;
24
- protected level2Clicked(level1: Route, level2: Route): Promise<void>;
25
- private outletBaseMatrixParams;
26
- private navigateTo;
27
43
  private closeAsideOnMobile;
44
+ protected level1Clicked(route: Route): Promise<void>;
28
45
  protected panelExpanded(route: Route, expanded: boolean): Promise<void>;
29
46
  protected isLevel1Active(route: Route): boolean;
47
+ protected level2Clicked(level1: Route, level2: Route): Promise<void>;
30
48
  protected getLevel2Routes(route: Route): Routes;
31
49
  protected isLevel2Active(level1: Route, level2: Route): boolean;
32
50
  protected level2Link(level1: Route, level2: Route): string[];
51
+ private outletBaseMatrixParams;
52
+ private navigateTo;
33
53
  private ensureLevel2Loaded;
34
54
  private loadRouteChildren;
35
- /**
36
- * Removes structural path:'' wrappers.
37
- *
38
- * [
39
- * {
40
- * path: '',
41
- * component: SessionComponent,
42
- * children: [...]
43
- * }
44
- * ]
45
- *
46
- * becomes:
47
- *
48
- * [...]
49
- */
50
55
  private unwrapEmptyPathRoutes;
51
56
  private loadCurrentLevel1Route;
52
57
  protected label(route: Route): string;
53
58
  protected color(route: Route): string;
54
59
  protected icon(route: Route): string | undefined;
55
60
  protected isLoading(route: Route): boolean;
61
+ protected isExpandable(route: Route): boolean;
56
62
  private isPathActive;
57
63
  private currentRelativeSegments;
58
64
  private currentOutletSegments;
59
- protected isExpandable(route: Route): boolean;
60
- protected get normalizedBasePath(): string;
61
- private cleanUrl;
62
65
  private setLoading;
63
66
  private startCase;
64
67
  }
@@ -8,7 +8,7 @@ export interface TaonAdminRoute extends Route {
8
8
  loadAdminChildren?: () => Promise<TaonAdminRoutes>;
9
9
  }
10
10
  export type TaonAdminRoutes = TaonAdminRoute[];
11
- type MaterialIcon = 'manage_accounts' | 'dashboard' | 'home' | 'settings' | 'admin_panel_settings' | 'person' | 'people' | 'group' | 'groups' | 'account_circle' | 'login' | 'logout' | 'lock' | 'lock_open' | 'security' | 'key' | 'verified_user' | 'shield' | 'email' | 'mail' | 'inbox' | 'send' | 'campaign' | 'notifications' | 'article' | 'description' | 'edit' | 'add' | 'delete' | 'delete_forever' | 'restore_from_trash' | 'content_copy' | 'save' | 'search' | 'filter_list' | 'refresh' | 'sync' | 'more_vert' | 'more_horiz' | 'menu' | 'close' | 'check' | 'done' | 'warning' | 'error' | 'info' | 'help' | 'visibility' | 'visibility_off' | 'folder' | 'folder_open' | 'upload' | 'download' | 'cloud' | 'cloud_upload' | 'storage' | 'database' | 'dns' | 'code' | 'terminal' | 'api' | 'extension' | 'web' | 'language' | 'public' | 'link' | 'shopping_cart' | 'shopping_bag' | 'store' | 'inventory' | 'inventory_2' | 'payments' | 'payment' | 'credit_card' | 'receipt' | 'receipt_long' | 'sell' | 'local_shipping' | 'analytics' | 'bar_chart' | 'pie_chart' | 'query_stats' | 'monitoring' | 'trending_up' | 'history' | 'schedule' | 'calendar_month' | 'build' | 'tune' | 'apps' | 'widgets' | 'category' | 'supervisor_account' | 'approval' | 'family_group' | 'recent_actors';
11
+ type MaterialIcon = 'manage_accounts' | 'dashboard' | 'home' | 'settings' | 'admin_panel_settings' | 'person' | 'people' | 'group' | 'groups' | 'account_circle' | 'login' | 'logout' | 'lock' | 'lock_open' | 'security' | 'key' | 'verified_user' | 'shield' | 'email' | 'mail' | 'inbox' | 'send' | 'campaign' | 'notifications' | 'article' | 'description' | 'edit' | 'add' | 'delete' | 'delete_forever' | 'restore_from_trash' | 'content_copy' | 'save' | 'search' | 'filter_list' | 'refresh' | 'sync' | 'more_vert' | 'more_horiz' | 'menu' | 'close' | 'check' | 'done' | 'warning' | 'error' | 'info' | 'help' | 'visibility' | 'visibility_off' | 'folder' | 'folder_open' | 'upload' | 'download' | 'cloud' | 'cloud_upload' | 'storage' | 'database' | 'dns' | 'code' | 'terminal' | 'api' | 'extension' | 'web' | 'language' | 'public' | 'link' | 'shopping_cart' | 'shopping_bag' | 'store' | 'inventory' | 'inventory_2' | 'payments' | 'payment' | 'credit_card' | 'receipt' | 'receipt_long' | 'sell' | 'local_shipping' | 'analytics' | 'bar_chart' | 'pie_chart' | 'query_stats' | 'monitoring' | 'trending_up' | 'history' | 'schedule' | 'calendar_month' | 'build' | 'tune' | 'apps' | 'widgets' | 'category' | 'supervisor_account' | 'approval' | 'family_group' | 'recent_actors' | 'perm_media';
12
12
  export interface TaonAdminRouteOptions {
13
13
  path: string;
14
14
  color?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"taon-admin-layout.models.js","sourceRoot":"","sources":[""],"names":[],"mappings":";;;AA+HA,wCAkBC;AApBY,QAAA,gCAAgC,GAAG,OAAO,CAAC;AAExD,SAAgB,cAAc,CAAC,OAA8B;IAC3D,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,GACzE,OAAO,CAAC;IAEV,OAAO;QACL,IAAI;QAEJ,IAAI,EAAE;YACJ,QAAQ;YACR,KAAK;YACL,IAAI;YACJ,UAAU;YACV,gBAAgB;SACjB;QAED,YAAY,EAAE,MAAM;QACpB,iBAAiB,EAAE,MAAM;KAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"taon-admin-layout.models.js","sourceRoot":"","sources":[""],"names":[],"mappings":";;;AAgIA,wCAkBC;AApBY,QAAA,gCAAgC,GAAG,OAAO,CAAC;AAExD,SAAgB,cAAc,CAAC,OAA8B;IAC3D,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,GACzE,OAAO,CAAC;IAEV,OAAO;QACL,IAAI;QAEJ,IAAI,EAAE;YACJ,QAAQ;YACR,KAAK;YACL,IAAI;YACJ,UAAU;YACV,gBAAgB;SACjB;QAED,YAAY,EAAE,MAAM;QACpB,iBAAiB,EAAE,MAAM;KAC1B,CAAC;AACJ,CAAC"}
@@ -7,7 +7,7 @@ exports.default = {
7
7
  "tags": [
8
8
  {
9
9
  "gettextString": "Unknown error",
10
- "lineNumber": 54
10
+ "lineNumber": 64
11
11
  }
12
12
  ]
13
13
  };