PackagesPage.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template>
  2. <div>
  3. <DefaultHeaderPage title="Proposta Comercial" :show-filter-icon="false" />
  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 -->
  17. <div v-if="loading" class="row q-col-gutter-sm">
  18. <div v-for="n in 6" :key="n" class="col-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. :class="{ 'cursor-pointer': canEdit }"
  40. @click="canEdit && openEditDialog(pkg)"
  41. />
  42. </div>
  43. <div
  44. v-if="packages.length === 0"
  45. class="col-12 text-center text-grey-5 q-py-xl"
  46. >
  47. Nenhuma proposta comercial cadastrada
  48. </div>
  49. </div>
  50. </div>
  51. </div>
  52. </template>
  53. <script setup>
  54. import { ref, onMounted } from "vue";
  55. import { useQuasar } from "quasar";
  56. import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
  57. import PackageCard from "./components/PackageCard.vue";
  58. import AddEditPackageDialog from "./components/AddEditPackageDialog.vue";
  59. import { getPackages } from "src/api/package";
  60. import { permissionStore } from "src/stores/permission";
  61. const $q = useQuasar();
  62. const permissions = permissionStore();
  63. const canAdd = permissions.getAccess("franchisor_packages", "add");
  64. const canEdit = permissions.getAccess("franchisor_packages", "edit");
  65. const loading = ref(false);
  66. const packages = ref([]);
  67. const fetchPackages = async () => {
  68. loading.value = true;
  69. try {
  70. packages.value = await getPackages();
  71. } finally {
  72. loading.value = false;
  73. }
  74. };
  75. const openAddDialog = () => {
  76. $q.dialog({ component: AddEditPackageDialog }).onOk(() => {
  77. fetchPackages();
  78. });
  79. };
  80. const openEditDialog = (pkg) => {
  81. $q.dialog({
  82. component: AddEditPackageDialog,
  83. componentProps: { package: pkg },
  84. }).onOk(() => {
  85. fetchPackages();
  86. });
  87. };
  88. onMounted(fetchPackages);
  89. </script>