@motor-cms/ui-admin 1.1.0-alpha.4 → 1.1.0-alpha.5
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/app/assets/css/v-onboarding.css +64 -0
- package/app/components/OnboardingStep.vue +42 -0
- package/app/components/UsersOnboarding.vue +84 -0
- package/app/components/client/FooterSlotCard.vue +313 -0
- package/app/components/client/GlobalComponentsSection.vue +65 -0
- package/app/components/dashboard/DashboardActivity.vue +71 -0
- package/app/components/dashboard/DashboardActivityItem.vue +96 -0
- package/app/components/dashboard/DashboardAnnouncementModal.vue +327 -0
- package/app/components/dashboard/DashboardAnnouncements.vue +93 -0
- package/app/components/dashboard/DashboardOnboarding.vue +285 -0
- package/app/components/dashboard/DashboardPublishingQueue.vue +47 -0
- package/app/components/dashboard/DashboardQuickActions.vue +44 -0
- package/app/components/dashboard/DashboardStats.vue +63 -0
- package/app/components/form/inputs/CategoryTreePicker.vue +265 -109
- package/app/components/form/inputs/EntityConfigurationsPanel.vue +235 -0
- package/app/composables/useClientFormExtensions.ts +89 -0
- package/app/composables/useClientLanguages.ts +81 -0
- package/app/composables/useDashboardData.ts +169 -0
- package/app/composables/useOnboardingState.ts +151 -0
- package/app/data/footerTemplate.ts +283 -0
- package/app/lang/de/motor-admin/ai_system_prompts.json +1 -0
- package/app/lang/de/motor-admin/categories.json +1 -0
- package/app/lang/de/motor-admin/category_trees.json +2 -1
- package/app/lang/de/motor-admin/clients.json +17 -1
- package/app/lang/de/motor-admin/config_variables.json +1 -0
- package/app/lang/de/motor-admin/dashboard.json +83 -0
- package/app/lang/de/motor-admin/domains.json +6 -1
- package/app/lang/de/motor-admin/email_templates.json +1 -0
- package/app/lang/de/motor-admin/entity_configurations.json +12 -0
- package/app/lang/de/motor-admin/languages.json +1 -0
- package/app/lang/de/motor-admin/onboarding.json +60 -0
- package/app/lang/de/motor-admin/permissions.json +1 -0
- package/app/lang/de/motor-admin/roles.json +1 -0
- package/app/lang/de/motor-admin/users.json +1 -0
- package/app/lang/en/motor-admin/ai_system_prompts.json +1 -0
- package/app/lang/en/motor-admin/categories.json +1 -0
- package/app/lang/en/motor-admin/category_trees.json +2 -1
- package/app/lang/en/motor-admin/clients.json +17 -1
- package/app/lang/en/motor-admin/config_variables.json +1 -0
- package/app/lang/en/motor-admin/dashboard.json +83 -0
- package/app/lang/en/motor-admin/domains.json +6 -1
- package/app/lang/en/motor-admin/email_templates.json +1 -0
- package/app/lang/en/motor-admin/entity_configurations.json +12 -0
- package/app/lang/en/motor-admin/languages.json +1 -0
- package/app/lang/en/motor-admin/onboarding.json +60 -0
- package/app/lang/en/motor-admin/permissions.json +1 -0
- package/app/lang/en/motor-admin/roles.json +1 -0
- package/app/lang/en/motor-admin/users.json +1 -0
- package/app/pages/index.vue +119 -22
- package/app/pages/login.vue +6 -0
- package/app/pages/motor-admin/ai-system-prompts/[id]/edit.vue +4 -4
- package/app/pages/motor-admin/category-trees/[id]/categories/[categoryId]/edit.vue +4 -3
- package/app/pages/motor-admin/category-trees/[id]/edit.vue +4 -4
- package/app/pages/motor-admin/clients/[id]/edit.vue +146 -6
- package/app/pages/motor-admin/clients/create.vue +34 -2
- package/app/pages/motor-admin/config-variables/[id]/edit.vue +4 -4
- package/app/pages/motor-admin/domains/[id]/edit.vue +18 -5
- package/app/pages/motor-admin/email-templates/[id]/edit.vue +4 -4
- package/app/pages/motor-admin/email-templates/index.vue +36 -25
- package/app/pages/motor-admin/languages/[id]/edit.vue +17 -4
- package/app/pages/motor-admin/languages/create.vue +13 -0
- package/app/pages/motor-admin/permission-groups/[id]/edit.vue +4 -4
- package/app/pages/motor-admin/roles/[id]/edit.vue +4 -4
- package/app/pages/motor-admin/roles/create.vue +4 -1
- package/app/pages/motor-admin/users/[id]/edit.vue +4 -3
- package/app/pages/motor-admin/users/index.vue +1 -0
- package/app/pages/profile.vue +47 -1
- package/app/pages/search.vue +13 -3
- package/app/types/generated/form-meta.ts +24 -20
- package/app/types/generated/grid-meta.ts +5 -3
- package/nuxt.config.ts +15 -1
- package/package.json +6 -2
- package/app/pages/dashboard.vue +0 -5
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"next": "Weiter",
|
|
3
|
+
"previous": "Zurück",
|
|
4
|
+
"finish": "Fertig",
|
|
5
|
+
"skip": "Überspringen",
|
|
6
|
+
"announcements": {
|
|
7
|
+
"step1_title": "Meldungen",
|
|
8
|
+
"step1_desc": "Dieses Panel zeigt wichtige Meldungen von Ihrem Team oder Systemadministratoren.",
|
|
9
|
+
"step2_title": "Meldungen lesen",
|
|
10
|
+
"step2_desc": "Jede Karte zeigt eine Nachricht mit ihrem Typ (Info, Warnung oder Fehler). Klicken Sie auf ×, um sie nach dem Lesen auszublenden.",
|
|
11
|
+
"step3_title": "Meldung erstellen",
|
|
12
|
+
"step3_desc": "Als Administrator können Sie Meldungen an sich selbst, bestimmte Nutzer oder alle im Mandanten senden."
|
|
13
|
+
},
|
|
14
|
+
"notifications": {
|
|
15
|
+
"step1_title": "Benachrichtigungscenter",
|
|
16
|
+
"step1_desc": "Der rote Zähler zeigt ungelesene Benachrichtigungen. Klicken Sie auf die Glocke, um das Benachrichtigungscenter zu öffnen — hier sehen Sie alle Meldungen mit Typ und Zeitstempel, können einzelne Einträge entfernen oder alle auf einmal löschen."
|
|
17
|
+
},
|
|
18
|
+
"search": {
|
|
19
|
+
"step1_title": "Globale Suche",
|
|
20
|
+
"step1_desc": "Mit der Suche finden Sie sofort Seiten, Benutzer, Dateien und weitere Inhalte im gesamten System. Einfach tippen – Ergebnisse erscheinen direkt während der Eingabe.",
|
|
21
|
+
"step2_title": "Tastaturkürzel",
|
|
22
|
+
"step2_desc": "Drücken Sie ⌘K (oder Strg+K unter Windows) von überall im Admin, um die Suche ohne Maus zu öffnen. Halten Sie ⌘ gedrückt, um alle verfügbaren Tastenkürzel anzuzeigen."
|
|
23
|
+
},
|
|
24
|
+
"admin_nav": {
|
|
25
|
+
"step1_title": "Navigationsbereich",
|
|
26
|
+
"step1_desc": "Über die Seitenleiste erreichen Sie alle Verwaltungsbereiche. Klicken Sie auf 'Administration', um Benutzer, Rollen und weitere Einstellungen zu verwalten. Als nächstes öffnen wir die Benutzerliste."
|
|
27
|
+
},
|
|
28
|
+
"admin_grid": {
|
|
29
|
+
"step1_title": "Datensätze bearbeiten",
|
|
30
|
+
"step1_desc": "In dieser Übersicht sehen Sie alle Benutzer. Klicken Sie einfach auf eine Zeile — der Datensatz öffnet sich direkt zum Bearbeiten."
|
|
31
|
+
},
|
|
32
|
+
"builder_pages_list": {
|
|
33
|
+
"step1_title": "Seite öffnen um die Tour zu starten",
|
|
34
|
+
"step1_desc": "Klicken Sie auf eine beliebige Zeile, um die Seite im Editor zu öffnen. Die Builder-Tour startet dann automatisch."
|
|
35
|
+
},
|
|
36
|
+
"builder_pages": {
|
|
37
|
+
"step1_title": "Seiteneditor",
|
|
38
|
+
"step1_desc": "Willkommen im Seiteneditor. Hier können Sie Inhalt und Layout dieser Seite visuell bearbeiten und gestalten.",
|
|
39
|
+
"step2_title": "Veröffentlichungsstatus",
|
|
40
|
+
"step2_desc": "Dieses Abzeichen zeigt, ob die Seite veröffentlicht, geplant oder ein Entwurf ist. Klicken Sie darauf, um die Seite zu veröffentlichen, zu planen oder offline zu nehmen.",
|
|
41
|
+
"step3_title": "Änderungsverlauf",
|
|
42
|
+
"step3_desc": "Machen Sie Änderungen mit den Pfeilschaltflächen rückgängig oder wiederholen Sie sie. Das Uhrsymbol öffnet den vollständigen Verlauf dieser Bearbeitungssitzung.",
|
|
43
|
+
"step4_title": "Bearbeiten & Vorschau",
|
|
44
|
+
"step4_desc": "Wechseln Sie zwischen Bearbeiten und einer schnellen Vorschau in Desktop-, Tablet- oder Mobilansicht — ohne Editor-Overlays. Kurzbefehle: E für Bearbeiten, D / T / M für die Vorschau-Modi. Für eine echte Vorschau auf der Live-Seite nutzen Sie den Vorschau-Button.",
|
|
45
|
+
"preview_button_title": "Vorschau auf der Live-Seite",
|
|
46
|
+
"preview_button_desc": "Der Vorschau-Button öffnet die aktuelle Seite (inkl. ungespeicherter Änderungen) in einem neuen Tab auf der echten Live-Seite — mit allen Stilen, Navigation und Interaktionen wie für Besucher.",
|
|
47
|
+
"step5_title": "Seitenstruktur",
|
|
48
|
+
"step5_desc": "Das Strukturpanel zeigt alle Zeilen und Komponenten Ihrer Seite als Baumansicht. Klicken Sie auf einen Eintrag, um ihn im Editor auszuwählen.",
|
|
49
|
+
"step6_title": "Layout-Zeilen",
|
|
50
|
+
"step6_desc": "Fügen Sie über das Layout-Panel einen neuen Bereich mit 1, 2, 3 oder 4 Spalten ein. Klicken Sie auf ein Layout oder ziehen Sie es auf den Editor.",
|
|
51
|
+
"step7_title": "Inhaltskomponenten",
|
|
52
|
+
"step7_desc": "Das Komponentenpanel listet alle verfügbaren Inhaltsbausteine auf — Überschriften, Bilder, Videos, Buttons und mehr. Klicken oder ziehen Sie eine Komponente in eine Spalte.",
|
|
53
|
+
"step8_title": "Der Editor",
|
|
54
|
+
"step8_desc": "Klicken Sie auf ein Element, um es auszuwählen und seine Eigenschaften rechts anzuzeigen. Ziehen Sie den Griff links einer Zeile, um Bereiche umzusortieren.",
|
|
55
|
+
"step9_title": "Element-Eigenschaften",
|
|
56
|
+
"step9_desc": "Wenn ein Element ausgewählt ist, erscheinen seine Eigenschaften hier. Bearbeiten Sie Inhalt, Darstellung und erweiterte Einstellungen. Der Navigationspfad oben führt zu übergeordneten Elementen.",
|
|
57
|
+
"step10_title": "Speichern",
|
|
58
|
+
"step10_desc": "Klicken Sie auf Speichern (oder drücken Sie Cmd+S). Der Dropdown-Pfeil ermöglicht Speichern und Schließen in einem Schritt. Ein pulsierender Punkt zeigt ungespeicherte Änderungen an."
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"position": "Position",
|
|
9
9
|
"create_title": "Berechtigungsgruppe erstellen",
|
|
10
10
|
"edit_title": "Berechtigungsgruppe bearbeiten",
|
|
11
|
+
"view_title": "Berechtigungsgruppe ansehen",
|
|
11
12
|
"created_success": "Berechtigungsgruppe erfolgreich erstellt.",
|
|
12
13
|
"updated_success": "Berechtigungsgruppe erfolgreich aktualisiert.",
|
|
13
14
|
"group_permissions": "Berechtigungen"
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"permissions": "Berechtigungen",
|
|
9
9
|
"create_title": "Rolle erstellen",
|
|
10
10
|
"edit_title": "Rolle bearbeiten",
|
|
11
|
+
"view_title": "Rolle ansehen",
|
|
11
12
|
"created_success": "Rolle erfolgreich erstellt.",
|
|
12
13
|
"updated_success": "Rolle erfolgreich aktualisiert.",
|
|
13
14
|
"guard_name": "Guard-Name",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"permissions": "Berechtigungen",
|
|
11
11
|
"create_title": "Benutzer erstellen",
|
|
12
12
|
"edit_title": "Benutzer bearbeiten",
|
|
13
|
+
"view_title": "Benutzer ansehen",
|
|
13
14
|
"created_success": "Benutzer wurde erfolgreich erstellt",
|
|
14
15
|
"updated_success": "Benutzer wurde erfolgreich aktualisiert",
|
|
15
16
|
"password": "Passwort",
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
"prompt_description": "The system prompt text sent to the AI model",
|
|
8
8
|
"create_title": "Create AI System Prompt",
|
|
9
9
|
"edit_title": "Edit AI System Prompt",
|
|
10
|
+
"view_title": "View AI System Prompt",
|
|
10
11
|
"created_success": "AI system prompt created successfully.",
|
|
11
12
|
"updated_success": "AI system prompt updated successfully."
|
|
12
13
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"add": "Add Category",
|
|
6
6
|
"create_title": "Create Category",
|
|
7
7
|
"edit_title": "Edit Category",
|
|
8
|
+
"view_title": "View Category",
|
|
8
9
|
"created_success": "Category was created successfully",
|
|
9
10
|
"updated_success": "Category was updated successfully",
|
|
10
11
|
"parent": "Parent Category",
|
|
@@ -6,9 +6,10 @@
|
|
|
6
6
|
"add": "Add Category Tree",
|
|
7
7
|
"create_title": "Create Category Tree",
|
|
8
8
|
"edit_title": "Edit Category Tree",
|
|
9
|
+
"view_title": "View Category Tree",
|
|
9
10
|
"created_success": "Category tree was created successfully",
|
|
10
11
|
"updated_success": "Category tree was updated successfully",
|
|
11
|
-
"children": "
|
|
12
|
+
"children": "Categories",
|
|
12
13
|
"children_title": "Categories in \"{name}\"",
|
|
13
14
|
"children_subtitle": "Manage categories within this tree"
|
|
14
15
|
}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"add": "Add Client",
|
|
7
7
|
"create_title": "Create Client",
|
|
8
8
|
"edit_title": "Edit Client",
|
|
9
|
+
"view_title": "View Client",
|
|
9
10
|
"created_success": "Client successfully created.",
|
|
10
11
|
"updated_success": "Client successfully updated.",
|
|
11
12
|
"slug": "Slug",
|
|
@@ -22,5 +23,20 @@
|
|
|
22
23
|
"contact_phone": "Phone",
|
|
23
24
|
"group_address": "Address",
|
|
24
25
|
"group_contact": "Contact",
|
|
25
|
-
"group_other": "Other"
|
|
26
|
+
"group_other": "Other",
|
|
27
|
+
"frontend_config_title": "Frontend Configuration",
|
|
28
|
+
"global_components": {
|
|
29
|
+
"title": "Global Components",
|
|
30
|
+
"footer": "Footer",
|
|
31
|
+
"no_footer": "No footer configured",
|
|
32
|
+
"create_footer": "Create Footer",
|
|
33
|
+
"edit_footer": "Edit Footer",
|
|
34
|
+
"unlink_footer": "Unlink",
|
|
35
|
+
"footer_created": "Footer created successfully.",
|
|
36
|
+
"published": "Published",
|
|
37
|
+
"draft": "Draft",
|
|
38
|
+
"unlink_confirm": "Are you sure you want to unlink this footer?",
|
|
39
|
+
"unlink_effect": "The footer will not be deleted, only the link to the client will be removed.",
|
|
40
|
+
"no_languages": "No languages configured for this client. Add navigation trees first."
|
|
41
|
+
}
|
|
26
42
|
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"is_invisible": "Hidden",
|
|
10
10
|
"create_title": "Create Config Variable",
|
|
11
11
|
"edit_title": "Edit Config Variable",
|
|
12
|
+
"view_title": "View Config Variable",
|
|
12
13
|
"created_success": "Config variable created successfully.",
|
|
13
14
|
"updated_success": "Config variable updated successfully."
|
|
14
15
|
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
{
|
|
2
|
+
"welcome": "Welcome, {name}",
|
|
3
|
+
"announcement_created": "Announcement created",
|
|
4
|
+
"announcement_dismissed": "Announcement dismissed",
|
|
5
|
+
"stats": {
|
|
6
|
+
"pages": "Pages",
|
|
7
|
+
"pages_total": "Total",
|
|
8
|
+
"drafts": "Drafts",
|
|
9
|
+
"drafts_subtitle": "In progress",
|
|
10
|
+
"scheduled": "Scheduled",
|
|
11
|
+
"scheduled_subtitle": "Publishing",
|
|
12
|
+
"media": "Media",
|
|
13
|
+
"media_subtitle": "Files"
|
|
14
|
+
},
|
|
15
|
+
"activity": {
|
|
16
|
+
"title": "Recent Activity",
|
|
17
|
+
"empty": "No activity yet",
|
|
18
|
+
"unknown": "Unknown",
|
|
19
|
+
"system": "System",
|
|
20
|
+
"verbs": {
|
|
21
|
+
"created": "created",
|
|
22
|
+
"updated": "updated",
|
|
23
|
+
"deleted": "deleted",
|
|
24
|
+
"published": "published",
|
|
25
|
+
"unpublished": "unpublished"
|
|
26
|
+
},
|
|
27
|
+
"types": {
|
|
28
|
+
"page": "Page",
|
|
29
|
+
"navigation": "Navigation",
|
|
30
|
+
"media": "Media",
|
|
31
|
+
"content_type": "Content type",
|
|
32
|
+
"assistant": "Assistant",
|
|
33
|
+
"scoring": "Scoring",
|
|
34
|
+
"scheduled": "Scheduled",
|
|
35
|
+
"approval": "Approval",
|
|
36
|
+
"seo": "SEO",
|
|
37
|
+
"search": "Search"
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"announcements": {
|
|
41
|
+
"title": "Announcements",
|
|
42
|
+
"empty": "No announcements",
|
|
43
|
+
"modal_title": "New Announcement",
|
|
44
|
+
"field_title": "Title",
|
|
45
|
+
"field_title_placeholder": "Enter announcement...",
|
|
46
|
+
"field_body": "Description",
|
|
47
|
+
"field_body_placeholder": "Optional details...",
|
|
48
|
+
"field_type": "Type",
|
|
49
|
+
"field_audience": "Audience",
|
|
50
|
+
"field_users": "Select users",
|
|
51
|
+
"field_users_placeholder": "Search users...",
|
|
52
|
+
"field_client": "Select client",
|
|
53
|
+
"field_client_placeholder": "Choose a client...",
|
|
54
|
+
"field_link": "Link (optional)",
|
|
55
|
+
"field_link_type_placeholder": "Select type...",
|
|
56
|
+
"field_link_item": "Item",
|
|
57
|
+
"field_link_item_placeholder": "Search item...",
|
|
58
|
+
"field_starts_at": "Visible from",
|
|
59
|
+
"field_expires_at": "Visible until",
|
|
60
|
+
"cancel": "Cancel",
|
|
61
|
+
"create": "Create",
|
|
62
|
+
"type_info": "Info",
|
|
63
|
+
"type_warning": "Warning",
|
|
64
|
+
"type_error": "Error",
|
|
65
|
+
"audience_self": "Only me",
|
|
66
|
+
"audience_users": "Specific users",
|
|
67
|
+
"audience_client": "Everyone in client",
|
|
68
|
+
"linkable_page": "Page",
|
|
69
|
+
"linkable_navigation": "Navigation item",
|
|
70
|
+
"linkable_file": "File",
|
|
71
|
+
"linkable_content_type": "Content type"
|
|
72
|
+
},
|
|
73
|
+
"quick_actions": {
|
|
74
|
+
"title": "Quick Actions",
|
|
75
|
+
"new_page": "New Page",
|
|
76
|
+
"upload_media": "Upload Media",
|
|
77
|
+
"navigation": "Navigation"
|
|
78
|
+
},
|
|
79
|
+
"publishing_queue": {
|
|
80
|
+
"title": "Scheduled Publications",
|
|
81
|
+
"empty": "No scheduled publications"
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"add": "Add Domain",
|
|
6
6
|
"create_title": "Create Domain",
|
|
7
7
|
"edit_title": "Edit Domain",
|
|
8
|
+
"view_title": "View Domain",
|
|
8
9
|
"created_success": "Domain successfully created.",
|
|
9
10
|
"updated_success": "Domain successfully updated.",
|
|
10
11
|
"host": "Host",
|
|
@@ -13,6 +14,10 @@
|
|
|
13
14
|
"path": "Path",
|
|
14
15
|
"target": "Target",
|
|
15
16
|
"parameters": "Parameters",
|
|
17
|
+
"is_preview_domain": "Preview Domain",
|
|
18
|
+
"is_canonical": "Canonical Domain for SEO",
|
|
19
|
+
"is_canonical_description": "When this client has multiple domains (e.g. vanity URLs): this is the canonical domain — canonical tags point here and consolidate SEO signal. Only one domain per client can be canonical.",
|
|
16
20
|
"group_connection": "Connection",
|
|
17
|
-
"group_routing": "Routing"
|
|
21
|
+
"group_routing": "Routing",
|
|
22
|
+
"group_seo": "SEO"
|
|
18
23
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"add": "Add Email Template",
|
|
6
6
|
"create_title": "Create Email Template",
|
|
7
7
|
"edit_title": "Edit Email Template",
|
|
8
|
+
"view_title": "View Email Template",
|
|
8
9
|
"slug": "Slug",
|
|
9
10
|
"slug_description": "URL-friendly identifier, auto-generated from name",
|
|
10
11
|
"subject": "Subject",
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"title": "Entity Configurations",
|
|
3
|
+
"config_variable": "Config Variable",
|
|
4
|
+
"value": "Value",
|
|
5
|
+
"add": "Add Configuration",
|
|
6
|
+
"save": "Save",
|
|
7
|
+
"saved": "Configuration saved",
|
|
8
|
+
"removed": "Configuration removed",
|
|
9
|
+
"no_configurations": "No configurations assigned yet.",
|
|
10
|
+
"select_variable": "Select a config variable",
|
|
11
|
+
"confirm_remove": "Remove this configuration?"
|
|
12
|
+
}
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"native_name": "Native Name",
|
|
10
10
|
"create_title": "Create Language",
|
|
11
11
|
"edit_title": "Edit Language",
|
|
12
|
+
"view_title": "View Language",
|
|
12
13
|
"created_success": "Language created successfully.",
|
|
13
14
|
"updated_success": "Language updated successfully.",
|
|
14
15
|
"iso_639_1": "ISO 639-1 Code",
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"next": "Next",
|
|
3
|
+
"previous": "Previous",
|
|
4
|
+
"finish": "Done",
|
|
5
|
+
"skip": "Skip",
|
|
6
|
+
"announcements": {
|
|
7
|
+
"step1_title": "Announcements",
|
|
8
|
+
"step1_desc": "This panel shows important announcements from your team or system administrators.",
|
|
9
|
+
"step2_title": "Reading announcements",
|
|
10
|
+
"step2_desc": "Each card shows a message with its type (info, warning, or error). Click the × to dismiss it once you have read it.",
|
|
11
|
+
"step3_title": "Create an announcement",
|
|
12
|
+
"step3_desc": "As an admin you can post announcements to yourself, specific users, or everyone in your client."
|
|
13
|
+
},
|
|
14
|
+
"notifications": {
|
|
15
|
+
"step1_title": "Notification center",
|
|
16
|
+
"step1_desc": "The red counter shows unread notifications. Click the bell to open the notification center — here you can see all messages with type and timestamp, remove individual entries, or clear all at once."
|
|
17
|
+
},
|
|
18
|
+
"search": {
|
|
19
|
+
"step1_title": "Global search",
|
|
20
|
+
"step1_desc": "Use the search to instantly find pages, users, files, and other content across the entire system. Just start typing and results appear as you go.",
|
|
21
|
+
"step2_title": "Keyboard shortcut",
|
|
22
|
+
"step2_desc": "Press ⌘K (or Ctrl+K on Windows) from anywhere in the admin to open search without reaching for the mouse. Hold ⌘ to see all available shortcuts."
|
|
23
|
+
},
|
|
24
|
+
"admin_nav": {
|
|
25
|
+
"step1_title": "Navigation",
|
|
26
|
+
"step1_desc": "Use the sidebar to access all administration areas. Click on 'Administration' to manage users, roles, and other settings. Next, we will open the users list."
|
|
27
|
+
},
|
|
28
|
+
"admin_grid": {
|
|
29
|
+
"step1_title": "Editing records",
|
|
30
|
+
"step1_desc": "This overview shows all users. Simply click on any row — the record opens directly for editing."
|
|
31
|
+
},
|
|
32
|
+
"builder_pages_list": {
|
|
33
|
+
"step1_title": "Open a page to start the tour",
|
|
34
|
+
"step1_desc": "Click on any row to open the page in the builder editor. The builder tour will start automatically."
|
|
35
|
+
},
|
|
36
|
+
"builder_pages": {
|
|
37
|
+
"step1_title": "Page Builder",
|
|
38
|
+
"step1_desc": "Welcome to the page builder. Here you can visually build and edit the content and layout of this page.",
|
|
39
|
+
"step2_title": "Publishing status",
|
|
40
|
+
"step2_desc": "This badge shows whether the page is published, scheduled, or a draft. Click it to publish, schedule, or take the page offline.",
|
|
41
|
+
"step3_title": "Edit history",
|
|
42
|
+
"step3_desc": "Undo or redo your last changes with the arrow buttons. The clock icon opens the full change history for this editing session.",
|
|
43
|
+
"step4_title": "Edit & preview",
|
|
44
|
+
"step4_desc": "Switch between edit mode and a quick desktop / tablet / mobile preview — without editor overlays. Shortcuts: E for edit, D / T / M for the preview modes. Use the Preview button for a real live-site preview.",
|
|
45
|
+
"preview_button_title": "Preview on the live site",
|
|
46
|
+
"preview_button_desc": "The Preview button opens the current page (including unsaved changes) in a new tab on the real live site — with full styles, navigation, and interactions, exactly as visitors would see it.",
|
|
47
|
+
"step5_title": "Page outline",
|
|
48
|
+
"step5_desc": "The outline panel shows all rows and components on your page as a tree. Click any item to select it on the canvas.",
|
|
49
|
+
"step6_title": "Layout rows",
|
|
50
|
+
"step6_desc": "Use the layout panel to add a new section with 1, 2, 3, or 4 columns. Click a layout to insert it, or drag it onto the canvas.",
|
|
51
|
+
"step7_title": "Content components",
|
|
52
|
+
"step7_desc": "The components panel lists all available content blocks — headings, images, videos, buttons, and more. Click or drag a component to add it inside a column.",
|
|
53
|
+
"step8_title": "The canvas",
|
|
54
|
+
"step8_desc": "Click any element on the canvas to select it and reveal its properties on the right. Drag the handle on the left of a row to reorder sections.",
|
|
55
|
+
"step9_title": "Element properties",
|
|
56
|
+
"step9_desc": "When an element is selected, its properties appear here. Edit content, change styling, and configure advanced settings. The breadcrumb at the top lets you navigate to parent elements.",
|
|
57
|
+
"step10_title": "Save your work",
|
|
58
|
+
"step10_desc": "Click Save (or press Cmd+S) to save your changes. The dropdown arrow lets you save and close in one step. A pulsing dot indicates unsaved changes."
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"position": "Position",
|
|
9
9
|
"create_title": "Create Permission Group",
|
|
10
10
|
"edit_title": "Edit Permission Group",
|
|
11
|
+
"view_title": "View Permission Group",
|
|
11
12
|
"created_success": "Permission group created successfully.",
|
|
12
13
|
"updated_success": "Permission group updated successfully.",
|
|
13
14
|
"group_permissions": "Permissions"
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"permissions": "Permissions",
|
|
11
11
|
"create_title": "Create User",
|
|
12
12
|
"edit_title": "Edit User",
|
|
13
|
+
"view_title": "View User",
|
|
13
14
|
"created_success": "User was created successfully",
|
|
14
15
|
"updated_success": "User was updated successfully",
|
|
15
16
|
"password": "Password",
|
package/app/pages/index.vue
CHANGED
|
@@ -1,39 +1,136 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import type { User } from '@motor-cms/ui-core/app/types/auth'
|
|
3
3
|
|
|
4
|
+
definePageMeta({
|
|
5
|
+
permission: 'dashboard.read',
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
const { t, locale } = useI18n()
|
|
4
9
|
const { user } = useSanctumAuth<User>()
|
|
5
|
-
const {
|
|
6
|
-
const { t } = useI18n()
|
|
10
|
+
const { can } = usePermissions()
|
|
7
11
|
|
|
8
|
-
|
|
9
|
-
const userData = computed(() => user.value?.data)
|
|
12
|
+
const canCreateAnnouncements = computed(() => can('dashboard-announcements.write'))
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
const {
|
|
15
|
+
stats,
|
|
16
|
+
activity,
|
|
17
|
+
activityLoadingMore,
|
|
18
|
+
hasMoreActivity,
|
|
19
|
+
publishingQueue,
|
|
20
|
+
announcements,
|
|
21
|
+
loading,
|
|
22
|
+
refresh,
|
|
23
|
+
loadMoreActivity,
|
|
24
|
+
dismissAnnouncement,
|
|
25
|
+
} = useDashboardData()
|
|
26
|
+
|
|
27
|
+
const announcementModalOpen = ref(false)
|
|
28
|
+
const createPageModalOpen = ref(false)
|
|
29
|
+
|
|
30
|
+
const currentDate = computed(() => {
|
|
31
|
+
return new Date().toLocaleDateString(locale.value, {
|
|
32
|
+
weekday: 'long',
|
|
33
|
+
day: 'numeric',
|
|
34
|
+
month: 'long',
|
|
35
|
+
year: 'numeric',
|
|
36
|
+
})
|
|
14
37
|
})
|
|
38
|
+
|
|
39
|
+
function onPageCreated(page: { id: number }) {
|
|
40
|
+
navigateTo(`/motor-builder/builder-pages/${page.id}/edit`)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function onAnnouncementCreated() {
|
|
44
|
+
refresh()
|
|
45
|
+
toast.add({ title: t('motor-admin.dashboard.announcement_created'), icon: 'i-lucide-megaphone', color: 'success' })
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const toast = useToast()
|
|
49
|
+
|
|
50
|
+
async function onDismiss(id: number) {
|
|
51
|
+
await dismissAnnouncement(id)
|
|
52
|
+
toast.add({ title: t('motor-admin.dashboard.announcement_dismissed'), icon: 'i-lucide-check', color: 'success' })
|
|
53
|
+
}
|
|
15
54
|
</script>
|
|
16
55
|
|
|
17
56
|
<template>
|
|
18
57
|
<div class="p-6">
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
<
|
|
58
|
+
<div class="flex items-center gap-2 mb-3">
|
|
59
|
+
<UDashboardSidebarToggle class="lg:hidden shrink-0 -ml-2" />
|
|
60
|
+
<SidebarToggleButton />
|
|
61
|
+
<UBreadcrumb :items="[{ label: t('motor-core.global.dashboard') }]" />
|
|
22
62
|
</div>
|
|
63
|
+
<div class="flex flex-col mb-6">
|
|
64
|
+
<div>
|
|
65
|
+
<h1 class="text-xl font-heading font-semibold text-highlighted">
|
|
66
|
+
{{ t('motor-admin.dashboard.welcome', { name: user?.data?.name ?? '' }) }}
|
|
67
|
+
</h1>
|
|
68
|
+
<p class="text-sm text-dimmed mt-1">
|
|
69
|
+
{{ currentDate }}
|
|
70
|
+
</p>
|
|
71
|
+
</div>
|
|
72
|
+
<div class="flex items-center gap-2 mt-3 self-end">
|
|
73
|
+
<UButton
|
|
74
|
+
icon="i-lucide-plus"
|
|
75
|
+
color="primary"
|
|
76
|
+
size="sm"
|
|
77
|
+
:label="t('motor-admin.dashboard.quick_actions.new_page')"
|
|
78
|
+
@click="createPageModalOpen = true"
|
|
79
|
+
/>
|
|
80
|
+
<UButton
|
|
81
|
+
icon="i-lucide-upload"
|
|
82
|
+
color="neutral"
|
|
83
|
+
variant="outline"
|
|
84
|
+
size="sm"
|
|
85
|
+
:label="t('motor-admin.dashboard.quick_actions.upload_media')"
|
|
86
|
+
@click="navigateTo('/motor-media/files/create')"
|
|
87
|
+
/>
|
|
88
|
+
<UButton
|
|
89
|
+
icon="i-lucide-menu"
|
|
90
|
+
color="neutral"
|
|
91
|
+
variant="outline"
|
|
92
|
+
size="sm"
|
|
93
|
+
:label="t('motor-admin.dashboard.quick_actions.navigation')"
|
|
94
|
+
to="/motor-builder/navigation-trees"
|
|
95
|
+
/>
|
|
96
|
+
</div>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<DashboardStats :stats="stats" :loading="loading" class="mb-6" />
|
|
23
100
|
|
|
24
|
-
<div class="
|
|
25
|
-
<
|
|
26
|
-
|
|
27
|
-
|
|
101
|
+
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
102
|
+
<DashboardActivity
|
|
103
|
+
:items="activity"
|
|
104
|
+
:loading="loading"
|
|
105
|
+
:loading-more="activityLoadingMore"
|
|
106
|
+
:has-more="hasMoreActivity"
|
|
107
|
+
@load-more="loadMoreActivity"
|
|
108
|
+
/>
|
|
109
|
+
|
|
110
|
+
<div class="flex flex-col gap-4">
|
|
111
|
+
<DashboardAnnouncements
|
|
112
|
+
:items="announcements"
|
|
113
|
+
:loading="loading"
|
|
114
|
+
:can-create="canCreateAnnouncements"
|
|
115
|
+
@dismiss="onDismiss"
|
|
116
|
+
@create="announcementModalOpen = true"
|
|
117
|
+
/>
|
|
118
|
+
<DashboardPublishingQueue :items="publishingQueue" :loading="loading" />
|
|
119
|
+
</div>
|
|
28
120
|
</div>
|
|
29
121
|
|
|
30
|
-
<
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
122
|
+
<DashboardAnnouncementModal
|
|
123
|
+
v-model:open="announcementModalOpen"
|
|
124
|
+
@created="onAnnouncementCreated"
|
|
125
|
+
/>
|
|
126
|
+
|
|
127
|
+
<DashboardOnboarding />
|
|
128
|
+
|
|
129
|
+
<BuilderPageSettingsModal
|
|
130
|
+
v-model:open="createPageModalOpen"
|
|
131
|
+
:page-data="null"
|
|
132
|
+
:is-create-mode="true"
|
|
133
|
+
@created="onPageCreated"
|
|
134
|
+
/>
|
|
38
135
|
</div>
|
|
39
136
|
</template>
|
package/app/pages/login.vue
CHANGED
|
@@ -4,6 +4,7 @@ import type { FormSubmitEvent } from '@nuxt/ui'
|
|
|
4
4
|
|
|
5
5
|
const { t } = useI18n()
|
|
6
6
|
const { login } = useSanctumAuth()
|
|
7
|
+
const toast = useToast()
|
|
7
8
|
|
|
8
9
|
definePageMeta({
|
|
9
10
|
layout: 'auth',
|
|
@@ -53,6 +54,11 @@ async function onSubmit(event: FormSubmitEvent<Schema>) {
|
|
|
53
54
|
email: event.data.email,
|
|
54
55
|
password: event.data.password
|
|
55
56
|
})
|
|
57
|
+
toast.add({
|
|
58
|
+
title: t('motor-core.login.login_success'),
|
|
59
|
+
color: 'success',
|
|
60
|
+
icon: 'i-lucide-check-circle'
|
|
61
|
+
})
|
|
56
62
|
} catch {
|
|
57
63
|
error.value = t('motor-core.login.login_failed')
|
|
58
64
|
} finally {
|
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
import { aISystemPromptFormMeta } from '../../../../types/generated/form-meta'
|
|
4
4
|
import { aiSystemPromptFormConfig, aiSystemPromptSelectOptionConfigs } from '@motor-cms/ui-core/app/types/config/ai-system-prompt'
|
|
5
5
|
|
|
6
|
-
definePageMeta({ layout: 'default', permission: 'ai-system-prompts.
|
|
6
|
+
definePageMeta({ layout: 'default', permission: 'ai-system-prompts.read' })
|
|
7
7
|
|
|
8
8
|
const route = useRoute()
|
|
9
|
-
const {
|
|
10
|
-
const { fields, schema, groups, state, loading, fetching, fetchError, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
9
|
+
const { fields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
11
10
|
apiEndpoint: '/api/v2/ai-system-prompts',
|
|
12
11
|
routePrefix: '/motor-admin/ai-system-prompts',
|
|
13
12
|
translationPrefix: 'motor-admin.ai_system_prompts',
|
|
@@ -21,13 +20,14 @@ const { fields, schema, groups, state, loading, fetching, fetchError, formRef, s
|
|
|
21
20
|
|
|
22
21
|
<template>
|
|
23
22
|
<FormPage
|
|
24
|
-
:title="
|
|
23
|
+
:title="pageTitle"
|
|
25
24
|
back-route="/motor-admin/ai-system-prompts"
|
|
26
25
|
:loading="fetching"
|
|
27
26
|
:error="fetchError"
|
|
28
27
|
>
|
|
29
28
|
<FormBase
|
|
30
29
|
ref="formRef"
|
|
30
|
+
:disabled="!canWrite"
|
|
31
31
|
v-model:state="state"
|
|
32
32
|
:fields="fields"
|
|
33
33
|
:schema="schema"
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
import { categoryFormMeta } from '@motor-cms/ui-core/app/types/generated/form-meta'
|
|
4
4
|
import { categoryFormConfig } from '@motor-cms/ui-core/app/types/config/category'
|
|
5
5
|
|
|
6
|
-
definePageMeta({ layout: 'default', permission: 'categories.
|
|
6
|
+
definePageMeta({ layout: 'default', permission: 'categories.read' })
|
|
7
7
|
|
|
8
8
|
const route = useRoute()
|
|
9
9
|
const { t } = useI18n()
|
|
10
10
|
const treeId = route.params.id as string
|
|
11
11
|
const categoryId = route.params.categoryId as string
|
|
12
12
|
|
|
13
|
-
const { fields, schema, groups, state, loading, fetching, fetchError, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
13
|
+
const { fields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
14
14
|
apiEndpoint: `/api/v2/category-trees/${treeId}/categories`,
|
|
15
15
|
routePrefix: `/motor-admin/category-trees/${treeId}`,
|
|
16
16
|
translationPrefix: 'motor-admin.categories',
|
|
@@ -26,13 +26,14 @@ const { fields, schema, groups, state, loading, fetching, fetchError, formRef, s
|
|
|
26
26
|
|
|
27
27
|
<template>
|
|
28
28
|
<FormPage
|
|
29
|
-
:title="
|
|
29
|
+
:title="pageTitle"
|
|
30
30
|
:back-route="`/motor-admin/category-trees/${treeId}`"
|
|
31
31
|
:loading="fetching"
|
|
32
32
|
:error="fetchError"
|
|
33
33
|
>
|
|
34
34
|
<FormBase
|
|
35
35
|
ref="formRef"
|
|
36
|
+
:disabled="!canWrite"
|
|
36
37
|
v-model:state="state"
|
|
37
38
|
:fields="fields"
|
|
38
39
|
:schema="schema"
|