initial commit
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import '../theme/theme_x.dart';
|
||||
|
||||
/// The bordered, horizontally-scrollable card wrapper used by every dense
|
||||
/// table in the app (Services, Fleet, Updates, Backup history). A thin
|
||||
/// shell around [DataTable] — column/row content stays screen-specific,
|
||||
/// this just guarantees the same card chrome, spacing, and empty-state
|
||||
/// fallback everywhere.
|
||||
class DataTableScaffold extends StatelessWidget {
|
||||
const DataTableScaffold({
|
||||
super.key,
|
||||
required this.columns,
|
||||
required this.rows,
|
||||
this.empty,
|
||||
this.columnSpacing = 28,
|
||||
this.horizontalMargin = 16,
|
||||
});
|
||||
|
||||
final List<DataColumn> columns;
|
||||
final List<DataRow> rows;
|
||||
final Widget? empty;
|
||||
final double columnSpacing;
|
||||
final double horizontalMargin;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Container(
|
||||
decoration: BoxDecoration(
|
||||
color: context.colors.surface,
|
||||
borderRadius: BorderRadius.circular(10),
|
||||
border: Border.all(color: context.colors.outlineVariant),
|
||||
),
|
||||
clipBehavior: Clip.antiAlias,
|
||||
child: rows.isEmpty && empty != null
|
||||
? empty
|
||||
: SingleChildScrollView(
|
||||
scrollDirection: Axis.horizontal,
|
||||
child: ConstrainedBox(
|
||||
constraints: BoxConstraints(minWidth: MediaQuery.sizeOf(context).width),
|
||||
child: DataTable(
|
||||
showCheckboxColumn: false,
|
||||
columns: columns,
|
||||
rows: rows,
|
||||
columnSpacing: columnSpacing,
|
||||
horizontalMargin: horizontalMargin,
|
||||
headingRowHeight: 38,
|
||||
dataRowMinHeight: 46,
|
||||
dataRowMaxHeight: 58,
|
||||
dividerThickness: 1,
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user