@aphexcms/cms-core 0.1.3 → 0.1.4
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,82 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Input } from '@aphexcms/ui/shadcn/input';
|
|
3
|
+
import type { Field } from '../../../types/schemas.js';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
field: Field;
|
|
7
|
+
value: number | null;
|
|
8
|
+
onUpdate: (value: number | null) => void;
|
|
9
|
+
validationClasses?: string;
|
|
10
|
+
onBlur?: (event: any) => void;
|
|
11
|
+
onFocus?: (event: any) => void;
|
|
12
|
+
readonly?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
field,
|
|
17
|
+
value,
|
|
18
|
+
onUpdate,
|
|
19
|
+
validationClasses,
|
|
20
|
+
onBlur,
|
|
21
|
+
onFocus,
|
|
22
|
+
readonly = false
|
|
23
|
+
}: Props = $props();
|
|
24
|
+
|
|
25
|
+
// Convert value to string for input, handle null/undefined
|
|
26
|
+
let inputValue = $derived(value?.toString() || '');
|
|
27
|
+
|
|
28
|
+
function handleInput(event: Event) {
|
|
29
|
+
const target = event.target as HTMLInputElement;
|
|
30
|
+
const newValue = target.value;
|
|
31
|
+
|
|
32
|
+
// Convert to number and update
|
|
33
|
+
if (newValue === '') {
|
|
34
|
+
onUpdate(null);
|
|
35
|
+
} else {
|
|
36
|
+
const numValue = parseFloat(newValue);
|
|
37
|
+
if (!isNaN(numValue)) {
|
|
38
|
+
onUpdate(numValue);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function handleKeydown(event: KeyboardEvent) {
|
|
44
|
+
// Allow: backspace, delete, tab, escape, enter
|
|
45
|
+
if (
|
|
46
|
+
[8, 9, 27, 13, 46].includes(event.keyCode) ||
|
|
47
|
+
// Allow: Ctrl+A, Ctrl+C, Ctrl+V, Ctrl+X
|
|
48
|
+
(event.keyCode === 65 && event.ctrlKey) ||
|
|
49
|
+
(event.keyCode === 67 && event.ctrlKey) ||
|
|
50
|
+
(event.keyCode === 86 && event.ctrlKey) ||
|
|
51
|
+
(event.keyCode === 88 && event.ctrlKey) ||
|
|
52
|
+
// Allow: home, end, left, right
|
|
53
|
+
(event.keyCode >= 35 && event.keyCode <= 39)
|
|
54
|
+
) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Ensure that it's a number or decimal point and stop the keypress
|
|
59
|
+
if (
|
|
60
|
+
(event.shiftKey || event.keyCode < 48 || event.keyCode > 57) &&
|
|
61
|
+
(event.keyCode < 96 || event.keyCode > 105) &&
|
|
62
|
+
event.keyCode !== 190 &&
|
|
63
|
+
event.keyCode !== 110
|
|
64
|
+
) {
|
|
65
|
+
event.preventDefault();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
</script>
|
|
69
|
+
|
|
70
|
+
<Input
|
|
71
|
+
id={field.name}
|
|
72
|
+
type="number"
|
|
73
|
+
step="any"
|
|
74
|
+
placeholder={field.description || `Enter ${field.title?.toLowerCase() || 'number'}`}
|
|
75
|
+
value={inputValue}
|
|
76
|
+
oninput={handleInput}
|
|
77
|
+
onkeydown={handleKeydown}
|
|
78
|
+
onblur={onBlur}
|
|
79
|
+
onfocus={onFocus}
|
|
80
|
+
class={validationClasses}
|
|
81
|
+
disabled={readonly}
|
|
82
|
+
/>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Field } from '../../../types/schemas.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: Field;
|
|
4
|
+
value: number | null;
|
|
5
|
+
onUpdate: (value: number | null) => void;
|
|
6
|
+
validationClasses?: string;
|
|
7
|
+
onBlur?: (event: any) => void;
|
|
8
|
+
onFocus?: (event: any) => void;
|
|
9
|
+
readonly?: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare const NumberField: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type NumberField = ReturnType<typeof NumberField>;
|
|
13
|
+
export default NumberField;
|
|
14
|
+
//# sourceMappingURL=NumberField.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/NumberField.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAGtD,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAiEF,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import CheckIcon from '@lucide/svelte/icons/check';
|
|
3
|
+
import ChevronsUpDownIcon from '@lucide/svelte/icons/chevrons-up-down';
|
|
4
|
+
import PlusIcon from '@lucide/svelte/icons/plus';
|
|
5
|
+
import XIcon from '@lucide/svelte/icons/x';
|
|
6
|
+
import { tick } from 'svelte';
|
|
7
|
+
import * as Command from '@aphexcms/ui/shadcn/command';
|
|
8
|
+
import * as Popover from '@aphexcms/ui/shadcn/popover';
|
|
9
|
+
import { Button } from '@aphexcms/ui/shadcn/button';
|
|
10
|
+
import { cn } from '@aphexcms/ui/utils';
|
|
11
|
+
import type { Field, ReferenceField as ReferenceFieldType } from '../../../types/schemas.js';
|
|
12
|
+
import { documents } from '../../../api/documents.js';
|
|
13
|
+
|
|
14
|
+
interface Props {
|
|
15
|
+
field: Field;
|
|
16
|
+
value: string | null; // Document ID
|
|
17
|
+
onUpdate: (value: string | null) => void;
|
|
18
|
+
onOpenReference?: (documentId: string, documentType: string) => void;
|
|
19
|
+
readonly?: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let { field, value, onUpdate, onOpenReference, readonly = false }: Props = $props();
|
|
23
|
+
|
|
24
|
+
// Cast to reference field type
|
|
25
|
+
const referenceField = field as ReferenceFieldType;
|
|
26
|
+
const targetType = referenceField.to?.[0]?.type;
|
|
27
|
+
|
|
28
|
+
// State
|
|
29
|
+
let open = $state(false);
|
|
30
|
+
let searchResults = $state<any[]>([]);
|
|
31
|
+
let selectedDocument = $state<any>(null);
|
|
32
|
+
let loading = $state(false);
|
|
33
|
+
let creating = $state(false);
|
|
34
|
+
let triggerRef = $state<HTMLButtonElement>(null!);
|
|
35
|
+
|
|
36
|
+
// Load selected document details when value changes
|
|
37
|
+
$effect(() => {
|
|
38
|
+
async function loadDocument() {
|
|
39
|
+
if (value) {
|
|
40
|
+
try {
|
|
41
|
+
const doc = await documents.getById(value);
|
|
42
|
+
if (doc.success) {
|
|
43
|
+
selectedDocument = doc.data;
|
|
44
|
+
}
|
|
45
|
+
} catch (err) {
|
|
46
|
+
console.error('Failed to load referenced document:', err);
|
|
47
|
+
selectedDocument = null;
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
selectedDocument = null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
loadDocument();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Load documents when dropdown opens
|
|
57
|
+
$effect(() => {
|
|
58
|
+
async function loadDocuments() {
|
|
59
|
+
if (open && targetType) {
|
|
60
|
+
console.log('[ReferenceField] Opening select box, loading documents for type:', targetType);
|
|
61
|
+
loading = true;
|
|
62
|
+
try {
|
|
63
|
+
const result = await documents.list({
|
|
64
|
+
docType: targetType,
|
|
65
|
+
limit: 10
|
|
66
|
+
});
|
|
67
|
+
console.log('[ReferenceField] Documents loaded:', result);
|
|
68
|
+
if (result.success && result.data) {
|
|
69
|
+
searchResults = result.data;
|
|
70
|
+
console.log('[ReferenceField] Search results:', searchResults.length, 'documents');
|
|
71
|
+
}
|
|
72
|
+
} catch (err) {
|
|
73
|
+
console.error('[ReferenceField] Failed to load documents:', err);
|
|
74
|
+
searchResults = [];
|
|
75
|
+
} finally {
|
|
76
|
+
loading = false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
loadDocuments();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
function closeAndFocusTrigger() {
|
|
84
|
+
open = false;
|
|
85
|
+
tick().then(() => {
|
|
86
|
+
triggerRef?.focus();
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function selectDocument(doc: any) {
|
|
91
|
+
if (readonly) return;
|
|
92
|
+
onUpdate(doc.id);
|
|
93
|
+
closeAndFocusTrigger();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function clearSelection() {
|
|
97
|
+
if (readonly) return;
|
|
98
|
+
onUpdate(null);
|
|
99
|
+
selectedDocument = null;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function openReference() {
|
|
103
|
+
if (selectedDocument && targetType && onOpenReference) {
|
|
104
|
+
onOpenReference(selectedDocument.id, targetType);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async function createNewDocument() {
|
|
109
|
+
if (readonly || !targetType) return;
|
|
110
|
+
|
|
111
|
+
creating = true;
|
|
112
|
+
try {
|
|
113
|
+
const result = await documents.create({
|
|
114
|
+
type: targetType,
|
|
115
|
+
draftData: {
|
|
116
|
+
title: 'Untitled'
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
if (result.success && result.data) {
|
|
121
|
+
onUpdate(result.data.id);
|
|
122
|
+
closeAndFocusTrigger();
|
|
123
|
+
}
|
|
124
|
+
} catch (err) {
|
|
125
|
+
console.error('Failed to create document:', err);
|
|
126
|
+
} finally {
|
|
127
|
+
creating = false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
function getDocumentTitle(doc: any): string {
|
|
132
|
+
// Try to get title from draft data first, then published data
|
|
133
|
+
const data = doc.draftData || doc.publishedData || {};
|
|
134
|
+
return data.title || data.name || data.heading || 'Untitled';
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const selectedLabel = $derived(selectedDocument ? getDocumentTitle(selectedDocument) : null);
|
|
138
|
+
</script>
|
|
139
|
+
|
|
140
|
+
{#if selectedDocument}
|
|
141
|
+
<!-- Selected document display -->
|
|
142
|
+
<div class="border-border bg-muted/30 flex items-center gap-2 rounded-md border p-3">
|
|
143
|
+
<div class="flex-1">
|
|
144
|
+
<div class="text-sm font-medium">{getDocumentTitle(selectedDocument)}</div>
|
|
145
|
+
<div class="text-muted-foreground text-xs">
|
|
146
|
+
{targetType} • {selectedDocument.status === 'published' ? '🟢' : '🟡'}
|
|
147
|
+
{selectedDocument.status}
|
|
148
|
+
</div>
|
|
149
|
+
</div>
|
|
150
|
+
<Button
|
|
151
|
+
variant="ghost"
|
|
152
|
+
size="sm"
|
|
153
|
+
onclick={openReference}
|
|
154
|
+
class="text-muted-foreground hover:text-foreground h-8 w-8 p-0"
|
|
155
|
+
title="Edit referenced document"
|
|
156
|
+
>
|
|
157
|
+
<svg class="h-4 w-4" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
158
|
+
<path
|
|
159
|
+
stroke-linecap="round"
|
|
160
|
+
stroke-linejoin="round"
|
|
161
|
+
stroke-width="2"
|
|
162
|
+
d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"
|
|
163
|
+
/>
|
|
164
|
+
</svg>
|
|
165
|
+
</Button>
|
|
166
|
+
{#if !readonly}
|
|
167
|
+
<Button
|
|
168
|
+
variant="ghost"
|
|
169
|
+
size="sm"
|
|
170
|
+
onclick={clearSelection}
|
|
171
|
+
class="text-muted-foreground hover:text-destructive h-8 w-8 p-0"
|
|
172
|
+
title="Clear selection"
|
|
173
|
+
>
|
|
174
|
+
<XIcon class="h-4 w-4" />
|
|
175
|
+
</Button>
|
|
176
|
+
{/if}
|
|
177
|
+
</div>
|
|
178
|
+
{:else}
|
|
179
|
+
<!-- Search/select interface -->
|
|
180
|
+
{#if readonly}
|
|
181
|
+
<!-- Read-only state: show placeholder -->
|
|
182
|
+
<div
|
|
183
|
+
class="border-input bg-muted/50 flex h-10 w-full items-center justify-between rounded-md border px-3 py-2 text-sm"
|
|
184
|
+
>
|
|
185
|
+
<span class="text-muted-foreground">No reference selected</span>
|
|
186
|
+
</div>
|
|
187
|
+
{:else}
|
|
188
|
+
<Popover.Root bind:open>
|
|
189
|
+
<Popover.Trigger bind:ref={triggerRef}>
|
|
190
|
+
{#snippet child({ props })}
|
|
191
|
+
<Button
|
|
192
|
+
{...props}
|
|
193
|
+
variant="outline"
|
|
194
|
+
class="w-full justify-between"
|
|
195
|
+
role="combobox"
|
|
196
|
+
aria-expanded={open}
|
|
197
|
+
>
|
|
198
|
+
{selectedLabel || `Select ${targetType}...`}
|
|
199
|
+
<ChevronsUpDownIcon class="opacity-50" />
|
|
200
|
+
</Button>
|
|
201
|
+
{/snippet}
|
|
202
|
+
</Popover.Trigger>
|
|
203
|
+
<Popover.Content class="!z-[9999] w-[400px] p-0">
|
|
204
|
+
<Command.Root>
|
|
205
|
+
<Command.List>
|
|
206
|
+
{#if loading}
|
|
207
|
+
<Command.Loading>Loading...</Command.Loading>
|
|
208
|
+
{:else if searchResults.length === 0}
|
|
209
|
+
<Command.Empty>
|
|
210
|
+
<div class="flex flex-col items-center gap-2 py-4">
|
|
211
|
+
<p class="text-muted-foreground text-sm">
|
|
212
|
+
No {targetType}s found
|
|
213
|
+
</p>
|
|
214
|
+
<Button size="sm" onclick={createNewDocument} disabled={creating} class="gap-1">
|
|
215
|
+
<PlusIcon class="h-3 w-3" />
|
|
216
|
+
{creating ? 'Creating...' : `Create new ${targetType}`}
|
|
217
|
+
</Button>
|
|
218
|
+
</div>
|
|
219
|
+
</Command.Empty>
|
|
220
|
+
{:else if searchResults.length > 0}
|
|
221
|
+
<Command.Group>
|
|
222
|
+
{#each searchResults as doc (doc.id)}
|
|
223
|
+
<Command.Item
|
|
224
|
+
value={doc.id}
|
|
225
|
+
onSelect={() => selectDocument(doc)}
|
|
226
|
+
class="flex items-center justify-between"
|
|
227
|
+
>
|
|
228
|
+
<div class="flex items-center gap-2">
|
|
229
|
+
<CheckIcon class={cn('h-4 w-4', value !== doc.id && 'text-transparent')} />
|
|
230
|
+
<div>
|
|
231
|
+
<div class="text-sm font-medium">{getDocumentTitle(doc)}</div>
|
|
232
|
+
<div class="text-muted-foreground text-xs">
|
|
233
|
+
{doc.status === 'published' ? '🟢' : '🟡'}
|
|
234
|
+
{doc.status}
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
</Command.Item>
|
|
239
|
+
{/each}
|
|
240
|
+
</Command.Group>
|
|
241
|
+
<Command.Separator />
|
|
242
|
+
<Command.Group>
|
|
243
|
+
<Command.Item onSelect={createNewDocument} class="justify-center">
|
|
244
|
+
<div class="flex items-center gap-1">
|
|
245
|
+
<PlusIcon class="h-3 w-3" />
|
|
246
|
+
{creating ? 'Creating...' : `Create new ${targetType}`}
|
|
247
|
+
</div>
|
|
248
|
+
</Command.Item>
|
|
249
|
+
</Command.Group>
|
|
250
|
+
{:else}
|
|
251
|
+
<Command.Empty>
|
|
252
|
+
No {targetType}s available
|
|
253
|
+
</Command.Empty>
|
|
254
|
+
{/if}
|
|
255
|
+
</Command.List>
|
|
256
|
+
</Command.Root>
|
|
257
|
+
</Popover.Content>
|
|
258
|
+
</Popover.Root>
|
|
259
|
+
{/if}
|
|
260
|
+
{/if}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Field } from '../../../types/schemas.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: Field;
|
|
4
|
+
value: string | null;
|
|
5
|
+
onUpdate: (value: string | null) => void;
|
|
6
|
+
onOpenReference?: (documentId: string, documentType: string) => void;
|
|
7
|
+
readonly?: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare const ReferenceField: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type ReferenceField = ReturnType<typeof ReferenceField>;
|
|
11
|
+
export default ReferenceField;
|
|
12
|
+
//# sourceMappingURL=ReferenceField.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReferenceField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/ReferenceField.svelte.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,KAAK,EAAwC,MAAM,2BAA2B,CAAC;AAI5F,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACrE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAoOF,QAAA,MAAM,cAAc,2CAAwC,CAAC;AAC7D,KAAK,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AACxD,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Input } from '@aphexcms/ui/shadcn/input';
|
|
3
|
+
import { Button } from '@aphexcms/ui/shadcn/button';
|
|
4
|
+
import type { Field } from '../../../types/schemas.js';
|
|
5
|
+
import { generateSlug } from '../../../utils/index.js';
|
|
6
|
+
|
|
7
|
+
interface Props {
|
|
8
|
+
field: Field;
|
|
9
|
+
value: any;
|
|
10
|
+
documentData?: Record<string, any>;
|
|
11
|
+
onUpdate: (value: any) => void;
|
|
12
|
+
validationClasses?: string;
|
|
13
|
+
onBlur?: (event: any) => void;
|
|
14
|
+
onFocus?: (event: any) => void;
|
|
15
|
+
readonly?: boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
field,
|
|
20
|
+
value,
|
|
21
|
+
documentData,
|
|
22
|
+
onUpdate,
|
|
23
|
+
validationClasses,
|
|
24
|
+
onBlur,
|
|
25
|
+
onFocus,
|
|
26
|
+
readonly = false
|
|
27
|
+
}: Props = $props();
|
|
28
|
+
|
|
29
|
+
function handleInputChange(event: Event) {
|
|
30
|
+
const target = event.target as HTMLInputElement;
|
|
31
|
+
onUpdate(target.value);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Generate slug from title
|
|
35
|
+
function generateSlugFromTitle() {
|
|
36
|
+
if (documentData?.title) {
|
|
37
|
+
const generatedSlug = generateSlug(documentData.title);
|
|
38
|
+
onUpdate(generatedSlug);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
</script>
|
|
42
|
+
|
|
43
|
+
<div class="space-y-2">
|
|
44
|
+
<div class="flex gap-2">
|
|
45
|
+
<Input
|
|
46
|
+
id={field.name}
|
|
47
|
+
value={value || ''}
|
|
48
|
+
placeholder="document-slug"
|
|
49
|
+
oninput={handleInputChange}
|
|
50
|
+
onblur={onBlur}
|
|
51
|
+
onfocus={onFocus}
|
|
52
|
+
class="flex-1 {validationClasses}"
|
|
53
|
+
disabled={readonly}
|
|
54
|
+
/>
|
|
55
|
+
<Button
|
|
56
|
+
variant="outline"
|
|
57
|
+
size="sm"
|
|
58
|
+
onclick={generateSlugFromTitle}
|
|
59
|
+
disabled={!documentData?.title || readonly}
|
|
60
|
+
class="shrink-0"
|
|
61
|
+
>
|
|
62
|
+
Generate from Title
|
|
63
|
+
</Button>
|
|
64
|
+
</div>
|
|
65
|
+
{#if documentData?.title}
|
|
66
|
+
<p class="text-muted-foreground text-xs">
|
|
67
|
+
Click "Generate from Title" to create slug from: "{documentData.title}"
|
|
68
|
+
</p>
|
|
69
|
+
{:else}
|
|
70
|
+
<p class="text-muted-foreground text-xs">
|
|
71
|
+
Enter a title first to generate a slug automatically
|
|
72
|
+
</p>
|
|
73
|
+
{/if}
|
|
74
|
+
</div>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Field } from '../../../types/schemas.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: Field;
|
|
4
|
+
value: any;
|
|
5
|
+
documentData?: Record<string, any>;
|
|
6
|
+
onUpdate: (value: any) => void;
|
|
7
|
+
validationClasses?: string;
|
|
8
|
+
onBlur?: (event: any) => void;
|
|
9
|
+
onFocus?: (event: any) => void;
|
|
10
|
+
readonly?: boolean;
|
|
11
|
+
}
|
|
12
|
+
declare const SlugField: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type SlugField = ReturnType<typeof SlugField>;
|
|
14
|
+
export default SlugField;
|
|
15
|
+
//# sourceMappingURL=SlugField.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SlugField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/SlugField.svelte.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAItD,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,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAqDF,QAAA,MAAM,SAAS,2CAAwC,CAAC;AACxD,KAAK,SAAS,GAAG,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC;AAC9C,eAAe,SAAS,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Input } from '@aphexcms/ui/shadcn/input';
|
|
3
|
+
import type { Field } from '../../../types/schemas.js';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
field: Field;
|
|
7
|
+
value: any;
|
|
8
|
+
onUpdate: (value: any) => void;
|
|
9
|
+
validationClasses?: string;
|
|
10
|
+
onBlur?: (event: any) => void;
|
|
11
|
+
onFocus?: (event: any) => void;
|
|
12
|
+
readonly?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
field,
|
|
17
|
+
value,
|
|
18
|
+
onUpdate,
|
|
19
|
+
validationClasses,
|
|
20
|
+
onBlur,
|
|
21
|
+
onFocus,
|
|
22
|
+
readonly = false
|
|
23
|
+
}: Props = $props();
|
|
24
|
+
|
|
25
|
+
function handleInputChange(event: Event) {
|
|
26
|
+
const target = event.target as HTMLInputElement;
|
|
27
|
+
onUpdate(target.value);
|
|
28
|
+
}
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<Input
|
|
32
|
+
id={field.name}
|
|
33
|
+
value={value || ''}
|
|
34
|
+
placeholder={field.title}
|
|
35
|
+
oninput={handleInputChange}
|
|
36
|
+
onblur={onBlur}
|
|
37
|
+
onfocus={onFocus}
|
|
38
|
+
class={validationClasses}
|
|
39
|
+
disabled={readonly}
|
|
40
|
+
/>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Field } from '../../../types/schemas.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: Field;
|
|
4
|
+
value: any;
|
|
5
|
+
onUpdate: (value: any) => void;
|
|
6
|
+
validationClasses?: string;
|
|
7
|
+
onBlur?: (event: any) => void;
|
|
8
|
+
onFocus?: (event: any) => void;
|
|
9
|
+
readonly?: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare const StringField: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type StringField = ReturnType<typeof StringField>;
|
|
13
|
+
export default StringField;
|
|
14
|
+
//# sourceMappingURL=StringField.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StringField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/StringField.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAGtD,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA0BF,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { Textarea } from '@aphexcms/ui/shadcn/textarea';
|
|
3
|
+
import type { Field } from '../../../types/schemas.js';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
field: Field;
|
|
7
|
+
value: any;
|
|
8
|
+
onUpdate: (value: any) => void;
|
|
9
|
+
validationClasses?: string;
|
|
10
|
+
onBlur?: (event: any) => void;
|
|
11
|
+
onFocus?: (event: any) => void;
|
|
12
|
+
readonly?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
field,
|
|
17
|
+
value,
|
|
18
|
+
onUpdate,
|
|
19
|
+
validationClasses,
|
|
20
|
+
onBlur,
|
|
21
|
+
onFocus,
|
|
22
|
+
readonly = false
|
|
23
|
+
}: Props = $props();
|
|
24
|
+
|
|
25
|
+
function handleInputChange(event: Event) {
|
|
26
|
+
const target = event.target as HTMLTextAreaElement;
|
|
27
|
+
onUpdate(target.value);
|
|
28
|
+
}
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<Textarea
|
|
32
|
+
id={field.name}
|
|
33
|
+
value={value || ''}
|
|
34
|
+
placeholder={field.title}
|
|
35
|
+
oninput={handleInputChange}
|
|
36
|
+
onblur={onBlur}
|
|
37
|
+
onfocus={onFocus}
|
|
38
|
+
class="min-h-[100px] {validationClasses}"
|
|
39
|
+
disabled={readonly}
|
|
40
|
+
/>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Field } from '../../../types/schemas.js';
|
|
2
|
+
interface Props {
|
|
3
|
+
field: Field;
|
|
4
|
+
value: any;
|
|
5
|
+
onUpdate: (value: any) => void;
|
|
6
|
+
validationClasses?: string;
|
|
7
|
+
onBlur?: (event: any) => void;
|
|
8
|
+
onFocus?: (event: any) => void;
|
|
9
|
+
readonly?: boolean;
|
|
10
|
+
}
|
|
11
|
+
declare const TextareaField: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type TextareaField = ReturnType<typeof TextareaField>;
|
|
13
|
+
export default TextareaField;
|
|
14
|
+
//# sourceMappingURL=TextareaField.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextareaField.svelte.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/admin/fields/TextareaField.svelte.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAGtD,UAAU,KAAK;IACd,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AA0BF,QAAA,MAAM,aAAa,2CAAwC,CAAC;AAC5D,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;AACtD,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { default as StringField } from '../admin/fields/StringField.svelte';
|
|
2
|
+
export { default as TextareaField } from '../admin/fields/TextareaField.svelte';
|
|
3
|
+
export { default as NumberField } from '../admin/fields/NumberField.svelte';
|
|
4
|
+
export { default as BooleanField } from '../admin/fields/BooleanField.svelte';
|
|
5
|
+
export { default as SlugField } from '../admin/fields/SlugField.svelte';
|
|
6
|
+
export { default as ImageField } from '../admin/fields/ImageField.svelte';
|
|
7
|
+
export { default as ArrayField } from '../admin/fields/ArrayField.svelte';
|
|
8
|
+
export { default as ReferenceField } from '../admin/fields/ReferenceField.svelte';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/fields/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,oCAAoC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,uCAAuC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// Field components re-export
|
|
2
|
+
export { default as StringField } from '../admin/fields/StringField.svelte';
|
|
3
|
+
export { default as TextareaField } from '../admin/fields/TextareaField.svelte';
|
|
4
|
+
export { default as NumberField } from '../admin/fields/NumberField.svelte';
|
|
5
|
+
export { default as BooleanField } from '../admin/fields/BooleanField.svelte';
|
|
6
|
+
export { default as SlugField } from '../admin/fields/SlugField.svelte';
|
|
7
|
+
export { default as ImageField } from '../admin/fields/ImageField.svelte';
|
|
8
|
+
export { default as ArrayField } from '../admin/fields/ArrayField.svelte';
|
|
9
|
+
export { default as ReferenceField } from '../admin/fields/ReferenceField.svelte';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { default as AdminApp } from './AdminApp.svelte';
|
|
2
|
+
export { default as Sidebar } from './layout/Sidebar.svelte';
|
|
3
|
+
export { default as DocumentEditor } from './admin/DocumentEditor.svelte';
|
|
4
|
+
export { default as DocumentTypesList } from './admin/DocumentTypesList.svelte';
|
|
5
|
+
export { default as SchemaField } from './admin/SchemaField.svelte';
|
|
6
|
+
export * from './fields/index.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/components/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAGxD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAG7D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAChF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGpE,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Aphex CMS Components
|
|
2
|
+
// All admin interface components -- is this being used?
|
|
3
|
+
// Main admin app
|
|
4
|
+
export { default as AdminApp } from './AdminApp.svelte';
|
|
5
|
+
// Sidebar
|
|
6
|
+
export { default as Sidebar } from './layout/Sidebar.svelte';
|
|
7
|
+
// Admin components (will be migrated from your current structure)
|
|
8
|
+
export { default as DocumentEditor } from './admin/DocumentEditor.svelte';
|
|
9
|
+
export { default as DocumentTypesList } from './admin/DocumentTypesList.svelte';
|
|
10
|
+
export { default as SchemaField } from './admin/SchemaField.svelte';
|
|
11
|
+
// Field components
|
|
12
|
+
export * from './fields/index.js';
|