@truenas/ui-components 0.3.10 → 0.3.11

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@truenas/ui-components",
3
- "version": "0.3.10",
3
+ "version": "0.3.11",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org",
6
6
  "access": "public"
@@ -2790,6 +2790,17 @@ declare class TnCardComponent {
2790
2790
  protected footerActions: _angular_core.Signal<TemplateRef<any> | undefined>;
2791
2791
  title: _angular_core.InputSignal<string | undefined>;
2792
2792
  titleLink: _angular_core.InputSignal<string | undefined>;
2793
+ /**
2794
+ * Angular router commands for a title that navigates within the app. When set,
2795
+ * the title renders as an `<a [routerLink]>` so it participates in client-side
2796
+ * (SPA) routing — unlike `titleLink`, which performs a full-page
2797
+ * `window.location` navigation. Same accepted shapes as `[routerLink]`
2798
+ * (`string | unknown[]`). Takes precedence over `titleLink`.
2799
+ */
2800
+ titleRouterLink: _angular_core.InputSignal<string | unknown[] | undefined>;
2801
+ titleQueryParams: _angular_core.InputSignal<Record<string, unknown> | undefined>;
2802
+ /** Help/hover text shown on the title via the tooltip directive. */
2803
+ titleTooltip: _angular_core.InputSignal<string | undefined>;
2793
2804
  elevation: _angular_core.InputSignal<"none" | "low" | "medium" | "high">;
2794
2805
  padding: _angular_core.InputSignal<"small" | "large" | "medium">;
2795
2806
  padContent: _angular_core.InputSignal<boolean>;
@@ -2816,12 +2827,13 @@ declare class TnCardComponent {
2816
2827
  hasHeader: _angular_core.Signal<boolean>;
2817
2828
  hasHeaderRight: _angular_core.Signal<boolean>;
2818
2829
  hasFooter: _angular_core.Signal<boolean>;
2830
+ isTitleRouterLink: _angular_core.Signal<boolean>;
2819
2831
  onTitleClick(): void;
2820
2832
  onControlChange(checked: boolean): void;
2821
2833
  onHeaderMenuItemClick(_item: TnMenuItem): void;
2822
2834
  getStatusClass(type?: string): string;
2823
2835
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnCardComponent, never>;
2824
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCardComponent, "tn-card", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "titleLink": { "alias": "titleLink"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "padContent": { "alias": "padContent"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "headerStatus": { "alias": "headerStatus"; "required": false; "isSignal": true; }; "headerControl": { "alias": "headerControl"; "required": false; "isSignal": true; }; "headerMenu": { "alias": "headerMenu"; "required": false; "isSignal": true; }; "headerMenuTriggerTestId": { "alias": "headerMenuTriggerTestId"; "required": false; "isSignal": true; }; "primaryAction": { "alias": "primaryAction"; "required": false; "isSignal": true; }; "secondaryAction": { "alias": "secondaryAction"; "required": false; "isSignal": true; }; "footerLink": { "alias": "footerLink"; "required": false; "isSignal": true; }; }, {}, ["projectedHeader", "headerActions", "footerActions"], ["[tnCardHeader]", "*"], true, never>;
2836
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCardComponent, "tn-card", never, { "title": { "alias": "title"; "required": false; "isSignal": true; }; "titleLink": { "alias": "titleLink"; "required": false; "isSignal": true; }; "titleRouterLink": { "alias": "titleRouterLink"; "required": false; "isSignal": true; }; "titleQueryParams": { "alias": "titleQueryParams"; "required": false; "isSignal": true; }; "titleTooltip": { "alias": "titleTooltip"; "required": false; "isSignal": true; }; "elevation": { "alias": "elevation"; "required": false; "isSignal": true; }; "padding": { "alias": "padding"; "required": false; "isSignal": true; }; "padContent": { "alias": "padContent"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "background": { "alias": "background"; "required": false; "isSignal": true; }; "headerStatus": { "alias": "headerStatus"; "required": false; "isSignal": true; }; "headerControl": { "alias": "headerControl"; "required": false; "isSignal": true; }; "headerMenu": { "alias": "headerMenu"; "required": false; "isSignal": true; }; "headerMenuTriggerTestId": { "alias": "headerMenuTriggerTestId"; "required": false; "isSignal": true; }; "primaryAction": { "alias": "primaryAction"; "required": false; "isSignal": true; }; "secondaryAction": { "alias": "secondaryAction"; "required": false; "isSignal": true; }; "footerLink": { "alias": "footerLink"; "required": false; "isSignal": true; }; }, {}, ["projectedHeader", "headerActions", "footerActions"], ["[tnCardHeader]", "*"], true, never>;
2825
2837
  }
2826
2838
 
2827
2839
  /**
@@ -5402,6 +5414,19 @@ declare class TnTableComponent<T = unknown> implements OnInit {
5402
5414
  selectable: _angular_core.InputSignal<boolean>;
5403
5415
  expandable: _angular_core.InputSignal<boolean>;
5404
5416
  bordered: _angular_core.InputSignal<boolean>;
5417
+ /**
5418
+ * Optional per-row predicate deciding whether an individual row can expand.
5419
+ * When omitted, every row is expandable (provided `expandable` is true and a
5420
+ * `tnDetailRowDef` is present). Rows for which it returns `false` render no
5421
+ * expand control, cannot be toggled, and never render a detail row. Has no
5422
+ * effect unless `expandable` is true. Re-evaluated on each change detection,
5423
+ * so it may depend on signals — keep it cheap and pure.
5424
+ *
5425
+ * If the predicate stops allowing an already-expanded row (e.g. it is driven
5426
+ * by dynamic row state), that row is pruned from the expanded set, so it will
5427
+ * not silently reappear expanded should the predicate allow it again later.
5428
+ */
5429
+ isRowExpandable: _angular_core.InputSignal<((row: T) => boolean) | undefined>;
5405
5430
  /**
5406
5431
  * Marks a single row as "active" — adds the `tn-table__row--active` class
5407
5432
  * and a left-side indicator bar. Set to `null` (default) to clear.
@@ -5468,9 +5493,15 @@ declare class TnTableComponent<T = unknown> implements OnInit {
5468
5493
  isIndeterminate: _angular_core.Signal<boolean>;
5469
5494
  trackByFn: _angular_core.Signal<(index: number, item: T) => unknown>;
5470
5495
  onSortClick(column: string): void;
5471
- getSortIcon(column: string): string;
5472
- getExpandIcon(row: T): string;
5473
5496
  isSorted(column: string): boolean;
5497
+ /**
5498
+ * Whether a specific row may currently be expanded. True when `expandable` is
5499
+ * set and — when an `isRowExpandable` predicate is provided — that predicate
5500
+ * returns true for the row. Drives the expand control's visibility and gates
5501
+ * every expansion entry point (chevron, row click, keyboard). The `__expand`
5502
+ * column and the detail row are additionally gated on `detailRowDef()`.
5503
+ */
5504
+ canExpandRow(row: T): boolean;
5474
5505
  toggleRowExpansion(row: T): void;
5475
5506
  isRowExpanded(row: T): boolean;
5476
5507
  isRowActive(row: T): boolean;
@@ -5482,7 +5513,7 @@ declare class TnTableComponent<T = unknown> implements OnInit {
5482
5513
  getColumnDef(columnName: string): TnTableColumnDirective | undefined;
5483
5514
  getCellValue(row: T, column: string): unknown;
5484
5515
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnTableComponent<any>, never>;
5485
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTableComponent<any>, "tn-table", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "displayedColumns": { "alias": "displayedColumns"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "emptyIcon": { "alias": "emptyIcon"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "activeRow": { "alias": "activeRow"; "required": false; "isSignal": true; }; "activeBg": { "alias": "activeBg"; "required": false; "isSignal": true; }; "activeIndicator": { "alias": "activeIndicator"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingMessage": { "alias": "loadingMessage"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "sortChange": "sortChange"; "selectionChange": "selectionChange"; "rowClick": "rowClick"; }, ["columnDefs", "detailRowDef"], never, true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
5516
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnTableComponent<any>, "tn-table", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "displayedColumns": { "alias": "displayedColumns"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; "emptyMessage": { "alias": "emptyMessage"; "required": false; "isSignal": true; }; "emptyIcon": { "alias": "emptyIcon"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "expandable": { "alias": "expandable"; "required": false; "isSignal": true; }; "bordered": { "alias": "bordered"; "required": false; "isSignal": true; }; "isRowExpandable": { "alias": "isRowExpandable"; "required": false; "isSignal": true; }; "activeRow": { "alias": "activeRow"; "required": false; "isSignal": true; }; "activeBg": { "alias": "activeBg"; "required": false; "isSignal": true; }; "activeIndicator": { "alias": "activeIndicator"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "loadingMessage": { "alias": "loadingMessage"; "required": false; "isSignal": true; }; "clickable": { "alias": "clickable"; "required": false; "isSignal": true; }; }, { "sortChange": "sortChange"; "selectionChange": "selectionChange"; "rowClick": "rowClick"; }, ["columnDefs", "detailRowDef"], never, true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
5486
5517
  }
5487
5518
 
5488
5519
  /**
@@ -5600,6 +5631,14 @@ declare class TnTableHarness extends ComponentHarness {
5600
5631
  * @returns Promise resolving to true if the row has the expanded class.
5601
5632
  */
5602
5633
  isRowExpanded(rowIndex: number): Promise<boolean>;
5634
+ /**
5635
+ * Checks whether a row exposes an expand control. Returns false for rows made
5636
+ * non-expandable via the table's `isRowExpandable` predicate.
5637
+ *
5638
+ * @param rowIndex Zero-based index of the data row.
5639
+ * @returns Promise resolving to true if the row has an expand button.
5640
+ */
5641
+ hasExpandControl(rowIndex: number): Promise<boolean>;
5603
5642
  /**
5604
5643
  * Clicks a row (for tables with `clickable` enabled).
5605
5644
  *