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 {
|
class KnowledgeItem {
|
||||||
final int id;
|
final int id;
|
||||||
final String noteType; // 'note' | 'person' | 'place' | 'list' | 'task'
|
final String noteType; // 'note' | 'person' | 'place' | 'list' | 'task'
|
||||||
@@ -30,6 +32,22 @@ class KnowledgeItem {
|
|||||||
required this.updatedAt,
|
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(
|
factory KnowledgeItem.fromJson(Map<String, dynamic> json) => KnowledgeItem(
|
||||||
id: json['id'] as int,
|
id: json['id'] as int,
|
||||||
noteType: json['note_type'] as String? ?? 'note',
|
noteType: json['note_type'] as String? ?? 'note',
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import '../data/models/knowledge_item.dart';
|
|||||||
import '../data/repositories/knowledge_repository.dart';
|
import '../data/repositories/knowledge_repository.dart';
|
||||||
import 'api_client_provider.dart';
|
import 'api_client_provider.dart';
|
||||||
|
|
||||||
|
export '../data/models/knowledge_item.dart';
|
||||||
|
|
||||||
/// Immutable state for the Knowledge screen's two-tier paginated feed.
|
/// Immutable state for the Knowledge screen's two-tier paginated feed.
|
||||||
class KnowledgeState {
|
class KnowledgeState {
|
||||||
final List<int> ids;
|
final List<int> ids;
|
||||||
@@ -150,6 +152,23 @@ class KnowledgeNotifier extends Notifier<KnowledgeState> {
|
|||||||
Future<void> _fetchFromScratch() async {
|
Future<void> _fetchFromScratch() async {
|
||||||
state = state.copyWith(isLoadingIds: true, error: null);
|
state = state.copyWith(isLoadingIds: true, error: null);
|
||||||
try {
|
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(
|
final (ids, total) = await _repo.fetchIds(
|
||||||
noteType: state.noteType,
|
noteType: state.noteType,
|
||||||
tags: state.activeTags,
|
tags: state.activeTags,
|
||||||
|
|||||||
@@ -74,15 +74,7 @@ class _KnowledgeScreenState extends ConsumerState<KnowledgeScreen>
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
String _tabLabel(int index, Map<String, int> counts) {
|
String _tabLabel(int index) => _kTabs[index].label;
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@@ -119,7 +111,7 @@ class _KnowledgeScreenState extends ConsumerState<KnowledgeScreen>
|
|||||||
tabAlignment: TabAlignment.start,
|
tabAlignment: TabAlignment.start,
|
||||||
tabs: List.generate(
|
tabs: List.generate(
|
||||||
_kTabs.length,
|
_kTabs.length,
|
||||||
(i) => Tab(text: _tabLabel(i, state.counts)),
|
(i) => Tab(text: _tabLabel(i)),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|||||||
Reference in New Issue
Block a user