Implemented subject suggestions in Task Creation and Edit.
Fix editing redirects
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user