Added Wiki
This commit is contained in:
83
frontend/composables/useWikiTree.ts
Normal file
83
frontend/composables/useWikiTree.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
// composables/useWikiTree.ts
|
||||
export interface WikiPageItem {
|
||||
id: string
|
||||
parentId: string | null
|
||||
title: string
|
||||
isFolder: boolean
|
||||
sortOrder: number
|
||||
entityType?: string | null
|
||||
// children wird im Frontend berechnet
|
||||
children?: WikiPageItem[]
|
||||
}
|
||||
|
||||
export const useWikiTree = () => {
|
||||
const { $api } = useNuxtApp()
|
||||
|
||||
// Globaler State (bleibt beim Navigieren erhalten)
|
||||
const items = useState<WikiPageItem[]>('wiki-items', () => [])
|
||||
const isLoading = useState<boolean>('wiki-loading', () => false)
|
||||
|
||||
// --- Computed: Flat List zu Baum ---
|
||||
const tree = computed(() => {
|
||||
const rawItems = items.value
|
||||
if (!rawItems || rawItems.length === 0) return []
|
||||
|
||||
const roots: WikiPageItem[] = []
|
||||
const lookup: Record<string, WikiPageItem> = {}
|
||||
|
||||
// 1. Kopieren & Lookup füllen
|
||||
rawItems.forEach(item => {
|
||||
lookup[item.id] = { ...item, children: [] }
|
||||
})
|
||||
|
||||
// 2. Verknüpfen
|
||||
rawItems.forEach(item => {
|
||||
const node = lookup[item.id]
|
||||
if (item.parentId && lookup[item.parentId]) {
|
||||
lookup[item.parentId].children?.push(node)
|
||||
} else {
|
||||
roots.push(node)
|
||||
}
|
||||
})
|
||||
|
||||
// 3. Sortieren (Ordner zuerst, dann SortOrder, dann Alphabet)
|
||||
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 ---
|
||||
|
||||
/**
|
||||
* Lädt den Baum.
|
||||
* params kann { entityType: 'customer', entityId: 100 } enthalten.
|
||||
*/
|
||||
const loadTree = async (params: { entityType?: string, entityId?: number, entityUuid?: string } = {}) => {
|
||||
isLoading.value = true
|
||||
try {
|
||||
// Wichtig: Bei GET nutzen wir 'query' für Parameter
|
||||
const data = await $api<WikiPageItem[]>('/api/wiki/tree', {
|
||||
method: 'GET',
|
||||
query: params
|
||||
})
|
||||
items.value = data
|
||||
} catch (e) {
|
||||
// Fehler werden vom Plugin (Toast) behandelt, hier nur Log
|
||||
console.error('Wiki Tree Load Error', e)
|
||||
} finally {
|
||||
isLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
return { tree, items, isLoading, loadTree }
|
||||
}
|
||||
Reference in New Issue
Block a user