84 lines
2.4 KiB
TypeScript
84 lines
2.4 KiB
TypeScript
// composables/useWikiTree.ts
|
|
export interface WikiPageItem {
|
|
id: string
|
|
parentId: string | null
|
|
title: string
|
|
isFolder: boolean
|
|
sortOrder: number
|
|
entityType?: string | null
|
|
children?: WikiPageItem[]
|
|
}
|
|
|
|
export const useWikiTree = () => {
|
|
const { $api } = useNuxtApp()
|
|
|
|
// STATE
|
|
const items = useState<WikiPageItem[]>('wiki-items', () => [])
|
|
const isLoading = useState<boolean>('wiki-loading', () => false)
|
|
|
|
// NEU: Globaler Sidebar State (Standardmäßig offen)
|
|
const isSidebarOpen = useState<boolean>('wiki-sidebar-open', () => true)
|
|
|
|
// COMPUTED: Tree Transformation
|
|
const tree = computed(() => {
|
|
const rawItems = items.value
|
|
if (!rawItems || rawItems.length === 0) return []
|
|
|
|
const roots: WikiPageItem[] = []
|
|
const lookup: Record<string, WikiPageItem> = {}
|
|
|
|
// Init Lookup
|
|
rawItems.forEach(item => {
|
|
lookup[item.id] = { ...item, children: [] }
|
|
})
|
|
|
|
// Build Tree
|
|
rawItems.forEach(item => {
|
|
const node = lookup[item.id]
|
|
if (item.parentId && lookup[item.parentId]) {
|
|
lookup[item.parentId].children?.push(node)
|
|
} else {
|
|
roots.push(node)
|
|
}
|
|
})
|
|
|
|
// Sort
|
|
const sortNodes = (nodes: WikiPageItem[]) => {
|
|
nodes.sort((a, b) => {
|
|
if (a.isFolder !== b.isFolder) return a.isFolder ? -1 : 1
|
|
if (a.sortOrder !== b.sortOrder) return a.sortOrder - b.sortOrder
|
|
return a.title.localeCompare(b.title)
|
|
})
|
|
nodes.forEach(node => {
|
|
if (node.children?.length) sortNodes(node.children)
|
|
})
|
|
}
|
|
|
|
sortNodes(roots)
|
|
return roots
|
|
})
|
|
|
|
// ACTIONS
|
|
const loadTree = async (params: { entityType?: string, entityId?: number, entityUuid?: string } = {}) => {
|
|
isLoading.value = true
|
|
try {
|
|
const data = await $api<WikiPageItem[]>('/api/wiki/tree', {
|
|
method: 'GET',
|
|
query: params
|
|
})
|
|
items.value = data
|
|
} catch (e) {
|
|
console.error('Wiki Tree Load Error', e)
|
|
} finally {
|
|
isLoading.value = false
|
|
}
|
|
}
|
|
|
|
return {
|
|
tree,
|
|
items,
|
|
isLoading,
|
|
isSidebarOpen, // Exportiert für Zugriff in Pages
|
|
loadTree
|
|
}
|
|
} |