Implemented subject suggestions in Task Creation and Edit.

Fix editing redirects
This commit is contained in:
2026-03-03 18:39:01 +08:00
parent bfcca47353
commit b1f5d209a2
2 changed files with 152 additions and 81 deletions
+37 -6
View File
@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:tasq/utils/app_time.dart';
import 'package:go_router/go_router.dart';
@@ -23,6 +24,7 @@ import '../../widgets/tasq_adaptive_list.dart';
import '../../widgets/typing_dots.dart';
import '../../theme/app_surfaces.dart';
import '../../utils/snackbar.dart';
import '../../utils/subject_suggestions.dart';
// request metadata options used in task creation/editing dialogs
const List<String> _requestTypeOptions = [
@@ -565,6 +567,14 @@ class _TasksListScreenState extends ConsumerState<TasksListScreen>
) async {
final titleController = TextEditingController();
final descriptionController = TextEditingController();
final existingSubjects = <String>[
...((ref.read(tasksProvider).valueOrNull ?? const <Task>[]).map(
(task) => task.title,
)),
...((ref.read(ticketsProvider).valueOrNull ?? const <Ticket>[]).map(
(ticket) => ticket.subject,
)),
];
String? selectedOfficeId;
String? selectedRequestType;
String? requestTypeOther;
@@ -585,12 +595,30 @@ class _TasksListScreenState extends ConsumerState<TasksListScreen>
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
TextField(
controller: titleController,
decoration: const InputDecoration(
labelText: 'Task title',
TypeAheadFormField<String>(
textFieldConfiguration: TextFieldConfiguration(
controller: titleController,
decoration: const InputDecoration(
labelText: 'Task title',
),
enabled: !saving,
),
enabled: !saving,
suggestionsCallback: (pattern) async {
return SubjectSuggestionEngine.suggest(
existingSubjects: existingSubjects,
query: pattern,
limit: 8,
);
},
itemBuilder: (context, suggestion) =>
ListTile(dense: true, title: Text(suggestion)),
onSuggestionSelected: (suggestion) {
titleController
..text = suggestion
..selection = TextSelection.collapsed(
offset: suggestion.length,
);
},
),
const SizedBox(height: 12),
TextField(
@@ -710,7 +738,10 @@ class _TasksListScreenState extends ConsumerState<TasksListScreen>
onPressed: saving
? null
: () async {
final title = titleController.text.trim();
final title =
SubjectSuggestionEngine.normalizeDisplay(
titleController.text.trim(),
);
final description = descriptionController.text.trim();
final officeId = selectedOfficeId;
if (title.isEmpty || officeId == null) {