Fixed horizontal scrollbar, limit per page by 10 rows on desktop

Fixed duplicate entries in activity logs
This commit is contained in:
2026-03-02 20:11:49 +08:00
parent b9722106ff
commit 43d2bd4f95
3 changed files with 421 additions and 88 deletions
+31 -3
View File
@@ -226,6 +226,16 @@ class _TaskDetailScreenState extends ConsumerState<TaskDetailScreen>
);
final showAssign = canAssign && task.status != 'completed';
final assignments = assignmentsAsync.valueOrNull ?? <TaskAssignment>[];
final profileById = {
for (final profile in profilesAsync.valueOrNull ?? <Profile>[])
profile.id: profile,
};
final hasAssignedItStaff = assignments.any((assignment) {
if (assignment.taskId != task.id) {
return false;
}
return profileById[assignment.userId]?.role == 'it_staff';
});
final canUpdateStatus = _canUpdateStatus(
profileAsync.valueOrNull,
assignments,
@@ -396,7 +406,12 @@ class _TaskDetailScreenState extends ConsumerState<TaskDetailScreen>
runSpacing: 8,
crossAxisAlignment: WrapCrossAlignment.center,
children: [
_buildStatusChip(context, task, canUpdateStatus),
_buildStatusChip(
context,
task,
canUpdateStatus,
hasAssignedItStaff,
),
_MetaBadge(label: 'Office', value: officeName),
_MetaBadge(
label: 'Task #',
@@ -3472,16 +3487,29 @@ class _TaskDetailScreenState extends ConsumerState<TaskDetailScreen>
BuildContext context,
Task task,
bool canUpdateStatus,
bool hasAssignedItStaff,
) {
final chip = StatusPill(
label: task.status.toUpperCase(),
isEmphasized: task.status != 'queued',
);
if (!canUpdateStatus) {
final isTerminal =
task.status == 'completed' ||
task.status == 'cancelled' ||
task.status == 'closed';
if (!canUpdateStatus || isTerminal) {
return chip;
}
final statusOptions = _statusOptions.where((status) {
if (status == 'in_progress' && !hasAssignedItStaff) {
return false;
}
return true;
}).toList();
return PopupMenuButton<String>(
onSelected: (value) async {
// If cancelling, require a reason — show dialog with spinner.
@@ -3592,7 +3620,7 @@ class _TaskDetailScreenState extends ConsumerState<TaskDetailScreen>
}
}
},
itemBuilder: (context) => _statusOptions
itemBuilder: (context) => statusOptions
.map(
(status) => PopupMenuItem(
value: status,