Fix KB sidebar not updating after save and missing URL routing for /kb
- Emit updated_at from KbEditor, re-sort article list after save - Push /kb to history when entering KB mode - Handle /kb path in parseUrl and popstate for proper navigation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -19,24 +19,33 @@ const selectedArticleId = ref('')
|
|||||||
|
|
||||||
const isReportPage = computed(() => !!reportWorkflowId.value)
|
const isReportPage = computed(() => !!reportWorkflowId.value)
|
||||||
|
|
||||||
function parseUrl(): { projectId: string; reportId: string } {
|
function parseUrl(): { projectId: string; reportId: string; kb: boolean } {
|
||||||
const reportMatch = location.pathname.match(/^\/report\/([^/]+)/)
|
const reportMatch = location.pathname.match(/^\/report\/([^/]+)/)
|
||||||
if (reportMatch) return { projectId: '', reportId: reportMatch[1] ?? '' }
|
if (reportMatch) return { projectId: '', reportId: reportMatch[1] ?? '', kb: false }
|
||||||
|
if (location.pathname.startsWith('/kb')) return { projectId: '', reportId: '', kb: true }
|
||||||
const projectMatch = location.pathname.match(/^\/projects\/([^/]+)/)
|
const projectMatch = location.pathname.match(/^\/projects\/([^/]+)/)
|
||||||
return { projectId: projectMatch?.[1] ?? '', reportId: '' }
|
return { projectId: projectMatch?.[1] ?? '', reportId: '', kb: false }
|
||||||
}
|
}
|
||||||
|
|
||||||
function onPopState() {
|
function onPopState() {
|
||||||
const { projectId, reportId } = parseUrl()
|
const { projectId, reportId, kb } = parseUrl()
|
||||||
selectedProjectId.value = projectId
|
if (kb) {
|
||||||
reportWorkflowId.value = reportId
|
onOpenKb()
|
||||||
|
} else {
|
||||||
|
showKb.value = false
|
||||||
|
selectedArticleId.value = ''
|
||||||
|
selectedProjectId.value = projectId
|
||||||
|
reportWorkflowId.value = reportId
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
try {
|
try {
|
||||||
projects.value = await api.listProjects()
|
projects.value = await api.listProjects()
|
||||||
const { projectId, reportId } = parseUrl()
|
const { projectId, reportId, kb } = parseUrl()
|
||||||
if (reportId) {
|
if (kb) {
|
||||||
|
onOpenKb()
|
||||||
|
} else if (reportId) {
|
||||||
reportWorkflowId.value = reportId
|
reportWorkflowId.value = reportId
|
||||||
} else if (projectId && projects.value.some(p => p.id === projectId)) {
|
} else if (projectId && projects.value.some(p => p.id === projectId)) {
|
||||||
selectedProjectId.value = projectId
|
selectedProjectId.value = projectId
|
||||||
@@ -107,6 +116,9 @@ async function onOpenKb() {
|
|||||||
showKb.value = true
|
showKb.value = true
|
||||||
selectedProjectId.value = ''
|
selectedProjectId.value = ''
|
||||||
creating.value = false
|
creating.value = false
|
||||||
|
if (location.pathname !== '/kb') {
|
||||||
|
history.pushState(null, '', '/kb')
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
kbArticles.value = await api.listArticles()
|
kbArticles.value = await api.listArticles()
|
||||||
if (kbArticles.value.length > 0 && !selectedArticleId.value) {
|
if (kbArticles.value.length > 0 && !selectedArticleId.value) {
|
||||||
@@ -148,9 +160,14 @@ async function onDeleteArticle(id: string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function onArticleSaved(id: string, title: string) {
|
function onArticleSaved(id: string, title: string, updatedAt: string) {
|
||||||
const a = kbArticles.value.find(a => a.id === id)
|
const a = kbArticles.value.find(a => a.id === id)
|
||||||
if (a) a.title = title
|
if (a) {
|
||||||
|
a.title = title
|
||||||
|
a.updated_at = updatedAt
|
||||||
|
}
|
||||||
|
// Re-sort by updated_at descending
|
||||||
|
kbArticles.value.sort((a, b) => b.updated_at.localeCompare(a.updated_at))
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ watch(() => props.articleId, (id) => {
|
|||||||
}, { immediate: true })
|
}, { immediate: true })
|
||||||
|
|
||||||
const emit = defineEmits<{
|
const emit = defineEmits<{
|
||||||
saved: [id: string, title: string]
|
saved: [id: string, title: string, updatedAt: string]
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
async function save() {
|
async function save() {
|
||||||
@@ -43,7 +43,7 @@ async function save() {
|
|||||||
content: content.value,
|
content: content.value,
|
||||||
})
|
})
|
||||||
message.value = 'Saved & indexed'
|
message.value = 'Saved & indexed'
|
||||||
emit('saved', updated.id, updated.title)
|
emit('saved', updated.id, updated.title, updated.updated_at)
|
||||||
setTimeout(() => { message.value = '' }, 2000)
|
setTimeout(() => { message.value = '' }, 2000)
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
message.value = 'Error: ' + e.message
|
message.value = 'Error: ' + e.message
|
||||||
|
|||||||
Reference in New Issue
Block a user