From 475887420c0eccaf83784fbd9761438383f43089 Mon Sep 17 00:00:00 2001 From: Aran Roig Date: Sun, 26 Apr 2026 21:12:08 +0200 Subject: [PATCH] Added icon change --- backend/.gitignore | 2 + backend/src/index.js | 7 + backend/src/routes/user.js | 2 +- backend/src/services/storage.js | 16 +- frontend/app/app.vue | 20 +- frontend/app/assets/css/colors.scss | 10 + frontend/app/assets/css/main.scss | 8 + .../app/components/managers/ToastManager.vue | 7 +- .../components/partials/EditUserPartial.vue | 167 +++++++++++++++ frontend/app/components/partials/Spinner.vue | 33 +++ .../app/components/partials/VersionRender.vue | 24 +++ .../app/components/windows/LoginWindow.vue | 51 +++-- .../app/components/windows/MainMenuWindow.vue | 78 +++++++ .../app/components/windows/RegisterWindow.vue | 197 +++++++++++++++++- frontend/app/services/WindowDefinitions.js | 10 +- frontend/i18n/locales/en.json | 49 ++++- frontend/nuxt.config.ts | 28 ++- frontend/public/favicon.ico | Bin 4286 -> 4286 bytes frontend/public/favicon.png | Bin 0 -> 10443 bytes frontend/public/img/def-avatar.jpg | Bin 0 -> 69367 bytes 20 files changed, 668 insertions(+), 41 deletions(-) create mode 100644 frontend/app/components/partials/EditUserPartial.vue create mode 100644 frontend/app/components/partials/Spinner.vue create mode 100644 frontend/app/components/partials/VersionRender.vue create mode 100644 frontend/app/components/windows/MainMenuWindow.vue create mode 100644 frontend/public/favicon.png create mode 100644 frontend/public/img/def-avatar.jpg diff --git a/backend/.gitignore b/backend/.gitignore index a2e08b2..ed22581 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -14,3 +14,5 @@ logs .env .env.* !.env.production + +uploads/ \ No newline at end of file diff --git a/backend/src/index.js b/backend/src/index.js index 99a0467..b9965de 100644 --- a/backend/src/index.js +++ b/backend/src/index.js @@ -2,6 +2,7 @@ const express = require("express"); const cors = require('cors'); const cookieParser = require('cookie-parser'); const passport = require('passport'); +const path = require('path'); const dotenv = require('dotenv'); @@ -16,6 +17,11 @@ if(process.env.NODE_ENV) { const app = express(); const connectDB = require("./db"); + +// PUBLIC +const uploadDir = path.join(__dirname, 'uploads'); +app.use('/public', express.static(uploadDir)); + // JSON LIMIT EXPRESS app.use(express.json({ limit: '50mb' })); app.use(express.urlencoded({ @@ -26,6 +32,7 @@ app.use(express.urlencoded({ // connect database connectDB(); +// MIDDLEWARE app.use(passport.initialize()); require('./services/passport')(passport); diff --git a/backend/src/routes/user.js b/backend/src/routes/user.js index 3c1a548..5b04b5d 100644 --- a/backend/src/routes/user.js +++ b/backend/src/routes/user.js @@ -158,7 +158,7 @@ router.post("/upload-avatar", upload.single("image"), passport.authenticate('jwt router.get("/retrieve-avatar", async (req, res) => { try { const data = await User.findOne({ username: req.query.username }); - res.json({ status: "ok", image: data.image }); + res.json({ status: "ok", image: `${data.image}` }); } catch (err) { res.json({ status: "error" }); } diff --git a/backend/src/services/storage.js b/backend/src/services/storage.js index 1a2a074..79a4a8e 100644 --- a/backend/src/services/storage.js +++ b/backend/src/services/storage.js @@ -1,14 +1,22 @@ const multer = require('multer'); +const path = require('path'); +const fs = require('fs'); + +const uploadDir = path.join(__dirname, '..', 'uploads'); // adjust if needed + +if (!fs.existsSync(uploadDir)) { + fs.mkdirSync(uploadDir, { recursive: true }); +} var storage = multer.diskStorage({ destination: function (req, file, cb) { - cb(null, 'uploads') + cb(null, uploadDir); }, filename: function (req, file, cb) { - cb(null, file.fieldname + '-' + Date.now()) + const ext = path.extname(file.originalname); + cb(null, file.fieldname + '-' + Date.now() + ext); } }); var upload = multer({storage: storage}); -module.exports = upload; - \ No newline at end of file +module.exports = upload; \ No newline at end of file diff --git a/frontend/app/app.vue b/frontend/app/app.vue index 3d15c55..665ffbe 100644 --- a/frontend/app/app.vue +++ b/frontend/app/app.vue @@ -4,13 +4,31 @@ import ToastManager from './components/managers/ToastManager.vue'; import WindowManager from './components/managers/WindowManager.vue'; import { CreateWindow } from '@/services/Windows' +import { GetUser, HasAdmin } from './services/User'; async function start(){ - CreateWindow('login'); + if(GetUser()){ + CreateWindow('main_menu'); + return; + } + if(await HasAdmin()){ + CreateWindow('login'); + } else { + CreateWindow('register', {firstTime: true}); + } // DisplayToast('aqua', 'All plugins loaded successfully'); } +useHead({ + title: 'Dragonroll', + meta: [ + { name: 'description', content: 'Dragonroll is a free and open-source tabletop RPG virtual tabletop. It allows you to play your favorite pen-and-paper RPGs online with your friends, with features like character sheets, dice rolling, maps, tokens, and more.' }, + { name: 'keywords', content: 'virtual tabletop, vtt, online rpg, pen-and-paper rpg, dungeons and dragons, pathfinder, roll20 alternative' }, + { name: 'author', content: 'Aran Roig' }, + ], +}) + onMounted(() => { setupTheme(); setTheme('dark'); diff --git a/frontend/app/assets/css/colors.scss b/frontend/app/assets/css/colors.scss index ed979d4..a645109 100644 --- a/frontend/app/assets/css/colors.scss +++ b/frontend/app/assets/css/colors.scss @@ -16,6 +16,8 @@ $themes: ( button-hover: #202020aa, button-active: #202020cc, + toast-background: #202020, + hover: #21262d, selected: #4a4a4b, border-color: #819796, @@ -24,6 +26,9 @@ $themes: ( container-shadow: #151d28, sticky-header-bg: #20202077, + red: #e06c75, + green: #98c379, + icon-invert: 100% ), light: ( @@ -41,6 +46,8 @@ $themes: ( button-hover: #e9e9e9, button-active: #d4d4d4, + toast-background: #f0f0f0, + border-color: #e0e0e0, border: #f0f0f0, hover: #e9e9e9, @@ -49,6 +56,9 @@ $themes: ( container-shadow: #5f6774, sticky-header-bg: #fff, + red: #e06c75, + green: #98c379, + icon-invert: 0% ) ); diff --git a/frontend/app/assets/css/main.scss b/frontend/app/assets/css/main.scss index 1340187..bb4a1fa 100644 --- a/frontend/app/assets/css/main.scss +++ b/frontend/app/assets/css/main.scss @@ -355,3 +355,11 @@ span.artifact { display: flex; flex-direction: column; } + +.red { + color: var(--color-red); +} + +.green { + color: var(--color-green); +} \ No newline at end of file diff --git a/frontend/app/components/managers/ToastManager.vue b/frontend/app/components/managers/ToastManager.vue index ebf40ac..879e7c4 100644 --- a/frontend/app/components/managers/ToastManager.vue +++ b/frontend/app/components/managers/ToastManager.vue @@ -51,12 +51,12 @@ emitter.on('toast', data => { diff --git a/frontend/app/components/partials/Spinner.vue b/frontend/app/components/partials/Spinner.vue new file mode 100644 index 0000000..b97bed7 --- /dev/null +++ b/frontend/app/components/partials/Spinner.vue @@ -0,0 +1,33 @@ + + + + + \ No newline at end of file diff --git a/frontend/app/components/partials/VersionRender.vue b/frontend/app/components/partials/VersionRender.vue new file mode 100644 index 0000000..76cb274 --- /dev/null +++ b/frontend/app/components/partials/VersionRender.vue @@ -0,0 +1,24 @@ + + + + + + + diff --git a/frontend/app/components/windows/LoginWindow.vue b/frontend/app/components/windows/LoginWindow.vue index 89b8c72..9b5fe32 100644 --- a/frontend/app/components/windows/LoginWindow.vue +++ b/frontend/app/components/windows/LoginWindow.vue @@ -14,6 +14,7 @@ import WindowHandle from './partials/WindowHandle.vue'; import { DisplayToast } from '~/services/Toaster'; import Server from '~/services/Server'; import { SetUser } from '~/services/User'; +import Spinner from '../partials/Spinner.vue'; const handle = ref(null); @@ -25,6 +26,8 @@ let id = data.type; const username = ref(""); const password = ref(""); +const loading = ref(false); + onMounted(() => { SetupHandle(id, handle); SetSize(id, {width: 450, height: 480}); @@ -32,27 +35,28 @@ onMounted(() => { ResetPosition(id, "center"); }); +function ShowMainMenu(){ + CreateWindow('main_menu'); + ClearWindow('login'); +} + function login() { - Server().post('/user/login', { username: username.value, password: password.value }).then((response) => { - const data = response.data; - console.log(data); + loading.value = true; + Server().post('/user/login', { usermail: username.value, password: password.value }).then((response) => { + loading.value = false; + const data = response.data; - if(data.status == "error"){ - DisplayToast('red', "Wrong username or password", 3000) - } else { - SetUser(data.token); - - ShowMainMenu(); - } - }).catch((error) => { - console.log(error); - if(error.response.status == 429){ - // errorMessage.value = error.response.data; - } else { - // errorMessage.value = "Hi ha hagut un error intern, torna'ho a provar més tard"; - console.log(error); - } - }); + if(data.status == "error"){ + DisplayToast('red', $t(data.msg), 3000) + } else { + SetUser(data.token); + DisplayToast('green', $t('login.success'), 3000); + ShowMainMenu(); + } + }).catch((error) => { + loading.value = false; + DisplayToast('red', $t("errors.internal"), 3000); + }); } function toRegister(){ @@ -84,7 +88,14 @@ function toRegister(){
- +

{{$t('login.no-account')}} {{$t('login.register')}}

diff --git a/frontend/app/components/windows/MainMenuWindow.vue b/frontend/app/components/windows/MainMenuWindow.vue new file mode 100644 index 0000000..03f16c8 --- /dev/null +++ b/frontend/app/components/windows/MainMenuWindow.vue @@ -0,0 +1,78 @@ + + + + + + + + + diff --git a/frontend/app/components/windows/RegisterWindow.vue b/frontend/app/components/windows/RegisterWindow.vue index 7857ad2..1415bb5 100644 --- a/frontend/app/components/windows/RegisterWindow.vue +++ b/frontend/app/components/windows/RegisterWindow.vue @@ -1,8 +1,12 @@ @@ -26,17 +98,134 @@ onMounted(() => { -
+
+
+
+ +
+ + + + Dragonroll logo + +
+
+

{{ $t('register.first-register-message') }}

+

{{ $t('register.welcome') }}

+

{{ $t('register.message') }}

+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+
+
+ +
+
+

{{$t('register.have-account')}} {{$t('register.login')}}

+
+
+ +
diff --git a/frontend/app/services/WindowDefinitions.js b/frontend/app/services/WindowDefinitions.js index 482fbc1..4a5379c 100644 --- a/frontend/app/services/WindowDefinitions.js +++ b/frontend/app/services/WindowDefinitions.js @@ -4,17 +4,21 @@ Put here all dragonroll windows const defWindows = { login: { - title: 'Login', + title: 'windows.login', movable: false, component: () => import('~/components/windows/LoginWindow.vue'), }, register: { - title: 'Register', + title: 'windows.register', movable: false, component: () => import('~/components/windows/RegisterWindow.vue'), }, + main_menu: { + title: 'windows.main-menu', + component: () => import('~/components/windows/MainMenuWindow.vue'), + }, example: { - title: 'Example', + title: 'windows.example', component: () => import('~/components/windows/ExampleWindow.vue'), } } diff --git a/frontend/i18n/locales/en.json b/frontend/i18n/locales/en.json index 74649a2..c461ff2 100644 --- a/frontend/i18n/locales/en.json +++ b/frontend/i18n/locales/en.json @@ -2,15 +2,58 @@ "windows": { "login": "Login", "register": "Register", + "main-menu": "Dragonroll", "example": "Example Window" }, "login": { - "username": "Username", - "username-placeholder": "Enter your username here...", + "username": "Username or email", + "username-placeholder": "Enter your username or email here...", "password": "Password", "password-placeholder": "Enter your password...", "log-in": "Log in", "no-account": "You don't have an account?", - "register": "Register" + "register": "Register", + "errors": { + "invalid-credentials": "Invalid username/email or password.", + "params": "Please enter both username/email and password." + }, + "success": "Login successful!" + }, + "register": { + "name": "Name", + "name-placeholder": "Enter your name here...", + "email": "Email", + "email-placeholder": "Enter your email here...", + "username": "Username", + "username-placeholder": "Enter your username here...", + "password": "Password", + "password-placeholder": "Enter your password...", + "confirm-password": "Confirm Password", + "confirm-password-placeholder": "Re-enter your password...", + "register": "Register", + "have-account": "Already have an account?", + "login": "Login", + "password-confirm-placeholder": "Confirm your password...", + "welcome": "Welcome to DragonRoll!", + "message": "Please enter your desired username and password to create an account.", + "first-register-message": "You are about to create the first account on this DragonRoll instance. This account will be granted administrator privileges.", + "errors": { + "name-empty": "Please enter your name.", + "email-empty": "Please enter a valid email address.", + "username-empty": "Please enter a username.", + "passwords-no-match": "The passwords you entered do not match.", + "email-username-exists": "An account with this email or username already exists." + }, + "success": "Registration successful! You can now log in." + }, + "errors": { + "internal": "An internal error occurred." + }, + "main-menu": { + "main-menu": "Main menu", + "edit-profile": "Edit profile", + "campaigns": "Campaigns", + "log-out": "Log out", + "settings": "Settings" } } \ No newline at end of file diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts index 7852106..f1a25d3 100644 --- a/frontend/nuxt.config.ts +++ b/frontend/nuxt.config.ts @@ -1,4 +1,24 @@ -// https://nuxt.com/docs/api/configuration/nuxt-config +import { execSync } from 'node:child_process' + +function getGitInfo() { + try { + const commit = execSync('git rev-parse --short HEAD').toString().trim() + const tag = execSync('git describe --tags --abbrev=0').toString().trim() + const branch = execSync('git rev-parse --abbrev-ref HEAD').toString().trim() + + return { commit, tag, branch } + } catch { + // fallback (production / no .git) + return { + commit: process.env.NUXT_PUBLIC_GIT_COMMIT || 'unknown', + tag: process.env.NUXT_PUBLIC_GIT_TAG || 'no-tag', + branch: process.env.NUXT_PUBLIC_GIT_BRANCH || 'unknown' + } + } +} + +const git = getGitInfo(); + export default defineNuxtConfig({ vite: { optimizeDeps: { @@ -22,7 +42,11 @@ export default defineNuxtConfig({ runtimeConfig: { public: { - apiBaseUrl: process.env.API_BASE_URL || 'http://localhost:5000/api' + apiBaseUrl: process.env.API_BASE_URL || 'http://localhost:5000/api', + gitCommit: git.commit, + gitTag: git.tag, + gitBranch: git.branch, + buildDate: new Date().toISOString(), } }, diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico index 18993ad91cfd43e03b074dd0b5cc3f37ab38e49c..edf28de7fe4cfedcb0ece4317b08cfddbe398e0d 100644 GIT binary patch literal 4286 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 S8t`8T5Z2hzsN#rQ{C@$&#ahY$ literal 0 HcmV?d00001 diff --git a/frontend/public/img/def-avatar.jpg b/frontend/public/img/def-avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3c5b56ec43058586dd86fdd6e076669c79b20917 GIT binary patch literal 69367 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 rOuL)Sn-