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,26 +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>">
|
|
6
|
-
import {
|
|
7
|
-
formFieldProxy,
|
|
8
|
-
type FormFieldProxy,
|
|
9
|
-
type FormPathLeaves,
|
|
10
|
-
type SuperForm
|
|
11
|
-
} from 'sveltekit-superforms';
|
|
1
|
+
<script lang="ts">
|
|
12
2
|
import Tiptap from '../tiptap.svelte';
|
|
13
3
|
import type { RichtextField } from '../../../types/fields.js';
|
|
14
4
|
|
|
15
5
|
type Props = {
|
|
16
6
|
field: RichtextField;
|
|
17
|
-
|
|
18
|
-
path: FormPathLeaves<T, string | undefined>;
|
|
7
|
+
value: string | undefined;
|
|
19
8
|
};
|
|
20
9
|
|
|
21
|
-
let { field,
|
|
22
|
-
|
|
23
|
-
const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<string | undefined>;
|
|
10
|
+
let { field, value = $bindable(), ...props }: Props = $props();
|
|
24
11
|
</script>
|
|
25
12
|
|
|
26
|
-
<Tiptap bind:value
|
|
13
|
+
<Tiptap bind:value />
|
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
|
|
2
1
|
import type { RichtextField } 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: RichtextField;
|
|
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 RichtextField: $$IsomorphicComponent;
|
|
29
|
-
type RichtextField<T extends Record<string, unknown>> = InstanceType<typeof RichtextField<T>>;
|
|
6
|
+
declare const RichtextField: import("svelte").Component<Props, {}, "value">;
|
|
7
|
+
type RichtextField = ReturnType<typeof RichtextField>;
|
|
30
8
|
export default RichtextField;
|
|
@@ -1,49 +1,37 @@
|
|
|
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 Select from '../../../components/ui/select/index.js';
|
|
7
3
|
import type { SelectField } from '../../../types/fields.js';
|
|
8
4
|
import { onMount } from 'svelte';
|
|
9
|
-
import {
|
|
10
|
-
formFieldProxy,
|
|
11
|
-
type FormFieldProxy,
|
|
12
|
-
type FormPathLeaves,
|
|
13
|
-
type SuperForm
|
|
14
|
-
} from 'sveltekit-superforms';
|
|
15
5
|
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
16
6
|
import { getLocalizedLabel } from '../../utils/collectionLabel.js';
|
|
17
7
|
|
|
18
8
|
type Props = {
|
|
19
9
|
field: SelectField;
|
|
20
|
-
|
|
21
|
-
path: FormPathLeaves<T, string | string[] | undefined>;
|
|
10
|
+
value: string | string[] | undefined;
|
|
22
11
|
};
|
|
23
12
|
|
|
24
|
-
let { field,
|
|
13
|
+
let { field, value = $bindable(), ...props }: Props = $props();
|
|
25
14
|
|
|
26
15
|
const interfaceLanguage = useInterfaceLanguage();
|
|
27
|
-
const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<string | string[] | undefined>;
|
|
28
16
|
|
|
29
17
|
// Get display label for current value(s)
|
|
30
18
|
function getDisplayLabel(): string {
|
|
31
|
-
if (
|
|
32
|
-
if (field.multiple && Array.isArray(
|
|
33
|
-
return
|
|
19
|
+
if (!value) return '';
|
|
20
|
+
if (field.multiple && Array.isArray(value)) {
|
|
21
|
+
return value
|
|
34
22
|
.map((v) => {
|
|
35
23
|
const opt = field.options.find((o) => o.value === v);
|
|
36
24
|
return opt ? getLocalizedLabel(opt.label, interfaceLanguage.current) : v;
|
|
37
25
|
})
|
|
38
26
|
.join(', ');
|
|
39
27
|
}
|
|
40
|
-
const option = field.options.find((o) => o.value ===
|
|
41
|
-
return option ? getLocalizedLabel(option.label, interfaceLanguage.current) : (
|
|
28
|
+
const option = field.options.find((o) => o.value === value);
|
|
29
|
+
return option ? getLocalizedLabel(option.label, interfaceLanguage.current) : (value as string);
|
|
42
30
|
}
|
|
43
31
|
|
|
44
32
|
onMount(() => {
|
|
45
|
-
if (
|
|
46
|
-
|
|
33
|
+
if (value === undefined) {
|
|
34
|
+
value = field.multiple ? [] : '';
|
|
47
35
|
}
|
|
48
36
|
});
|
|
49
37
|
</script>
|
|
@@ -51,11 +39,10 @@
|
|
|
51
39
|
{#if field.multiple}
|
|
52
40
|
<Select.Root
|
|
53
41
|
type="multiple"
|
|
54
|
-
bind:value={
|
|
55
|
-
name={path}
|
|
42
|
+
bind:value={value as string[]}
|
|
56
43
|
>
|
|
57
44
|
<Select.Trigger {...props} class="w-full">
|
|
58
|
-
{#if Array.isArray(
|
|
45
|
+
{#if Array.isArray(value) && value.length > 0}
|
|
59
46
|
{getDisplayLabel()}
|
|
60
47
|
{:else}
|
|
61
48
|
<span class="text-muted-foreground">Select...</span>
|
|
@@ -70,11 +57,10 @@
|
|
|
70
57
|
{:else}
|
|
71
58
|
<Select.Root
|
|
72
59
|
type="single"
|
|
73
|
-
bind:value={
|
|
74
|
-
name={path}
|
|
60
|
+
bind:value={value as string}
|
|
75
61
|
>
|
|
76
62
|
<Select.Trigger {...props} class="w-full">
|
|
77
|
-
{#if
|
|
63
|
+
{#if value}
|
|
78
64
|
{getDisplayLabel()}
|
|
79
65
|
{:else}
|
|
80
66
|
<span class="text-muted-foreground">Select...</span>
|
|
@@ -1,30 +1,8 @@
|
|
|
1
1
|
import type { SelectField } from '../../../types/fields.js';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
field: SelectField;
|
|
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: SelectField;
|
|
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 SelectField: $$IsomorphicComponent;
|
|
29
|
-
type SelectField<T extends Record<string, unknown>> = InstanceType<typeof SelectField<T>>;
|
|
6
|
+
declare const SelectField: import("svelte").Component<Props, {}, "value">;
|
|
7
|
+
type SelectField = ReturnType<typeof SelectField>;
|
|
30
8
|
export default SelectField;
|
|
@@ -1,12 +1,5 @@
|
|
|
1
|
-
<script lang="ts"
|
|
2
|
-
type
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<script lang="ts" generics="T extends Record<string, unknown>">
|
|
6
|
-
import {
|
|
7
|
-
type FormPathLeaves,
|
|
8
|
-
type SuperForm
|
|
9
|
-
} from 'sveltekit-superforms';
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { SuperForm } from 'sveltekit-superforms';
|
|
10
3
|
import FieldRenderer from './field-renderer.svelte';
|
|
11
4
|
import { joinPath } from '../../utils/objectPath.js';
|
|
12
5
|
import { getAtPath, setAtPath } from '../../utils/objectPath.js';
|
|
@@ -28,8 +21,8 @@
|
|
|
28
21
|
|
|
29
22
|
type Props = {
|
|
30
23
|
field: SeoField;
|
|
31
|
-
form: SuperForm<
|
|
32
|
-
path:
|
|
24
|
+
form: SuperForm<Record<string, unknown>>;
|
|
25
|
+
path: string;
|
|
33
26
|
};
|
|
34
27
|
|
|
35
28
|
let { field, form, path, ...props }: Props = $props();
|
|
@@ -261,7 +254,7 @@
|
|
|
261
254
|
<div>
|
|
262
255
|
<FieldRenderer
|
|
263
256
|
field={f}
|
|
264
|
-
|
|
257
|
+
{form}
|
|
265
258
|
path={joinPath(path, f.slug)}
|
|
266
259
|
/>
|
|
267
260
|
{#if f.slug === 'title'}
|
|
@@ -1,30 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { SeoField
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
path: FormPathLeaves<T, SeoFieldData | undefined>;
|
|
8
|
-
};
|
|
9
|
-
exports: {};
|
|
10
|
-
bindings: "";
|
|
11
|
-
slots: {};
|
|
12
|
-
events: {};
|
|
1
|
+
import type { SuperForm } from 'sveltekit-superforms';
|
|
2
|
+
import type { SeoField } from '../../../types/fields.js';
|
|
3
|
+
type Props = {
|
|
4
|
+
field: SeoField;
|
|
5
|
+
form: SuperForm<Record<string, unknown>>;
|
|
6
|
+
path: string;
|
|
13
7
|
};
|
|
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 SeoField: $$IsomorphicComponent;
|
|
29
|
-
type SeoField<T extends Record<string, unknown>> = InstanceType<typeof SeoField<T>>;
|
|
8
|
+
declare const SeoField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type SeoField = ReturnType<typeof SeoField>;
|
|
30
10
|
export default SeoField;
|
|
@@ -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 Button from '../../../components/ui/button/button.svelte';
|
|
7
3
|
import Input from '../../../components/ui/input/input.svelte';
|
|
8
|
-
import {
|
|
9
|
-
formFieldProxy,
|
|
10
|
-
type FormFieldProxy,
|
|
11
|
-
type FormPathLeaves,
|
|
12
|
-
type SuperForm
|
|
13
|
-
} from 'sveltekit-superforms';
|
|
14
4
|
import type { ArrayField, UrlFieldData } from '../../../types/fields.js';
|
|
15
5
|
import { onMount } from 'svelte';
|
|
16
6
|
import CirclePlus from '@tabler/icons-svelte/icons/circle-plus';
|
|
@@ -23,21 +13,18 @@
|
|
|
23
13
|
|
|
24
14
|
type Props = {
|
|
25
15
|
field: ArrayField;
|
|
26
|
-
|
|
27
|
-
path: FormPathLeaves<T>;
|
|
16
|
+
value: unknown[] | undefined;
|
|
28
17
|
};
|
|
29
18
|
|
|
30
|
-
let { field,
|
|
31
|
-
|
|
32
|
-
const { value } = formFieldProxy(form, path) satisfies FormFieldProxy<unknown[] | undefined>;
|
|
19
|
+
let { field, value = $bindable(), ...props }: Props = $props();
|
|
33
20
|
|
|
34
21
|
onMount(() => {
|
|
35
|
-
if (
|
|
36
|
-
|
|
22
|
+
if (!value || !Array.isArray(value)) {
|
|
23
|
+
value = [];
|
|
37
24
|
}
|
|
38
25
|
});
|
|
39
26
|
|
|
40
|
-
const atMax = $derived(field.maxItems !== undefined && (
|
|
27
|
+
const atMax = $derived(field.maxItems !== undefined && (value?.length ?? 0) >= field.maxItems);
|
|
41
28
|
|
|
42
29
|
// --- Text ---
|
|
43
30
|
let textInput = $state('');
|
|
@@ -47,9 +34,9 @@
|
|
|
47
34
|
if (field.localized) {
|
|
48
35
|
const item: Record<string, string> = {};
|
|
49
36
|
item[contentLanguage.current] = textInput.trim();
|
|
50
|
-
|
|
37
|
+
value = [...(value ?? []), item];
|
|
51
38
|
} else {
|
|
52
|
-
|
|
39
|
+
value = [...(value ?? []), textInput.trim()];
|
|
53
40
|
}
|
|
54
41
|
textInput = '';
|
|
55
42
|
}
|
|
@@ -67,7 +54,7 @@
|
|
|
67
54
|
function addNumberItem() {
|
|
68
55
|
const num = Number(numberInput);
|
|
69
56
|
if (numberInput === '' || isNaN(num) || atMax) return;
|
|
70
|
-
|
|
57
|
+
value = [...(value ?? []), num];
|
|
71
58
|
numberInput = '';
|
|
72
59
|
}
|
|
73
60
|
|
|
@@ -82,13 +69,13 @@
|
|
|
82
69
|
function addUrlItem() {
|
|
83
70
|
if (atMax) return;
|
|
84
71
|
const item: UrlFieldData = { url: {}, text: {}, newTab: false };
|
|
85
|
-
|
|
72
|
+
value = [...(value ?? []), item];
|
|
86
73
|
}
|
|
87
74
|
|
|
88
75
|
// --- Common ---
|
|
89
76
|
function removeItem(index: number) {
|
|
90
|
-
if (
|
|
91
|
-
|
|
77
|
+
if (!value) return;
|
|
78
|
+
value = value.filter((_, i) => i !== index);
|
|
92
79
|
}
|
|
93
80
|
|
|
94
81
|
function getTextDisplay(item: unknown): string {
|
|
@@ -104,9 +91,9 @@
|
|
|
104
91
|
{#if field.of === 'text'}
|
|
105
92
|
<!-- Tag chips for text items -->
|
|
106
93
|
<div class="space-y-3">
|
|
107
|
-
{#if
|
|
94
|
+
{#if value && value.length > 0}
|
|
108
95
|
<div class="flex flex-wrap gap-2">
|
|
109
|
-
{#each
|
|
96
|
+
{#each value as item, index}
|
|
110
97
|
<span
|
|
111
98
|
class="bg-[#EEEAF8] text-[#1A1A2E] inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium"
|
|
112
99
|
>
|
|
@@ -122,9 +109,9 @@
|
|
|
122
109
|
if (typeof item === 'object' && item !== null) {
|
|
123
110
|
const rec = { ...(item as Record<string, string>) };
|
|
124
111
|
rec[contentLanguage.current] = val;
|
|
125
|
-
const arr = [...(
|
|
112
|
+
const arr = [...(value ?? [])];
|
|
126
113
|
arr[index] = rec;
|
|
127
|
-
|
|
114
|
+
value = arr;
|
|
128
115
|
}
|
|
129
116
|
}}
|
|
130
117
|
/>
|
|
@@ -161,7 +148,7 @@
|
|
|
161
148
|
|
|
162
149
|
{#if field.maxItems !== undefined}
|
|
163
150
|
<p class="text-xs {atMax ? 'text-destructive' : 'text-muted-foreground'}">
|
|
164
|
-
{
|
|
151
|
+
{value?.length ?? 0} / {field.maxItems}
|
|
165
152
|
</p>
|
|
166
153
|
{/if}
|
|
167
154
|
</div>
|
|
@@ -169,9 +156,9 @@
|
|
|
169
156
|
{:else if field.of === 'number'}
|
|
170
157
|
<!-- Tag chips for number items -->
|
|
171
158
|
<div class="space-y-3">
|
|
172
|
-
{#if
|
|
159
|
+
{#if value && value.length > 0}
|
|
173
160
|
<div class="flex flex-wrap gap-2">
|
|
174
|
-
{#each
|
|
161
|
+
{#each value as item, index}
|
|
175
162
|
<span
|
|
176
163
|
class="bg-[#EEEAF8] text-[#1A1A2E] inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium tabular-nums"
|
|
177
164
|
>
|
|
@@ -206,7 +193,7 @@
|
|
|
206
193
|
|
|
207
194
|
{#if field.maxItems !== undefined}
|
|
208
195
|
<p class="text-xs {atMax ? 'text-destructive' : 'text-muted-foreground'}">
|
|
209
|
-
{
|
|
196
|
+
{value?.length ?? 0} / {field.maxItems}
|
|
210
197
|
</p>
|
|
211
198
|
{/if}
|
|
212
199
|
</div>
|
|
@@ -214,9 +201,9 @@
|
|
|
214
201
|
{:else if field.of === 'url'}
|
|
215
202
|
<!-- Compact list for URL items -->
|
|
216
203
|
<div class="space-y-3">
|
|
217
|
-
{#if
|
|
204
|
+
{#if value && value.length > 0}
|
|
218
205
|
<div class="space-y-2">
|
|
219
|
-
{#each
|
|
206
|
+
{#each value as item, index}
|
|
220
207
|
{@const urlItem = item as UrlFieldData}
|
|
221
208
|
<div class="flex items-start gap-2 rounded-xl border border-[#E2DFF0] bg-[#F4F2FA] p-3">
|
|
222
209
|
<div class="flex-1 space-y-2">
|
|
@@ -227,9 +214,9 @@
|
|
|
227
214
|
oninput={(e) => {
|
|
228
215
|
const val = e.currentTarget.value;
|
|
229
216
|
const updated = { ...urlItem, url: { ...(urlItem.url ?? {}), [contentLanguage.current]: val } };
|
|
230
|
-
const arr = [...(
|
|
217
|
+
const arr = [...(value ?? [])];
|
|
231
218
|
arr[index] = updated;
|
|
232
|
-
|
|
219
|
+
value = arr;
|
|
233
220
|
}}
|
|
234
221
|
/>
|
|
235
222
|
<div class="flex items-center gap-2">
|
|
@@ -241,9 +228,9 @@
|
|
|
241
228
|
oninput={(e) => {
|
|
242
229
|
const val = e.currentTarget.value;
|
|
243
230
|
const updated = { ...urlItem, text: { ...(urlItem.text ?? {}), [contentLanguage.current]: val } };
|
|
244
|
-
const arr = [...(
|
|
231
|
+
const arr = [...(value ?? [])];
|
|
245
232
|
arr[index] = updated;
|
|
246
|
-
|
|
233
|
+
value = arr;
|
|
247
234
|
}}
|
|
248
235
|
/>
|
|
249
236
|
<label class="flex items-center gap-1.5 text-xs text-[#555566] whitespace-nowrap">
|
|
@@ -252,9 +239,9 @@
|
|
|
252
239
|
checked={urlItem.newTab ?? false}
|
|
253
240
|
onchange={(e) => {
|
|
254
241
|
const updated = { ...urlItem, newTab: e.currentTarget.checked };
|
|
255
|
-
const arr = [...(
|
|
242
|
+
const arr = [...(value ?? [])];
|
|
256
243
|
arr[index] = updated;
|
|
257
|
-
|
|
244
|
+
value = arr;
|
|
258
245
|
}}
|
|
259
246
|
class="accent-[#5B4A9E]"
|
|
260
247
|
/>
|
|
@@ -282,7 +269,7 @@
|
|
|
282
269
|
|
|
283
270
|
{#if field.maxItems !== undefined}
|
|
284
271
|
<p class="text-xs {atMax ? 'text-destructive' : 'text-muted-foreground'}">
|
|
285
|
-
{
|
|
272
|
+
{value?.length ?? 0} / {field.maxItems}
|
|
286
273
|
</p>
|
|
287
274
|
{/if}
|
|
288
275
|
</div>
|
|
@@ -1,30 +1,8 @@
|
|
|
1
|
-
import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
|
|
2
1
|
import type { ArrayField } from '../../../types/fields.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
form: SuperForm<T>;
|
|
7
|
-
path: FormPathLeaves<T>;
|
|
8
|
-
};
|
|
9
|
-
exports: {};
|
|
10
|
-
bindings: "";
|
|
11
|
-
slots: {};
|
|
12
|
-
events: {};
|
|
2
|
+
type Props = {
|
|
3
|
+
field: ArrayField;
|
|
4
|
+
value: unknown[] | 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 SimpleArrayField: $$IsomorphicComponent;
|
|
29
|
-
type SimpleArrayField<T extends Record<string, unknown>> = InstanceType<typeof SimpleArrayField<T>>;
|
|
6
|
+
declare const SimpleArrayField: import("svelte").Component<Props, {}, "value">;
|
|
7
|
+
type SimpleArrayField = ReturnType<typeof SimpleArrayField>;
|
|
30
8
|
export default SimpleArrayField;
|
|
@@ -1,11 +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 {
|
|
7
3
|
formFieldProxy,
|
|
8
|
-
type FormFieldProxy,
|
|
9
4
|
type FormPathLeaves,
|
|
10
5
|
type SuperForm
|
|
11
6
|
} from 'sveltekit-superforms';
|
|
@@ -16,8 +11,8 @@
|
|
|
16
11
|
|
|
17
12
|
type Props = {
|
|
18
13
|
field: SlugField;
|
|
19
|
-
form: SuperForm<
|
|
20
|
-
path: FormPathLeaves<
|
|
14
|
+
form: SuperForm<Record<string, unknown>>;
|
|
15
|
+
path: FormPathLeaves<Record<string, unknown>>;
|
|
21
16
|
};
|
|
22
17
|
|
|
23
18
|
let { field, form, path, ...props }: Props = $props();
|
|
@@ -27,7 +22,7 @@
|
|
|
27
22
|
|
|
28
23
|
const { form: formData } = form;
|
|
29
24
|
|
|
30
|
-
const { value } = formFieldProxy(form, path)
|
|
25
|
+
const { value } = formFieldProxy(form, path);
|
|
31
26
|
|
|
32
27
|
let patternKeys = effectivePattern ? extractPatternKeys(effectivePattern) : [];
|
|
33
28
|
|
|
@@ -41,8 +36,8 @@
|
|
|
41
36
|
patternKeys.map((key) => {
|
|
42
37
|
const { value: valueStore } = formFieldProxy(
|
|
43
38
|
form,
|
|
44
|
-
key as FormPathLeaves<
|
|
45
|
-
)
|
|
39
|
+
key as FormPathLeaves<Record<string, unknown>>
|
|
40
|
+
);
|
|
46
41
|
valueStore.subscribe(() => {
|
|
47
42
|
try {
|
|
48
43
|
$value = generateSlug(pattern);
|
|
@@ -1,30 +1,10 @@
|
|
|
1
1
|
import { type FormPathLeaves, type SuperForm } from 'sveltekit-superforms';
|
|
2
2
|
import type { SlugField } from '../../../types/fields.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
path: FormPathLeaves<T, string | undefined>;
|
|
8
|
-
};
|
|
9
|
-
exports: {};
|
|
10
|
-
bindings: "";
|
|
11
|
-
slots: {};
|
|
12
|
-
events: {};
|
|
3
|
+
type Props = {
|
|
4
|
+
field: SlugField;
|
|
5
|
+
form: SuperForm<Record<string, unknown>>;
|
|
6
|
+
path: FormPathLeaves<Record<string, unknown>>;
|
|
13
7
|
};
|
|
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 SlugField: $$IsomorphicComponent;
|
|
29
|
-
type SlugField<T extends Record<string, unknown>> = InstanceType<typeof SlugField<T>>;
|
|
8
|
+
declare const SlugField: import("svelte").Component<Props, {}, "">;
|
|
9
|
+
type SlugField = ReturnType<typeof SlugField>;
|
|
30
10
|
export default SlugField;
|