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,13 +1,8 @@
|
|
|
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 Accordion from '../../../components/ui/accordion/index.js';
|
|
7
3
|
import Button from '../../../components/ui/button/button.svelte';
|
|
8
|
-
import
|
|
4
|
+
import {
|
|
9
5
|
formFieldProxy,
|
|
10
|
-
type FormFieldProxy,
|
|
11
6
|
type FormPathLeaves,
|
|
12
7
|
type SuperForm
|
|
13
8
|
} from 'sveltekit-superforms';
|
|
@@ -19,7 +14,6 @@
|
|
|
19
14
|
} from '../../../types/fields.js';
|
|
20
15
|
import FieldRenderer from './field-renderer.svelte';
|
|
21
16
|
import { onMount, tick } from 'svelte';
|
|
22
|
-
import * as Form from '../../../components/ui/form/index.js';
|
|
23
17
|
import CirclePlus from '@tabler/icons-svelte/icons/circle-plus';
|
|
24
18
|
import Badge from '../../../components/ui/badge/badge.svelte';
|
|
25
19
|
import * as DropdownMenu from '../../../components/ui/dropdown-menu/index.js';
|
|
@@ -47,25 +41,31 @@
|
|
|
47
41
|
|
|
48
42
|
type Props = {
|
|
49
43
|
field: BlocksField;
|
|
50
|
-
form: SuperForm<
|
|
51
|
-
path: FormPathLeaves<
|
|
44
|
+
form: SuperForm<Record<string, unknown>>;
|
|
45
|
+
path: FormPathLeaves<Record<string, unknown>>;
|
|
52
46
|
focusedPath?: string | null;
|
|
53
47
|
flashingPath?: string | null;
|
|
54
48
|
depth?: number;
|
|
55
49
|
};
|
|
56
50
|
|
|
57
|
-
let {
|
|
51
|
+
let {
|
|
52
|
+
field,
|
|
53
|
+
form,
|
|
54
|
+
path,
|
|
55
|
+
focusedPath = null,
|
|
56
|
+
flashingPath = null,
|
|
57
|
+
depth = 0,
|
|
58
|
+
...props
|
|
59
|
+
}: Props = $props();
|
|
58
60
|
|
|
59
|
-
const { value } = formFieldProxy(form, path)
|
|
60
|
-
ObjectFieldData[] | undefined
|
|
61
|
-
>;
|
|
61
|
+
const { value } = formFieldProxy(form, path) as { value: import('svelte/store').Writable<ObjectFieldData[] | undefined> };
|
|
62
62
|
|
|
63
63
|
onMount(() => {
|
|
64
64
|
if (!$value) {
|
|
65
65
|
$value = [];
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
$value = $value.reduce((acc, item) => {
|
|
68
|
+
$value = $value.reduce((acc: ObjectFieldData[], item: ObjectFieldData) => {
|
|
69
69
|
if (!item.slug) return acc;
|
|
70
70
|
if (field.of.find((o) => o.slug === item.slug) === undefined) return acc;
|
|
71
71
|
acc.push(item);
|
|
@@ -215,9 +215,9 @@
|
|
|
215
215
|
|
|
216
216
|
const isFixedLength = $derived(
|
|
217
217
|
field.minItems !== undefined &&
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
218
|
+
field.maxItems !== undefined &&
|
|
219
|
+
field.minItems === field.maxItems &&
|
|
220
|
+
field.minItems > 0
|
|
221
221
|
);
|
|
222
222
|
const fixedCount = $derived(isFixedLength ? field.minItems! : 0);
|
|
223
223
|
|
|
@@ -226,11 +226,15 @@
|
|
|
226
226
|
|
|
227
227
|
<div class="flex items-center justify-between gap-4">
|
|
228
228
|
<div class="flex items-center gap-2">
|
|
229
|
-
<RequiredLabel required={field.minItems !== undefined && field.minItems > 0} class="text-lg"
|
|
229
|
+
<RequiredLabel required={field.minItems !== undefined && field.minItems > 0} class="text-lg"
|
|
230
|
+
>{getLocalizedLabel(field.label, interfaceLanguage.current)}</RequiredLabel
|
|
231
|
+
>
|
|
230
232
|
{#if isFixedLength}
|
|
231
|
-
<span class="text-
|
|
233
|
+
<span class="text-muted-foreground text-xs">{fixedCount} elementów</span>
|
|
232
234
|
{:else if field.maxItems !== undefined}
|
|
233
|
-
<span class="text-xs {atMax ? 'text-destructive' : 'text-muted-foreground'}"
|
|
235
|
+
<span class="text-xs {atMax ? 'text-destructive' : 'text-muted-foreground'}"
|
|
236
|
+
>{$value?.length ?? 0} / {field.maxItems}</span
|
|
237
|
+
>
|
|
234
238
|
{/if}
|
|
235
239
|
</div>
|
|
236
240
|
|
|
@@ -281,105 +285,119 @@
|
|
|
281
285
|
dndState.targetContainer = null;
|
|
282
286
|
dndState.targetElement = null;
|
|
283
287
|
|
|
284
|
-
setTimeout(() => {
|
|
288
|
+
setTimeout(() => {
|
|
289
|
+
dropProcessing = false;
|
|
290
|
+
}, 50);
|
|
285
291
|
}
|
|
286
292
|
}
|
|
287
293
|
}}
|
|
288
294
|
animate:flip={{ duration: 200 }}
|
|
289
295
|
>
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
296
|
+
{#key index}
|
|
297
|
+
{#if $value[index].data && $value[index].slug}
|
|
298
|
+
{@const item = $value[index]}
|
|
299
|
+
{@const objectField = field.of.find((option) => option.slug === item.slug)}
|
|
300
|
+
|
|
301
|
+
{#if objectField}
|
|
302
|
+
<Accordion.Item value={index.toString()} class="border-0" data-depth={depth + 1}>
|
|
303
|
+
<Accordion.Trigger
|
|
304
|
+
class="items-center border px-4 text-base font-normal data-[state=open]:rounded-b-none"
|
|
305
|
+
>
|
|
306
|
+
<div class="flex grow items-center justify-between gap-4">
|
|
307
|
+
<div class="flex items-center gap-4">
|
|
308
|
+
{#if !isFixedLength || fixedCount > 1}
|
|
309
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
310
|
+
<div
|
|
311
|
+
use:draggable={{
|
|
312
|
+
container: index.toString(),
|
|
313
|
+
dragData: { id: item._id }
|
|
314
|
+
}}
|
|
315
|
+
class="text-muted-foreground hover:text-foreground cursor-grab"
|
|
316
|
+
onmousedown={(e) => e.stopPropagation()}
|
|
317
|
+
onclick={(e) => e.stopPropagation()}
|
|
318
|
+
>
|
|
319
|
+
<GripVertical class="h-4 w-4" />
|
|
320
|
+
</div>
|
|
321
|
+
{/if}
|
|
322
|
+
<span>{index < 10 ? '0' : ''}{index + 1}</span>
|
|
323
|
+
<Badge variant="outline"
|
|
324
|
+
>{getLocalizedLabel(objectField.label, interfaceLanguage.current) ||
|
|
325
|
+
objectField.slug}</Badge
|
|
326
|
+
>
|
|
327
|
+
<span>{getAccordionLabel($value[index])}</span>
|
|
311
328
|
</div>
|
|
329
|
+
|
|
330
|
+
{#if !(isFixedLength && fixedCount <= 1)}
|
|
331
|
+
<DropdownMenu.Root>
|
|
332
|
+
<DropdownMenu.Trigger
|
|
333
|
+
class="data-[state=open]:bg-muted text-muted-foreground flex size-8"
|
|
334
|
+
>
|
|
335
|
+
{#snippet child({ props })}
|
|
336
|
+
<Button variant="ghost" size="icon" {...props}>
|
|
337
|
+
<DotsVerticalIcon />
|
|
338
|
+
<span class="sr-only">Open menu</span>
|
|
339
|
+
</Button>
|
|
340
|
+
{/snippet}
|
|
341
|
+
</DropdownMenu.Trigger>
|
|
342
|
+
<DropdownMenu.Content align="end" class="w-32">
|
|
343
|
+
{#if !isFixedLength}
|
|
344
|
+
<DropdownMenu.Item
|
|
345
|
+
onclick={() => duplicateItem(index)}
|
|
346
|
+
disabled={atMax}
|
|
347
|
+
>
|
|
348
|
+
Duplicate
|
|
349
|
+
</DropdownMenu.Item>
|
|
350
|
+
{/if}
|
|
351
|
+
<DropdownMenu.Item
|
|
352
|
+
onclick={() => moveItemUp(index)}
|
|
353
|
+
disabled={index === 0}
|
|
354
|
+
>
|
|
355
|
+
Move up
|
|
356
|
+
</DropdownMenu.Item>
|
|
357
|
+
<DropdownMenu.Item
|
|
358
|
+
onclick={() => moveItemDown(index)}
|
|
359
|
+
disabled={$value && index === $value.length - 1}
|
|
360
|
+
>
|
|
361
|
+
Move down
|
|
362
|
+
</DropdownMenu.Item>
|
|
363
|
+
{#if !isFixedLength}
|
|
364
|
+
<DropdownMenu.Item
|
|
365
|
+
variant="destructive"
|
|
366
|
+
onclick={() => removeItem(index)}
|
|
367
|
+
>
|
|
368
|
+
Delete
|
|
369
|
+
</DropdownMenu.Item>
|
|
370
|
+
{/if}
|
|
371
|
+
</DropdownMenu.Content>
|
|
372
|
+
</DropdownMenu.Root>
|
|
312
373
|
{/if}
|
|
313
|
-
<span>{index < 10 ? '0' : ''}{index + 1}</span>
|
|
314
|
-
<Badge variant="outline">{getLocalizedLabel(objectField.label, interfaceLanguage.current) || objectField.slug}</Badge>
|
|
315
|
-
<span>{getAccordionLabel($value[index])}</span>
|
|
316
374
|
</div>
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
{
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
{
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
<DropdownMenu.Item
|
|
340
|
-
onclick={() => moveItemDown(index)}
|
|
341
|
-
disabled={$value && index === $value.length - 1}
|
|
342
|
-
>
|
|
343
|
-
Move down
|
|
344
|
-
</DropdownMenu.Item>
|
|
345
|
-
{#if !isFixedLength}
|
|
346
|
-
<DropdownMenu.Item variant="destructive" onclick={() => removeItem(index)}>
|
|
347
|
-
Delete
|
|
348
|
-
</DropdownMenu.Item>
|
|
349
|
-
{/if}
|
|
350
|
-
</DropdownMenu.Content>
|
|
351
|
-
</DropdownMenu.Root>
|
|
352
|
-
{/if}
|
|
353
|
-
</div>
|
|
354
|
-
</Accordion.Trigger>
|
|
355
|
-
<Accordion.Content
|
|
356
|
-
class="space-y-4 rounded-b-md border border-t-0"
|
|
357
|
-
style="padding: {Math.max(4, 16 - depth * 3)}px;"
|
|
358
|
-
>
|
|
359
|
-
{@const itemPath = joinPath(path, index)}
|
|
360
|
-
<div data-field-path={itemPath}>
|
|
361
|
-
<FieldRenderer
|
|
362
|
-
objectFieldType="inline"
|
|
363
|
-
field={objectField}
|
|
364
|
-
form={form as SuperForm<Record<string, unknown>>}
|
|
365
|
-
path={itemPath as FormPathLeaves<T, ObjectFieldData>}
|
|
366
|
-
{focusedPath}
|
|
367
|
-
{flashingPath}
|
|
368
|
-
depth={depth + 1}
|
|
369
|
-
/>
|
|
370
|
-
</div>
|
|
371
|
-
</Accordion.Content>
|
|
372
|
-
</Accordion.Item>
|
|
375
|
+
</Accordion.Trigger>
|
|
376
|
+
<Accordion.Content class="space-y-4 rounded-b-md border border-t-0 p-4">
|
|
377
|
+
{@const itemPath = joinPath(path, index)}
|
|
378
|
+
<div data-field-path={itemPath}>
|
|
379
|
+
<FieldRenderer
|
|
380
|
+
objectFieldType="inline"
|
|
381
|
+
field={objectField}
|
|
382
|
+
{form}
|
|
383
|
+
path={itemPath}
|
|
384
|
+
{focusedPath}
|
|
385
|
+
{flashingPath}
|
|
386
|
+
depth={depth + 1}
|
|
387
|
+
/>
|
|
388
|
+
</div>
|
|
389
|
+
</Accordion.Content>
|
|
390
|
+
</Accordion.Item>
|
|
391
|
+
{:else}
|
|
392
|
+
<p class="text-red-500">
|
|
393
|
+
Invalid field configuration. Unknown slug:
|
|
394
|
+
{$value[index].slug}
|
|
395
|
+
</p>
|
|
396
|
+
{/if}
|
|
373
397
|
{:else}
|
|
374
|
-
<p class="text-red-500">
|
|
375
|
-
Invalid field configuration. Unknown slug:
|
|
376
|
-
{$value[index].slug}
|
|
377
|
-
</p>
|
|
398
|
+
<p class="text-red-500">Invalid field configuration. Index: {index}</p>
|
|
378
399
|
{/if}
|
|
379
|
-
{
|
|
380
|
-
<p class="text-red-500">Invalid field configuration. Index: {index}</p>
|
|
381
|
-
{/if}
|
|
382
|
-
{/key}
|
|
400
|
+
{/key}
|
|
383
401
|
</div>
|
|
384
402
|
{/each}
|
|
385
403
|
{/if}
|
|
@@ -388,7 +406,13 @@
|
|
|
388
406
|
{#if !isFixedLength}
|
|
389
407
|
{#if field.displayMode === 'blocks'}
|
|
390
408
|
<div class="mt-4">
|
|
391
|
-
<Button
|
|
409
|
+
<Button
|
|
410
|
+
size="sm"
|
|
411
|
+
type="button"
|
|
412
|
+
variant="outline"
|
|
413
|
+
disabled={atMax}
|
|
414
|
+
onclick={() => (blockPickerOpen = true)}
|
|
415
|
+
>
|
|
392
416
|
<CirclePlus />
|
|
393
417
|
Add Block
|
|
394
418
|
</Button>
|
|
@@ -401,7 +425,13 @@
|
|
|
401
425
|
{:else}
|
|
402
426
|
<div class="mt-4 flex flex-wrap gap-2">
|
|
403
427
|
{#each field.of as option}
|
|
404
|
-
<Button
|
|
428
|
+
<Button
|
|
429
|
+
size="sm"
|
|
430
|
+
type="button"
|
|
431
|
+
variant="outline"
|
|
432
|
+
disabled={atMax}
|
|
433
|
+
onclick={() => addItem(option)}
|
|
434
|
+
>
|
|
405
435
|
<CirclePlus />
|
|
406
436
|
{getLocalizedLabel(option.label, interfaceLanguage.current) || option.slug}
|
|
407
437
|
</Button>
|
|
@@ -1,33 +1,13 @@
|
|
|
1
1
|
import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
|
|
2
|
-
import type { BlocksField
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
depth?: number;
|
|
11
|
-
};
|
|
12
|
-
exports: {};
|
|
13
|
-
bindings: "";
|
|
14
|
-
slots: {};
|
|
15
|
-
events: {};
|
|
2
|
+
import type { BlocksField } from '../../../types/fields.js';
|
|
3
|
+
type Props = {
|
|
4
|
+
field: BlocksField;
|
|
5
|
+
form: SuperForm<Record<string, unknown>>;
|
|
6
|
+
path: FormPathLeaves<Record<string, unknown>>;
|
|
7
|
+
focusedPath?: string | null;
|
|
8
|
+
flashingPath?: string | null;
|
|
9
|
+
depth?: number;
|
|
16
10
|
};
|
|
17
|
-
declare
|
|
18
|
-
|
|
19
|
-
events(): ReturnType<typeof $$render<T>>['events'];
|
|
20
|
-
slots(): ReturnType<typeof $$render<T>>['slots'];
|
|
21
|
-
bindings(): "";
|
|
22
|
-
exports(): {};
|
|
23
|
-
}
|
|
24
|
-
interface $$IsomorphicComponent {
|
|
25
|
-
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']>> & {
|
|
26
|
-
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
27
|
-
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
28
|
-
<T extends Record<string, unknown>>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
29
|
-
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
30
|
-
}
|
|
31
|
-
declare const BlocksField: $$IsomorphicComponent;
|
|
32
|
-
type BlocksField<T extends Record<string, unknown>> = InstanceType<typeof BlocksField<T>>;
|
|
11
|
+
declare const BlocksField: import("svelte").Component<Props, {}, "">;
|
|
12
|
+
type BlocksField = ReturnType<typeof BlocksField>;
|
|
33
13
|
export default BlocksField;
|
|
@@ -1,58 +1,48 @@
|
|
|
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 { BooleanField
|
|
14
|
-
import
|
|
15
|
-
import Checkbox from '../../../components/ui/checkbox/checkbox.svelte';
|
|
3
|
+
import type { BooleanField } from '../../../types/fields.js';
|
|
4
|
+
import { Switch } from '../../../components/ui/switch/index.js';
|
|
16
5
|
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
17
6
|
import { getLocalizedLabel } from '../../utils/collectionLabel.js';
|
|
18
7
|
|
|
19
8
|
type Props = {
|
|
20
9
|
field: BooleanField;
|
|
21
|
-
|
|
22
|
-
path: FormPathLeaves<T, boolean | undefined>;
|
|
10
|
+
value: boolean | undefined;
|
|
23
11
|
};
|
|
24
12
|
|
|
25
|
-
let { field,
|
|
13
|
+
let { field, value = $bindable(), ...props }: Props = $props();
|
|
26
14
|
|
|
27
15
|
const interfaceLanguage = useInterfaceLanguage();
|
|
28
|
-
const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<boolean | undefined>;
|
|
29
16
|
|
|
30
17
|
onMount(() => {
|
|
31
|
-
if (
|
|
32
|
-
|
|
18
|
+
if (value === undefined) {
|
|
19
|
+
value = field.defaultValue ?? false;
|
|
33
20
|
}
|
|
34
21
|
});
|
|
22
|
+
|
|
23
|
+
const label = $derived(
|
|
24
|
+
getLocalizedLabel(field.label, interfaceLanguage.current) || field.slug
|
|
25
|
+
);
|
|
26
|
+
const description = $derived(
|
|
27
|
+
field.description
|
|
28
|
+
? getLocalizedLabel(field.description, interfaceLanguage.current)
|
|
29
|
+
: undefined
|
|
30
|
+
);
|
|
35
31
|
</script>
|
|
36
32
|
|
|
37
|
-
{#if
|
|
38
|
-
<
|
|
39
|
-
class="
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
{...props}
|
|
43
|
-
bind:checked={$value}
|
|
44
|
-
class="data-[state=checked]:border-blue-600 data-[state=checked]:bg-blue-600 data-[state=checked]:text-white dark:data-[state=checked]:border-blue-700 dark:data-[state=checked]:bg-blue-700"
|
|
45
|
-
/>
|
|
46
|
-
<div class="grid gap-1.5 font-normal">
|
|
47
|
-
<p class="text-sm leading-none font-medium">
|
|
48
|
-
{getLocalizedLabel(field.label, interfaceLanguage.current) || field.slug}
|
|
33
|
+
{#if value !== undefined}
|
|
34
|
+
<div class="flex items-center justify-between py-1.5">
|
|
35
|
+
<div class="flex flex-col gap-0.5">
|
|
36
|
+
<span class="text-[13px] font-medium leading-none">
|
|
37
|
+
{label}
|
|
49
38
|
{#if field.required}<span class="text-destructive ml-0.5">*</span>{/if}
|
|
50
|
-
</
|
|
51
|
-
{#if
|
|
52
|
-
<
|
|
53
|
-
{
|
|
54
|
-
</
|
|
39
|
+
</span>
|
|
40
|
+
{#if description}
|
|
41
|
+
<span class="text-muted-foreground text-[11px]">
|
|
42
|
+
{description}
|
|
43
|
+
</span>
|
|
55
44
|
{/if}
|
|
56
45
|
</div>
|
|
57
|
-
|
|
46
|
+
<Switch bind:checked={value} aria-label={label} />
|
|
47
|
+
</div>
|
|
58
48
|
{/if}
|
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
|
|
2
1
|
import type { BooleanField } from '../../../types/fields.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
form: SuperForm<T>;
|
|
7
|
-
path: FormPathLeaves<T, boolean | undefined>;
|
|
8
|
-
};
|
|
9
|
-
exports: {};
|
|
10
|
-
bindings: "";
|
|
11
|
-
slots: {};
|
|
12
|
-
events: {};
|
|
2
|
+
type Props = {
|
|
3
|
+
field: BooleanField;
|
|
4
|
+
value: boolean | 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 BooleanField: $$IsomorphicComponent;
|
|
29
|
-
type BooleanField<T extends Record<string, unknown>> = InstanceType<typeof BooleanField<T>>;
|
|
6
|
+
declare const BooleanField: import("svelte").Component<Props, {}, "value">;
|
|
7
|
+
type BooleanField = ReturnType<typeof BooleanField>;
|
|
30
8
|
export default BooleanField;
|
|
@@ -1,14 +1,4 @@
|
|
|
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
3
|
import type { CheckboxesField } from '../../../types/fields.js';
|
|
14
4
|
import * as Form from '../../../components/ui/form/index.js';
|
|
@@ -18,39 +8,37 @@
|
|
|
18
8
|
|
|
19
9
|
type Props = {
|
|
20
10
|
field: CheckboxesField;
|
|
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
|
function isChecked(optionValue: string): boolean {
|
|
31
|
-
return Array.isArray(
|
|
19
|
+
return Array.isArray(value) && value.includes(optionValue);
|
|
32
20
|
}
|
|
33
21
|
|
|
34
22
|
function toggle(optionValue: string) {
|
|
35
|
-
if (!Array.isArray(
|
|
36
|
-
|
|
23
|
+
if (!Array.isArray(value)) {
|
|
24
|
+
value = [optionValue];
|
|
37
25
|
return;
|
|
38
26
|
}
|
|
39
|
-
if (
|
|
40
|
-
|
|
27
|
+
if (value.includes(optionValue)) {
|
|
28
|
+
value = value.filter((v) => v !== optionValue);
|
|
41
29
|
} else {
|
|
42
|
-
|
|
30
|
+
value = [...value, optionValue];
|
|
43
31
|
}
|
|
44
32
|
}
|
|
45
33
|
|
|
46
34
|
onMount(() => {
|
|
47
|
-
if (
|
|
48
|
-
|
|
35
|
+
if (value === undefined) {
|
|
36
|
+
value = [];
|
|
49
37
|
}
|
|
50
38
|
});
|
|
51
39
|
</script>
|
|
52
40
|
|
|
53
|
-
{#if
|
|
41
|
+
{#if value !== undefined}
|
|
54
42
|
<div class="flex flex-col space-y-2">
|
|
55
43
|
{#each field.options as option}
|
|
56
44
|
<div class="flex items-center space-x-3">
|
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
|
|
2
1
|
import type { CheckboxesField } 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: CheckboxesField;
|
|
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 CheckboxesField: $$IsomorphicComponent;
|
|
29
|
-
type CheckboxesField<T extends Record<string, unknown>> = InstanceType<typeof CheckboxesField<T>>;
|
|
6
|
+
declare const CheckboxesField: import("svelte").Component<Props, {}, "value">;
|
|
7
|
+
type CheckboxesField = ReturnType<typeof CheckboxesField>;
|
|
30
8
|
export default CheckboxesField;
|
|
@@ -1,27 +1,14 @@
|
|
|
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 ContentEditor from '../tiptap/content-editor.svelte';
|
|
13
3
|
import type { ContentField } from '../../../types/fields.js';
|
|
14
4
|
import type { StructuredContentDoc } from '../../../types/structured-content.js';
|
|
15
5
|
|
|
16
6
|
type Props = {
|
|
17
7
|
field: ContentField;
|
|
18
|
-
|
|
19
|
-
path: FormPathLeaves<T, StructuredContentDoc | undefined>;
|
|
8
|
+
value: StructuredContentDoc | undefined;
|
|
20
9
|
};
|
|
21
10
|
|
|
22
|
-
let { field,
|
|
23
|
-
|
|
24
|
-
const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<StructuredContentDoc | undefined>;
|
|
11
|
+
let { field, value = $bindable(), ...props }: Props = $props();
|
|
25
12
|
</script>
|
|
26
13
|
|
|
27
|
-
<ContentEditor bind:value
|
|
14
|
+
<ContentEditor bind:value inlineBlocks={field.inlineBlocks} />
|