Преглед изворни кода

feat(permissions): update permission scopes to franchisor_registrations and enhance access controls across user and group management features

ebagabee пре 2 недеља
родитељ
комит
493efe0807

+ 8 - 1
src/pages/cadastros/tabs/GruposTab.vue

@@ -8,7 +8,7 @@
       :female="false"
       :loading="loading"
       no-api-call
-      add-item
+      :add-item="canAdd"
       @on-add-item="handleAdd"
     >
       <template #body-cell-status="{ row }">
@@ -24,6 +24,7 @@
         <q-td auto-width>
           <q-item-section class="no-wrap" style="flex-direction: row">
             <q-btn
+              v-if="canEdit"
               outline
               icon="mdi-pencil-outline"
               style="width: 36px"
@@ -31,6 +32,7 @@
               @click.prevent.stop="handleEdit(row)"
             />
             <q-btn
+              v-if="canDelete"
               outline
               icon="mdi-trash-can-outline"
               style="width: 36px"
@@ -50,8 +52,13 @@ import { useQuasar } from "quasar";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import AddEditGroupDialog from "../components/AddEditGroupDialog.vue";
 import { getGroups, deleteGroup } from "src/api/group";
+import { permissionStore } from "src/stores/permission";
 
 const $q = useQuasar();
+const permissions = permissionStore();
+const canAdd = permissions.getAccess("franchisor_registrations", "add");
+const canEdit = permissions.getAccess("franchisor_registrations", "edit");
+const canDelete = permissions.getAccess("franchisor_registrations", "delete");
 
 const rows = ref([]);
 const loading = ref(false);

+ 24 - 3
src/pages/cadastros/tabs/UsuariosTab.vue

@@ -6,7 +6,7 @@
       :columns
       description="Usuários"
       no-api-call
-      add-item
+      :add-item="canAdd"
       add-item-route="UserAddPage"
     >
       <template #body-cell-user_type="{ row }">
@@ -26,6 +26,7 @@
         <q-td auto-width>
           <q-item-section class="no-wrap" style="flex-direction: row">
             <q-btn
+              v-if="canEdit"
               outline
               icon="mdi-account-edit-outline"
               style="width: 36px"
@@ -33,11 +34,12 @@
               @click.prevent.stop="onEdit(row)"
             />
             <q-btn
+              v-if="canDelete"
               outline
               icon="mdi-trash-can-outline"
               style="width: 36px"
               class="q-mr-sm"
-              @click.prevent.stop="() => {}"
+              @click.prevent.stop="onDelete(row)"
             />
           </q-item-section>
         </q-td>
@@ -50,9 +52,16 @@
 import { ref, computed, onMounted } from "vue";
 import { useRouter } from "vue-router";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
-import { getUsers } from "src/api/user";
+import { deleteUser, getUsers } from "src/api/user";
+import { useQuasar } from "quasar";
+import { permissionStore } from "src/stores/permission";
 
 const router = useRouter();
+const $q = useQuasar();
+const permissions = permissionStore();
+const canAdd = permissions.getAccess("franchisor_registrations", "add");
+const canEdit = permissions.getAccess("franchisor_registrations", "edit");
+const canDelete = permissions.getAccess("franchisor_registrations", "delete");
 
 const funcaoSelected = ref(null);
 const allUsers = ref([]);
@@ -84,6 +93,18 @@ function onEdit(row) {
   router.push({ name: "UserEditPage", params: { id: row.id } });
 }
 
+function onDelete(row) {
+  $q.dialog({
+    title: "Excluir usuário",
+    message: `Deseja excluir o usuário "${row.name}"?`,
+    cancel: true,
+    persistent: true,
+  }).onOk(async () => {
+    await deleteUser(row.id);
+    allUsers.value = allUsers.value.filter((user) => user.id !== row.id);
+  });
+}
+
 onMounted(async () => {
   try {
     allUsers.value = await getUsers();

+ 1 - 1
src/pages/permissions/permission_menus.js

@@ -61,7 +61,7 @@ export const FRANCHISOR_PERMISSION_MENUS = Object.freeze([
   },
   { scope: "franchisor_support", label: "Suporte", icon: "mdi-headset" },
   { scope: "franchisor_activities", label: "Atividades", icon: "mdi-clipboard-list-outline" },
-  { scope: "config", label: "Cadastros", icon: "mdi-account-multiple-outline" },
+  { scope: "franchisor_registrations", label: "Cadastros", icon: "mdi-account-multiple-outline" },
   {
     scope: "config.user-type",
     label: "Permissões",

+ 9 - 0
src/pages/users/UserActionPage.vue

@@ -147,6 +147,7 @@
 
           <div class="row justify-end q-mt-md full-width">
             <q-btn
+              v-if="canSave"
               label="SALVAR"
               icon-right="mdi-check"
               color="primary"
@@ -172,6 +173,7 @@ import UserTypeSelect from "src/components/selects/UserTypeSelect.vue";
 import { useInputRules } from "src/composables/useInputRules";
 import { useSubmitHandler } from "src/composables/useSubmitHandler";
 import { createUser, updateUser, getUserById } from "src/api/user";
+import { permissionStore } from "src/stores/permission";
 
 const router = useRouter();
 const route = useRoute();
@@ -189,6 +191,13 @@ const editUnitIds = ref([]);
 const loadingUser = ref(false);
 
 const isEdit = computed(() => !!route.params.id);
+const permissions = permissionStore();
+const canSave = computed(() =>
+  permissions.getAccess(
+    "franchisor_registrations",
+    isEdit.value ? "edit" : "add",
+  ),
+);
 
 const form = ref({
   access_scope: "unit",

+ 3 - 4
src/router/routes/user.route.js

@@ -9,7 +9,7 @@ export default [
         translate: false,
       },
       requireAuth: true,
-      requiredPermission: "config.city",
+      requiredPermission: "franchisor_registrations",
       breadcrumbs: [
         {
           name: "CadastrosPage",
@@ -32,7 +32,7 @@ export default [
         translate: false,
       },
       requireAuth: true,
-      requiredPermission: "config.city",
+      requiredPermission: "franchisor_registrations",
       breadcrumbs: [
         {
           name: "CadastrosPage",
@@ -55,8 +55,7 @@ export default [
         translate: false,
       },
       requireAuth: true,
-      // TODO: Verificar permissao, fazendo seeder e substituindo
-      requiredPermission: "config.city",
+      requiredPermission: "franchisor_registrations",
       breadcrumbs: [
         {
           name: "CadastrosPage",

+ 1 - 1
src/stores/navigation.js

@@ -122,7 +122,7 @@ export const navigationStore = defineStore("navigation", () => {
       icon: "mdi-account-multiple-outline",
       disable: false,
       permission: false,
-      permissionScope: "dashboard",
+      permissionScope: "franchisor_registrations",
     },
     {
       type: "single",