fix: #16 sortOption 接入后端排序 API
- KnowledgeItemService.list 加 sortBy/order 参数 - loadItems/refresh/loadMore 加 sortBy/order 参数 - sortOption onChange 触发重新加载 - sortParams 映射函数: 0→默认, 1→fileSize, 2→createdAt, 3→updatedAt Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
99dc2807be
commit
695518b276
@ -149,10 +149,11 @@ class KnowledgeItemService {
|
|||||||
static let shared = KnowledgeItemService()
|
static let shared = KnowledgeItemService()
|
||||||
private let client = APIClient.shared
|
private let client = APIClient.shared
|
||||||
|
|
||||||
func list(knowledgeBaseId: String) async throws -> [KnowledgeItem] {
|
func list(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async throws -> [KnowledgeItem] {
|
||||||
return try await client.request("/knowledge-items", queryItems: [
|
var items = [URLQueryItem(name: "knowledgeBaseId", value: knowledgeBaseId)]
|
||||||
URLQueryItem(name: "knowledgeBaseId", value: knowledgeBaseId),
|
if let s = sortBy { items.append(URLQueryItem(name: "sortBy", value: s)) }
|
||||||
])
|
if let o = order { items.append(URLQueryItem(name: "order", value: o)) }
|
||||||
|
return try await client.request("/knowledge-items", queryItems: items)
|
||||||
}
|
}
|
||||||
|
|
||||||
func detail(id: String) async throws -> KnowledgeItem {
|
func detail(id: String) async throws -> KnowledgeItem {
|
||||||
|
|||||||
@ -392,6 +392,10 @@ struct LibraryDetailPage: View {
|
|||||||
Text("确定要删除选中的 \(selectedIds.count) 个知识点吗?此操作不可恢复。")
|
Text("确定要删除选中的 \(selectedIds.count) 个知识点吗?此操作不可恢复。")
|
||||||
}
|
}
|
||||||
.task { await viewModel.loadItems(knowledgeBaseId: knowledgeBaseId) }
|
.task { await viewModel.loadItems(knowledgeBaseId: knowledgeBaseId) }
|
||||||
|
.onChange(of: sortOption) { _ in
|
||||||
|
let (sb, od) = sortParams(sortOption)
|
||||||
|
Task { await viewModel.loadItems(knowledgeBaseId: knowledgeBaseId, sortBy: sb, order: od) }
|
||||||
|
}
|
||||||
.safeAreaInset(edge: .bottom) {
|
.safeAreaInset(edge: .bottom) {
|
||||||
NavigationLink(value: Route.aiChat(context: ChatEntryContext(scopeType: .knowledgeBase, scopeId: knowledgeBaseId, scopeName: "知识库", parentKnowledgeBaseId: knowledgeBaseId, createdFrom: "knowledge_base_detail"))) {
|
NavigationLink(value: Route.aiChat(context: ChatEntryContext(scopeType: .knowledgeBase, scopeId: knowledgeBaseId, scopeName: "知识库", parentKnowledgeBaseId: knowledgeBaseId, createdFrom: "knowledge_base_detail"))) {
|
||||||
HStack(spacing: 8) {
|
HStack(spacing: 8) {
|
||||||
@ -496,6 +500,15 @@ struct LibraryDetailPage: View {
|
|||||||
return URL(string: "https://longde.cloud\(urlString)")
|
return URL(string: "https://longde.cloud\(urlString)")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func sortParams(_ option: Int) -> (String?, String?) {
|
||||||
|
switch option {
|
||||||
|
case 1: return ("fileSize", "desc")
|
||||||
|
case 2: return ("createdAt", "desc")
|
||||||
|
case 3: return ("updatedAt", "desc")
|
||||||
|
default: return (nil, nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func fileTypeText(for item: KnowledgeItem) -> String {
|
private func fileTypeText(for item: KnowledgeItem) -> String {
|
||||||
if let t = item.sourceType?.trimmingCharacters(in: .whitespaces), !t.isEmpty {
|
if let t = item.sourceType?.trimmingCharacters(in: .whitespaces), !t.isEmpty {
|
||||||
return t.uppercased()
|
return t.uppercased()
|
||||||
|
|||||||
@ -92,13 +92,13 @@ class LibraryDetailViewModel: ObservableObject {
|
|||||||
private var currentPage = 1
|
private var currentPage = 1
|
||||||
private let pageSize = 20
|
private let pageSize = 20
|
||||||
|
|
||||||
func loadItems(knowledgeBaseId: String) async {
|
func loadItems(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async {
|
||||||
isLoading = true
|
isLoading = true
|
||||||
errorMessage = nil
|
errorMessage = nil
|
||||||
currentPage = 1
|
currentPage = 1
|
||||||
do {
|
do {
|
||||||
async let kb = try? KnowledgeBaseService.shared.detail(id: knowledgeBaseId)
|
async let kb = try? KnowledgeBaseService.shared.detail(id: knowledgeBaseId)
|
||||||
async let list = try? KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId)
|
async let list = try? KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId, sortBy: sortBy, order: order)
|
||||||
let (kbResult, listResult) = await (kb, list)
|
let (kbResult, listResult) = await (kb, list)
|
||||||
knowledgeBase = kbResult
|
knowledgeBase = kbResult
|
||||||
items = listResult ?? []
|
items = listResult ?? []
|
||||||
@ -109,22 +109,22 @@ class LibraryDetailViewModel: ObservableObject {
|
|||||||
isLoading = false
|
isLoading = false
|
||||||
}
|
}
|
||||||
|
|
||||||
func refresh(knowledgeBaseId: String) async {
|
func refresh(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async {
|
||||||
isRefreshing = true
|
isRefreshing = true
|
||||||
currentPage = 1
|
currentPage = 1
|
||||||
do {
|
do {
|
||||||
items = try await KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId)
|
items = try await KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId, sortBy: sortBy, order: order)
|
||||||
hasMore = items.count >= pageSize
|
hasMore = items.count >= pageSize
|
||||||
} catch {}
|
} catch {}
|
||||||
isRefreshing = false
|
isRefreshing = false
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadMore(knowledgeBaseId: String) async {
|
func loadMore(knowledgeBaseId: String, sortBy: String? = nil, order: String? = nil) async {
|
||||||
guard !isLoadingMore, hasMore else { return }
|
guard !isLoadingMore, hasMore else { return }
|
||||||
isLoadingMore = true
|
isLoadingMore = true
|
||||||
currentPage += 1
|
currentPage += 1
|
||||||
do {
|
do {
|
||||||
let more = try await KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId)
|
let more = try await KnowledgeItemService.shared.list(knowledgeBaseId: knowledgeBaseId, sortBy: sortBy, order: order)
|
||||||
items.append(contentsOf: more)
|
items.append(contentsOf: more)
|
||||||
hasMore = more.count >= pageSize
|
hasMore = more.count >= pageSize
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user