TTableHeader<T, K>.actions constructor

TTableHeader<T, K>.actions(
  1. List<TButtonGroupItem> builder(
    1. TListItem<T, K>
    ), {
  2. String text = "Actions",
  3. Alignment? alignment = Alignment.center,
  4. int? flex,
  5. double? minWidth,
  6. double? maxWidth,
  7. int? count,
  8. double widthEstimator(
    1. T data
    )?,
  9. bool flattenOnMobile = false,
  10. String mobileKeyPrefixBuilder(
    1. String headerText,
    2. String childKey
    )?,
  11. List<TKeyValue> keyValuesBuilder(
    1. T data
    )?,
})

Creates a header for row actions.

Automatically separates items into flat inline buttons (when TButtonGroupItem.showFlat is true) and an overflow dropdown menu (triple-dots icon) for remaining actions.

Implementation

TTableHeader.actions(
  List<TButtonGroupItem> Function(TListItem<T, K>) builder, {
  this.text = "Actions",
  this.alignment = Alignment.center,
  this.flex,
  this.minWidth,
  double? maxWidth,
  int? count,
  double Function(T data)? widthEstimator,
  this.flattenOnMobile = false,
  this.mobileKeyPrefixBuilder,
  this.keyValuesBuilder,
})  : map = null,
      key = null,
      filterType = null,
      filterable = false,
      filterOperators = null,
      filterItems = null,
      filterDef = null,
      widthEstimator = widthEstimator ?? ((_) => (count != null ? (40.0 * count + 16.0) : 75.0)),
      maxWidth = maxWidth != null
          ? maxWidth.clamp(75.0, 300.0)
          : count != null
              ? (40.0 * count + 36.0).clamp(75.0, 300.0)
              : null,
      builder = ((ctx, item, __) {
        final isDense = TTableScope.maybeOf(ctx)?.dense ?? false;
        final allItems = builder(item);
        if (allItems.isEmpty) return const SizedBox.shrink();

        final hasExplicitFlat = allItems.any((b) => b.showFlat);
        final hasExplicitChild = allItems.any((b) => b.child != null);

        final List<TButtonGroupItem> effectiveItems;
        if (!hasExplicitFlat && !hasExplicitChild && allItems.length <= 2) {
          effectiveItems = allItems;
        } else if (!hasExplicitFlat && !hasExplicitChild && allItems.length > 2) {
          effectiveItems = [
            TButtonGroupItem(
              child: _buildActionDropdownMenu(ctx, allItems, isDense),
            ),
          ];
        } else {
          final flatButtons = <TButtonGroupItem>[];
          final menuButtons = <TButtonGroupItem>[];

          for (final btn in allItems) {
            if (btn.showFlat || btn.child != null) {
              flatButtons.add(btn);
            } else {
              menuButtons.add(btn);
            }
          }

          effectiveItems = <TButtonGroupItem>[...flatButtons];
          if (menuButtons.isNotEmpty) {
            effectiveItems.add(TButtonGroupItem(
              child: _buildActionDropdownMenu(ctx, menuButtons, isDense),
            ));
          }
        }

        return TButtonGroup(
          type: TButtonGroupType.icon,
          alignment: WrapAlignment.end,
          size: isDense ? TButtonSize.sm.copyWith(hPad: 4, vPad: 2) : TButtonSize.sm,
          items: effectiveItems,
        );
      });