Pārlūkot izejas kodu

feat: reload page data when selected unit changes

- StudentPage, DashboardPage, PackagesPage, ContractsPage, SupportPage:
  watch selectedUnit and re-fetch on change
- UsersPage: key on selectedUnit id to remount DefaultTable
- UnitActionPage: key container div to remount all tabs
- UserActionPage: use selectedUnit id as unit_id when creating users
ebagabee 2 nedēļas atpakaļ
vecāks
revīzija
3827c23803

+ 10 - 1
src/pages/contracts/ContractsPage.vue

@@ -107,11 +107,12 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { ref, computed, onMounted } from "vue";
+import { ref, computed, onMounted, watch } from "vue";
 import { useQuasar } from "quasar";
 import { useQuasar } from "quasar";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import DashboardStatCard from "src/components/charts/DashboardStatCard.vue";
 import DashboardStatCard from "src/components/charts/DashboardStatCard.vue";
+import { userStore } from "src/stores/user";
 import ContractActionConfirmDialog from "src/pages/students/components/ContractActionConfirmDialog.vue";
 import ContractActionConfirmDialog from "src/pages/students/components/ContractActionConfirmDialog.vue";
 import FreezeContractDialog from "src/pages/students/components/FreezeContractDialog.vue";
 import FreezeContractDialog from "src/pages/students/components/FreezeContractDialog.vue";
 import ViewContractDialog from "src/pages/students/components/ViewContractDialog.vue";
 import ViewContractDialog from "src/pages/students/components/ViewContractDialog.vue";
@@ -122,6 +123,7 @@ import {
 } from "src/api/studentContract";
 } from "src/api/studentContract";
 
 
 const $q = useQuasar();
 const $q = useQuasar();
+const store = userStore();
 const rows = ref([]);
 const rows = ref([]);
 const isLoading = ref(false);
 const isLoading = ref(false);
 
 
@@ -213,6 +215,13 @@ function statusLabel(status) {
   return "Inativo";
   return "Inativo";
 }
 }
 
 
+watch(
+  () => store.selectedUnit?.id,
+  (newId, oldId) => {
+    if (newId && newId !== oldId) loadContracts();
+  },
+);
+
 onMounted(loadContracts);
 onMounted(loadContracts);
 </script>
 </script>
 
 

+ 14 - 1
src/pages/dashboard/DashboardPage.vue

@@ -186,7 +186,7 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { ref, computed, onMounted } from "vue";
+import { ref, computed, onMounted, watch } from "vue";
 import { Doughnut } from "vue-chartjs";
 import { Doughnut } from "vue-chartjs";
 import { Chart as ChartJS, ArcElement, Tooltip, Legend } from "chart.js";
 import { Chart as ChartJS, ArcElement, Tooltip, Legend } from "chart.js";
 import { useQuasar } from "quasar";
 import { useQuasar } from "quasar";
@@ -199,10 +199,12 @@ import FeriadosDialog from "./components/FeriadosDialog.vue";
 import FeriadosEditDialog from "./components/FeriadosEditDialog.vue";
 import FeriadosEditDialog from "./components/FeriadosEditDialog.vue";
 import { getHolidays } from "src/api/holiday";
 import { getHolidays } from "src/api/holiday";
 import { getStudents } from "src/api/student";
 import { getStudents } from "src/api/student";
+import { userStore } from "src/stores/user";
 
 
 ChartJS.register(ArcElement, Tooltip, Legend);
 ChartJS.register(ArcElement, Tooltip, Legend);
 
 
 const $q = useQuasar();
 const $q = useQuasar();
+const store = userStore();
 
 
 const faturamentoChart = {
 const faturamentoChart = {
   labels: [
   labels: [
@@ -392,6 +394,17 @@ function openEditFromDashboard(feriado) {
   });
   });
 }
 }
 
 
+// Recarrega dados do dashboard quando a unidade ativa mudar
+watch(
+  () => store.selectedUnit?.id,
+  (newId, oldId) => {
+    if (newId && newId !== oldId) {
+      fetchAlunos();
+      fetchHolidays();
+    }
+  },
+);
+
 onMounted(() => {
 onMounted(() => {
   fetchHolidays();
   fetchHolidays();
   fetchAlunos();
   fetchAlunos();

+ 11 - 1
src/pages/packages/PackagesPage.vue

@@ -51,7 +51,7 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { ref, onMounted } from "vue";
+import { ref, onMounted, watch } from "vue";
 import { useQuasar } from "quasar";
 import { useQuasar } from "quasar";
 
 
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
@@ -59,8 +59,10 @@ import PackageCard from "./components/PackageCard.vue";
 import AddEditPackageDialog from "./components/AddEditPackageDialog.vue";
 import AddEditPackageDialog from "./components/AddEditPackageDialog.vue";
 
 
 import { getUnitPackages } from "src/api/package";
 import { getUnitPackages } from "src/api/package";
+import { userStore } from "src/stores/user";
 
 
 const $q = useQuasar();
 const $q = useQuasar();
+const store = userStore();
 const loading = ref(false);
 const loading = ref(false);
 const packages = ref([]);
 const packages = ref([]);
 
 
@@ -88,5 +90,13 @@ const openEditDialog = (pkg) => {
   });
   });
 };
 };
 
 
+// Recarrega pacotes ao trocar de unidade
+watch(
+  () => store.selectedUnit?.id,
+  (newId, oldId) => {
+    if (newId && newId !== oldId) fetchPackages();
+  },
+);
+
 onMounted(fetchPackages);
 onMounted(fetchPackages);
 </script>
 </script>

+ 11 - 1
src/pages/students/StudentPage.vue

@@ -56,11 +56,12 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { defineAsyncComponent, ref, onMounted } from "vue";
+import { defineAsyncComponent, ref, onMounted, watch } from "vue";
 import { useQuasar } from "quasar";
 import { useQuasar } from "quasar";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import { getStudents, deleteStudent } from "src/api/student";
 import { getStudents, deleteStudent } from "src/api/student";
+import { userStore } from "src/stores/user";
 
 
 const AddEditStudentDialog = defineAsyncComponent(
 const AddEditStudentDialog = defineAsyncComponent(
   () => import("src/pages/students/components/AddEditStudentDialog.vue"),
   () => import("src/pages/students/components/AddEditStudentDialog.vue"),
@@ -71,6 +72,7 @@ const EditStudentDialog = defineAsyncComponent(
 );
 );
 
 
 const $q = useQuasar();
 const $q = useQuasar();
+const store = userStore();
 
 
 const rows = ref([]);
 const rows = ref([]);
 const isLoading = ref(false);
 const isLoading = ref(false);
@@ -147,5 +149,13 @@ function onDeleteStudent(student) {
   });
   });
 }
 }
 
 
+// Recarrega alunos sempre que a unidade ativa mudar
+watch(
+  () => store.selectedUnit?.id,
+  (newId, oldId) => {
+    if (newId && newId !== oldId) loadStudents();
+  },
+);
+
 onMounted(loadStudents);
 onMounted(loadStudents);
 </script>
 </script>

+ 10 - 1
src/pages/support/SupportPage.vue

@@ -66,12 +66,13 @@
 </template>
 </template>
 
 
 <script setup>
 <script setup>
-import { defineAsyncComponent, useTemplateRef } from "vue";
+import { defineAsyncComponent, useTemplateRef, watch } from "vue";
 import { useQuasar } from "quasar";
 import { useQuasar } from "quasar";
 
 
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import DefaultTable from "src/components/defaults/DefaultTable.vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
 import { getSupportTickets, deleteSupportTicket } from "src/api/support_ticket";
 import { getSupportTickets, deleteSupportTicket } from "src/api/support_ticket";
+import { userStore } from "src/stores/user";
 
 
 const AddEditTicketDialog = defineAsyncComponent(
 const AddEditTicketDialog = defineAsyncComponent(
   () => import("src/pages/support/components/AddEditTicketDialog.vue"),
   () => import("src/pages/support/components/AddEditTicketDialog.vue"),
@@ -82,8 +83,16 @@ const CloseTicketDialog = defineAsyncComponent(
 );
 );
 
 
 const $q = useQuasar();
 const $q = useQuasar();
+const store = userStore();
 const tableRef = useTemplateRef("tableRef");
 const tableRef = useTemplateRef("tableRef");
 
 
+watch(
+  () => store.selectedUnit?.id,
+  (newId, oldId) => {
+    if (newId && newId !== oldId) tableRef.value?.refresh();
+  },
+);
+
 const openAddEditTicketDialog = (ticket = null) => {
 const openAddEditTicketDialog = (ticket = null) => {
   $q.dialog({
   $q.dialog({
     component: AddEditTicketDialog,
     component: AddEditTicketDialog,

+ 10 - 10
src/pages/unit/UnitActionPage.vue

@@ -8,15 +8,15 @@
       class="q-mb-md"
       class="q-mb-md"
     />
     />
 
 
-    <UnitDataTab
-      v-show="activeTab === 'unit_data'"
-      v-model:form="form"
-      :get-form-as-form-data="getFormAsFormData"
-      :set-update-form-as-original="setUpdateFormAsOriginal"
-      :unit-id="unitId"
-    />
+    <div v-if="unitId" :key="unitId">
+      <UnitDataTab
+        v-show="activeTab === 'unit_data'"
+        v-model:form="form"
+        :get-form-as-form-data="getFormAsFormData"
+        :set-update-form-as-original="setUpdateFormAsOriginal"
+        :unit-id="unitId"
+      />
 
 
-    <template v-if="unitId">
       <PartnersTab v-show="activeTab === 'partners'" :unit-id="unitId" />
       <PartnersTab v-show="activeTab === 'partners'" :unit-id="unitId" />
 
 
       <ContractsTab v-show="activeTab === 'contracts'" :unit-id="unitId" />
       <ContractsTab v-show="activeTab === 'contracts'" :unit-id="unitId" />
@@ -26,7 +26,7 @@
       <HistoryTab v-show="activeTab === 'history'" :unit-id="unitId" />
       <HistoryTab v-show="activeTab === 'history'" :unit-id="unitId" />
 
 
       <MediasTab v-show="activeTab === 'medias'" :unit-id="unitId" />
       <MediasTab v-show="activeTab === 'medias'" :unit-id="unitId" />
-    </template>
+    </div>
   </div>
   </div>
 </template>
 </template>
 
 
@@ -69,7 +69,7 @@ const { form, getFormAsFormData, setUpdateFormAsOriginal } =
 
 
 const activeTab = ref("unit_data");
 const activeTab = ref("unit_data");
 
 
-const unitId = computed(() => store.user?.unit_id ?? null);
+const unitId = computed(() => store.selectedUnit?.id ?? null);
 
 
 const allTabs = [
 const allTabs = [
   { name: "unit_data", label: "Dados da Unidade" },
   { name: "unit_data", label: "Dados da Unidade" },

+ 3 - 2
src/pages/users/UserActionPage.vue

@@ -112,7 +112,8 @@ const router = useRouter();
 const route = useRoute();
 const route = useRoute();
 const $q = useQuasar();
 const $q = useQuasar();
 const { inputRules } = useInputRules();
 const { inputRules } = useInputRules();
-const { user } = storeToRefs(userStore());
+const store = userStore();
+const { user } = storeToRefs(store);
 
 
 const formRef = ref(null);
 const formRef = ref(null);
 const avatarRef = ref(null);
 const avatarRef = ref(null);
@@ -158,7 +159,7 @@ function buildPayload() {
 
 
   if (avatarFile.value) fd.append("avatar", avatarFile.value);
   if (avatarFile.value) fd.append("avatar", avatarFile.value);
 
 
-  if (user.value?.unit_id) fd.append("unit_id", user.value.unit_id);
+  if (store.selectedUnit?.id) fd.append("unit_id", store.selectedUnit.id);
   if (form.value.user_type) fd.append("user_type", form.value.user_type);
   if (form.value.user_type) fd.append("user_type", form.value.user_type);
   if (form.value.cpf) fd.append("cpf", form.value.cpf);
   if (form.value.cpf) fd.append("cpf", form.value.cpf);
   if (form.value.phone) fd.append("phone", form.value.phone);
   if (form.value.phone) fd.append("phone", form.value.phone);

+ 6 - 0
src/pages/users/UsersPage.vue

@@ -4,6 +4,7 @@
 
 
     <div class="q-px-sm">
     <div class="q-px-sm">
       <DefaultTable
       <DefaultTable
+        :key="tableKey"
         title="Lista de Usuários"
         title="Lista de Usuários"
         :columns="columns"
         :columns="columns"
         :api-call="getUsersByUnit"
         :api-call="getUsersByUnit"
@@ -34,8 +35,13 @@ import { getUsersByUnit } from "src/api/user";
 
 
 import { useRouter } from "vue-router";
 import { useRouter } from "vue-router";
 import { formatDateYMDtoDMY } from "src/helpers/utils";
 import { formatDateYMDtoDMY } from "src/helpers/utils";
+import { computed } from "vue";
+import { userStore } from "src/stores/user";
 
 
 const router = useRouter();
 const router = useRouter();
+const store = userStore();
+// Chave reativa: força remount do DefaultTable ao mudar de unidade
+const tableKey = computed(() => store.selectedUnit?.id ?? 0);
 
 
 const columns = [
 const columns = [
   {
   {