diff --git a/CHANGELOG.md b/CHANGELOG.md index 26e792c..207d4a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## v0.08 (Dec 15th 2023) +* Updates to compose file and instructions from [steveiliop56](https://github.com/steveiliop56) +* Added SECRET field to compose file as a basic security measure. +* Visibility button to hide containers or reset view. +* Container link now uses server IP address. +* More compact container card, with style options planned. +* Improved log view. +* Removed VPN, Firewall, and VNC buttons. +* Updated dependencies (Sequelize 6.35.2) +* Fixed web pages not using the "public" static folder. +* Small tweaks to router. +* Replaced the default icon shown for missing icons (docker.png). + ## v0.07 (Dec 8th 2023) * View container logs. * Removed Redis. diff --git a/Dockerfile b/Dockerfile index ff00254..23c58c9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,6 @@ FROM node:21-alpine -ENV NODE_ENV production WORKDIR /app diff --git a/DweebUI.png b/DweebUI.png deleted file mode 100644 index 16e814f..0000000 Binary files a/DweebUI.png and /dev/null differ diff --git a/README.md b/README.md index 43f04ad..7ba807c 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,16 @@ # DweebUI -DweebUI is a simple Docker web interface created with javascript and node.js +DweebUI is a simple Docker web interface created using Javascript, Node.JS, and Express. -Pre-Pre-Pre-Pre-Pre Alpha v0.07 ( :fire: Experimental. Don't install on any servers you care about :fire: ) +Pre-Pre-Pre-Pre-Pre Alpha v0.08 ( :fire: Experimental. Don't install on any servers you care about :fire: ) [![GitHub Stars](https://img.shields.io/github/stars/lllllllillllllillll/DweebUI)](https://github.com/lllllllillllllillll) -[![GitHub License](https://img.shields.io/github/license/lllllllillllllillll/DweebUI)](https://github.com/lllllllillllllillll/DweebUI/blob/main/LICENSE) [![GitHub Activity](https://img.shields.io/github/commit-activity/y/lllllllillllllillll/DweebUI)](https://github.com/lllllllillllllillll) +[![Docker Pulls](https://img.shields.io/docker/pulls/lllllllillllllillll/dweebui)](https://hub.docker.com/repository/docker/lllllllillllllillll/dweebui) +[![GitHub License](https://img.shields.io/github/license/lllllllillllllillll/DweebUI)](https://github.com/lllllllillllllillll/DweebUI/blob/main/LICENSE) + -* I haven't used Github very much and I'm still new to javascript. -* This is the first project I've ever released and I'm sure it's full of plenty of bugs and mistakes. +* This is a personal project that I decided to share. I'm sure it has plenty of bugs and mistakes. +* I haven't used Github very much and I'm still new to Javascript. * I probably should have waited a lot longer to share this :| @@ -17,49 +19,71 @@ Pre-Pre-Pre-Pre-Pre Alpha v0.07 ( :fire: Experimental. Don't install on any serv ## Features -* [x] Dashboard provides server metrics (cpu, ram, network, disk) and container controls on a single page. +* [x] Dashboard provides server metrics, container metrics, and container controls, on a single page. +* [x] View container logs. +* [ ] Update containers (planned). +* [ ] Manage your Docker networks, images, and volumes (planned). * [x] Light/Dark Mode. * [x] Easy to install app templates. -* [x] Automatically persists data in docker volumes if bind mount isn't used. -* [x] Proxy manager for Caddy. (Optional) -* [x] Partial Portainer Template Support (Network Mode, Ports, Volumes, Enviroment Variables, Labels, Commands, Restart Policy, Nvidia Hardware Acceleration). +* [x] Proxy manager for Caddy (Optional). * [x] Multi-User built-in. -* [ ] User pages: Shortcuts, Requests, Support. (planned) +* [ ] User pages (planned). * [x] Support for Windows, Linux, and MacOS. -* [ ] Import compose files. (planned) -* [x] Javascript, Node.js, and Express. +* [ ] Docker compose support (planned). * [x] Templates.json maintains compatability with Portainer, allowing you to use the template without needing to use DweebUI. -* [ ] Manage your Docker networks, images, and volumes. (planned) -* [ ] Preset variables. (planned) -* [ ] VPN, VPS, and Firewall Toggles. (planned) -* [ ] Offline Mode. (planned) +* [x] Automatically persists data in docker volumes if bind mount isn't used. +* [ ] Preset variables (planned). +* [ ] Offline/Local Icons (planned). + ## Setup -* Docker compose.yaml: +Docker Compose: ``` +version: "3.9" services: -  dweebui: -    container_name: DweebUI -    image: lllllllillllllillll/dweebui:v0.07 -    environment: -      NODE_ENV: production -      PORT: 8000 -      # Proxy_Manager: enabled -    restart: unless-stopped -    ports: -      - 8000:8000 -    volumes: -      - dweebui:/app -      - caddyfiles:/app/caddyfiles -      - /var/run/docker.sock:/var/run/docker.sock + + dweebui: + container_name: dweebui + image: lllllllillllllillll/dweebui:v0.08 + # build: + # context: . + environment: + NODE_ENV: production + PORT: 8000 + SECRET: MrWiskers + #Proxy_Manager: enabled + restart: unless-stopped + ports: + - 8000:8000 + volumes: + - dweebui:/app + - caddyfiles:/app/caddyfiles + - /var/run/docker.sock:/var/run/docker.sock + #- ./custom-templates.json:/app/custom-templates.json + #- ./composefiles:/app/composefiles + networks: + - dweeb_network + volumes: -  dweebui: -  caddyfiles: + dweebui: + caddyfiles: + + +networks: + dweeb_network: + driver: bridge ``` -* Using setup.sh: +Compose setup: + +* Paste the above content into a file named ```docker-compose.yml``` then place it in a folder named ```dweebui```. +* Open a terminal in the ```dweebui``` folder, then enter ```docker compose up -d```. +* You may need to use ```docker-compose up -d``` or execute the command as root with either ```sudo docker compose up -d``` or ```sudo docker-compose up -d```. + + +Using setup.sh: ``` Extract DweebUI.zip and navigate to /DweebUI cd DweebUI @@ -68,8 +92,9 @@ sudo ./setup.sh ``` -## Credit +## Credits +* Dockerode and dockerode-compose by Apocas: https://github.com/apocas/dockerode * UI was built using HTML and CSS elements from https://tabler.io/ * Apps template based on Portainer template provided by Lissy93: https://github.com/Lissy93/portainer-templates -* Icons from Walkxcode with some renames and additions: https://github.com/walkxcode/dashboard-icons +* Icons from Walkxcode with some renames and additions: https://github.com/walkxcode/dashboard-icons \ No newline at end of file diff --git a/app.js b/app.js index 7be165b..6635f59 100644 --- a/app.js +++ b/app.js @@ -8,10 +8,13 @@ const PORT = process.env.PORT || 8000; const routes = require("./routes"); // Functions and variables -const { serverStats, containerList, containerStats, containerAction, containerLogs } = require('./functions/system'); +const { serverStats, containerList, containerStats, containerAction, containerLogs, hiddenContainers } = require('./functions/system'); let sentList, clicked; app.locals.site_list = ''; +const Containers = require('./database/ContainerSettings'); + + // Configure Session const sessionMiddleware = session({ secret: "keyboard cat", @@ -36,7 +39,7 @@ app.use([ // Start Express server const server = app.listen(PORT, async () => { - console.log(`App listening on port ${PORT}`); + console.log(`App listening on port ${PORT}`); }); // Start Socket.io @@ -90,11 +93,39 @@ io.on('connection', (socket) => { clicked = false; }); + + socket.on('hide', async (data) => { + console.log(`Hide ${data.container}`); + + let containerExists = await Containers.findOne({ where: {name:data.container}}); + + if(!containerExists){ + const container = await Containers.create({ + name: data.container, + visibility: false + }); + hiddenContainers(); + console.log(`[Created] Container ${data.container} hidden`) + } else { + containerExists.update({ visibility: false }); + console.log(`[Updated] Container ${data.container} hidden`) + hiddenContainers(); + } + }); + + socket.on('reset', (data) => { + // set visibility to true for all containers + Containers.update({ visibility: true }, { where: {} }); + console.log('All containers visible'); + hiddenContainers(); + }); + // Container logs socket.on('logs', (data) => { containerLogs(data.container) .then(logs => { + console.log(`Refreshed logs for ${data.container}`) socket.emit('logString', logs); }) .catch(err => { diff --git a/components/dashCard.js b/components/dashCard.js index 7974973..2afbc14 100644 --- a/components/dashCard.js +++ b/components/dashCard.js @@ -1,11 +1,24 @@ module.exports.dashCard = function dashCard(data) { - let { name, service, id, state, image, external_port, internal_port, ports, volumes, environment_variables, labels } = data; - + let { name, service, id, state, image, external_port, internal_port, ports, volumes, environment_variables, labels, IPv4, style } = data; + + let margin, iconSize, fontSize = ''; + + if (style == "Large") { + iconSize = 'width="150px"' + } else if ((style == "Compact") || (style == undefined)) { + iconSize = 'width="100px"' + margin = 'style="margin-bottom: 0;"' + } else if (style == "Row") { + iconSize = 'width="50px"' + margin = 'style="margin-bottom: 0;"' + } + + //disable controls for a docker container depending on its name - let enabled = ""; - if (name.startsWith('Dweeb')) { - enabled = 'disabled=""'; + let actions = ""; + if (name.startsWith('dweebui')) { + actions = 'disabled=""'; } if ( external_port == undefined ) { external_port = 0; } @@ -115,23 +128,23 @@ module.exports.dashCard = function dashCard(data) {
- +
${external_port}:${internal_port}
- - - -
+
-
- + diff --git a/compose.yaml b/compose.yaml deleted file mode 100644 index 11cf584..0000000 --- a/compose.yaml +++ /dev/null @@ -1,19 +0,0 @@ -services: - dweebui: - container_name: DweebUI - image: lllllllillllllillll/dweebui:v0.07 - environment: - NODE_ENV: production - PORT: 8000 - # Proxy_Manager: enabled - restart: unless-stopped - ports: - - 8000:8000 - volumes: - - dweebui:/app - - caddyfiles:/app/caddyfiles - - /var/run/docker.sock:/var/run/docker.sock - -volumes: - dweebui: - caddyfiles: diff --git a/controllers/apps.js b/controllers/apps.js index a83b216..9ceb6c8 100644 --- a/controllers/apps.js +++ b/controllers/apps.js @@ -1,11 +1,8 @@ const User = require('../database/UserModel'); const { appCard } = require('../components/appCard') const { dashCard } = require('../components/dashCard'); - const { install, uninstall } = require('../functions/package_manager'); -// import { install, uninstall } from '../functions/package_manager'; - const templates_json = require('../templates.json'); let templates = templates_json.templates; @@ -18,23 +15,24 @@ templates = templates.sort((a, b) => { exports.Apps = async function(req, res) { + if (req.session.role == "admin") { // Get the user. let user = await User.findOne({ where: { UUID: req.session.UUID }}); - let page = Number(req.query.page) || 1; + let page = Number(req.params.page) || 1; let list_start = (page - 1) * 28; let list_end = (page * 28); let last_page = Math.ceil(templates.length / 28); - let prev = '/apps?page=' + (page - 1); - let next = '/apps?page=' + (page + 1); + let prev = '/apps/' + (page - 1); + let next = '/apps/' + (page + 1); if (page == 1) { - prev = '/apps?page=' + (page); + prev = '/apps/' + (page); } if (page == last_page) { - next = '/apps?page=' + (page); + next = '/apps/' + (page); } let apps_list = ''; diff --git a/controllers/auth.js b/controllers/auth.js index b4c176a..f83cca3 100644 --- a/controllers/auth.js +++ b/controllers/auth.js @@ -86,11 +86,11 @@ exports.Register = function(req,res){ exports.processRegister = async function(req,res){ // Get the data. - let { first_name, last_name, username, email, password, avatar, tos } = req.body; + let { first_name, last_name, username, email, password, avatar, tos, secret } = req.body; let role = "user"; // Check the data. - if(first_name && last_name && email && password && username && tos){ + if((first_name && last_name && email && password && username && tos) && (secret == process.env.SECRET)){ // Check if there is an existing user with that username. let existingUser = await User.findOne({ where: {username:username}}); diff --git a/controllers/dashboard.js b/controllers/dashboard.js index 4425ee6..87d86bf 100644 --- a/controllers/dashboard.js +++ b/controllers/dashboard.js @@ -1,4 +1,6 @@ const User = require('../database/UserModel'); +const Containers = require('../database/ContainerSettings'); + const { readFileSync, writeFileSync, appendFileSync, readdirSync } = require('fs'); const { execSync } = require("child_process"); const { siteCard } = require('../components/siteCard'); diff --git a/database/ContainerSettings.js b/database/ContainerSettings.js new file mode 100644 index 0000000..14e4491 --- /dev/null +++ b/database/ContainerSettings.js @@ -0,0 +1,47 @@ +const { Sequelize, DataTypes } = require('sequelize'); + +const sequelize = new Sequelize({ + dialect: 'sqlite', + storage: './database/db.sqlite', + logging: false +}); + + +const Containers = sequelize.define('Containers', { + // Model attributes are defined here + id: { + type: DataTypes.INTEGER, + autoIncrement: true, + primaryKey: true + }, + name: { + type: DataTypes.STRING, + allowNull: false + }, + visibility: { + type: DataTypes.STRING + // allowNull defaults to true + }, + size: { + type: DataTypes.STRING + // allowNull defaults to true + }, + group: { + type: DataTypes.STRING + // allowNull defaults to true + }, + permissions: { + type: DataTypes.STRING + // allowNull defaults to true + } +}); + +async function syncModel() { + await sequelize.sync(); + console.log('Containers model synced'); +} + +syncModel(); + + +module.exports = Containers; \ No newline at end of file diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 0000000..828837c --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,30 @@ +version: "3.9" +services: + dweebui: + container_name: dweebui + image: lllllllillllllillll/dweebui:v0.08 + # build: + # context: . + environment: + PORT: 8000 + SECRET: MrWiskers + #Proxy_Manager: enabled + restart: unless-stopped + ports: + - 8000:8000 + volumes: + - dweebui:/app + - caddyfiles:/app/caddyfiles + - /var/run/docker.sock:/var/run/docker.sock + #- ./custom-templates.json:/app/custom-templates.json + #- ./composefiles:/app/composefiles + networks: + - dweeb_network + +volumes: + dweebui: + caddyfiles: + +networks: + dweeb_network: + driver: bridge diff --git a/functions/package_manager.js b/functions/package_manager.js index 6769ac7..9f5065a 100644 --- a/functions/package_manager.js +++ b/functions/package_manager.js @@ -1,7 +1,7 @@ const { writeFileSync, mkdirSync, readFileSync } = require("fs"); const yaml = require('js-yaml'); -const { exec, execSync } = require("child_process"); +const { execSync } = require("child_process"); const { docker } = require('./system'); @@ -18,11 +18,6 @@ module.exports.install = async function (data) { let { env0, env1, env2, env3, env4, env5, env6, env7, env8, env9, env10, env11 } = data; let { label0, label1, label2, label3, label4, label5, label6, label7, label8, label9, label10, label11 } = data; - - if ((service_name.includes('caddy')) || (name.includes('caddy'))) { - req.app.locals.caddy = 'enabled'; - } - let docker_volumes = []; if (image.startsWith('https://')){ diff --git a/functions/system.js b/functions/system.js index f34a531..3e12d55 100644 --- a/functions/system.js +++ b/functions/system.js @@ -1,12 +1,26 @@ -const { currentLoad, mem, networkStats, fsSize, dockerContainerStats } = require('systeminformation'); +const { currentLoad, mem, networkStats, fsSize, dockerContainerStats, networkInterfaces } = require('systeminformation'); var Docker = require('dockerode'); var docker = new Docker({ socketPath: '/var/run/docker.sock' }); const { dashCard } = require('../components/dashCard'); const { Readable } = require('stream'); +const Containers = require('../database/ContainerSettings'); + // export docker module.exports.docker = docker; + +let IPv4 = ''; +networkInterfaces().then(data => { + IPv4 = data[0].ip4; +}); + +let hidden = ''; +module.exports.hiddenContainers = async function () { + hidden = await Containers.findAll({ where: {visibility:false}}); + hidden = hidden.map(a => a.name); +} + module.exports.serverStats = async function () { const cpuUsage = await currentLoad(); const ramUsage = await mem(); @@ -33,7 +47,7 @@ module.exports.containerList = async function () { for (const container of data) { - if ((container.Names[0].slice(1) != 'DweebUI') && (container.Names[0].slice(1) != 'DweebCache')) { + if (!hidden.includes(container.Names[0].slice(1))) { let imageVersion = container.Image.split('/'); let service = imageVersion[imageVersion.length - 1].split(':')[0]; @@ -53,7 +67,9 @@ module.exports.containerList = async function () { } ports_list.push(ports); } - } catch { console.log('no ports') } + } catch { + // console.log('no ports') + } for (let i = 0; i < 12; i++) { if (ports_list[i] == undefined) { @@ -78,7 +94,9 @@ module.exports.containerList = async function () { readwrite: value.split(':')[2] } volumes_list.push(volumes); - }} catch { console.log('no volumes') } + }} catch { + // console.log('no volumes') + } for (let i = 0; i < 12; i++) { if (volumes_list[i] == undefined) { let volumes = { @@ -147,6 +165,8 @@ module.exports.containerList = async function () { volumes: volumes_list, environment_variables: environment_variables, labels: labels, + IPv4: IPv4, + style: "Compact" } let dockerCard = dashCard(container_info); @@ -172,7 +192,7 @@ module.exports.containerStats = async function () { for (const container of data) { - if ((container.Names[0].slice(1) != 'DweebUI') && (container.Names[0].slice(1) != 'DweebCache')) { + if (!hidden.includes(container.Names[0].slice(1))) { const stats = await dockerContainerStats(container.Id); let container_stat = { diff --git a/package-lock.json b/package-lock.json index 36df813..d552b0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "dweeb-ui", + "name": "dweebui", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "dweeb-ui", + "name": "dweebui", "version": "1.0.0", "license": "ISC", "dependencies": { @@ -17,7 +17,7 @@ "express": "^4.18.2", "express-session": "^1.17.3", "js-yaml": "^4.1.0", - "sequelize": "^6.35.1", + "sequelize": "^6.35.2", "socket.io": "^4.6.1", "sqlite3": "^5.1.6", "systeminformation": "^5.21.20" @@ -118,9 +118,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.10.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.3.tgz", - "integrity": "sha512-XJavIpZqiXID5Yxnxv3RUDKTN5b81ddNC3ecsA0SoFXz/QU8OGBwZGMomiq0zw+uuqbL/krztv/DINAQ/EV4gg==", + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", "dependencies": { "undici-types": "~5.26.4" } @@ -1999,9 +1999,9 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/sequelize": { - "version": "6.35.1", - "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.1.tgz", - "integrity": "sha512-UlP5k33nJsN11wCDLaWZXw9bB8w4ESKc5QmG6D04qMimwBwKVNeqRJiaaBlEJdtg8cRK+OJh95dliP+uEi+g9Q==", + "version": "6.35.2", + "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.35.2.tgz", + "integrity": "sha512-EdzLaw2kK4/aOnWQ7ed/qh3B6/g+1DvmeXr66RwbcqSm/+QRS9X0LDI5INBibsy4eNJHWIRPo3+QK0zL+IPBHg==", "funding": [ { "type": "opencollective", diff --git a/package.json b/package.json index 5c43d34..1e8b47f 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "dweeb-ui", + "name": "dweebui", "version": "1.0.0", "main": "app.js", "keywords": [], @@ -14,7 +14,7 @@ "express": "^4.18.2", "express-session": "^1.17.3", "js-yaml": "^4.1.0", - "sequelize": "^6.35.1", + "sequelize": "^6.35.2", "socket.io": "^4.6.1", "sqlite3": "^5.1.6", "systeminformation": "^5.21.20" diff --git a/public/js/main.js b/public/js/main.js index bf3f660..a91ae29 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -116,6 +116,14 @@ function buttonAction(button) { } +function hideContainer(button) { + socket.emit('hide', {container: button.name}); +} + +function resetView() { + socket.emit('reset'); +} + let containerLogs; function viewLogs(button) { diff --git a/routes/index.js b/routes/index.js index 30146c3..0fac784 100644 --- a/routes/index.js +++ b/routes/index.js @@ -3,14 +3,14 @@ const router = express.Router(); const { Dashboard, AddSite, RemoveSite, RefreshSites, DisableSite, EnableSite } = require("../controllers/dashboard"); const { Login, processLogin, Logout, Register, processRegister } = require("../controllers/auth"); - const { Apps, searchApps, Install, Uninstall } = require("../controllers/apps"); + const { Users } = require("../controllers/users"); const { Account } = require("../controllers/account"); const { Settings } = require("../controllers/settings"); - +// Dashboard router.get("/", Dashboard); router.post("/addsite", AddSite) router.post("/removesite", RemoveSite) @@ -18,29 +18,31 @@ router.get("/refreshsites", RefreshSites) router.post("/disablesite", DisableSite) router.post("/enablesite", EnableSite) +// Auth +router.get("/login",Login); +router.post("/login",processLogin); +router.get("/register", Register); +router.post("/register",processRegister); +router.get("/logout",Logout); -router.post("/install", Install) -router.post("/uninstall", Uninstall) - - - -router.get("/users", Users); - +// Apps page router.get("/apps", Apps); +router.get("/apps/:page", Apps); +router.get("/apps/:template/:page", Apps); router.post("/apps", searchApps); + + +// Settings page router.get("/settings", Settings); router.get("/account", Account); -router.get("/login",Login); // Login page -router.post("/login",processLogin); // Process login -router.get("/register", Register); // Register page -router.post("/register",processRegister); // Process Register - -router.get("/logout",Logout); // Logout +router.post("/install", Install) +router.post("/uninstall", Uninstall) +router.get("/users", Users); module.exports = router; \ No newline at end of file diff --git a/screenshots/logs.png b/screenshots/logs.png new file mode 100644 index 0000000..0a9cff3 Binary files /dev/null and b/screenshots/logs.png differ diff --git a/views/pages/account.ejs b/views/pages/account.ejs index 316eb27..4274200 100644 --- a/views/pages/account.ejs +++ b/views/pages/account.ejs @@ -6,8 +6,8 @@ Settings - Tabler - Premium and Open Source dashboard template with responsive and high quality UI. - - + + - +
<%- include('../partials/navbar.ejs') %> @@ -139,7 +139,7 @@
- - + + \ No newline at end of file diff --git a/views/pages/apps.ejs b/views/pages/apps.ejs index 07c0153..206c2e5 100644 --- a/views/pages/apps.ejs +++ b/views/pages/apps.ejs @@ -6,8 +6,8 @@ Apps list. - - + + - +
@@ -38,13 +38,31 @@
+
-   +   + + +
+
@@ -87,7 +105,7 @@ - - + + \ No newline at end of file diff --git a/views/pages/dashboard.ejs b/views/pages/dashboard.ejs index f37fc34..c14fd52 100644 --- a/views/pages/dashboard.ejs +++ b/views/pages/dashboard.ejs @@ -6,9 +6,9 @@ Dashboard. - - - + + + - +
@@ -75,7 +75,7 @@
- - + + \ No newline at end of file diff --git a/views/pages/register.ejs b/views/pages/register.ejs index 97829da..c8a0421 100644 --- a/views/pages/register.ejs +++ b/views/pages/register.ejs @@ -6,8 +6,8 @@ DweebUI - Register - - + + - +
@@ -79,6 +79,11 @@
+
+ + +
+
@@ -176,7 +181,7 @@
- - + + \ No newline at end of file diff --git a/views/pages/settings.ejs b/views/pages/settings.ejs index 0a47299..b5a03e5 100644 --- a/views/pages/settings.ejs +++ b/views/pages/settings.ejs @@ -14,8 +14,8 @@ Settings - - + + - +
<%- include('../partials/navbar.ejs') %> @@ -139,7 +139,7 @@
- - + + \ No newline at end of file diff --git a/views/pages/users.ejs b/views/pages/users.ejs index d98bf99..de2474f 100644 --- a/views/pages/users.ejs +++ b/views/pages/users.ejs @@ -14,8 +14,8 @@ Users - - + + - +
@@ -75,7 +75,7 @@
- - + + \ No newline at end of file diff --git a/views/partials/footer.ejs b/views/partials/footer.ejs index e0c7cbc..2ae8f80 100644 --- a/views/partials/footer.ejs +++ b/views/partials/footer.ejs @@ -24,7 +24,7 @@
  • - v0.07 + v0.08
  • diff --git a/views/partials/navbar.ejs b/views/partials/navbar.ejs index 6ce13f9..73178a5 100644 --- a/views/partials/navbar.ejs +++ b/views/partials/navbar.ejs @@ -53,28 +53,29 @@

    - Tabler + Tabler

    diff --git a/views/partials/site_list.ejs b/views/partials/site_list.ejs deleted file mode 100644 index e69de29..0000000 diff --git a/views/partials/users_list.ejs b/views/partials/users_list.ejs deleted file mode 100644 index a293c0a..0000000 --- a/views/partials/users_list.ejs +++ /dev/null @@ -1,12 +0,0 @@ - - - 1 - - John Doe - JDoe - JDoe@gmail.com - 685468468465138 - Admin - Active - Edit - \ No newline at end of file