From 9fafc4e6f429bd2d317b70afe3038f60e19a96c4 Mon Sep 17 00:00:00 2001 From: LeoMortari Date: Sat, 1 Nov 2025 21:35:59 -0300 Subject: [PATCH] Ajusta layout --- src/App.vue | 881 ++++++++++++++++++++++++-- src/auth/roles.js | 36 +- src/auth/router.js | 56 +- src/components/Button/index.vue | 220 +++++-- src/components/DisplayValue/index.vue | 156 ++++- src/components/Dropdown/index.vue | 103 ++- src/components/Table/index.vue | 371 ++++++++--- src/components/TextField/index.vue | 225 +++++-- src/config/axios.js | 2 +- src/main.js | 1 + src/quasar-variables.sass | 21 +- src/routes/auth/Login.vue | 457 ++++++++++--- src/routes/users/index.vue | 347 ++++++++++ src/routes/videos/index.vue | 341 +++++++--- src/routes/videos/new.vue | 752 ++++++++++++++++------ src/styles/global.scss | 139 ++++ src/utils/keycloak.js | 164 +++++ vite.config.js | 10 + 18 files changed, 3676 insertions(+), 606 deletions(-) create mode 100644 src/routes/users/index.vue create mode 100644 src/styles/global.scss create mode 100644 src/utils/keycloak.js diff --git a/src/App.vue b/src/App.vue index 82cbaf3..5ff320f 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,89 +1,898 @@ - diff --git a/src/auth/roles.js b/src/auth/roles.js index 8c8cc31..5a4b402 100644 --- a/src/auth/roles.js +++ b/src/auth/roles.js @@ -1,3 +1,35 @@ -export default { - VIDEOS_LIST: "role_videos_6550", +const ROLES = { + ADMIN: "ADMIN", + USER: "USER", }; + +export const ROLE_ALIASES = { + [ROLES.ADMIN]: [ + "ADMIN", + "ROLE_ADMIN", + "REALM_ADMIN", + "MASTER_ADMIN", + "APP_ADMIN", + "CLIPPER_ADMIN", + "ADMINISTRATOR", + "SUPERUSER", + ], + [ROLES.USER]: [ + "USER", + "ROLE_USER", + "DEFAULT_USER", + "DEFAULT_ROLES", + "DEFAULT-ROLES", + "CLIPPER_USER", + "VIDEO_USER", + "ROLE_VIDEOS_6550", + "ROLE_VIDEOS", + "ROLE_VIEWER", + ], +}; + +export const ROLE_INHERITANCE = { + [ROLES.ADMIN]: [ROLES.USER], +}; + +export default ROLES; diff --git a/src/auth/router.js b/src/auth/router.js index 7c839a1..2860d3b 100644 --- a/src/auth/router.js +++ b/src/auth/router.js @@ -3,9 +3,11 @@ import Cookies from "js-cookie"; import { createWebHistory, createRouter } from "vue-router"; import roles from "@/auth/roles"; +import { extractRolesFromToken } from "@/utils/keycloak"; import Videos from "@/routes/videos"; import NewVideo from "@/routes/videos/new"; +import Users from "@/routes/users/index.vue"; import Login from "@/routes/auth/Login"; export const MENUS = { @@ -14,9 +16,27 @@ export const MENUS = { }; const getUserRoles = () => { - const rolesFromCookie = Cookies.get("user_roles"); // TODO: Tirar as permissões do usuário + const rolesFromCookie = Cookies.get("user_roles"); - return rolesFromCookie ? JSON.parse(rolesFromCookie) : []; + if (rolesFromCookie) { + try { + const parsed = JSON.parse(rolesFromCookie); + if (Array.isArray(parsed)) { + return parsed; + } + } catch (error) { + console.warn("Invalid roles cookie", error); + } + } + + const token = Cookies.get("token"); + const decodedRoles = extractRolesFromToken(token); + + if (decodedRoles.length) { + Cookies.set("user_roles", JSON.stringify(decodedRoles), { sameSite: "lax" }); + } + + return decodedRoles; }; export const routes = [ @@ -36,9 +56,17 @@ export const routes = [ meta: { requiresAuth: true, title: "Vídeos", - permissions: [roles.VIDEOS_LIST], + permissions: [roles.USER, roles.ADMIN], showinModal: true, menu: MENUS.VIDEOS, + icon: "sym_o_video_library", + description: "Acompanhe e gerencie os vídeos capturados automaticamente.", + quickAction: { + label: "Novo vídeo", + to: "/videos/new", + icon: "sym_o_add", + }, + order: 1, }, }, { @@ -48,9 +76,29 @@ export const routes = [ meta: { requiresAuth: true, title: "Novo Vídeo", - permissions: [roles.VIDEOS_LIST], + permissions: [roles.USER, roles.ADMIN], showinModal: false, menu: MENUS.VIDEOS, + icon: "sym_o_add_to_queue", + description: "Cole o link do YouTube e deixe a IA preparar seus cortes.", + quickAction: false, + order: 2, + }, + }, + { + path: "/users", + name: "Users", + component: Users, + meta: { + requiresAuth: true, + title: "Usuários", + permissions: [roles.ADMIN], + showinModal: true, + menu: MENUS.USUARIOS, + icon: "sym_o_groups", + description: "Gerencie quem tem acesso ao Clipper IA.", + quickAction: false, + order: 1, }, }, { diff --git a/src/components/Button/index.vue b/src/components/Button/index.vue index dfd9541..7bc57d7 100644 --- a/src/components/Button/index.vue +++ b/src/components/Button/index.vue @@ -1,51 +1,195 @@ - + + diff --git a/src/components/DisplayValue/index.vue b/src/components/DisplayValue/index.vue index f69397a..4a3a9b4 100644 --- a/src/components/DisplayValue/index.vue +++ b/src/components/DisplayValue/index.vue @@ -1,34 +1,150 @@ - diff --git a/src/components/Dropdown/index.vue b/src/components/Dropdown/index.vue index c4e1680..1f7fb00 100644 --- a/src/components/Dropdown/index.vue +++ b/src/components/Dropdown/index.vue @@ -1,8 +1,10 @@ + + diff --git a/src/components/Table/index.vue b/src/components/Table/index.vue index 2d2205e..415680d 100644 --- a/src/components/Table/index.vue +++ b/src/components/Table/index.vue @@ -1,122 +1,327 @@