Browse Source

feat(permissions): update permission scopes to franchisor_support and enhance access controls in support features

ebagabee 2 weeks ago
parent
commit
3f395929c4

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

@@ -59,7 +59,7 @@ export const FRANCHISOR_PERMISSION_MENUS = Object.freeze([
     label: "Financeiro",
     icon: "mdi-cash-multiple",
   },
-  { scope: "support-ticket", label: "Suporte", icon: "mdi-headset" },
+  { scope: "franchisor_support", label: "Suporte", icon: "mdi-headset" },
   { scope: "kanban", label: "Atividades", icon: "mdi-clipboard-list-outline" },
   { scope: "config", label: "Cadastros", icon: "mdi-account-multiple-outline" },
   {

+ 9 - 3
src/pages/support/SupportPage.vue

@@ -5,7 +5,7 @@
       ref="tableRef"
       :columns="columns"
       :api-call="getSupportTickets"
-      add-item
+      :add-item="canAdd"
       title="Tickets"
       :female="false"
       description="tickets"
@@ -49,6 +49,7 @@
           "
         >
           <q-btn
+            v-if="canEdit"
             outline
             icon="mdi-pencil-outline"
             style="width: 36px"
@@ -56,7 +57,7 @@
           />
 
           <q-btn
-            v-if="row.status === 'in_progress'"
+            v-if="canEdit && row.status === 'in_progress'"
             outline
             icon="mdi-check-circle-outline"
             style="width: 36px"
@@ -64,7 +65,7 @@
           />
 
           <q-btn
-            v-if="row.status === 'in_progress'"
+            v-if="canDelete && row.status === 'in_progress'"
             outline
             icon="mdi-trash-can-outline"
             style="width: 36px"
@@ -83,6 +84,7 @@ import { useQuasar } from "quasar";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import { getSupportTickets, deleteSupportTicket } from "src/api/support_ticket";
+import { permissionStore } from "src/stores/permission";
 
 const AddEditTicketDialog = defineAsyncComponent(
   () => import("src/pages/support/components/AddEditTicketDialog.vue"),
@@ -93,6 +95,10 @@ const CloseTicketDialog = defineAsyncComponent(
 );
 
 const $q = useQuasar();
+const permissions = permissionStore();
+const canAdd = permissions.getAccess("franchisor_support", "add");
+const canEdit = permissions.getAccess("franchisor_support", "edit");
+const canDelete = permissions.getAccess("franchisor_support", "delete");
 const tableRef = useTemplateRef("tableRef");
 
 const openAddEditTicketDialog = (ticket = null) => {

+ 10 - 3
src/pages/support/components/AddEditTicketDialog.vue

@@ -83,7 +83,7 @@
             <!-- Tab: Comentários -->
             <div v-show="currentTab === 'comentarios'">
               <div
-                v-if="ticket?.status === 'in_progress'"
+                v-if="canAdd && ticket?.status === 'in_progress'"
                 class="flex justify-end q-mb-sm"
               >
                 <q-btn
@@ -111,6 +111,8 @@
                     :reply="reply.reply"
                     :created-at="reply.created_at"
                     :user-name="reply.user_name"
+                    :can-edit="canEdit"
+                    :can-delete="canDelete"
                     @edit="onEditComment(reply)"
                     @delete="onDeleteComment(reply)"
                   />
@@ -133,14 +135,14 @@
               @click="onDialogCancel"
             />
             <q-btn
-              v-if="ticket?.id && ticket?.status === 'in_progress'"
+              v-if="canEdit && ticket?.id && ticket?.status === 'in_progress'"
               outline
               color="negative"
               label="Encerrar"
               @click="onCloseTicket"
             />
             <q-btn
-              v-if="!ticket?.id || ticket?.status === 'in_progress'"
+              v-if="(!ticket?.id && canAdd) || (ticket?.id && canEdit && ticket?.status === 'in_progress')"
               color="primary"
               label="Salvar"
               type="submit"
@@ -172,6 +174,7 @@ import {
 import CloseTicketDialog from "./CloseTicketDialog.vue";
 import AddEditReplyDialog from "./AddEditReplyDialog.vue";
 import { getSupportReplies, deleteSupportReply } from "src/api/support_reply";
+import { permissionStore } from "src/stores/permission";
 
 defineEmits([...useDialogPluginComponent.emits]);
 
@@ -186,6 +189,10 @@ const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } =
   useDialogPluginComponent();
 
 const $q = useQuasar();
+const permissions = permissionStore();
+const canAdd = permissions.getAccess("franchisor_support", "add");
+const canEdit = permissions.getAccess("franchisor_support", "edit");
+const canDelete = permissions.getAccess("franchisor_support", "delete");
 const { user } = userStore();
 
 const formRef = ref(null);

+ 4 - 0
src/pages/support/components/TicketCommentCard.vue

@@ -11,6 +11,7 @@
       </div>
       <div style="display: flex; gap: 4px; flex-shrink: 0">
         <q-btn
+          v-if="canEdit"
           flat
           dense
           round
@@ -20,6 +21,7 @@
           @click="$emit('edit')"
         />
         <q-btn
+          v-if="canDelete"
           flat
           dense
           round
@@ -37,6 +39,8 @@
 defineEmits(["edit", "delete"]);
 
 defineProps({
+  canEdit: { type: Boolean, default: false },
+  canDelete: { type: Boolean, default: false },
   reply: {
     type: String,
     required: true,

+ 1 - 1
src/router/routes/support.route.js

@@ -9,7 +9,7 @@ export default [
         translate: false,
       },
       requireAuth: true,
-      requiredPermission: "dashboard",
+      requiredPermission: "franchisor_support",
       breadcrumbs: [
         {
           name: "SupportPage",

+ 1 - 1
src/stores/navigation.js

@@ -104,7 +104,7 @@ export const navigationStore = defineStore("navigation", () => {
       icon: "mdi-headset",
       disable: false,
       permission: false,
-      permissionScope: "dashboard",
+      permissionScope: "franchisor_support",
     },
     {
       type: "single",