Added Task Number filter
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user