GruposTab.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. <template>
  2. <div>
  3. <DefaultTable
  4. v-model:rows="rows"
  5. title="Lista de Grupos"
  6. :columns
  7. description="Grupos"
  8. :female="false"
  9. :loading="loading"
  10. no-api-call
  11. :add-item="canAdd"
  12. @on-add-item="handleAdd"
  13. >
  14. <template #body-cell-status="{ row }">
  15. <q-td align="center">
  16. <q-badge
  17. :color="row.status === 'ACTIVE' ? 'positive' : 'warning'"
  18. :label="row.status === 'ACTIVE' ? 'Ativo' : 'Inativo'"
  19. />
  20. </q-td>
  21. </template>
  22. <template #body-cell-actions="{ row }">
  23. <q-td auto-width>
  24. <q-item-section class="no-wrap" style="flex-direction: row">
  25. <q-btn
  26. v-if="canEdit"
  27. outline
  28. icon="mdi-pencil-outline"
  29. style="width: 36px"
  30. class="q-mr-sm"
  31. @click.prevent.stop="handleEdit(row)"
  32. />
  33. <q-btn
  34. v-if="canDelete"
  35. outline
  36. icon="mdi-trash-can-outline"
  37. style="width: 36px"
  38. class="q-mr-sm"
  39. @click.prevent.stop="handleDelete(row)"
  40. />
  41. </q-item-section>
  42. </q-td>
  43. </template>
  44. </DefaultTable>
  45. </div>
  46. </template>
  47. <script setup>
  48. import { ref, onMounted } from "vue";
  49. import { useQuasar } from "quasar";
  50. import DefaultTable from "src/components/defaults/DefaultTable.vue";
  51. import AddEditGroupDialog from "../components/AddEditGroupDialog.vue";
  52. import { getGroups, deleteGroup } from "src/api/group";
  53. import { permissionStore } from "src/stores/permission";
  54. const $q = useQuasar();
  55. const permissions = permissionStore();
  56. const canAdd = permissions.getAccess("franchisor_registrations", "add");
  57. const canEdit = permissions.getAccess("franchisor_registrations", "edit");
  58. const canDelete = permissions.getAccess("franchisor_registrations", "delete");
  59. const rows = ref([]);
  60. const loading = ref(false);
  61. const columns = ref([
  62. { name: "name", label: "Nome", field: "name", align: "left" },
  63. { name: "active_units", label: "Unidades Ativas", field: "active_units", align: "center" },
  64. { name: "status", label: "Status", field: "status", align: "center" },
  65. { name: "actions", label: "Ações", field: null, align: "center" },
  66. ]);
  67. async function fetchGroups() {
  68. loading.value = true;
  69. try {
  70. rows.value = await getGroups();
  71. } catch (error) {
  72. console.error("Failed to load groups:", error);
  73. } finally {
  74. loading.value = false;
  75. }
  76. }
  77. function handleAdd() {
  78. $q.dialog({ component: AddEditGroupDialog }).onOk(() => fetchGroups());
  79. }
  80. function handleEdit(row) {
  81. $q.dialog({ component: AddEditGroupDialog, componentProps: { group: row } }).onOk(() => fetchGroups());
  82. }
  83. function handleDelete(row) {
  84. $q.dialog({
  85. title: "Confirmar exclusão",
  86. message: `Deseja excluir o grupo "${row.name}"?`,
  87. ok: { color: "negative", label: "Excluir" },
  88. cancel: { color: "primary", outline: true, label: "Cancelar" },
  89. }).onOk(async () => {
  90. try {
  91. await deleteGroup(row.id);
  92. await fetchGroups();
  93. } catch (error) {
  94. console.error("Failed to delete group:", error);
  95. }
  96. });
  97. }
  98. onMounted(fetchGroups);
  99. </script>