Files
Auto-GPT/frontend/lib/views/task_queue/task_queue_view.dart
hunteraraujo da6311fb1e Fix UI Overlap Issue in TaskQueueView
This commit addresses a UI issue where the ListView items were overlapping with the Positioned widget in the TaskQueueView. The Positioned widget has been replaced with a more flexible layout using a Column widget to ensure proper spacing and positioning of elements on the screen. The ListView now takes up all available space above the buttons, preventing any overlap and enhancing the user experience.
2023-10-03 22:05:21 -07:00

141 lines
5.4 KiB
Dart

import 'package:auto_gpt_flutter_client/models/benchmark/benchmark_task_status.dart';
import 'package:auto_gpt_flutter_client/viewmodels/chat_viewmodel.dart';
import 'package:auto_gpt_flutter_client/viewmodels/task_viewmodel.dart';
import 'package:auto_gpt_flutter_client/views/task_queue/leaderboard_submission_button.dart';
import 'package:auto_gpt_flutter_client/views/task_queue/leaderboard_submission_dialog.dart';
import 'package:auto_gpt_flutter_client/views/task_queue/test_suite_button.dart';
import 'package:flutter/material.dart';
import 'package:auto_gpt_flutter_client/viewmodels/skill_tree_viewmodel.dart';
import 'package:provider/provider.dart';
class TaskQueueView extends StatelessWidget {
@override
Widget build(BuildContext context) {
final viewModel = Provider.of<SkillTreeViewModel>(context);
// Node hierarchy
final nodeHierarchy = viewModel.selectedNodeHierarchy ?? [];
return Material(
color: Colors.white,
child: Column(
children: [
// The list of tasks (tiles)
Expanded(
child: ListView.builder(
itemCount: nodeHierarchy.length,
itemBuilder: (context, index) {
final node = nodeHierarchy[index];
// Choose the appropriate leading widget based on the task status
Widget leadingWidget;
switch (viewModel.benchmarkStatusMap[node]) {
case null:
case BenchmarkTaskStatus.notStarted:
leadingWidget = CircleAvatar(
radius: 12,
backgroundColor: Colors.grey,
child: CircleAvatar(
radius: 6,
backgroundColor: Colors.white,
),
);
break;
case BenchmarkTaskStatus.inProgress:
leadingWidget = SizedBox(
width: 24,
height: 24,
child: CircularProgressIndicator(
strokeWidth: 2,
),
);
break;
case BenchmarkTaskStatus.success:
leadingWidget = CircleAvatar(
radius: 12,
backgroundColor: Colors.green,
child: CircleAvatar(
radius: 6,
backgroundColor: Colors.white,
),
);
break;
case BenchmarkTaskStatus.failure:
leadingWidget = CircleAvatar(
radius: 12,
backgroundColor: Colors.red,
child: CircleAvatar(
radius: 6,
backgroundColor: Colors.white,
),
);
break;
}
return Container(
margin: EdgeInsets.fromLTRB(20, 5, 20, 5),
decoration: BoxDecoration(
color: Colors.white,
border: Border.all(color: Colors.black, width: 1),
borderRadius: BorderRadius.circular(4),
),
child: ListTile(
leading: leadingWidget,
title: Center(child: Text('${node.label}')),
subtitle:
Center(child: Text('${node.data.info.description}')),
),
);
},
),
),
// Buttons at the bottom
Padding(
padding: EdgeInsets.all(20),
child: Column(
children: [
// TestSuiteButton
TestSuiteButton(
onPressed: viewModel.isBenchmarkRunning
? null
: () {
final chatViewModel = Provider.of<ChatViewModel>(
context,
listen: false);
final taskViewModel = Provider.of<TaskViewModel>(
context,
listen: false);
chatViewModel.clearCurrentTaskAndChats();
viewModel.runBenchmark(chatViewModel, taskViewModel);
},
),
SizedBox(height: 8), // Gap of 8 points between buttons
// LeaderboardSubmissionButton
LeaderboardSubmissionButton(
onPressed: viewModel.benchmarkStatusMap.isEmpty ||
viewModel.isBenchmarkRunning
? null
: () {
showDialog(
context: context,
builder: (context) => LeaderboardSubmissionDialog(
onSubmit: (teamName, repoUrl, commitSha) {
viewModel.submitToLeaderboard(
teamName, repoUrl, commitSha);
},
),
);
},
isDisabled: viewModel.isBenchmarkRunning ||
viewModel.benchmarkStatusMap.isEmpty,
),
],
),
),
],
),
);
}
}