Added Task Number filter

This commit is contained in:
2026-02-28 16:45:17 +08:00
parent 0a8e388757
commit 5a74299a1c
4 changed files with 152 additions and 84 deletions
+36 -10
View File
@@ -46,6 +46,7 @@ class TasksListScreen extends ConsumerStatefulWidget {
class _TasksListScreenState extends ConsumerState<TasksListScreen>
with SingleTickerProviderStateMixin {
final TextEditingController _subjectController = TextEditingController();
final TextEditingController _taskNumberController = TextEditingController();
String? _selectedOfficeId;
String? _selectedStatus;
String? _selectedAssigneeId;
@@ -55,6 +56,7 @@ class _TasksListScreenState extends ConsumerState<TasksListScreen>
@override
void dispose() {
_subjectController.dispose();
_taskNumberController.dispose();
_tabController.dispose();
super.dispose();
}
@@ -63,13 +65,18 @@ class _TasksListScreenState extends ConsumerState<TasksListScreen>
void initState() {
super.initState();
_tabController = TabController(length: 2, vsync: this);
_tabController.addListener(() {
// rebuild when tab changes so filters shown/hidden update
setState(() {});
});
}
bool get _hasTaskFilters {
return _subjectController.text.trim().isNotEmpty ||
_taskNumberController.text.trim().isNotEmpty ||
_selectedOfficeId != null ||
_selectedStatus != null ||
_selectedAssigneeId != null ||
(_tabController.index == 1 && _selectedAssigneeId != null) ||
_selectedDateRange != null;
}
@@ -155,6 +162,7 @@ class _TasksListScreenState extends ConsumerState<TasksListScreen>
tasks,
ticketById: ticketById,
subjectQuery: _subjectController.text,
taskNumber: _taskNumberController.text,
officeId: _selectedOfficeId,
status: _selectedStatus,
assigneeId: _selectedAssigneeId,
@@ -191,19 +199,31 @@ class _TasksListScreenState extends ConsumerState<TasksListScreen>
),
),
SizedBox(
width: 220,
child: DropdownButtonFormField<String?>(
isExpanded: true,
key: ValueKey(_selectedAssigneeId),
initialValue: _selectedAssigneeId,
items: staffOptions,
onChanged: (value) =>
setState(() => _selectedAssigneeId = value),
width: 160,
child: TextField(
controller: _taskNumberController,
onChanged: (_) => setState(() {}),
decoration: const InputDecoration(
labelText: 'Assigned staff',
labelText: 'Task #',
prefixIcon: Icon(Icons.filter_alt),
),
),
),
if (_tabController.index == 1)
SizedBox(
width: 220,
child: DropdownButtonFormField<String?>(
isExpanded: true,
key: ValueKey(_selectedAssigneeId),
initialValue: _selectedAssigneeId,
items: staffOptions,
onChanged: (value) =>
setState(() => _selectedAssigneeId = value),
decoration: const InputDecoration(
labelText: 'Assigned staff',
),
),
),
SizedBox(
width: 180,
child: DropdownButtonFormField<String?>(
@@ -760,6 +780,7 @@ List<Task> _applyTaskFilters(
List<Task> tasks, {
required Map<String, Ticket> ticketById,
required String subjectQuery,
required String taskNumber,
required String? officeId,
required String? status,
required String? assigneeId,
@@ -767,7 +788,12 @@ List<Task> _applyTaskFilters(
required Map<String, String?> latestAssigneeByTaskId,
}) {
final query = subjectQuery.trim().toLowerCase();
final tnQuery = taskNumber.trim().toLowerCase();
return tasks.where((task) {
if (tnQuery.isNotEmpty &&
!(task.taskNumber?.toLowerCase().contains(tnQuery) ?? false)) {
return false;
}
final ticket = task.ticketId == null ? null : ticketById[task.ticketId];
final subject = task.title.isNotEmpty
? task.title