Răsfoiți Sursa

feat: adiciona dialog de contratos cancelados

ebagabee 1 lună în urmă
părinte
comite
737ba32cf7

+ 7 - 0
src/pages/dashboard/DashboardPage.vue

@@ -182,6 +182,8 @@
           icon="mdi-cancel"
           value="57"
           subtitle="É hora de incentivar nossos alunos"
+          clickable
+          @click="openContratosCanceladosDialog"
         />
         <DashboardStatCard
           title="Receita Geral"
@@ -266,6 +268,7 @@ import GroupedBarChart from "src/components/charts/normal/GroupedBarChart.vue";
 import AniversariantesCard from "src/components/charts/AniversariantesCard.vue";
 import AlunosAtivosDialog from "src/pages/dashboard/components/AlunosAtivosDialog.vue";
 import ContratosCongeladosDialog from "src/pages/dashboard/components/ContratosCongeladosDialog.vue";
+import ContratosCanceladosDialog from "src/pages/dashboard/components/ContratosCanceladosDialog.vue";
 
 const { t } = useI18n();
 
@@ -279,6 +282,10 @@ const openAlunosDialog = () => {
 const openContratosCongeladosDialog = () => {
   $q.dialog({ component: ContratosCongeladosDialog });
 };
+
+const openContratosCanceladosDialog = () => {
+  $q.dialog({ component: ContratosCanceladosDialog });
+};
 const selectedUnit = ref(null);
 const defaultPeriod = ref("month");
 const defaultEventId = ref(1);

+ 178 - 0
src/pages/dashboard/components/ContratosCanceladosDialog.vue

@@ -0,0 +1,178 @@
+<template>
+  <q-dialog ref="dialogRef" @hide="onDialogHide">
+    <q-card style="width: 580px; max-width: 95vw; border-radius: 12px">
+      <q-bar class="bg-transparent q-px-md" style="height: 55px">
+        <span class="text-h6 text-dark" style="font-weight: 600"
+          >Contratos Cancelados</span
+        >
+        <q-space />
+        <q-btn dense flat icon="mdi-close" @click="onDialogCancel" />
+      </q-bar>
+
+      <q-card-section class="q-pt-none q-pb-md q-px-md">
+        <q-card flat bordered style="border-radius: 8px">
+          <q-card-section class="q-pb-xs">
+            <div class="text-subtitle2 text-dark">Lista de alunos</div>
+            <div class="text-caption text-grey-6">
+              {{ contratos.length }} Alunos Cadastrados
+            </div>
+          </q-card-section>
+
+          <q-card-section class="q-pt-xs q-pb-sm">
+            <q-input
+              v-model="search"
+              dense
+              borderless
+              placeholder="Busque por status, nome, tel/whats"
+            >
+              <template #prepend>
+                <q-icon name="mdi-magnify" color="grey-6" />
+              </template>
+            </q-input>
+          </q-card-section>
+
+          <q-separator />
+
+          <div class="list-header q-px-md q-py-xs">
+            <span class="text-caption text-grey-7">Nome</span>
+            <span class="text-caption text-grey-7">Contato/Unidade</span>
+            <span class="text-caption text-grey-7">Contrato</span>
+          </div>
+
+          <q-separator />
+
+          <div style="max-height: 320px; overflow-y: auto">
+            <template
+              v-for="(contrato, index) in filteredContratos"
+              :key="contrato.id"
+            >
+              <div
+                class="list-row q-px-md q-py-sm"
+                :class="{ 'row-selected': index === selectedIndex }"
+                @click="selectedIndex = index"
+              >
+                <span class="text-body2 text-dark">{{ contrato.nome }}</span>
+                <div class="column" style="gap: 2px">
+                  <span class="text-caption text-dark">{{
+                    contrato.telefone
+                  }}</span>
+                  <span class="text-caption text-grey-6">{{
+                    contrato.unidade
+                  }}</span>
+                </div>
+                <q-badge
+                  label="Cancelados"
+                  color="negative"
+                  style="
+                    border-radius: 8px;
+                    font-size: 11px;
+                    padding: 4px;
+                    width: max-content;
+                    margin-left: 10px;
+                  "
+                />
+              </div>
+              <q-separator v-if="index < filteredContratos.length - 1" />
+            </template>
+          </div>
+        </q-card>
+      </q-card-section>
+
+      <q-card-actions align="right" class="q-px-md q-pb-md q-pt-none">
+        <q-btn
+          label="EXPORTAR"
+          color="primary-2"
+          unelevated
+          style="border-radius: 8px; font-weight: 600; letter-spacing: 0.5px"
+        />
+      </q-card-actions>
+    </q-card>
+  </q-dialog>
+</template>
+
+<script setup>
+import { ref, computed } from "vue";
+import { useDialogPluginComponent } from "quasar";
+
+defineEmits([...useDialogPluginComponent.emits]);
+
+const { dialogRef, onDialogHide, onDialogCancel } = useDialogPluginComponent();
+
+const search = ref("");
+const selectedIndex = ref(0);
+
+const contratos = [
+  {
+    id: 1,
+    nome: "Heloisa Faria",
+    telefone: "(45)99999-9999",
+    unidade: "Unidade franco",
+  },
+  {
+    id: 2,
+    nome: "Carol",
+    telefone: "(45)99999-9999",
+    unidade: "Arapongas-PR",
+  },
+  {
+    id: 3,
+    nome: "Marcelo Souza",
+    telefone: "(45)98888-8888",
+    unidade: "Curitiba-PR",
+  },
+  {
+    id: 4,
+    nome: "Ana Lúcia",
+    telefone: "(45)97777-7777",
+    unidade: "Londrina-PR",
+  },
+  {
+    id: 5,
+    nome: "Ricardo Silva",
+    telefone: "(45)96666-6666",
+    unidade: "Ponta Grossa-PR",
+  },
+  {
+    id: 6,
+    nome: "Juliana Costa",
+    telefone: "(45)95555-5555",
+    unidade: "Maringá-PR",
+  },
+];
+
+const filteredContratos = computed(() => {
+  if (!search.value) return contratos;
+  const q = search.value.toLowerCase();
+  return contratos.filter(
+    (c) =>
+      c.nome.toLowerCase().includes(q) ||
+      c.telefone.includes(q) ||
+      c.unidade.toLowerCase().includes(q),
+  );
+});
+</script>
+
+<style scoped>
+.list-header {
+  display: grid;
+  grid-template-columns: 1fr 1fr 100px;
+  align-items: center;
+}
+
+.list-row {
+  display: grid;
+  grid-template-columns: 1fr 1fr 100px;
+  align-items: center;
+  align-content: center;
+  cursor: pointer;
+  transition: background-color 0.15s;
+}
+
+.list-row:hover {
+  background-color: #f5f5f5;
+}
+
+.row-selected {
+  background-color: #b2dfdb !important;
+}
+</style>