Version 1.0.0 - Ajout de WebMetrics et de l'édit utilisateur
All checks were successful
Neutral/pipeline/head This commit looks good
All checks were successful
Neutral/pipeline/head This commit looks good
This commit is contained in:
parent
1b49de6286
commit
3484ff9ff7
@ -10,7 +10,8 @@ const __glob = {
|
|||||||
USERS: root + path.sep + "data" + path.sep + "users.json",
|
USERS: root + path.sep + "data" + path.sep + "users.json",
|
||||||
CONFIG: root + path.sep + "data" + path.sep + "config.json",
|
CONFIG: root + path.sep + "data" + path.sep + "config.json",
|
||||||
SHARED: root + path.sep + "data" + path.sep + "shared",
|
SHARED: root + path.sep + "data" + path.sep + "shared",
|
||||||
USERS_IMAGES: root + path.sep + "public" + path.sep + 'images' + path.sep + "users",
|
USERS_IMAGES: root + path.sep + "data" + path.sep + "user_images",
|
||||||
|
PACKAGE_JSON: root + path.sep + "package.json",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
112
bin/metrics.js
Normal file
112
bin/metrics.js
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
const { LogType } = require("loguix")
|
||||||
|
const fs = require("fs")
|
||||||
|
const path = require("path")
|
||||||
|
var CryptoJS = require("crypto-js")
|
||||||
|
const { __glob } = require("./global-variables")
|
||||||
|
const { captureRejectionSymbol } = require("events")
|
||||||
|
const clog = new LogType("Metrics")
|
||||||
|
|
||||||
|
|
||||||
|
if(!fs.existsSync(__glob.DATA + path.sep + "metrics.json")) {
|
||||||
|
fs.writeFileSync(__glob.DATA + path.sep + "metrics.json", JSON.stringify([], null, 2))
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.getDataMetrics = function() {
|
||||||
|
return JSON.parse(fs.readFileSync(__glob.DATA + path.sep + "metrics.json"))
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.getMetrics = function() {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const metrics = this.getDataMetrics()
|
||||||
|
var metricsToReturn = new Array()
|
||||||
|
|
||||||
|
return new Promise(async (resolve, reject) => {
|
||||||
|
|
||||||
|
// Count the number processed
|
||||||
|
|
||||||
|
var processed = 0
|
||||||
|
|
||||||
|
await metrics.forEach(async (metric) => {
|
||||||
|
|
||||||
|
// Try to connect to the metric server with the key in query params named "privatekey"
|
||||||
|
// If the connection is successful, we add the metric to the list of metrics to return
|
||||||
|
|
||||||
|
const url = `http://${metric.address}:${metric.port}/metrics?privatekey=${metric.key}`
|
||||||
|
const res = await fetch(url, {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Accept": "application/json",
|
||||||
|
},
|
||||||
|
credentials: "include"
|
||||||
|
}).then(res => res.json())
|
||||||
|
.then(res => {
|
||||||
|
|
||||||
|
if(res) {
|
||||||
|
metric.data = res
|
||||||
|
metricsToReturn.push(metric)
|
||||||
|
} else {
|
||||||
|
metric.data = "ERROR"
|
||||||
|
metricsToReturn.push(metric)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
processed++
|
||||||
|
|
||||||
|
if(processed == metrics.length) {
|
||||||
|
resolve(metricsToReturn)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.addMetric = function(settings) {
|
||||||
|
|
||||||
|
const metrics = this.getDataMetrics()
|
||||||
|
|
||||||
|
const metric = {
|
||||||
|
id: makeid(8),
|
||||||
|
name: settings.name,
|
||||||
|
address: settings.address,
|
||||||
|
port: settings.port,
|
||||||
|
key: settings.key,
|
||||||
|
}
|
||||||
|
|
||||||
|
metrics.push(metric)
|
||||||
|
fs.writeFileSync(__glob.DATA + path.sep + "metrics.json", JSON.stringify(metrics, null, 2))
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports.deleteMetric = function(id) {
|
||||||
|
|
||||||
|
const metrics = this.getDataMetrics()
|
||||||
|
|
||||||
|
metrics.forEach((metric) => {
|
||||||
|
if(metric.id == id) {
|
||||||
|
metrics.splice(metrics.indexOf(metric), 1)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
fs.writeFileSync(__glob.DATA + path.sep + "metrics.json", JSON.stringify(metrics, null, 2))
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function makeid(length) {
|
||||||
|
var result = [];
|
||||||
|
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
|
||||||
|
var charactersLength = characters.length;
|
||||||
|
for ( var i = 0; i < length; i++ ) {
|
||||||
|
result.push(characters.charAt(Math.floor(Math.random() *
|
||||||
|
charactersLength)));
|
||||||
|
}
|
||||||
|
return result.join('');
|
||||||
|
}
|
@ -13,6 +13,7 @@ const plog = new LogType("Web")
|
|||||||
const cook = require("cookie")
|
const cook = require("cookie")
|
||||||
const http = require("http")
|
const http = require("http")
|
||||||
const servermetrics = require("./server-metrics.js")
|
const servermetrics = require("./server-metrics.js")
|
||||||
|
const metrics = require("./metrics.js")
|
||||||
const pm2 = require('pm2');
|
const pm2 = require('pm2');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -56,6 +57,11 @@ module.exports.serverIO = function(server) {
|
|||||||
* POST REQUEST
|
* POST REQUEST
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
PostRequest("US_EDIT_PERSONNAL", async (settings) => {
|
||||||
|
user = auth.getUserByToken(token)
|
||||||
|
PostAnswer("US_EDIT_PERSONNAL", await users.editMySelf(settings, user))
|
||||||
|
})
|
||||||
|
|
||||||
if(user.checkPermission("FILES_EXPLORER")) {
|
if(user.checkPermission("FILES_EXPLORER")) {
|
||||||
|
|
||||||
PostRequest("FX_GET", (root) => {
|
PostRequest("FX_GET", (root) => {
|
||||||
@ -217,6 +223,22 @@ module.exports.serverIO = function(server) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(user.checkPermission("METRICS")) {
|
||||||
|
GetRequest("MT_ALL", async () => {
|
||||||
|
GetAnswer("MT_ALL", await metrics.getMetrics())
|
||||||
|
})
|
||||||
|
|
||||||
|
PostRequest("MT_ADD", async (settings) => {
|
||||||
|
PostAnswer("MT_ADD", await metrics.addMetric(settings))
|
||||||
|
})
|
||||||
|
|
||||||
|
PostRequest("MT_DELETE", async (settings) => {
|
||||||
|
PostAnswer("MT_DELETE", await metrics.deleteMetric(settings))
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
socket.on("disconnect", (reason) => {
|
socket.on("disconnect", (reason) => {
|
||||||
plog.log("Déconnexion du panel par '" + user.username + "' avec le socket : " + socket.id)
|
plog.log("Déconnexion du panel par '" + user.username + "' avec le socket : " + socket.id)
|
||||||
|
57
bin/users.js
57
bin/users.js
@ -77,7 +77,7 @@ module.exports.fetchUsers = function () {
|
|||||||
],
|
],
|
||||||
"tokens": [],
|
"tokens": [],
|
||||||
"lastLogin": "DEFAULT ACCOUNT",
|
"lastLogin": "DEFAULT ACCOUNT",
|
||||||
"picture": "/images/users/default.jpg"
|
"picture": "/images/default.jpg"
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ module.exports.User = class {
|
|||||||
permission = []
|
permission = []
|
||||||
tokens = []
|
tokens = []
|
||||||
lastLogin = new Date()
|
lastLogin = new Date()
|
||||||
picture = "/images/users/default.jpg"
|
picture = "/images/default.jpg"
|
||||||
|
|
||||||
constructor(properties) {
|
constructor(properties) {
|
||||||
|
|
||||||
@ -164,7 +164,7 @@ module.exports.User = class {
|
|||||||
this.lastLogin = new Date()
|
this.lastLogin = new Date()
|
||||||
}
|
}
|
||||||
if(this.picture == null) {
|
if(this.picture == null) {
|
||||||
this.picture = "/images/users/default.jpg"
|
this.picture = "/images/default.jpg"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -330,7 +330,7 @@ module.exports.User = class {
|
|||||||
var pictureDir = __glob.USERS_IMAGES + path.sep + uuid.v4().toString() + ".png"
|
var pictureDir = __glob.USERS_IMAGES + path.sep + uuid.v4().toString() + ".png"
|
||||||
fs.writeFileSync(pictureDir, file)
|
fs.writeFileSync(pictureDir, file)
|
||||||
|
|
||||||
this.picture = pictureDir.replace(__glob.USERS_IMAGES + path.sep, "/images/users/")
|
this.picture = pictureDir.replace(__glob.USERS_IMAGES + path.sep, "/users/")
|
||||||
this.register()
|
this.register()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,7 +383,7 @@ module.exports.addUser = function(settings) {
|
|||||||
|
|
||||||
|
|
||||||
if(settings.picture == null) {
|
if(settings.picture == null) {
|
||||||
pictureDir = "/images/users/default.jpg"
|
pictureDir = "/images/default.jpg"
|
||||||
} else {
|
} else {
|
||||||
pictureDir = __glob.USERS_IMAGES + path.sep + uuid.v4().toString() + ".png"
|
pictureDir = __glob.USERS_IMAGES + path.sep + uuid.v4().toString() + ".png"
|
||||||
fs.writeFileSync(pictureDir, settings.picture)
|
fs.writeFileSync(pictureDir, settings.picture)
|
||||||
@ -465,6 +465,53 @@ module.exports.editUser = function(settings) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
module.exports.editMySelf = function (settings, user) {
|
||||||
|
if(user.username == settings.actualUsername) {
|
||||||
|
if(settings.username == '') {
|
||||||
|
ulog.error("Le nom d'utilisateur est manquant")
|
||||||
|
return "USERNAME_MISSING"
|
||||||
|
} else if(settings.display_name == '') {
|
||||||
|
ulog.error("Le nom d'affichage est manquant")
|
||||||
|
return "DISPLAY_NAME_MISSING"
|
||||||
|
} else {
|
||||||
|
ulog.step.init("edit_user", "Modification d'un utilisateur dans la base de donnée : " + settings.username)
|
||||||
|
const user = this.fetchUsers().get(settings.username)
|
||||||
|
if(user) {
|
||||||
|
console.log(settings)
|
||||||
|
if(settings.newusername && settings.newusername != settings.username) {
|
||||||
|
if(this.getUser(settings.newusername)) {
|
||||||
|
ulog.error("L'utilisateur existe déjà : " + settings.username)
|
||||||
|
return "ALREADY_EXIST"
|
||||||
|
} else {
|
||||||
|
|
||||||
|
user.setNewUsername(settings.newusername)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(settings.display_name) {
|
||||||
|
user.setDisplayName(settings.display_name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(settings.password) {
|
||||||
|
user.setPassword(settings.password)
|
||||||
|
}
|
||||||
|
|
||||||
|
if(settings.picture) {
|
||||||
|
user.setPicture(settings.picture)
|
||||||
|
}
|
||||||
|
ulog.step.end("edit_user")
|
||||||
|
return "OK"
|
||||||
|
} else {
|
||||||
|
ulog.step.end("edit_user")
|
||||||
|
return "NOT_EXIST"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ulog.error("Vous ne pouvez pas modifier les informations d'un autre utilisateur !")
|
||||||
|
return "NOT_ALLOWED"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module.exports.clearTokens = function(username) {
|
module.exports.clearTokens = function(username) {
|
||||||
|
|
||||||
const user = this.fetchUsers().get(username)
|
const user = this.fetchUsers().get(username)
|
||||||
|
2
bin/www
2
bin/www
@ -6,7 +6,7 @@
|
|||||||
var log = require("loguix")
|
var log = require("loguix")
|
||||||
var {LogType} = require("loguix")
|
var {LogType} = require("loguix")
|
||||||
var { __glob } = require("./global-variables")
|
var { __glob } = require("./global-variables")
|
||||||
log.setup(__glob.LOGS)
|
log.setup(__glob.LOGS, __glob.PACKAGE_JSON)
|
||||||
|
|
||||||
const wlog = new LogType("Serveur")
|
const wlog = new LogType("Serveur")
|
||||||
|
|
||||||
|
1
main.js
1
main.js
@ -48,6 +48,7 @@ function setup() {
|
|||||||
app.use(express.static(path.join(__dirname, 'public')));
|
app.use(express.static(path.join(__dirname, 'public')));
|
||||||
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))
|
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))
|
||||||
app.use("/shared", express.static(__glob.SHARED))
|
app.use("/shared", express.static(__glob.SHARED))
|
||||||
|
app.use("/users", express.static(__glob.USERS_IMAGES))
|
||||||
|
|
||||||
|
|
||||||
getRouters()
|
getRouters()
|
||||||
|
11
package-lock.json
generated
11
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "neutral",
|
"name": "neutral",
|
||||||
"version": "0.6.0",
|
"version": "0.7.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "neutral",
|
"name": "neutral",
|
||||||
"version": "0.6.0",
|
"version": "0.7.0",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cookie-parser": "~1.4.4",
|
"cookie-parser": "~1.4.4",
|
||||||
@ -16,7 +16,7 @@
|
|||||||
"express": "~4.16.1",
|
"express": "~4.16.1",
|
||||||
"http-errors": "~1.6.3",
|
"http-errors": "~1.6.3",
|
||||||
"install": "^0.13.0",
|
"install": "^0.13.0",
|
||||||
"loguix": "1.4.1",
|
"loguix": "^1.4.2",
|
||||||
"nodemon": "^3.0.1",
|
"nodemon": "^3.0.1",
|
||||||
"os-utils": "^0.0.14",
|
"os-utils": "^0.0.14",
|
||||||
"pm2": "^5.3.0",
|
"pm2": "^5.3.0",
|
||||||
@ -1326,8 +1326,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/loguix": {
|
"node_modules/loguix": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.2",
|
||||||
"license": "ISC"
|
"resolved": "https://registry.npmjs.org/loguix/-/loguix-1.4.2.tgz",
|
||||||
|
"integrity": "sha512-fWp699F5Dqszpnriwotr3XvsaPXYAjmV3X2L4tmqUXgwHggvx1Fak1z3Ac7CeuVdIdYY5l85UQrEYPmhAb+IUw=="
|
||||||
},
|
},
|
||||||
"node_modules/lru-cache": {
|
"node_modules/lru-cache": {
|
||||||
"version": "6.0.0",
|
"version": "6.0.0",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "neutral",
|
"name": "neutral",
|
||||||
"version": "0.6.1",
|
"version": "1.0.0",
|
||||||
"description": "Panel d'administration de Raphix",
|
"description": "Panel d'administration de Raphix",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@ -27,7 +27,7 @@
|
|||||||
"express": "~4.16.1",
|
"express": "~4.16.1",
|
||||||
"http-errors": "~1.6.3",
|
"http-errors": "~1.6.3",
|
||||||
"install": "^0.13.0",
|
"install": "^0.13.0",
|
||||||
"loguix": "1.4.1",
|
"loguix": "^1.4.2",
|
||||||
"nodemon": "^3.0.1",
|
"nodemon": "^3.0.1",
|
||||||
"os-utils": "^0.0.14",
|
"os-utils": "^0.0.14",
|
||||||
"pm2": "^5.3.0",
|
"pm2": "^5.3.0",
|
||||||
|
Before Width: | Height: | Size: 455 KiB After Width: | Height: | Size: 455 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.2 MiB |
@ -1180,6 +1180,86 @@ class User {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Permet de créer un composant de vue de type "Metrics"
|
||||||
|
*/
|
||||||
|
class Metric {
|
||||||
|
properties;
|
||||||
|
View;
|
||||||
|
Component;
|
||||||
|
data;
|
||||||
|
constructor(settings) {
|
||||||
|
this.properties = settings.properties
|
||||||
|
this.View = settings.View
|
||||||
|
this.Component = settings.Component
|
||||||
|
this.data = settings.properties.data
|
||||||
|
}
|
||||||
|
|
||||||
|
generateHTML() {
|
||||||
|
return `
|
||||||
|
<div class="metric">
|
||||||
|
<div class="metric-info">
|
||||||
|
<div class="metric-text">
|
||||||
|
<p class='metric-title'><strong>${this.properties.name}</strong></p>
|
||||||
|
<p class='metric-id'>${this.properties.id}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id='${this.properties.id}_content' class="metric-content">
|
||||||
|
</div>
|
||||||
|
<div class="metric-actions">
|
||||||
|
|
||||||
|
<button id='${this.properties.id}_metricpower' class='btn red'><span><i class='fa fa-trash'></i> Supprimer<span></button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
loadScript() {
|
||||||
|
|
||||||
|
const contentDiv = getID(`${this.properties.id}_content`)
|
||||||
|
|
||||||
|
for(const data of this.data) {
|
||||||
|
contentDiv.innerHTML += `<div class='metric-data'><div class='metric-data-div'><p class='metric-data-title'>${data.description}</p><p class='metric-data-id'>${data.name}</p></div><p class='metric-data-value'>Valeur : <span>${data.value}<span></p></div>`
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteButton = getID(`${this.properties.id}_metricpower`)
|
||||||
|
|
||||||
|
deleteButton.addEventListener("click", () => {
|
||||||
|
this.View.createPopup({
|
||||||
|
title: `<i class='fa fa-trash'></i> Supprimer la métrique : ${this.properties.name}`,
|
||||||
|
content: `
|
||||||
|
<p class='us-delete'>Voulez-vous vraiment supprimer la métrique <strong>${this.properties.name}</strong> ?</p>
|
||||||
|
|
||||||
|
<button id="${this.properties.id}_deleteconfirm" class="btn red"><span><i class='fa fa-trash'></i> Supprimer</span></button>
|
||||||
|
|
||||||
|
`
|
||||||
|
})
|
||||||
|
|
||||||
|
const deleteCButton = getID(`${this.properties.id}_deleteconfirm`)
|
||||||
|
|
||||||
|
deleteCButton.addEventListener("click", () => {
|
||||||
|
const request = post(`MT_DELETE`, this.properties.id)
|
||||||
|
request.then((answer) => {
|
||||||
|
if(answer == "OK") {
|
||||||
|
this.View.destroyPopup()
|
||||||
|
this.View.destroy()
|
||||||
|
this.Component.forceWindow()
|
||||||
|
|
||||||
|
} else {
|
||||||
|
console.log(answer)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Permet de créer un item de la barre des tâches
|
* Permet de créer un item de la barre des tâches
|
||||||
@ -1196,7 +1276,6 @@ class ViewItem {
|
|||||||
|
|
||||||
show() {
|
show() {
|
||||||
const viewItems = getID("views-items")
|
const viewItems = getID("views-items")
|
||||||
|
|
||||||
const item = document.createElement("div")
|
const item = document.createElement("div")
|
||||||
item.id = `${this.window.ViewProperties.title}_item`
|
item.id = `${this.window.ViewProperties.title}_item`
|
||||||
item.classList.add("view-item")
|
item.classList.add("view-item")
|
||||||
|
@ -58,6 +58,9 @@ explorer.createWindow(() => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id='${View.getViewTitle()}_explorer' class='fx-explorer'>
|
<div id='${View.getViewTitle()}_explorer' class='fx-explorer'>
|
||||||
|
<div style='font-size: 24px; margin-top: 225px;' class='t-center'>
|
||||||
|
<p><i class="fa-solid fa-rotate fa-spin"></i> Chargement en cours ...</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ loadUserInfo()
|
|||||||
|
|
||||||
function loadUserInfo() {
|
function loadUserInfo() {
|
||||||
|
|
||||||
|
|
||||||
const infoUsername = getID("infoUsername")
|
const infoUsername = getID("infoUsername")
|
||||||
const infoUserimage = getID("infoUserimage")
|
const infoUserimage = getID("infoUserimage")
|
||||||
const infoDisplayname = getID("infoDisplayname")
|
const infoDisplayname = getID("infoDisplayname")
|
||||||
@ -25,7 +26,7 @@ function loadUserInfo() {
|
|||||||
const permissions = ANS_user.permission
|
const permissions = ANS_user.permission
|
||||||
|
|
||||||
const AvailableViews = new Array()
|
const AvailableViews = new Array()
|
||||||
|
//
|
||||||
permissions.forEach((permValue) => {
|
permissions.forEach((permValue) => {
|
||||||
|
|
||||||
AllComponents.forEach((component) => {
|
AllComponents.forEach((component) => {
|
||||||
@ -64,3 +65,4 @@ function loadUserInfo() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,7 +11,11 @@ links.createWindow(() => {
|
|||||||
<div class='ln-bar'>
|
<div class='ln-bar'>
|
||||||
<button id='${View.getViewTitle()}_add' class='btn blue'><span><i class='fa fa-add'></i> Ajouter un lien</span></button>
|
<button id='${View.getViewTitle()}_add' class='btn blue'><span><i class='fa fa-add'></i> Ajouter un lien</span></button>
|
||||||
</div>
|
</div>
|
||||||
<div class='ln-links' id='${View.getViewTitle()}_links'></div>
|
<div class='ln-links' id='${View.getViewTitle()}_links'>
|
||||||
|
<div style='font-size: 24px; margin-top: 225px;' class='t-center'>
|
||||||
|
<p><i class="fa-solid fa-rotate fa-spin"></i> Chargement en cours ...</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
`)
|
`)
|
||||||
|
|
||||||
const addBtn = getID(`${View.getViewTitle()}_add`)
|
const addBtn = getID(`${View.getViewTitle()}_add`)
|
||||||
@ -182,8 +186,6 @@ links.createWindow(() => {
|
|||||||
</div>
|
</div>
|
||||||
`
|
`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
})
|
})
|
||||||
|
|
||||||
links.forEach((link) => {
|
links.forEach((link) => {
|
||||||
|
@ -0,0 +1,138 @@
|
|||||||
|
metrics.createWindow(() => {
|
||||||
|
|
||||||
|
const View = new ViewWindow({
|
||||||
|
title: `<i class="fa-solid fa-square-poll-vertical"></i> Web Metrik`,
|
||||||
|
width: "600px",
|
||||||
|
height: "600px",
|
||||||
|
})
|
||||||
|
|
||||||
|
loadMetrics()
|
||||||
|
|
||||||
|
function loadMetrics() {
|
||||||
|
|
||||||
|
View.setContent(`
|
||||||
|
<div class="metrics">
|
||||||
|
<div class='mt-bar'>
|
||||||
|
<p> <strong>WebMetrik</strong> : <span id='${View.getViewTitle()}_number'><i>Calcul en cours</i></span></p>
|
||||||
|
<div>
|
||||||
|
<button id='${View.getViewTitle()}_refresh' class='btn green'><span><i class='fa fa-rotate-left'></i> Rafraîchir</span></button>
|
||||||
|
<button id='${View.getViewTitle()}_add' class='btn blue'><span><i class='fa fa-add'></i> Ajouter un WebMetrik</span></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class='mt-metrics' id='${View.getViewTitle()}_metrics'>
|
||||||
|
|
||||||
|
<div style='font-size: 24px; margin-top: 180px;' class='t-center'>
|
||||||
|
<p><i class="fa-solid fa-rotate fa-spin"></i> Chargement en cours ...</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>`)
|
||||||
|
|
||||||
|
const metricsList = new Array()
|
||||||
|
const metricsComponent = new Array()
|
||||||
|
const metricsReq = get("MT_ALL")
|
||||||
|
|
||||||
|
const metricsDiv = document.getElementById(`${View.getViewTitle()}_metrics`)
|
||||||
|
const metricsNumber = document.getElementById(`${View.getViewTitle()}_number`)
|
||||||
|
const addButton = document.getElementById(`${View.getViewTitle()}_add`)
|
||||||
|
const refreshButton = document.getElementById(`${View.getViewTitle()}_refresh`)
|
||||||
|
const metricsView = document.getElementById(`${View.getViewTitle()}_metrics`)
|
||||||
|
|
||||||
|
refreshButton.addEventListener("click", () => {
|
||||||
|
loadMetrics()
|
||||||
|
})
|
||||||
|
|
||||||
|
metricsReq.then((ANS_metrics) => {
|
||||||
|
if(ANS_metrics != "UNAVAILABLE") {
|
||||||
|
metricsList.length = 0
|
||||||
|
ANS_metrics.forEach((metric) => {
|
||||||
|
const metricComponent = new Metric({
|
||||||
|
properties: metric,
|
||||||
|
Component: metrics,
|
||||||
|
View: View
|
||||||
|
})
|
||||||
|
metricsList.push(metricComponent.generateHTML())
|
||||||
|
|
||||||
|
metricsComponent.push(metricComponent)
|
||||||
|
})
|
||||||
|
metricsDiv.innerHTML = metricsList.join("")
|
||||||
|
metricsNumber.innerHTML = ANS_metrics.length
|
||||||
|
|
||||||
|
for(const metric of metricsComponent) {
|
||||||
|
metric.loadScript()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
metricsDiv.innerHTML = `<div style='font-size: 24px; margin-top: 180px;' class='t-center'>
|
||||||
|
<p><i class="fa-solid fa-warning"></i> Une erreur est survenue lors du chargement des WebMetrik</p>
|
||||||
|
</div>`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
// Generate a pop to add metrics with 3 settings, the adress, the port, the name of the metrics and the key to authentificate
|
||||||
|
|
||||||
|
addButton.addEventListener("click", () => {
|
||||||
|
|
||||||
|
View.createPopup({
|
||||||
|
title: "Ajouter un WebMetrik",
|
||||||
|
content: `
|
||||||
|
<div class='mt-add'>
|
||||||
|
<p>Adresse</p>
|
||||||
|
<input class='field' type="text" id="mt-add-address" placeholder="Adresse">
|
||||||
|
<p>Port</p>
|
||||||
|
<input class='field' type="number" id="mt-add-port" placeholder="Port">
|
||||||
|
<p>Nom</p>
|
||||||
|
<input class='field' type="text" id="mt-add-name" placeholder="Nom">
|
||||||
|
<p>Clé d'authentification</p>
|
||||||
|
<input class='field' type="password" id="mt-add-key" placeholder="Clé d'authentification">
|
||||||
|
<span id='mtaddinfo'></span>
|
||||||
|
<button id='mt-add-btn' class='btn blue'><span><i class='fa fa-add'></i> Ajouter</span></button>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
})
|
||||||
|
|
||||||
|
const addBtn = document.getElementById("mt-add-btn")
|
||||||
|
const address = document.getElementById("mt-add-address")
|
||||||
|
const port = document.getElementById("mt-add-port")
|
||||||
|
const name = document.getElementById("mt-add-name")
|
||||||
|
const key = document.getElementById("mt-add-key")
|
||||||
|
const infoMTAdd = new TextResponse("mtaddinfo")
|
||||||
|
|
||||||
|
|
||||||
|
addBtn.addEventListener("click", () => {
|
||||||
|
|
||||||
|
// Check if all fields are filled
|
||||||
|
|
||||||
|
if(address.value == "" || port.value == "" || name.value == "" || key.value == "") {
|
||||||
|
infoMTAdd.err("Veuillez remplir tous les champs")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
post("MT_ADD", {
|
||||||
|
address: address.value,
|
||||||
|
port: port.value,
|
||||||
|
name: name.value,
|
||||||
|
key: key.value
|
||||||
|
}).then((res) => {
|
||||||
|
if(res != "ERROR") {
|
||||||
|
View.destroyPopup()
|
||||||
|
loadMetrics()
|
||||||
|
} else {
|
||||||
|
View.createPopup({
|
||||||
|
title: "Erreur",
|
||||||
|
content: `<p class='yellow'><i class='fa fa-warning'></i> Une erreur est survenue lors de l'ajout de la WebMetrik</p>`
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
<div style='font-size: 24px; margin-top: 180px;' class='t-center'>
|
||||||
|
<p><i class="fa-solid fa-rotate fa-spin"></i> Chargement en cours ...</p>
|
||||||
|
</div>*/
|
@ -8,6 +8,8 @@ const explorer = new ViewComponent({
|
|||||||
permission: "FILES_EXPLORER"
|
permission: "FILES_EXPLORER"
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const services = new ViewComponent({
|
const services = new ViewComponent({
|
||||||
name: "Gestion des services",
|
name: "Gestion des services",
|
||||||
icon: "fa-solid fa-layer-group",
|
icon: "fa-solid fa-layer-group",
|
||||||
@ -27,7 +29,7 @@ const explorer = new ViewComponent({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const metrics = new ViewComponent({
|
const metrics = new ViewComponent({
|
||||||
name: "Web Metrics",
|
name: "Web Metrik",
|
||||||
icon: "fa-solid fa-square-poll-vertical",
|
icon: "fa-solid fa-square-poll-vertical",
|
||||||
permission: "METRICS"
|
permission: "METRICS"
|
||||||
})
|
})
|
||||||
|
119
public/javascripts/personal.js
Normal file
119
public/javascripts/personal.js
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
|
||||||
|
const menulogo = getID("menu-logo")
|
||||||
|
const usersettingsBtn = getID("user-settings-button")
|
||||||
|
|
||||||
|
menu.style.display = "none"
|
||||||
|
|
||||||
|
menulogo.addEventListener("click", () => {
|
||||||
|
|
||||||
|
const menu = getID("menu")
|
||||||
|
|
||||||
|
if(menu.style.display == "block") {
|
||||||
|
menu.style.display = "none"
|
||||||
|
} else {
|
||||||
|
menu.style.display = "block"
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
usersettingsBtn.addEventListener("click", () => {
|
||||||
|
const View = new ViewWindow({
|
||||||
|
title: `<i class="fa fa-user"></i> Mon Compte`,
|
||||||
|
width: "600px",
|
||||||
|
height: "650px"
|
||||||
|
})
|
||||||
|
|
||||||
|
View.setContent(`
|
||||||
|
<div class="user-settings">
|
||||||
|
<p>Mes informations</p>
|
||||||
|
<div class="us-settings">
|
||||||
|
|
||||||
|
<img class='us-settings-image' id="us-settings-image" src="">
|
||||||
|
|
||||||
|
<div class="us-settings-info">
|
||||||
|
<p>Nom d'utilisateur</p>
|
||||||
|
<input class="field" type="text" id="us-settings-username" placeholder="Nom d'utilisateur">
|
||||||
|
<p>Nom d'affichage</p>
|
||||||
|
<input class="field" type="text" id="us-settings-displayname" placeholder="Nom d'affichage">
|
||||||
|
<p>Mot de passe</p>
|
||||||
|
<input class="field" type="password" id="us-settings-password" placeholder="Mot de passe">
|
||||||
|
<p>Photo de profil</p>
|
||||||
|
<input type="file" id="us-settings-picture" accept="image/png, image/jpeg">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
<span id='us-settings-return-info'></span>
|
||||||
|
<button id="us-settings-save" class="btn green"><span> Sauvegarder</span></button>
|
||||||
|
</div>
|
||||||
|
<p>Mes permissions</p>
|
||||||
|
<div id="us-settings-permissions">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
`)
|
||||||
|
|
||||||
|
const usSettingsImage = getID("us-settings-image")
|
||||||
|
const usSettingsUsername = getID("us-settings-username")
|
||||||
|
const usSettingsDisplayname = getID("us-settings-displayname")
|
||||||
|
const usSettingsPassword = getID("us-settings-password")
|
||||||
|
const usSettingsPermissions = getID("us-settings-permissions")
|
||||||
|
const usSettingsSave = getID("us-settings-save")
|
||||||
|
const usSettingsPicture = getID("us-settings-picture")
|
||||||
|
const returnInfo = new TextResponse("us-settings-return-info")
|
||||||
|
|
||||||
|
const REQ_user = get("USERINFO")
|
||||||
|
|
||||||
|
var actualUsername = ""
|
||||||
|
|
||||||
|
REQ_user.then((ANS_user) => {
|
||||||
|
usSettingsImage.src = ANS_user.picture
|
||||||
|
usSettingsUsername.value = ANS_user.username
|
||||||
|
usSettingsDisplayname.value = ANS_user.display_name
|
||||||
|
actualUsername = ANS_user.username
|
||||||
|
|
||||||
|
const permissions = ANS_user.permission
|
||||||
|
const permValid = new Array()
|
||||||
|
|
||||||
|
permissions.forEach((permValue) => {
|
||||||
|
|
||||||
|
permValid.push("<p>" + permValue + "</p>")
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
usSettingsPermissions.innerHTML = permValid.join("")
|
||||||
|
})
|
||||||
|
|
||||||
|
usSettingsSave.addEventListener("click", () => {
|
||||||
|
const request = post(`US_EDIT_PERSONNAL`, {username: actualUsername, newusername: usSettingsUsername.value, display_name: usSettingsDisplayname.value, password: usSettingsPassword.value, picture: usSettingsPicture.files[0]})
|
||||||
|
request.then((answer) => {
|
||||||
|
if(answer == "ALREADY_EXIST") {
|
||||||
|
|
||||||
|
returnInfo.err("L'utilisateur existe déjà !")
|
||||||
|
|
||||||
|
} else if(answer == "USERNAME_MISSING") {
|
||||||
|
|
||||||
|
returnInfo.err("Le nom d'utilisateur est manquant !")
|
||||||
|
} else if(answer == "DISPLAY_NAME_MISSING") {
|
||||||
|
|
||||||
|
returnInfo.err("Le nom d'affichage est manquant !")
|
||||||
|
} else if(answer == "PASSWORD_MISSING") {
|
||||||
|
|
||||||
|
returnInfo.err("Le mot de passe est manquant !")
|
||||||
|
} else {
|
||||||
|
|
||||||
|
View.destroy()
|
||||||
|
loadUserInfo()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
document.addEventListener("click", (e) => {
|
||||||
|
if(e.target != menulogo) {
|
||||||
|
menu.style.display = "none"
|
||||||
|
}
|
||||||
|
})
|
@ -36,7 +36,7 @@ pipelines.createWindow(() => {
|
|||||||
|
|
||||||
View.setContent(`
|
View.setContent(`
|
||||||
<div class="pipelines">
|
<div class="pipelines">
|
||||||
<div id='reload_Btn_pipeline' class='pl-reload'><i class='fa fa-rotate-left'></i> Recharger les pipelines</div>
|
<button id='reload_Btn_pipeline' class='btn blue'><span><i class='fa fa-rotate-left'></i> Recharger les pipelines</span></button>
|
||||||
${pipelinesList.join("")}
|
${pipelinesList.join("")}
|
||||||
</div>`)
|
</div>`)
|
||||||
|
|
||||||
|
@ -18,7 +18,9 @@ users.createWindow(async () => {
|
|||||||
<button id='${View.getViewTitle()}_add' class='btn blue'><span><i class='fa fa-add'></i> Ajouter un utilisateur</span></button>
|
<button id='${View.getViewTitle()}_add' class='btn blue'><span><i class='fa fa-add'></i> Ajouter un utilisateur</span></button>
|
||||||
</div>
|
</div>
|
||||||
<div class='us-users' id='${View.getViewTitle()}_users'>
|
<div class='us-users' id='${View.getViewTitle()}_users'>
|
||||||
|
<div style='font-size: 24px; margin-top: 180px;' class='t-center'>
|
||||||
|
<p><i class="fa-solid fa-rotate fa-spin"></i> Chargement en cours ...</p>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>`)
|
</div>`)
|
||||||
|
|
||||||
@ -87,7 +89,7 @@ users.createWindow(async () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
const addButton = document.getElementById("us-add-button")
|
const addCButton = document.getElementById("us-add-button")
|
||||||
const username = document.getElementById("us-add-username")
|
const username = document.getElementById("us-add-username")
|
||||||
const displayname = document.getElementById("us-add-displayname")
|
const displayname = document.getElementById("us-add-displayname")
|
||||||
const password = document.getElementById("us-add-password")
|
const password = document.getElementById("us-add-password")
|
||||||
@ -96,7 +98,7 @@ users.createWindow(async () => {
|
|||||||
const returnInfo = new TextResponse("user-addreturn-info")
|
const returnInfo = new TextResponse("user-addreturn-info")
|
||||||
|
|
||||||
|
|
||||||
addButton.addEventListener("click", () => {
|
addCButton.addEventListener("click", () => {
|
||||||
var permissionsList = new Array()
|
var permissionsList = new Array()
|
||||||
for(var permission of permissions) {
|
for(var permission of permissions) {
|
||||||
console.log(permission.children[0].checked)
|
console.log(permission.children[0].checked)
|
||||||
@ -164,6 +166,7 @@ users.createWindow(async () => {
|
|||||||
|
|
||||||
for(var user of usersList) {
|
for(var user of usersList) {
|
||||||
usersContent.push(user.generateHTML())
|
usersContent.push(user.generateHTML())
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
usersDiv.innerHTML = usersContent.join("")
|
usersDiv.innerHTML = usersContent.join("")
|
||||||
|
@ -1110,7 +1110,7 @@ a {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
overflow-y: auto ;
|
overflow-y: auto ;
|
||||||
height: 700px;
|
height: 550px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-edit-actual {
|
.user-edit-actual {
|
||||||
@ -1202,3 +1202,161 @@ a {
|
|||||||
|
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mt-metrics {
|
||||||
|
|
||||||
|
overflow-y: auto;
|
||||||
|
height: 470px;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.mt-bar {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.mt-bar p {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.mt-add {
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mt-add p {
|
||||||
|
font-size: 14px;
|
||||||
|
margin-block: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#mt-add-btn {
|
||||||
|
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.metric {
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 10px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background-color: #1b1b1bc1;
|
||||||
|
transition: 0.1s;
|
||||||
|
align-items: center;
|
||||||
|
gap: 10px;
|
||||||
|
margin: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.metric-content {
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 10px;
|
||||||
|
align-items: center;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metric-id {
|
||||||
|
|
||||||
|
font-size: 14px;
|
||||||
|
color: #c0c0c0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.metric-data {
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metric-data-id {
|
||||||
|
|
||||||
|
font-size: 12px;
|
||||||
|
color: #c0c0c0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metric-data-value {
|
||||||
|
|
||||||
|
color: #c7c7c7;
|
||||||
|
}
|
||||||
|
|
||||||
|
.metric-data-value span {
|
||||||
|
|
||||||
|
color: #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.menu-drop {
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 110%;
|
||||||
|
left: 0.7%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-settings {
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 10px;
|
||||||
|
align-items: center;
|
||||||
|
background-color: #1b1b1bc1;
|
||||||
|
transition: 0.1s;
|
||||||
|
font-size: 14px;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.menu-settings:hover {
|
||||||
|
|
||||||
|
background-color: rgba(255, 255, 255, 0.614);
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-settings {
|
||||||
|
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.us-settings-info {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.us-settings-image {
|
||||||
|
|
||||||
|
width: 125px;
|
||||||
|
height: 125px;
|
||||||
|
border-radius: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#us-settings-permissions {
|
||||||
|
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr 1fr 1fr ;
|
||||||
|
gap: 10px;
|
||||||
|
width: 50%;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#us-settings-permissions p {
|
||||||
|
margin: 0 !important;
|
||||||
|
background-color: #323031;
|
||||||
|
padding: 10px;
|
||||||
|
border-radius: 10px;
|
||||||
|
text-align: center;
|
||||||
|
width: 100px;
|
||||||
|
}
|
@ -12,14 +12,22 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="taskbar-box m-align t-center">
|
<div class="taskbar-box m-align t-center">
|
||||||
|
<div id="menu" class="menu-drop">
|
||||||
|
<div id="user-settings-button" class="menu-settings">
|
||||||
|
<i class="fas fa-gear"></i>
|
||||||
|
<p>Paramètres du compte</p>
|
||||||
|
</div>
|
||||||
|
<div class="menu-signout menu-settings" onclick="window.location = '/login/signout'">
|
||||||
|
<i class="fas fa-sign-out-alt"></i>
|
||||||
|
<p>Déconnexion</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
<div class="taskbar-content">
|
<div class="taskbar-content">
|
||||||
<div class="taskbar-actions">
|
<div class="taskbar-actions">
|
||||||
<img id="menu-logo" class="taskbar-logo" src="/images/FormatLogo_WHITE.svg">
|
<img id="menu-logo" class="taskbar-logo" src="/images/FormatLogo_WHITE.svg">
|
||||||
<div id="views-items" class="views-items">
|
<div id="views-items" class="views-items">
|
||||||
<div class="view-item menu-signout" onclick="window.location = '/login/signout'">
|
|
||||||
<i class="fas fa-sign-out-alt"></i>
|
|
||||||
<p>Déconnexion</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -28,10 +36,11 @@
|
|||||||
<p id="infoDisplayname" class="taskbar-dispname">DisplayName</p>
|
<p id="infoDisplayname" class="taskbar-dispname">DisplayName</p>
|
||||||
<p id="infoUsername" class="taskbar-username">Username</p>
|
<p id="infoUsername" class="taskbar-username">Username</p>
|
||||||
</div>
|
</div>
|
||||||
<img id="infoUserimage" class="taskbar-image" src="/images/users/default.jpg">
|
<img id="infoUserimage" class="taskbar-image" src="/images/default.jpg">
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@ -49,6 +58,7 @@
|
|||||||
<script src="/javascripts/user.js"></script>
|
<script src="/javascripts/user.js"></script>
|
||||||
<script src="/javascripts/metric.js"></script>
|
<script src="/javascripts/metric.js"></script>
|
||||||
<script src="/javascripts/setting.js"></script>
|
<script src="/javascripts/setting.js"></script>
|
||||||
<script src="/javascripts/indexscript.js"></script>
|
<script src="/javascripts/personal.js"></script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user