User rework falta nomes fer prompt de primera contrasenya i generar links
This commit is contained in:
parent
8581fb9314
commit
b04208106f
@ -5,7 +5,7 @@ const UserSchema = new Schema({
|
|||||||
name: {type: String, required: true},
|
name: {type: String, required: true},
|
||||||
username: { type: String, required: true, unique: true },
|
username: { type: String, required: true, unique: true },
|
||||||
email: { type: String, required: true, unique: true },
|
email: { type: String, required: true, unique: true },
|
||||||
password: { type: String, required: true },
|
password: { type: String },
|
||||||
date: { type: Date, default: Date.now},
|
date: { type: Date, default: Date.now},
|
||||||
admin: {type: Boolean, default: false},
|
admin: {type: Boolean, default: false},
|
||||||
image: { type: String },
|
image: { type: String },
|
||||||
|
@ -1,13 +1,76 @@
|
|||||||
const express = require('express');
|
const express = require('express');
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
|
|
||||||
|
const bcrypt = require('bcryptjs');
|
||||||
|
const rateLimitMiddleware = require("../config/rate-limiter");
|
||||||
|
|
||||||
const { isAdmin } = require('../config/middleware');
|
const { isAdmin } = require('../config/middleware');
|
||||||
const User = require("../models/User");
|
const User = require("../models/User");
|
||||||
|
|
||||||
|
router.post('/register', rateLimitMiddleware, (req, res) => {
|
||||||
|
User.findOne({admin: true}).then((data) => {
|
||||||
|
if(!data) {
|
||||||
|
let {
|
||||||
|
name,
|
||||||
|
username,
|
||||||
|
email,
|
||||||
|
password
|
||||||
|
} = req.body;
|
||||||
|
|
||||||
|
if(!(name && username && email && password)){
|
||||||
|
res.json({
|
||||||
|
error: true,
|
||||||
|
msg: "params"
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
User.findOne({username: username}).then((user) => {
|
||||||
|
if(user){
|
||||||
|
res.json({
|
||||||
|
error: true,
|
||||||
|
msg: "already-exists"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
User.findOne({email: email}).then((user) => {
|
||||||
|
if(user){
|
||||||
|
res.json({
|
||||||
|
error: true,
|
||||||
|
msg: "already-email"
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var user = new User({
|
||||||
|
name: name,
|
||||||
|
username: username,
|
||||||
|
password: password,
|
||||||
|
email: email,
|
||||||
|
admin: true
|
||||||
|
});
|
||||||
|
|
||||||
|
bcrypt.genSalt(10, (err, salt) => {
|
||||||
|
bcrypt.hash(user.password, salt, (err, hash) => {
|
||||||
|
if(err) throw err;
|
||||||
|
user.password = hash;
|
||||||
|
user.save().then(user => {
|
||||||
|
res.json({
|
||||||
|
success: true
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}).catch((error) => { res.json({ error: true }); return; });
|
||||||
|
});
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; });
|
||||||
|
}
|
||||||
|
}).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
router.get('/users', isAdmin, (req, res) => {
|
router.get('/users', isAdmin, (req, res) => {
|
||||||
console.log("HJDSHAKJDHKH")
|
|
||||||
User.find({}).then((users) => {
|
User.find({}).then((users) => {
|
||||||
console.log("HJDSHAKJDHKH2")
|
|
||||||
res.json({
|
res.json({
|
||||||
users
|
users
|
||||||
});
|
});
|
||||||
|
@ -8,21 +8,20 @@ const secret = require('../config/keys').secret;
|
|||||||
const rateLimitMiddleware = require("../config/rate-limiter");
|
const rateLimitMiddleware = require("../config/rate-limiter");
|
||||||
const { default: jwtDecode } = require('jwt-decode');
|
const { default: jwtDecode } = require('jwt-decode');
|
||||||
|
|
||||||
const { hasUser } = require('../config/middleware');
|
const { isAdmin } = require('../config/middleware');
|
||||||
|
|
||||||
const User = require("../models/User");
|
const User = require("../models/User");
|
||||||
|
|
||||||
const upload = require("../config/storage");
|
const upload = require("../config/storage");
|
||||||
|
|
||||||
router.post('/register', rateLimitMiddleware, (req, res) => {
|
router.post('/register', isAdmin, (req, res) => {
|
||||||
let {
|
let {
|
||||||
name,
|
name,
|
||||||
username,
|
username,
|
||||||
email,
|
email
|
||||||
password
|
|
||||||
} = req.body;
|
} = req.body;
|
||||||
|
|
||||||
if(!(name && username && email && password)){
|
if(!(name && username && email)){
|
||||||
res.json({
|
res.json({
|
||||||
error: true,
|
error: true,
|
||||||
msg: "params"
|
msg: "params"
|
||||||
@ -47,28 +46,20 @@ router.post('/register', rateLimitMiddleware, (req, res) => {
|
|||||||
var user = new User({
|
var user = new User({
|
||||||
name: name,
|
name: name,
|
||||||
username: username,
|
username: username,
|
||||||
password: password,
|
|
||||||
email: email,
|
email: email,
|
||||||
admin: true
|
admin: true
|
||||||
});
|
});
|
||||||
|
|
||||||
bcrypt.genSalt(10, (err, salt) => {
|
user.save().then(user => {
|
||||||
bcrypt.hash(user.password, salt, (err, hash) => {
|
res.json({
|
||||||
if(err) throw err;
|
status: "ok",
|
||||||
user.password = hash;
|
user
|
||||||
user.save().then(user => {
|
|
||||||
res.json({
|
|
||||||
success: true
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}).catch((error) => { res.json({ error: true }); return; });
|
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; });
|
}).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; });
|
||||||
}
|
}
|
||||||
}).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; });
|
}).catch((error) => { res.json({ error: true, msg: "Hi ha hagut un error intern, prova-ho més tard" }); return; });
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
router.post('/login', rateLimitMiddleware, (req, res) => {
|
router.post('/login', rateLimitMiddleware, (req, res) => {
|
||||||
|
@ -4,7 +4,6 @@ import { Disconnect } from './Campaign';
|
|||||||
const windows = ref([]);
|
const windows = ref([]);
|
||||||
|
|
||||||
import LoginWindow from '@/views/windows/LoginWindow.vue'
|
import LoginWindow from '@/views/windows/LoginWindow.vue'
|
||||||
import RegisterWindow from '@/views/windows/RegisterWindow.vue'
|
|
||||||
import ExampleWindow from '@/views/windows/ExampleWindow.vue'
|
import ExampleWindow from '@/views/windows/ExampleWindow.vue'
|
||||||
import MainMenuWindow from '@/views/windows/MainMenuWindow.vue'
|
import MainMenuWindow from '@/views/windows/MainMenuWindow.vue'
|
||||||
import EditProfileWindow from '@/views/windows/EditProfileWindow.vue'
|
import EditProfileWindow from '@/views/windows/EditProfileWindow.vue'
|
||||||
@ -30,13 +29,16 @@ import DatabaseWindow from '@/views/windows/game/DatabaseWindow.vue'
|
|||||||
import AccountManagementWindow from '@/views/windows/settings/AccountManagementWindow.vue'
|
import AccountManagementWindow from '@/views/windows/settings/AccountManagementWindow.vue'
|
||||||
import PluginManagementWindow from '@/views/windows/settings/PluginManagementWindow.vue'
|
import PluginManagementWindow from '@/views/windows/settings/PluginManagementWindow.vue'
|
||||||
import PluginWindow from '../views/windows/settings/PluginWindow.vue';
|
import PluginWindow from '../views/windows/settings/PluginWindow.vue';
|
||||||
|
import FirstRegisterWindow from '../views/windows/FirstRegisterWindow.vue';
|
||||||
|
import RegisterUserWindow from '../views/windows/settings/RegisterUserWindow.vue';
|
||||||
|
|
||||||
let windowMap = {
|
let windowMap = {
|
||||||
test: ExampleWindow,
|
test: ExampleWindow,
|
||||||
login: LoginWindow,
|
login: LoginWindow,
|
||||||
main_menu: MainMenuWindow,
|
main_menu: MainMenuWindow,
|
||||||
welcome: WelcomeWindow,
|
welcome: WelcomeWindow,
|
||||||
register: RegisterWindow,
|
first_register: FirstRegisterWindow,
|
||||||
|
register_user: RegisterUserWindow,
|
||||||
edit_profile: EditProfileWindow,
|
edit_profile: EditProfileWindow,
|
||||||
settings: SettingsWindow,
|
settings: SettingsWindow,
|
||||||
campaign_list: CampaignListWindow,
|
campaign_list: CampaignListWindow,
|
||||||
@ -80,8 +82,8 @@ const defValues = {
|
|||||||
id: 'login',
|
id: 'login',
|
||||||
title: 'Login',
|
title: 'Login',
|
||||||
},
|
},
|
||||||
'register': {
|
'first_register': {
|
||||||
id: 'register',
|
id: 'first_register',
|
||||||
title: 'register-admin.title',
|
title: 'register-admin.title',
|
||||||
},
|
},
|
||||||
'main_menu': {
|
'main_menu': {
|
||||||
@ -101,11 +103,6 @@ const defValues = {
|
|||||||
title: "Edit Profile",
|
title: "Edit Profile",
|
||||||
close: () => ClearWindow('edit_profile')
|
close: () => ClearWindow('edit_profile')
|
||||||
},
|
},
|
||||||
'settings': {
|
|
||||||
id: 'settings',
|
|
||||||
title: 'settings.title',
|
|
||||||
close: () => ClearWindow('settings')
|
|
||||||
},
|
|
||||||
'campaign_list': {
|
'campaign_list': {
|
||||||
id: 'campaign_list',
|
id: 'campaign_list',
|
||||||
title: 'campaigns.title',
|
title: 'campaigns.title',
|
||||||
|
@ -1,11 +1,22 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
|
||||||
|
import { onMounted, ref, watch } from 'vue';
|
||||||
const props = defineProps(['title', 'img']);
|
const props = defineProps(['title', 'img']);
|
||||||
|
|
||||||
|
const imgSrc = ref("");
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
imgSrc.value = props.img;
|
||||||
|
watch(() => props.img, () => {
|
||||||
|
imgSrc.value = props.img;
|
||||||
|
});
|
||||||
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="document centered">
|
<div class="document centered">
|
||||||
<h1>{{props.title}}</h1>
|
<h1>{{props.title}}</h1>
|
||||||
<img :src="props.img" class="big-icon">
|
<img :src="imgSrc" class="big-icon">
|
||||||
<br>
|
<br>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
@ -16,7 +27,6 @@ const props = defineProps(['title', 'img']);
|
|||||||
height: 80px;
|
height: 80px;
|
||||||
width: 80px;
|
width: 80px;
|
||||||
border: 1px solid var(--color-border);
|
border: 1px solid var(--color-border);
|
||||||
padding: 16px;
|
|
||||||
margin:auto;
|
margin:auto;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
@ -1,15 +1,11 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
|
||||||
import VersionRender from '@/views/others/VersionRender.vue'
|
|
||||||
import ErrorMessage from '@/views/others/ErrorMessage.vue'
|
|
||||||
|
|
||||||
import { onMounted, ref } from 'vue';
|
import { onMounted, ref } from 'vue';
|
||||||
import { GetUser, LogoutUser } from '@/services/User'
|
import { GetUser, LogoutUser } from '@/services/User'
|
||||||
|
|
||||||
import Api from '@/services/Api'
|
import Api from '@/services/Api'
|
||||||
|
|
||||||
import useEmitter from '@/services/Emitter';
|
import useEmitter from '@/services/Emitter';
|
||||||
import { ClearWindows, CreateWindow, CreateChildWindow } from '../../services/Windows';
|
import { ClearWindows, CreateWindow, CreateChildWindow, ClearWindow } from '../../services/Windows';
|
||||||
import { backendUrl } from '../../services/BackendURL';
|
import { backendUrl } from '../../services/BackendURL';
|
||||||
const emitter = useEmitter();
|
const emitter = useEmitter();
|
||||||
|
|
||||||
@ -31,16 +27,24 @@ function LogOut(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function EditProfile(){
|
function EditProfile(){
|
||||||
CreateChildWindow('main_menu', 'edit_profile');
|
console.log("User:"); console.log(GetUser());
|
||||||
|
CreateChildWindow('main_menu', 'edit_profile', {
|
||||||
|
user: GetUser()
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function EditSettings(){
|
function EditSettings(){
|
||||||
CreateChildWindow('main_menu', 'settings');
|
ClearWindow('main_menu');
|
||||||
|
CreateWindow('settings', {
|
||||||
|
id: 'settings',
|
||||||
|
type: 'settings',
|
||||||
|
title: 'settings.title',
|
||||||
|
back: () => { ClearWindow('settings'); CreateWindow('main_menu'); }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
let userAvatarDisplay = document.getElementById("upload-image");
|
let userAvatarDisplay = document.getElementById("upload-image");
|
||||||
let sendAvatarForm = document.getElementById("send-avatar-form");
|
|
||||||
let sendAvatarFileUploader = document.getElementById("send-avatar-file-uploader");
|
let sendAvatarFileUploader = document.getElementById("send-avatar-file-uploader");
|
||||||
|
|
||||||
sendAvatarFileUploader.addEventListener("change", (event) => {
|
sendAvatarFileUploader.addEventListener("change", (event) => {
|
||||||
|
@ -4,22 +4,32 @@ import WindowHandle from '@/views/partials/WindowHandle.vue';
|
|||||||
import { onMounted, onUpdated, ref } from 'vue';
|
import { onMounted, onUpdated, ref } from 'vue';
|
||||||
import { SetupHandle, SetSize, SetPosition, ResetPosition } from '@/services/Windows';
|
import { SetupHandle, SetSize, SetPosition, ResetPosition } from '@/services/Windows';
|
||||||
|
|
||||||
import Api from '@/services/Api.js'
|
import Api from '@/services/Api'
|
||||||
|
import BigIconTemplate from '../partials/BigIconTemplate.vue';
|
||||||
import useEmitter from '@/services/Emitter';
|
import { SetMinSize, SetResizable } from '../../services/Windows';
|
||||||
const emitter = useEmitter();
|
import { backendUrl } from '../../services/BackendURL';
|
||||||
|
|
||||||
const props = defineProps(['data']);
|
const props = defineProps(['data']);
|
||||||
const data = props.data;
|
const data = props.data;
|
||||||
|
const userIcon = ref("");
|
||||||
|
|
||||||
const handle = ref(null);
|
const handle = ref(null);
|
||||||
|
|
||||||
let id = data.id;
|
let id = data.id;
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
SetupHandle(id, handle);
|
SetupHandle(id, handle);
|
||||||
SetSize(id, {width: 500, height: 380});
|
SetSize(id, {width: 500, height: 480});
|
||||||
ResetPosition(id, "center");
|
ResetPosition(id, "center");
|
||||||
|
|
||||||
|
SetResizable(id, true);
|
||||||
|
SetMinSize(id, {width: 350, height: 280});
|
||||||
|
|
||||||
|
Api().get('/user/retrieve-avatar?username=' + data.user.username).then((response) => {
|
||||||
|
if(response.data.image) userIcon.value = backendUrl + "public/" + response.data.image;
|
||||||
|
else userIcon.value = "public/img/def-avatar.jpg";
|
||||||
|
}).catch((err) => console.log("Internal error"));
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -27,14 +37,16 @@ onMounted(() => {
|
|||||||
<template>
|
<template>
|
||||||
<div class="window-wrapper" :id="'window-wrapper-' + id">
|
<div class="window-wrapper" :id="'window-wrapper-' + id">
|
||||||
<WindowHandle :window="id" ref="handle"></WindowHandle>
|
<WindowHandle :window="id" ref="handle"></WindowHandle>
|
||||||
|
|
||||||
|
<BigIconTemplate :title="data.user.username" :img="userIcon">
|
||||||
|
|
||||||
|
</BigIconTemplate>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.window-wrapper {
|
.window-wrapper {
|
||||||
min-width: 700px;
|
|
||||||
min-height: 630px;
|
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
@ -2,17 +2,16 @@
|
|||||||
import { useI18n } from 'vue-i18n'
|
import { useI18n } from 'vue-i18n'
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
|
||||||
import VersionRender from '@/views/others/VersionRender.vue'
|
|
||||||
import ErrorMessage from '@/views/others/ErrorMessage.vue'
|
import ErrorMessage from '@/views/others/ErrorMessage.vue'
|
||||||
import WindowHandle from '@/views/partials/WindowHandle.vue';
|
import WindowHandle from '@/views/partials/WindowHandle.vue';
|
||||||
|
|
||||||
import { onMounted, onUpdated, ref } from 'vue';
|
import { onMounted, ref } from 'vue';
|
||||||
import { SetupHandle, SetSize, SetPosition, ResetPosition } from '@/services/Windows';
|
import { SetupHandle, SetSize, ResetPosition } from '@/services/Windows';
|
||||||
|
|
||||||
import Api from '@/services/Api.js'
|
import Api from '@/services/Api.js'
|
||||||
|
|
||||||
import { ClearWindow, ClearWindows, CreateWindow } from '../../services/Windows';
|
import { ClearWindow, CreateWindow } from '@/services/Windows';
|
||||||
import { DisplayToast } from '../../services/Dragonroll';
|
import { DisplayToast } from '@/services/Dragonroll';
|
||||||
|
|
||||||
const email = ref("");
|
const email = ref("");
|
||||||
const name = ref("");
|
const name = ref("");
|
||||||
@ -28,7 +27,6 @@ const props = defineProps(['data']);
|
|||||||
const data = props.data;
|
const data = props.data;
|
||||||
|
|
||||||
let id = data.id;
|
let id = data.id;
|
||||||
let title = data.title;
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
SetupHandle(id, handle);
|
SetupHandle(id, handle);
|
||||||
@ -43,7 +41,7 @@ function register(){
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Api().post('/user/register',
|
Api().post('/admin/register',
|
||||||
{
|
{
|
||||||
name: name.value,
|
name: name.value,
|
||||||
username: username.value,
|
username: username.value,
|
@ -1,8 +1,7 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
|
|
||||||
import VersionRender from '@/views/others/VersionRender.vue'
|
import { useI18n } from 'vue-i18n'
|
||||||
import ErrorMessage from '@/views/others/ErrorMessage.vue'
|
const { t } = useI18n()
|
||||||
import SuccessMessage from '@/views/others/SuccessMessage.vue'
|
|
||||||
|
|
||||||
import { onMounted, onUpdated, ref } from 'vue';
|
import { onMounted, onUpdated, ref } from 'vue';
|
||||||
import { SetupHandle, SetSize, SetPosition, ResetPosition } from '@/services/Windows';
|
import { SetupHandle, SetSize, SetPosition, ResetPosition } from '@/services/Windows';
|
||||||
@ -18,33 +17,27 @@ const handle = ref(null);
|
|||||||
|
|
||||||
const username = ref("");
|
const username = ref("");
|
||||||
const password = ref("");
|
const password = ref("");
|
||||||
const errorMessage = ref("");
|
|
||||||
const successMessage = ref("");
|
|
||||||
|
|
||||||
const props = defineProps(['data']);
|
const props = defineProps(['data']);
|
||||||
|
|
||||||
const data = props.data;
|
const data = props.data;
|
||||||
|
|
||||||
let id = data.id;
|
let id = data.id;
|
||||||
let title = data.title;
|
|
||||||
let success = data.msg;
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
successMessage.value = success;
|
|
||||||
|
|
||||||
SetupHandle(id, handle);
|
SetupHandle(id, handle);
|
||||||
SetSize(id, {width: 450, height: 500});
|
SetSize(id, {width: 450, height: 420});
|
||||||
ResetPosition(id, "center");
|
ResetPosition(id, "center");
|
||||||
});
|
});
|
||||||
|
|
||||||
function login(){
|
function login(){
|
||||||
Api().post('/user/login', { username: username.value, password: password.value }).then((response) => {
|
Api().post('/user/login', { username: username.value, password: password.value }).then((response) => {
|
||||||
const data = response.data;
|
const data = response.data;
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
if(data.error){
|
if(data.error){
|
||||||
errorMessage.value = data.msg;
|
DisplayToast('red', t(`login.errors.${data.msg}`), 3000)
|
||||||
} else {
|
} else {
|
||||||
errorMessage.value = "";
|
|
||||||
SetUser(data.token);
|
SetUser(data.token);
|
||||||
|
|
||||||
ShowMainMenu();
|
ShowMainMenu();
|
||||||
@ -89,8 +82,6 @@ function ShowMainMenu(){
|
|||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<ErrorMessage v-if="errorMessage">{{ errorMessage }}</ErrorMessage>
|
|
||||||
<SuccessMessage v-if="successMessage">{{ successMessage }}</SuccessMessage>
|
|
||||||
<!-- <VersionRender></VersionRender> -->
|
<!-- <VersionRender></VersionRender> -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
@ -32,24 +32,6 @@ onMounted(() => {
|
|||||||
SetupHandle(id, handle);
|
SetupHandle(id, handle);
|
||||||
SetSize(id, {width: 500, height: 460});
|
SetSize(id, {width: 500, height: 460});
|
||||||
ResetPosition(id, "center", emitter);
|
ResetPosition(id, "center", emitter);
|
||||||
|
|
||||||
/*
|
|
||||||
AddTooltip(campaignButton.value, "<h2>Hey</h2>Hola test");
|
|
||||||
AddContextMenu(campaignButton.value, [
|
|
||||||
{name: "Test", action: () => {alert("Test")}},
|
|
||||||
{name: "A", action: () => {alert("A")}},
|
|
||||||
{name: "B", action: () => {alert("B")}},
|
|
||||||
{name: "Patata", action: () => {alert("Patata")}, context: [
|
|
||||||
{name: "Test 2dsadsadsdsadasdasdsad", action: () => {alert("Test context")}},
|
|
||||||
{name: "A 3", action: () => {alert("A context")}, context: [
|
|
||||||
{name: "Test", action: () => {alert("Test")}},
|
|
||||||
{name: "A", action: () => {alert("A")}},
|
|
||||||
{name: "B", action: () => {alert("B")}},
|
|
||||||
]},
|
|
||||||
{name: "B 5", action: () => {alert("B context")}},
|
|
||||||
]},
|
|
||||||
])
|
|
||||||
*/
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function OpenCampaigns(){
|
function OpenCampaigns(){
|
||||||
|
@ -7,7 +7,7 @@ import WindowHandle from '@/views/partials/WindowHandle.vue';
|
|||||||
import Tabs from '../partials/Tabs.vue';
|
import Tabs from '../partials/Tabs.vue';
|
||||||
import Dropdown from '../partials/Dropdown.vue';
|
import Dropdown from '../partials/Dropdown.vue';
|
||||||
import { GetUserSetting, SetUserSetting } from '../../services/User';
|
import { GetUserSetting, SetUserSetting } from '../../services/User';
|
||||||
import { ClearWindow, CreateChildWindow, SetMaxSize, SetMinSize, SetResizable } from '../../services/Windows';
|
import { ClearWindow, CreateChildWindow, CreateWindow, SetMaxSize, SetMinSize, SetResizable } from '../../services/Windows';
|
||||||
|
|
||||||
const handle = ref(null);
|
const handle = ref(null);
|
||||||
|
|
||||||
@ -48,23 +48,37 @@ onMounted(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
function OpenManageAccounts(){
|
function OpenManageAccounts(){
|
||||||
CreateChildWindow(id, '', {
|
ClearWindow('settings');
|
||||||
|
CreateWindow('account_management', {
|
||||||
type: 'account_management',
|
type: 'account_management',
|
||||||
title: 'settings.site-administration.manage-accounts.title',
|
title: 'settings.site-administration.manage-accounts.title',
|
||||||
id: 'account-management',
|
id: 'account-management',
|
||||||
close: () => {
|
back: () => {
|
||||||
ClearWindow('account-management')
|
ClearWindow('account-management')
|
||||||
|
CreateWindow('settings', {
|
||||||
|
id: 'settings',
|
||||||
|
type: 'settings',
|
||||||
|
title: 'settings.title',
|
||||||
|
back: () => { ClearWindow('settings'); CreateWindow('main_menu'); }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
function OpenManagePlugins(){
|
function OpenManagePlugins(){
|
||||||
CreateChildWindow(id, '', {
|
ClearWindow('settings');
|
||||||
|
CreateWindow('plugin_management', {
|
||||||
type: 'plugin_management',
|
type: 'plugin_management',
|
||||||
title: 'settings.site-administration.manage-plugins.title',
|
title: 'settings.site-administration.manage-plugins.title',
|
||||||
id: 'plugin-management',
|
id: 'plugin-management',
|
||||||
close: () => {
|
back: () => {
|
||||||
ClearWindow('plugin-management')
|
ClearWindow('plugin-management')
|
||||||
|
CreateWindow('settings', {
|
||||||
|
id: 'settings',
|
||||||
|
type: 'settings',
|
||||||
|
title: 'settings.title',
|
||||||
|
back: () => { ClearWindow('settings'); CreateWindow('main_menu'); }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref, shallowRef } from 'vue';
|
import { onMounted, ref, shallowRef, toRaw } from 'vue';
|
||||||
import { SetupHandle, SetSize, ResetPosition } from '@/services/Windows';
|
import { SetupHandle, SetSize, ResetPosition } from '@/services/Windows';
|
||||||
import Api from '@/services/Api'
|
import Api from '@/services/Api'
|
||||||
|
|
||||||
@ -8,6 +8,7 @@ import IconButton from '@/views/partials/game/IconButton.vue'
|
|||||||
import WindowHandle from '@/views/partials/WindowHandle.vue';
|
import WindowHandle from '@/views/partials/WindowHandle.vue';
|
||||||
import ConceptList from '../../partials/ConceptList.vue';
|
import ConceptList from '../../partials/ConceptList.vue';
|
||||||
import { backendUrl } from '../../../services/BackendURL';
|
import { backendUrl } from '../../../services/BackendURL';
|
||||||
|
import { ClearWindow, CreateChildWindow, CreateWindow } from '../../../services/Windows';
|
||||||
|
|
||||||
const handle = ref(null);
|
const handle = ref(null);
|
||||||
|
|
||||||
@ -23,6 +24,10 @@ onMounted(() => {
|
|||||||
SetSize(id, {width: 500, height: 380});
|
SetSize(id, {width: 500, height: 380});
|
||||||
ResetPosition(id, "center");
|
ResetPosition(id, "center");
|
||||||
|
|
||||||
|
RefreshUsers();
|
||||||
|
});
|
||||||
|
|
||||||
|
function RefreshUsers(){
|
||||||
Api().get('/admin/users').then(response => {
|
Api().get('/admin/users').then(response => {
|
||||||
let users = response.data.users;
|
let users = response.data.users;
|
||||||
elements.value = [];
|
elements.value = [];
|
||||||
@ -32,15 +37,36 @@ onMounted(() => {
|
|||||||
_id: user._id,
|
_id: user._id,
|
||||||
info: {
|
info: {
|
||||||
name: user.username
|
name: user.username
|
||||||
}
|
},
|
||||||
|
user
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
}).catch((err) => console.log(err));
|
}).catch((err) => console.log(err));
|
||||||
});
|
}
|
||||||
|
|
||||||
async function ElementIcon(element){
|
async function ElementIcon(element){
|
||||||
let response = await Api().get('/user/retrieve-avatar?username=' + element.name);
|
let response = await Api().get('/user/retrieve-avatar?username=' + element.name);
|
||||||
if(response.data.image) return backendUrl + "public/" + response.data.image;
|
if(response.data.image) return backendUrl + "public/" + response.data.image;
|
||||||
|
return "public/img/def-avatar.jpg";
|
||||||
|
}
|
||||||
|
|
||||||
|
function OpenAccount(data){
|
||||||
|
CreateChildWindow(id, 'edit_profile', {
|
||||||
|
user: toRaw(data.user),
|
||||||
|
close: () => {ClearWindow('edit_profile');}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function OpenCreateAccount(){
|
||||||
|
CreateChildWindow(id, 'register_user', {
|
||||||
|
title: 'register-account.title',
|
||||||
|
id: 'register_user',
|
||||||
|
done: () => {
|
||||||
|
RefreshUsers();
|
||||||
|
ClearWindow('register_user');
|
||||||
|
},
|
||||||
|
close: () => ClearWindow('register_user')
|
||||||
|
})
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@ -53,10 +79,11 @@ async function ElementIcon(element){
|
|||||||
<ConceptList
|
<ConceptList
|
||||||
:elements="elements"
|
:elements="elements"
|
||||||
:icon="ElementIcon"
|
:icon="ElementIcon"
|
||||||
|
:open="OpenAccount"
|
||||||
></ConceptList>
|
></ConceptList>
|
||||||
|
|
||||||
<div class="fixed-bottom-buttons">
|
<div class="fixed-bottom-buttons">
|
||||||
<IconButton icon="/icons/iconoir/regular/plus.svg" :action="OpenCreateItemPrompt"></IconButton>
|
<IconButton icon="/icons/iconoir/regular/plus.svg" :action="OpenCreateAccount"></IconButton>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
135
client/src/views/windows/settings/RegisterUserWindow.vue
Normal file
135
client/src/views/windows/settings/RegisterUserWindow.vue
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
<script setup>
|
||||||
|
import { useI18n } from 'vue-i18n'
|
||||||
|
const { t } = useI18n()
|
||||||
|
|
||||||
|
import ErrorMessage from '@/views/others/ErrorMessage.vue'
|
||||||
|
import WindowHandle from '@/views/partials/WindowHandle.vue';
|
||||||
|
|
||||||
|
import { onMounted, ref } from 'vue';
|
||||||
|
import { SetupHandle, SetSize, ResetPosition } from '@/services/Windows';
|
||||||
|
|
||||||
|
import Api from '@/services/Api.js'
|
||||||
|
|
||||||
|
import { ClearWindow, CreateWindow } from '@/services/Windows';
|
||||||
|
import { DisplayToast } from '@/services/Dragonroll';
|
||||||
|
import { CallWindow } from '../../../services/Windows';
|
||||||
|
|
||||||
|
const email = ref("");
|
||||||
|
const name = ref("");
|
||||||
|
const username = ref("");
|
||||||
|
const password = ref("");
|
||||||
|
const confirmPassword = ref("");
|
||||||
|
const errorMessage = ref("");
|
||||||
|
|
||||||
|
const handle = ref(null);
|
||||||
|
|
||||||
|
const props = defineProps(['data']);
|
||||||
|
|
||||||
|
const data = props.data;
|
||||||
|
|
||||||
|
let id = data.id;
|
||||||
|
let title = data.title;
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
SetupHandle(id, handle);
|
||||||
|
SetSize(id, {width: 500, height: 430});
|
||||||
|
ResetPosition(id, "center");
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function register(){
|
||||||
|
Api().post('/user/register',
|
||||||
|
{
|
||||||
|
name: name.value,
|
||||||
|
username: username.value,
|
||||||
|
email: email.value,
|
||||||
|
}).then((response) => {
|
||||||
|
const data = response.data;
|
||||||
|
console.log(data);
|
||||||
|
if(data.error){
|
||||||
|
console.log(data);
|
||||||
|
errorMessage.value = data.msg;
|
||||||
|
} else {
|
||||||
|
errorMessage.value = "";
|
||||||
|
console.log("Logged successfully");
|
||||||
|
DisplayToast('green', 'Account created successfully', 3000);
|
||||||
|
CallWindow(id, 'done');
|
||||||
|
}
|
||||||
|
}).catch((error) => {
|
||||||
|
console.log(error);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="window-wrapper" :id="'window-wrapper-' + id">
|
||||||
|
<WindowHandle :window="id" ref="handle"></WindowHandle>
|
||||||
|
|
||||||
|
<div class="window-content">
|
||||||
|
<div class="document" v-html="t('register-account.welcome-message')">
|
||||||
|
</div>
|
||||||
|
<form v-on:submit.prevent="register">
|
||||||
|
<div class="form-field">
|
||||||
|
<label for="name">{{$t('general.name')}}</label>
|
||||||
|
<input id="name-field" type="text" :placeholder="t('placeholders.name')" name="name" v-model="name" autocomplete="off" >
|
||||||
|
</div>
|
||||||
|
<div class="form-field">
|
||||||
|
<label for="email">{{$t('general.email')}}</label>
|
||||||
|
<input id="email-field" type="email" :placeholder="t('placeholders.email')" name="email" v-model="email" autocomplete="off" >
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-field">
|
||||||
|
<label for="username">{{$t('general.username')}}</label>
|
||||||
|
<input id="username-field" type="text" :placeholder="t('placeholders.username')" name="username" v-model="username" autocomplete="off" >
|
||||||
|
</div>
|
||||||
|
<div class="form-field">
|
||||||
|
<button class="btn-primary sound-click confirm-form-button">{{$t('general.register')}}</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<ErrorMessage v-if="errorMessage">{{ errorMessage }}</ErrorMessage>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- <VersionRender></VersionRender> -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
p {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-wrapper {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-content {
|
||||||
|
flex-direction: column;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding-bottom: 50px;
|
||||||
|
width: 100%;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splash-image {
|
||||||
|
width: 450px;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
form {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
label {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
@ -17,6 +17,13 @@
|
|||||||
"weight": "Weight",
|
"weight": "Weight",
|
||||||
"price": "Price"
|
"price": "Price"
|
||||||
},
|
},
|
||||||
|
"login": {
|
||||||
|
"errors": {
|
||||||
|
"params": "You must fill all parameters!",
|
||||||
|
"wrong": "Wrong user or password",
|
||||||
|
"internal": "Internal error"
|
||||||
|
}
|
||||||
|
},
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"name": "John Doe",
|
"name": "John Doe",
|
||||||
"email": "john@doe.com",
|
"email": "john@doe.com",
|
||||||
@ -28,6 +35,10 @@
|
|||||||
"title": "Register Admin Account",
|
"title": "Register Admin Account",
|
||||||
"welcome-message": "<h1>Welcome!</h1><b>You have successfull setup Dragonroll!</b><p>Please create the admin account</p><p>Once the admin account has been created, you will be able to create user accounts that will be able to access Dragonroll</p><hr>"
|
"welcome-message": "<h1>Welcome!</h1><b>You have successfull setup Dragonroll!</b><p>Please create the admin account</p><p>Once the admin account has been created, you will be able to create user accounts that will be able to access Dragonroll</p><hr>"
|
||||||
},
|
},
|
||||||
|
"register-account": {
|
||||||
|
"title": "Create new user account",
|
||||||
|
"welcome-message": "<h1>Hola</h1>"
|
||||||
|
},
|
||||||
"main-menu": {
|
"main-menu": {
|
||||||
"title": "Dragonroll",
|
"title": "Dragonroll",
|
||||||
"main-menu": "Main Menu",
|
"main-menu": "Main Menu",
|
||||||
|
@ -17,9 +17,16 @@
|
|||||||
"weight": "Weight",
|
"weight": "Weight",
|
||||||
"price": "Price"
|
"price": "Price"
|
||||||
},
|
},
|
||||||
|
"login": {
|
||||||
|
"errors": {
|
||||||
|
"params": "You must fill all parameters!",
|
||||||
|
"wrong": "Wrong user or password",
|
||||||
|
"internal": "Internal error"
|
||||||
|
}
|
||||||
|
},
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"name": "John Doe",
|
"name": "John Doe",
|
||||||
"email": "john@doe.com",
|
"email": "john{'@'}doe.com",
|
||||||
"username": "Enter your username...",
|
"username": "Enter your username...",
|
||||||
"password": "Enter your password...",
|
"password": "Enter your password...",
|
||||||
"password-confirm": "Enter again your password..."
|
"password-confirm": "Enter again your password..."
|
||||||
@ -28,6 +35,10 @@
|
|||||||
"title": "Register Admin Account",
|
"title": "Register Admin Account",
|
||||||
"welcome-message": "<h1>Welcome!</h1><b>You have successfull setup Dragonroll!</b><p>Please create the admin account</p><p>Once the admin account has been created, you will be able to create user accounts that will be able to access Dragonroll</p><hr>"
|
"welcome-message": "<h1>Welcome!</h1><b>You have successfull setup Dragonroll!</b><p>Please create the admin account</p><p>Once the admin account has been created, you will be able to create user accounts that will be able to access Dragonroll</p><hr>"
|
||||||
},
|
},
|
||||||
|
"register-account": {
|
||||||
|
"title": "Create new user account",
|
||||||
|
"welcome-message": "<p>Here you can create a new user account. The first time the user logs in will be prompted to set his password</p><hr>"
|
||||||
|
},
|
||||||
"main-menu": {
|
"main-menu": {
|
||||||
"title": "Dragonroll",
|
"title": "Dragonroll",
|
||||||
"main-menu": "Main Menu",
|
"main-menu": "Main Menu",
|
||||||
|
@ -17,6 +17,13 @@
|
|||||||
"weight": "Weight",
|
"weight": "Weight",
|
||||||
"price": "Price"
|
"price": "Price"
|
||||||
},
|
},
|
||||||
|
"login": {
|
||||||
|
"errors": {
|
||||||
|
"params": "You must fill all parameters!",
|
||||||
|
"wrong": "Wrong user or password",
|
||||||
|
"internal": "Internal error"
|
||||||
|
}
|
||||||
|
},
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"name": "John Doe",
|
"name": "John Doe",
|
||||||
"email": "john@doe.com",
|
"email": "john@doe.com",
|
||||||
@ -28,6 +35,10 @@
|
|||||||
"title": "Registrar cuenta de administrador",
|
"title": "Registrar cuenta de administrador",
|
||||||
"welcome-message": "<h1>Bienvenido!</h1><b>Has configurado correctamente Dragonroll!</b><p>Porfavor, crea la cuenta de administrador</p><p>Una vez creada, esta cuenta te permitirá configurar el servidor y crear cuentas que puedan acceder a este</p><hr>"
|
"welcome-message": "<h1>Bienvenido!</h1><b>Has configurado correctamente Dragonroll!</b><p>Porfavor, crea la cuenta de administrador</p><p>Una vez creada, esta cuenta te permitirá configurar el servidor y crear cuentas que puedan acceder a este</p><hr>"
|
||||||
},
|
},
|
||||||
|
"register-account": {
|
||||||
|
"title": "Create new user account",
|
||||||
|
"welcome-message": "<h1>Hola</h1>"
|
||||||
|
},
|
||||||
"main-menu": {
|
"main-menu": {
|
||||||
"title": "Dragonroll",
|
"title": "Dragonroll",
|
||||||
"main-menu": "Menú Principal",
|
"main-menu": "Menú Principal",
|
||||||
|
Loading…
Reference in New Issue
Block a user