@motor-cms/ui-admin 1.5.2 → 1.7.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.
Files changed (41) hide show
  1. package/app/components/dashboard/DashboardActivityItem.vue +3 -3
  2. package/app/components/dashboard/DashboardAnnouncementModal.vue +53 -5
  3. package/app/components/dashboard/DashboardAnnouncements.vue +3 -3
  4. package/app/composables/useDashboardData.ts +1 -0
  5. package/app/lang/de/motor-admin/ai_system_prompts.json +1 -0
  6. package/app/lang/de/motor-admin/categories.json +1 -0
  7. package/app/lang/de/motor-admin/category_trees.json +1 -0
  8. package/app/lang/de/motor-admin/clients.json +1 -0
  9. package/app/lang/de/motor-admin/config_variables.json +1 -0
  10. package/app/lang/de/motor-admin/dashboard.json +2 -0
  11. package/app/lang/de/motor-admin/domains.json +1 -0
  12. package/app/lang/de/motor-admin/email_templates.json +1 -0
  13. package/app/lang/de/motor-admin/languages.json +1 -0
  14. package/app/lang/de/motor-admin/permissions.json +1 -0
  15. package/app/lang/de/motor-admin/roles.json +1 -0
  16. package/app/lang/de/motor-admin/users.json +1 -0
  17. package/app/lang/en/motor-admin/ai_system_prompts.json +1 -0
  18. package/app/lang/en/motor-admin/categories.json +1 -0
  19. package/app/lang/en/motor-admin/category_trees.json +1 -0
  20. package/app/lang/en/motor-admin/clients.json +1 -0
  21. package/app/lang/en/motor-admin/config_variables.json +1 -0
  22. package/app/lang/en/motor-admin/dashboard.json +2 -0
  23. package/app/lang/en/motor-admin/domains.json +1 -0
  24. package/app/lang/en/motor-admin/email_templates.json +1 -0
  25. package/app/lang/en/motor-admin/languages.json +1 -0
  26. package/app/lang/en/motor-admin/permissions.json +1 -0
  27. package/app/lang/en/motor-admin/roles.json +1 -0
  28. package/app/lang/en/motor-admin/users.json +1 -0
  29. package/app/pages/motor-admin/ai-system-prompts/[id]/edit.vue +4 -4
  30. package/app/pages/motor-admin/category-trees/[id]/categories/[categoryId]/edit.vue +4 -3
  31. package/app/pages/motor-admin/category-trees/[id]/edit.vue +4 -4
  32. package/app/pages/motor-admin/clients/[id]/edit.vue +4 -4
  33. package/app/pages/motor-admin/config-variables/[id]/edit.vue +4 -4
  34. package/app/pages/motor-admin/domains/[id]/edit.vue +4 -4
  35. package/app/pages/motor-admin/email-templates/[id]/edit.vue +4 -4
  36. package/app/pages/motor-admin/languages/[id]/edit.vue +4 -4
  37. package/app/pages/motor-admin/permission-groups/[id]/edit.vue +4 -4
  38. package/app/pages/motor-admin/roles/[id]/edit.vue +4 -4
  39. package/app/pages/motor-admin/users/[id]/edit.vue +4 -3
  40. package/app/pages/search.vue +5 -0
  41. package/package.json +2 -2
@@ -1,8 +1,8 @@
1
1
  <script setup lang="ts">
2
- import { formatTimeAgo } from '@vueuse/core'
2
+ import { formatTimeAgoIntl } from '@vueuse/core'
3
3
  import type { ActivityItem } from '../../composables/useDashboardData'
4
4
 
5
- const { t } = useI18n()
5
+ const { t, locale } = useI18n()
6
6
 
7
7
  const props = defineProps<{
8
8
  item: ActivityItem
@@ -82,7 +82,7 @@ const timestamp = computed(() => new Date(props.item.created_at))
82
82
  <strong>{{ item.subject_name ?? t('motor-admin.dashboard.activity.unknown') }}</strong> {{ verb }}
83
83
  </div>
84
84
  <div class="text-xs text-dimmed mt-0.5">
85
- {{ item.causer_name ?? t('motor-admin.dashboard.activity.system') }} &middot; {{ formatTimeAgo(timestamp) }}
85
+ {{ item.causer_name ?? t('motor-admin.dashboard.activity.system') }} &middot; {{ formatTimeAgoIntl(timestamp, { locale }) }}
86
86
  </div>
87
87
  </div>
88
88
  <UBadge
@@ -9,8 +9,9 @@ const emit = defineEmits<{
9
9
  }>()
10
10
 
11
11
  const { t } = useI18n()
12
- const client = useSanctumClient()
13
- const { can } = usePermissions()
12
+ const apiClient = useSanctumClient()
13
+ const { can, hasRole } = usePermissions()
14
+ const { user } = useSanctumAuth<import('@motor-cms/ui-core/app/types/auth').User>()
14
15
  const saving = ref(false)
15
16
 
16
17
  const canWriteAnnouncements = computed(() => can('dashboard-announcements.write'))
@@ -21,6 +22,7 @@ const form = reactive({
21
22
  type: 'info',
22
23
  audience: 'self',
23
24
  target_user_ids: [] as number[],
25
+ client_id: undefined as number | undefined,
24
26
  linkable_type: '',
25
27
  linkable_id: undefined as number | undefined,
26
28
  starts_at: undefined as string | undefined,
@@ -56,11 +58,29 @@ const userOptions = ref<Array<{ label: string; value: number }>>([])
56
58
  const usersLoading = ref(false)
57
59
  const usersFetched = ref(false)
58
60
 
61
+ const clientOptions = computed(() => {
62
+ return (user.value?.data?.clients ?? []).map(c => ({
63
+ label: c.name,
64
+ value: c.id,
65
+ }))
66
+ })
67
+
68
+ const allClientOptions = ref<Array<{ label: string; value: number }>>([])
69
+ const allClientsFetched = ref(false)
70
+ const allClientsLoading = ref(false)
71
+
72
+ const visibleClientOptions = computed(() => {
73
+ if (hasRole('SuperAdmin') && allClientsFetched.value) {
74
+ return allClientOptions.value
75
+ }
76
+ return clientOptions.value
77
+ })
78
+
59
79
  watch(() => form.audience, async (audience) => {
60
80
  if (audience === 'users' && !usersFetched.value) {
61
81
  usersLoading.value = true
62
82
  try {
63
- const response = await client<{ data: Array<{ id: number; name: string }> }>('/api/v2/users?per_page=200')
83
+ const response = await apiClient<{ data: Array<{ id: number; name: string }> }>('/api/v2/users?per_page=200')
64
84
  userOptions.value = response.data.map(u => ({
65
85
  label: u.name,
66
86
  value: u.id,
@@ -70,6 +90,19 @@ watch(() => form.audience, async (audience) => {
70
90
  usersLoading.value = false
71
91
  }
72
92
  }
93
+ if (audience === 'client' && hasRole('SuperAdmin') && !allClientsFetched.value) {
94
+ allClientsLoading.value = true
95
+ try {
96
+ const response = await apiClient<{ data: Array<{ id: number; name: string }> }>('/api/v2/clients?per_page=200')
97
+ allClientOptions.value = response.data.map(c => ({
98
+ label: c.name,
99
+ value: c.id,
100
+ }))
101
+ allClientsFetched.value = true
102
+ } finally {
103
+ allClientsLoading.value = false
104
+ }
105
+ }
73
106
  })
74
107
 
75
108
  const linkableOptions = ref<Array<{ label: string; value: number }>>([])
@@ -106,7 +139,7 @@ async function fetchLinkableOptions(query: string) {
106
139
  if (query) {
107
140
  params.set('search', query)
108
141
  }
109
- const response = await client<{ data: Array<Record<string, any>> }>(`${config.endpoint}?${params}`)
142
+ const response = await apiClient<{ data: Array<Record<string, any>> }>(`${config.endpoint}?${params}`)
110
143
  linkableOptions.value = response.data.map(item => ({
111
144
  label: config.labelFn(item),
112
145
  value: item.id,
@@ -144,6 +177,9 @@ async function handleSubmit() {
144
177
  if (form.audience === 'users') {
145
178
  data.target_user_ids = form.target_user_ids
146
179
  }
180
+ if (form.audience === 'client' && form.client_id) {
181
+ data.client_id = form.client_id
182
+ }
147
183
  if (form.linkable_type && form.linkable_id) {
148
184
  data.linkable_type = form.linkable_type
149
185
  data.linkable_id = form.linkable_id
@@ -155,7 +191,7 @@ async function handleSubmit() {
155
191
  data.expires_at = form.expires_at
156
192
  }
157
193
 
158
- await client('/api/v2/dashboard/announcements', {
194
+ await apiClient('/api/v2/dashboard/announcements', {
159
195
  method: 'POST',
160
196
  body: data,
161
197
  })
@@ -166,6 +202,7 @@ async function handleSubmit() {
166
202
  type: 'info',
167
203
  audience: 'self',
168
204
  target_user_ids: [],
205
+ client_id: undefined,
169
206
  linkable_type: '',
170
207
  linkable_id: null,
171
208
  starts_at: null,
@@ -222,6 +259,17 @@ async function handleSubmit() {
222
259
  />
223
260
  </UFormField>
224
261
 
262
+ <UFormField v-if="form.audience === 'client'" :label="t('motor-admin.dashboard.announcements.field_client')">
263
+ <USelectMenu
264
+ v-model="form.client_id"
265
+ :items="visibleClientOptions"
266
+ value-key="value"
267
+ :loading="allClientsLoading"
268
+ :placeholder="t('motor-admin.dashboard.announcements.field_client_placeholder')"
269
+ class="w-full"
270
+ />
271
+ </UFormField>
272
+
225
273
  <UFormField :label="t('motor-admin.dashboard.announcements.field_link')">
226
274
  <USelectMenu
227
275
  v-model="form.linkable_type"
@@ -1,5 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { formatTimeAgo } from '@vueuse/core'
2
+ import { formatTimeAgoIntl } from '@vueuse/core'
3
3
  import type { AnnouncementItem } from '../../composables/useDashboardData'
4
4
 
5
5
  const props = defineProps<{
@@ -13,7 +13,7 @@ const emit = defineEmits<{
13
13
  create: []
14
14
  }>()
15
15
 
16
- const { t } = useI18n()
16
+ const { t, locale } = useI18n()
17
17
 
18
18
  const borderColors: Record<string, string> = {
19
19
  info: 'border-l-info',
@@ -80,7 +80,7 @@ const borderColors: Record<string, string> = {
80
80
  {{ item.linkable_name }}
81
81
  </NuxtLink>
82
82
  <div class="text-xs text-dimmed mt-2">
83
- {{ item.created_by_name }} &middot; {{ formatTimeAgo(new Date(item.created_at)) }}
83
+ {{ item.created_by_name }} &middot; {{ formatTimeAgoIntl(new Date(item.starts_at ?? item.created_at), { locale }) }}
84
84
  </div>
85
85
  </div>
86
86
  </div>
@@ -37,6 +37,7 @@ export interface AnnouncementItem {
37
37
  linkable_name: string | null
38
38
  linkable_url: string | null
39
39
  created_by_name: string | null
40
+ starts_at: string | null
40
41
  created_at: string
41
42
  }
42
43
 
@@ -7,6 +7,7 @@
7
7
  "prompt_description": "Der System-Prompt-Text, der an das KI-Modell gesendet wird",
8
8
  "create_title": "KI-System-Prompt erstellen",
9
9
  "edit_title": "KI-System-Prompt bearbeiten",
10
+ "view_title": "KI-System-Prompt ansehen",
10
11
  "created_success": "KI-System-Prompt erfolgreich erstellt.",
11
12
  "updated_success": "KI-System-Prompt erfolgreich aktualisiert."
12
13
  }
@@ -5,6 +5,7 @@
5
5
  "add": "Kategorie hinzufügen",
6
6
  "create_title": "Kategorie erstellen",
7
7
  "edit_title": "Kategorie bearbeiten",
8
+ "view_title": "Kategorie ansehen",
8
9
  "created_success": "Kategorie wurde erfolgreich erstellt",
9
10
  "updated_success": "Kategorie wurde erfolgreich aktualisiert",
10
11
  "parent": "Übergeordnete Kategorie",
@@ -6,6 +6,7 @@
6
6
  "add": "Kategoriebaum hinzufügen",
7
7
  "create_title": "Kategoriebaum erstellen",
8
8
  "edit_title": "Kategoriebaum bearbeiten",
9
+ "view_title": "Kategoriebaum ansehen",
9
10
  "created_success": "Kategoriebaum wurde erfolgreich erstellt",
10
11
  "updated_success": "Kategoriebaum wurde erfolgreich aktualisiert",
11
12
  "children": "Kinder",
@@ -6,6 +6,7 @@
6
6
  "add": "Mandant hinzufügen",
7
7
  "create_title": "Mandant erstellen",
8
8
  "edit_title": "Mandant bearbeiten",
9
+ "view_title": "Mandant ansehen",
9
10
  "created_success": "Mandant erfolgreich erstellt.",
10
11
  "updated_success": "Mandant erfolgreich aktualisiert.",
11
12
  "slug": "Slug",
@@ -9,6 +9,7 @@
9
9
  "is_invisible": "Versteckt",
10
10
  "create_title": "Konfigurationsvariable erstellen",
11
11
  "edit_title": "Konfigurationsvariable bearbeiten",
12
+ "view_title": "Konfigurationsvariable ansehen",
12
13
  "created_success": "Konfigurationsvariable erfolgreich erstellt.",
13
14
  "updated_success": "Konfigurationsvariable erfolgreich aktualisiert."
14
15
  }
@@ -49,6 +49,8 @@
49
49
  "field_audience": "Zielgruppe",
50
50
  "field_users": "Nutzer auswählen",
51
51
  "field_users_placeholder": "Nutzer suchen...",
52
+ "field_client": "Mandant auswählen",
53
+ "field_client_placeholder": "Mandant wählen...",
52
54
  "field_link": "Verknüpfung (optional)",
53
55
  "field_link_type_placeholder": "Typ wählen...",
54
56
  "field_link_item": "Element",
@@ -6,6 +6,7 @@
6
6
  "add": "Domain hinzufügen",
7
7
  "create_title": "Domain erstellen",
8
8
  "edit_title": "Domain bearbeiten",
9
+ "view_title": "Domain ansehen",
9
10
  "created_success": "Domain erfolgreich erstellt.",
10
11
  "updated_success": "Domain erfolgreich aktualisiert.",
11
12
  "host": "Host",
@@ -5,6 +5,7 @@
5
5
  "add": "E-Mail-Vorlage hinzufügen",
6
6
  "create_title": "E-Mail-Vorlage erstellen",
7
7
  "edit_title": "E-Mail-Vorlage bearbeiten",
8
+ "view_title": "E-Mail-Vorlage ansehen",
8
9
  "slug": "Slug",
9
10
  "slug_description": "URL-freundlicher Bezeichner, automatisch aus dem Namen generiert",
10
11
  "subject": "Betreff",
@@ -9,6 +9,7 @@
9
9
  "native_name": "Eigenname",
10
10
  "create_title": "Sprache erstellen",
11
11
  "edit_title": "Sprache bearbeiten",
12
+ "view_title": "Sprache ansehen",
12
13
  "created_success": "Sprache erfolgreich erstellt.",
13
14
  "updated_success": "Sprache erfolgreich aktualisiert.",
14
15
  "iso_639_1": "ISO 639-1 Code",
@@ -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,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",
@@ -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",
@@ -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
  }
@@ -49,6 +49,8 @@
49
49
  "field_audience": "Audience",
50
50
  "field_users": "Select users",
51
51
  "field_users_placeholder": "Search users...",
52
+ "field_client": "Select client",
53
+ "field_client_placeholder": "Choose a client...",
52
54
  "field_link": "Link (optional)",
53
55
  "field_link_type_placeholder": "Select type...",
54
56
  "field_link_item": "Item",
@@ -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",
@@ -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",
@@ -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"
@@ -8,6 +8,7 @@
8
8
  "permissions": "Permissions",
9
9
  "create_title": "Create Role",
10
10
  "edit_title": "Edit Role",
11
+ "view_title": "View Role",
11
12
  "created_success": "Role created successfully.",
12
13
  "updated_success": "Role updated successfully.",
13
14
  "guard_name": "Guard Name",
@@ -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",
@@ -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.write' })
6
+ definePageMeta({ layout: 'default', permission: 'ai-system-prompts.read' })
7
7
 
8
8
  const route = useRoute()
9
- const { t } = useI18n()
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="t('motor-admin.ai_system_prompts.edit_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.write' })
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="t('motor-admin.categories.edit_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.write' })
6
+ definePageMeta({ layout: 'default', permission: 'category-trees.read' })
7
7
 
8
8
  const route = useRoute()
9
- const { t } = useI18n()
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="t('motor-admin.category_trees.edit_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.write' })
6
+ definePageMeta({ layout: 'default', permission: 'clients.read' })
7
7
 
8
8
  const route = useRoute()
9
- const { t } = useI18n()
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="t('motor-admin.clients.edit_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.write' })
5
+ definePageMeta({ layout: 'default', permission: 'config-variables.read' })
6
6
 
7
7
  const route = useRoute()
8
- const { t } = useI18n()
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="t('motor-admin.config_variables.edit_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.write' })
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="t('motor-admin.domains.edit_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.write' })
6
+ definePageMeta({ layout: 'default', permission: 'email-templates.read' })
7
7
 
8
8
  const route = useRoute()
9
- const { t } = useI18n()
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="t('motor-admin.email_templates.edit_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.write' })
5
+ definePageMeta({ layout: 'default', permission: 'languages.read' })
6
6
 
7
7
  const route = useRoute()
8
- const { t } = useI18n()
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="t('motor-admin.languages.edit_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.write' })
5
+ definePageMeta({ layout: 'default', permission: 'permission-groups.read' })
6
6
 
7
7
  const route = useRoute()
8
- const { t } = useI18n()
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="t('motor-admin.permissions.edit_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.write' })
5
+ definePageMeta({ layout: 'default', permission: 'roles.read' })
6
6
 
7
7
  const route = useRoute()
8
- const { t } = useI18n()
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="t('motor-admin.roles.edit_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.write' })
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="t('motor-admin.users.edit_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"
@@ -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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@motor-cms/ui-admin",
3
- "version": "1.5.2",
3
+ "version": "1.7.0",
4
4
  "type": "module",
5
5
  "main": "./nuxt.config.ts",
6
6
  "files": [
@@ -17,7 +17,7 @@
17
17
  "@vueuse/core": "^14.0.0",
18
18
  "sortablejs": "^1.15.0",
19
19
  "zod": "^4.0.0",
20
- "@motor-cms/ui-core": "1.5.2"
20
+ "@motor-cms/ui-core": "1.7.0"
21
21
  },
22
22
  "peerDependencies": {
23
23
  "nuxt": "^4.0.0",