fix: load tasks via TasksApi in Knowledge view, remove tab counts
Tasks are not part of the knowledge API (backend rejects type=task). When the Tasks tab is selected, fetch from /api/tasks and convert to KnowledgeItem. Also removes per-type counts from tab labels to prevent tabs from awkwardly resizing when counts load. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import 'task.dart';
|
||||
|
||||
class KnowledgeItem {
|
||||
final int id;
|
||||
final String noteType; // 'note' | 'person' | 'place' | 'list' | 'task'
|
||||
@@ -30,6 +32,22 @@ class KnowledgeItem {
|
||||
required this.updatedAt,
|
||||
});
|
||||
|
||||
factory KnowledgeItem.fromTask(Task task) => KnowledgeItem(
|
||||
id: task.id,
|
||||
noteType: 'task',
|
||||
title: task.title,
|
||||
body: task.description ?? '',
|
||||
tags: const [],
|
||||
projectId: task.projectId,
|
||||
milestoneId: task.milestoneId,
|
||||
parentId: task.parentId,
|
||||
status: task.status.value,
|
||||
priority: task.priority.value,
|
||||
dueDate: task.dueDate?.toIso8601String(),
|
||||
createdAt: task.createdAt,
|
||||
updatedAt: task.updatedAt,
|
||||
);
|
||||
|
||||
factory KnowledgeItem.fromJson(Map<String, dynamic> json) => KnowledgeItem(
|
||||
id: json['id'] as int,
|
||||
noteType: json['note_type'] as String? ?? 'note',
|
||||
|
||||
@@ -4,6 +4,8 @@ import '../data/models/knowledge_item.dart';
|
||||
import '../data/repositories/knowledge_repository.dart';
|
||||
import 'api_client_provider.dart';
|
||||
|
||||
export '../data/models/knowledge_item.dart';
|
||||
|
||||
/// Immutable state for the Knowledge screen's two-tier paginated feed.
|
||||
class KnowledgeState {
|
||||
final List<int> ids;
|
||||
@@ -150,6 +152,23 @@ class KnowledgeNotifier extends Notifier<KnowledgeState> {
|
||||
Future<void> _fetchFromScratch() async {
|
||||
state = state.copyWith(isLoadingIds: true, error: null);
|
||||
try {
|
||||
if (state.noteType == 'task') {
|
||||
// Tasks live under /api/tasks — fetch all and convert directly.
|
||||
final tasks = await ref.read(tasksApiProvider).getAll();
|
||||
final items = {
|
||||
for (final t in tasks) t.id: KnowledgeItem.fromTask(t),
|
||||
};
|
||||
state = state.copyWith(
|
||||
ids: tasks.map((t) => t.id).toList(),
|
||||
items: items,
|
||||
totalIds: tasks.length,
|
||||
isLoadingIds: false,
|
||||
hasMore: false,
|
||||
);
|
||||
await _loadCounts();
|
||||
return;
|
||||
}
|
||||
|
||||
final (ids, total) = await _repo.fetchIds(
|
||||
noteType: state.noteType,
|
||||
tags: state.activeTags,
|
||||
|
||||
@@ -74,15 +74,7 @@ class _KnowledgeScreenState extends ConsumerState<KnowledgeScreen>
|
||||
});
|
||||
}
|
||||
|
||||
String _tabLabel(int index, Map<String, int> counts) {
|
||||
final tab = _kTabs[index];
|
||||
if (tab.type == null) {
|
||||
final total = counts.values.fold(0, (a, b) => a + b);
|
||||
return total > 0 ? 'All ($total)' : 'All';
|
||||
}
|
||||
final count = counts[tab.type];
|
||||
return count != null && count > 0 ? '${tab.label} ($count)' : tab.label;
|
||||
}
|
||||
String _tabLabel(int index) => _kTabs[index].label;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@@ -119,7 +111,7 @@ class _KnowledgeScreenState extends ConsumerState<KnowledgeScreen>
|
||||
tabAlignment: TabAlignment.start,
|
||||
tabs: List.generate(
|
||||
_kTabs.length,
|
||||
(i) => Tab(text: _tabLabel(i, state.counts)),
|
||||
(i) => Tab(text: _tabLabel(i)),
|
||||
),
|
||||
),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user