includio-cms 0.1.3 → 0.5.0
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 +76 -0
- package/ROADMAP.md +23 -13
- package/dist/admin/api/accept-invite.js +1 -5
- package/dist/admin/api/invite.js +7 -16
- package/dist/admin/client/account/account-page.svelte +20 -50
- package/dist/admin/client/account/lang.d.ts +15 -23
- package/dist/admin/client/account/lang.js +51 -67
- package/dist/admin/client/account/preferences-section.svelte +26 -84
- package/dist/admin/client/account/profile-section.svelte +60 -40
- package/dist/admin/client/account/schema.d.ts +11 -3
- package/dist/admin/client/account/schema.js +25 -16
- package/dist/admin/client/account/security-section.svelte +139 -105
- package/dist/admin/client/account/sessions-section.svelte +35 -34
- package/dist/admin/client/admin/admin-after-login-layout-content.svelte +3 -5
- package/dist/admin/client/admin/admin-layout.svelte +3 -2
- package/dist/admin/client/admin/admin-preloader.svelte +36 -0
- package/dist/admin/client/admin/admin-preloader.svelte.d.ts +18 -0
- package/dist/admin/client/admin/dashboard-page.svelte +55 -41
- package/dist/admin/client/collection/a11y-score-cell.svelte +45 -0
- package/dist/admin/client/collection/a11y-score-cell.svelte.d.ts +6 -0
- package/dist/admin/client/collection/bulk-actions-bar.svelte +83 -0
- package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +9 -0
- package/dist/admin/client/collection/collection-entries.svelte +255 -256
- package/dist/admin/client/collection/collection-view.svelte.d.ts +4 -3
- package/dist/admin/client/collection/collection-view.svelte.js +9 -5
- package/dist/admin/client/collection/collection.svelte +22 -12
- package/dist/admin/client/collection/data-table.svelte +50 -39
- package/dist/admin/client/collection/data-table.svelte.d.ts +1 -0
- package/dist/admin/client/collection/date-cell.svelte +7 -5
- package/dist/admin/client/collection/date-cell.svelte.d.ts +1 -1
- package/dist/admin/client/collection/empty-state.svelte +28 -0
- package/dist/admin/client/collection/empty-state.svelte.d.ts +9 -0
- package/dist/admin/client/collection/entry-link.svelte +10 -4
- package/dist/admin/client/collection/entry-link.svelte.d.ts +1 -0
- package/dist/admin/client/collection/grid-view.svelte +21 -23
- package/dist/admin/client/collection/grid-view.svelte.d.ts +1 -2
- package/dist/admin/client/collection/row-actions.svelte +60 -0
- package/dist/admin/client/collection/row-actions.svelte.d.ts +9 -0
- package/dist/admin/client/collection/status-badge.svelte +7 -8
- package/dist/admin/client/collection/table-pagination.svelte +122 -79
- package/dist/admin/client/collection/table-pagination.svelte.d.ts +1 -0
- package/dist/admin/client/collection/table-toolbar.svelte +108 -88
- package/dist/admin/client/collection/table-toolbar.svelte.d.ts +8 -9
- package/dist/admin/client/entry/entry-form.svelte +109 -1
- package/dist/admin/client/entry/entry-header.svelte +96 -37
- package/dist/admin/client/entry/entry-header.svelte.d.ts +5 -0
- package/dist/admin/client/entry/entry.svelte +171 -60
- package/dist/admin/client/entry/header/a11y-validator.d.ts +46 -0
- package/dist/admin/client/entry/header/a11y-validator.js +311 -0
- package/dist/admin/client/entry/header/publish-panel.svelte +373 -131
- package/dist/admin/client/entry/header/publish-panel.svelte.d.ts +4 -0
- package/dist/admin/client/entry/header/save-indicator.svelte +33 -23
- package/dist/admin/client/entry/header/schedule-popover.svelte +1 -1
- package/dist/admin/client/entry/header/status-badge.svelte +25 -118
- package/dist/admin/client/entry/header/version-history-sheet.svelte +314 -98
- package/dist/admin/client/form/form-submission/form-submission.svelte +271 -83
- package/dist/admin/client/form/form-submission/submission-field.svelte +12 -12
- package/dist/admin/client/form/form-submissions.svelte +421 -139
- package/dist/admin/client/form/submission-link.svelte +8 -2
- package/dist/admin/client/form/submission-link.svelte.d.ts +1 -0
- package/dist/admin/client/form/submission-status-badge.svelte +18 -4
- package/dist/admin/client/form/submission-status-badge.svelte.d.ts +1 -0
- package/dist/admin/client/login/lang.d.ts +32 -0
- package/dist/admin/client/login/lang.js +66 -2
- package/dist/admin/client/login/login-form.svelte +237 -95
- package/dist/admin/client/login/login-form.svelte.d.ts +2 -17
- package/dist/admin/client/login/login-page.svelte +34 -98
- package/dist/admin/client/login/reset-password-page.svelte +235 -0
- package/dist/admin/client/login/reset-password-page.svelte.d.ts +4 -0
- package/dist/admin/client/login/schema.d.ts +15 -0
- package/dist/admin/client/login/schema.js +21 -0
- package/dist/admin/client/users/accept-invite-page.svelte +166 -37
- package/dist/admin/client/users/create-user-dialog.svelte +15 -7
- package/dist/admin/client/users/delete-user-dialog.svelte +81 -16
- package/dist/admin/client/users/delete-user-dialog.svelte.d.ts +4 -1
- package/dist/admin/client/users/edit-user-dialog.svelte +3 -0
- package/dist/admin/client/users/invite-user-dialog.svelte +16 -3
- package/dist/admin/client/users/lang.d.ts +27 -0
- package/dist/admin/client/users/lang.js +64 -10
- package/dist/admin/client/users/pending-invitations.svelte +59 -23
- package/dist/admin/client/users/users-page.svelte +471 -72
- package/dist/admin/components/accessibility/accessibility-overview.svelte +2 -7
- package/dist/admin/components/dashboard/a11y-gauge.svelte +90 -0
- package/dist/admin/components/dashboard/a11y-gauge.svelte.d.ts +18 -0
- package/dist/admin/components/dashboard/accessibility-hub.svelte +13 -12
- package/dist/admin/components/dashboard/form-submissions-widget.svelte +71 -113
- package/dist/admin/components/dashboard/index.d.ts +4 -2
- package/dist/admin/components/dashboard/index.js +4 -2
- package/dist/admin/components/dashboard/recent-activity.svelte +53 -75
- package/dist/admin/components/dashboard/recent-entries.svelte +94 -0
- package/dist/admin/components/dashboard/recent-entries.svelte.d.ts +18 -0
- package/dist/admin/components/dashboard/stat-card.svelte +2 -2
- package/dist/admin/components/dashboard/tip-of-the-day.svelte +109 -0
- package/dist/admin/components/dashboard/tip-of-the-day.svelte.d.ts +3 -0
- package/dist/admin/components/dashboard/welcome-header.svelte +45 -0
- package/dist/admin/components/dashboard/welcome-header.svelte.d.ts +3 -0
- package/dist/admin/components/fields/{array-field.svelte → blocks-field.svelte} +4 -4
- package/dist/admin/components/fields/{array-field.svelte.d.ts → blocks-field.svelte.d.ts} +5 -5
- package/dist/admin/components/fields/content-field.svelte +27 -0
- package/dist/admin/components/fields/content-field.svelte.d.ts +31 -0
- package/dist/admin/components/fields/field-renderer.svelte +9 -7
- package/dist/admin/components/fields/image-field.svelte +2 -2
- package/dist/admin/components/fields/media-field.svelte +2 -2
- package/dist/admin/components/fields/seo-field.svelte +205 -25
- package/dist/admin/components/fields/simple-array-field.svelte +289 -0
- package/dist/admin/components/fields/simple-array-field.svelte.d.ts +30 -0
- package/dist/admin/components/fields/slug-field.svelte +3 -2
- package/dist/admin/components/fields/standalone-field-renderer.svelte +148 -0
- package/dist/admin/components/fields/standalone-field-renderer.svelte.d.ts +9 -0
- package/dist/admin/components/fields/text-field-wrapper.svelte +13 -1
- package/dist/admin/components/fields/text-field-wrapper.svelte.d.ts +2 -2
- package/dist/admin/components/fields/url-field.svelte +5 -4
- package/dist/admin/components/layout/app-sidebar.svelte +27 -24
- package/dist/admin/components/layout/lang.d.ts +6 -0
- package/dist/admin/components/layout/lang.js +13 -1
- package/dist/admin/components/layout/layout-renderer.svelte +352 -0
- package/dist/admin/components/layout/layout-renderer.svelte.d.ts +14 -0
- package/dist/admin/components/layout/nav-breadcrumbs.svelte +4 -4
- package/dist/admin/components/layout/nav-collections.svelte +65 -36
- package/dist/admin/components/layout/nav-footer.svelte +31 -0
- package/dist/admin/components/layout/nav-footer.svelte.d.ts +18 -0
- package/dist/admin/components/layout/nav-forms.svelte +55 -30
- package/dist/admin/components/layout/nav-main.svelte +14 -52
- package/dist/admin/components/layout/nav-search.svelte +4 -3
- package/dist/admin/components/layout/nav-singletons.svelte +59 -17
- package/dist/admin/components/layout/nav-singletons.svelte.d.ts +17 -8
- package/dist/admin/components/layout/site-header.svelte +74 -13
- package/dist/admin/components/media/alt-input.svelte +32 -22
- package/dist/admin/components/media/bulk-action-bar.svelte +139 -150
- package/dist/admin/components/media/file/file-details.svelte +299 -217
- package/dist/admin/components/media/file/file-miniature.svelte +54 -41
- package/dist/admin/components/media/file/file-miniature.svelte.d.ts +1 -0
- package/dist/admin/components/media/file/file-preview.svelte +1 -1
- package/dist/admin/components/media/file-upload.svelte +24 -26
- package/dist/admin/components/media/files-list.svelte +112 -40
- package/dist/admin/components/media/files-list.svelte.d.ts +2 -0
- package/dist/admin/components/media/focal-point-input.svelte +122 -26
- package/dist/admin/components/media/media-library.svelte +127 -70
- package/dist/admin/components/media/media-search.svelte +6 -6
- package/dist/admin/components/media/media-sort.svelte +3 -1
- package/dist/admin/components/media/multi-file-summary.svelte +88 -68
- package/dist/admin/components/media/tag-combobox.svelte +141 -66
- package/dist/admin/components/media/tag-combobox.svelte.d.ts +1 -0
- package/dist/admin/components/media/tag-sidebar.svelte +139 -121
- package/dist/admin/components/tiptap/FigureNodeView.svelte +144 -15
- package/dist/admin/components/tiptap/InlineBlockNodeView.svelte +254 -0
- package/dist/admin/components/tiptap/InlineBlockNodeView.svelte.d.ts +4 -0
- package/dist/admin/components/tiptap/SlashCommandPopup.svelte +212 -0
- package/dist/admin/components/tiptap/SlashCommandPopup.svelte.d.ts +8 -0
- package/dist/admin/components/tiptap/content-editor.svelte +280 -0
- package/dist/admin/components/tiptap/content-editor.svelte.d.ts +9 -0
- package/dist/admin/components/tiptap/editor-toolbar.svelte +230 -0
- package/dist/admin/components/tiptap/editor-toolbar.svelte.d.ts +16 -0
- package/dist/admin/components/tiptap/heading-a11y-plugin.d.ts +2 -0
- package/dist/admin/components/tiptap/heading-a11y-plugin.js +67 -0
- package/dist/admin/components/tiptap/image-dialog.svelte +172 -11
- package/dist/admin/components/tiptap/inline-block-node.d.ts +19 -0
- package/dist/admin/components/tiptap/inline-block-node.js +98 -0
- package/dist/admin/components/tiptap/link-dialog.svelte +9 -4
- package/dist/admin/components/tiptap/slash-command.d.ts +17 -0
- package/dist/admin/components/tiptap/slash-command.js +181 -0
- package/dist/admin/components/tiptap/structured-content-utils.d.ts +21 -0
- package/dist/admin/components/tiptap/structured-content-utils.js +150 -0
- package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -190
- package/dist/admin/email/invite-template.d.ts +8 -0
- package/dist/admin/email/invite-template.js +99 -0
- package/dist/admin/email/reset-password-template.d.ts +7 -0
- package/dist/admin/email/reset-password-template.js +96 -0
- package/dist/admin/remote/ai.remote.d.ts +1 -0
- package/dist/admin/remote/ai.remote.js +4 -1
- package/dist/admin/remote/entry.remote.d.ts +8 -0
- package/dist/admin/remote/entry.remote.js +53 -4
- package/dist/admin/remote/preview.remote.js +2 -1
- package/dist/admin/shared/password-schema.d.ts +5 -0
- package/dist/admin/shared/password-schema.js +10 -0
- package/dist/admin/styles/admin.css +1530 -151
- package/dist/admin/utils/formatDate.d.ts +1 -0
- package/dist/admin/utils/formatDate.js +8 -0
- package/dist/admin/utils/roleLabel.d.ts +2 -0
- package/dist/admin/utils/roleLabel.js +13 -0
- package/dist/ai-claude/index.d.ts +2 -0
- package/dist/ai-claude/index.js +56 -0
- package/dist/cms/runtime/api.d.ts +6 -1
- package/dist/cms/runtime/api.js +3 -0
- package/dist/cms/runtime/schemas.d.ts +9 -1
- package/dist/cms/runtime/schemas.js +8 -0
- package/dist/cms/runtime/types.d.ts +82 -10
- package/dist/cms/runtime/types.js +4 -0
- package/dist/components/ui/accordion/accordion.stories.svelte +39 -0
- package/dist/components/ui/accordion/accordion.stories.svelte.d.ts +27 -0
- package/dist/components/ui/alert/alert.stories.svelte +53 -0
- package/dist/components/ui/alert/alert.stories.svelte.d.ts +27 -0
- package/dist/components/ui/alert/alert.svelte +5 -0
- package/dist/components/ui/alert/alert.svelte.d.ts +9 -0
- package/dist/components/ui/avatar/avatar.stories.svelte +16 -0
- package/dist/components/ui/avatar/avatar.stories.svelte.d.ts +27 -0
- package/dist/components/ui/badge/badge.stories.svelte +33 -0
- package/dist/components/ui/badge/badge.stories.svelte.d.ts +27 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +33 -0
- package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte.d.ts +27 -0
- package/dist/components/ui/button/button.stories.svelte +43 -0
- package/dist/components/ui/button/button.stories.svelte.d.ts +27 -0
- package/dist/components/ui/button/button.svelte +1 -2
- package/dist/components/ui/button/button.svelte.d.ts +0 -3
- package/dist/components/ui/button-group/button-group-separator.svelte.d.ts +1 -1
- package/dist/components/ui/card/card.stories.svelte +42 -0
- package/dist/components/ui/card/card.stories.svelte.d.ts +27 -0
- package/dist/components/ui/command/command.stories.svelte +51 -0
- package/dist/components/ui/command/command.stories.svelte.d.ts +27 -0
- package/dist/components/ui/dialog/dialog.stories.svelte +29 -0
- package/dist/components/ui/dialog/dialog.stories.svelte.d.ts +27 -0
- package/dist/components/ui/field/field-label.svelte.d.ts +1 -1
- package/dist/components/ui/field/field.stories.svelte +21 -0
- package/dist/components/ui/field/field.stories.svelte.d.ts +27 -0
- package/dist/components/ui/input/input.stories.svelte +40 -0
- package/dist/components/ui/input/input.stories.svelte.d.ts +27 -0
- package/dist/components/ui/input/input.svelte +2 -4
- package/dist/components/ui/item/item-separator.svelte.d.ts +1 -1
- package/dist/components/ui/label/label.stories.svelte +20 -0
- package/dist/components/ui/label/label.stories.svelte.d.ts +27 -0
- package/dist/components/ui/popover/popover.stories.svelte +29 -0
- package/dist/components/ui/popover/popover.stories.svelte.d.ts +27 -0
- package/dist/components/ui/select/select-group-heading.svelte.d.ts +1 -1
- package/dist/components/ui/select/select.stories.svelte +23 -0
- package/dist/components/ui/select/select.stories.svelte.d.ts +27 -0
- package/dist/components/ui/separator/separator.stories.svelte +24 -0
- package/dist/components/ui/separator/separator.stories.svelte.d.ts +27 -0
- package/dist/components/ui/sheet/sheet.stories.svelte +29 -0
- package/dist/components/ui/sheet/sheet.stories.svelte.d.ts +27 -0
- package/dist/components/ui/sidebar/sidebar-group.svelte +3 -3
- package/dist/components/ui/sidebar/sidebar-group.svelte.d.ts +2 -2
- package/dist/components/ui/sidebar/sidebar-menu-button.svelte +28 -30
- package/dist/components/ui/sidebar/sidebar-menu-button.svelte.d.ts +7 -7
- package/dist/components/ui/sidebar/sidebar-separator.svelte.d.ts +1 -1
- package/dist/components/ui/sidebar/sidebar-trigger.svelte +4 -4
- package/dist/components/ui/sonner/sonner.stories.svelte +22 -0
- package/dist/components/ui/sonner/sonner.stories.svelte.d.ts +26 -0
- package/dist/components/ui/sonner/sonner.svelte +8 -2
- package/dist/components/ui/sonner/toast-demo.svelte +29 -0
- package/dist/components/ui/sonner/toast-demo.svelte.d.ts +6 -0
- package/dist/components/ui/textarea/textarea.stories.svelte +22 -0
- package/dist/components/ui/textarea/textarea.stories.svelte.d.ts +27 -0
- package/dist/components/ui/textarea/textarea.svelte +0 -2
- package/dist/components/ui/toggle/toggle.stories.svelte +22 -0
- package/dist/components/ui/toggle/toggle.stories.svelte.d.ts +27 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.svelte +17 -0
- package/dist/components/ui/toggle-group/toggle-group.stories.svelte.d.ts +27 -0
- package/dist/components/ui/tooltip/tooltip.stories.svelte +26 -0
- package/dist/components/ui/tooltip/tooltip.stories.svelte.d.ts +27 -0
- package/dist/core/fields/fieldSchemaToTs.d.ts +1 -0
- package/dist/core/fields/fieldSchemaToTs.js +133 -1
- package/dist/core/fields/layoutUtils.d.ts +17 -0
- package/dist/core/fields/layoutUtils.js +149 -0
- package/dist/core/fields/structuredToHtml.d.ts +9 -0
- package/dist/core/fields/structuredToHtml.js +161 -0
- package/dist/core/server/entries/operations/create.js +2 -1
- package/dist/core/server/entries/operations/get.js +8 -6
- package/dist/core/server/entries/operations/update.d.ts +3 -0
- package/dist/core/server/entries/operations/update.js +30 -2
- package/dist/core/server/fields/queryStructuredContent.d.ts +15 -0
- package/dist/core/server/fields/queryStructuredContent.js +65 -0
- package/dist/core/server/fields/resolveImageFields.js +51 -2
- package/dist/core/server/fields/resolveRelationFields.js +2 -2
- package/dist/core/server/fields/resolveRichtextLinks.js +80 -13
- package/dist/core/server/fields/resolveUrlFields.js +57 -6
- package/dist/core/server/fields/slugResolver.d.ts +10 -0
- package/dist/core/server/fields/slugResolver.js +34 -0
- package/dist/core/server/generator/fields.js +15 -4
- package/dist/core/server/generator/generator.js +3 -2
- package/dist/files-local/index.js +126 -64
- package/dist/paraglide/.prettierignore +3 -0
- package/dist/paraglide/messages/_index.d.ts +36 -0
- package/dist/paraglide/messages/_index.js +72 -0
- package/dist/paraglide/messages/en.d.ts +5 -0
- package/dist/paraglide/messages/en.js +14 -0
- package/dist/paraglide/messages/pl.d.ts +5 -0
- package/dist/paraglide/messages/pl.js +14 -0
- package/dist/paraglide/messages.d.ts +2 -0
- package/dist/paraglide/messages.js +4 -0
- package/dist/paraglide/registry.d.ts +21 -0
- package/dist/paraglide/registry.js +31 -0
- package/dist/paraglide/runtime.d.ts +583 -0
- package/dist/paraglide/runtime.js +1402 -0
- package/dist/paraglide/server.d.ts +67 -0
- package/dist/paraglide/server.js +175 -0
- package/dist/server/auth.d.ts +5 -0
- package/dist/server/auth.js +12 -1
- package/dist/sveltekit/components/structured-content.svelte +204 -0
- package/dist/sveltekit/components/structured-content.svelte.d.ts +21 -0
- package/dist/sveltekit/config.d.ts +13 -3
- package/dist/sveltekit/index.d.ts +3 -0
- package/dist/sveltekit/index.js +3 -0
- package/dist/sveltekit/server/handle.js +1 -0
- package/dist/types/config.d.ts +3 -0
- package/dist/types/fields.d.ts +19 -2
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/layout.d.ts +54 -0
- package/dist/types/layout.js +6 -0
- package/dist/types/structured-content.d.ts +63 -0
- package/dist/types/structured-content.js +1 -0
- package/dist/updates/0.1.4/index.d.ts +2 -0
- package/dist/updates/0.1.4/index.js +11 -0
- package/dist/updates/0.1.5/index.d.ts +2 -0
- package/dist/updates/0.1.5/index.js +18 -0
- package/dist/updates/0.2.0/index.d.ts +2 -0
- package/dist/updates/0.2.0/index.js +11 -0
- package/dist/updates/0.2.2/index.d.ts +2 -0
- package/dist/updates/0.2.2/index.js +13 -0
- package/dist/updates/0.5.0/index.d.ts +2 -0
- package/dist/updates/0.5.0/index.js +14 -0
- package/dist/updates/index.js +6 -1
- package/package.json +17 -10
|
@@ -13,11 +13,12 @@
|
|
|
13
13
|
pageSize: number;
|
|
14
14
|
pageCount: number;
|
|
15
15
|
totalItems: number;
|
|
16
|
+
itemLabel?: string;
|
|
16
17
|
onPageChange: (pageIndex: number) => void;
|
|
17
18
|
onPageSizeChange: (pageSize: number) => void;
|
|
18
19
|
};
|
|
19
20
|
|
|
20
|
-
let { pageIndex, pageSize, pageCount, totalItems, onPageChange, onPageSizeChange }: Props =
|
|
21
|
+
let { pageIndex, pageSize, pageCount, totalItems, itemLabel, onPageChange, onPageSizeChange }: Props =
|
|
21
22
|
$props();
|
|
22
23
|
|
|
23
24
|
const interfaceLanguage = useInterfaceLanguage();
|
|
@@ -25,35 +26,36 @@
|
|
|
25
26
|
const lang: Record<
|
|
26
27
|
InterfaceLanguage,
|
|
27
28
|
{
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
page: string;
|
|
29
|
+
showing: (start: number, end: number, total: number, label?: string) => string;
|
|
30
|
+
perPage: string;
|
|
31
31
|
firstPage: string;
|
|
32
32
|
previousPage: string;
|
|
33
33
|
nextPage: string;
|
|
34
34
|
lastPage: string;
|
|
35
|
+
goToPage: (n: number) => string;
|
|
35
36
|
}
|
|
36
37
|
> = {
|
|
37
38
|
en: {
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
page: 'Page',
|
|
39
|
+
showing: (s, e, t, l) => `Showing ${s}–${e} of ${t}${l ? ` ${l}` : ''}`,
|
|
40
|
+
perPage: 'per page',
|
|
41
41
|
firstPage: 'First page',
|
|
42
42
|
previousPage: 'Previous page',
|
|
43
43
|
nextPage: 'Next page',
|
|
44
|
-
lastPage: 'Last page'
|
|
44
|
+
lastPage: 'Last page',
|
|
45
|
+
goToPage: (n) => `Go to page ${n}`
|
|
45
46
|
},
|
|
46
47
|
pl: {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
page: 'Strona',
|
|
48
|
+
showing: (s, e, t, l) => `Wyświetlono ${s}–${e} z ${t}${l ? ` ${l}` : ''}`,
|
|
49
|
+
perPage: 'na stronie',
|
|
50
50
|
firstPage: 'Pierwsza strona',
|
|
51
51
|
previousPage: 'Poprzednia strona',
|
|
52
52
|
nextPage: 'Następna strona',
|
|
53
|
-
lastPage: 'Ostatnia strona'
|
|
53
|
+
lastPage: 'Ostatnia strona',
|
|
54
|
+
goToPage: (n) => `Przejdź do strony ${n}`
|
|
54
55
|
}
|
|
55
56
|
};
|
|
56
57
|
|
|
58
|
+
const t = $derived(lang[interfaceLanguage.current]);
|
|
57
59
|
const pageSizes = [10, 20, 30, 50, 100];
|
|
58
60
|
|
|
59
61
|
const canGoPrevious = $derived(pageIndex > 0);
|
|
@@ -61,76 +63,117 @@
|
|
|
61
63
|
|
|
62
64
|
const startItem = $derived(totalItems === 0 ? 0 : pageIndex * pageSize + 1);
|
|
63
65
|
const endItem = $derived(Math.min((pageIndex + 1) * pageSize, totalItems));
|
|
64
|
-
</script>
|
|
65
66
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
67
|
+
/** Generate visible page numbers with ellipsis */
|
|
68
|
+
const visiblePages = $derived.by(() => {
|
|
69
|
+
if (pageCount <= 7) {
|
|
70
|
+
return Array.from({ length: pageCount }, (_, i) => i);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const pages: (number | 'ellipsis')[] = [0];
|
|
74
|
+
|
|
75
|
+
if (pageIndex > 2) pages.push('ellipsis');
|
|
76
|
+
|
|
77
|
+
const start = Math.max(1, pageIndex - 1);
|
|
78
|
+
const end = Math.min(pageCount - 2, pageIndex + 1);
|
|
79
|
+
|
|
80
|
+
for (let i = start; i <= end; i++) {
|
|
81
|
+
pages.push(i);
|
|
82
|
+
}
|
|
70
83
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
{#each pageSizes as size}
|
|
84
|
-
<Select.Item value={String(size)}>{size}</Select.Item>
|
|
85
|
-
{/each}
|
|
86
|
-
</Select.Content>
|
|
87
|
-
</Select.Root>
|
|
84
|
+
if (pageIndex < pageCount - 3) pages.push('ellipsis');
|
|
85
|
+
|
|
86
|
+
pages.push(pageCount - 1);
|
|
87
|
+
|
|
88
|
+
return pages;
|
|
89
|
+
});
|
|
90
|
+
</script>
|
|
91
|
+
|
|
92
|
+
{#if totalItems > 0}
|
|
93
|
+
<div class="flex flex-wrap items-center justify-between gap-4 px-1 py-4">
|
|
94
|
+
<div class="text-muted-foreground text-sm">
|
|
95
|
+
{t.showing(startItem, endItem, totalItems, itemLabel)}
|
|
88
96
|
</div>
|
|
89
97
|
|
|
90
|
-
<div class="flex items-center gap-
|
|
91
|
-
<
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
98
|
+
<div class="flex items-center gap-3">
|
|
99
|
+
<nav class="flex items-center gap-1" aria-label="Pagination">
|
|
100
|
+
<Button
|
|
101
|
+
variant="outline"
|
|
102
|
+
size="icon"
|
|
103
|
+
class="h-8 w-8"
|
|
104
|
+
disabled={!canGoPrevious}
|
|
105
|
+
onclick={() => onPageChange(0)}
|
|
106
|
+
title={t.firstPage}
|
|
107
|
+
>
|
|
108
|
+
<ChevronsLeft class="size-4" />
|
|
109
|
+
</Button>
|
|
110
|
+
<Button
|
|
111
|
+
variant="outline"
|
|
112
|
+
size="icon"
|
|
113
|
+
class="h-8 w-8"
|
|
114
|
+
disabled={!canGoPrevious}
|
|
115
|
+
onclick={() => onPageChange(pageIndex - 1)}
|
|
116
|
+
title={t.previousPage}
|
|
117
|
+
>
|
|
118
|
+
<ChevronLeft class="size-4" />
|
|
119
|
+
</Button>
|
|
120
|
+
|
|
121
|
+
{#each visiblePages as page}
|
|
122
|
+
{#if page === 'ellipsis'}
|
|
123
|
+
<span class="px-1 text-sm text-muted-foreground">…</span>
|
|
124
|
+
{:else}
|
|
125
|
+
<Button
|
|
126
|
+
variant={page === pageIndex ? 'default' : 'outline'}
|
|
127
|
+
size="icon"
|
|
128
|
+
class="h-8 w-8 text-xs"
|
|
129
|
+
onclick={() => onPageChange(page)}
|
|
130
|
+
aria-label={t.goToPage(page + 1)}
|
|
131
|
+
aria-current={page === pageIndex ? 'page' : undefined}
|
|
132
|
+
>
|
|
133
|
+
{page + 1}
|
|
134
|
+
</Button>
|
|
135
|
+
{/if}
|
|
136
|
+
{/each}
|
|
137
|
+
|
|
138
|
+
<Button
|
|
139
|
+
variant="outline"
|
|
140
|
+
size="icon"
|
|
141
|
+
class="h-8 w-8"
|
|
142
|
+
disabled={!canGoNext}
|
|
143
|
+
onclick={() => onPageChange(pageIndex + 1)}
|
|
144
|
+
title={t.nextPage}
|
|
145
|
+
>
|
|
146
|
+
<ChevronRight class="size-4" />
|
|
147
|
+
</Button>
|
|
148
|
+
<Button
|
|
149
|
+
variant="outline"
|
|
150
|
+
size="icon"
|
|
151
|
+
class="h-8 w-8"
|
|
152
|
+
disabled={!canGoNext}
|
|
153
|
+
onclick={() => onPageChange(pageCount - 1)}
|
|
154
|
+
title={t.lastPage}
|
|
155
|
+
>
|
|
156
|
+
<ChevronsRight class="size-4" />
|
|
157
|
+
</Button>
|
|
158
|
+
</nav>
|
|
159
|
+
|
|
160
|
+
<div class="flex items-center gap-1.5">
|
|
161
|
+
<Select.Root
|
|
162
|
+
type="single"
|
|
163
|
+
value={String(pageSize)}
|
|
164
|
+
onValueChange={(value) => value && onPageSizeChange(Number(value))}
|
|
165
|
+
>
|
|
166
|
+
<Select.Trigger class="h-8 w-[70px] text-xs">
|
|
167
|
+
{pageSize}
|
|
168
|
+
</Select.Trigger>
|
|
169
|
+
<Select.Content>
|
|
170
|
+
{#each pageSizes as size}
|
|
171
|
+
<Select.Item value={String(size)}>{size}</Select.Item>
|
|
172
|
+
{/each}
|
|
173
|
+
</Select.Content>
|
|
174
|
+
</Select.Root>
|
|
175
|
+
<span class="text-xs text-muted-foreground">{t.perPage}</span>
|
|
176
|
+
</div>
|
|
134
177
|
</div>
|
|
135
178
|
</div>
|
|
136
|
-
|
|
179
|
+
{/if}
|
|
@@ -2,40 +2,37 @@
|
|
|
2
2
|
import Search from '@tabler/icons-svelte/icons/search';
|
|
3
3
|
import List from '@tabler/icons-svelte/icons/list';
|
|
4
4
|
import LayoutGrid from '@tabler/icons-svelte/icons/layout-grid';
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import Trash from '@tabler/icons-svelte/icons/trash';
|
|
8
|
-
import Archive from '@tabler/icons-svelte/icons/archive';
|
|
5
|
+
import Plus from '@tabler/icons-svelte/icons/plus';
|
|
6
|
+
import Filter from '@tabler/icons-svelte/icons/filter';
|
|
9
7
|
import Input from '../../../components/ui/input/input.svelte';
|
|
10
8
|
import Button from '../../../components/ui/button/button.svelte';
|
|
9
|
+
import * as Popover from '../../../components/ui/popover/index.js';
|
|
11
10
|
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
12
11
|
import type { InterfaceLanguage } from '../../../types/languages.js';
|
|
13
|
-
import type { ViewMode,
|
|
12
|
+
import type { ViewMode, StatusFilter } from './collection-view.svelte.js';
|
|
14
13
|
|
|
15
14
|
type Props = {
|
|
16
15
|
searchQuery: string;
|
|
17
16
|
onSearchChange: (query: string) => void;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
showViewModeToggle?: boolean;
|
|
17
|
+
statusFilter: StatusFilter;
|
|
18
|
+
onStatusFilterChange: (filter: StatusFilter) => void;
|
|
19
|
+
viewMode: ViewMode;
|
|
20
|
+
onViewModeChange: (mode: ViewMode) => void;
|
|
21
|
+
onCreateEntry: () => void;
|
|
22
|
+
createLabel: string;
|
|
23
|
+
searchPlaceholder?: string;
|
|
26
24
|
};
|
|
27
25
|
|
|
28
26
|
let {
|
|
29
27
|
searchQuery,
|
|
30
28
|
onSearchChange,
|
|
31
|
-
|
|
29
|
+
statusFilter,
|
|
30
|
+
onStatusFilterChange,
|
|
31
|
+
viewMode,
|
|
32
32
|
onViewModeChange,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
onBulkArchive,
|
|
37
|
-
onBulkDelete,
|
|
38
|
-
showViewModeToggle = true
|
|
33
|
+
onCreateEntry,
|
|
34
|
+
createLabel,
|
|
35
|
+
searchPlaceholder
|
|
39
36
|
}: Props = $props();
|
|
40
37
|
|
|
41
38
|
const interfaceLanguage = useInterfaceLanguage();
|
|
@@ -46,107 +43,130 @@
|
|
|
46
43
|
search: string;
|
|
47
44
|
listView: string;
|
|
48
45
|
gridView: string;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
46
|
+
status: string;
|
|
47
|
+
all: string;
|
|
48
|
+
published: string;
|
|
49
|
+
draft: string;
|
|
50
|
+
scheduled: string;
|
|
51
|
+
archived: string;
|
|
54
52
|
}
|
|
55
53
|
> = {
|
|
56
54
|
en: {
|
|
57
55
|
search: 'Search...',
|
|
58
56
|
listView: 'List view',
|
|
59
57
|
gridView: 'Grid view',
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
58
|
+
status: 'Status',
|
|
59
|
+
all: 'All',
|
|
60
|
+
published: 'Published',
|
|
61
|
+
draft: 'Drafts',
|
|
62
|
+
scheduled: 'Scheduled',
|
|
63
|
+
archived: 'Archived'
|
|
65
64
|
},
|
|
66
65
|
pl: {
|
|
67
66
|
search: 'Szukaj...',
|
|
68
67
|
listView: 'Widok listy',
|
|
69
68
|
gridView: 'Widok kafelków',
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
69
|
+
status: 'Status',
|
|
70
|
+
all: 'Wszystkie',
|
|
71
|
+
published: 'Opublikowane',
|
|
72
|
+
draft: 'Szkice',
|
|
73
|
+
scheduled: 'Zaplanowane',
|
|
74
|
+
archived: 'Zarchiwizowane'
|
|
75
75
|
}
|
|
76
76
|
};
|
|
77
|
+
|
|
78
|
+
const t = $derived(lang[interfaceLanguage.current]);
|
|
79
|
+
|
|
80
|
+
const statusOptions: { value: StatusFilter; label: () => string }[] = [
|
|
81
|
+
{ value: null, label: () => t.all },
|
|
82
|
+
{ value: 'published', label: () => t.published },
|
|
83
|
+
{ value: 'draft', label: () => t.draft },
|
|
84
|
+
{ value: 'scheduled', label: () => t.scheduled },
|
|
85
|
+
{ value: 'archived', label: () => t.archived }
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
const activeFilterLabel = $derived(
|
|
89
|
+
statusOptions.find((o) => o.value === statusFilter)?.label() ?? t.all
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
const hasActiveFilter = $derived(statusFilter !== null);
|
|
93
|
+
|
|
94
|
+
let statusPopoverOpen = $state(false);
|
|
77
95
|
</script>
|
|
78
96
|
|
|
79
|
-
<div class="flex flex-wrap items-center gap-2
|
|
80
|
-
<div class="relative
|
|
97
|
+
<div class="mb-6 flex flex-wrap items-center gap-2.5">
|
|
98
|
+
<div class="relative min-w-[240px] flex-1">
|
|
81
99
|
<Search
|
|
82
|
-
class="text-muted-foreground pointer-events-none absolute
|
|
100
|
+
class="text-muted-foreground pointer-events-none absolute top-1/2 left-3 size-4 -translate-y-1/2"
|
|
83
101
|
/>
|
|
84
102
|
<Input
|
|
85
103
|
type="text"
|
|
86
|
-
placeholder={
|
|
87
|
-
class="pl-9"
|
|
104
|
+
placeholder={searchPlaceholder ?? t.search}
|
|
105
|
+
class="border-border focus-visible:ring-primary/30 bg-white pl-9"
|
|
88
106
|
value={searchQuery}
|
|
89
107
|
oninput={(e) => onSearchChange(e.currentTarget.value)}
|
|
90
108
|
/>
|
|
91
109
|
</div>
|
|
92
110
|
|
|
93
|
-
{
|
|
94
|
-
<
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
111
|
+
<Popover.Root bind:open={statusPopoverOpen}>
|
|
112
|
+
<Popover.Trigger>
|
|
113
|
+
{#snippet child({ props })}
|
|
114
|
+
<Button
|
|
115
|
+
{...props}
|
|
116
|
+
variant="outline"
|
|
117
|
+
size="sm"
|
|
118
|
+
class="gap-1.5 {hasActiveFilter
|
|
119
|
+
? 'border-primary/30 bg-lavender-lighter text-primary'
|
|
120
|
+
: ''}"
|
|
121
|
+
>
|
|
122
|
+
<Filter class="size-3.5" />
|
|
123
|
+
{t.status}{hasActiveFilter ? `: ${activeFilterLabel}` : ''}
|
|
124
|
+
</Button>
|
|
125
|
+
{/snippet}
|
|
126
|
+
</Popover.Trigger>
|
|
127
|
+
<Popover.Content class="w-44 p-1" align="start">
|
|
128
|
+
{#each statusOptions as option}
|
|
129
|
+
<button
|
|
130
|
+
class="hover:bg-accent flex w-full items-center rounded-md px-2.5 py-1.5 text-sm transition-colors {statusFilter ===
|
|
131
|
+
option.value
|
|
132
|
+
? 'bg-accent text-accent-foreground font-medium'
|
|
133
|
+
: 'text-foreground'}"
|
|
134
|
+
onclick={() => {
|
|
135
|
+
onStatusFilterChange(option.value);
|
|
136
|
+
statusPopoverOpen = false;
|
|
137
|
+
}}
|
|
138
|
+
>
|
|
139
|
+
{option.label()}
|
|
140
|
+
</button>
|
|
141
|
+
{/each}
|
|
142
|
+
</Popover.Content>
|
|
143
|
+
</Popover.Root>
|
|
113
144
|
|
|
114
|
-
<div class="flex items-center gap-
|
|
145
|
+
<div class="flex items-center gap-0.5 rounded-lg border p-0.5">
|
|
115
146
|
<Button
|
|
116
|
-
variant={
|
|
147
|
+
variant={viewMode === 'list' ? 'secondary' : 'ghost'}
|
|
117
148
|
size="icon"
|
|
118
|
-
|
|
119
|
-
|
|
149
|
+
class="h-7 w-7"
|
|
150
|
+
onclick={() => onViewModeChange('list')}
|
|
151
|
+
title={t.listView}
|
|
120
152
|
>
|
|
121
|
-
<
|
|
153
|
+
<List class="size-3.5" />
|
|
122
154
|
</Button>
|
|
123
155
|
<Button
|
|
124
|
-
variant={
|
|
156
|
+
variant={viewMode === 'grid' ? 'secondary' : 'ghost'}
|
|
125
157
|
size="icon"
|
|
126
|
-
|
|
127
|
-
|
|
158
|
+
class="h-7 w-7"
|
|
159
|
+
onclick={() => onViewModeChange('grid')}
|
|
160
|
+
title={t.gridView}
|
|
128
161
|
>
|
|
129
|
-
<
|
|
162
|
+
<LayoutGrid class="size-3.5" />
|
|
130
163
|
</Button>
|
|
131
164
|
</div>
|
|
132
165
|
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
<Button variant="ghost" size="sm" onclick={onBulkArchive}>
|
|
140
|
-
<Archive class="mr-1 size-3.5" />
|
|
141
|
-
{lang[interfaceLanguage.current].archive}
|
|
142
|
-
</Button>
|
|
143
|
-
{/if}
|
|
144
|
-
{#if onBulkDelete}
|
|
145
|
-
<Button variant="ghost" size="sm" class="text-destructive hover:text-destructive/80" onclick={onBulkDelete}>
|
|
146
|
-
<Trash class="mr-1 size-3.5" />
|
|
147
|
-
{lang[interfaceLanguage.current].delete}
|
|
148
|
-
</Button>
|
|
149
|
-
{/if}
|
|
150
|
-
</div>
|
|
151
|
-
{/if}
|
|
166
|
+
<div class="flex-1"></div>
|
|
167
|
+
|
|
168
|
+
<Button variant="default" size="sm" onclick={onCreateEntry}>
|
|
169
|
+
<Plus class="mr-1 size-4" />
|
|
170
|
+
{createLabel}
|
|
171
|
+
</Button>
|
|
152
172
|
</div>
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import type { ViewMode,
|
|
1
|
+
import type { ViewMode, StatusFilter } from './collection-view.svelte.js';
|
|
2
2
|
type Props = {
|
|
3
3
|
searchQuery: string;
|
|
4
4
|
onSearchChange: (query: string) => void;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
showViewModeToggle?: boolean;
|
|
5
|
+
statusFilter: StatusFilter;
|
|
6
|
+
onStatusFilterChange: (filter: StatusFilter) => void;
|
|
7
|
+
viewMode: ViewMode;
|
|
8
|
+
onViewModeChange: (mode: ViewMode) => void;
|
|
9
|
+
onCreateEntry: () => void;
|
|
10
|
+
createLabel: string;
|
|
11
|
+
searchPlaceholder?: string;
|
|
13
12
|
};
|
|
14
13
|
declare const TableToolbar: import("svelte").Component<Props, {}, "">;
|
|
15
14
|
type TableToolbar = ReturnType<typeof TableToolbar>;
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import FieldsForm from '../../components/fields/fields-form.svelte';
|
|
3
|
+
import LayoutRenderer from '../../components/layout/layout-renderer.svelte';
|
|
4
|
+
import { hasLayout, getFieldsFromConfig, resolveLayoutWithOrphans } from '../../../core/fields/layoutUtils.js';
|
|
3
5
|
import type { RawEntry } from '../../../types/entries.js';
|
|
4
6
|
import type { SuperForm } from 'sveltekit-superforms';
|
|
7
|
+
import { cn } from '../../../utils.js';
|
|
8
|
+
import { normalizePath } from '../../utils/objectPath.js';
|
|
9
|
+
import { tick } from 'svelte';
|
|
5
10
|
|
|
6
11
|
type Props = {
|
|
7
12
|
form: SuperForm<Record<string, unknown>>;
|
|
@@ -12,6 +17,109 @@
|
|
|
12
17
|
|
|
13
18
|
let { form, entry, focusedPath = null, onPathSelect }: Props = $props();
|
|
14
19
|
let { collection } = entry;
|
|
20
|
+
|
|
21
|
+
const layoutNodes = $derived(
|
|
22
|
+
hasLayout(collection) ? resolveLayoutWithOrphans(collection) : null
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
// --- Focus/flash logic ---
|
|
26
|
+
let lastScrolledPath = $state<string | null>(null);
|
|
27
|
+
let flashingPath = $state<string | null>(null);
|
|
28
|
+
let skipNextScroll = false;
|
|
29
|
+
|
|
30
|
+
function isFlashing(fieldPath: string): boolean {
|
|
31
|
+
if (!flashingPath) return false;
|
|
32
|
+
return normalizePath(flashingPath) === fieldPath;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
$effect(() => {
|
|
36
|
+
if (focusedPath && focusedPath !== lastScrolledPath) {
|
|
37
|
+
lastScrolledPath = focusedPath;
|
|
38
|
+
|
|
39
|
+
if (skipNextScroll) {
|
|
40
|
+
skipNextScroll = false;
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
tick().then(() => {
|
|
45
|
+
const normalizedPath = normalizePath(focusedPath!);
|
|
46
|
+
let targetEl = document.querySelector(`[data-field-path="${normalizedPath}"]`) as HTMLElement;
|
|
47
|
+
|
|
48
|
+
if (!targetEl) {
|
|
49
|
+
const rootPath = normalizedPath.split('.')[0];
|
|
50
|
+
targetEl = document.querySelector(`[data-field-path="${rootPath}"]`) as HTMLElement;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (targetEl) {
|
|
54
|
+
// If inside a closed accordion, open it first
|
|
55
|
+
const accordionContent = targetEl.closest('[data-slot="accordion-content"]');
|
|
56
|
+
if (accordionContent && accordionContent.getAttribute('data-state') === 'closed') {
|
|
57
|
+
const item = accordionContent.closest('[data-slot="accordion-item"]');
|
|
58
|
+
const trigger = item?.querySelector('[data-slot="accordion-trigger"]') as HTMLElement;
|
|
59
|
+
if (trigger) {
|
|
60
|
+
trigger.click();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
tick().then(() => {
|
|
65
|
+
const scrollContainer = targetEl.closest('.overflow-y-auto') as HTMLElement;
|
|
66
|
+
if (scrollContainer) {
|
|
67
|
+
const rect = targetEl.getBoundingClientRect();
|
|
68
|
+
const containerRect = scrollContainer.getBoundingClientRect();
|
|
69
|
+
const targetPosition = scrollContainer.scrollTop + (rect.top - containerRect.top) - (containerRect.height / 2) + (rect.height / 2);
|
|
70
|
+
scrollContainer.scrollTo({ top: targetPosition, behavior: 'smooth' });
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
flashingPath = normalizedPath;
|
|
74
|
+
setTimeout(() => {
|
|
75
|
+
if (flashingPath === normalizedPath) flashingPath = null;
|
|
76
|
+
}, 1500);
|
|
77
|
+
|
|
78
|
+
setTimeout(() => {
|
|
79
|
+
const input = targetEl.querySelector('input, textarea, [contenteditable="true"]') as HTMLElement;
|
|
80
|
+
if (input) input.focus();
|
|
81
|
+
}, 400);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
function handleClick(e: MouseEvent) {
|
|
89
|
+
const fieldEl = (e.target as HTMLElement).closest('[data-field-path]') as HTMLElement;
|
|
90
|
+
const path = fieldEl?.dataset.fieldPath;
|
|
91
|
+
if (path && onPathSelect) {
|
|
92
|
+
skipNextScroll = true;
|
|
93
|
+
onPathSelect(path);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
15
96
|
</script>
|
|
16
97
|
|
|
17
|
-
|
|
98
|
+
{#if layoutNodes}
|
|
99
|
+
<!-- svelte-ignore a11y_click_events_have_key_events a11y_no_noninteractive_element_interactions -->
|
|
100
|
+
<div class="layout-entry-form" onclick={handleClick}>
|
|
101
|
+
<LayoutRenderer
|
|
102
|
+
nodes={layoutNodes}
|
|
103
|
+
fields={getFieldsFromConfig(collection)}
|
|
104
|
+
{form}
|
|
105
|
+
{focusedPath}
|
|
106
|
+
{flashingPath}
|
|
107
|
+
/>
|
|
108
|
+
</div>
|
|
109
|
+
{:else}
|
|
110
|
+
<FieldsForm {form} fields={getFieldsFromConfig(collection)} {focusedPath} {onPathSelect} />
|
|
111
|
+
{/if}
|
|
112
|
+
|
|
113
|
+
<style>
|
|
114
|
+
.layout-entry-form {
|
|
115
|
+
max-width: 1100px;
|
|
116
|
+
margin: 0 auto;
|
|
117
|
+
padding: 24px;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
@media (max-width: 900px) {
|
|
121
|
+
.layout-entry-form {
|
|
122
|
+
padding: 16px;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
</style>
|