@motor-cms/ui-admin 1.6.0 → 1.8.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/app/assets/css/v-onboarding.css +64 -0
- package/app/components/UsersOnboarding.vue +65 -0
- package/app/components/dashboard/DashboardActivityItem.vue +3 -3
- package/app/components/dashboard/DashboardAnnouncements.vue +8 -3
- package/app/components/dashboard/DashboardOnboarding.vue +223 -0
- package/app/composables/useOnboardingState.ts +101 -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 +1 -0
- package/app/lang/de/motor-admin/clients.json +1 -0
- package/app/lang/de/motor-admin/config_variables.json +1 -0
- package/app/lang/de/motor-admin/domains.json +1 -0
- package/app/lang/de/motor-admin/email_templates.json +1 -0
- package/app/lang/de/motor-admin/languages.json +1 -0
- package/app/lang/de/motor-admin/onboarding.json +57 -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 +1 -0
- package/app/lang/en/motor-admin/clients.json +1 -0
- package/app/lang/en/motor-admin/config_variables.json +1 -0
- package/app/lang/en/motor-admin/domains.json +1 -0
- package/app/lang/en/motor-admin/email_templates.json +1 -0
- package/app/lang/en/motor-admin/languages.json +1 -0
- package/app/lang/en/motor-admin/onboarding.json +57 -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 +2 -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 +4 -4
- package/app/pages/motor-admin/config-variables/[id]/edit.vue +4 -4
- package/app/pages/motor-admin/domains/[id]/edit.vue +4 -4
- package/app/pages/motor-admin/email-templates/[id]/edit.vue +4 -4
- package/app/pages/motor-admin/languages/[id]/edit.vue +4 -4
- 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/users/[id]/edit.vue +4 -3
- package/app/pages/motor-admin/users/index.vue +1 -0
- package/app/pages/profile.vue +46 -1
- package/app/pages/search.vue +5 -0
- package/nuxt.config.ts +8 -1
- package/package.json +2 -2
|
@@ -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,6 +6,7 @@
|
|
|
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
12
|
"children": "Children",
|
|
@@ -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
|
}
|
|
@@ -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",
|
|
@@ -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,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"next": "Next",
|
|
3
|
+
"previous": "Previous",
|
|
4
|
+
"finish": "Done",
|
|
5
|
+
"announcements": {
|
|
6
|
+
"step1_title": "Announcements",
|
|
7
|
+
"step1_desc": "This panel shows important announcements from your team or system administrators.",
|
|
8
|
+
"step2_title": "Reading announcements",
|
|
9
|
+
"step2_desc": "Each card shows a message with its type (info, warning, or error). Click the × to dismiss it once you have read it.",
|
|
10
|
+
"step3_title": "Create an announcement",
|
|
11
|
+
"step3_desc": "As an admin you can post announcements to yourself, specific users, or everyone in your client."
|
|
12
|
+
},
|
|
13
|
+
"notifications": {
|
|
14
|
+
"step1_title": "Notification center",
|
|
15
|
+
"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."
|
|
16
|
+
},
|
|
17
|
+
"search": {
|
|
18
|
+
"step1_title": "Global search",
|
|
19
|
+
"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.",
|
|
20
|
+
"step2_title": "Keyboard shortcut",
|
|
21
|
+
"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."
|
|
22
|
+
},
|
|
23
|
+
"admin_nav": {
|
|
24
|
+
"step1_title": "Navigation",
|
|
25
|
+
"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."
|
|
26
|
+
},
|
|
27
|
+
"admin_grid": {
|
|
28
|
+
"step1_title": "Editing records",
|
|
29
|
+
"step1_desc": "This overview shows all users. Simply click on any row — the record opens directly for editing."
|
|
30
|
+
},
|
|
31
|
+
"builder_pages_list": {
|
|
32
|
+
"step1_title": "Open a page to start the tour",
|
|
33
|
+
"step1_desc": "Click on any row to open the page in the builder editor. The builder tour will start automatically."
|
|
34
|
+
},
|
|
35
|
+
"builder_pages": {
|
|
36
|
+
"step1_title": "Page Builder",
|
|
37
|
+
"step1_desc": "Welcome to the page builder. Here you can visually build and edit the content and layout of this page.",
|
|
38
|
+
"step2_title": "Publishing status",
|
|
39
|
+
"step2_desc": "This badge shows whether the page is published, scheduled, or a draft. Click it to publish, schedule, or take the page offline.",
|
|
40
|
+
"step3_title": "Edit history",
|
|
41
|
+
"step3_desc": "Undo or redo your last changes with the arrow buttons. The clock icon opens the full change history for this editing session.",
|
|
42
|
+
"step4_title": "Device preview",
|
|
43
|
+
"step4_desc": "Switch between desktop, tablet, and mobile views to see how your page looks on different screen sizes.",
|
|
44
|
+
"step5_title": "Page outline",
|
|
45
|
+
"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.",
|
|
46
|
+
"step6_title": "Layout rows",
|
|
47
|
+
"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.",
|
|
48
|
+
"step7_title": "Content components",
|
|
49
|
+
"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.",
|
|
50
|
+
"step8_title": "The canvas",
|
|
51
|
+
"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.",
|
|
52
|
+
"step9_title": "Element properties",
|
|
53
|
+
"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.",
|
|
54
|
+
"step10_title": "Save your work",
|
|
55
|
+
"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."
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -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
|
@@ -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"
|
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
import { categoryTreeFormMeta } from '@motor-cms/ui-core/app/types/generated/form-meta'
|
|
4
4
|
import { categoryTreeEditFormConfig } from '@motor-cms/ui-core/app/types/config/category-tree'
|
|
5
5
|
|
|
6
|
-
definePageMeta({ layout: 'default', permission: 'category-trees.
|
|
6
|
+
definePageMeta({ layout: 'default', permission: 'category-trees.read' })
|
|
7
7
|
|
|
8
8
|
const route = useRoute()
|
|
9
|
-
const {
|
|
10
|
-
const { fields, schema, groups, state, loading, fetching, fetchError, formRef, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
9
|
+
const { fields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
11
10
|
apiEndpoint: '/api/v2/category-trees',
|
|
12
11
|
routePrefix: '/motor-admin/category-trees',
|
|
13
12
|
translationPrefix: 'motor-admin.category_trees',
|
|
@@ -20,13 +19,14 @@ const { fields, schema, groups, state, loading, fetching, fetchError, formRef, o
|
|
|
20
19
|
|
|
21
20
|
<template>
|
|
22
21
|
<FormPage
|
|
23
|
-
:title="
|
|
22
|
+
:title="pageTitle"
|
|
24
23
|
back-route="/motor-admin/category-trees"
|
|
25
24
|
:loading="fetching"
|
|
26
25
|
:error="fetchError"
|
|
27
26
|
>
|
|
28
27
|
<FormBase
|
|
29
28
|
ref="formRef"
|
|
29
|
+
:disabled="!canWrite"
|
|
30
30
|
v-model:state="state"
|
|
31
31
|
:fields="fields"
|
|
32
32
|
:schema="schema"
|
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
import { clientFormMeta } from '../../../../types/generated/form-meta'
|
|
4
4
|
import { clientFormConfig } from '@motor-cms/ui-core/app/types/config/client'
|
|
5
5
|
|
|
6
|
-
definePageMeta({ layout: 'default', permission: 'clients.
|
|
6
|
+
definePageMeta({ layout: 'default', permission: 'clients.read' })
|
|
7
7
|
|
|
8
8
|
const route = useRoute()
|
|
9
|
-
const {
|
|
10
|
-
const { fields, schema, groups, state, loading, fetching, fetchError, formRef, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
9
|
+
const { fields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
11
10
|
apiEndpoint: '/api/v2/clients',
|
|
12
11
|
routePrefix: '/motor-admin/clients',
|
|
13
12
|
translationPrefix: 'motor-admin.clients',
|
|
@@ -20,13 +19,14 @@ const { fields, schema, groups, state, loading, fetching, fetchError, formRef, o
|
|
|
20
19
|
|
|
21
20
|
<template>
|
|
22
21
|
<FormPage
|
|
23
|
-
:title="
|
|
22
|
+
:title="pageTitle"
|
|
24
23
|
back-route="/motor-admin/clients"
|
|
25
24
|
:loading="fetching"
|
|
26
25
|
:error="fetchError"
|
|
27
26
|
>
|
|
28
27
|
<FormBase
|
|
29
28
|
ref="formRef"
|
|
29
|
+
:disabled="!canWrite"
|
|
30
30
|
v-model:state="state"
|
|
31
31
|
:fields="fields"
|
|
32
32
|
:schema="schema"
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
import { configVariableFormMeta } from '../../../../types/generated/form-meta'
|
|
3
3
|
import { configVariableFormConfig } from '@motor-cms/ui-core/app/types/config/config-variable'
|
|
4
4
|
|
|
5
|
-
definePageMeta({ layout: 'default', permission: 'config-variables.
|
|
5
|
+
definePageMeta({ layout: 'default', permission: 'config-variables.read' })
|
|
6
6
|
|
|
7
7
|
const route = useRoute()
|
|
8
|
-
const {
|
|
9
|
-
const { fields, schema, groups, state, loading, fetching, fetchError, formRef, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
8
|
+
const { fields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
10
9
|
apiEndpoint: '/api/v2/config-variables',
|
|
11
10
|
routePrefix: '/motor-admin/config-variables',
|
|
12
11
|
translationPrefix: 'motor-admin.config_variables',
|
|
@@ -19,13 +18,14 @@ const { fields, schema, groups, state, loading, fetching, fetchError, formRef, o
|
|
|
19
18
|
|
|
20
19
|
<template>
|
|
21
20
|
<FormPage
|
|
22
|
-
:title="
|
|
21
|
+
:title="pageTitle"
|
|
23
22
|
back-route="/motor-admin/config-variables"
|
|
24
23
|
:loading="fetching"
|
|
25
24
|
:error="fetchError"
|
|
26
25
|
>
|
|
27
26
|
<FormBase
|
|
28
27
|
ref="formRef"
|
|
28
|
+
:disabled="!canWrite"
|
|
29
29
|
v-model:state="state"
|
|
30
30
|
:fields="fields"
|
|
31
31
|
:schema="schema"
|
|
@@ -3,12 +3,11 @@
|
|
|
3
3
|
import { domainFormMeta } from '../../../../types/generated/form-meta'
|
|
4
4
|
import { domainFormConfig, domainSelectOptionConfigs, domainProtocolOptions } from '@motor-cms/ui-core/app/types/config/domain'
|
|
5
5
|
|
|
6
|
-
definePageMeta({ layout: 'default', permission: 'domains.
|
|
6
|
+
definePageMeta({ layout: 'default', permission: 'domains.read' })
|
|
7
7
|
|
|
8
8
|
const route = useRoute()
|
|
9
|
-
const { t } = useI18n()
|
|
10
9
|
|
|
11
|
-
const { fields, schema, groups, state, loading, fetching, fetchError, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
10
|
+
const { fields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
12
11
|
apiEndpoint: '/api/v2/domains',
|
|
13
12
|
routePrefix: '/motor-admin/domains',
|
|
14
13
|
translationPrefix: 'motor-admin.domains',
|
|
@@ -27,13 +26,14 @@ const mergedSelectOptions = computed(() => ({
|
|
|
27
26
|
|
|
28
27
|
<template>
|
|
29
28
|
<FormPage
|
|
30
|
-
:title="
|
|
29
|
+
:title="pageTitle"
|
|
31
30
|
back-route="/motor-admin/domains"
|
|
32
31
|
:loading="fetching"
|
|
33
32
|
:error="fetchError"
|
|
34
33
|
>
|
|
35
34
|
<FormBase
|
|
36
35
|
ref="formRef"
|
|
36
|
+
:disabled="!canWrite"
|
|
37
37
|
v-model:state="state"
|
|
38
38
|
:fields="fields"
|
|
39
39
|
:schema="schema"
|
|
@@ -3,11 +3,10 @@
|
|
|
3
3
|
import { emailTemplateFormMeta } from '../../../../types/generated/form-meta'
|
|
4
4
|
import { emailTemplateFormConfig, emailTemplateSelectOptionConfigs } from '@motor-cms/ui-core/app/types/config/email-template'
|
|
5
5
|
|
|
6
|
-
definePageMeta({ layout: 'default', permission: 'email-templates.
|
|
6
|
+
definePageMeta({ layout: 'default', permission: 'email-templates.read' })
|
|
7
7
|
|
|
8
8
|
const route = useRoute()
|
|
9
|
-
const {
|
|
10
|
-
const { fields: rawFields, schema, groups, state, loading, fetching, fetchError, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
9
|
+
const { fields: rawFields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
11
10
|
apiEndpoint: '/api/v2/email-templates',
|
|
12
11
|
routePrefix: '/motor-admin/email-templates',
|
|
13
12
|
translationPrefix: 'motor-admin.email_templates',
|
|
@@ -29,13 +28,14 @@ if (bodyHtmlField) {
|
|
|
29
28
|
|
|
30
29
|
<template>
|
|
31
30
|
<FormPage
|
|
32
|
-
:title="
|
|
31
|
+
:title="pageTitle"
|
|
33
32
|
back-route="/motor-admin/email-templates"
|
|
34
33
|
:loading="fetching"
|
|
35
34
|
:error="fetchError"
|
|
36
35
|
>
|
|
37
36
|
<FormBase
|
|
38
37
|
ref="formRef"
|
|
38
|
+
:disabled="!canWrite"
|
|
39
39
|
v-model:state="state"
|
|
40
40
|
:fields="fields"
|
|
41
41
|
:schema="schema"
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
import { languageFormMeta } from '../../../../types/generated/form-meta'
|
|
3
3
|
import { languageFormConfig } from '@motor-cms/ui-core/app/types/config/language'
|
|
4
4
|
|
|
5
|
-
definePageMeta({ layout: 'default', permission: 'languages.
|
|
5
|
+
definePageMeta({ layout: 'default', permission: 'languages.read' })
|
|
6
6
|
|
|
7
7
|
const route = useRoute()
|
|
8
|
-
const {
|
|
9
|
-
const { fields, schema, groups, state, loading, fetching, fetchError, formRef, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
8
|
+
const { fields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
10
9
|
apiEndpoint: '/api/v2/languages',
|
|
11
10
|
routePrefix: '/motor-admin/languages',
|
|
12
11
|
translationPrefix: 'motor-admin.languages',
|
|
@@ -19,13 +18,14 @@ const { fields, schema, groups, state, loading, fetching, fetchError, formRef, o
|
|
|
19
18
|
|
|
20
19
|
<template>
|
|
21
20
|
<FormPage
|
|
22
|
-
:title="
|
|
21
|
+
:title="pageTitle"
|
|
23
22
|
back-route="/motor-admin/languages"
|
|
24
23
|
:loading="fetching"
|
|
25
24
|
:error="fetchError"
|
|
26
25
|
>
|
|
27
26
|
<FormBase
|
|
28
27
|
ref="formRef"
|
|
28
|
+
:disabled="!canWrite"
|
|
29
29
|
v-model:state="state"
|
|
30
30
|
:fields="fields"
|
|
31
31
|
:schema="schema"
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
import { permissionGroupFormMeta } from '../../../../types/generated/form-meta'
|
|
3
3
|
import { permissionGroupFormConfig, permissionGroupSelectOptionConfigs, permissionGroupExtraFields } from '@motor-cms/ui-core/app/types/config/permission-group'
|
|
4
4
|
|
|
5
|
-
definePageMeta({ layout: 'default', permission: 'permission-groups.
|
|
5
|
+
definePageMeta({ layout: 'default', permission: 'permission-groups.read' })
|
|
6
6
|
|
|
7
7
|
const route = useRoute()
|
|
8
|
-
const {
|
|
9
|
-
const { fields, schema, groups, state, loading, fetching, fetchError, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
8
|
+
const { fields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
10
9
|
apiEndpoint: '/api/v2/permission-groups',
|
|
11
10
|
routePrefix: '/motor-admin/permission-groups',
|
|
12
11
|
translationPrefix: 'motor-admin.permissions',
|
|
@@ -22,13 +21,14 @@ const { fields, schema, groups, state, loading, fetching, fetchError, formRef, s
|
|
|
22
21
|
|
|
23
22
|
<template>
|
|
24
23
|
<FormPage
|
|
25
|
-
:title="
|
|
24
|
+
:title="pageTitle"
|
|
26
25
|
back-route="/motor-admin/permission-groups"
|
|
27
26
|
:loading="fetching"
|
|
28
27
|
:error="fetchError"
|
|
29
28
|
>
|
|
30
29
|
<FormBase
|
|
31
30
|
ref="formRef"
|
|
31
|
+
:disabled="!canWrite"
|
|
32
32
|
v-model:state="state"
|
|
33
33
|
:fields="fields"
|
|
34
34
|
:schema="schema"
|
|
@@ -2,11 +2,10 @@
|
|
|
2
2
|
import { roleFormMeta } from '../../../../types/generated/form-meta'
|
|
3
3
|
import { roleFormConfig, roleSelectOptionConfigs } from '@motor-cms/ui-core/app/types/config/role'
|
|
4
4
|
|
|
5
|
-
definePageMeta({ layout: 'default', permission: 'roles.
|
|
5
|
+
definePageMeta({ layout: 'default', permission: 'roles.read' })
|
|
6
6
|
|
|
7
7
|
const route = useRoute()
|
|
8
|
-
const {
|
|
9
|
-
const { fields, schema, groups, state, loading, fetching, fetchError, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
8
|
+
const { fields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
10
9
|
apiEndpoint: '/api/v2/roles',
|
|
11
10
|
routePrefix: '/motor-admin/roles',
|
|
12
11
|
translationPrefix: 'motor-admin.roles',
|
|
@@ -20,13 +19,14 @@ const { fields, schema, groups, state, loading, fetching, fetchError, formRef, s
|
|
|
20
19
|
|
|
21
20
|
<template>
|
|
22
21
|
<FormPage
|
|
23
|
-
:title="
|
|
22
|
+
:title="pageTitle"
|
|
24
23
|
back-route="/motor-admin/roles"
|
|
25
24
|
:loading="fetching"
|
|
26
25
|
:error="fetchError"
|
|
27
26
|
>
|
|
28
27
|
<FormBase
|
|
29
28
|
ref="formRef"
|
|
29
|
+
:disabled="!canWrite"
|
|
30
30
|
v-model:state="state"
|
|
31
31
|
:fields="fields"
|
|
32
32
|
:schema="schema"
|
|
@@ -3,12 +3,12 @@
|
|
|
3
3
|
import { userFormMeta } from '../../../../types/generated/form-meta'
|
|
4
4
|
import { userEditFormConfig, userSelectOptionConfigs, userEditExtraFields } from '@motor-cms/ui-core/app/types/config/user'
|
|
5
5
|
|
|
6
|
-
definePageMeta({ layout: 'default', permission: 'users.
|
|
6
|
+
definePageMeta({ layout: 'default', permission: 'users.read' })
|
|
7
7
|
|
|
8
8
|
const route = useRoute()
|
|
9
9
|
const { t } = useI18n()
|
|
10
10
|
|
|
11
|
-
const { fields: rawFields, schema, groups, state, loading, fetching, fetchError, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
11
|
+
const { fields: rawFields, schema, groups, state, loading, fetching, fetchError, canWrite, pageTitle, formRef, selectOptions, selectOptionsLoading, onSubmit, onSaveAndContinue, onSaveAndNew, deleteRecord, deleting } = await useEntityForm({
|
|
12
12
|
apiEndpoint: '/api/v2/users',
|
|
13
13
|
routePrefix: '/motor-admin/users',
|
|
14
14
|
translationPrefix: 'motor-admin.users',
|
|
@@ -56,13 +56,14 @@ watchEffect(() => {
|
|
|
56
56
|
|
|
57
57
|
<template>
|
|
58
58
|
<FormPage
|
|
59
|
-
:title="
|
|
59
|
+
:title="pageTitle"
|
|
60
60
|
back-route="/motor-admin/users"
|
|
61
61
|
:loading="fetching"
|
|
62
62
|
:error="fetchError"
|
|
63
63
|
>
|
|
64
64
|
<FormBase
|
|
65
65
|
ref="formRef"
|
|
66
|
+
:disabled="!canWrite"
|
|
66
67
|
v-model:state="state"
|
|
67
68
|
:fields="fields"
|
|
68
69
|
:schema="refinedSchema"
|
package/app/pages/profile.vue
CHANGED
|
@@ -9,8 +9,10 @@ definePageMeta({
|
|
|
9
9
|
})
|
|
10
10
|
|
|
11
11
|
const { t } = useI18n()
|
|
12
|
+
const router = useRouter()
|
|
12
13
|
const { user, refreshIdentity } = useSanctumAuth<User>()
|
|
13
|
-
const { updateProfile } = useProfileApi()
|
|
14
|
+
const { updateProfile, resetOnboarding } = useProfileApi()
|
|
15
|
+
const { resetAll: resetOnboardingState } = useOnboardingResetAll()
|
|
14
16
|
const { success, error: notifyError, info } = useNotify()
|
|
15
17
|
|
|
16
18
|
// Test function to demonstrate error notifications
|
|
@@ -172,6 +174,33 @@ const passwordState = reactive({
|
|
|
172
174
|
|
|
173
175
|
const passwordLoading = ref(false)
|
|
174
176
|
|
|
177
|
+
// ============================================
|
|
178
|
+
// Onboarding Tour
|
|
179
|
+
// ============================================
|
|
180
|
+
|
|
181
|
+
const onboardingLoading = ref(false)
|
|
182
|
+
|
|
183
|
+
async function onRestartTour() {
|
|
184
|
+
onboardingLoading.value = true
|
|
185
|
+
try {
|
|
186
|
+
await resetOnboarding()
|
|
187
|
+
resetOnboardingState()
|
|
188
|
+
success(t('motor-core.profile.toast_tour_reset_title'), t('motor-core.profile.toast_tour_reset_message'))
|
|
189
|
+
await router.push('/')
|
|
190
|
+
}
|
|
191
|
+
catch (err: unknown) {
|
|
192
|
+
const message = err instanceof Error ? err.message : t('motor-core.profile.toast_tour_reset_error')
|
|
193
|
+
notifyError(t('motor-core.profile.toast_tour_reset_error'), message, {
|
|
194
|
+
message,
|
|
195
|
+
stack: err instanceof Error ? err.stack : undefined,
|
|
196
|
+
url: '/api/profile/reset-onboarding',
|
|
197
|
+
})
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
onboardingLoading.value = false
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
175
204
|
async function onPasswordSubmit(event: FormSubmitEvent<PasswordSchema>) {
|
|
176
205
|
passwordLoading.value = true
|
|
177
206
|
|
|
@@ -293,6 +322,22 @@ async function onPasswordSubmit(event: FormSubmitEvent<PasswordSchema>) {
|
|
|
293
322
|
</UForm>
|
|
294
323
|
</UPageCard>
|
|
295
324
|
|
|
325
|
+
<!-- Onboarding Tour Card -->
|
|
326
|
+
<UPageCard
|
|
327
|
+
:title="t('motor-core.profile.onboarding_title')"
|
|
328
|
+
:description="t('motor-core.profile.onboarding_description')"
|
|
329
|
+
>
|
|
330
|
+
<div class="flex justify-end">
|
|
331
|
+
<UButton
|
|
332
|
+
:loading="onboardingLoading"
|
|
333
|
+
icon="i-lucide-graduation-cap"
|
|
334
|
+
@click="onRestartTour"
|
|
335
|
+
>
|
|
336
|
+
{{ t('motor-core.profile.restart_tour') }}
|
|
337
|
+
</UButton>
|
|
338
|
+
</div>
|
|
339
|
+
</UPageCard>
|
|
340
|
+
|
|
296
341
|
<!-- Change Password Card -->
|
|
297
342
|
<UPageCard
|
|
298
343
|
:title="t('motor-core.profile.change_password_title')"
|
package/app/pages/search.vue
CHANGED
|
@@ -4,6 +4,11 @@ import type { SearchGridRow } from '@motor-cms/ui-core/app/types/search'
|
|
|
4
4
|
import type { PaginatedResponse, PaginationMeta } from '@motor-cms/ui-core/app/types/grid'
|
|
5
5
|
import { watchDebounced } from '@vueuse/core'
|
|
6
6
|
|
|
7
|
+
definePageMeta({
|
|
8
|
+
layout: 'default',
|
|
9
|
+
permission: 'search.read'
|
|
10
|
+
})
|
|
11
|
+
|
|
7
12
|
const { t } = useI18n()
|
|
8
13
|
const route = useRoute()
|
|
9
14
|
const router = useRouter()
|
package/nuxt.config.ts
CHANGED
|
@@ -1 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { fileURLToPath } from 'node:url'
|
|
2
|
+
import { dirname, resolve } from 'node:path'
|
|
3
|
+
|
|
4
|
+
const __layerDir = dirname(fileURLToPath(import.meta.url))
|
|
5
|
+
|
|
6
|
+
export default defineNuxtConfig({
|
|
7
|
+
css: [resolve(__layerDir, 'app/assets/css/v-onboarding.css')],
|
|
8
|
+
})
|