structra-ui 0.2.30 → 0.2.32

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.
@@ -9,6 +9,7 @@ import { ICellRendererParams, ColDef, GetRowIdParams, GridReadyEvent } from 'ag-
9
9
  import { ICellRendererAngularComp } from 'ag-grid-angular';
10
10
  import { DialogRef } from '@angular/cdk/dialog';
11
11
  import { Observable } from 'rxjs';
12
+ import * as i1 from '@angular/cdk/scrolling';
12
13
 
13
14
  /** Marcador de pacote publicado como `structra-ui`. */
14
15
  declare const STRUCTRA_UI: "structra-ui";
@@ -172,6 +173,11 @@ interface MenuItemGroup<T = string> {
172
173
  label?: string;
173
174
  /** Itens e submenus aninhados dentro do grupo. */
174
175
  items: readonly MenuNodeItem<T>[];
176
+ /**
177
+ * Se `true`, o grupo não recolhe e não mostra controlo de expandir — útil para a secção principal
178
+ * em relação a grupos secundários colapsáveis.
179
+ */
180
+ alwaysExpanded?: boolean;
175
181
  }
176
182
  /** Folha: ação ou divisor. */
177
183
  type MenuLeafItem<T = string> = MenuItemAction<T> | MenuItemDivider;
@@ -3060,18 +3066,25 @@ interface MenuRowAction<T = string> {
3060
3066
  item: MenuItemAction<T>;
3061
3067
  /** Índice na navegação por teclado; `null` se desabilitado. */
3062
3068
  focusIndex: number | null;
3069
+ /** `null` = fora de grupo; caso contrário, pertence a este grupo (oculto se o grupo estiver fechado). */
3070
+ containingGroupId?: number | null;
3063
3071
  }
3064
3072
  interface MenuRowDivider {
3065
3073
  kind: 'divider';
3074
+ containingGroupId?: number | null;
3066
3075
  }
3067
3076
  interface MenuRowGroup {
3068
3077
  kind: 'group';
3069
3078
  label?: string;
3079
+ groupId: number;
3080
+ /** Eco de {@link MenuItemGroup.alwaysExpanded}. */
3081
+ alwaysExpanded?: boolean;
3070
3082
  }
3071
3083
  interface MenuRowSubmenu<T = string> {
3072
3084
  kind: 'submenu';
3073
3085
  item: MenuItemSubmenu<T>;
3074
3086
  focusIndex: number | null;
3087
+ containingGroupId?: number | null;
3075
3088
  }
3076
3089
  type MenuRow<T = string> = MenuRowAction<T> | MenuRowDivider | MenuRowGroup | MenuRowSubmenu<T>;
3077
3090
 
@@ -3096,11 +3109,31 @@ declare class MenuListComponent<T = string> implements OnChanges {
3096
3109
  * Oculta rótulos e descrições (ex.: sidebar colapsada), mantendo ícones; define `title` nativo para hover.
3097
3110
  */
3098
3111
  compressText: boolean;
3112
+ /**
3113
+ * Submenus (`kind: 'submenu'`):
3114
+ * - **`true` (omissão)** — abre/fecha **por clique** (e teclado); **não** abre ao passar o rato.
3115
+ * - **`false`** — igual ao comportamento anterior: abre **só com hover** (com atraso), sem alternar ao clicar na linha.
3116
+ */
3117
+ clickToOpen: boolean;
3118
+ /**
3119
+ * Grupos (`kind: 'group'`): quando `false`, cabeçalhos sem seta e itens sempre visíveis (não recolhe).
3120
+ */
3121
+ groupCollapsible: boolean;
3122
+ /**
3123
+ * Com {@link groupCollapsible}: estado inicial ao receber `items`.
3124
+ * - `'all'` — todos os grupos expandidos (omissão).
3125
+ * - `'first'` — só o primeiro grupo expandível fica aberto; os restantes recolhidos.
3126
+ */
3127
+ groupDefaultExpansion: 'all' | 'first';
3099
3128
  readonly itemSelect: EventEmitter<T>;
3100
3129
  readonly closeRequest: EventEmitter<void>;
3101
3130
  readonly submenuBack: EventEmitter<void>;
3102
3131
  private nestedLists?;
3103
3132
  rows: MenuRow<T>[];
3133
+ /** Filtrado + índices de foco coerentes com grupos recolhidos. */
3134
+ displayRows: MenuRow<T>[];
3135
+ /** Ids de grupo expandidos; ao mudar `items`, todos voltam a abertos. */
3136
+ private readonly expandedGroupIds;
3104
3137
  private focusableCount;
3105
3138
  /** Índice entre `0` e `focusableCount - 1`, ou `-1` = nenhum realce. */
3106
3139
  activeIndex: number;
@@ -3114,11 +3147,26 @@ declare class MenuListComponent<T = string> implements OnChanges {
3114
3147
  }>;
3115
3148
  overlayPanelClasses(): string[];
3116
3149
  onNestedItemSelect(id: T): void;
3150
+ /** Identidade estável para `@for` — `track $index` quebra quando linhas são omitidas por grupo recolhido. */
3151
+ trackDisplayRow(index: number, row: MenuRow<T>): string;
3117
3152
  ngOnChanges(changes: SimpleChanges): void;
3153
+ /** Estado inicial de grupos expandidos (chaveado por {@link groupDefaultExpansion}). */
3154
+ private applyInitialExpandedGroups;
3155
+ private syncDisplayRows;
3156
+ isGroupExpanded(groupId: number): boolean;
3157
+ /** Eco de `MenuItemGroup.alwaysExpanded` para este `groupId`. */
3158
+ private isGroupAlwaysExpanded;
3159
+ private isRowVisible;
3160
+ toggleGroup(groupId: number): void;
3118
3161
  submenuRowKey(row: MenuRow<T>, index: number): string;
3119
3162
  isSubmenuOpen(row: MenuRow<T>, index: number): boolean;
3120
3163
  submenuMenuId(row: MenuRow<T>): string;
3121
3164
  onRowMouseEnter(row: MenuRow<T>): void;
3165
+ /**
3166
+ * Grupo / divisor não são `menuitem` com foco-mãe — ao passar o rato para o cabeçalho do grupo,
3167
+ * limpa o realce da opção anterior (`.menu-list__option--active`).
3168
+ */
3169
+ onNonOptionSurfaceEnter(): void;
3122
3170
  onSubmenuTriggerEnter(row: MenuRow<T>, index: number): void;
3123
3171
  onSubmenuTriggerLeave(_row: MenuRow<T>, index: number): void;
3124
3172
  onSubmenuPanelEnter(): void;
@@ -3144,10 +3192,11 @@ declare class MenuListComponent<T = string> implements OnChanges {
3144
3192
  private focusActiveDom;
3145
3193
  onKeydown(ev: KeyboardEvent): void;
3146
3194
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuListComponent<any>, never>;
3147
- static ɵcmp: i0.ɵɵComponentDeclaration<MenuListComponent<any>, "app-menu-list", never, { "appTheme": { "alias": "appTheme"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; }; "menuId": { "alias": "menuId"; "required": false; }; "dense": { "alias": "dense"; "required": false; }; "nested": { "alias": "nested"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "compressText": { "alias": "compressText"; "required": false; }; }, { "itemSelect": "itemSelect"; "closeRequest": "closeRequest"; "submenuBack": "submenuBack"; }, never, never, true, never>;
3195
+ static ɵcmp: i0.ɵɵComponentDeclaration<MenuListComponent<any>, "app-menu-list", never, { "appTheme": { "alias": "appTheme"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; }; "menuId": { "alias": "menuId"; "required": false; }; "dense": { "alias": "dense"; "required": false; }; "nested": { "alias": "nested"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "compressText": { "alias": "compressText"; "required": false; }; "clickToOpen": { "alias": "clickToOpen"; "required": false; }; "groupCollapsible": { "alias": "groupCollapsible"; "required": false; }; "groupDefaultExpansion": { "alias": "groupDefaultExpansion"; "required": false; }; }, { "itemSelect": "itemSelect"; "closeRequest": "closeRequest"; "submenuBack": "submenuBack"; }, never, never, true, [{ directive: typeof i1.CdkScrollable; inputs: {}; outputs: {}; }]>;
3148
3196
  static ngAcceptInputType_dense: unknown;
3149
3197
  static ngAcceptInputType_nested: unknown;
3150
3198
  static ngAcceptInputType_compressText: unknown;
3199
+ static ngAcceptInputType_groupCollapsible: unknown;
3151
3200
  }
3152
3201
 
3153
3202
  /**
@@ -3187,9 +3236,15 @@ declare class MenuGroupComponent {
3187
3236
  label?: string;
3188
3237
  /** Quando `true`, não mostra o título (ex.: sidebar colapsada só com ícones). */
3189
3238
  hideLabel: boolean;
3239
+ /** Quando `true`, mostra seta e permite expandir/recolher (controlado pelo `menu-list`). */
3240
+ collapsible: boolean;
3241
+ expanded: boolean;
3242
+ readonly toggleExpand: EventEmitter<void>;
3190
3243
  static ɵfac: i0.ɵɵFactoryDeclaration<MenuGroupComponent, never>;
3191
- static ɵcmp: i0.ɵɵComponentDeclaration<MenuGroupComponent, "app-menu-group", never, { "label": { "alias": "label"; "required": false; }; "hideLabel": { "alias": "hideLabel"; "required": false; }; }, {}, never, never, true, never>;
3244
+ static ɵcmp: i0.ɵɵComponentDeclaration<MenuGroupComponent, "app-menu-group", never, { "label": { "alias": "label"; "required": false; }; "hideLabel": { "alias": "hideLabel"; "required": false; }; "collapsible": { "alias": "collapsible"; "required": false; }; "expanded": { "alias": "expanded"; "required": false; }; }, { "toggleExpand": "toggleExpand"; }, never, never, true, never>;
3192
3245
  static ngAcceptInputType_hideLabel: unknown;
3246
+ static ngAcceptInputType_collapsible: unknown;
3247
+ static ngAcceptInputType_expanded: unknown;
3193
3248
  }
3194
3249
 
3195
3250
  /**
@@ -3447,6 +3502,20 @@ declare class AppSidebarComponent<T extends string = string> implements OnChange
3447
3502
  selectedItemId: T | null;
3448
3503
  /** Modo estreito: só ícones + `compressText` na lista (rótulos via `title` / `aria-label`). */
3449
3504
  collapsed: boolean;
3505
+ /**
3506
+ * Repassado a {@link MenuListComponent.clickToOpen}: submenus na lateral abrem por **clique** (`true`, omissão)
3507
+ * ou por **hover** (`false`).
3508
+ */
3509
+ clickToOpen: boolean;
3510
+ /**
3511
+ * Repassado a {@link MenuListComponent.groupCollapsible}: `false` desactiva expandir/recolher nas secções.
3512
+ */
3513
+ groupCollapsible: boolean;
3514
+ /**
3515
+ * Repassado a {@link MenuListComponent.groupDefaultExpansion}: estado inicial dos grupos ao carregar `items`.
3516
+ * Com `'first'` e um primeiro grupo `alwaysExpanded`, os restantes grupos colapsáveis começam fechados.
3517
+ */
3518
+ groupDefaultExpansion: 'all' | 'first';
3450
3519
  readonly itemSelect: EventEmitter<T>;
3451
3520
  /**
3452
3521
  * Valor efectivo de `compressText` em `app-menu-list`: ao expandir, mantém-se comprimido
@@ -3461,8 +3530,9 @@ declare class AppSidebarComponent<T extends string = string> implements OnChange
3461
3530
  private scheduleSidebarHeadLayoutGuards;
3462
3531
  private applySidebarHeadLayoutGuards;
3463
3532
  static ɵfac: i0.ɵɵFactoryDeclaration<AppSidebarComponent<any>, never>;
3464
- static ɵcmp: i0.ɵɵComponentDeclaration<AppSidebarComponent<any>, "app-sidebar", never, { "appTheme": { "alias": "appTheme"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; }; "menuId": { "alias": "menuId"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "collapsed": { "alias": "collapsed"; "required": false; }; }, { "itemSelect": "itemSelect"; }, never, ["[appSidebarBrand]", "[appSidebarToolbar]"], true, never>;
3533
+ static ɵcmp: i0.ɵɵComponentDeclaration<AppSidebarComponent<any>, "app-sidebar", never, { "appTheme": { "alias": "appTheme"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": true; }; "menuId": { "alias": "menuId"; "required": false; }; "selectedItemId": { "alias": "selectedItemId"; "required": false; }; "collapsed": { "alias": "collapsed"; "required": false; }; "clickToOpen": { "alias": "clickToOpen"; "required": false; }; "groupCollapsible": { "alias": "groupCollapsible"; "required": false; }; "groupDefaultExpansion": { "alias": "groupDefaultExpansion"; "required": false; }; }, { "itemSelect": "itemSelect"; }, never, ["[appSidebarBrand]", "[appSidebarToolbar]"], true, never>;
3465
3534
  static ngAcceptInputType_collapsed: unknown;
3535
+ static ngAcceptInputType_groupCollapsible: unknown;
3466
3536
  }
3467
3537
 
3468
3538
  /**