Skip to content

Commit 44ce900

Browse files
committed
fix: role edit
1 parent 28e1de4 commit 44ce900

File tree

7 files changed

+83
-99
lines changed

7 files changed

+83
-99
lines changed

app/components/roles/AddEditRoleDialog.vue

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
<script setup lang="ts">
2-
import { debounce, values } from 'lodash-es'
3-
import { VForm } from 'vuetify/components/VForm'
4-
import { usePermissionStore } from '@base/stores/admin/permission'
52
import type { Permission } from '@base/stores/admin/permission'
6-
import type { PivotRolePermission, RoleWithPermissions } from '@base/stores/admin/role'
3+
import type { RoleWithPermissions } from '@base/stores/admin/role'
74
import { requiredValidator } from '#imports'
5+
import { VForm } from 'vuetify/components/VForm'
86
97
const props = defineProps<{
108
role?: RoleWithPermissions | null
@@ -13,7 +11,7 @@ const props = defineProps<{
1311
1412
const emit = defineEmits<{
1513
(e: 'edit', payload: ReturnType<typeof getDefaultFormData>): void
16-
(e: 'create', payload: ReturnType<typeof getDefaultFormData>): void
14+
(e: 'create', payload: Omit<ReturnType<typeof getDefaultFormData>, 'id'>): void
1715
}>()
1816
1917
const modelValue = defineModel<boolean>({
@@ -30,6 +28,8 @@ function getDefaultFormData(): { id: string, name: string, permissions: string[]
3028
3129
const formData = ref(getDefaultFormData())
3230
31+
const formTemplate = useTemplateRef('formRef')
32+
3333
syncRef(computed(() => props.role), formData, {
3434
direction: 'ltr',
3535
transform: {
@@ -57,18 +57,26 @@ watch(modelValue, (value) => {
5757
}
5858
})
5959
60-
const formTemplate = useTemplateRef('formRef')
61-
6260
async function handleSubmit() {
6361
try {
6462
if (formTemplate.value) {
65-
const { valid } = await formTemplate.value.validate()
63+
const { valid, errors } = await formTemplate.value.validate()
6664
6765
if (valid) {
68-
if (formData.value.id)
66+
if (formData.value.id) {
6967
emit('edit', formData.value)
70-
else
71-
emit('create', formData.value)
68+
}
69+
else {
70+
emit('create', {
71+
name: formData.value.name,
72+
permissions: formData.value.permissions,
73+
})
74+
}
75+
}
76+
else if (errors.length) {
77+
notifyWarning({
78+
content: errors[0]?.errorMessages[0],
79+
})
7280
}
7381
}
7482
}
@@ -98,7 +106,7 @@ async function handleSubmit() {
98106
</div>
99107

100108
<!-- 👉 Form -->
101-
<VForm ref="formRef" @submit.prevent="handleSubmit">
109+
<VForm ref="formRef">
102110
<!-- 👉 Role name -->
103111
<VTextField
104112
v-model="formData.name"
@@ -114,14 +122,14 @@ async function handleSubmit() {
114122
<VLabel>
115123
<VCheckbox
116124
v-model="formData.permissions"
117-
:value="permission.id"
118-
class="border pa-2"
119-
:class="{ 'border border-primary text-primary': formData.permissions.includes(permission.id) }"
120125
multiple
126+
:class="{ 'text-primary': formData.permissions.includes(permission.id) }"
127+
:value="permission.id"
128+
:rules="[requiredValidator(formData.permissions)]"
121129
>
122130
<template #label>
123131
<span class="pr-3" :class="{ 'text-primary': formData.permissions.includes(permission.id) }">
124-
{{ permission.action }}:{{ permission.subject }}
132+
{{ permission.action.toLowerCase() }}:{{ permission.subject.toLowerCase() }}
125133
</span>
126134
</template>
127135
</VCheckbox>
@@ -131,7 +139,7 @@ async function handleSubmit() {
131139

132140
<!-- 👉 Actions button -->
133141
<div class="d-flex align-center justify-center gap-3 mt-6">
134-
<VBtn type="submit">
142+
<VBtn @click="handleSubmit">
135143
{{ role ? $t('Update Role') : $t('Create Role') }}
136144
</VBtn>
137145

app/components/roles/RoleCards.vue

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<script setup lang="ts">
2-
import poseM from '@base/images/pages/pose_m1.png'
2+
import type { Permission } from '@base/stores/admin/permission'
33
44
import type { RoleWithPermissions } from '@base/stores/admin/role'
5-
import type { Permission } from '@base/stores/admin/permission'
5+
import poseM from '@base/images/pages/pose_m1.png'
66
import AddEditRoleDialog from './AddEditRoleDialog.vue'
77
88
defineProps<{
@@ -12,7 +12,7 @@ defineProps<{
1212
1313
const emit = defineEmits<{
1414
(e: 'edit', payload: { id: string, name: string, permissions: string[] }): void
15-
(e: 'create', payload: { id: string, name: string, permissions: string[] }): void
15+
(e: 'create', payload: { name: string, permissions: string[] }): void
1616
(e: 'delete', payload: RoleWithPermissions): void
1717
}>()
1818
@@ -54,7 +54,7 @@ function handleSubmitEdit(role: { id: string, name: string, permissions: string[
5454
dialogVisible.value = false
5555
}
5656
57-
function handleSubmitCreate(role: { id: string, name: string, permissions: string[] }) {
57+
function handleSubmitCreate(role: { name: string, permissions: string[] }) {
5858
emit('create', role)
5959
6060
dialogVisible.value = false
@@ -168,20 +168,16 @@ function handleSubmitCreate(role: { id: string, name: string, permissions: strin
168168
</VCol>
169169
</VRow>
170170
</VCard>
171-
<AddEditRoleDialog
172-
v-model="dialogVisible"
173-
:role="roleSelected"
174-
:permissions="permissions"
175-
@edit="handleSubmitEdit"
176-
/>
177171
</VCol>
178-
</VRow>
179172

180-
<AddEditRoleDialog
181-
v-model="dialogVisible"
182-
:permissions="permissions"
183-
@create="handleSubmitCreate"
184-
/>
173+
<AddEditRoleDialog
174+
v-model="dialogVisible"
175+
:role="roleSelected"
176+
:permissions="permissions"
177+
@edit="handleSubmitEdit"
178+
@create="handleSubmitCreate"
179+
/>
180+
</VRow>
185181
</template>
186182

187183
<style lang="scss" scoped>

app/pages/admin/roles.vue

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<script setup lang="ts">
2-
import RoleCards from '@base/components/roles/RoleCards.vue'
32
import type { RoleWithPermissions } from '@base/stores/admin/role'
4-
import { useRoleStore } from '@base/stores/admin/role'
3+
import RoleCards from '@base/components/roles/RoleCards.vue'
54
import { usePermissionStore } from '@base/stores/admin/permission'
5+
import { useRoleStore } from '@base/stores/admin/role'
6+
import { sortBy } from 'lodash-es'
67
// import UserList from '@base/components/roles/UserList.vue'
78
89
definePageMeta({
@@ -28,6 +29,12 @@ const { data: roleData, refresh: reFetchRoles } = useLazyAsyncData('roles', () =
2829
2930
const { data: permissionData } = useLazyAsyncData('permissions', () => permissionStore.fetchPermissions({ page: 1, limit: 100, keyword: '' }), {
3031
server: false,
32+
transform(permissionData) {
33+
return {
34+
...permissionData,
35+
data: sortBy(permissionData.data, ['subject', 'action']),
36+
}
37+
},
3138
})
3239
3340
async function handleSubmitEdit(role: { id: string, name: string, permissions: string[] }) {
@@ -40,7 +47,7 @@ async function handleSubmitEdit(role: { id: string, name: string, permissions: s
4047
await reFetchRoles()
4148
}
4249
43-
async function handleSubmitCreate(role: { id: string, name: string, permissions: string[] }) {
50+
async function handleSubmitCreate(role: { name: string, permissions: string[] }) {
4451
await roleStore.createRole(role)
4552
4653
notifySuccess({

app/stores/admin/role.ts

Lines changed: 20 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import type { InferSelectModel } from 'drizzle-orm'
1+
import type { sysRolePermissionTable } from '@base/server/db/schemas'
22
import type { sysRoleTable } from '@base/server/db/schemas/sys_roles.schema'
33
import type { ParsedFilterQuery } from '@base/server/utils/filter'
4-
import type { sysRolePermissionTable } from '@base/server/db/schemas'
4+
import type { InferSelectModel } from 'drizzle-orm'
55
import type { Permission } from './permission'
66

77
export type Role = InferSelectModel<typeof sysRoleTable>
@@ -20,60 +20,35 @@ export interface PivotRolePermission extends Partial<Role> {
2020

2121
export const useRoleStore = defineStore('role', () => {
2222
async function fetchRoles(options?: ParsedFilterQuery) {
23-
try {
24-
return await $api<{ total: number, data: RoleWithPermissions[] }>('/roles', {
25-
query: options,
26-
})
27-
}
28-
catch (error) {
29-
console.error('Error fetching roles:', error)
30-
}
23+
return await $api<{ total: number, data: RoleWithPermissions[] }>('/roles', {
24+
query: options,
25+
})
3126
}
3227

3328
async function fetchRoleDetail(roleId: string) {
34-
try {
35-
return await $api(`/roles/${roleId}`, {
36-
method: 'GET',
37-
})
38-
}
39-
catch (error) {
40-
console.error('Error fetching role detail:', error)
41-
}
29+
return await $api(`/roles/${roleId}`, {
30+
method: 'GET',
31+
})
4232
}
4333

44-
async function createRole(body: { id: string, name: string, permissions: string[] }) {
45-
try {
46-
return await $api<Role>('/roles', {
47-
method: 'POST',
48-
body: omit(body, ['id']),
49-
})
50-
}
51-
catch (error) {
52-
console.error('Error creating role:', error)
53-
}
34+
async function createRole(body: { name: string, permissions: string[] }) {
35+
return await $api<Role>('/roles', {
36+
method: 'POST',
37+
body,
38+
})
5439
}
5540

5641
async function updateRole(roleId: string, body: { id: string, name: string, permissions: string[] }) {
57-
try {
58-
return await $api(`/roles/${roleId}`, {
59-
method: 'PATCH',
60-
body,
61-
})
62-
}
63-
catch (error) {
64-
console.error('Error updating role:', error)
65-
}
42+
return await $api(`/roles/${roleId}`, {
43+
method: 'PATCH',
44+
body,
45+
})
6646
}
6747

6848
async function deleteRole(roleId: string) {
69-
try {
70-
return await $api(`/roles/${roleId}`, {
71-
method: 'DELETE',
72-
})
73-
}
74-
catch (error) {
75-
console.error('Error deleting role:', error)
76-
}
49+
return await $api(`/roles/${roleId}`, {
50+
method: 'DELETE',
51+
})
7752
}
7853

7954
return {

nuxt.config.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ export default defineNuxtConfig({
3939

4040
devtools: {
4141
enabled: true,
42+
43+
timeline: {
44+
enabled: true,
45+
},
4246
},
4347

4448
css: [

server/api/roles/index.post.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default defineEventHandler(async (event) => {
1212

1313
setResponseStatus(event, 201)
1414

15-
return response.data
15+
return response
1616
}
1717
catch (error: any) {
1818
throw parseError(error)

server/composables/useRole.ts

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -72,29 +72,23 @@ export function useRole() {
7272
}
7373

7474
async function createRole(body: any) {
75-
await db.transaction(async (tx) => {
76-
const data = await tx.insert(sysRoleTable).values({ name: body.name }).returning({ id: sysRoleTable.id })
75+
const data = await db.insert(sysRoleTable).values({ name: body.name }).returning({ id: sysRoleTable.id })
7776

78-
await tx.delete(sysRolePermissionTable).where(eq(sysRolePermissionTable.role_id, data[0].id))
79-
80-
await tx.insert(sysRolePermissionTable).values(body.permissions.map((permissionId: string) => ({
81-
role_id: data[0].id,
82-
permission_id: permissionId,
83-
})))
84-
})
77+
await db.insert(sysRolePermissionTable).values(body.permissions.map((permissionId: string) => ({
78+
role_id: data[0].id,
79+
permission_id: permissionId,
80+
})))
8581
}
8682

8783
async function updateRoleById(id: string, body: any) {
88-
await db.transaction(async (tx) => {
89-
await tx.update(sysRoleTable).set({ name: body.name }).where(eq(sysRoleTable.id, id))
84+
await db.update(sysRoleTable).set({ name: body.name }).where(eq(sysRoleTable.id, id))
9085

91-
await tx.delete(sysRolePermissionTable).where(eq(sysRolePermissionTable.role_id, id))
86+
await db.delete(sysRolePermissionTable).where(eq(sysRolePermissionTable.role_id, id))
9287

93-
await tx.insert(sysRolePermissionTable).values(body.permissions.map((permissionId: string) => ({
94-
role_id: id,
95-
permission_id: permissionId,
96-
})))
97-
})
88+
await db.insert(sysRolePermissionTable).values(body.permissions.map((permissionId: string) => ({
89+
role_id: id,
90+
permission_id: permissionId,
91+
})))
9892
}
9993

10094
async function deleteRoleById(id: string) {

0 commit comments

Comments
 (0)