diff --git a/lib/data/models/knowledge_item.dart b/lib/data/models/knowledge_item.dart index d8ff992..b5e2c2a 100644 --- a/lib/data/models/knowledge_item.dart +++ b/lib/data/models/knowledge_item.dart @@ -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 json) => KnowledgeItem( id: json['id'] as int, noteType: json['note_type'] as String? ?? 'note', diff --git a/lib/providers/knowledge_provider.dart b/lib/providers/knowledge_provider.dart index 822f333..b63ef31 100644 --- a/lib/providers/knowledge_provider.dart +++ b/lib/providers/knowledge_provider.dart @@ -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 ids; @@ -150,6 +152,23 @@ class KnowledgeNotifier extends Notifier { Future _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, diff --git a/lib/screens/knowledge/knowledge_screen.dart b/lib/screens/knowledge/knowledge_screen.dart index e46d778..0fbe1d8 100644 --- a/lib/screens/knowledge/knowledge_screen.dart +++ b/lib/screens/knowledge/knowledge_screen.dart @@ -74,15 +74,7 @@ class _KnowledgeScreenState extends ConsumerState }); } - String _tabLabel(int index, Map 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 tabAlignment: TabAlignment.start, tabs: List.generate( _kTabs.length, - (i) => Tab(text: _tabLabel(i, state.counts)), + (i) => Tab(text: _tabLabel(i)), ), ), ),