Folders in Wiki
This commit is contained in:
@@ -12,22 +12,20 @@ export interface WikiPageItem {
|
||||
export const useWikiTree = () => {
|
||||
const { $api } = useNuxtApp()
|
||||
|
||||
// STATE
|
||||
// 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
|
||||
// --- Computed: Tree Logic ---
|
||||
const tree = computed(() => {
|
||||
const rawItems = items.value
|
||||
if (!rawItems || rawItems.length === 0) return []
|
||||
const rawItems = items.value || []
|
||||
if (!rawItems.length) return []
|
||||
|
||||
const roots: WikiPageItem[] = []
|
||||
const lookup: Record<string, WikiPageItem> = {}
|
||||
|
||||
// Init Lookup
|
||||
// Clone & Init
|
||||
rawItems.forEach(item => {
|
||||
lookup[item.id] = { ...item, children: [] }
|
||||
})
|
||||
@@ -42,15 +40,14 @@ export const useWikiTree = () => {
|
||||
}
|
||||
})
|
||||
|
||||
// Sort
|
||||
// Sort: Folders first, then 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)
|
||||
nodes.forEach(n => {
|
||||
if (n.children?.length) sortNodes(n.children)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -58,27 +55,47 @@ export const useWikiTree = () => {
|
||||
return roots
|
||||
})
|
||||
|
||||
// ACTIONS
|
||||
const loadTree = async (params: { entityType?: string, entityId?: number, entityUuid?: string } = {}) => {
|
||||
// --- Actions ---
|
||||
|
||||
const loadTree = async () => {
|
||||
isLoading.value = true
|
||||
try {
|
||||
const data = await $api<WikiPageItem[]>('/api/wiki/tree', {
|
||||
method: 'GET',
|
||||
query: params
|
||||
})
|
||||
const data = await $api<WikiPageItem[]>('/api/wiki/tree', { method: 'GET' })
|
||||
items.value = data
|
||||
} catch (e) { console.error(e) }
|
||||
finally { isLoading.value = false }
|
||||
}
|
||||
|
||||
// Zentralisierte Erstellen-Funktion
|
||||
const createItem = async (title: string, parentId: string | null, isFolder: boolean) => {
|
||||
try {
|
||||
const newItem = await $api('/api/wiki', {
|
||||
method: 'POST',
|
||||
body: { title, parentId, isFolder }
|
||||
})
|
||||
await loadTree() // Neu laden
|
||||
return newItem
|
||||
} catch (e) {
|
||||
console.error('Wiki Tree Load Error', e)
|
||||
} finally {
|
||||
isLoading.value = false
|
||||
alert('Fehler beim Erstellen')
|
||||
return null
|
||||
}
|
||||
}
|
||||
|
||||
// Löschen Funktion
|
||||
const deleteItem = async (id: string) => {
|
||||
if (!confirm('Wirklich löschen? Alle Unterseiten werden ebenfalls gelöscht.')) return
|
||||
try {
|
||||
await $api(`/api/wiki/${id}`, { method: 'DELETE' })
|
||||
await loadTree()
|
||||
return true
|
||||
} catch (e) {
|
||||
alert('Fehler beim Löschen')
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
tree,
|
||||
items,
|
||||
isLoading,
|
||||
isSidebarOpen, // Exportiert für Zugriff in Pages
|
||||
loadTree
|
||||
tree, items, isLoading, isSidebarOpen,
|
||||
loadTree, createItem, deleteItem
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user