Proper tasks and tickets ordering

This commit is contained in:
Marc Rejohn Castillano 2026-03-03 18:52:42 +08:00
parent 01c430c812
commit 2e99ec1234
2 changed files with 41 additions and 33 deletions

View File

@ -459,13 +459,6 @@ List<Map<String, dynamic>> _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<String, dynamic> m) {
final v = m['created_at'];
if (v == null) return 0;
@ -488,36 +481,29 @@ List<Map<String, dynamic>> _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;

View File

@ -330,8 +330,7 @@ List<Map<String, dynamic>> _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<String, dynamic> m) {
final v = m['created_at'];
if (v == null) return 0;
@ -347,7 +346,30 @@ List<Map<String, dynamic>> _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;