|
1 | 1 | <script setup lang="ts">
|
2 | 2 | import type { VForm } from 'vuetify/components/VForm'
|
3 |
| -import type { Permission } from '~/stores/admin/permission' |
4 |
| -import { useRoleStore } from '~/stores/admin/role' |
| 3 | +import { useRoleStore } from '@base/stores/admin/role' |
5 | 4 |
|
6 |
| -interface Props { |
7 |
| - isDialogVisible: boolean |
8 |
| - permissionData?: Partial<Permission> |
9 |
| -} |
10 |
| -interface Emit { |
11 |
| - (e: 'update:isDialogVisible', value: boolean): void |
12 |
| - (e: 'update:permissionData', value: Partial<Permission>): void |
13 |
| -} |
14 |
| -
|
15 |
| -const props = defineProps<Props>() |
16 |
| -const emit = defineEmits<Emit>() |
| 5 | +import type { sysPermissionTable } from '@base/server/db/schemas/sys_permissions.schema' |
| 6 | +import type { InferSelectModel } from 'drizzle-orm' |
| 7 | +import { usePermissionStore } from '@base/stores/admin/permission' |
| 8 | +import { cloneDeep } from 'lodash-es' |
| 9 | +import { PermissionAction, PermissionScope } from '@base/server/db/schemas' |
| 10 | +import { requiredValidator } from '#imports' |
17 | 11 |
|
18 |
| -const roleStore = useRoleStore() |
19 |
| -const { roleList } = storeToRefs(roleStore) |
20 |
| -const { fetchRoles } = roleStore |
| 12 | +type Permission = InferSelectModel<typeof sysPermissionTable> |
21 | 13 |
|
22 |
| -const isFormValid = ref(false) |
23 |
| -const refForm = ref<VForm>() |
| 14 | +const props = defineProps<{ |
| 15 | + permission?: Permission | null |
| 16 | +}>() |
24 | 17 |
|
25 |
| -const isPermissionDataEmpty = computed(() => { |
26 |
| - const data = props.permissionData |
27 |
| - return !data || Object.values(data).every(value => value === '') |
28 |
| -}) |
| 18 | +const emit = defineEmits<{ |
| 19 | + (e: 'edit', payload: Permission): void |
| 20 | + (e: 'create', payload: Permission): void |
| 21 | + (e: 'cancel'): void |
| 22 | +}>() |
29 | 23 |
|
30 |
| -const localPermissionData = ref<Partial<Permission>>({ |
31 |
| - id: '', |
32 |
| - role_id: '', |
33 |
| - action: '', |
34 |
| - subject: '', |
| 24 | +const modelValue = defineModel<boolean>({ |
| 25 | + default: false, |
35 | 26 | })
|
36 | 27 |
|
37 |
| -function onReset() { |
38 |
| - emit('update:isDialogVisible', false) |
39 |
| -
|
40 |
| - refForm.value?.reset() |
| 28 | +const formTemplate = useTemplateRef('formRef') |
41 | 29 |
|
42 |
| - localPermissionData.value = { |
| 30 | +function getDefaultFormData(): Permission { |
| 31 | + return { |
43 | 32 | id: '',
|
44 |
| - role_id: '', |
45 |
| - action: '', |
| 33 | + action: PermissionAction.READ, |
46 | 34 | subject: '',
|
| 35 | + scope: PermissionScope.ALL, |
| 36 | + scope_value: '', |
47 | 37 | }
|
48 | 38 | }
|
49 | 39 |
|
50 |
| -function onSubmit() { |
51 |
| - refForm.value?.validate().then(({ valid }) => { |
52 |
| - if (valid) { |
53 |
| - emit('update:permissionData', props.permissionData |
54 |
| - ? localPermissionData.value |
55 |
| - : { |
56 |
| - role_id: localPermissionData.value.role_id, |
57 |
| - action: localPermissionData.value.action, |
58 |
| - subject: localPermissionData.value.subject, |
59 |
| - }) |
60 |
| -
|
61 |
| - onReset() |
62 |
| - } |
63 |
| - }) |
64 |
| -} |
| 40 | +const formData = ref(getDefaultFormData()) |
65 | 41 |
|
66 |
| -watch(() => props.permissionData, (newPermissionData) => { |
67 |
| - if (newPermissionData) { |
68 |
| - localPermissionData.value = { ...newPermissionData } |
| 42 | +watch(modelValue, (value) => { |
| 43 | + if (!value) { |
| 44 | + formData.value = getDefaultFormData() |
69 | 45 | }
|
70 |
| -}, { immediate: true }) |
| 46 | +}) |
| 47 | +
|
| 48 | +syncRef(computed(() => props.permission), formData, { |
| 49 | + direction: 'ltr', |
| 50 | + transform: { |
| 51 | + ltr(left) { |
| 52 | + if (left) |
| 53 | + return cloneDeep(left) |
71 | 54 |
|
72 |
| -onMounted(async () => { |
73 |
| - await fetchRoles() |
| 55 | + return getDefaultFormData() |
| 56 | + }, |
| 57 | + }, |
74 | 58 | })
|
| 59 | +
|
| 60 | +async function handleSubmit() { |
| 61 | + try { |
| 62 | + if (formTemplate.value) { |
| 63 | + const { valid } = await formTemplate.value.validate() |
| 64 | +
|
| 65 | + if (valid) { |
| 66 | + if (formData.value.id) { |
| 67 | + emit('edit', formData.value) |
| 68 | + } |
| 69 | + else { |
| 70 | + emit('create', formData.value) |
| 71 | + } |
| 72 | + } |
| 73 | + } |
| 74 | + } |
| 75 | + catch {} |
| 76 | +} |
75 | 77 | </script>
|
76 | 78 |
|
77 | 79 | <template>
|
78 | 80 | <VDialog
|
| 81 | + v-model="modelValue" |
79 | 82 | :width="$vuetify.display.smAndDown ? 'auto' : 600"
|
80 |
| - :model-value="props.isDialogVisible" |
81 |
| - @update:model-value="onReset" |
82 | 83 | >
|
83 | 84 | <VCard class="pa-sm-8 pa-5">
|
84 | 85 | <!-- 👉 dialog close btn -->
|
85 | 86 | <DialogCloseBtn
|
86 | 87 | variant="text"
|
87 | 88 | size="default"
|
88 |
| - @click="onReset" |
| 89 | + @click="modelValue = false" |
89 | 90 | />
|
90 | 91 |
|
91 | 92 | <VCardText class="mt-5">
|
92 |
| - <!-- 👉 Title --> |
93 | 93 | <div class="text-center mb-6">
|
94 | 94 | <h4 class="text-h4 mb-2">
|
95 |
| - {{ isPermissionDataEmpty ? 'Add' : 'Edit' }} Permission |
| 95 | + {{ permission ? $t('Edit Permission') : $t('Create Permission') }} |
96 | 96 | </h4>
|
97 |
| - |
98 |
| - <p class="text-body-1"> |
99 |
| - {{ isPermissionDataEmpty ? 'Add' : 'Edit' }} permission as per your requirements. |
100 |
| - </p> |
101 | 97 | </div>
|
102 | 98 |
|
103 |
| - <!-- 👉 Form --> |
104 | 99 | <VForm
|
105 |
| - ref="refForm" |
106 |
| - v-model="isFormValid" |
107 |
| - @submit.prevent="onSubmit" |
| 100 | + ref="formRef" |
| 101 | + @submit.prevent="handleSubmit" |
108 | 102 | >
|
109 | 103 | <VAlert
|
110 | 104 | type="warning"
|
111 |
| - title="Warning!" |
| 105 | + :title="$t('Be careful!')" |
112 | 106 | variant="tonal"
|
113 | 107 | class="mb-6"
|
114 | 108 | >
|
115 |
| - By {{ isPermissionDataEmpty ? 'editing' : 'adding' }} the permission name, you might break the system permissions functionality. Please ensure you're absolutely certain before proceeding. |
| 109 | + {{ |
| 110 | + $t('By modifying permission, you might break the system permissions functionality. Please ensure you\'re absolutely certain before proceeding.') |
| 111 | + }} |
116 | 112 | </VAlert>
|
117 | 113 |
|
118 | 114 | <!-- 👉 Role action -->
|
119 | 115 | <div class="mb-4">
|
120 | 116 | <div class="d-flex flex-column gap-4 mb-4">
|
121 | 117 | <VSelect
|
122 |
| - v-model="localPermissionData.action" |
| 118 | + v-model="formData.action" |
123 | 119 | density="compact"
|
| 120 | + :label="$t('Select Permission')" |
| 121 | + :placeholder="$t('Select Permission')" |
124 | 122 | :rules="[requiredValidator]"
|
125 |
| - label="Select Action" |
126 |
| - placeholder="Select Action" |
127 | 123 | :items="[
|
128 | 124 | {
|
129 |
| - title: 'Create', |
130 |
| - value: 'create', |
| 125 | + title: $t('Create'), |
| 126 | + value: PermissionAction.CREATE, |
131 | 127 | },
|
132 | 128 | {
|
133 |
| - title: 'Read', |
134 |
| - value: 'read', |
| 129 | + title: $t('Read'), |
| 130 | + value: PermissionAction.READ, |
135 | 131 | },
|
136 | 132 | {
|
137 |
| - title: 'Update', |
138 |
| - value: 'update', |
| 133 | + title: $t('Update'), |
| 134 | + value: PermissionAction.UPDATE, |
139 | 135 | },
|
140 | 136 | {
|
141 |
| - title: 'Delete', |
142 |
| - value: 'delete', |
| 137 | + title: $t('Delete'), |
| 138 | + value: PermissionAction.DELETE, |
143 | 139 | },
|
144 | 140 | {
|
145 |
| - title: 'Manage', |
146 |
| - value: 'manage', |
| 141 | + title: $t('Manage'), |
| 142 | + value: PermissionAction.MANAGE, |
147 | 143 | },
|
148 | 144 | ]"
|
149 | 145 | />
|
150 | 146 |
|
151 |
| - <VSelect |
152 |
| - v-model="localPermissionData.role_id" |
153 |
| - density="compact" |
154 |
| - label="Select Role" |
| 147 | + <VTextField |
| 148 | + v-model="formData.subject" |
| 149 | + placeholder="Post, Category, User, etc." |
| 150 | + :label="$t('Fill Module Name')" |
155 | 151 | :rules="[requiredValidator]"
|
156 |
| - :items="roleList" |
157 |
| - item-title="name" |
158 |
| - item-value="id" |
159 | 152 | />
|
160 | 153 |
|
161 | 154 | <VSelect
|
162 |
| - v-model="localPermissionData.subject" |
| 155 | + v-model="formData.scope" |
163 | 156 | density="compact"
|
| 157 | + :label="$t('Select Scope')" |
| 158 | + :placeholder="$t('Select Scope')" |
164 | 159 | :rules="[requiredValidator]"
|
165 |
| - label="Select Subject" |
166 | 160 | :items="[
|
167 | 161 | {
|
168 |
| - title: 'Category', |
169 |
| - value: 'category', |
| 162 | + title: $t('All'), |
| 163 | + value: PermissionScope.ALL, |
170 | 164 | },
|
171 | 165 | {
|
172 |
| - title: 'Project', |
173 |
| - value: 'project', |
| 166 | + title: $t('Organization'), |
| 167 | + value: PermissionScope.ORGANIZATION, |
174 | 168 | },
|
175 | 169 | {
|
176 |
| - title: 'All', |
177 |
| - value: 'all', |
| 170 | + title: $t('Creator'), |
| 171 | + value: PermissionScope.SELF, |
| 172 | + }, |
| 173 | + { |
| 174 | + title: $t('Custom'), |
| 175 | + value: PermissionScope.CUSTOM, |
178 | 176 | },
|
179 | 177 | ]"
|
180 | 178 | />
|
| 179 | + |
| 180 | + <VTextField |
| 181 | + v-if="formData.scope === PermissionScope.CUSTOM" |
| 182 | + v-model="formData.scope_value" |
| 183 | + placeholder="Post, Category, User, etc." |
| 184 | + :label="$t('Fill Scope Value')" |
| 185 | + :rules="[requiredValidator]" |
| 186 | + /> |
181 | 187 | </div>
|
182 | 188 |
|
183 |
| - <VBtn @click="onSubmit"> |
184 |
| - {{ isPermissionDataEmpty ? 'Add' : 'Edit' }} |
| 189 | + <VBtn type="submit"> |
| 190 | + {{ permission ? $t('Update') : $t('Submit') }} |
185 | 191 | </VBtn>
|
186 | 192 | </div>
|
187 | 193 | </VForm>
|
|
0 commit comments