Adicione primeiros dados da tabela
This commit is contained in:
@@ -73,35 +73,37 @@ const hasPermission = (requiredPermissions = []) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
router.beforeEach((to, from, next) => {
|
// router.beforeEach((to, from, next) => {
|
||||||
if (to.meta.title) {
|
// if (to.meta.title) {
|
||||||
document.title = to.meta.title;
|
// document.title = to.meta.title;
|
||||||
}
|
|
||||||
|
|
||||||
// if (to.matched.some((record) => record.meta.requiresAuth)) {
|
|
||||||
if (!isAuthenticated()) {
|
|
||||||
next({
|
|
||||||
path: "/login",
|
|
||||||
query: { redirect: to.fullPath },
|
|
||||||
});
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// const requiredPermissions = to.meta.permissions || [];
|
|
||||||
|
|
||||||
// if (requiredPermissions.length > 0 && !hasPermission(requiredPermissions)) {
|
|
||||||
// next({ path: "/unauthorized" });
|
|
||||||
|
|
||||||
// return;
|
|
||||||
// }
|
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// if (to.matched.some((record) => record.meta.guest) && isAuthenticated()) {
|
// console.log(to, from);
|
||||||
// next({ path: "/" });
|
|
||||||
|
// // if (to.matched.some((record) => record.meta.requiresAuth)) {
|
||||||
|
// if (!isAuthenticated()) {
|
||||||
|
// next({
|
||||||
|
// path: "/login",
|
||||||
|
// });
|
||||||
|
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
next();
|
// // const requiredPermissions = to.meta.permissions || [];
|
||||||
});
|
|
||||||
|
// // if (requiredPermissions.length > 0 && !hasPermission(requiredPermissions)) {
|
||||||
|
// // next({ path: "/unauthorized" });
|
||||||
|
|
||||||
|
// // return;
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// // if (to.matched.some((record) => record.meta.guest) && isAuthenticated()) {
|
||||||
|
// // next({ path: "/" });
|
||||||
|
|
||||||
|
// // return;
|
||||||
|
// // }
|
||||||
|
|
||||||
|
// next();
|
||||||
|
// return;
|
||||||
|
// });
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
:type="type"
|
:type="type"
|
||||||
:disable="loading || disabled"
|
:disable="loading || disabled"
|
||||||
:text-color="textColor"
|
:text-color="textColor"
|
||||||
|
:full-width="fullWidth"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
:columns="columns"
|
:columns="columns"
|
||||||
:row-key="rowKey"
|
:row-key="rowKey"
|
||||||
:loading="loading"
|
:loading="loading"
|
||||||
row-key="name"
|
|
||||||
flat
|
flat
|
||||||
bordered
|
bordered
|
||||||
virtual-scroll
|
virtual-scroll
|
||||||
@@ -24,7 +23,7 @@
|
|||||||
<div class="row q-mt-md">
|
<div class="row q-mt-md">
|
||||||
<div class="col-8 flex justify-end">
|
<div class="col-8 flex justify-end">
|
||||||
<q-pagination
|
<q-pagination
|
||||||
v-model="pagination.currentPage"
|
v-model="pagination.page"
|
||||||
color="primary"
|
color="primary"
|
||||||
:max="pagination.totalPages"
|
:max="pagination.totalPages"
|
||||||
size="md"
|
size="md"
|
||||||
@@ -32,10 +31,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-4 flex justify-end items-center">
|
<div class="col-4 flex justify-end items-center">
|
||||||
<span class="text-grey-5"
|
<span class="text-grey-5">Total: {{ pagination.total }}</span>
|
||||||
>Mostrando {{ pagination.currentPage }} de
|
|
||||||
{{ pagination.totalItems }}</span
|
|
||||||
>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</q-card>
|
</q-card>
|
||||||
@@ -61,6 +57,11 @@ export default {
|
|||||||
required: false,
|
required: false,
|
||||||
default: "name",
|
default: "name",
|
||||||
},
|
},
|
||||||
|
rowKey: {
|
||||||
|
type: String,
|
||||||
|
required: false,
|
||||||
|
default: "id",
|
||||||
|
},
|
||||||
title: {
|
title: {
|
||||||
type: String,
|
type: String,
|
||||||
required: false,
|
required: false,
|
||||||
@@ -86,6 +87,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
columns: props.columns,
|
columns: props.columns,
|
||||||
rows: props.rows,
|
rows: props.rows,
|
||||||
|
rowKey: props.rowKey,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="q-pa-sm">
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<span>{{ label }} {{ required ? "*" : "" }}</span>
|
<span>{{ label }} {{ required ? "*" : "" }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -17,3 +17,15 @@ API.interceptors.request.use((config) => {
|
|||||||
|
|
||||||
return config;
|
return config;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
API.interceptors.response.use(
|
||||||
|
(response) => response,
|
||||||
|
(error) => {
|
||||||
|
if (error.response.status === 401) {
|
||||||
|
Cookies.remove("token");
|
||||||
|
window.location.href = "/login";
|
||||||
|
}
|
||||||
|
|
||||||
|
return Promise.reject(error);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { createApp } from "vue";
|
import { createApp } from "vue";
|
||||||
import { Quasar } from "quasar";
|
import { Notify, Quasar } from "quasar";
|
||||||
|
|
||||||
import quasarLang from "quasar/lang/pt-BR";
|
import quasarLang from "quasar/lang/pt-BR";
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@ app.use(Quasar, {
|
|||||||
config: {
|
config: {
|
||||||
dark: "auto",
|
dark: "auto",
|
||||||
},
|
},
|
||||||
plugins: {},
|
plugins: { Notify },
|
||||||
lang: quasarLang,
|
lang: quasarLang,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +1,42 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="user-list q-pa-md">
|
<div class="user-list q-pa-md">
|
||||||
<q-card flat bordered class="q-pa-sm q-mb-lg">
|
<q-card flat bordered class="q-pa-sm q-mb-lg">
|
||||||
<div class="row">
|
<div class="row q-pa-sm q-gutter-sm">
|
||||||
<div class="col-4">
|
<div class="col-3">
|
||||||
<TextField label="Nome" required />
|
<TextField label="Título" />
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<TextField label="URL" />
|
||||||
|
</div>
|
||||||
|
<div class="col-3">
|
||||||
|
<TextField label="VideoID" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row q-pa-sm">
|
||||||
<div class="col-4">
|
<div class="col-6">
|
||||||
<Button label="Buscar" @click="handleSearch" />
|
<Button
|
||||||
|
label="Buscar"
|
||||||
|
:loading="loading"
|
||||||
|
@click="handleSearch"
|
||||||
|
fullWidth
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</q-card>
|
</q-card>
|
||||||
|
|
||||||
<Table :columns="columns" :rows="rows" :pagination="pagination">
|
<Table
|
||||||
|
:columns="columns"
|
||||||
|
:rows="rows"
|
||||||
|
:pagination="pagination"
|
||||||
|
row-key="id"
|
||||||
|
>
|
||||||
<template #no-data>
|
<template #no-data>
|
||||||
<div
|
<div
|
||||||
class="full-width row flex-center q-gutter-sm"
|
class="full-width row flex-center q-gutter-sm"
|
||||||
style="font-size: 1.3em"
|
style="font-size: 1.3em"
|
||||||
>
|
>
|
||||||
<span> Infelizmente, não há dados para serem mostrados </span>
|
<span> Não há vídeos </span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</Table>
|
</Table>
|
||||||
@@ -31,42 +47,16 @@
|
|||||||
import Button from "@components/Button";
|
import Button from "@components/Button";
|
||||||
import Table from "@components/Table";
|
import Table from "@components/Table";
|
||||||
import TextField from "@components/TextField";
|
import TextField from "@components/TextField";
|
||||||
|
|
||||||
import { API } from "@config/axios";
|
import { API } from "@config/axios";
|
||||||
|
import { getErrorMessage } from "@utils/axios";
|
||||||
|
|
||||||
const columns = [
|
const columns = [
|
||||||
{
|
{
|
||||||
name: "name",
|
name: "id",
|
||||||
required: true,
|
label: "Identificador",
|
||||||
label: "Dessert (100g serving)",
|
|
||||||
align: "left",
|
align: "left",
|
||||||
field: (row) => row.name,
|
field: "id",
|
||||||
format: (val) => `${val}`,
|
|
||||||
sortable: true,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "calories",
|
|
||||||
align: "center",
|
|
||||||
label: "Calories",
|
|
||||||
field: "calories",
|
|
||||||
sortable: true,
|
|
||||||
},
|
|
||||||
{ name: "fat", label: "Fat (g)", field: "fat", sortable: true },
|
|
||||||
{ name: "carbs", label: "Carbs (g)", field: "carbs" },
|
|
||||||
{ name: "protein", label: "Protein (g)", field: "protein" },
|
|
||||||
{ name: "sodium", label: "Sodium (mg)", field: "sodium" },
|
|
||||||
{
|
|
||||||
name: "calcium",
|
|
||||||
label: "Calcium (%)",
|
|
||||||
field: "calcium",
|
|
||||||
sortable: true,
|
|
||||||
sort: (a, b) => parseInt(a, 10) - parseInt(b, 10),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "iron",
|
|
||||||
label: "Iron (%)",
|
|
||||||
field: "iron",
|
|
||||||
sortable: true,
|
|
||||||
sort: (a, b) => parseInt(a, 10) - parseInt(b, 10),
|
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -81,21 +71,31 @@ export default {
|
|||||||
return {
|
return {
|
||||||
columns,
|
columns,
|
||||||
rows: [],
|
rows: [],
|
||||||
|
loading: false,
|
||||||
pagination: {
|
pagination: {
|
||||||
currentPage: 1,
|
page: 1,
|
||||||
totalPages: 1,
|
totalPages: 1,
|
||||||
totalItems: 10,
|
total: 10,
|
||||||
|
perPage: 10,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
async handleSearch() {
|
async handleSearch() {
|
||||||
try {
|
try {
|
||||||
|
this.loading = true;
|
||||||
|
|
||||||
const { data } = await API.get("/videos");
|
const { data } = await API.get("/videos");
|
||||||
|
|
||||||
console.log(data);
|
this.rows = data.content;
|
||||||
|
this.pagination = data.pagination;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
this.$q.notify({
|
||||||
|
type: "negative",
|
||||||
|
message: getErrorMessage(error, "Erro ao buscar vídeos"),
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
this.loading = false;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
9
src/utils/axios.js
Normal file
9
src/utils/axios.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
import { isAxiosError } from "axios";
|
||||||
|
|
||||||
|
export function getErrorMessage(error, defaultMessage = "Erro inesperado") {
|
||||||
|
if (isAxiosError(error)) {
|
||||||
|
return error.response.data.message;
|
||||||
|
}
|
||||||
|
|
||||||
|
return error?.message ?? defaultMessage;
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user