From 5288f0d95431560ab14e240b4a8fe341c74eb205 Mon Sep 17 00:00:00 2001 From: Yann Stepienik Date: Tue, 20 Jun 2023 18:34:06 +0100 Subject: [PATCH] [release] v0.8.0-unstable --- changelog.md | 4 + client/src/App.jsx | 60 +++++- client/src/api/index.demo.jsx | 12 +- client/src/api/index.jsx | 52 ++++- client/src/api/wrap.js | 24 ++- .../images/icons/cosmos_simple_black.png | Bin 0 -> 22663 bytes .../images/icons/cosmos_simple_white.png | Bin 0 -> 24422 bytes client/src/components/Logo/Logo.jsx | 6 +- client/src/components/fileUpload.jsx | 4 +- client/src/index.css | 56 +++++ .../DrawerContent/Navigation/NavItem.jsx | 4 +- client/src/pages/config/users/configman.jsx | 105 ++++++++- client/src/pages/home/index.jsx | 204 +++++++++++++++--- client/src/pages/newInstall/newInstall.jsx | 25 +-- client/src/pages/servapps/servapps.jsx | 10 +- client/src/themes/index.jsx | 5 +- client/src/themes/palette.jsx | 11 +- client/src/utils/dns-challenge-comp.jsx | 2 +- client/src/utils/servapp-icon.jsx | 7 + go.mod | 8 +- go.sum | 10 + package-lock.json | 48 ++++- package.json | 3 +- src/background.go | 112 ++++++++++ src/httpServer.go | 5 +- src/status.go | 15 +- src/utils/types.go | 12 ++ src/utils/utils.go | 80 ++++++- 28 files changed, 810 insertions(+), 74 deletions(-) create mode 100644 client/src/assets/images/icons/cosmos_simple_black.png create mode 100644 client/src/assets/images/icons/cosmos_simple_white.png create mode 100644 client/src/utils/servapp-icon.jsx create mode 100644 src/background.go diff --git a/changelog.md b/changelog.md index 49352b5..722e468 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,7 @@ +## Version 0.8.0 + - Stop showing Docker not connected when first loading status + - Add privacy settings to external links + ## Version 0.7.1 -> 0.7.10 - Fix issue where multiple DBs get created at the setup - Add more special characters to be used for password validation diff --git a/client/src/App.jsx b/client/src/App.jsx index 6d22200..b83485a 100644 --- a/client/src/App.jsx +++ b/client/src/App.jsx @@ -4,23 +4,68 @@ import * as React from 'react'; import ThemeCustomization from './themes'; import ScrollTop from './components/ScrollTop'; import Snackbar from '@mui/material/Snackbar'; -import {Alert} from '@mui/material'; +import {Alert, Box} from '@mui/material'; +import logo from './assets/images/icons/cosmos.png'; + +import * as API from './api'; import { setSnackit } from './api/wrap'; // ==============================|| APP - THEME, ROUTER, LOCAL ||============================== // +const LoadingAnimation = () => ( +
+
+
+
+
+ ); + +export let SetPrimaryColor = () => {}; +export let SetSecondaryColor = () => {}; +export let GlobalPrimaryColor = ''; +export let GlobalSecondaryColor = ''; + const App = () => { const [open, setOpen] = React.useState(false); const [message, setMessage] = React.useState(''); const [severity, setSeverity] = React.useState('error'); + const [statusLoaded, setStatusLoaded] = React.useState(false); + const [PrimaryColor, setPrimaryColor] = React.useState(API.PRIMARY_COLOR); + const [SecondaryColor, setSecondaryColor] = React.useState(API.SECONDARY_COLOR); + + SetPrimaryColor = (color) => { + setPrimaryColor(color); + GlobalPrimaryColor = color; + } + + SetSecondaryColor = (color) => { + setSecondaryColor(color); + GlobalSecondaryColor = color; + } + + React.useEffect(() => { + API.getStatus(true).then((r) => { + if(r) { + setStatusLoaded(true); + } + setPrimaryColor(API.PRIMARY_COLOR); + setSecondaryColor(API.SECONDARY_COLOR); + }).catch(() => { + setStatusLoaded(true); + setPrimaryColor(API.PRIMARY_COLOR); + setSecondaryColor(API.SECONDARY_COLOR); + }); + }, []); + setSnackit((message, severity='error') => { setMessage(message); setOpen(true); setSeverity(severity); }) - return ( - + + return statusLoaded ? + { - ) + + :
+ + {/* */} + + +
+ } export default App; diff --git a/client/src/api/index.demo.jsx b/client/src/api/index.demo.jsx index 098580c..5f52259 100644 --- a/client/src/api/index.demo.jsx +++ b/client/src/api/index.demo.jsx @@ -60,4 +60,14 @@ export const checkHost = (host) => { 100 ); }); -} \ No newline at end of file +} + +export const uploadBackground = (file) => { + return new Promise((resolve, reject) => { + setTimeout(() => { + resolve({ + "status": "ok", + "data": "" + })}, 100 ); + }); + } \ No newline at end of file diff --git a/client/src/api/index.jsx b/client/src/api/index.jsx index 2ba38fa..9b9997a 100644 --- a/client/src/api/index.jsx +++ b/client/src/api/index.jsx @@ -16,17 +16,52 @@ import wrap from './wrap'; export let CPU_ARCH = 'amd64'; export let CPU_AVX = true; -let getStatus = () => { +export let HOME_BACKGROUND; +export let PRIMARY_COLOR; +export let SECONDARY_COLOR; + +export let FIRST_LOAD = false; + +let getStatus = (initial) => { return wrap(fetch('/cosmos/api/status', { method: 'GET', headers: { 'Content-Type': 'application/json' } - })) + }), initial) .then(async (response) => { CPU_ARCH = response.data.CPU; CPU_AVX = response.data.AVX; + HOME_BACKGROUND = response.data.homepage.Background; + PRIMARY_COLOR = response.data.theme.PrimaryColor; + SECONDARY_COLOR = response.data.theme.SecondaryColor; + FIRST_LOAD = true; return response + }).catch((response) => { + const urlSearch = encodeURIComponent(window.location.search); + const redirectTo = (window.location.pathname + urlSearch); + + if(response.status != 'OK') { + if( + window.location.href.indexOf('/cosmos-ui/newInstall') == -1 && + window.location.href.indexOf('/cosmos-ui/login') == -1 && + window.location.href.indexOf('/cosmos-ui/loginmfa') == -1 && + window.location.href.indexOf('/cosmos-ui/newmfa') == -1 && + window.location.href.indexOf('/cosmos-ui/register') == -1 && + window.location.href.indexOf('/cosmos-ui/forgot-password') == -1) { + if(response.status == 'NEW_INSTALL') { + window.location.href = '/cosmos-ui/newInstall'; + } else if (response.status == 'error' && response.code == "HTTP004") { + window.location.href = '/cosmos-ui/login?redirect=' + redirectTo; + } else if (response.status == 'error' && response.code == "HTTP006") { + window.location.href = '/cosmos-ui/loginmfa?redirect=' + redirectTo; + } else if (response.status == 'error' && response.code == "HTTP007") { + window.location.href = '/cosmos-ui/newmfa?redirect=' + redirectTo; + } + } else { + return "nothing"; + } + } }); } @@ -157,6 +192,15 @@ let getDNS = (host) => { }); } +let uploadBackground = (file) => { + const formData = new FormData(); + formData.append('background', file); + return wrap(fetch('/cosmos/api/background', { + method: 'POST', + body: formData + })); +}; + const isDemo = import.meta.env.MODE === 'demo'; let auth = _auth; @@ -176,6 +220,7 @@ if(isDemo) { isOnline = indexDemo.isOnline; checkHost = indexDemo.checkHost; getDNS = indexDemo.getDNS; + uploadBackground = indexDemo.uploadBackground; } export { @@ -188,5 +233,6 @@ export { newInstall, isOnline, checkHost, - getDNS + getDNS, + uploadBackground }; \ No newline at end of file diff --git a/client/src/api/wrap.js b/client/src/api/wrap.js index c6b174e..e6e45ba 100644 --- a/client/src/api/wrap.js +++ b/client/src/api/wrap.js @@ -1,20 +1,32 @@ let snackit; -export default function wrap(apicall) { +export default function wrap(apicall, noError = false) { return apicall.then(async (response) => { let rep; try { rep = await response.json(); - } catch { - snackit('Server error'); - throw new Error('Server error'); + } catch (err) { + if (!noError) { + snackit('Server error'); + throw new Error('Server error'); + } else { + const e = new Error(rep.message); + e.status = rep.status; + e.code = rep.code; + throw e; + } } + if (response.status == 200) { return rep; } - snackit(rep.message); + + if (!noError) { + snackit(rep.message); + } + const e = new Error(rep.message); - e.status = response.status; + e.status = rep.status; e.code = rep.code; throw e; }); diff --git a/client/src/assets/images/icons/cosmos_simple_black.png b/client/src/assets/images/icons/cosmos_simple_black.png new file mode 100644 index 0000000000000000000000000000000000000000..2df8670dcd81965a2cbbc63480606d615f9e3890 GIT binary patch literal 22663 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 literal 0 HcmV?d00001 diff --git a/client/src/assets/images/icons/cosmos_simple_white.png b/client/src/assets/images/icons/cosmos_simple_white.png new file mode 100644 index 0000000000000000000000000000000000000000..3c6cbd9c2bad273ec67732035566e33ce4408efb GIT binary patch literal 24422 zcmce-by!s08aO(1cXxMpcOx}|G$_o_DLI5PbW3-GARyh%pfn;~QbVXnOP6@Z?|kR` zoqM12i+lgLJkNgEd#`uB9c%6NPOO2R1|BvwHUI#?)6!IZ3IHJWAg*dmbi^A^g`Z}K ze^{QHX5Ih*4#}Sj36Psl2>@WwIvJVznCj|CgFM{$ZNMJ3cKi@GPXsgoAgciJv;n!; z`7qkrIXJn?F`snzGc!7Y<(N&xbOm)iRqPy{Gy}ct3?%g+v+u{$oav^8(vTKUG!#n;7Crj@i-2 z$5UEBz~A4W-(Q5^!^=THNJ>iT4-R2rJ_H1xcYwQ(4TR6#o8{jaRPDS$UQV7qP9E-z ze=yqEdieUtF(X+0mke&6|DbjE{##E7jR`<(JOzaK1^>wO7a$n)51gm3m+N1|!5{%U zS35U5cOP#Atk6HOo{k7x z3hiwa;AtoD)Xv+(*9&B)=7(UD<&QL;(kfndHa;F+Mjjrn|F)FDzgcD!Mo7ZQY2xG# z_VD-S`i}{Asy04$a?F3M#wRGkCnRVjBq=Q>DJ?8%{x2w953rMcz<)xC^9duMM5RR~ zrG+GU1cjsp1^)&`xC_|E$L4y0RW8)68(^8dVMu^Mr;XdH_#ael#3cl6rR)XyY(+)I`9#2?Hhi`q zVGy5$ke#qNNZeLLOiKLU+~|8bA!5wN^*^!x;R=kvC@L-`X)7)!#wYQIH9^TgTnP%= z@Y#Xw1;J9{_K1)X`Qym{gYv(zC?VwYM%d8%??6$uarpbr)k*&U4SHFDKT(00#Q3kf ze<2e1UsFU7KJ_*vT=2{`i|6nECJ5PXEO||3{km zd%nM;9Rlfp_rre?_V%#%@wf4^Q*uC<@qg>$0{=60yd*IY{q+k@>TL?rnng%Q@b zu@e>MlN1%V;{$;u?S$;XQbIO@2tW82PyfmFe~pX(GuB1<#r`uo|1}BZXyfi+hsfUo z%>Uno`9BMh|KElA%Rm3+Tmt`3zx!+KKQjEkofuIz{@ngkun-Ublsr3kgr2+*1uYpZ zmk0nbIn`2CGJ@nE75JxvpY^sC?F&j_WK(Sm?&g=FYB7gV!e|9~qFk=16+R*Dkckv? za$9HM#9?wG3KbPAu9V0pn4pw@ZDH|zbZGH z4pM>=ocz0HH=shplxe8svY-SZx=^$!N|27mivf{g$~hv_(*&VmpZ_{^@wOKUL|hET z_m7+nCkmlQ(Lt*~NrQ5Iq)&q;YA2m-av+1AB+V!a-0}LFn7$*6gE0yMF0$wko+P!x zxL>d}&_d8nQENDV^*;DgHISM$*M?FWv~=+OIQPJZrJR;GdO z}CYGedVe~P5GMCQ^6C%lYn?| z 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 Wp6^70GED!O@J$TN^(%B8BmNJ~kO+GK literal 0 HcmV?d00001 diff --git a/client/src/components/Logo/Logo.jsx b/client/src/components/Logo/Logo.jsx index 72c401f..0d8cecd 100644 --- a/client/src/components/Logo/Logo.jsx +++ b/client/src/components/Logo/Logo.jsx @@ -2,12 +2,14 @@ import { useTheme } from '@mui/material/styles'; import { fontWeight } from '@mui/system'; -import logo from '../../assets/images/icons/cosmos.png'; +import logo from '../../assets/images/icons/cosmos_simple_black.png'; +import logoDark from '../../assets/images/icons/cosmos_simple_white.png'; // ==============================|| LOGO SVG ||============================== // const Logo = () => { const theme = useTheme(); + const isLight = theme.palette.mode === 'light'; return ( /** @@ -17,7 +19,7 @@ const Logo = () => { * */ <> - Cosmos + Cosmos Cosmos ); diff --git a/client/src/components/fileUpload.jsx b/client/src/components/fileUpload.jsx index eca1932..a7ba9fc 100644 --- a/client/src/components/fileUpload.jsx +++ b/client/src/components/fileUpload.jsx @@ -2,7 +2,7 @@ import React from 'react'; import { Button } from '@mui/material'; import { UploadOutlined } from '@ant-design/icons'; -export default function UploadButtons({OnChange, accept}) { +export default function UploadButtons({OnChange, accept, label}) { return (
diff --git a/client/src/index.css b/client/src/index.css index 5c5b5bc..3c6d9ab 100644 --- a/client/src/index.css +++ b/client/src/index.css @@ -21,6 +21,58 @@ } +@keyframes pulsing { + 0% { -webkit-transform: scale(1); } + 50% { -webkit-transform: scale(1.1); } + 100% { -webkit-transform: scale(1); } +} + +@keyframes bounce { + 0%, 80%, 100% { + transform: scale(0); + } + 40% { + transform: scale(1.0); + } +} + +.dot { + background-color: #222; + border-radius: 100%; + width: 1.5rem; + height: 1.5rem; + margin: 0 0.25rem; + + /* Animation */ + animation: bounce 1.4s infinite; + animation-fill-mode: both; +} + +@media (prefers-color-scheme: dark) { + .dot { + background-color: #eee; + } +} + +.dot:nth-child(1) { + animation-delay: -0.32s; +} + +.dot:nth-child(2) { + animation-delay: -0.16s; +} + +.dot:nth-child(3) { + animation-delay: 0s; +} + +.loader { + display: flex; + justify-content: center; + align-items: center; + height: 100%; +} + .shinyButton { overflow: hidden; } @@ -87,4 +139,8 @@ .raw-table table th, .raw-table table td { padding: 5px; border: 1px solid #ccc; +} + +.pulsing { + animation: pulsing 2s ease-in-out infinite; } \ No newline at end of file diff --git a/client/src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavItem.jsx b/client/src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavItem.jsx index 2be4088..c0750e8 100644 --- a/client/src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavItem.jsx +++ b/client/src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavItem.jsx @@ -23,7 +23,9 @@ const NavItem = ({ item, level }) => { itemTarget = '_blank'; } - let listItemProps = { component: forwardRef((props, ref) => ) }; + let listItemProps = { component: forwardRef((props, ref) => ) }; if (item?.external) { listItemProps = { component: 'a', href: item.url, target: itemTarget }; } diff --git a/client/src/pages/config/users/configman.jsx b/client/src/pages/config/users/configman.jsx index 6c5b386..e40e378 100644 --- a/client/src/pages/config/users/configman.jsx +++ b/client/src/pages/config/users/configman.jsx @@ -22,6 +22,7 @@ import { Collapse, TextField, MenuItem, + Skeleton, } from '@mui/material'; import { EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'; @@ -31,11 +32,17 @@ import { WarningOutlined, PlusCircleOutlined, CopyOutlined, ExclamationCircleOut import { CosmosCheckbox, CosmosFormDivider, CosmosInputPassword, CosmosInputText, CosmosSelect } from './formShortcuts'; import CountrySelect, { countries } from '../../../components/countrySelect'; import { DnsChallengeComp } from '../../../utils/dns-challenge-comp'; +import { values } from 'lodash'; +import UploadButtons from '../../../components/fileUpload'; +import { TwitterPicker + } from 'react-color'; +import {SetPrimaryColor, SetSecondaryColor} from '../../../App'; const ConfigManagement = () => { const [config, setConfig] = React.useState(null); const [openModal, setOpenModal] = React.useState(false); + const [uploadingBackground, setUploadingBackground] = React.useState(false); function refresh() { API.config.get().then((res) => { @@ -82,7 +89,11 @@ const ConfigManagement = () => { Email_UseTLS : config.EmailConfig.UseTLS, SkipPruneNetwork: config.DockerConfig.SkipPruneNetwork, - DefaultDataPath: config.DockerConfig.DefaultDataPath || "/usr" + DefaultDataPath: config.DockerConfig.DefaultDataPath || "/usr", + + Background: config && config.HomepageConfig && config.HomepageConfig.Background, + PrimaryColor: config && config.ThemeConfig && config.ThemeConfig.PrimaryColor, + SecondaryColor: config && config.ThemeConfig && config.ThemeConfig.SecondaryColor, }} validationSchema={Yup.object().shape({ Hostname: Yup.string().max(255).required('Hostname is required'), @@ -124,7 +135,16 @@ const ConfigManagement = () => { ...config.DockerConfig, SkipPruneNetwork: values.SkipPruneNetwork, DefaultDataPath: values.DefaultDataPath - } + }, + HomepageConfig: { + ...config.HomepageConfig, + Background: values.Background + }, + ThemeConfig: { + ...config.ThemeConfig, + PrimaryColor: values.PrimaryColor, + SecondaryColor: values.SecondaryColor + }, } API.config.set(toSave).then((data) => { @@ -153,6 +173,29 @@ const ConfigManagement = () => { {(formik) => (
+ + {formik.errors.submit && ( + + {formik.errors.submit} + + )} + + + + + + + @@ -231,6 +274,64 @@ const ConfigManagement = () => { + + + + + {!uploadingBackground && formik.values.Background && preview seems broken. Please re-upload.} + {uploadingBackground && } + + { + const file = e.target.files[0]; + API.uploadBackground(file).then((data) => { + formik.setFieldValue('Background', "/cosmos/api/background/" + data.data.extension.replace(".", "")); + }); + }} + /> + + + + + + + + Primary Color + { + let colorRGB = `rgb(${color.rgb.r}, ${color.rgb.g}, ${color.rgb.b}, ${color.rgb.a})` + formik.setFieldValue('PrimaryColor', colorRGB); + SetPrimaryColor(colorRGB); + }} + /> + + + + + + Secondary Color + formik.setFieldValue('SecondaryColor', color.rgb)} + /> + + + + diff --git a/client/src/pages/home/index.jsx b/client/src/pages/home/index.jsx index 927accd..cceee99 100644 --- a/client/src/pages/home/index.jsx +++ b/client/src/pages/home/index.jsx @@ -1,6 +1,6 @@ import { useParams } from "react-router"; import Back from "../../components/back"; -import { Alert, Box, CircularProgress, Grid, Stack, useTheme } from "@mui/material"; +import { Alert, Box, CircularProgress, Grid, Stack, Typography, useMediaQuery, useTheme } from "@mui/material"; import { useEffect, useState } from "react"; import * as API from "../../api"; import wallpaper from '../../assets/images/wallpaper2.jpg'; @@ -10,19 +10,23 @@ import { getFaviconURL } from "../../utils/routes"; import { Link } from "react-router-dom"; import { getFullOrigin } from "../../utils/routes"; import IsLoggedIn from "../../isLoggedIn"; +import { ServAppIcon } from "../../utils/servapp-icon"; +import Chart from 'react-apexcharts'; export const HomeBackground = () => { const theme = useTheme(); const isDark = theme.palette.mode === 'dark'; + const customPaper = API.HOME_BACKGROUND; return ( - - + ); }; @@ -31,15 +35,16 @@ export const TransparentHeader = () => { const theme = useTheme(); const isDark = theme.palette.mode === 'dark'; - const backColor = isDark ? '0,0,0' : '255,255,255'; - const textColor = isDark ? 'white' : 'dark'; + const backColor = isDark ? '0,0,0' : '255,255,255'; + const textColor = isDark ? 'white' : 'dark'; return