|
@@ -161,71 +161,31 @@
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div v-if="!isLoading" class="column gap q-pa-sm">
|
|
<div v-if="!isLoading" class="column gap q-pa-sm">
|
|
|
- <div class="flex full-width gap">
|
|
|
|
|
- <div class="flex flex-grow gap">
|
|
|
|
|
- <CardIconMiniChart
|
|
|
|
|
- class="flex-grow"
|
|
|
|
|
- :title="t('dashboard.cards.total_earnings')"
|
|
|
|
|
- :icon="'mdi-currency-usd'"
|
|
|
|
|
- :number-porcent="paymentsChart.percentage_change"
|
|
|
|
|
- :number-card="
|
|
|
|
|
- t('dashboard.currency_format', {
|
|
|
|
|
- value: paymentsChart.current_total,
|
|
|
|
|
- })
|
|
|
|
|
- "
|
|
|
|
|
- >
|
|
|
|
|
- <template #chart>
|
|
|
|
|
- <MiniLineChart
|
|
|
|
|
- :data="paymentsChart.trend_data"
|
|
|
|
|
- fill-color="rgba(0, 0, 0, 0)"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- </CardIconMiniChart>
|
|
|
|
|
- <CardIconMiniChart
|
|
|
|
|
- class="flex-grow"
|
|
|
|
|
- :title="t('orders.plural')"
|
|
|
|
|
- :icon="'mdi-package-variant'"
|
|
|
|
|
- :number-porcent="ordersChart.percentage_change"
|
|
|
|
|
- :number-card="ordersChart.current_total"
|
|
|
|
|
- >
|
|
|
|
|
- <template #chart>
|
|
|
|
|
- <MiniBarChart
|
|
|
|
|
- :data="ordersChart.trend_data"
|
|
|
|
|
- fill-color="rgba(0, 0, 0, 0)"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- </CardIconMiniChart>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="flex flex-grow gap">
|
|
|
|
|
- <CardIconMiniChart
|
|
|
|
|
- class="flex-grow"
|
|
|
|
|
- :title="t('dashboard.cards.tickets_sold')"
|
|
|
|
|
- :icon="'mdi-ticket-outline'"
|
|
|
|
|
- :number-porcent="ticketsSoldChart.percentage_change"
|
|
|
|
|
- :number-card="ticketsSoldChart.current_total"
|
|
|
|
|
- >
|
|
|
|
|
- <template #chart>
|
|
|
|
|
- <MiniLineChart
|
|
|
|
|
- :data="ticketsSoldChart.trend_data"
|
|
|
|
|
- fill-color="rgba(0, 0, 0, 0)"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- </CardIconMiniChart>
|
|
|
|
|
- <CardIconMiniChart
|
|
|
|
|
- class="flex-grow"
|
|
|
|
|
- :title="t('dashboard.cards.registrations')"
|
|
|
|
|
- :icon="'mdi-account-group-outline'"
|
|
|
|
|
- :number-porcent="participantsChart.percentage_change"
|
|
|
|
|
- :number-card="participantsChart.current_total"
|
|
|
|
|
- >
|
|
|
|
|
- <template #chart>
|
|
|
|
|
- <MiniBarChart
|
|
|
|
|
- :data="participantsChart.trend_data"
|
|
|
|
|
- fill-color="rgba(0, 0, 0, 0)"
|
|
|
|
|
- />
|
|
|
|
|
- </template>
|
|
|
|
|
- </CardIconMiniChart>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <div class="stat-cards-row">
|
|
|
|
|
+ <DashboardStatCard
|
|
|
|
|
+ title="Total alunos (contratos ativos)"
|
|
|
|
|
+ icon="mdi-account-multiple"
|
|
|
|
|
+ value="4.527"
|
|
|
|
|
+ badge="3.200 ativos"
|
|
|
|
|
+ />
|
|
|
|
|
+ <DashboardStatCard
|
|
|
|
|
+ title="Contratos Congelados"
|
|
|
|
|
+ icon="mdi-snowflake"
|
|
|
|
|
+ value="57"
|
|
|
|
|
+ subtitle="É hora de incentivar nossos alunos"
|
|
|
|
|
+ />
|
|
|
|
|
+ <DashboardStatCard
|
|
|
|
|
+ title="Contratos Cancelados"
|
|
|
|
|
+ icon="mdi-cancel"
|
|
|
|
|
+ value="57"
|
|
|
|
|
+ subtitle="É hora de incentivar nossos alunos"
|
|
|
|
|
+ />
|
|
|
|
|
+ <DashboardStatCard
|
|
|
|
|
+ title="Receita Geral"
|
|
|
|
|
+ icon="mdi-currency-usd"
|
|
|
|
|
+ value="R$ 51.548,80"
|
|
|
|
|
+ subtitle="0 pagamentos pendentes"
|
|
|
|
|
+ />
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="flex full-width gap">
|
|
<div class="flex full-width gap">
|
|
@@ -312,16 +272,8 @@
|
|
|
import { onMounted, ref, watch, defineAsyncComponent } from "vue";
|
|
import { onMounted, ref, watch, defineAsyncComponent } from "vue";
|
|
|
import { useI18n } from "vue-i18n";
|
|
import { useI18n } from "vue-i18n";
|
|
|
import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
|
|
import DefaultHeaderPage from "src/components/layout/DefaultHeaderPage.vue";
|
|
|
|
|
+import DashboardStatCard from "src/components/charts/DashboardStatCard.vue";
|
|
|
|
|
|
|
|
-const MiniLineChart = defineAsyncComponent(
|
|
|
|
|
- () => import("src/components/charts/mini/MiniLineChart.vue"),
|
|
|
|
|
-);
|
|
|
|
|
-const MiniBarChart = defineAsyncComponent(
|
|
|
|
|
- () => import("src/components/charts/mini/MiniBarChart.vue"),
|
|
|
|
|
-);
|
|
|
|
|
-const CardIconMiniChart = defineAsyncComponent(
|
|
|
|
|
- () => import("src/components/charts/CardIconMiniChart.vue"),
|
|
|
|
|
-);
|
|
|
|
|
const CardIconChart = defineAsyncComponent(
|
|
const CardIconChart = defineAsyncComponent(
|
|
|
() => import("src/components/charts/CardIconChart.vue"),
|
|
() => import("src/components/charts/CardIconChart.vue"),
|
|
|
);
|
|
);
|
|
@@ -530,6 +482,23 @@ onMounted(async () => {
|
|
|
flex-shrink: 0;
|
|
flex-shrink: 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+.stat-cards-row {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
|
+ gap: 16px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.stat-cards-row > * {
|
|
|
|
|
+ flex: 1 1 200px;
|
|
|
|
|
+ min-width: 180px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+@media (max-width: 599px) {
|
|
|
|
|
+ .stat-cards-row > * {
|
|
|
|
|
+ flex: 1 1 100%;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.filter-row {
|
|
.filter-row {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
flex-wrap: wrap;
|