PackagesPage.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <template>
  2. <div>
  3. <DefaultHeaderPage title="Pacotes" />
  4. <div class="q-px-sm">
  5. <!-- Add button -->
  6. <div class="row justify-end q-mb-md">
  7. <q-btn
  8. v-if="canAdd"
  9. color="primary"
  10. icon="mdi-plus"
  11. unelevated
  12. style="border-radius: 8px; height: 40px; width: 40px"
  13. @click="openAddDialog"
  14. />
  15. </div>
  16. <!-- Loading skeleton -->
  17. <div v-if="loading" class="row q-col-gutter-sm">
  18. <div v-for="n in 6" :key="n" class="col-12 col-sm-6 col-md-4">
  19. <q-card flat bordered style="border-radius: 12px">
  20. <q-card-section>
  21. <q-skeleton type="text" width="60%" />
  22. <q-skeleton type="text" width="30%" class="q-mb-sm" />
  23. <q-skeleton type="text" width="80%" />
  24. <q-skeleton type="text" width="70%" />
  25. <q-skeleton type="text" width="50%" />
  26. </q-card-section>
  27. </q-card>
  28. </div>
  29. </div>
  30. <!-- Packages grid -->
  31. <div v-else class="row q-col-gutter-sm">
  32. <div
  33. v-for="pkg in packages"
  34. :key="pkg.id"
  35. class="col-12 col-sm-6 col-md-4"
  36. >
  37. <PackageCard
  38. :pkg="pkg"
  39. :can-delete="canDelete"
  40. @click="openPackage(pkg)"
  41. @delete="confirmDelete(pkg)"
  42. />
  43. </div>
  44. <div
  45. v-if="packages.length === 0"
  46. class="col-12 text-center text-grey-5 q-py-xl"
  47. >
  48. Nenhum pacote disponível para sua unidade
  49. </div>
  50. </div>
  51. </div>
  52. </div>
  53. </template>
  54. <script setup>
  55. import { computed, ref, onMounted, watch } from "vue";
  56. import { useQuasar } from "quasar";
  57. import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
  58. import PackageCard from "./components/PackageCard.vue";
  59. import AddEditPackageDialog from "./components/AddEditPackageDialog.vue";
  60. import PackageDetailDialog from "./components/PackageDetailDialog.vue";
  61. import { deleteUnitPackage, getUnitPackages } from "src/api/package";
  62. import { userStore } from "src/stores/user";
  63. import { permissionStore } from "src/stores/permission";
  64. const $q = useQuasar();
  65. const store = userStore();
  66. const permissions = permissionStore();
  67. const canAdd = computed(() =>
  68. permissions.getAccess("franchisee_packages", "add"),
  69. );
  70. const canEdit = computed(() =>
  71. permissions.getAccess("franchisee_packages", "edit"),
  72. );
  73. const canDelete = computed(() =>
  74. permissions.getAccess("franchisee_packages", "delete"),
  75. );
  76. const loading = ref(false);
  77. const packages = ref([]);
  78. const fetchPackages = async () => {
  79. loading.value = true;
  80. try {
  81. packages.value = await getUnitPackages();
  82. } finally {
  83. loading.value = false;
  84. }
  85. };
  86. const openAddDialog = () => {
  87. $q.dialog({ component: AddEditPackageDialog }).onOk(() => {
  88. fetchPackages();
  89. });
  90. };
  91. const openEditDialog = (pkg) => {
  92. $q.dialog({
  93. component: AddEditPackageDialog,
  94. componentProps: { package: pkg },
  95. }).onOk(() => {
  96. fetchPackages();
  97. });
  98. };
  99. const openPackage = (pkg) => {
  100. if (canEdit.value) {
  101. openEditDialog(pkg);
  102. return;
  103. }
  104. $q.dialog({
  105. component: PackageDetailDialog,
  106. componentProps: { pkg },
  107. });
  108. };
  109. const confirmDelete = (pkg) => {
  110. $q.dialog({
  111. title: "Excluir pacote",
  112. message: `Deseja excluir o pacote ${pkg.name}?`,
  113. cancel: true,
  114. persistent: true,
  115. }).onOk(async () => {
  116. await deleteUnitPackage(pkg.id);
  117. await fetchPackages();
  118. });
  119. };
  120. // Recarrega pacotes ao trocar de unidade
  121. watch(
  122. () => store.selectedUnit?.id,
  123. (newId, oldId) => {
  124. if (newId && newId !== oldId) fetchPackages();
  125. },
  126. );
  127. onMounted(fetchPackages);
  128. </script>