Skip to content

Commit faa8133

Browse files
authored
[TO-203] Execution metadata overlaps detail view (#478)
* Execution metadata table widget: scrollable and left align * Add scrollbar
1 parent 4eed949 commit faa8133

File tree

1 file changed

+63
-41
lines changed

1 file changed

+63
-41
lines changed

frontend/lib/ui/execution_metadata.dart

Lines changed: 63 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -18,57 +18,79 @@ import 'package:flutter/material.dart';
1818
import '../../models/execution_metadata.dart';
1919
import 'spacing.dart';
2020

21-
class ExecutionMetadataTable extends StatelessWidget {
21+
class ExecutionMetadataTable extends StatefulWidget {
2222
final ExecutionMetadata metadata;
2323
const ExecutionMetadataTable({super.key, required this.metadata});
2424

25+
@override
26+
State<ExecutionMetadataTable> createState() => _ExecutionMetadataTableState();
27+
}
28+
29+
class _ExecutionMetadataTableState extends State<ExecutionMetadataTable> {
30+
final ScrollController _scrollController = ScrollController();
31+
32+
@override
33+
void dispose() {
34+
_scrollController.dispose();
35+
super.dispose();
36+
}
37+
2538
@override
2639
Widget build(BuildContext context) {
27-
final sortedEntries = metadata.data.entries.toList()
40+
final sortedEntries = widget.metadata.data.entries.toList()
2841
..sort((a, b) => a.key.compareTo(b.key));
2942
if (sortedEntries.isEmpty) {
3043
return const Text('No execution metadata available.');
3144
}
32-
return DataTable(
33-
dataRowMaxHeight: double.infinity,
34-
columns: const [
35-
DataColumn(
36-
label: Text('Category'),
37-
),
38-
DataColumn(
39-
label: Text('Values'),
40-
),
41-
],
42-
rows: sortedEntries
43-
.map(
44-
(entry) => DataRow(
45-
cells: [
46-
DataCell(Text(entry.key)),
47-
DataCell(
48-
Column(
49-
mainAxisAlignment: MainAxisAlignment.center,
50-
children: (entry.value.toList()..sort())
51-
.expand(
52-
(v) => [
53-
const SizedBox(height: Spacing.level3),
54-
Tooltip(
55-
message: v,
56-
child: Text(
57-
v,
58-
overflow: TextOverflow.ellipsis,
59-
maxLines: 1,
60-
),
61-
),
62-
const SizedBox(height: Spacing.level3),
63-
],
64-
)
65-
.toList(),
66-
),
67-
),
68-
],
45+
return Scrollbar(
46+
controller: _scrollController,
47+
interactive: true,
48+
child: SingleChildScrollView(
49+
controller: _scrollController,
50+
scrollDirection: Axis.horizontal,
51+
child: DataTable(
52+
dataRowMaxHeight: double.infinity,
53+
columns: const [
54+
DataColumn(
55+
label: Text('Category'),
6956
),
70-
)
71-
.toList(),
57+
DataColumn(
58+
label: Text('Values'),
59+
),
60+
],
61+
rows: sortedEntries
62+
.map(
63+
(entry) => DataRow(
64+
cells: [
65+
DataCell(Text(entry.key)),
66+
DataCell(
67+
Column(
68+
mainAxisAlignment: MainAxisAlignment.start,
69+
crossAxisAlignment: CrossAxisAlignment.start,
70+
children: (entry.value.toList()..sort())
71+
.expand(
72+
(v) => [
73+
const SizedBox(height: Spacing.level3),
74+
Tooltip(
75+
message: v,
76+
child: Text(
77+
v,
78+
overflow: TextOverflow.ellipsis,
79+
maxLines: 1,
80+
),
81+
),
82+
const SizedBox(height: Spacing.level3),
83+
],
84+
)
85+
.toList(),
86+
),
87+
),
88+
],
89+
),
90+
)
91+
.toList(),
92+
),
93+
),
7294
);
7395
}
7496
}

0 commit comments

Comments
 (0)