UsuariosTab.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. <template>
  2. <div>
  3. <DefaultTable
  4. v-model:rows="filteredRows"
  5. title="Lista de Usuários"
  6. :columns
  7. description="Usuários"
  8. no-api-call
  9. :add-item="canAdd"
  10. add-item-route="UserAddPage"
  11. >
  12. <template #body-cell-user_type="{ row }">
  13. <q-td align="left">{{ userTypeLabel(row.user_type) }}</q-td>
  14. </template>
  15. <template #body-cell-status="{ row }">
  16. <q-td align="center">
  17. <q-badge
  18. :color="row.status === 'ACTIVE' ? 'positive' : 'warning'"
  19. :label="row.status === 'ACTIVE' ? 'Ativo' : 'Inativo'"
  20. />
  21. </q-td>
  22. </template>
  23. <template #body-cell-actions="{ row }">
  24. <q-td auto-width>
  25. <q-item-section class="no-wrap" style="flex-direction: row">
  26. <q-btn
  27. v-if="canEdit"
  28. outline
  29. icon="mdi-account-edit-outline"
  30. style="width: 36px"
  31. class="q-mr-sm"
  32. @click.prevent.stop="onEdit(row)"
  33. />
  34. <q-btn
  35. v-if="canDelete"
  36. outline
  37. icon="mdi-trash-can-outline"
  38. style="width: 36px"
  39. class="q-mr-sm"
  40. @click.prevent.stop="onDelete(row)"
  41. />
  42. </q-item-section>
  43. </q-td>
  44. </template>
  45. </DefaultTable>
  46. </div>
  47. </template>
  48. <script setup>
  49. import { ref, computed, onMounted } from "vue";
  50. import { useRouter } from "vue-router";
  51. import DefaultTable from "src/components/defaults/DefaultTable.vue";
  52. import { deleteUser, getUsers } from "src/api/user";
  53. import { useQuasar } from "quasar";
  54. import { permissionStore } from "src/stores/permission";
  55. const router = useRouter();
  56. const $q = useQuasar();
  57. const permissions = permissionStore();
  58. const canAdd = permissions.getAccess("franchisor_registrations", "add");
  59. const canEdit = permissions.getAccess("franchisor_registrations", "edit");
  60. const canDelete = permissions.getAccess("franchisor_registrations", "delete");
  61. const funcaoSelected = ref(null);
  62. const allUsers = ref([]);
  63. const USER_TYPE_LABELS = {
  64. ADMIN: "Administrador (Franqueadora)",
  65. ADMIN_FRANCHISEE: "Administrador (Franqueada)",
  66. };
  67. const userTypeLabel = (type) => USER_TYPE_LABELS[type] ?? type;
  68. const filteredRows = computed(() => {
  69. return allUsers.value.filter((row) => {
  70. if (funcaoSelected.value && row.user_type !== funcaoSelected.value.value)
  71. return false;
  72. return true;
  73. });
  74. });
  75. const columns = ref([
  76. { name: "name", label: "Nome", field: "name", align: "left" },
  77. { name: "email", label: "E-mail", field: "email", align: "left" },
  78. { name: "user_type", label: "Função", field: "user_type", align: "left" },
  79. { name: "status", label: "Status", field: "status", align: "center" },
  80. { name: "actions", label: "Ações", field: null, align: "center" },
  81. ]);
  82. function onEdit(row) {
  83. router.push({ name: "UserEditPage", params: { id: row.id } });
  84. }
  85. function onDelete(row) {
  86. $q.dialog({
  87. title: "Excluir usuário",
  88. message: `Deseja excluir o usuário "${row.name}"?`,
  89. cancel: true,
  90. persistent: true,
  91. }).onOk(async () => {
  92. await deleteUser(row.id);
  93. allUsers.value = allUsers.value.filter((user) => user.id !== row.id);
  94. });
  95. }
  96. onMounted(async () => {
  97. try {
  98. allUsers.value = await getUsers();
  99. } catch (error) {
  100. console.error("Failed to load users:", error);
  101. }
  102. });
  103. </script>