pocketbase/ui/src/components/collections/CollectionDocsPanel.svelte

168 lines
5.7 KiB
Svelte
Raw Normal View History

2022-10-30 16:28:14 +08:00
<script>
import { Collection } from "pocketbase";
import OverlayPanel from "@/components/base/OverlayPanel.svelte";
const baseTabs = {
list: {
label: "List/Search",
component: import("@/components/collections/docs/ListApiDocs.svelte"),
},
view: {
label: "View",
component: import("@/components/collections/docs/ViewApiDocs.svelte"),
},
create: {
label: "Create",
component: import("@/components/collections/docs/CreateApiDocs.svelte"),
},
update: {
label: "Update",
component: import("@/components/collections/docs/UpdateApiDocs.svelte"),
},
delete: {
label: "Delete",
component: import("@/components/collections/docs/DeleteApiDocs.svelte"),
},
realtime: {
label: "Realtime",
component: import("@/components/collections/docs/RealtimeApiDocs.svelte"),
},
};
const authTabs = {
"auth-with-password": {
label: "Auth with password",
component: import("@/components/collections/docs/AuthWithPasswordDocs.svelte"),
},
"auth-with-oauth2": {
label: "Auth with OAuth2",
component: import("@/components/collections/docs/AuthWithOAuth2Docs.svelte"),
},
refresh: {
label: "Auth refresh",
component: import("@/components/collections/docs/AuthRefreshDocs.svelte"),
},
"request-verification": {
label: "Request verification",
component: import("@/components/collections/docs/RequestVerificationDocs.svelte"),
},
"confirm-verification": {
label: "Confirm verification",
component: import("@/components/collections/docs/ConfirmVerificationDocs.svelte"),
},
"request-password-reset": {
label: "Request password reset",
component: import("@/components/collections/docs/RequestPasswordResetDocs.svelte"),
},
"confirm-password-reset": {
label: "Confirm password reset",
component: import("@/components/collections/docs/ConfirmPasswordResetDocs.svelte"),
},
"request-email-change": {
label: "Request email change",
component: import("@/components/collections/docs/RequestEmailChangeDocs.svelte"),
},
"confirm-email-change": {
label: "Confirm email change",
component: import("@/components/collections/docs/ConfirmEmailChangeDocs.svelte"),
},
"list-auth-methods": {
label: "List auth methods",
component: import("@/components/collections/docs/AuthMethodsDocs.svelte"),
},
"list-linked-accounts": {
label: "List OAuth2 accounts",
component: import("@/components/collections/docs/ListExternalAuthsDocs.svelte"),
},
"unlink-account": {
label: "Unlink OAuth2 account",
component: import("@/components/collections/docs/UnlinkExternalAuthDocs.svelte"),
},
};
let docsPanel;
let collection = new Collection();
let activeTab;
let tabs = [];
2023-03-28 00:43:46 +08:00
$: if (collection.$isAuth) {
2022-10-30 16:28:14 +08:00
tabs = Object.assign({}, baseTabs, authTabs);
if (!collection?.options.allowUsernameAuth && !collection?.options.allowEmailAuth) {
delete tabs["auth-with-password"];
}
if (!collection?.options.allowOAuth2Auth) {
delete tabs["auth-with-oauth2"];
}
2023-03-28 00:43:46 +08:00
} else if (collection.$isView) {
2023-02-19 01:33:42 +08:00
tabs = Object.assign({}, baseTabs);
delete tabs.create;
delete tabs.update;
delete tabs.delete;
delete tabs.realtime;
2022-10-30 16:28:14 +08:00
} else {
tabs = Object.assign({}, baseTabs);
}
// reset active tab on tabs list change
if (tabs.length) {
activeTab = Object.keys(tabs)[0];
}
export function show(model) {
collection = model;
changeTab(Object.keys(tabs)[0]);
return docsPanel?.show();
}
export function hide() {
return docsPanel?.hide();
}
export function changeTab(newTab) {
activeTab = newTab;
}
</script>
<OverlayPanel bind:this={docsPanel} on:hide on:show class="docs-panel">
<div class="docs-content-wrapper">
2023-03-28 00:43:46 +08:00
<aside class="docs-sidebar" class:compact={collection?.$isAuth}>
2022-10-30 16:28:14 +08:00
<nav class="sidebar-content">
2022-11-03 17:36:59 +08:00
{#each Object.entries(tabs) as [key, tab], i (key)}
<!-- add a separator before the first auth tab -->
{#if i === Object.keys(baseTabs).length}
<hr class="m-t-sm m-b-sm" />
{/if}
2022-10-30 16:28:14 +08:00
<button
type="button"
class="sidebar-item"
class:active={activeTab === key}
on:click={() => changeTab(key)}
>
{tab.label}
</button>
{/each}
</nav>
</aside>
<div class="docs-content">
{#each Object.entries(tabs) as [key, tab] (key)}
{#if activeTab === key}
{#await tab.component then { default: TabComponent }}
<TabComponent {collection} />
{/await}
{/if}
{/each}
</div>
</div>
<!-- visible only on small screens -->
<svelte:fragment slot="footer">
<button type="button" class="btn btn-transparent" on:click={() => hide()}>
2022-10-30 16:28:14 +08:00
<span class="txt">Close</span>
</button>
</svelte:fragment>
</OverlayPanel>