// 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('wiki-items', () => []) const isLoading = useState('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 = {} // 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('/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 } }