rimecms 0.27.6 → 0.28.1
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/adapter-sqlite/{area.js → area.server.js} +2 -2
- package/dist/adapter-sqlite/{blocks.d.ts → blocks.server.d.ts} +1 -1
- package/dist/adapter-sqlite/{blocks.js → blocks.server.js} +1 -1
- package/dist/adapter-sqlite/{collection.js → collection.server.js} +17 -8
- package/dist/adapter-sqlite/generate-schema/write.server.js +2 -2
- package/dist/adapter-sqlite/index.server.d.ts +8 -8
- package/dist/adapter-sqlite/index.server.js +7 -7
- package/dist/adapter-sqlite/{orderBy.js → orderBy.server.js} +1 -1
- package/dist/adapter-sqlite/{relations.d.ts → relations.server.d.ts} +1 -1
- package/dist/adapter-sqlite/{relations.js → relations.server.js} +1 -1
- package/dist/adapter-sqlite/{transform.js → transform.server.js} +2 -3
- package/dist/adapter-sqlite/{tree.d.ts → tree.server.d.ts} +1 -1
- package/dist/adapter-sqlite/{tree.js → tree.server.js} +1 -1
- package/dist/adapter-sqlite/url.server.d.ts +1 -1
- package/dist/core/areas/local-api.server.d.ts +1 -1
- package/dist/core/areas/local-api.server.js +1 -0
- package/dist/core/collections/api/delete.server.js +1 -1
- package/dist/core/collections/api/get.server.js +1 -1
- package/dist/core/collections/api/getById.server.js +3 -1
- package/dist/core/collections/config/augment-panel.d.ts +13 -0
- package/dist/core/collections/config/augment-panel.js +19 -0
- package/dist/core/collections/config/augment-upload.server.d.ts +1 -0
- package/dist/core/collections/config/augment-upload.server.js +1 -0
- package/dist/core/collections/config/builder.js +3 -1
- package/dist/core/collections/config/builder.server.js +3 -1
- package/dist/core/collections/local-api.server.js +3 -1
- package/dist/core/collections/operations/findById.js +3 -1
- package/dist/core/collections/upload/hooks/convert-base64.server.js +1 -1
- package/dist/core/config/auth/better-auth.server.d.ts +3 -3
- package/dist/core/config/auth/better-auth.server.js +1 -1
- package/dist/core/config/client/augment-panel.d.ts +4 -4
- package/dist/core/config/client/build-config.d.ts +5 -5
- package/dist/core/config/server/augment-directories.server.js +3 -3
- package/dist/core/config/server/augment-staff.server.d.ts +1 -1
- package/dist/core/config/server/augment-staff.server.js +1 -1
- package/dist/core/config/server/build-config.server.d.ts +12 -12
- package/dist/core/config/server/build-config.server.js +1 -1
- package/dist/core/config/server/{validate.js → validate.server.js} +61 -29
- package/dist/core/config/server/{write.js → write.server.js} +1 -1
- package/dist/core/config/shared/augment-icons.d.ts +1 -2
- package/dist/core/config/shared/get-staff-collection.d.ts +1 -1
- package/dist/core/config/shared/upload-directories.js +1 -1
- package/dist/core/config/types.d.ts +20 -8
- package/dist/core/dev/cli/build/templates.d.ts +1 -1
- package/dist/core/dev/cli/build/templates.js +5 -2
- package/dist/core/dev/cli/generate/{index.js → index.server.js} +13 -9
- package/dist/core/dev/cli/index.js +11 -6
- package/dist/core/dev/cli/init/{index.js → index.server.js} +68 -25
- package/dist/core/dev/cli/init/{packageManagerUtil.js → package-manager-util.server.js} +5 -5
- package/dist/core/dev/generate/routes/{area.d.ts → area.server.d.ts} +1 -1
- package/dist/core/dev/generate/routes/{area.js → area.server.js} +1 -1
- package/dist/core/dev/generate/routes/{collection.d.ts → collection.server.d.ts} +1 -1
- package/dist/core/dev/generate/routes/{collection.js → collection.server.js} +1 -1
- package/dist/core/dev/generate/routes/{common.d.ts → common.server.d.ts} +1 -1
- package/dist/core/dev/generate/routes/{common.js → common.server.js} +3 -3
- package/dist/core/dev/generate/routes/{index.js → index.server.js} +5 -5
- package/dist/core/dev/generate/routes/{util.js → util.server.js} +1 -1
- package/dist/core/dev/generate/types/{index.js → index.server.js} +1 -1
- package/dist/core/dev/vite/{index.js → index.server.js} +8 -4
- package/dist/core/fields/util.d.ts +13 -0
- package/dist/core/fields/util.js +77 -4
- package/dist/core/i18n/en/common.d.ts +1 -0
- package/dist/core/i18n/en/common.js +1 -0
- package/dist/core/i18n/fr/common.d.ts +1 -0
- package/dist/core/i18n/fr/common.js +1 -0
- package/dist/core/operations/hooks/before-read/populate-url.server.js +10 -2
- package/dist/core/operations/hooks/before-upsert/handle-new-version.server.js +2 -2
- package/dist/core/operations/relations/diff.server.d.ts +1 -1
- package/dist/core/operations/relations/extract.server.d.ts +1 -1
- package/dist/core/rime.server.d.ts +6 -6
- package/dist/core/rime.server.js +15 -14
- package/dist/fields/blocks/component/Block.svelte +13 -19
- package/dist/fields/blocks/component/Blocks.svelte +6 -13
- package/dist/fields/group/component/Group.svelte +6 -13
- package/dist/fields/number/component/number.css +2 -0
- package/dist/fields/relation/component/default/Default.svelte +1 -7
- package/dist/fields/relation/component/upload/upload.css +1 -10
- package/dist/fields/relation/index.d.ts +21 -6
- package/dist/fields/relation/index.js +41 -11
- package/dist/fields/rich-text/component/RichText.svelte +4 -4
- package/dist/fields/rich-text/component/bubble-menu/bubble-menu.svelte +6 -6
- package/dist/fields/rich-text/component/bubble-menu/bubble-menu.svelte.d.ts +2 -0
- package/dist/fields/rich-text/component/drag-handle/drag-handle.css +1 -0
- package/dist/fields/rich-text/component/styles/rich-text.css +0 -7
- package/dist/fields/rich-text/core/features/resource/resource.svelte +2 -9
- package/dist/fields/rich-text/core/features/upload/upload.svelte +5 -12
- package/dist/fields/rich-text/core/render-rich-text.svelte +5 -3
- package/dist/fields/rich-text/index.d.ts +1 -1
- package/dist/fields/select/component/Select.svelte +5 -11
- package/dist/fields/tabs/index.d.ts +1 -0
- package/dist/fields/tabs/index.js +3 -0
- package/dist/fields/textarea/component/TextArea.svelte +5 -13
- package/dist/fields/tree/component/TreeBlock.svelte +12 -18
- package/dist/fields/types.d.ts +3 -2
- package/dist/live.d.ts +2 -1
- package/dist/live.js +2 -1
- package/dist/panel/components/fields/Error.svelte +1 -7
- package/dist/panel/components/sections/collection/Empty.svelte +1 -0
- package/dist/panel/components/sections/collection/folder/Folder.svelte +7 -16
- package/dist/panel/components/sections/collection/folder/FolderWithActions.svelte +1 -1
- package/dist/panel/components/sections/collection/grid/CollectionGrid.svelte +22 -12
- package/dist/panel/components/sections/collection/grid/create-directory-dialog/CreateDirectoryDialog.svelte +4 -5
- package/dist/panel/components/sections/collection/grid/grid-item/GridItem.svelte +41 -33
- package/dist/panel/components/sections/collection/grid/grid-item/GridItem.svelte.d.ts +4 -0
- package/dist/panel/components/sections/collection/header/ButtonCreate.svelte +14 -16
- package/dist/panel/components/sections/collection/header/ButtonCreate.svelte.d.ts +2 -0
- package/dist/panel/components/sections/collection/header/DisplayMode.svelte +10 -10
- package/dist/panel/components/sections/collection/header/SearchInput.svelte +2 -8
- package/dist/panel/components/sections/collection/list/CollectionList.svelte +32 -3
- package/dist/panel/components/sections/collection/list/header/Header.svelte +3 -9
- package/dist/panel/components/sections/collection/list/row/Row.svelte +34 -24
- package/dist/panel/components/sections/collection/list/row/Row.svelte.d.ts +9 -0
- package/dist/panel/components/sections/collection/upload-thumb-cell/UploadThumbCell.svelte +11 -1
- package/dist/panel/components/sections/document/ButtonStatus.svelte +3 -11
- package/dist/panel/components/sections/document/Document.svelte +22 -41
- package/dist/panel/components/sections/document/Document.svelte.d.ts +0 -1
- package/dist/panel/components/sections/document/upload-header/UploadHeader.svelte +11 -21
- package/dist/panel/components/sections/live/LiveEdit.svelte +114 -0
- package/dist/panel/components/sections/live/LiveEdit.svelte.d.ts +32 -0
- package/dist/panel/components/sections/live/LiveEditPanel.svelte +53 -0
- package/dist/panel/components/sections/live/LiveEditPanel.svelte.d.ts +11 -0
- package/dist/panel/components/sections/live/LiveFloatingUI.svelte +106 -0
- package/dist/panel/components/sections/live/LiveFloatingUI.svelte.d.ts +12 -0
- package/dist/panel/components/sections/live/Provider.svelte +4 -4
- package/dist/panel/components/sections/live/Provider.svelte.d.ts +5 -3
- package/dist/panel/components/sections/live/live-edit-panel.css +12 -0
- package/dist/panel/components/ui/breadcrumb/BreadCrumb.svelte +2 -9
- package/dist/panel/components/ui/button/button.svelte +35 -54
- package/dist/panel/components/ui/calendar/calendar.css +11 -0
- package/dist/panel/components/ui/card-document/card-document.svelte +21 -14
- package/dist/panel/components/ui/card-resource/card-resource.svelte +8 -14
- package/dist/panel/components/ui/checkbox/checkbox.svelte +1 -1
- package/dist/panel/components/ui/command/command-group.css +1 -0
- package/dist/panel/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +1 -7
- package/dist/panel/components/ui/input/input.svelte +13 -23
- package/dist/panel/components/ui/label/label.css +0 -1
- package/dist/panel/components/ui/nav/NavItemButton.svelte +2 -8
- package/dist/panel/components/ui/page-header/PageHeader.svelte +6 -13
- package/dist/panel/components/ui/radio-group/radio-group.css +2 -0
- package/dist/panel/components/ui/scroll-area/scroll-area.css +0 -4
- package/dist/panel/components/ui/sheet/sheet.css +0 -16
- package/dist/panel/components/ui/tabs/tabs.css +7 -0
- package/dist/panel/context/collection.svelte.d.ts +0 -4
- package/dist/panel/context/collection.svelte.js +0 -3
- package/dist/panel/context/documentForm.svelte.js +1 -0
- package/dist/panel/context/live.svelte.d.ts +8 -20
- package/dist/panel/context/live.svelte.js +65 -35
- package/dist/panel/context/livePanel.svelte.d.ts +11 -0
- package/dist/panel/context/livePanel.svelte.js +8 -0
- package/dist/panel/pages/auth/forgot-password/ForgotPassword.svelte +1 -7
- package/dist/panel/pages/collection/Collection.svelte +3 -1
- package/dist/panel/pages/dashboard/Dashboard.svelte +52 -28
- package/dist/panel/pages/dashboard/DashboardCollection.svelte +91 -0
- package/dist/panel/pages/dashboard/DashboardCollection.svelte.d.ts +9 -0
- package/dist/panel/pages/dashboard/load.server.js +30 -14
- package/dist/panel/pages/dashboard/types.d.ts +1 -0
- package/dist/panel/pages/live/Live.svelte +244 -67
- package/dist/panel/pages/live/Live.svelte.d.ts +9 -1
- package/dist/panel/pages/live/load.server.js +14 -1
- package/dist/panel/style/index.css +562 -8
- package/dist/panel/style/mixins/index.css +1 -3
- package/dist/panel/util/upload.d.ts +1 -1
- package/dist/util/object.js +3 -0
- package/package.json +12 -10
- package/dist/panel/components/sections/document/FloatingUI.svelte +0 -81
- package/dist/panel/components/sections/document/FloatingUI.svelte.d.ts +0 -8
- package/dist/panel/components/sections/live/SidePanel.svelte +0 -61
- package/dist/panel/components/sections/live/SidePanel.svelte.d.ts +0 -14
- package/dist/panel/components/sections/live/side-panel.css +0 -15
- /package/dist/adapter-sqlite/{area.d.ts → area.server.d.ts} +0 -0
- /package/dist/adapter-sqlite/{collection.d.ts → collection.server.d.ts} +0 -0
- /package/dist/adapter-sqlite/{orderBy.d.ts → orderBy.server.d.ts} +0 -0
- /package/dist/adapter-sqlite/{transform.d.ts → transform.server.d.ts} +0 -0
- /package/dist/adapter-sqlite/{types.d.ts → types.server.d.ts} +0 -0
- /package/dist/adapter-sqlite/{types.js → types.server.js} +0 -0
- /package/dist/adapter-sqlite/{util.d.ts → util.server.d.ts} +0 -0
- /package/dist/adapter-sqlite/{util.js → util.server.js} +0 -0
- /package/dist/adapter-sqlite/{where.d.ts → where.server.d.ts} +0 -0
- /package/dist/adapter-sqlite/{where.js → where.server.js} +0 -0
- /package/dist/adapter-sqlite/{with.d.ts → with.server.d.ts} +0 -0
- /package/dist/adapter-sqlite/{with.js → with.server.js} +0 -0
- /package/dist/core/collections/upload/util/{converter.d.ts → converter.server.d.ts} +0 -0
- /package/dist/core/collections/upload/util/{converter.js → converter.server.js} +0 -0
- /package/dist/core/config/auth/{better-auth-hooks.d.ts → better-auth-hooks.server.d.ts} +0 -0
- /package/dist/core/config/auth/{better-auth-hooks.js → better-auth-hooks.server.js} +0 -0
- /package/dist/core/config/server/{augment-cors.d.ts → augment-cors.server.d.ts} +0 -0
- /package/dist/core/config/server/{augment-cors.js → augment-cors.server.js} +0 -0
- /package/dist/core/config/server/{validate.d.ts → validate.server.d.ts} +0 -0
- /package/dist/core/config/server/{write.d.ts → write.server.d.ts} +0 -0
- /package/dist/core/dev/cache/{index.d.ts → index.server.d.ts} +0 -0
- /package/dist/core/dev/cache/{index.js → index.server.js} +0 -0
- /package/dist/core/dev/cli/clear/{index.d.ts → index.server.d.ts} +0 -0
- /package/dist/core/dev/cli/clear/{index.js → index.server.js} +0 -0
- /package/dist/core/dev/cli/generate/{index.d.ts → index.server.d.ts} +0 -0
- /package/dist/core/dev/cli/init/{getPackageName.d.ts → get-package-info.server.d.ts} +0 -0
- /package/dist/core/dev/cli/init/{getPackageName.js → get-package-info.server.js} +0 -0
- /package/dist/core/dev/cli/init/{index.d.ts → index.server.d.ts} +0 -0
- /package/dist/core/dev/cli/init/{packageManagerUtil.d.ts → package-manager-util.server.d.ts} +0 -0
- /package/dist/core/dev/generate/routes/{custom-css.d.ts → custom-css.server.d.ts} +0 -0
- /package/dist/core/dev/generate/routes/{custom-css.js → custom-css.server.js} +0 -0
- /package/dist/core/dev/generate/routes/{index.d.ts → index.server.d.ts} +0 -0
- /package/dist/core/dev/generate/routes/{util.d.ts → util.server.d.ts} +0 -0
- /package/dist/core/dev/generate/sanitize/{index.d.ts → index.server.d.ts} +0 -0
- /package/dist/core/dev/generate/sanitize/{index.js → index.server.js} +0 -0
- /package/dist/core/dev/generate/types/{index.d.ts → index.server.d.ts} +0 -0
- /package/dist/core/dev/vite/{index.d.ts → index.server.d.ts} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import type { BuiltCollection } from '../../../../../../core/config/types.js';
|
|
2
3
|
import type { GenericDoc } from '../../../../../../core/types/doc.js';
|
|
3
4
|
import Checkbox from '../../../../ui/checkbox/checkbox.svelte';
|
|
4
|
-
import { getCollectionContext } from '../../../../../context/collection.svelte.js';
|
|
5
5
|
import { getLocaleContext } from '../../../../../context/locale.svelte';
|
|
6
6
|
import { getValueAtPath } from '../../../../../../util/object';
|
|
7
7
|
import StatusDot from '../../StatusDot.svelte';
|
|
@@ -10,57 +10,72 @@
|
|
|
10
10
|
type Props = {
|
|
11
11
|
checked: boolean;
|
|
12
12
|
doc: GenericDoc;
|
|
13
|
+
isSelectMode?: boolean;
|
|
14
|
+
config: BuiltCollection;
|
|
15
|
+
toggleSelectOf?: (id: string) => void;
|
|
16
|
+
columns?: Array<{ path: string; cell?: any }>;
|
|
17
|
+
draggable?: 'true';
|
|
13
18
|
};
|
|
14
19
|
|
|
15
|
-
const { checked, doc }: Props =
|
|
20
|
+
const { checked, doc, config, isSelectMode, toggleSelectOf, columns, draggable }: Props =
|
|
21
|
+
$props();
|
|
16
22
|
|
|
17
|
-
const collection = getCollectionContext('list');
|
|
18
23
|
const locale = getLocaleContext();
|
|
19
24
|
|
|
20
25
|
let gridTemplateColumn = $state('grid-template-columns: 2fr repeat(1, minmax(0, 1fr));');
|
|
21
26
|
|
|
22
27
|
$effect(() => {
|
|
23
|
-
const columnLength =
|
|
28
|
+
const columnLength = (columns?.length ?? 0) + 2;
|
|
24
29
|
gridTemplateColumn = `grid-template-columns: 2fr repeat(${columnLength - 1}, minmax(0, 1fr));`;
|
|
25
30
|
});
|
|
26
31
|
|
|
27
32
|
const formattedDate = $derived(
|
|
28
33
|
doc.updatedAt ? locale.dateFormat(doc.updatedAt, { short: true }) : ''
|
|
29
34
|
);
|
|
35
|
+
|
|
36
|
+
function handleDragStart(e: DragEvent) {
|
|
37
|
+
e.dataTransfer?.setData('text/plain', doc.id);
|
|
38
|
+
}
|
|
30
39
|
</script>
|
|
31
40
|
|
|
32
|
-
|
|
41
|
+
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
|
42
|
+
<div
|
|
43
|
+
style={gridTemplateColumn}
|
|
44
|
+
class="rz-list-row"
|
|
45
|
+
draggable={draggable || null}
|
|
46
|
+
ondragstart={draggable ? handleDragStart : null}
|
|
47
|
+
>
|
|
33
48
|
<div class="rz-list-row__main">
|
|
34
|
-
{#if
|
|
49
|
+
{#if isSelectMode}
|
|
35
50
|
<!-- On select mode show the checkbox -->
|
|
36
51
|
<Checkbox
|
|
37
52
|
id="checkbox-{doc.id}"
|
|
38
53
|
class="rz-list-row__checkbox"
|
|
39
54
|
{checked}
|
|
40
|
-
onCheckedChange={() =>
|
|
55
|
+
onCheckedChange={() => toggleSelectOf?.(doc.id)}
|
|
41
56
|
/>
|
|
42
57
|
{#if doc._thumbnail}
|
|
43
58
|
<UploadThumbCell url={doc._thumbnail} mimeType={doc.mimeType} />
|
|
44
59
|
{/if}
|
|
45
60
|
<label for="checkbox-{doc.id}" class="rz-list-row__title">{doc.title || '[untitled]'}</label>
|
|
46
61
|
{:else}
|
|
47
|
-
<a class="rz-list-row__link" href="/panel/{
|
|
62
|
+
<a class="rz-list-row__link" href="/panel/{config.kebab}/{doc.id}">
|
|
48
63
|
{#if doc._thumbnail}
|
|
49
64
|
<UploadThumbCell url={doc._thumbnail} mimeType={doc.mimeType} />
|
|
50
65
|
{:else}
|
|
51
|
-
{@const Icon =
|
|
66
|
+
{@const Icon = config.icon}
|
|
52
67
|
<div class="rz-list-row__icon"><Icon size="13" /></div>
|
|
53
68
|
{/if}
|
|
54
69
|
|
|
55
70
|
<span class="rz-list-row__title">{doc.title || '[untitled]'}</span>
|
|
56
|
-
{#if
|
|
71
|
+
{#if config.versions && config.versions.draft}
|
|
57
72
|
<StatusDot --rz-dot-size="0.28rem" status={doc.status} />
|
|
58
73
|
{/if}
|
|
59
74
|
</a>
|
|
60
75
|
{/if}
|
|
61
76
|
</div>
|
|
62
77
|
|
|
63
|
-
{#each
|
|
78
|
+
{#each columns as column, index (index)}
|
|
64
79
|
<div class="rz-list-row__cell">
|
|
65
80
|
{#if column.cell}
|
|
66
81
|
{@const ColumnTableCell = column.cell}
|
|
@@ -76,13 +91,7 @@
|
|
|
76
91
|
</div>
|
|
77
92
|
</div>
|
|
78
93
|
|
|
79
|
-
<style
|
|
80
|
-
|
|
81
|
-
/* Font */
|
|
82
|
-
|
|
83
|
-
/**************************************/
|
|
84
|
-
|
|
85
|
-
.rz-list-row {
|
|
94
|
+
<style>.rz-list-row {
|
|
86
95
|
--rz-upload-preview-cell-fit: cover;
|
|
87
96
|
|
|
88
97
|
display: grid;
|
|
@@ -107,11 +116,13 @@
|
|
|
107
116
|
:global {
|
|
108
117
|
.rz-list-row__checkbox {
|
|
109
118
|
margin-left: var(--rz-size-2);
|
|
119
|
+
background-color: light-dark(hsl(var(--rz-gray-16)), hsl(var(--rz-gray-0)));
|
|
120
|
+
border: var(--rz-border);
|
|
110
121
|
}
|
|
111
122
|
}
|
|
112
123
|
}
|
|
113
124
|
|
|
114
|
-
.rz-list-row__main {
|
|
125
|
+
.rz-list-row__main {
|
|
115
126
|
display: flex;
|
|
116
127
|
align-items: center;
|
|
117
128
|
gap: var(--rz-size-3);
|
|
@@ -119,25 +130,24 @@
|
|
|
119
130
|
padding-right: var(--rz-size-5);
|
|
120
131
|
}
|
|
121
132
|
|
|
122
|
-
.rz-list-row__link {
|
|
133
|
+
.rz-list-row__link {
|
|
123
134
|
display: flex;
|
|
124
135
|
align-items: center;
|
|
125
136
|
gap: var(--rz-size-4);
|
|
126
137
|
}
|
|
127
138
|
|
|
128
|
-
.rz-list-row__title {
|
|
139
|
+
.rz-list-row__title {
|
|
129
140
|
display: -webkit-box;
|
|
130
141
|
-webkit-line-clamp: 1;
|
|
131
142
|
-webkit-box-orient: vertical;
|
|
132
143
|
overflow: hidden;
|
|
133
144
|
word-break: break-all;
|
|
134
145
|
}
|
|
135
|
-
|
|
136
|
-
label.rz-list-row__title {
|
|
146
|
+
label.rz-list-row__title {
|
|
137
147
|
cursor: pointer;
|
|
138
148
|
}
|
|
139
149
|
|
|
140
|
-
.rz-list-row__cell {
|
|
150
|
+
.rz-list-row__cell {
|
|
141
151
|
color: hsl(var(--rz-foreground) / 0.6);
|
|
142
152
|
}
|
|
143
153
|
</style>
|
|
@@ -1,7 +1,16 @@
|
|
|
1
|
+
import type { BuiltCollection } from '../../../../../../core/config/types.js';
|
|
1
2
|
import type { GenericDoc } from '../../../../../../core/types/doc.js';
|
|
2
3
|
type Props = {
|
|
3
4
|
checked: boolean;
|
|
4
5
|
doc: GenericDoc;
|
|
6
|
+
isSelectMode?: boolean;
|
|
7
|
+
config: BuiltCollection;
|
|
8
|
+
toggleSelectOf?: (id: string) => void;
|
|
9
|
+
columns?: Array<{
|
|
10
|
+
path: string;
|
|
11
|
+
cell?: any;
|
|
12
|
+
}>;
|
|
13
|
+
draggable?: 'true';
|
|
5
14
|
};
|
|
6
15
|
declare const Row: import("svelte").Component<Props, {}, "">;
|
|
7
16
|
type Row = ReturnType<typeof Row>;
|
|
@@ -15,9 +15,15 @@
|
|
|
15
15
|
if (url) return getMimeTypeFromExtension(url.split('.').pop() || '') || '';
|
|
16
16
|
return '';
|
|
17
17
|
});
|
|
18
|
+
|
|
19
|
+
const mimeClass = $derived.by(() => {
|
|
20
|
+
if (!mimeTypeResolved) return '';
|
|
21
|
+
const [type, subType] = mimeTypeResolved.split('/');
|
|
22
|
+
return `rz-upload-preview-cell--${type}-${subType}`;
|
|
23
|
+
});
|
|
18
24
|
</script>
|
|
19
25
|
|
|
20
|
-
<div class="rz-upload-preview-cell {className}">
|
|
26
|
+
<div class="rz-upload-preview-cell {mimeClass} {className}">
|
|
21
27
|
<div>
|
|
22
28
|
{#if url && mimeTypeResolved.includes('image')}
|
|
23
29
|
<img class="rz-upload-preview-cell__image" src={url} alt="preview" />
|
|
@@ -62,6 +68,10 @@
|
|
|
62
68
|
}
|
|
63
69
|
}
|
|
64
70
|
|
|
71
|
+
.rz-upload-preview-cell--image-jpeg {
|
|
72
|
+
--rz-upload-preview-cell-fit: cover;
|
|
73
|
+
}
|
|
74
|
+
|
|
65
75
|
.rz-upload-preview-cell__image {
|
|
66
76
|
height: 100%;
|
|
67
77
|
width: 100%;
|
|
@@ -75,26 +75,18 @@
|
|
|
75
75
|
</Dialog.Content>
|
|
76
76
|
</Dialog.Root>
|
|
77
77
|
|
|
78
|
-
<style
|
|
79
|
-
|
|
80
|
-
/* Font */
|
|
81
|
-
|
|
82
|
-
/**************************************/
|
|
83
|
-
|
|
84
|
-
.rz-radio__option {
|
|
78
|
+
<style>.rz-radio__option {
|
|
85
79
|
display: flex;
|
|
86
80
|
gap: var(--rz-size-3);
|
|
87
81
|
padding: var(--rz-size-3);
|
|
88
82
|
border: var(--rz-border);
|
|
89
83
|
}
|
|
90
|
-
|
|
91
|
-
:global {
|
|
84
|
+
:global {
|
|
92
85
|
.rz-dialog-footer button {
|
|
93
86
|
flex: 1;
|
|
94
87
|
}
|
|
95
88
|
}
|
|
96
|
-
|
|
97
|
-
p {
|
|
89
|
+
p {
|
|
98
90
|
font-variation-settings: 'wght' 400;
|
|
99
91
|
font-weight: 400;
|
|
100
92
|
}
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
import AuthApiKeyDialog from './AuthAPIKeyDialog.svelte';
|
|
18
18
|
import AuthFooter from './AuthFooter.svelte';
|
|
19
19
|
import CurrentlyEdited from './CurrentlyEdited.svelte';
|
|
20
|
-
import FloatingUI from './FloatingUI.svelte';
|
|
21
20
|
import Header from './Header.svelte';
|
|
22
21
|
import UploadHeader from './upload-header/UploadHeader.svelte';
|
|
23
22
|
|
|
@@ -25,7 +24,6 @@
|
|
|
25
24
|
doc: GenericDoc;
|
|
26
25
|
operation: 'update' | 'create';
|
|
27
26
|
class?: string;
|
|
28
|
-
onDataChange?: any;
|
|
29
27
|
onFieldFocus?: any;
|
|
30
28
|
readOnly: boolean;
|
|
31
29
|
onClose?: any;
|
|
@@ -40,7 +38,6 @@
|
|
|
40
38
|
onClose,
|
|
41
39
|
onNestedDocumentCreated,
|
|
42
40
|
nestedLevel = 0,
|
|
43
|
-
onDataChange = null,
|
|
44
41
|
onFieldFocus = null,
|
|
45
42
|
class: className
|
|
46
43
|
}: Props = $props();
|
|
@@ -64,7 +61,7 @@
|
|
|
64
61
|
// Dialog for unsaved changes confirmation
|
|
65
62
|
const isConfirmLeaveOpen = $derived(!!interceptedLeave);
|
|
66
63
|
const locale = getLocaleContext();
|
|
67
|
-
|
|
64
|
+
|
|
68
65
|
// This is used to show the API key after creating a document in a collection with API key auth
|
|
69
66
|
let apiKey = $state<string | null>('');
|
|
70
67
|
|
|
@@ -85,7 +82,6 @@
|
|
|
85
82
|
config,
|
|
86
83
|
readOnly,
|
|
87
84
|
onNestedDocumentCreated,
|
|
88
|
-
onDataChange,
|
|
89
85
|
onFieldFocus,
|
|
90
86
|
key: `${initial._type}_${nestedLevel}`,
|
|
91
87
|
beforeRedirect: beforeRedirect
|
|
@@ -142,9 +138,7 @@
|
|
|
142
138
|
enctype="multipart/form-data"
|
|
143
139
|
method="post"
|
|
144
140
|
>
|
|
145
|
-
{
|
|
146
|
-
<Header {form} {config} {onClose}></Header>
|
|
147
|
-
{/if}
|
|
141
|
+
<Header {form} {config} {onClose}></Header>
|
|
148
142
|
|
|
149
143
|
{#if form.values.editedBy && form.values.editedBy !== user.attributes.id}
|
|
150
144
|
<CurrentlyEdited by={form.values.editedBy} doc={form.values} user={user.attributes} />
|
|
@@ -161,27 +155,23 @@
|
|
|
161
155
|
{/if}
|
|
162
156
|
</div>
|
|
163
157
|
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
{
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
{
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
{
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
{
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
</div>
|
|
179
|
-
{:else}
|
|
180
|
-
<FloatingUI {form} {onClose} />
|
|
181
|
-
{/if}
|
|
158
|
+
<div class="rz-document__infos">
|
|
159
|
+
{#if form.values.createdAt}
|
|
160
|
+
{@render meta(t__('common.created_at'), locale.dateFormat(form.values.createdAt))}
|
|
161
|
+
{/if}
|
|
162
|
+
{#if form.values.updatedAt}
|
|
163
|
+
{@render meta(t__('common.last_update'), locale.dateFormat(form.values.updatedAt))}
|
|
164
|
+
{/if}
|
|
165
|
+
{#if form.values.editedBy}
|
|
166
|
+
{@render meta(t__('common.edited_by'), locale.dateFormat(form.values.editedBy))}
|
|
167
|
+
{/if}
|
|
168
|
+
{#if form.values.id}
|
|
169
|
+
{@render meta('id', form.values.id)}
|
|
170
|
+
{/if}
|
|
171
|
+
</div>
|
|
182
172
|
|
|
183
173
|
<!-- This shows the create API Key after creation, for apiKey auth type collection -->
|
|
184
|
-
{#if
|
|
174
|
+
{#if apiKey}
|
|
185
175
|
<AuthApiKeyDialog bind:apiKey />
|
|
186
176
|
{/if}
|
|
187
177
|
|
|
@@ -211,13 +201,7 @@
|
|
|
211
201
|
</Dialog.Root>
|
|
212
202
|
</form>
|
|
213
203
|
|
|
214
|
-
<style
|
|
215
|
-
|
|
216
|
-
/* Font */
|
|
217
|
-
|
|
218
|
-
/**************************************/
|
|
219
|
-
|
|
220
|
-
.rz-document {
|
|
204
|
+
<style>.rz-document {
|
|
221
205
|
container: rz-document / inline-size;
|
|
222
206
|
min-height: 100vh;
|
|
223
207
|
position: relative;
|
|
@@ -225,7 +209,7 @@
|
|
|
225
209
|
background-size: cover;
|
|
226
210
|
}
|
|
227
211
|
|
|
228
|
-
.rz-document__fields {
|
|
212
|
+
.rz-document__fields {
|
|
229
213
|
display: grid;
|
|
230
214
|
gap: var(--rz-size-4);
|
|
231
215
|
min-height: calc(100vh - var(--rz-size-14));
|
|
@@ -235,18 +219,15 @@
|
|
|
235
219
|
padding: var(--rz-size-5) var(--rz-page-gutter);
|
|
236
220
|
padding-bottom: var(--rz-size-24);
|
|
237
221
|
}
|
|
238
|
-
|
|
239
|
-
.rz-document__infos {
|
|
222
|
+
.rz-document__infos {
|
|
240
223
|
border-top: var(--rz-border);
|
|
241
224
|
padding-inline: var(--rz-page-gutter);
|
|
242
225
|
padding-block: var(--rz-size-6);
|
|
243
226
|
}
|
|
244
|
-
|
|
245
|
-
.rz-document__metas {
|
|
227
|
+
.rz-document__metas {
|
|
246
228
|
font-size: var(--rz-text-xs);
|
|
247
229
|
}
|
|
248
|
-
|
|
249
|
-
.rz-document__metas span {
|
|
230
|
+
.rz-document__metas span {
|
|
250
231
|
font-variation-settings: 'wght' 600;
|
|
251
232
|
font-weight: 600;
|
|
252
233
|
}
|
|
@@ -100,25 +100,19 @@
|
|
|
100
100
|
{/if}
|
|
101
101
|
</div>
|
|
102
102
|
|
|
103
|
-
<style
|
|
104
|
-
|
|
105
|
-
/* Font */
|
|
106
|
-
|
|
107
|
-
/**************************************/
|
|
108
|
-
|
|
109
|
-
.rz-doc-upload-header {
|
|
103
|
+
<style>.rz-doc-upload-header {
|
|
110
104
|
container: inline-size;
|
|
111
105
|
padding: 0 var(--rz-fields-padding);
|
|
112
106
|
}
|
|
113
107
|
|
|
114
|
-
.rz-doc-upload-header__file {
|
|
108
|
+
.rz-doc-upload-header__file {
|
|
115
109
|
min-height: 250px;
|
|
116
110
|
border: var(--rz-border);
|
|
117
111
|
overflow: hidden;
|
|
118
112
|
border-radius: var(--radius-md);
|
|
119
113
|
}
|
|
120
114
|
|
|
121
|
-
.rz-doc-upload-header__preview {
|
|
115
|
+
.rz-doc-upload-header__preview {
|
|
122
116
|
width: 100%;
|
|
123
117
|
display: flex;
|
|
124
118
|
align-items: center;
|
|
@@ -131,7 +125,7 @@
|
|
|
131
125
|
border-top-left-radius: var(--rz-radius-md);
|
|
132
126
|
}
|
|
133
127
|
|
|
134
|
-
@container (min-width:28rem) {
|
|
128
|
+
@container (min-width:28rem) {
|
|
135
129
|
.rz-doc-upload-header__file {
|
|
136
130
|
display: flex;
|
|
137
131
|
}
|
|
@@ -146,7 +140,7 @@
|
|
|
146
140
|
}
|
|
147
141
|
}
|
|
148
142
|
|
|
149
|
-
.rz-doc-upload-header__prewiew-grid {
|
|
143
|
+
.rz-doc-upload-header__prewiew-grid {
|
|
150
144
|
width: 100%;
|
|
151
145
|
height: 100%;
|
|
152
146
|
--dark: hsl(var(--rz-gray-11) / 1);
|
|
@@ -194,37 +188,33 @@
|
|
|
194
188
|
0 var(--half-size);
|
|
195
189
|
}
|
|
196
190
|
|
|
197
|
-
.rz-doc-upload-header__prewiew-grid img {
|
|
191
|
+
.rz-doc-upload-header__prewiew-grid img {
|
|
198
192
|
height: 100%;
|
|
199
193
|
width: 100%;
|
|
200
194
|
-o-object-fit: contain;
|
|
201
195
|
object-fit: contain;
|
|
202
196
|
}
|
|
203
197
|
|
|
204
|
-
.rz-doc-upload-header__info {
|
|
198
|
+
.rz-doc-upload-header__info {
|
|
205
199
|
flex: 1;
|
|
206
200
|
font-size: var(--rz-text-sm);
|
|
207
201
|
padding-inline: var(--rz-size-4);
|
|
208
202
|
padding-block: var(--rz-size-4);
|
|
209
203
|
}
|
|
210
|
-
|
|
211
|
-
.rz-doc-upload-header__info h4 {
|
|
204
|
+
.rz-doc-upload-header__info h4 {
|
|
212
205
|
opacity: 0.4;
|
|
213
206
|
margin-bottom: var(--rz-size-1);
|
|
214
207
|
font-size: var(--rz-text-xs);
|
|
215
208
|
}
|
|
216
|
-
|
|
217
|
-
.rz-doc-upload-header__info a {
|
|
209
|
+
.rz-doc-upload-header__info a {
|
|
218
210
|
margin-bottom: var(--rz-size-3);
|
|
219
211
|
display: block;
|
|
220
212
|
text-decoration: underline;
|
|
221
213
|
}
|
|
222
|
-
|
|
223
|
-
.rz-doc-upload-header__info p {
|
|
214
|
+
.rz-doc-upload-header__info p {
|
|
224
215
|
margin-bottom: var(--rz-size-3);
|
|
225
216
|
}
|
|
226
|
-
|
|
227
|
-
.rz-doc-upload-header__prewiew-file {
|
|
217
|
+
.rz-doc-upload-header__prewiew-file {
|
|
228
218
|
display: flex;
|
|
229
219
|
flex-direction: column;
|
|
230
220
|
align-items: center;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
<script lang="ts" generics="T">
|
|
2
|
+
import { browser } from '$app/environment';
|
|
3
|
+
import { page } from '$app/state';
|
|
4
|
+
import { getLiveContext } from '../../../context/live.svelte.js';
|
|
5
|
+
import { normalizeFieldPath } from '../../../../util/doc.js';
|
|
6
|
+
import { onDestroy, type Snippet } from 'svelte';
|
|
7
|
+
|
|
8
|
+
type Props = {
|
|
9
|
+
/** Initial value */
|
|
10
|
+
data?: T;
|
|
11
|
+
/** Full path to the field being edited from the root of the document, e.g. `attributes.title` or `layout.sections.2:paragraph.text` */
|
|
12
|
+
path?: string;
|
|
13
|
+
/** Update URI of the API ex: `/pages/123` */
|
|
14
|
+
update?: string;
|
|
15
|
+
child: Snippet<[value: T, props: PanelProps]>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
type PanelProps = {
|
|
19
|
+
onclick?: null | ((e: MouseEvent) => void);
|
|
20
|
+
role?: 'button' | null;
|
|
21
|
+
tabindex?: 0 | null;
|
|
22
|
+
'data-live-panel-trigger'?: '' | null;
|
|
23
|
+
'data-is-active'?: '' | null;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const { data: incomingData, path = '', update: incomingUpdate, child }: Props = $props();
|
|
27
|
+
|
|
28
|
+
const data = $derived(incomingData ?? page.data.doc);
|
|
29
|
+
const live = getLiveContext();
|
|
30
|
+
|
|
31
|
+
// Fallback to doc api url if prop not present
|
|
32
|
+
const update = $derived(incomingUpdate ? incomingUpdate : live.documentUpdateURI);
|
|
33
|
+
|
|
34
|
+
$effect(() => {
|
|
35
|
+
if (path === '') {
|
|
36
|
+
window.top?.postMessage({
|
|
37
|
+
activatePanel: { key, path, update, fieldPath: path }
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Unique key for this panel instance — discriminates panels with same update but different path
|
|
43
|
+
const key = $derived(`${path}-${update}`);
|
|
44
|
+
|
|
45
|
+
// Strip :blockType suffix from path segments for store lookup
|
|
46
|
+
// e.g. 'layout.sections.2:paragraph' → reads liveStore at 'layout.sections.2'
|
|
47
|
+
const lookupPath = $derived(normalizeFieldPath(path));
|
|
48
|
+
|
|
49
|
+
// Read from live store, fall back to data prop
|
|
50
|
+
const liveValue = $derived(live?.getPanelValue(update, lookupPath));
|
|
51
|
+
const value = $derived(liveValue ?? data);
|
|
52
|
+
const isActive = $derived(live?.activePanelKey === key);
|
|
53
|
+
|
|
54
|
+
function onKeyDown(e: KeyboardEvent) {
|
|
55
|
+
if (e.key === 'Escape') {
|
|
56
|
+
window.top?.postMessage({
|
|
57
|
+
deactivatePanel: { key }
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function activate() {
|
|
63
|
+
if (!live?.enabled) return;
|
|
64
|
+
window.top?.postMessage({
|
|
65
|
+
activatePanel: { key, path, update, fieldPath: path }
|
|
66
|
+
});
|
|
67
|
+
window.addEventListener('keydown', onKeyDown);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
onDestroy(() => {
|
|
71
|
+
if (browser) window.removeEventListener('keydown', onKeyDown);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
function makeChildProps(): PanelProps {
|
|
75
|
+
if (!page.data.user || !live?.enabled) return {};
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
onclick: !isActive
|
|
79
|
+
? (e: MouseEvent) => {
|
|
80
|
+
e.stopPropagation();
|
|
81
|
+
e.preventDefault();
|
|
82
|
+
activate();
|
|
83
|
+
}
|
|
84
|
+
: null,
|
|
85
|
+
role: isActive ? null : 'button',
|
|
86
|
+
tabindex: isActive ? null : 0,
|
|
87
|
+
'data-live-panel-trigger': '',
|
|
88
|
+
'data-is-active': isActive ? '' : null
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
</script>
|
|
92
|
+
|
|
93
|
+
{@render child(value, makeChildProps())}
|
|
94
|
+
|
|
95
|
+
<style>
|
|
96
|
+
:root {
|
|
97
|
+
--rz-color-live-panel-spot: hsl(240deg 89% 60%);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
:global([data-live-panel-trigger]) {
|
|
101
|
+
outline: none;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
:global([data-live-panel-trigger]:not([data-is-active]):hover) {
|
|
105
|
+
outline: 1px dashed hsl(from var(--rz-color-live-panel-spot) h s l / 0.6);
|
|
106
|
+
outline-offset: 5px;
|
|
107
|
+
cursor: pointer;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
:global([data-live-panel-trigger][data-is-active]) {
|
|
111
|
+
outline-offset: 5px;
|
|
112
|
+
outline: 2px solid var(--rz-color-live-panel-spot);
|
|
113
|
+
}
|
|
114
|
+
</style>
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type Snippet } from 'svelte';
|
|
2
|
+
declare class __sveltets_Render<T> {
|
|
3
|
+
props(): {
|
|
4
|
+
/** Initial value */
|
|
5
|
+
data?: T | undefined;
|
|
6
|
+
/** Full path to the field being edited from the root of the document, e.g. `attributes.title` or `layout.sections.2:paragraph.text` */
|
|
7
|
+
path?: string;
|
|
8
|
+
/** Update URI of the API ex: `/pages/123` */
|
|
9
|
+
update?: string;
|
|
10
|
+
child: Snippet<[value: T, props: {
|
|
11
|
+
onclick?: ((e: MouseEvent) => void) | null | undefined;
|
|
12
|
+
role?: "button" | null;
|
|
13
|
+
tabindex?: 0 | null;
|
|
14
|
+
'data-live-panel-trigger'?: "" | null;
|
|
15
|
+
'data-is-active'?: "" | null;
|
|
16
|
+
}]>;
|
|
17
|
+
};
|
|
18
|
+
events(): {};
|
|
19
|
+
slots(): {};
|
|
20
|
+
bindings(): "";
|
|
21
|
+
exports(): {};
|
|
22
|
+
}
|
|
23
|
+
interface $$IsomorphicComponent {
|
|
24
|
+
new <T>(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']>> & {
|
|
25
|
+
$$bindings?: ReturnType<__sveltets_Render<T>['bindings']>;
|
|
26
|
+
} & ReturnType<__sveltets_Render<T>['exports']>;
|
|
27
|
+
<T>(internal: unknown, props: ReturnType<__sveltets_Render<T>['props']> & {}): ReturnType<__sveltets_Render<T>['exports']>;
|
|
28
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
29
|
+
}
|
|
30
|
+
declare const LiveEdit: $$IsomorphicComponent;
|
|
31
|
+
type LiveEdit<T> = InstanceType<typeof LiveEdit<T>>;
|
|
32
|
+
export default LiveEdit;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { getFieldBuildersAtPath } from '../../../../core/fields/util.js';
|
|
3
|
+
import RenderFields from '../../fields/RenderFields.svelte';
|
|
4
|
+
import { getConfigContext } from '../../../context/config.svelte.js';
|
|
5
|
+
import { setDocumentFormContext } from '../../../context/documentForm.svelte.js';
|
|
6
|
+
import { getLivePanelContext } from '../../../context/livePanel.svelte.js';
|
|
7
|
+
import type { GenericDoc } from '../../../../types';
|
|
8
|
+
import { onMount } from 'svelte';
|
|
9
|
+
import ScrollArea from '../../ui/scroll-area/scroll-area.svelte';
|
|
10
|
+
import './live-edit-panel.css';
|
|
11
|
+
|
|
12
|
+
type Props = {
|
|
13
|
+
doc: GenericDoc;
|
|
14
|
+
onDataChange: any;
|
|
15
|
+
afterSuccess: (savedDoc: any) => void;
|
|
16
|
+
onFormReady: (form: any) => void;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const { doc, onDataChange, afterSuccess, onFormReady }: Props = $props();
|
|
20
|
+
|
|
21
|
+
// fieldPath comes from the centralized panel context — reactive when user navigates the stack
|
|
22
|
+
const livePanelCtx = getLivePanelContext();
|
|
23
|
+
const fieldPath = $derived(livePanelCtx.activePanel?.fieldPath ?? '');
|
|
24
|
+
|
|
25
|
+
const { getDocumentConfig } = getConfigContext();
|
|
26
|
+
// svelte-ignore state_referenced_locally
|
|
27
|
+
const docConfig = getDocumentConfig({ prototype: doc._prototype, slug: doc._type });
|
|
28
|
+
|
|
29
|
+
// Form context is created once and kept alive — switching fieldPath only changes what's rendered
|
|
30
|
+
// svelte-ignore state_referenced_locally
|
|
31
|
+
const form = setDocumentFormContext({
|
|
32
|
+
initial: doc,
|
|
33
|
+
config: docConfig,
|
|
34
|
+
readOnly: false,
|
|
35
|
+
onDataChange,
|
|
36
|
+
afterSuccess,
|
|
37
|
+
key: `${doc._type}_0`
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
// Register form with parent after mount so parent can drive save/revert
|
|
41
|
+
onMount(() => onFormReady(form));
|
|
42
|
+
|
|
43
|
+
// Reactive: re-derives when fieldPath changes (no remount needed)
|
|
44
|
+
const { fields, path } = $derived(getFieldBuildersAtPath(fieldPath, docConfig.fields));
|
|
45
|
+
</script>
|
|
46
|
+
|
|
47
|
+
<form class="rz-live-edit-panel" use:form.enhance enctype="multipart/form-data" method="post">
|
|
48
|
+
<ScrollArea class="rz-live-edit-panel__fields">
|
|
49
|
+
{#key doc.id + (doc.versionId || '') + (doc.locale || '')}
|
|
50
|
+
<RenderFields {fields} {path} {form} />
|
|
51
|
+
{/key}
|
|
52
|
+
</ScrollArea>
|
|
53
|
+
</form>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GenericDoc } from '../../../../types';
|
|
2
|
+
import './live-edit-panel.css';
|
|
3
|
+
type Props = {
|
|
4
|
+
doc: GenericDoc;
|
|
5
|
+
onDataChange: any;
|
|
6
|
+
afterSuccess: (savedDoc: any) => void;
|
|
7
|
+
onFormReady: (form: any) => void;
|
|
8
|
+
};
|
|
9
|
+
declare const LiveEditPanel: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type LiveEditPanel = ReturnType<typeof LiveEditPanel>;
|
|
11
|
+
export default LiveEditPanel;
|