diff --git a/components/base/TextInput.vue b/components/base/TextInput.vue index 6e87134..73116e6 100644 --- a/components/base/TextInput.vue +++ b/components/base/TextInput.vue @@ -5,7 +5,7 @@ class="mx-4 caret-light-50 dark:caret-dark-50 text-light-100 dark:text-dark-100 placeholder:text-light-50 dark:placeholder:text-dark-50 bg-light-20 dark:bg-dark-20 appearance-none outline-none px-3 py-1 focus:shadow-raw transition-[box-shadow] focus:shadow-light-40 dark:focus:shadow-dark-40 border border-light-35 dark:border-dark-35 hover:border-light-50 dark:hover:border-dark-50 data-[disabled]:bg-light-20 dark:data-[disabled]:bg-dark-20 data-[disabled]:border-light-20 dark:data-[disabled]:border-dark-20" - :type="type" v-model="model" :data-disabled="disabled || undefined" v-bind="$attrs"> + :type="type" v-model="model" :data-disabled="disabled || undefined" v-bind="$attrs" @change="(e) => emits('change', e)" @input="(e) => emits('input', e)"> @@ -16,5 +16,10 @@ const { type = 'text', label, disabled = false, placeholder } = defineProps<{ disabled?: boolean placeholder?: string }>(); + +const emits = defineEmits<{ + change: [Event] + input: [Event] +}>(); const model = defineModel(); \ No newline at end of file diff --git a/db.sqlite b/db.sqlite index eaaf28d..aa7631b 100644 Binary files a/db.sqlite and b/db.sqlite differ diff --git a/db.sqlite-shm b/db.sqlite-shm index 771dbce..f0a2a5f 100644 Binary files a/db.sqlite-shm and b/db.sqlite-shm differ diff --git a/db.sqlite-wal b/db.sqlite-wal index e916ca2..67d5eed 100644 Binary files a/db.sqlite-wal and b/db.sqlite-wal differ diff --git a/pages/explore/edit/index.vue b/pages/explore/edit/index.vue index 017e55e..0c67441 100644 --- a/pages/explore/edit/index.vue +++ b/pages/explore/edit/index.vue @@ -5,16 +5,26 @@
+ :items="navigation ?? undefined" :get-key="(item: Partial) => item.path !== undefined ? getPath(item as ProjectExtendedItem) : ''" @updateTree="drop"> - \ No newline at end of file diff --git a/schemas/project.ts b/schemas/project.ts index 3c43805..7e7416f 100644 --- a/schemas/project.ts +++ b/schemas/project.ts @@ -4,6 +4,7 @@ import { fileType } from "./file"; const baseItem = z.object({ path: z.string(), parent: z.string(), + name: z.string(), title: z.string(), type: fileType, navigable: z.boolean(), diff --git a/server/api/project.get.ts b/server/api/project.get.ts index 68ba992..35b9398 100644 --- a/server/api/project.get.ts +++ b/server/api/project.get.ts @@ -26,6 +26,10 @@ export default defineEventHandler(async (e) => { order: explorerContentTable.order, }).from(explorerContentTable).prepare().all(); + content.sort((a, b) => { + return a.path.split('/').length - b.path.split('/').length; + }); + if(content.length > 0) { const project: Project = { diff --git a/server/api/project.post.ts b/server/api/project.post.ts index c54a735..b9929c5 100644 --- a/server/api/project.post.ts +++ b/server/api/project.post.ts @@ -28,7 +28,7 @@ export default defineEventHandler(async (e) => { for(let i = full.length - 1; i >= 0; i--) { - if(items.find(e => (e.path === '' ? [e.parent, parsePath(e.title)].filter(e => !!e).join('/') : e.path) === full[i].path)) + if(items.find(e => (e.path === '' ? [e.parent, parsePath(e.name === '' ? e.title : e.name)].filter(e => !!e).join('/') : e.path) === full[i].path)) full.splice(i, 1); } @@ -48,7 +48,7 @@ export default defineEventHandler(async (e) => { content: null, }).onConflictDoUpdate({ set: { - path: [item.parent, parsePath(item.title)].filter(e => !!e).join('/'), + path: [item.parent, parsePath(item.name === '' ? item.title : item.name)].filter(e => !!e).join('/'), title: item.title, type: item.type, navigable: item.navigable, diff --git a/server/tasks/push.ts b/server/tasks/push.ts index 12e297d..7539c6e 100644 --- a/server/tasks/push.ts +++ b/server/tasks/push.ts @@ -35,7 +35,7 @@ export default defineTask({ const path = (e.path as string).split('/').map(f => { const check = /(\d+)\. ?(.+)/gsmi.exec(f); return check && check[2] ? check[2] : f }).join('/'); return { path: path.toLowerCase().replaceAll(" ", "-").normalize("NFD").replace(/[\u0300-\u036f]/g, ""), - //order: order && order[1] ? order[1] : 50, + order: order && order[1] ? order[1] : 0, title: order && order[2] ? order[2] : title, type: 'folder', content: null, @@ -53,7 +53,7 @@ export default defineTask({ return { path: (extension === '.md' ? path.replace(extension, '') : path).toLowerCase().replaceAll(" ", "-").normalize("NFD").replace(/[\u0300-\u036f]/g, ""), - //order: order && order[1] ? order[1] : 50, + order: order && order[1] ? order[1] : 0, title: order && order[2] ? order[2] : title, type: (typeMapping[extension] ?? 'file'), content: reshapeContent(content as string, typeMapping[extension] ?? 'File'), diff --git a/shared/general.utils.ts b/shared/general.utils.ts index efb2b4f..8562dc0 100644 --- a/shared/general.utils.ts +++ b/shared/general.utils.ts @@ -6,7 +6,7 @@ export function unifySlug(slug: string | string[]): string } export function parsePath(path: string): string { - return path.toLowerCase().replaceAll(" ", "-").normalize("NFD").replace(/[\u0300-\u036f]/g, ""); + return path.toLowerCase().replaceAll(" ", "-").normalize("NFD").replaceAll(/[\u0300-\u036f]/g, "").replaceAll('(', '').replaceAll(')', ''); } export function parseId(id: string | undefined): string |undefined {