aboutsummaryrefslogtreecommitdiff
path: root/frontend/lib/views/task_queue/task_queue_view.dart
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/lib/views/task_queue/task_queue_view.dart')
-rw-r--r--frontend/lib/views/task_queue/task_queue_view.dart153
1 files changed, 153 insertions, 0 deletions
diff --git a/frontend/lib/views/task_queue/task_queue_view.dart b/frontend/lib/views/task_queue/task_queue_view.dart
new file mode 100644
index 000000000..8d78f129f
--- /dev/null
+++ b/frontend/lib/views/task_queue/task_queue_view.dart
@@ -0,0 +1,153 @@
+import 'package:auto_gpt_flutter_client/models/benchmark/benchmark_task_status.dart';
+import 'package:auto_gpt_flutter_client/models/test_option.dart';
+import 'package:auto_gpt_flutter_client/viewmodels/chat_viewmodel.dart';
+import 'package:auto_gpt_flutter_client/viewmodels/skill_tree_viewmodel.dart';
+import 'package:auto_gpt_flutter_client/viewmodels/task_queue_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:provider/provider.dart';
+
+class TaskQueueView extends StatelessWidget {
+ @override
+ Widget build(BuildContext context) {
+ // TODO: This should be injected instead
+ final viewModel = Provider.of<TaskQueueViewModel>(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(
+ isDisabled: viewModel.isBenchmarkRunning,
+ selectedOptionString: viewModel.selectedOption.description,
+ onOptionSelected: (selectedOption) {
+ print('Option Selected: $selectedOption');
+ final skillTreeViewModel =
+ Provider.of<SkillTreeViewModel>(context, listen: false);
+ viewModel.updateSelectedNodeHierarchyBasedOnOption(
+ TestOptionExtension.fromDescription(selectedOption)!,
+ skillTreeViewModel.selectedNode,
+ skillTreeViewModel.skillTreeNodes,
+ skillTreeViewModel.skillTreeEdges);
+ },
+ onPlayPressed: (selectedOption) {
+ print('Starting benchmark with option: $selectedOption');
+ 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);
+ },
+ viewModel: viewModel,
+ ),
+ );
+ },
+ isDisabled: viewModel.isBenchmarkRunning ||
+ viewModel.benchmarkStatusMap.isEmpty,
+ ),
+ ],
+ ),
+ ),
+ ],
+ ),
+ );
+ }
+}