@aphexcms/cms-core 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/assets.d.ts +48 -0
- package/dist/api/assets.d.ts.map +1 -0
- package/dist/api/assets.js +52 -0
- package/dist/api/client.d.ts +37 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +125 -0
- package/dist/api/documents.d.ts +56 -0
- package/dist/api/documents.d.ts.map +1 -0
- package/dist/api/documents.js +77 -0
- package/dist/api/index.d.ts +7 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +5 -0
- package/dist/api/organizations.d.ts +101 -0
- package/dist/api/organizations.d.ts.map +1 -0
- package/dist/api/organizations.js +92 -0
- package/dist/api/types.d.ts +23 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +1 -0
- package/dist/app.d.ts +19 -0
- package/dist/auth/MULTI_TENANCY_PLAN.md +1183 -0
- package/dist/auth/auth-errors.d.ts +7 -0
- package/dist/auth/auth-errors.d.ts.map +1 -0
- package/dist/auth/auth-errors.js +13 -0
- package/dist/auth/auth-hooks.d.ts +6 -0
- package/dist/auth/auth-hooks.d.ts.map +1 -0
- package/dist/auth/auth-hooks.js +108 -0
- package/dist/auth/provider.d.ts +17 -0
- package/dist/auth/provider.d.ts.map +1 -0
- package/dist/auth/provider.js +1 -0
- package/dist/client/index.d.ts +24 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +31 -0
- package/dist/components/AdminApp.svelte +1077 -0
- package/dist/components/AdminApp.svelte.d.ts +24 -0
- package/dist/components/AdminApp.svelte.d.ts.map +1 -0
- package/dist/components/admin/AdminLayout.svelte +115 -0
- package/dist/components/admin/AdminLayout.svelte.d.ts +15 -0
- package/dist/components/admin/AdminLayout.svelte.d.ts.map +1 -0
- package/dist/components/admin/DocumentEditor.svelte +795 -0
- package/dist/components/admin/DocumentEditor.svelte.d.ts +18 -0
- package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -0
- package/dist/components/admin/DocumentTypesList.svelte +97 -0
- package/dist/components/admin/DocumentTypesList.svelte.d.ts +14 -0
- package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +1 -0
- package/dist/components/admin/ObjectModal.svelte +135 -0
- package/dist/components/admin/ObjectModal.svelte.d.ts +15 -0
- package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -0
- package/dist/components/admin/SchemaField.svelte +171 -0
- package/dist/components/admin/SchemaField.svelte.d.ts +19 -0
- package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/ArrayField.svelte +266 -0
- package/dist/components/admin/fields/ArrayField.svelte.d.ts +12 -0
- package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/BooleanField.svelte +35 -0
- package/dist/components/admin/fields/BooleanField.svelte.d.ts +13 -0
- package/dist/components/admin/fields/BooleanField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/ImageField.svelte +284 -0
- package/dist/components/admin/fields/ImageField.svelte.d.ts +15 -0
- package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/NumberField.svelte +82 -0
- package/dist/components/admin/fields/NumberField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/NumberField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/ReferenceField.svelte +260 -0
- package/dist/components/admin/fields/ReferenceField.svelte.d.ts +12 -0
- package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/SlugField.svelte +74 -0
- package/dist/components/admin/fields/SlugField.svelte.d.ts +15 -0
- package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/StringField.svelte +40 -0
- package/dist/components/admin/fields/StringField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -0
- package/dist/components/admin/fields/TextareaField.svelte +40 -0
- package/dist/components/admin/fields/TextareaField.svelte.d.ts +14 -0
- package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -0
- package/dist/components/fields/index.d.ts +9 -0
- package/dist/components/fields/index.d.ts.map +1 -0
- package/dist/components/fields/index.js +9 -0
- package/dist/components/index.d.ts +7 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +12 -0
- package/dist/components/layout/OrganizationSwitcher.svelte +218 -0
- package/dist/components/layout/OrganizationSwitcher.svelte.d.ts +11 -0
- package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -0
- package/dist/components/layout/Sidebar.svelte +88 -0
- package/dist/components/layout/Sidebar.svelte.d.ts +14 -0
- package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/AppSidebar.svelte +63 -0
- package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +11 -0
- package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/NavMain.svelte +95 -0
- package/dist/components/layout/sidebar/NavMain.svelte.d.ts +19 -0
- package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/NavSecondary.svelte +69 -0
- package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts +9 -0
- package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts.map +1 -0
- package/dist/components/layout/sidebar/NavUser.svelte +85 -0
- package/dist/components/layout/sidebar/NavUser.svelte.d.ts +9 -0
- package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +1 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +15 -0
- package/dist/db/adapters/index.d.ts +1 -0
- package/dist/db/adapters/index.d.ts.map +1 -0
- package/dist/db/adapters/index.js +4 -0
- package/dist/db/index.d.ts +2 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +4 -0
- package/dist/db/interfaces/asset.d.ts +51 -0
- package/dist/db/interfaces/asset.d.ts.map +1 -0
- package/dist/db/interfaces/asset.js +1 -0
- package/dist/db/interfaces/document.d.ts +36 -0
- package/dist/db/interfaces/document.d.ts.map +1 -0
- package/dist/db/interfaces/document.js +1 -0
- package/dist/db/interfaces/index.d.ts +73 -0
- package/dist/db/interfaces/index.d.ts.map +1 -0
- package/dist/db/interfaces/index.js +1 -0
- package/dist/db/interfaces/organization.d.ts +27 -0
- package/dist/db/interfaces/organization.d.ts.map +1 -0
- package/dist/db/interfaces/organization.js +1 -0
- package/dist/db/interfaces/schema.d.ts +21 -0
- package/dist/db/interfaces/schema.d.ts.map +1 -0
- package/dist/db/interfaces/schema.js +1 -0
- package/dist/db/interfaces/user.d.ts +15 -0
- package/dist/db/interfaces/user.d.ts.map +1 -0
- package/dist/db/interfaces/user.js +1 -0
- package/dist/db/utils/reference-resolver.d.ts +18 -0
- package/dist/db/utils/reference-resolver.d.ts.map +1 -0
- package/dist/db/utils/reference-resolver.js +80 -0
- package/dist/define.d.ts +3 -0
- package/dist/define.d.ts.map +1 -0
- package/dist/define.js +4 -0
- package/dist/email/index.d.ts +2 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +4 -0
- package/dist/email/interfaces/email.d.ts +42 -0
- package/dist/email/interfaces/email.d.ts.map +1 -0
- package/dist/email/interfaces/email.js +1 -0
- package/dist/engine.d.ts +26 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +66 -0
- package/dist/field-validation/rule.d.ts +51 -0
- package/dist/field-validation/rule.d.ts.map +1 -0
- package/dist/field-validation/rule.js +221 -0
- package/dist/field-validation/utils.d.ts +21 -0
- package/dist/field-validation/utils.d.ts.map +1 -0
- package/dist/field-validation/utils.js +66 -0
- package/dist/hooks.d.ts +23 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +96 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/plugins/README.md +154 -0
- package/dist/routes/assets-by-id.d.ts +5 -0
- package/dist/routes/assets-by-id.d.ts.map +1 -0
- package/dist/routes/assets-by-id.js +138 -0
- package/dist/routes/assets-cdn.d.ts +3 -0
- package/dist/routes/assets-cdn.d.ts.map +1 -0
- package/dist/routes/assets-cdn.js +155 -0
- package/dist/routes/assets.d.ts +4 -0
- package/dist/routes/assets.d.ts.map +1 -0
- package/dist/routes/assets.js +94 -0
- package/dist/routes/documents-by-id.d.ts +5 -0
- package/dist/routes/documents-by-id.d.ts.map +1 -0
- package/dist/routes/documents-by-id.js +142 -0
- package/dist/routes/documents-publish.d.ts +4 -0
- package/dist/routes/documents-publish.d.ts.map +1 -0
- package/dist/routes/documents-publish.js +151 -0
- package/dist/routes/documents.d.ts +4 -0
- package/dist/routes/documents.d.ts.map +1 -0
- package/dist/routes/documents.js +131 -0
- package/dist/routes/index.d.ts +6 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +10 -0
- package/dist/routes/organizations-by-id.d.ts +5 -0
- package/dist/routes/organizations-by-id.d.ts.map +1 -0
- package/dist/routes/organizations-by-id.js +187 -0
- package/dist/routes/organizations-invitations.d.ts +4 -0
- package/dist/routes/organizations-invitations.d.ts.map +1 -0
- package/dist/routes/organizations-invitations.js +125 -0
- package/dist/routes/organizations-members.d.ts +5 -0
- package/dist/routes/organizations-members.d.ts.map +1 -0
- package/dist/routes/organizations-members.js +206 -0
- package/dist/routes/organizations-switch.d.ts +3 -0
- package/dist/routes/organizations-switch.d.ts.map +1 -0
- package/dist/routes/organizations-switch.js +53 -0
- package/dist/routes/organizations.d.ts +4 -0
- package/dist/routes/organizations.d.ts.map +1 -0
- package/dist/routes/organizations.js +108 -0
- package/dist/routes/schemas-by-type.d.ts +3 -0
- package/dist/routes/schemas-by-type.d.ts.map +1 -0
- package/dist/routes/schemas-by-type.js +25 -0
- package/dist/routes/schemas.d.ts +3 -0
- package/dist/routes/schemas.d.ts.map +1 -0
- package/dist/routes/schemas.js +11 -0
- package/dist/routes-exports.d.ts +14 -0
- package/dist/routes-exports.d.ts.map +1 -0
- package/dist/routes-exports.js +19 -0
- package/dist/schema-context.svelte.d.ts +10 -0
- package/dist/schema-context.svelte.d.ts.map +1 -0
- package/dist/schema-context.svelte.js +18 -0
- package/dist/schema-utils/cleanup.d.ts +21 -0
- package/dist/schema-utils/cleanup.d.ts.map +1 -0
- package/dist/schema-utils/cleanup.js +80 -0
- package/dist/schema-utils/index.d.ts +4 -0
- package/dist/schema-utils/index.d.ts.map +1 -0
- package/dist/schema-utils/index.js +4 -0
- package/dist/schema-utils/utils.d.ts +30 -0
- package/dist/schema-utils/utils.d.ts.map +1 -0
- package/dist/schema-utils/utils.js +37 -0
- package/dist/schema-utils/validator.d.ts +6 -0
- package/dist/schema-utils/validator.d.ts.map +1 -0
- package/dist/schema-utils/validator.js +45 -0
- package/dist/server/index.d.ts +16 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +28 -0
- package/dist/services/asset-service.d.ts +86 -0
- package/dist/services/asset-service.d.ts.map +1 -0
- package/dist/services/asset-service.js +187 -0
- package/dist/services/index.d.ts +3 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +4 -0
- package/dist/storage/adapters/index.d.ts +2 -0
- package/dist/storage/adapters/index.d.ts.map +1 -0
- package/dist/storage/adapters/index.js +2 -0
- package/dist/storage/adapters/local-storage-adapter.d.ts +54 -0
- package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -0
- package/dist/storage/adapters/local-storage-adapter.js +187 -0
- package/dist/storage/index.d.ts +3 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +6 -0
- package/dist/storage/interfaces/index.d.ts +2 -0
- package/dist/storage/interfaces/index.d.ts.map +1 -0
- package/dist/storage/interfaces/index.js +2 -0
- package/dist/storage/interfaces/storage.d.ts +91 -0
- package/dist/storage/interfaces/storage.d.ts.map +1 -0
- package/dist/storage/interfaces/storage.js +1 -0
- package/dist/storage/providers/storage.d.ts +43 -0
- package/dist/storage/providers/storage.d.ts.map +1 -0
- package/dist/storage/providers/storage.js +64 -0
- package/dist/types/asset.d.ts +73 -0
- package/dist/types/asset.d.ts.map +1 -0
- package/dist/types/asset.js +2 -0
- package/dist/types/auth.d.ts +50 -0
- package/dist/types/auth.d.ts.map +1 -0
- package/dist/types/auth.js +41 -0
- package/dist/types/config.d.ts +47 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +1 -0
- package/dist/types/document.d.ts +34 -0
- package/dist/types/document.d.ts.map +1 -0
- package/dist/types/document.js +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +8 -0
- package/dist/types/organization.d.ts +105 -0
- package/dist/types/organization.d.ts.map +1 -0
- package/dist/types/organization.js +3 -0
- package/dist/types/schemas.d.ts +114 -0
- package/dist/types/schemas.d.ts.map +1 -0
- package/dist/types/schemas.js +1 -0
- package/dist/types/sidebar.d.ts +33 -0
- package/dist/types/sidebar.d.ts.map +1 -0
- package/dist/types/sidebar.js +1 -0
- package/dist/types/user.d.ts +14 -0
- package/dist/types/user.d.ts.map +1 -0
- package/dist/types/user.js +1 -0
- package/dist/utils/content-hash.d.ts +22 -0
- package/dist/utils/content-hash.d.ts.map +1 -0
- package/dist/utils/content-hash.js +67 -0
- package/dist/utils/image-url.d.ts +88 -0
- package/dist/utils/image-url.d.ts.map +1 -0
- package/dist/utils/image-url.js +165 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +9 -0
- package/dist/utils/slug.d.ts +13 -0
- package/dist/utils/slug.d.ts.map +1 -0
- package/dist/utils/slug.js +30 -0
- package/package.json +11 -41
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SchemaType } from 'src/types/schemas.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
schemas: SchemaType[];
|
|
4
|
+
documentType: string;
|
|
5
|
+
documentId?: string | null;
|
|
6
|
+
isCreating: boolean;
|
|
7
|
+
onBack: () => void;
|
|
8
|
+
onSaved?: (documentId: string) => void;
|
|
9
|
+
onAutoSaved?: (documentId: string, title: string) => void;
|
|
10
|
+
onDeleted?: () => void;
|
|
11
|
+
onPublished?: (documentId: string) => void;
|
|
12
|
+
onOpenReference?: (documentId: string, documentType: string) => void;
|
|
13
|
+
isReadOnly?: boolean;
|
|
14
|
+
}
|
|
15
|
+
declare const DocumentEditor: import("svelte").Component<Props, {}, "">;
|
|
16
|
+
type DocumentEditor = ReturnType<typeof DocumentEditor>;
|
|
17
|
+
export default DocumentEditor;
|
|
18
|
+
//# sourceMappingURL=DocumentEditor.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentEditor.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentEditor.svelte.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAMtD,UAAU,KAAK;IACd,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAwsBF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Badge } from '@aphexcms/ui/shadcn/badge';
|
|
3
|
+
import {
|
|
4
|
+
SidebarGroup,
|
|
5
|
+
SidebarGroupLabel,
|
|
6
|
+
SidebarGroupContent,
|
|
7
|
+
SidebarMenu,
|
|
8
|
+
SidebarMenuItem,
|
|
9
|
+
SidebarMenuButton
|
|
10
|
+
} from '@aphexcms/ui/shadcn/sidebar';
|
|
11
|
+
import { page } from '$app/state';
|
|
12
|
+
|
|
13
|
+
interface DocumentType {
|
|
14
|
+
name: string;
|
|
15
|
+
title: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
documentCount?: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
interface Props {
|
|
21
|
+
documentTypes: DocumentType[];
|
|
22
|
+
objectTypes: DocumentType[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let { documentTypes, objectTypes }: Props = $props();
|
|
26
|
+
|
|
27
|
+
const currentPath = $derived(page.url.pathname);
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<!-- Document Types Section -->
|
|
31
|
+
{#if documentTypes.length > 0}
|
|
32
|
+
<SidebarGroup class="max-w-[350px]">
|
|
33
|
+
<SidebarGroupLabel class="flex items-center justify-between">
|
|
34
|
+
<span class="flex items-center gap-2">
|
|
35
|
+
<span>📄</span>
|
|
36
|
+
Content
|
|
37
|
+
</span>
|
|
38
|
+
<Badge variant="secondary" class="text-xs">{documentTypes.length}</Badge>
|
|
39
|
+
</SidebarGroupLabel>
|
|
40
|
+
|
|
41
|
+
<SidebarGroupContent>
|
|
42
|
+
<SidebarMenu>
|
|
43
|
+
{#each documentTypes as docType, index (index)}
|
|
44
|
+
<SidebarMenuItem>
|
|
45
|
+
<SidebarMenuButton
|
|
46
|
+
onclick={goto(`/admin/documents/${docType.name}`)}
|
|
47
|
+
isActive={currentPath.includes(`/documents/${docType.name}`)}
|
|
48
|
+
class="group"
|
|
49
|
+
>
|
|
50
|
+
<div class="flex min-w-0 flex-1 items-center gap-2">
|
|
51
|
+
<div
|
|
52
|
+
class="flex h-5 w-5 flex-shrink-0 items-center justify-center rounded bg-blue-100 dark:bg-blue-900/20"
|
|
53
|
+
>
|
|
54
|
+
<span class="text-xs text-blue-600 dark:text-blue-400">📄</span>
|
|
55
|
+
</div>
|
|
56
|
+
<div class="min-w-0 flex-1">
|
|
57
|
+
<div class="truncate text-sm font-medium">{docType.title}</div>
|
|
58
|
+
{#if docType.description}
|
|
59
|
+
<div class="text-muted-foreground truncate text-xs">{docType.description}</div>
|
|
60
|
+
{/if}
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
</SidebarMenuButton>
|
|
64
|
+
</SidebarMenuItem>
|
|
65
|
+
{/each}
|
|
66
|
+
</SidebarMenu>
|
|
67
|
+
</SidebarGroupContent>
|
|
68
|
+
</SidebarGroup>
|
|
69
|
+
{/if}
|
|
70
|
+
|
|
71
|
+
<!-- Object Types Section -->
|
|
72
|
+
{#if objectTypes.length > 0}
|
|
73
|
+
<SidebarGroup>
|
|
74
|
+
<SidebarGroupLabel class="flex items-center justify-between">
|
|
75
|
+
<span class="flex items-center gap-2">
|
|
76
|
+
<span>🧩</span>
|
|
77
|
+
Object Types
|
|
78
|
+
</span>
|
|
79
|
+
<Badge variant="secondary" class="text-xs">{objectTypes.length}</Badge>
|
|
80
|
+
</SidebarGroupLabel>
|
|
81
|
+
</SidebarGroup>
|
|
82
|
+
{/if}
|
|
83
|
+
|
|
84
|
+
<!-- Empty state -->
|
|
85
|
+
{#if documentTypes.length === 0 && objectTypes.length === 0}
|
|
86
|
+
<SidebarGroup>
|
|
87
|
+
<SidebarGroupContent>
|
|
88
|
+
<div class="text-muted-foreground space-y-2 py-6 text-center">
|
|
89
|
+
<div class="text-2xl">📄</div>
|
|
90
|
+
<div>
|
|
91
|
+
<p class="text-sm">No content types found</p>
|
|
92
|
+
<p class="text-xs">Define schemas in schemaTypes/</p>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
</SidebarGroupContent>
|
|
96
|
+
</SidebarGroup>
|
|
97
|
+
{/if}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
interface DocumentType {
|
|
2
|
+
name: string;
|
|
3
|
+
title: string;
|
|
4
|
+
description?: string;
|
|
5
|
+
documentCount?: number;
|
|
6
|
+
}
|
|
7
|
+
interface Props {
|
|
8
|
+
documentTypes: DocumentType[];
|
|
9
|
+
objectTypes: DocumentType[];
|
|
10
|
+
}
|
|
11
|
+
declare const DocumentTypesList: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type DocumentTypesList = ReturnType<typeof DocumentTypesList>;
|
|
13
|
+
export default DocumentTypesList;
|
|
14
|
+
//# sourceMappingURL=DocumentTypesList.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocumentTypesList.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/DocumentTypesList.svelte.ts"],"names":[],"mappings":"AAeC,UAAU,YAAY;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,KAAK;IACd,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,WAAW,EAAE,YAAY,EAAE,CAAC;CAC5B;AA8EF,QAAA,MAAM,iBAAiB,2CAAwC,CAAC;AAChE,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Button } from '@aphexcms/ui/shadcn/button';
|
|
3
|
+
import * as Card from '@aphexcms/ui/shadcn/card';
|
|
4
|
+
import type { SchemaType } from 'src/types/schemas.js';
|
|
5
|
+
import SchemaField from './SchemaField.svelte';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
open: boolean;
|
|
9
|
+
schema: SchemaType;
|
|
10
|
+
value: Record<string, any>;
|
|
11
|
+
onClose: () => void;
|
|
12
|
+
onSave: (value: Record<string, any>) => void;
|
|
13
|
+
onUpdate?: (value: Record<string, any>) => void; // For real-time updates
|
|
14
|
+
onOpenReference?: (documentId: string, documentType: string) => void;
|
|
15
|
+
readonly?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// TODO: add onUpdate to auto save
|
|
19
|
+
let {
|
|
20
|
+
open,
|
|
21
|
+
schema,
|
|
22
|
+
value,
|
|
23
|
+
onClose,
|
|
24
|
+
onSave,
|
|
25
|
+
onUpdate,
|
|
26
|
+
onOpenReference,
|
|
27
|
+
readonly = false
|
|
28
|
+
}: Props = $props();
|
|
29
|
+
|
|
30
|
+
// Initialize editing data with defaults and existing values
|
|
31
|
+
function initializeData() {
|
|
32
|
+
const initialData: Record<string, any> = {};
|
|
33
|
+
|
|
34
|
+
if (schema?.fields) {
|
|
35
|
+
schema.fields.forEach((field) => {
|
|
36
|
+
if (field.type === 'boolean' && 'initialValue' in field) {
|
|
37
|
+
initialData[field.name] = field.initialValue;
|
|
38
|
+
} else {
|
|
39
|
+
initialData[field.name] = '';
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return { ...initialData, ...value };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Local state for editing
|
|
48
|
+
let editingData = $state<Record<string, any>>(initializeData());
|
|
49
|
+
|
|
50
|
+
function handleSave() {
|
|
51
|
+
onSave(editingData);
|
|
52
|
+
onClose();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function handleCancel() {
|
|
56
|
+
onClose();
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Handle backdrop click
|
|
60
|
+
function handleBackdropClick(e: MouseEvent) {
|
|
61
|
+
if (e.target === e.currentTarget) {
|
|
62
|
+
onClose();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Handle escape key
|
|
67
|
+
function handleKeydown(e: KeyboardEvent) {
|
|
68
|
+
if (e.key === 'Escape') {
|
|
69
|
+
onClose();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
</script>
|
|
73
|
+
|
|
74
|
+
{#if open}
|
|
75
|
+
<!-- Backdrop - fixed to viewport on mobile (below navbar), relative to parent on desktop -->
|
|
76
|
+
<div
|
|
77
|
+
class="bg-background/80 fixed bottom-0 left-0 right-0 top-12 z-[100] flex items-center justify-center p-6 backdrop-blur-sm sm:absolute sm:top-0 sm:p-4"
|
|
78
|
+
onclick={handleBackdropClick}
|
|
79
|
+
onkeydown={handleKeydown}
|
|
80
|
+
role="button"
|
|
81
|
+
tabindex="-1"
|
|
82
|
+
>
|
|
83
|
+
<!-- Modal Content -->
|
|
84
|
+
<Card.Root class="flex max-h-[85vh] w-full max-w-2xl flex-col overflow-hidden shadow-lg">
|
|
85
|
+
<Card.Header class="border-b">
|
|
86
|
+
<div class="flex items-center justify-between">
|
|
87
|
+
<div>
|
|
88
|
+
<Card.Title>{schema.title}</Card.Title>
|
|
89
|
+
{#if schema.description}
|
|
90
|
+
<Card.Description>{schema.description}</Card.Description>
|
|
91
|
+
{/if}
|
|
92
|
+
</div>
|
|
93
|
+
<Button variant="ghost" size="icon" onclick={onClose}>
|
|
94
|
+
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
95
|
+
<path
|
|
96
|
+
stroke-linecap="round"
|
|
97
|
+
stroke-linejoin="round"
|
|
98
|
+
stroke-width="2"
|
|
99
|
+
d="M6 18L18 6M6 6l12 12"
|
|
100
|
+
/>
|
|
101
|
+
</svg>
|
|
102
|
+
</Button>
|
|
103
|
+
</div>
|
|
104
|
+
</Card.Header>
|
|
105
|
+
|
|
106
|
+
<Card.Content class="flex-1 overflow-auto p-6">
|
|
107
|
+
<div class="space-y-4">
|
|
108
|
+
{#if schema.fields}
|
|
109
|
+
{#each schema.fields as field, index (index)}
|
|
110
|
+
<SchemaField
|
|
111
|
+
{field}
|
|
112
|
+
value={editingData[field.name]}
|
|
113
|
+
documentData={editingData}
|
|
114
|
+
onUpdate={(newValue) => {
|
|
115
|
+
editingData = { ...editingData, [field.name]: newValue };
|
|
116
|
+
}}
|
|
117
|
+
{onOpenReference}
|
|
118
|
+
{readonly}
|
|
119
|
+
/>
|
|
120
|
+
{/each}
|
|
121
|
+
{/if}
|
|
122
|
+
</div>
|
|
123
|
+
</Card.Content>
|
|
124
|
+
|
|
125
|
+
<Card.Footer class="flex justify-end gap-2 border-t">
|
|
126
|
+
{#if readonly}
|
|
127
|
+
<Button onclick={onClose}>Close</Button>
|
|
128
|
+
{:else}
|
|
129
|
+
<Button variant="outline" onclick={handleCancel}>Cancel</Button>
|
|
130
|
+
<Button onclick={handleSave}>Save Changes</Button>
|
|
131
|
+
{/if}
|
|
132
|
+
</Card.Footer>
|
|
133
|
+
</Card.Root>
|
|
134
|
+
</div>
|
|
135
|
+
{/if}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SchemaType } from 'src/types/schemas.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
open: boolean;
|
|
4
|
+
schema: SchemaType;
|
|
5
|
+
value: Record<string, any>;
|
|
6
|
+
onClose: () => void;
|
|
7
|
+
onSave: (value: Record<string, any>) => void;
|
|
8
|
+
onUpdate?: (value: Record<string, any>) => void;
|
|
9
|
+
onOpenReference?: (documentId: string, documentType: string) => void;
|
|
10
|
+
readonly?: boolean;
|
|
11
|
+
}
|
|
12
|
+
declare const ObjectModal: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type ObjectModal = ReturnType<typeof ObjectModal>;
|
|
14
|
+
export default ObjectModal;
|
|
15
|
+
//# sourceMappingURL=ObjectModal.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObjectModal.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/ObjectModal.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAItD,UAAU,KAAK;IACd,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,UAAU,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAC7C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IAChD,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA+GF,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Label } from '@aphexcms/ui/shadcn/label';
|
|
3
|
+
import { Badge } from '@aphexcms/ui/shadcn/badge';
|
|
4
|
+
import * as Alert from '@aphexcms/ui/shadcn/alert';
|
|
5
|
+
import type { Field } from 'src/types/schemas.js';
|
|
6
|
+
import {
|
|
7
|
+
isFieldRequired,
|
|
8
|
+
validateField,
|
|
9
|
+
getValidationClasses,
|
|
10
|
+
type ValidationError
|
|
11
|
+
} from '../../field-validation/utils.js';
|
|
12
|
+
|
|
13
|
+
// Import individual field components
|
|
14
|
+
import StringField from './fields/StringField.svelte';
|
|
15
|
+
import SlugField from './fields/SlugField.svelte';
|
|
16
|
+
import TextareaField from './fields/TextareaField.svelte';
|
|
17
|
+
import NumberField from './fields/NumberField.svelte';
|
|
18
|
+
import BooleanField from './fields/BooleanField.svelte';
|
|
19
|
+
import ImageField from './fields/ImageField.svelte';
|
|
20
|
+
import ArrayField from './fields/ArrayField.svelte';
|
|
21
|
+
import ReferenceField from './fields/ReferenceField.svelte';
|
|
22
|
+
import SchemaField from './SchemaField.svelte';
|
|
23
|
+
|
|
24
|
+
interface Props {
|
|
25
|
+
field: Field;
|
|
26
|
+
value: any;
|
|
27
|
+
documentData?: Record<string, any>;
|
|
28
|
+
onUpdate: (value: any) => void;
|
|
29
|
+
onOpenReference?: (documentId: string, documentType: string) => void;
|
|
30
|
+
doValidation?: () => void;
|
|
31
|
+
schemaType?: string; // Document type
|
|
32
|
+
parentPath?: string; // Parent field path for nested fields
|
|
33
|
+
readonly?: boolean; // Read-only mode for viewers
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let {
|
|
37
|
+
field,
|
|
38
|
+
value,
|
|
39
|
+
documentData,
|
|
40
|
+
onUpdate,
|
|
41
|
+
onOpenReference,
|
|
42
|
+
doValidation,
|
|
43
|
+
schemaType,
|
|
44
|
+
parentPath,
|
|
45
|
+
readonly = false
|
|
46
|
+
}: Props = $props();
|
|
47
|
+
|
|
48
|
+
// Build full field path
|
|
49
|
+
const fieldPath = parentPath ? `${parentPath}.${field.name}` : field.name;
|
|
50
|
+
|
|
51
|
+
// Validation state for the wrapper (displays errors and status)
|
|
52
|
+
let validationErrors = $state<ValidationError[]>([]);
|
|
53
|
+
|
|
54
|
+
// Real-time validation for wrapper display
|
|
55
|
+
export async function performValidation(currentValue: any, context: any = {}) {
|
|
56
|
+
validationErrors = []; // Clear previous errors
|
|
57
|
+
const result = await validateField(field, currentValue, context);
|
|
58
|
+
validationErrors = result.errors;
|
|
59
|
+
}
|
|
60
|
+
// Computed values
|
|
61
|
+
const hasErrors = $derived(validationErrors.filter((e) => e.level === 'error').length > 0);
|
|
62
|
+
const validationClasses = $derived(getValidationClasses(hasErrors));
|
|
63
|
+
</script>
|
|
64
|
+
|
|
65
|
+
<div class="space-y-2">
|
|
66
|
+
<div class="flex items-center justify-between">
|
|
67
|
+
<Label for={field.name}>
|
|
68
|
+
{field.title}
|
|
69
|
+
{#if isFieldRequired(field)}
|
|
70
|
+
<span class="text-destructive">*</span>
|
|
71
|
+
{/if}
|
|
72
|
+
</Label>
|
|
73
|
+
|
|
74
|
+
<div class="flex items-center gap-2">
|
|
75
|
+
{#if hasErrors}
|
|
76
|
+
<span class="text-destructive text-sm">🚨</span>
|
|
77
|
+
{/if}
|
|
78
|
+
|
|
79
|
+
{#if field.type}
|
|
80
|
+
<Badge variant="outline" class="text-xs">
|
|
81
|
+
{field.type}
|
|
82
|
+
</Badge>
|
|
83
|
+
{/if}
|
|
84
|
+
</div>
|
|
85
|
+
</div>
|
|
86
|
+
|
|
87
|
+
{#if field.description}
|
|
88
|
+
<p class="text-muted-foreground text-sm">{field.description}</p>
|
|
89
|
+
{/if}
|
|
90
|
+
|
|
91
|
+
<!-- Validation errors display -->
|
|
92
|
+
{#if validationErrors.length > 0}
|
|
93
|
+
<div class="space-y-2">
|
|
94
|
+
{#each validationErrors as error, index (index)}
|
|
95
|
+
<Alert.Root
|
|
96
|
+
variant={error.level === 'error'
|
|
97
|
+
? 'destructive'
|
|
98
|
+
: error.level === 'warning'
|
|
99
|
+
? 'default'
|
|
100
|
+
: 'default'}
|
|
101
|
+
>
|
|
102
|
+
<Alert.Description class="text-xs">
|
|
103
|
+
{error.message}
|
|
104
|
+
</Alert.Description>
|
|
105
|
+
</Alert.Root>
|
|
106
|
+
{/each}
|
|
107
|
+
</div>
|
|
108
|
+
{/if}
|
|
109
|
+
|
|
110
|
+
<!-- Field type routing to individual components -->
|
|
111
|
+
{#if field.type === 'string'}
|
|
112
|
+
<StringField {field} {value} {onUpdate} {validationClasses} {readonly} />
|
|
113
|
+
{:else if field.type === 'text'}
|
|
114
|
+
<TextareaField {field} {value} {onUpdate} {validationClasses} {readonly} />
|
|
115
|
+
{:else if field.type === 'slug'}
|
|
116
|
+
<SlugField {field} {value} {documentData} {onUpdate} {validationClasses} {readonly} />
|
|
117
|
+
{:else if field.type === 'number'}
|
|
118
|
+
<NumberField {field} {value} {onUpdate} {validationClasses} {readonly} />
|
|
119
|
+
{:else if field.type === 'boolean'}
|
|
120
|
+
<BooleanField {field} {value} {onUpdate} {validationClasses} {readonly} />
|
|
121
|
+
|
|
122
|
+
<!-- Image Field -->
|
|
123
|
+
{:else if field.type === 'image'}
|
|
124
|
+
<ImageField
|
|
125
|
+
{field}
|
|
126
|
+
{value}
|
|
127
|
+
{onUpdate}
|
|
128
|
+
{validationClasses}
|
|
129
|
+
{schemaType}
|
|
130
|
+
{fieldPath}
|
|
131
|
+
{readonly}
|
|
132
|
+
/>
|
|
133
|
+
|
|
134
|
+
<!-- Object Field -->
|
|
135
|
+
{:else if field.type === 'object' && field.fields}
|
|
136
|
+
<div class="border-border space-y-4 rounded-md border p-4">
|
|
137
|
+
<h4 class="text-sm font-medium">{field.title}</h4>
|
|
138
|
+
{#each field.fields as subField, index (index)}
|
|
139
|
+
<SchemaField
|
|
140
|
+
field={subField}
|
|
141
|
+
value={value?.[subField.name]}
|
|
142
|
+
{documentData}
|
|
143
|
+
onUpdate={(subValue) => onUpdate({ ...value, [subField.name]: subValue })}
|
|
144
|
+
{doValidation}
|
|
145
|
+
{schemaType}
|
|
146
|
+
parentPath={fieldPath}
|
|
147
|
+
{readonly}
|
|
148
|
+
/>
|
|
149
|
+
{/each}
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
<!-- Array Field -->
|
|
153
|
+
{:else if field.type === 'array' && field.of}
|
|
154
|
+
<ArrayField {field} {value} {onUpdate} {onOpenReference} {readonly} />
|
|
155
|
+
|
|
156
|
+
<!-- Reference Field -->
|
|
157
|
+
{:else if field.type === 'reference' && field.to}
|
|
158
|
+
<ReferenceField {field} {value} {onUpdate} {onOpenReference} {readonly} />
|
|
159
|
+
|
|
160
|
+
<!-- Unknown field type -->
|
|
161
|
+
{:else}
|
|
162
|
+
<div class="border-muted-foreground/30 rounded-md border border-dashed p-4 text-center">
|
|
163
|
+
<p class="text-muted-foreground text-sm">
|
|
164
|
+
Field type "{field.type}" not yet supported
|
|
165
|
+
</p>
|
|
166
|
+
<p class="text-muted-foreground mt-1 text-xs">
|
|
167
|
+
Raw value: {JSON.stringify(value)}
|
|
168
|
+
</p>
|
|
169
|
+
</div>
|
|
170
|
+
{/if}
|
|
171
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Field } from 'src/types/schemas.js';
|
|
2
|
+
import SchemaField from './SchemaField.svelte';
|
|
3
|
+
interface Props {
|
|
4
|
+
field: Field;
|
|
5
|
+
value: any;
|
|
6
|
+
documentData?: Record<string, any>;
|
|
7
|
+
onUpdate: (value: any) => void;
|
|
8
|
+
onOpenReference?: (documentId: string, documentType: string) => void;
|
|
9
|
+
doValidation?: () => void;
|
|
10
|
+
schemaType?: string;
|
|
11
|
+
parentPath?: string;
|
|
12
|
+
readonly?: boolean;
|
|
13
|
+
}
|
|
14
|
+
declare const SchemaField: import("svelte").Component<Props, {
|
|
15
|
+
performValidation: (currentValue: any, context?: any) => Promise<void>;
|
|
16
|
+
}, "">;
|
|
17
|
+
type SchemaField = ReturnType<typeof SchemaField>;
|
|
18
|
+
export default SchemaField;
|
|
19
|
+
//# sourceMappingURL=SchemaField.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaField.svelte.d.ts","sourceRoot":"","sources":["../../../src/lib/components/admin/SchemaField.svelte.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAgBlD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAG9C,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;IACX,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACnC,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA4IF,QAAA,MAAM,WAAW;sCArGgC,GAAG,YAAW,GAAG;MAqGT,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|