includio-cms 0.5.2 → 0.5.3
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/CHANGELOG.md +19 -0
- package/ROADMAP.md +13 -0
- package/dist/admin/client/entry/entry-form.svelte +1 -0
- package/dist/admin/client/entry/entry.svelte +130 -123
- package/dist/admin/client/entry/hybrid/hybrid-preview.svelte +92 -9
- package/dist/admin/components/fields/blocks-field.svelte +142 -112
- package/dist/admin/components/fields/blocks-field.svelte.d.ts +10 -30
- package/dist/admin/components/fields/boolean-field.svelte +28 -38
- package/dist/admin/components/fields/boolean-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/checkboxes-field.svelte +12 -24
- package/dist/admin/components/fields/checkboxes-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/content-field.svelte +4 -17
- package/dist/admin/components/fields/content-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/date-field.svelte +8 -21
- package/dist/admin/components/fields/date-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/datetime-field.svelte +8 -21
- package/dist/admin/components/fields/datetime-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/field-renderer.svelte +32 -19
- package/dist/admin/components/fields/field-renderer.svelte.d.ts +1 -1
- package/dist/admin/components/fields/field-value-bridge.svelte +21 -0
- package/dist/admin/components/fields/field-value-bridge.svelte.d.ts +31 -0
- package/dist/admin/components/fields/fields-form.svelte +13 -10
- package/dist/admin/components/fields/file-field.svelte +12 -27
- package/dist/admin/components/fields/file-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/image-field.svelte +13 -28
- package/dist/admin/components/fields/image-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/media-field.svelte +15 -30
- package/dist/admin/components/fields/media-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/number-field.svelte +6 -20
- package/dist/admin/components/fields/number-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/object-field.svelte +26 -29
- package/dist/admin/components/fields/object-field.svelte.d.ts +11 -31
- package/dist/admin/components/fields/radio-field.svelte +8 -20
- package/dist/admin/components/fields/radio-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/relation-field.svelte +15 -30
- package/dist/admin/components/fields/relation-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/richtext-field.svelte +4 -17
- package/dist/admin/components/fields/richtext-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/select-field.svelte +14 -28
- package/dist/admin/components/fields/select-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/seo-field.svelte +5 -12
- package/dist/admin/components/fields/seo-field.svelte.d.ts +8 -28
- package/dist/admin/components/fields/simple-array-field.svelte +29 -42
- package/dist/admin/components/fields/simple-array-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/slug-field.svelte +6 -11
- package/dist/admin/components/fields/slug-field.svelte.d.ts +6 -26
- package/dist/admin/components/fields/text-field-wrapper.svelte +22 -40
- package/dist/admin/components/fields/text-field.svelte +7 -19
- package/dist/admin/components/fields/text-field.svelte.d.ts +5 -27
- package/dist/admin/components/fields/url-field-wrapper.svelte +8 -3
- package/dist/admin/components/fields/url-field.svelte +294 -128
- package/dist/admin/components/fields/url-field.svelte.d.ts +5 -27
- package/dist/admin/components/layout/layout-renderer.svelte +8 -6
- package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +221 -31
- package/dist/admin/components/tiptap/content-editor.svelte +13 -2
- package/dist/admin/components/tiptap/inline-block-node.d.ts +1 -0
- package/dist/admin/components/tiptap/inline-block-node.js +18 -1
- package/dist/admin/components/tiptap/slash-command.js +2 -3
- package/dist/admin/components/tiptap/standalone-form.d.ts +7 -0
- package/dist/admin/components/tiptap/standalone-form.js +31 -0
- package/dist/admin/components/tiptap/tiptap-editor.svelte +7 -0
- package/dist/admin/remote/entry.remote.js +16 -0
- package/dist/admin/styles/admin.css +10 -0
- package/dist/admin/utils/fieldCondition.d.ts +6 -0
- package/dist/admin/utils/fieldCondition.js +20 -0
- package/dist/components/ui/switch/index.d.ts +2 -0
- package/dist/components/ui/switch/index.js +4 -0
- package/dist/components/ui/switch/switch.svelte +26 -0
- package/dist/components/ui/switch/switch.svelte.d.ts +4 -0
- package/dist/core/fields/fieldSchemaToTs.js +15 -3
- package/dist/core/fields/formFieldSchemaToTs.js +22 -6
- package/dist/core/fields/urlUtils.d.ts +14 -0
- package/dist/core/fields/urlUtils.js +21 -0
- package/dist/core/server/fields/populateEntry.js +43 -0
- package/dist/core/server/fields/resolveImageFields.js +33 -1
- package/dist/core/server/fields/resolveRelationFields.js +46 -0
- package/dist/core/server/fields/resolveRichtextLinks.js +15 -1
- package/dist/core/server/fields/resolveUrlFields.js +65 -0
- package/dist/core/server/generator/formFieldSchemaToString.js +40 -9
- package/dist/core/server/generator/formFields.js +2 -0
- package/dist/core/server/generator/generator.js +25 -1
- package/dist/schemas/field/url.d.ts +2 -0
- package/dist/schemas/field/url.js +4 -2
- package/dist/types/fields.d.ts +9 -0
- package/dist/types/formFields.d.ts +15 -2
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +1 -0
- package/dist/updates/0.5.3/index.d.ts +2 -0
- package/dist/updates/0.5.3/index.js +19 -0
- package/dist/updates/index.js +2 -1
- package/package.json +2 -1
- package/dist/admin/components/fields/standalone-field-renderer.svelte +0 -148
- package/dist/admin/components/fields/standalone-field-renderer.svelte.d.ts +0 -9
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
|
|
2
1
|
import type { ImageField } from '../../../types/fields.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
form: SuperForm<T>;
|
|
7
|
-
path: FormPathLeaves<T, string | string[] | undefined>;
|
|
8
|
-
};
|
|
9
|
-
exports: {};
|
|
10
|
-
bindings: "";
|
|
11
|
-
slots: {};
|
|
12
|
-
events: {};
|
|
2
|
+
type Props = {
|
|
3
|
+
field: ImageField;
|
|
4
|
+
value: string | string[] | undefined;
|
|
13
5
|
};
|
|
14
|
-
declare
|
|
15
|
-
|
|
16
|
-
events(): ReturnType<typeof $$render<T>>['events'];
|
|
17
|
-
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
18
|
-
bindings(): "";
|
|
19
|
-
exports(): {};
|
|
20
|
-
}
|
|
21
|
-
interface $$IsomorphicComponent {
|
|
22
|
-
new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
23
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
24
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
25
|
-
<T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
26
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
27
|
-
}
|
|
28
|
-
declare const ImageField: $$IsomorphicComponent;
|
|
29
|
-
type ImageField<T extends Record<string, unknown>> = InstanceType<typeof ImageField<T>>;
|
|
6
|
+
declare const ImageField: import("svelte").Component<Props, {}, "value">;
|
|
7
|
+
type ImageField = ReturnType<typeof ImageField>;
|
|
30
8
|
export default ImageField;
|
|
@@ -1,15 +1,5 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
type T = Record<string, unknown>;
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" generics="T extends Record<string, unknown>">
|
|
1
|
+
<script lang="ts">
|
|
6
2
|
import * as Dialog from '../../../components/ui/dialog/index.js';
|
|
7
|
-
import {
|
|
8
|
-
formFieldProxy,
|
|
9
|
-
type FormFieldProxy,
|
|
10
|
-
type FormPathLeaves,
|
|
11
|
-
type SuperForm
|
|
12
|
-
} from 'sveltekit-superforms';
|
|
13
3
|
import { onMount } from 'svelte';
|
|
14
4
|
import Button from '../../../components/ui/button/button.svelte';
|
|
15
5
|
import type { MediaField } from '../../../types/fields.js';
|
|
@@ -110,19 +100,14 @@
|
|
|
110
100
|
|
|
111
101
|
type Props = {
|
|
112
102
|
field: MediaField;
|
|
113
|
-
|
|
114
|
-
path: FormPathLeaves<T, string | string[] | undefined>;
|
|
103
|
+
value: string | string[] | undefined;
|
|
115
104
|
};
|
|
116
105
|
|
|
117
|
-
let { field,
|
|
118
|
-
|
|
119
|
-
const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<
|
|
120
|
-
string | string[] | undefined
|
|
121
|
-
>;
|
|
106
|
+
let { field, value = $bindable(), ...props }: Props = $props();
|
|
122
107
|
|
|
123
108
|
onMount(() => {
|
|
124
|
-
if (
|
|
125
|
-
|
|
109
|
+
if (value === undefined) {
|
|
110
|
+
value = field.multiple ? [] : '';
|
|
126
111
|
}
|
|
127
112
|
});
|
|
128
113
|
</script>
|
|
@@ -203,14 +188,14 @@
|
|
|
203
188
|
{/if}
|
|
204
189
|
{/snippet}
|
|
205
190
|
|
|
206
|
-
{#if
|
|
191
|
+
{#if value !== undefined}
|
|
207
192
|
<Dialog.Root>
|
|
208
193
|
<Dialog.Trigger>
|
|
209
194
|
{#snippet child({ props })}
|
|
210
|
-
{#if
|
|
195
|
+
{#if value && ((typeof value === 'string' && value !== '') || (Array.isArray(value) && value.length > 0))}
|
|
211
196
|
<div class="max-w-96">
|
|
212
|
-
{#if typeof
|
|
213
|
-
{#await remotes.getFileById(
|
|
197
|
+
{#if typeof value === 'string'}
|
|
198
|
+
{#await remotes.getFileById(value)}
|
|
214
199
|
<div class="animate-pulse bg-muted w-full aspect-video rounded-xl"></div>
|
|
215
200
|
{:then file}
|
|
216
201
|
{#if file}
|
|
@@ -223,7 +208,7 @@
|
|
|
223
208
|
{lang[interfaceLanguage.current].change}
|
|
224
209
|
</Button>
|
|
225
210
|
{#if !field.required}
|
|
226
|
-
<Button variant="destructive" size="sm" class="h-8" onclick={(e) => { e.stopPropagation();
|
|
211
|
+
<Button variant="destructive" size="sm" class="h-8" onclick={(e) => { e.stopPropagation(); value = ''; }}>
|
|
227
212
|
<X class="h-4 w-4" />
|
|
228
213
|
{lang[interfaceLanguage.current].remove}
|
|
229
214
|
</Button>
|
|
@@ -246,7 +231,7 @@
|
|
|
246
231
|
{lang[interfaceLanguage.current].change}
|
|
247
232
|
</Button>
|
|
248
233
|
{#if !field.required}
|
|
249
|
-
<Button variant="destructive" size="sm" class="h-8" onclick={(e) => { e.stopPropagation();
|
|
234
|
+
<Button variant="destructive" size="sm" class="h-8" onclick={(e) => { e.stopPropagation(); value = ''; }}>
|
|
250
235
|
<X class="h-4 w-4" />
|
|
251
236
|
{lang[interfaceLanguage.current].remove}
|
|
252
237
|
</Button>
|
|
@@ -256,8 +241,8 @@
|
|
|
256
241
|
{/if}
|
|
257
242
|
{/if}
|
|
258
243
|
{/await}
|
|
259
|
-
{:else if Array.isArray(
|
|
260
|
-
{@const valueArr =
|
|
244
|
+
{:else if Array.isArray(value) && value.length > 0}
|
|
245
|
+
{@const valueArr = value}
|
|
261
246
|
{#await remotes.getMediaFiles({ data: { ids: valueArr } })}
|
|
262
247
|
<div class="animate-pulse bg-muted w-full aspect-video rounded-xl"></div>
|
|
263
248
|
{:then files}
|
|
@@ -304,7 +289,7 @@
|
|
|
304
289
|
{lang[interfaceLanguage.current].change}
|
|
305
290
|
</Button>
|
|
306
291
|
{#if !field.required}
|
|
307
|
-
<Button variant="destructive" size="sm" class="h-8" onclick={(e) => { e.stopPropagation();
|
|
292
|
+
<Button variant="destructive" size="sm" class="h-8" onclick={(e) => { e.stopPropagation(); value = field.multiple ? [] : ''; }}>
|
|
308
293
|
<X class="h-4 w-4" />
|
|
309
294
|
{lang[interfaceLanguage.current].remove}
|
|
310
295
|
</Button>
|
|
@@ -331,7 +316,7 @@
|
|
|
331
316
|
{/snippet}
|
|
332
317
|
</Dialog.Trigger>
|
|
333
318
|
<Dialog.Content class="h-[85vh] w-full max-w-6xl! sm:max-w-6xl! overflow-hidden p-0 flex flex-col">
|
|
334
|
-
<MediaSelector bind:selected={
|
|
319
|
+
<MediaSelector bind:selected={value} multiple={field.multiple} accept={field.accept} />
|
|
335
320
|
</Dialog.Content>
|
|
336
321
|
</Dialog.Root>
|
|
337
322
|
|
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
|
|
2
1
|
import type { MediaField } from '../../../types/fields.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
form: SuperForm<T>;
|
|
7
|
-
path: FormPathLeaves<T, string | string[] | undefined>;
|
|
8
|
-
};
|
|
9
|
-
exports: {};
|
|
10
|
-
bindings: "";
|
|
11
|
-
slots: {};
|
|
12
|
-
events: {};
|
|
2
|
+
type Props = {
|
|
3
|
+
field: MediaField;
|
|
4
|
+
value: string | string[] | undefined;
|
|
13
5
|
};
|
|
14
|
-
declare
|
|
15
|
-
|
|
16
|
-
events(): ReturnType<typeof $$render<T>>['events'];
|
|
17
|
-
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
18
|
-
bindings(): "";
|
|
19
|
-
exports(): {};
|
|
20
|
-
}
|
|
21
|
-
interface $$IsomorphicComponent {
|
|
22
|
-
new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
23
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
24
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
25
|
-
<T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
26
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
27
|
-
}
|
|
28
|
-
declare const MediaField: $$IsomorphicComponent;
|
|
29
|
-
type MediaField<T extends Record<string, unknown>> = InstanceType<typeof MediaField<T>>;
|
|
6
|
+
declare const MediaField: import("svelte").Component<Props, {}, "value">;
|
|
7
|
+
type MediaField = ReturnType<typeof MediaField>;
|
|
30
8
|
export default MediaField;
|
|
@@ -1,34 +1,20 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
type T = Record<string, unknown>;
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" generics="T extends Record<string, unknown>">
|
|
1
|
+
<script lang="ts">
|
|
6
2
|
import Input from '../../../components/ui/input/input.svelte';
|
|
7
|
-
import Textarea from '../../../components/ui/textarea/textarea.svelte';
|
|
8
3
|
import type { NumberField } from '../../../types/fields.js';
|
|
9
4
|
import { onMount } from 'svelte';
|
|
10
|
-
import {
|
|
11
|
-
formFieldProxy,
|
|
12
|
-
type FormFieldProxy,
|
|
13
|
-
type FormPathLeaves,
|
|
14
|
-
type SuperForm
|
|
15
|
-
} from 'sveltekit-superforms';
|
|
16
5
|
|
|
17
6
|
type Props = {
|
|
18
7
|
field: NumberField;
|
|
19
|
-
|
|
20
|
-
path: FormPathLeaves<T, number | undefined>;
|
|
8
|
+
value: number | undefined;
|
|
21
9
|
};
|
|
22
10
|
|
|
23
|
-
let { field,
|
|
24
|
-
|
|
25
|
-
const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<number | undefined>;
|
|
11
|
+
let { field, value = $bindable(), ...props }: Props = $props();
|
|
26
12
|
|
|
27
13
|
onMount(() => {
|
|
28
|
-
if (
|
|
29
|
-
|
|
14
|
+
if (value === undefined && field.defaultValue !== undefined) {
|
|
15
|
+
value = field.defaultValue;
|
|
30
16
|
}
|
|
31
17
|
});
|
|
32
18
|
</script>
|
|
33
19
|
|
|
34
|
-
<Input {...props} bind:value
|
|
20
|
+
<Input {...props} bind:value type="number" min={field.min} max={field.max} step={field.step} />
|
|
@@ -1,30 +1,8 @@
|
|
|
1
1
|
import type { NumberField } from '../../../types/fields.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
field: NumberField;
|
|
6
|
-
form: SuperForm<T>;
|
|
7
|
-
path: FormPathLeaves<T, number | undefined>;
|
|
8
|
-
};
|
|
9
|
-
exports: {};
|
|
10
|
-
bindings: "";
|
|
11
|
-
slots: {};
|
|
12
|
-
events: {};
|
|
2
|
+
type Props = {
|
|
3
|
+
field: NumberField;
|
|
4
|
+
value: number | undefined;
|
|
13
5
|
};
|
|
14
|
-
declare
|
|
15
|
-
|
|
16
|
-
events(): ReturnType<typeof $$render<T>>['events'];
|
|
17
|
-
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
18
|
-
bindings(): "";
|
|
19
|
-
exports(): {};
|
|
20
|
-
}
|
|
21
|
-
interface $$IsomorphicComponent {
|
|
22
|
-
new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
23
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
24
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
25
|
-
<T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
26
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
27
|
-
}
|
|
28
|
-
declare const NumberField: $$IsomorphicComponent;
|
|
29
|
-
type NumberField<T extends Record<string, unknown>> = InstanceType<typeof NumberField<T>>;
|
|
6
|
+
declare const NumberField: import("svelte").Component<Props, {}, "value">;
|
|
7
|
+
type NumberField = ReturnType<typeof NumberField>;
|
|
30
8
|
export default NumberField;
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
type T = Record<string, unknown>;
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" generics="T extends Record<string, unknown>">
|
|
1
|
+
<script lang="ts">
|
|
6
2
|
import {
|
|
7
3
|
formFieldProxy,
|
|
8
|
-
type FormFieldProxy,
|
|
9
4
|
type FormPathLeaves,
|
|
10
5
|
type SuperForm
|
|
11
6
|
} from 'sveltekit-superforms';
|
|
12
7
|
import FieldRenderer from './field-renderer.svelte';
|
|
13
8
|
import { joinPath, normalizePath } from '../../utils/objectPath.js';
|
|
14
9
|
import type { ObjectField, ObjectFieldData } from '../../../types/fields.js';
|
|
10
|
+
import { evaluateCondition } from '../../utils/fieldCondition.js';
|
|
15
11
|
import { onMount } from 'svelte';
|
|
16
12
|
import * as Item from '../../../components/ui/item/index.js';
|
|
17
13
|
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
@@ -21,8 +17,8 @@
|
|
|
21
17
|
type Props = {
|
|
22
18
|
objectFieldType?: 'default' | 'inline';
|
|
23
19
|
field: ObjectField;
|
|
24
|
-
form: SuperForm<
|
|
25
|
-
path: FormPathLeaves<
|
|
20
|
+
form: SuperForm<Record<string, unknown>>;
|
|
21
|
+
path: FormPathLeaves<Record<string, unknown>>;
|
|
26
22
|
focusedPath?: string | null;
|
|
27
23
|
flashingPath?: string | null;
|
|
28
24
|
depth?: number;
|
|
@@ -31,9 +27,8 @@
|
|
|
31
27
|
let { field, form, path, objectFieldType = 'default', focusedPath = null, flashingPath = null, depth = 0, ...props }: Props = $props();
|
|
32
28
|
|
|
33
29
|
const interfaceLanguage = useInterfaceLanguage();
|
|
34
|
-
const {
|
|
35
|
-
|
|
36
|
-
>;
|
|
30
|
+
const { form: formData } = form;
|
|
31
|
+
const { value } = formFieldProxy(form, path) as { value: import('svelte/store').Writable<ObjectFieldData | undefined> };
|
|
37
32
|
|
|
38
33
|
onMount(() => {
|
|
39
34
|
if (!$value) {
|
|
@@ -64,24 +59,26 @@
|
|
|
64
59
|
{#snippet content()}
|
|
65
60
|
<div class="space-y-4">
|
|
66
61
|
{#each field.fields as f}
|
|
67
|
-
{
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
62
|
+
{#if evaluateCondition(f.showWhen, (slug) => $value?.data?.[slug] ?? $formData[slug])}
|
|
63
|
+
{@const fieldPath = joinPath(path, 'data', f.slug)}
|
|
64
|
+
{@const showFlash = isFlashing(fieldPath)}
|
|
65
|
+
<div
|
|
66
|
+
data-field-path={fieldPath}
|
|
67
|
+
class={cn(
|
|
68
|
+
'rounded-lg transition-all duration-500',
|
|
69
|
+
showFlash && 'ring-2 ring-primary ring-offset-2 bg-primary/5'
|
|
70
|
+
)}
|
|
71
|
+
>
|
|
72
|
+
<FieldRenderer
|
|
73
|
+
field={f}
|
|
74
|
+
{form}
|
|
75
|
+
path={fieldPath}
|
|
76
|
+
{focusedPath}
|
|
77
|
+
{flashingPath}
|
|
78
|
+
depth={depth + 1}
|
|
79
|
+
/>
|
|
80
|
+
</div>
|
|
81
|
+
{/if}
|
|
85
82
|
{/each}
|
|
86
83
|
</div>
|
|
87
84
|
{/snippet}
|
|
@@ -1,34 +1,14 @@
|
|
|
1
1
|
import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
|
|
2
|
-
import type { ObjectField
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
depth?: number;
|
|
12
|
-
};
|
|
13
|
-
exports: {};
|
|
14
|
-
bindings: "";
|
|
15
|
-
slots: {};
|
|
16
|
-
events: {};
|
|
2
|
+
import type { ObjectField } from '../../../types/fields.js';
|
|
3
|
+
type Props = {
|
|
4
|
+
objectFieldType?: 'default' | 'inline';
|
|
5
|
+
field: ObjectField;
|
|
6
|
+
form: SuperForm<Record<string, unknown>>;
|
|
7
|
+
path: FormPathLeaves<Record<string, unknown>>;
|
|
8
|
+
focusedPath?: string | null;
|
|
9
|
+
flashingPath?: string | null;
|
|
10
|
+
depth?: number;
|
|
17
11
|
};
|
|
18
|
-
declare
|
|
19
|
-
|
|
20
|
-
events(): ReturnType<typeof $$render<T>>['events'];
|
|
21
|
-
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
22
|
-
bindings(): "";
|
|
23
|
-
exports(): {};
|
|
24
|
-
}
|
|
25
|
-
interface $$IsomorphicComponent {
|
|
26
|
-
new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
27
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
28
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
29
|
-
<T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
30
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
31
|
-
}
|
|
32
|
-
declare const ObjectField: $$IsomorphicComponent;
|
|
33
|
-
type ObjectField<T extends Record<string, unknown>> = InstanceType<typeof ObjectField<T>>;
|
|
12
|
+
declare const ObjectField: import("svelte").Component<Props, {}, "">;
|
|
13
|
+
type ObjectField = ReturnType<typeof ObjectField>;
|
|
34
14
|
export default ObjectField;
|
|
@@ -1,16 +1,6 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
type T = Record<string, unknown>;
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" generics="T extends Record<string, unknown>">
|
|
6
|
-
import {
|
|
7
|
-
formFieldProxy,
|
|
8
|
-
type FormFieldProxy,
|
|
9
|
-
type FormPathLeaves,
|
|
10
|
-
type SuperForm
|
|
11
|
-
} from 'sveltekit-superforms';
|
|
1
|
+
<script lang="ts">
|
|
12
2
|
import { onMount } from 'svelte';
|
|
13
|
-
import type {
|
|
3
|
+
import type { RadioField } from '../../../types/fields.js';
|
|
14
4
|
import * as Form from '../../../components/ui/form/index.js';
|
|
15
5
|
import * as RadioGroup from '../../../components/ui/radio-group/index.js';
|
|
16
6
|
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
@@ -18,24 +8,22 @@
|
|
|
18
8
|
|
|
19
9
|
type Props = {
|
|
20
10
|
field: RadioField;
|
|
21
|
-
|
|
22
|
-
path: FormPathLeaves<T, string | undefined>;
|
|
11
|
+
value: string | undefined;
|
|
23
12
|
};
|
|
24
13
|
|
|
25
|
-
let { field,
|
|
14
|
+
let { field, value = $bindable(), ...props }: Props = $props();
|
|
26
15
|
|
|
27
16
|
const interfaceLanguage = useInterfaceLanguage();
|
|
28
|
-
const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<string | undefined>;
|
|
29
17
|
|
|
30
18
|
onMount(() => {
|
|
31
|
-
if (
|
|
32
|
-
|
|
19
|
+
if (value === undefined) {
|
|
20
|
+
value = field.defaultValue ?? '';
|
|
33
21
|
}
|
|
34
22
|
});
|
|
35
23
|
</script>
|
|
36
24
|
|
|
37
|
-
{#if
|
|
38
|
-
<RadioGroup.Root bind:value
|
|
25
|
+
{#if value !== undefined}
|
|
26
|
+
<RadioGroup.Root bind:value class="flex flex-col space-y-1">
|
|
39
27
|
{#each field.options as option}
|
|
40
28
|
<div class="flex items-center space-y-0 space-x-3">
|
|
41
29
|
<Form.Control>
|
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
|
|
2
1
|
import type { RadioField } from '../../../types/fields.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
form: SuperForm<T>;
|
|
7
|
-
path: FormPathLeaves<T, string | undefined>;
|
|
8
|
-
};
|
|
9
|
-
exports: {};
|
|
10
|
-
bindings: "";
|
|
11
|
-
slots: {};
|
|
12
|
-
events: {};
|
|
2
|
+
type Props = {
|
|
3
|
+
field: RadioField;
|
|
4
|
+
value: string | undefined;
|
|
13
5
|
};
|
|
14
|
-
declare
|
|
15
|
-
|
|
16
|
-
events(): ReturnType<typeof $$render<T>>['events'];
|
|
17
|
-
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
18
|
-
bindings(): "";
|
|
19
|
-
exports(): {};
|
|
20
|
-
}
|
|
21
|
-
interface $$IsomorphicComponent {
|
|
22
|
-
new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
23
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
24
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
25
|
-
<T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
26
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
27
|
-
}
|
|
28
|
-
declare const RadioField: $$IsomorphicComponent;
|
|
29
|
-
type RadioField<T extends Record<string, unknown>> = InstanceType<typeof RadioField<T>>;
|
|
6
|
+
declare const RadioField: import("svelte").Component<Props, {}, "value">;
|
|
7
|
+
type RadioField = ReturnType<typeof RadioField>;
|
|
30
8
|
export default RadioField;
|
|
@@ -1,16 +1,6 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
type T = Record<string, unknown>;
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" generics="T extends Record<string, unknown>">
|
|
1
|
+
<script lang="ts">
|
|
6
2
|
import type { RelationFieldData, RelationField } from '../../../types/fields.js';
|
|
7
3
|
import type { CollectionConfig } from '../../../types/collections.js';
|
|
8
|
-
import {
|
|
9
|
-
formFieldProxy,
|
|
10
|
-
type FormFieldProxy,
|
|
11
|
-
type FormPathLeaves,
|
|
12
|
-
type SuperForm
|
|
13
|
-
} from 'sveltekit-superforms';
|
|
14
4
|
import { getRemotes } from '../../../sveltekit/index.js';
|
|
15
5
|
import { buttonVariants } from '../../../components/ui/button/button.svelte';
|
|
16
6
|
import { getCollectionEntryLabel } from '../../utils/entryLabel.js';
|
|
@@ -43,27 +33,24 @@
|
|
|
43
33
|
|
|
44
34
|
type Props = {
|
|
45
35
|
field: RelationField;
|
|
46
|
-
|
|
47
|
-
path: FormPathLeaves<T, RelationFieldData>;
|
|
36
|
+
value: RelationFieldData;
|
|
48
37
|
};
|
|
49
38
|
|
|
50
|
-
let { field,
|
|
51
|
-
|
|
52
|
-
const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<RelationFieldData>;
|
|
39
|
+
let { field, value = $bindable(), ...props }: Props = $props();
|
|
53
40
|
|
|
54
41
|
const multiple = $derived(field.multiple === true);
|
|
55
42
|
|
|
56
43
|
// Ensure value is array when multiple
|
|
57
44
|
onMount(() => {
|
|
58
|
-
if (multiple && !Array.isArray(
|
|
59
|
-
|
|
45
|
+
if (multiple && !Array.isArray(value)) {
|
|
46
|
+
value = value ? [value] : [];
|
|
60
47
|
}
|
|
61
48
|
});
|
|
62
49
|
|
|
63
50
|
// Helper to get current array value safely
|
|
64
51
|
function getArrayValue(): string[] {
|
|
65
|
-
if (Array.isArray(
|
|
66
|
-
return
|
|
52
|
+
if (Array.isArray(value)) return value;
|
|
53
|
+
return value ? [value] : [];
|
|
67
54
|
}
|
|
68
55
|
|
|
69
56
|
function isSelected(id: string): boolean {
|
|
@@ -73,14 +60,14 @@
|
|
|
73
60
|
function toggleItem(id: string) {
|
|
74
61
|
const arr = getArrayValue();
|
|
75
62
|
if (arr.includes(id)) {
|
|
76
|
-
|
|
63
|
+
value = arr.filter((v) => v !== id);
|
|
77
64
|
} else {
|
|
78
|
-
|
|
65
|
+
value = [...arr, id];
|
|
79
66
|
}
|
|
80
67
|
}
|
|
81
68
|
|
|
82
69
|
function removeItem(id: string) {
|
|
83
|
-
|
|
70
|
+
value = getArrayValue().filter((v) => v !== id);
|
|
84
71
|
}
|
|
85
72
|
|
|
86
73
|
type RelationOption = { label: string; value: string };
|
|
@@ -154,7 +141,6 @@
|
|
|
154
141
|
{/if}
|
|
155
142
|
<Selector class="opacity-50" />
|
|
156
143
|
</Popover.Trigger>
|
|
157
|
-
<input hidden value={JSON.stringify(getArrayValue())} name={path} />
|
|
158
144
|
|
|
159
145
|
<Popover.Content class="w-[200px] p-0">
|
|
160
146
|
<Command.Root>
|
|
@@ -199,7 +185,7 @@
|
|
|
199
185
|
const dropIndex = parseInt(state.targetContainer ?? '');
|
|
200
186
|
|
|
201
187
|
if (!isNaN(dragIndex) && !isNaN(dropIndex)) {
|
|
202
|
-
|
|
188
|
+
value = [...arrayMove(getArrayValue(), dragIndex, dropIndex)];
|
|
203
189
|
}
|
|
204
190
|
}
|
|
205
191
|
}
|
|
@@ -231,7 +217,7 @@
|
|
|
231
217
|
</div>
|
|
232
218
|
{/if}
|
|
233
219
|
{:else}
|
|
234
|
-
<!-- Single-select mode
|
|
220
|
+
<!-- Single-select mode -->
|
|
235
221
|
<Popover.Root bind:open>
|
|
236
222
|
<Popover.Trigger
|
|
237
223
|
id={triggerId}
|
|
@@ -243,11 +229,10 @@
|
|
|
243
229
|
role="combobox"
|
|
244
230
|
{...props}
|
|
245
231
|
>
|
|
246
|
-
{options.find((f) => f.value ===
|
|
232
|
+
{options.find((f) => f.value === value)?.label ??
|
|
247
233
|
`${lang[interfaceLanguage.current].select} ${getLocalizedLabel(collectionConfig.labels?.singular, interfaceLanguage.current) || collectionConfig.slug}`}
|
|
248
234
|
<Selector class="opacity-50" />
|
|
249
235
|
</Popover.Trigger>
|
|
250
|
-
<input hidden value={$value} name={path} />
|
|
251
236
|
|
|
252
237
|
<Popover.Content class="w-[200px] p-0">
|
|
253
238
|
<Command.Root>
|
|
@@ -265,12 +250,12 @@
|
|
|
265
250
|
<Command.Item
|
|
266
251
|
value={option.label}
|
|
267
252
|
onSelect={() => {
|
|
268
|
-
|
|
253
|
+
value = option.value;
|
|
269
254
|
closeAndFocusTrigger(triggerId);
|
|
270
255
|
}}
|
|
271
256
|
>
|
|
272
257
|
{option.label}
|
|
273
|
-
<Check class={cn('ml-auto', option.value !==
|
|
258
|
+
<Check class={cn('ml-auto', option.value !== value && 'text-transparent')} />
|
|
274
259
|
</Command.Item>
|
|
275
260
|
{/each}
|
|
276
261
|
</Command.Group>
|
|
@@ -1,30 +1,8 @@
|
|
|
1
1
|
import type { RelationFieldData, RelationField } from '../../../types/fields.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
field: RelationField;
|
|
6
|
-
form: SuperForm<T>;
|
|
7
|
-
path: FormPathLeaves<T, RelationFieldData>;
|
|
8
|
-
};
|
|
9
|
-
exports: {};
|
|
10
|
-
bindings: "";
|
|
11
|
-
slots: {};
|
|
12
|
-
events: {};
|
|
2
|
+
type Props = {
|
|
3
|
+
field: RelationField;
|
|
4
|
+
value: RelationFieldData;
|
|
13
5
|
};
|
|
14
|
-
declare
|
|
15
|
-
|
|
16
|
-
events(): ReturnType<typeof $$render<T>>['events'];
|
|
17
|
-
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
18
|
-
bindings(): "";
|
|
19
|
-
exports(): {};
|
|
20
|
-
}
|
|
21
|
-
interface $$IsomorphicComponent {
|
|
22
|
-
new <T extends Record<string, unknown>>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<T>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<T>['props']>, ReturnType<__sveltets_Render<T>['events']>, ReturnType<__sveltets_Render<T>['slots']>> & {
|
|
23
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
24
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
25
|
-
<T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
26
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
27
|
-
}
|
|
28
|
-
declare const RelationField: $$IsomorphicComponent;
|
|
29
|
-
type RelationField<T extends Record<string, unknown>> = InstanceType<typeof RelationField<T>>;
|
|
6
|
+
declare const RelationField: import("svelte").Component<Props, {}, "value">;
|
|
7
|
+
type RelationField = ReturnType<typeof RelationField>;
|
|
30
8
|
export default RelationField;
|