Explorar el Código

feat(permissions): update permission scopes and enhance package management features

ebagabee hace 2 semanas
padre
commit
f5c9e6aae0

+ 10 - 1
src/pages/packages/PackagesPage.vue

@@ -6,6 +6,7 @@
       <!-- Add button -->
       <div class="row justify-end q-mb-md">
         <q-btn
+          v-if="canAdd"
           color="primary"
           icon="mdi-plus"
           unelevated
@@ -36,7 +37,11 @@
           :key="pkg.id"
           class="col-12 col-sm-6 col-md-4"
         >
-          <PackageCard :pkg="pkg" @click="openEditDialog(pkg)" />
+          <PackageCard
+            :pkg="pkg"
+            :class="{ 'cursor-pointer': canEdit }"
+            @click="canEdit && openEditDialog(pkg)"
+          />
         </div>
 
         <div
@@ -59,8 +64,12 @@ import PackageCard from "./components/PackageCard.vue";
 import AddEditPackageDialog from "./components/AddEditPackageDialog.vue";
 
 import { getPackages } from "src/api/package";
+import { permissionStore } from "src/stores/permission";
 
 const $q = useQuasar();
+const permissions = permissionStore();
+const canAdd = permissions.getAccess("franchisor_packages", "add");
+const canEdit = permissions.getAccess("franchisor_packages", "edit");
 
 const loading = ref(false);
 const packages = ref([]);

+ 6 - 0
src/pages/permissions/components/PermissionGroupDialog.vue

@@ -60,6 +60,7 @@
                     <q-tooltip>Editar permissões</q-tooltip>
                     <PermissionLevelMenu
                       :bits="bitsFor(item.scope)"
+                      :available-bits="availableBitsFor(item.scope)"
                       @update:bits="(value) => setBits(item.scope, value)"
                     />
                   </q-btn>
@@ -121,6 +122,7 @@
                     <q-tooltip>Editar permissões</q-tooltip>
                     <PermissionLevelMenu
                       :bits="bitsFor(child.scope)"
+                      :available-bits="availableBitsFor(child.scope)"
                       @update:bits="(value) => setBits(child.scope, value)"
                     />
                   </q-btn>
@@ -186,6 +188,7 @@ const selectedScope = ref(null);
 // permission_id e bits atuais do grupo, indexados pelo scope do menu.
 const permissionIdByScope = ref({});
 const bitsByScope = ref({});
+const availableBitsByScope = ref({});
 
 const menus = computed(() =>
   FRANCHISOR_PERMISSION_MENUS.filter(
@@ -204,6 +207,7 @@ const children = computed(() =>
 );
 
 const bitsFor = (scope) => bitsByScope.value[scope] ?? 0;
+const availableBitsFor = (scope) => availableBitsByScope.value[scope] ?? 0;
 
 const setBits = (scope, value) => {
   bitsByScope.value[scope] = value;
@@ -225,12 +229,14 @@ const fetchPermissions = async () => {
 
     permissionIdByScope.value = {};
     bitsByScope.value = {};
+    availableBitsByScope.value = {};
 
     for (const scope of scopesInMenu()) {
       const permission = byScope[scope];
       if (!permission) continue;
 
       permissionIdByScope.value[scope] = permission.id;
+      availableBitsByScope.value[scope] = permission.available_bits;
       // Normaliza dados anteriores à regra (ex.: Visualizar gravado sem Menu).
       bitsByScope.value[scope] = applyComputedLevels(permission.bits);
     }

+ 11 - 2
src/pages/permissions/components/PermissionLevelMenu.vue

@@ -4,7 +4,7 @@
       <q-item-label header class="q-pb-xs">Permissões</q-item-label>
 
       <q-item
-        v-for="level in PERMISSION_LEVELS"
+        v-for="level in availableLevels"
         :key="level.key"
         v-ripple="!level.computed"
         :clickable="!level.computed"
@@ -33,18 +33,27 @@
 </template>
 
 <script setup>
+import { computed } from "vue";
 import {
   PERMISSION_LEVELS,
   applyComputedLevels,
 } from "src/pages/permissions/permission_menus";
 
-const { bits } = defineProps({
+const { bits, availableBits } = defineProps({
   bits: {
     type: Number,
     default: 0,
   },
+  availableBits: {
+    type: Number,
+    default: 511,
+  },
 });
 
+const availableLevels = computed(() =>
+  PERMISSION_LEVELS.filter((level) => (availableBits & level.bit) !== 0),
+);
+
 const emit = defineEmits(["update:bits"]);
 
 const has = (bit) => (bits & bit) !== 0;

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

@@ -48,7 +48,7 @@ export const FRANCHISOR_PERMISSION_MENUS = Object.freeze([
     icon: "mdi-home-variant-outline",
   },
   {
-    scope: "class-package",
+    scope: "franchisor_packages",
     label: "Pacotes",
     icon: "mdi-package-variant-closed",
   },

+ 1 - 0
src/router/routes/package.route.js

@@ -9,6 +9,7 @@ export default [
         translate: false,
       },
       requireAuth: true,
+      requiredPermission: "franchisor_packages",
       breadcrumbs: [
         {
           name: "DashboardPage",

+ 1 - 1
src/stores/navigation.js

@@ -30,7 +30,7 @@ export const navigationStore = defineStore("navigation", () => {
       icon: "mdi-package-variant-closed",
       disable: false,
       permission: false,
-      permissionScope: "dashboard",
+      permissionScope: "franchisor_packages",
     },
     {
       type: "single",