mirror of
https://iceshrimp.dev/Crimekillz/jointrashposs.git
synced 2024-11-24 17:59:07 +01:00
(add) docs: iroiro
This commit is contained in:
parent
a73c7218cc
commit
91e4ce4b2a
@ -38,4 +38,21 @@ export function isLocalPath(link: string, base?: string): boolean {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const findDeepObject = (obj: Record<string, any>, condition: (v: any) => boolean): Record<string, any> | null => {
|
||||||
|
if (condition(obj)) {
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj?.children && obj.children.length > 0) {
|
||||||
|
for (let i = 0; i < obj.children.length; i++) {
|
||||||
|
const result = findDeepObject(obj.children[i], condition);
|
||||||
|
if (result) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
};
|
||||||
|
22
components/content/ApiPermissions.vue
Normal file
22
components/content/ApiPermissions.vue
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
<template>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Permisson</th>
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="permission in permissions">
|
||||||
|
<td><code>{{ permission }}</code></td>
|
||||||
|
<td>{{ $t(`_api._permissions.${permission}`) }}</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { permissions } from 'misskey-js';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped></style>
|
@ -29,14 +29,16 @@ const { locale } = useI18n();
|
|||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const slugs = (route.params.slug as string[]).filter((v) => v !== '');
|
const slugs = (route.params.slug as string[]).filter((v) => v !== '');
|
||||||
|
|
||||||
withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
ignoreDirBasedNav?: boolean;
|
ignoreDirBasedNav?: boolean;
|
||||||
|
isDir?: boolean;
|
||||||
}>(), {
|
}>(), {
|
||||||
ignoreDirBasedNav: false,
|
ignoreDirBasedNav: false,
|
||||||
|
isDir: false
|
||||||
});
|
});
|
||||||
|
|
||||||
const currentPath = `/${locale.value}/docs/${slugs.join('/')}`;
|
const currentPath = `/${locale.value}/docs/${slugs.join('/')}`;
|
||||||
const currentDirectory = `/${locale.value}/docs/${slugs.slice(0, -1).join('/')}`;
|
const currentDirectory = props.isDir ? `/${locale.value}/docs/${slugs.join('/')}` : `/${locale.value}/docs/${slugs.slice(0, -1).join('/')}`;
|
||||||
|
|
||||||
const [prev, next] = await queryContent().only(['_path', 'title']).where({ _path: { $contains: 'docs' }, _partial: false }).findSurround(currentPath);
|
const [prev, next] = await queryContent().only(['_path', 'title']).where({ _path: { $contains: 'docs' }, _partial: false }).findSurround(currentPath);
|
||||||
</script>
|
</script>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="relative container mx-auto max-w-screen-xl p-6 lg:py-0 grid docs-root pb-12">
|
<div class="relative container mx-auto max-w-screen-xl p-6 lg:py-0 grid docs-root pb-12">
|
||||||
<div class="lg:hidden sticky top-16 -mx-6 -mt-6 bg-white px-6 bg-opacity-60 backdrop-blur-lg z-[9890] border-b text-sm">
|
<div v-if="data?.body" class="lg:hidden sticky top-16 -mx-6 -mt-6 bg-white px-6 bg-opacity-60 backdrop-blur-lg z-[9890] border-b text-sm">
|
||||||
<details :open="openState">
|
<details :open="openState">
|
||||||
<summary class="py-4 cursor-pointer">{{ $t('_docs._toc.title') }}</summary>
|
<summary class="py-4 cursor-pointer">{{ $t('_docs._toc.title') }}</summary>
|
||||||
<div class="pb-4 overflow-y-auto">
|
<div class="pb-4 overflow-y-auto">
|
||||||
@ -10,18 +10,26 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="hidden lg:block">
|
<div class="hidden lg:block">
|
||||||
<div class="sticky top-16 h-[calc(100vh-4rem)] overflow-y-scroll border-r border-slate-200 dark:border-slate-700 py-6 pr-6">
|
<div class="sticky top-16 h-[calc(100vh-4rem)] overflow-y-scroll border-r border-slate-200 dark:border-slate-700 py-6 pr-6">
|
||||||
<DocsAsideTree :links="navigation" />
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="pt-6 lg:p-6 w-full overflow-x-hidden">
|
<div class="pt-6 lg:p-6 w-full overflow-x-hidden">
|
||||||
<ContentRenderer :value="data" class="markdown-body w-full mb-6">
|
<template v-if="data?.body">
|
||||||
</ContentRenderer>
|
<ContentRenderer v-if="data.body.children.length > 0" :value="data" class="markdown-body w-full mb-6">
|
||||||
<DocsPrevNext :ignore-dir-based-nav="data?.ignoreDirBasedNav ?? false" />
|
</ContentRenderer>
|
||||||
|
<DocsPrevNext :ignore-dir-based-nav="data?.ignoreDirBasedNav ?? false" />
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<div class="markdown-body">
|
||||||
|
<h1>{{ data?.title ?? data?._dir?.title }}</h1>
|
||||||
|
<MkIndex :is-dir="data?._file?.endsWith('index.md') || (!data?._file)" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<div class="hidden lg:block text-sm">
|
<div class="hidden lg:block text-sm">
|
||||||
<div class="sticky top-16 h-[calc(100vh-4rem)] overflow-y-auto py-6 pl-6">
|
<div class="sticky top-16 h-[calc(100vh-4rem)] overflow-y-auto py-6 pl-6">
|
||||||
<h3 class="font-bold mb-6">{{ $t('_docs._toc.title') }}</h3>
|
<h3 class="font-bold mb-6">{{ $t('_docs._toc.title') }}</h3>
|
||||||
<DocsTocLinks :links="data?.body.toc.links" />
|
<DocsTocLinks v-if="data?.body" :links="data?.body.toc.links" class="break-words" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -49,9 +57,10 @@ const slugs = (route.params.slug as string[]).filter((v) => v !== '');
|
|||||||
const { data } = await useAsyncData(`blog-${locale.value}-${slugs.join('-')}`, () => queryContent(`/${locale.value}/docs/${slugs.join('/')}`).findOne());
|
const { data } = await useAsyncData(`blog-${locale.value}-${slugs.join('-')}`, () => queryContent(`/${locale.value}/docs/${slugs.join('/')}`).findOne());
|
||||||
const { navigation } = await useAsyncData('navigation', () => fetchContentNavigation());
|
const { navigation } = await useAsyncData('navigation', () => fetchContentNavigation());
|
||||||
|
|
||||||
|
/*
|
||||||
if (!data.value) {
|
if (!data.value) {
|
||||||
throw createError({ statusCode: 404, statusMessage: 'page not found' });
|
throw createError({ statusCode: 404, statusMessage: 'page not found' });
|
||||||
}
|
}*/
|
||||||
|
|
||||||
route.meta.title = data.value?.title;
|
route.meta.title = data.value?.title;
|
||||||
</script>
|
</script>
|
||||||
|
@ -47,8 +47,8 @@
|
|||||||
}
|
}
|
||||||
]" />
|
]" />
|
||||||
<DocsReadersNav section-id="forUsers" id="forUsers" />
|
<DocsReadersNav section-id="forUsers" id="forUsers" />
|
||||||
<!--<DocsReadersNav section-id="forAdmin" id="forAdmin" />
|
<DocsReadersNav section-id="forAdmin" id="forAdmin" />
|
||||||
<DocsReadersNav section-id="forDevelopers" id="forDevelopers" />-->
|
<DocsReadersNav section-id="forDevelopers" id="forDevelopers" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user