includio-cms 0.1.4 → 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 +68 -0
- package/ROADMAP.md +18 -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 -260
- 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/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.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 +5 -1
- package/package.json +16 -9
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export const usersLang = {
|
|
2
2
|
en: {
|
|
3
3
|
title: 'Users',
|
|
4
|
-
|
|
4
|
+
description: 'Manage team members and their permissions.',
|
|
5
|
+
name: 'Full name',
|
|
5
6
|
email: 'Email',
|
|
6
7
|
role: 'Role',
|
|
7
8
|
createdAt: 'Created At',
|
|
@@ -13,17 +14,36 @@ export const usersLang = {
|
|
|
13
14
|
save: 'Save',
|
|
14
15
|
cancel: 'Cancel',
|
|
15
16
|
password: 'Password',
|
|
16
|
-
|
|
17
|
+
passwordHint: 'Min. 8 characters, uppercase, number and special character',
|
|
18
|
+
passwordMinLength: 'Password must be at least 8 characters',
|
|
19
|
+
passwordRequirements: 'Password must contain an uppercase letter, a number and a special character',
|
|
20
|
+
passwordMismatch: 'Passwords do not match',
|
|
21
|
+
roleAdmin: 'Administrator',
|
|
17
22
|
roleUser: 'User',
|
|
23
|
+
roleHint: 'Administrators have full access to the panel and all settings.',
|
|
18
24
|
deleteConfirmTitle: 'Delete user?',
|
|
19
25
|
deleteConfirmDescription: 'This action cannot be undone. The user will be permanently deleted.',
|
|
26
|
+
deleteWarningTitle: 'This action cannot be undone',
|
|
27
|
+
deleteWarningDesc: (name) => `User <strong>${name}</strong> will be permanently deleted along with all their data.`,
|
|
28
|
+
deleteConfirmType: 'Type <strong>DELETE</strong> to confirm',
|
|
29
|
+
deleteConfirmWord: 'DELETE',
|
|
20
30
|
userCreated: 'User created',
|
|
21
31
|
userUpdated: 'User updated',
|
|
22
32
|
userDeleted: 'User deleted',
|
|
23
33
|
cannotDeleteSelf: 'You cannot delete your own account',
|
|
24
34
|
cannotChangeSelfRole: 'You cannot change your own role',
|
|
25
35
|
noResults: 'No users found',
|
|
26
|
-
generatePassword: 'Generate
|
|
36
|
+
generatePassword: 'Generate',
|
|
37
|
+
filterByRole: 'Filter by role',
|
|
38
|
+
allRoles: 'All roles',
|
|
39
|
+
showing: (start, end, total) => `Showing ${start}–${end} of ${total}`,
|
|
40
|
+
selected: (n) => `${n} selected`,
|
|
41
|
+
changeRole: 'Change role',
|
|
42
|
+
emptyTitle: 'No users yet',
|
|
43
|
+
emptyDescription: 'Create your first user to start managing your team.',
|
|
44
|
+
addUser: 'Add user',
|
|
45
|
+
selectAll: 'Select all',
|
|
46
|
+
selectUser: 'Select user',
|
|
27
47
|
sessions: {
|
|
28
48
|
title: 'User Sessions',
|
|
29
49
|
noSessions: 'No active sessions',
|
|
@@ -48,16 +68,24 @@ export const usersLang = {
|
|
|
48
68
|
acceptDescription: 'Set up your account to get started.',
|
|
49
69
|
confirmPassword: 'Confirm password',
|
|
50
70
|
acceptInvite: 'Create Account',
|
|
51
|
-
accepted: 'Account created!
|
|
71
|
+
accepted: 'Account created!',
|
|
72
|
+
goToLogin: 'Go to login',
|
|
52
73
|
invalidToken: 'Invalid or expired invitation link',
|
|
53
74
|
emailConfigRequired: 'Email adapter not configured',
|
|
54
75
|
resend: 'Resend',
|
|
55
|
-
resent: 'Invitation resent'
|
|
76
|
+
resent: 'Invitation resent',
|
|
77
|
+
emailPlaceholder: 'john@company.com',
|
|
78
|
+
emailHint: 'The user will receive an email with a link to create their account.',
|
|
79
|
+
roleHint: 'You can change the role later.',
|
|
80
|
+
expiringSoon: 'Expiring soon',
|
|
81
|
+
resendLabel: (email) => `Resend invitation to ${email}`,
|
|
82
|
+
cancelLabel: (email) => `Cancel invitation for ${email}`
|
|
56
83
|
}
|
|
57
84
|
},
|
|
58
85
|
pl: {
|
|
59
86
|
title: 'Użytkownicy',
|
|
60
|
-
|
|
87
|
+
description: 'Zarządzaj członkami zespołu i ich uprawnieniami.',
|
|
88
|
+
name: 'Imię i nazwisko',
|
|
61
89
|
email: 'E-mail',
|
|
62
90
|
role: 'Rola',
|
|
63
91
|
createdAt: 'Utworzono',
|
|
@@ -69,17 +97,36 @@ export const usersLang = {
|
|
|
69
97
|
save: 'Zapisz',
|
|
70
98
|
cancel: 'Anuluj',
|
|
71
99
|
password: 'Hasło',
|
|
72
|
-
|
|
100
|
+
passwordHint: 'Min. 8 znaków, wielka litera, cyfra i znak specjalny',
|
|
101
|
+
passwordMinLength: 'Hasło musi mieć min. 8 znaków',
|
|
102
|
+
passwordRequirements: 'Hasło musi zawierać wielką literę, cyfrę i znak specjalny',
|
|
103
|
+
passwordMismatch: 'Hasła nie są zgodne',
|
|
104
|
+
roleAdmin: 'Administrator',
|
|
73
105
|
roleUser: 'Użytkownik',
|
|
106
|
+
roleHint: 'Administratorzy mają pełen dostęp do panelu i wszystkich ustawień.',
|
|
74
107
|
deleteConfirmTitle: 'Usunąć użytkownika?',
|
|
75
108
|
deleteConfirmDescription: 'Ta akcja jest nieodwracalna. Użytkownik zostanie trwale usunięty.',
|
|
109
|
+
deleteWarningTitle: 'Tej operacji nie można cofnąć',
|
|
110
|
+
deleteWarningDesc: (name) => `Użytkownik <strong>${name}</strong> zostanie trwale usunięty wraz ze wszystkimi danymi.`,
|
|
111
|
+
deleteConfirmType: 'Wpisz <strong>USUŃ</strong>, żeby potwierdzić',
|
|
112
|
+
deleteConfirmWord: 'USUŃ',
|
|
76
113
|
userCreated: 'Użytkownik utworzony',
|
|
77
114
|
userUpdated: 'Użytkownik zaktualizowany',
|
|
78
115
|
userDeleted: 'Użytkownik usunięty',
|
|
79
116
|
cannotDeleteSelf: 'Nie możesz usunąć swojego konta',
|
|
80
117
|
cannotChangeSelfRole: 'Nie możesz zmienić swojej roli',
|
|
81
118
|
noResults: 'Nie znaleziono użytkowników',
|
|
82
|
-
generatePassword: '
|
|
119
|
+
generatePassword: 'Generuj',
|
|
120
|
+
filterByRole: 'Filtruj po roli',
|
|
121
|
+
allRoles: 'Wszystkie role',
|
|
122
|
+
showing: (start, end, total) => `Wyświetlono ${start}–${end} z ${total}`,
|
|
123
|
+
selected: (n) => `Zaznaczono: ${n}`,
|
|
124
|
+
changeRole: 'Zmień rolę',
|
|
125
|
+
emptyTitle: 'Brak użytkowników',
|
|
126
|
+
emptyDescription: 'Utwórz pierwszego użytkownika, żeby zacząć zarządzać zespołem.',
|
|
127
|
+
addUser: 'Dodaj użytkownika',
|
|
128
|
+
selectAll: 'Zaznacz wszystkich',
|
|
129
|
+
selectUser: 'Zaznacz użytkownika',
|
|
83
130
|
sessions: {
|
|
84
131
|
title: 'Sesje użytkownika',
|
|
85
132
|
noSessions: 'Brak aktywnych sesji',
|
|
@@ -104,11 +151,18 @@ export const usersLang = {
|
|
|
104
151
|
acceptDescription: 'Skonfiguruj swoje konto, aby rozpocząć.',
|
|
105
152
|
confirmPassword: 'Potwierdź hasło',
|
|
106
153
|
acceptInvite: 'Utwórz konto',
|
|
107
|
-
accepted: 'Konto utworzone!
|
|
154
|
+
accepted: 'Konto utworzone!',
|
|
155
|
+
goToLogin: 'Przejdź do logowania',
|
|
108
156
|
invalidToken: 'Nieprawidłowy lub wygasły link zaproszenia',
|
|
109
157
|
emailConfigRequired: 'Adapter e-mail nie jest skonfigurowany',
|
|
110
158
|
resend: 'Wyślij ponownie',
|
|
111
|
-
resent: 'Zaproszenie wysłane ponownie'
|
|
159
|
+
resent: 'Zaproszenie wysłane ponownie',
|
|
160
|
+
emailPlaceholder: 'jan@firma.pl',
|
|
161
|
+
emailHint: 'Użytkownik otrzyma e-mail z linkiem do utworzenia konta.',
|
|
162
|
+
roleHint: 'Możesz zmienić rolę później.',
|
|
163
|
+
expiringSoon: 'Wygasa wkrótce',
|
|
164
|
+
resendLabel: (email) => `Wyślij ponownie zaproszenie do ${email}`,
|
|
165
|
+
cancelLabel: (email) => `Anuluj zaproszenie dla ${email}`
|
|
112
166
|
}
|
|
113
167
|
}
|
|
114
168
|
};
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import * as Table from '../../../components/ui/table/index.js';
|
|
3
|
-
import { Badge } from '../../../components/ui/badge/index.js';
|
|
4
3
|
import Button from '../../../components/ui/button/button.svelte';
|
|
5
4
|
import Loader2 from '@tabler/icons-svelte/icons/loader-2';
|
|
6
|
-
import
|
|
7
|
-
import
|
|
5
|
+
import Refresh from '@tabler/icons-svelte/icons/refresh';
|
|
6
|
+
import X from '@tabler/icons-svelte/icons/x';
|
|
8
7
|
import { toast } from 'svelte-sonner';
|
|
9
8
|
import { usersLang } from './lang.js';
|
|
10
9
|
import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
|
|
11
10
|
import { toLocaleCode } from '../../utils/formatDate.js';
|
|
11
|
+
import { getRoleLabel } from '../../utils/roleLabel.js';
|
|
12
12
|
|
|
13
13
|
type Props = {
|
|
14
14
|
refreshTrigger?: number;
|
|
@@ -30,6 +30,12 @@
|
|
|
30
30
|
let invitations = $state<Invitation[]>([]);
|
|
31
31
|
let loading = $state(true);
|
|
32
32
|
|
|
33
|
+
const EXPIRING_SOON_MS = 48 * 60 * 60 * 1000;
|
|
34
|
+
|
|
35
|
+
function isExpiringSoon(expiresAt: string): boolean {
|
|
36
|
+
return new Date(expiresAt).getTime() - Date.now() < EXPIRING_SOON_MS;
|
|
37
|
+
}
|
|
38
|
+
|
|
33
39
|
$effect(() => {
|
|
34
40
|
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
35
41
|
refreshTrigger;
|
|
@@ -52,7 +58,7 @@
|
|
|
52
58
|
const res = await fetch('/admin/api/invite', {
|
|
53
59
|
method: 'PATCH',
|
|
54
60
|
headers: { 'Content-Type': 'application/json' },
|
|
55
|
-
body: JSON.stringify({ id })
|
|
61
|
+
body: JSON.stringify({ id, lang: interfaceLanguage.current })
|
|
56
62
|
});
|
|
57
63
|
|
|
58
64
|
if (res.ok) {
|
|
@@ -85,54 +91,84 @@
|
|
|
85
91
|
}
|
|
86
92
|
</script>
|
|
87
93
|
|
|
88
|
-
<
|
|
89
|
-
<
|
|
94
|
+
<section class="mt-10 users-fade-up" aria-labelledby="invitations-heading">
|
|
95
|
+
<div class="mb-4 flex items-center gap-2.5">
|
|
96
|
+
<h2 id="invitations-heading" class="text-lg font-semibold">{lang.invite.pendingInvitations}</h2>
|
|
97
|
+
{#if !loading && invitations.length > 0}
|
|
98
|
+
<span
|
|
99
|
+
class="inline-flex items-center justify-center rounded-full px-2 py-0.5 text-[11px] font-bold"
|
|
100
|
+
style="background: var(--warning-bg); color: var(--warning);"
|
|
101
|
+
>
|
|
102
|
+
{invitations.length}
|
|
103
|
+
</span>
|
|
104
|
+
{/if}
|
|
105
|
+
</div>
|
|
90
106
|
|
|
91
107
|
{#if loading}
|
|
92
108
|
<div class="flex items-center justify-center py-8">
|
|
93
|
-
<Loader2 class="
|
|
109
|
+
<Loader2 class="size-6 animate-spin" style="color: var(--muted-foreground);" />
|
|
94
110
|
</div>
|
|
95
111
|
{:else if invitations.length === 0}
|
|
96
|
-
<p class="
|
|
112
|
+
<p class="py-4 text-center text-sm" style="color: var(--muted-foreground);">
|
|
113
|
+
{lang.invite.noPending}
|
|
114
|
+
</p>
|
|
97
115
|
{:else}
|
|
98
|
-
<div class="overflow-hidden rounded-
|
|
116
|
+
<div class="overflow-hidden rounded-xl border bg-card shadow-sm">
|
|
99
117
|
<Table.Root>
|
|
100
118
|
<Table.Header>
|
|
101
|
-
<Table.Row>
|
|
119
|
+
<Table.Row class="bg-muted/50">
|
|
102
120
|
<Table.Head>{lang.email}</Table.Head>
|
|
103
121
|
<Table.Head>{lang.role}</Table.Head>
|
|
104
122
|
<Table.Head>{lang.invite.expires}</Table.Head>
|
|
105
|
-
<Table.Head class="
|
|
123
|
+
<Table.Head class="w-[100px]">
|
|
124
|
+
<span class="sr-only">{lang.actions}</span>
|
|
125
|
+
</Table.Head>
|
|
106
126
|
</Table.Row>
|
|
107
127
|
</Table.Header>
|
|
108
128
|
<Table.Body>
|
|
109
129
|
{#each invitations as inv (inv.id)}
|
|
110
|
-
<Table.Row>
|
|
111
|
-
<Table.Cell>{inv.email}</Table.Cell>
|
|
130
|
+
<Table.Row class="transition-colors hover:bg-[var(--lavender-lighter)]">
|
|
131
|
+
<Table.Cell class="font-medium">{inv.email}</Table.Cell>
|
|
112
132
|
<Table.Cell>
|
|
113
|
-
<
|
|
114
|
-
|
|
115
|
-
|
|
133
|
+
<span
|
|
134
|
+
class="users-role-badge"
|
|
135
|
+
class:users-role-admin={inv.role === 'admin'}
|
|
136
|
+
class:users-role-user={inv.role !== 'admin'}
|
|
137
|
+
>
|
|
138
|
+
{getRoleLabel(inv.role, interfaceLanguage.current)}
|
|
139
|
+
</span>
|
|
116
140
|
</Table.Cell>
|
|
117
|
-
<Table.Cell>
|
|
118
|
-
|
|
119
|
-
|
|
141
|
+
<Table.Cell>
|
|
142
|
+
<span
|
|
143
|
+
class="text-xs"
|
|
144
|
+
class:users-expiring-soon={isExpiringSoon(inv.expiresAt)}
|
|
145
|
+
style={isExpiringSoon(inv.expiresAt) ? '' : 'color: var(--muted-foreground);'}
|
|
146
|
+
>
|
|
147
|
+
{formatDate(inv.expiresAt)}
|
|
148
|
+
{#if isExpiringSoon(inv.expiresAt)}
|
|
149
|
+
— {lang.invite.expiringSoon}
|
|
150
|
+
{/if}
|
|
151
|
+
</span>
|
|
152
|
+
</Table.Cell>
|
|
153
|
+
<Table.Cell>
|
|
154
|
+
<div class="flex items-center justify-end gap-0.5">
|
|
120
155
|
<Button
|
|
121
156
|
variant="ghost"
|
|
122
157
|
size="icon"
|
|
123
158
|
class="h-8 w-8"
|
|
124
|
-
title={lang.invite.resend}
|
|
125
159
|
onclick={() => resendInvitation(inv.id)}
|
|
160
|
+
aria-label={lang.invite.resendLabel(inv.email)}
|
|
126
161
|
>
|
|
127
|
-
<
|
|
162
|
+
<Refresh class="size-4" />
|
|
128
163
|
</Button>
|
|
129
164
|
<Button
|
|
130
165
|
variant="ghost"
|
|
131
166
|
size="icon"
|
|
132
167
|
class="text-destructive h-8 w-8"
|
|
133
168
|
onclick={() => cancelInvitation(inv.id)}
|
|
169
|
+
aria-label={lang.invite.cancelLabel(inv.email)}
|
|
134
170
|
>
|
|
135
|
-
<
|
|
171
|
+
<X class="size-4" />
|
|
136
172
|
</Button>
|
|
137
173
|
</div>
|
|
138
174
|
</Table.Cell>
|
|
@@ -142,4 +178,4 @@
|
|
|
142
178
|
</Table.Root>
|
|
143
179
|
</div>
|
|
144
180
|
{/if}
|
|
145
|
-
</
|
|
181
|
+
</section>
|