diff --git a/lib/providers/tasks_provider.dart b/lib/providers/tasks_provider.dart index 8b760a58..779636c2 100644 --- a/lib/providers/tasks_provider.dart +++ b/lib/providers/tasks_provider.dart @@ -459,13 +459,6 @@ List> _processTasksInIsolate( } } - int? parseTaskNumberFromString(String? tn) { - if (tn == null) return null; - final m = RegExp(r'\d+').firstMatch(tn); - if (m == null) return null; - return int.tryParse(m.group(0)!); - } - int parseCreatedAt(Map m) { final v = m['created_at']; if (v == null) return 0; @@ -488,36 +481,29 @@ List> _processTasksInIsolate( if (rcmp != 0) return rcmp; if (ra == 0) { - // queued: higher priority first, then queue_order asc, then created_at + // queued: higher priority first (lower number = higher priority), + // then created_at descending (newest first) final pa = (a['priority'] as num?)?.toInt() ?? 1; final pb = (b['priority'] as num?)?.toInt() ?? 1; final pcmp = pb.compareTo(pa); if (pcmp != 0) return pcmp; - final aOrder = (a['queue_order'] as int?) ?? 0x7fffffff; - final bOrder = (b['queue_order'] as int?) ?? 0x7fffffff; - final qcmp = aOrder.compareTo(bOrder); - if (qcmp != 0) return qcmp; - return parseCreatedAt(a).compareTo(parseCreatedAt(b)); - } - - if (ra == 1) { - return parseCreatedAt(a).compareTo(parseCreatedAt(b)); - } - - if (ra == 2) { - final an = parseTaskNumberFromString(a['task_number'] as String?); - final bn = parseTaskNumberFromString(b['task_number'] as String?); - if (an != null && bn != null) return bn.compareTo(an); - if (an != null) return -1; - if (bn != null) return 1; + // Same priority: sort by created_at descending (newest first) return parseCreatedAt(b).compareTo(parseCreatedAt(a)); } - final aOrder = (a['queue_order'] as int?) ?? 0x7fffffff; - final bOrder = (b['queue_order'] as int?) ?? 0x7fffffff; - final cmp = aOrder.compareTo(bOrder); - if (cmp != 0) return cmp; - return parseCreatedAt(a).compareTo(parseCreatedAt(b)); + if (ra == 1) { + // in_progress: higher priority first (lower number = higher priority), + // then created_at descending (newest first) + final pa = (a['priority'] as num?)?.toInt() ?? 1; + final pb = (b['priority'] as num?)?.toInt() ?? 1; + final pcmp = pb.compareTo(pa); + if (pcmp != 0) return pcmp; + // Same priority: sort by created_at descending (newest first) + return parseCreatedAt(b).compareTo(parseCreatedAt(a)); + } + + // completed and cancelled: sort by created_at descending (newest first) + return parseCreatedAt(b).compareTo(parseCreatedAt(a)); }); return list; diff --git a/lib/providers/tickets_provider.dart b/lib/providers/tickets_provider.dart index 4521f9ce..38f2a655 100644 --- a/lib/providers/tickets_provider.dart +++ b/lib/providers/tickets_provider.dart @@ -330,8 +330,7 @@ List> _processTicketsInIsolate( }).toList(); } - // Sort newest first. `created_at` may be ISO strings or timestamps; - // handle strings and numeric values. + // Parse created_at timestamp from map. `created_at` may be ISO strings or timestamps. int parseCreatedAt(Map m) { final v = m['created_at']; if (v == null) return 0; @@ -347,7 +346,30 @@ List> _processTicketsInIsolate( return 0; } - list.sort((a, b) => parseCreatedAt(b).compareTo(parseCreatedAt(a))); + int statusRank(String s) { + switch (s) { + case 'pending': + return 0; + case 'promoted': + return 1; + case 'closed': + return 2; + default: + return 3; + } + } + + // Sort by status rank first (pending → promoted → closed), + // then by created_at descending (newest first) + list.sort((a, b) { + final ra = statusRank((a['status'] as String?) ?? ''); + final rb = statusRank((b['status'] as String?) ?? ''); + final rcmp = ra.compareTo(rb); + if (rcmp != 0) return rcmp; + + // Same status: sort by created_at descending (newest first) + return parseCreatedAt(b).compareTo(parseCreatedAt(a)); + }); final start = (payload['offset'] as int?) ?? 0; final limit = (payload['limit'] as int?) ?? 50;