Added new responsive design features.

This commit is contained in:
Alexander 2021-11-22 23:16:37 +02:00
commit 7ebcab3cbf
49 changed files with 641 additions and 494 deletions

View file

@ -1,6 +1,6 @@
{
"name": "file_manager",
"version": "0.1.0",
"name": "react-control-panel",
"version": "1.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@ -2250,9 +2250,9 @@
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw=="
},
"are-we-there-yet": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
"integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
"version": "1.1.7",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
"integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
"requires": {
"delegates": "^1.0.0",
"readable-stream": "^2.0.6"
@ -6350,9 +6350,9 @@
}
},
"globule": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz",
"integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==",
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz",
"integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==",
"requires": {
"glob": "~7.1.1",
"lodash": "~4.17.10",
@ -9845,6 +9845,11 @@
"sha.js": "^2.4.8"
}
},
"perfect-scrollbar": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.3.tgz",
"integrity": "sha512-+Lo6t61lSuCY9ghpqh1NFMXOu8fNwlYGqPoUMOZ3HTFIL4g7+L7zD7hQCLW5yjkOZ6LGTw1m9+MfEew7cngtAQ=="
},
"performance-now": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
@ -14588,11 +14593,11 @@
"integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho="
},
"wide-align": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
"integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
"requires": {
"string-width": "^1.0.2 || 2"
"string-width": "^1.0.2 || 2 || 3 || 4"
}
},
"word-wrap": {

View file

@ -16,6 +16,7 @@
"dayjs": "^1.10.7",
"jquery": "^3.5.1",
"node-sass": "^4.14.1",
"perfect-scrollbar": "^1.5.3",
"popper.js": "^1.15.0",
"prop-types": "^15.7.2",
"qs": "^6.9.4",

View file

@ -1,13 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.backups-restore-settings {
.list-item {

View file

@ -1,13 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
$optionalButtonHover: $primary;
$optionalButtonActive: $primaryLight;
@ -64,6 +55,7 @@ $errorColor: #BE5ABF;
}
.search-toolbar-name {
width: auto !important;
padding: 10px 0;
margin-left: 0;
}
@ -134,6 +126,18 @@ $errorColor: #BE5ABF;
}
}
@media screen and (max-width: 900px) {
.form-group {
input[type=text],
input[type=password],
input[type=email],
textarea,
select {
width: 100%;
}
}
}
width: 100%;
.form-group select,
@ -156,7 +160,7 @@ $errorColor: #BE5ABF;
input:-webkit-autofill:hover,
input:-webkit-autofill:focus,
input:-webkit-autofill:active {
background-color: $primaryLight;
background: $primaryLight;
border-color: $primaryActive;
filter: none;
box-shadow: none;
@ -166,7 +170,7 @@ $errorColor: #BE5ABF;
input:autofill:hover,
input:autofill:focus,
input:autofill:active {
background-color: $primaryLight;
background: $primaryLight;
border-color: $primaryActive;
filter: none;
box-shadow: none;
@ -292,4 +296,16 @@ $errorColor: #BE5ABF;
font-weight: bold;
}
}
}
}
@media screen and (max-width: 1066px) {
.form-group {
input[type=text],
input[type=password],
input[type=email],
textarea,
select {
width: 75%;
}
}
}

View file

@ -1,10 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #2e5bb1;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$textColor: #555;
@import 'src/utils/scss/variables';
.list-item {
display: flex;

View file

@ -1,4 +1,4 @@
$primary: #2c54ac;
@import 'src/utils/scss/variables';
div.modal {
z-index: 2;

View file

@ -1,13 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.cron-job-generator {
border: 1px solid #d9d9d9;

View file

@ -47,7 +47,10 @@ const Database = props => {
<br />
<div className="stats">
<Container className="c-1">
<div className="disk">{i18n.Disk}: <span><span className="stat">{data.U_DISK}</span>{i18n.mb}</span></div>
<div className="disk">
{i18n.Disk}: <span><span className="stat">{data.U_DISK}</span>{i18n.mb}</span>
<div className="percent" style={{ width: `${data.U_DISK_PERCENT}%` || '0%' }}></div>
</div>
</Container>
<Container className="c-2">
<div>{i18n.User}: <span className="stat">{data.DBUSER}</span></div>

View file

@ -1,13 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.list .list-container ul li svg {
width: 25px;

View file

@ -1,13 +1,5 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
@import 'src/utils/scss/breakpoints';
.login-page {
display: flex;
@ -78,7 +70,7 @@ $textColor: #555;
background-color: $primary;
border: 1px solid $primary;
padding: 1px 16px 3px;
font-size: 13px;;
font-size: 13px;
height: 35px;
color: #fafafa;
border-radius: 3px;
@ -107,4 +99,42 @@ $textColor: #555;
}
}
}
}
@media (max-width: $tabletMax) {
.login-form-wrapper {
margin: 2rem;
.login-layout {
form {
flex-direction: column;
justify-content: center;
align-items: center;
.c1 {
width: 100%;
margin-bottom: 1.5rem;
a {
text-align: center;
img {
width: 75%;
}
}
}
.c2 {
margin: 0;
width: 100%;
}
.buttons-wrapper {
.add {
margin-bottom: 10px;
}
}
}
}
}
}
}

View file

@ -54,7 +54,11 @@ const Mail = props => {
<div className="name">{data.NAME}</div>
<div className="stats">
<Container className="c-1">
<div className="bandwidth">{i18n.Disk} <span><span className="stat">{data.U_DISK}</span>{i18n.mb}</span></div>
<div className="bandwidth">
{i18n.Disk}
<span><span className="stat">{data.U_DISK}</span>{i18n.mb}</span>
<div className="percent" style={{ width: `${data.U_DISK_PERCENT}%` || '0%' }}></div>
</div>
</Container>
<Container className="c-2">
{printStat(i18n['AntiVirus Support'], data.ANTIVIRUS)}

View file

@ -53,7 +53,11 @@ export default function MailAccount(props) {
<div className="name">{`${data.NAME}@${domain}`}</div>
<div className="stats">
<Container className="c-1">
<div className="bandwidth">{i18n.Disk} <span><span className="stat">{data.U_DISK}</span>&nbsp;{i18n.mb}</span></div>
<div className="bandwidth">
{i18n.Disk}
<span><span className="stat">{data.U_DISK}</span>&nbsp;{i18n.mb}</span>
<div className="percent" style={{ width: `${data.U_DISK_PERCENT}%` || '0%' }}></div>
</div>
</Container>
<Container className="c-2">
<div>{i18n['Quota']}: <span><span className="stat">{data.QUOTA}</span>&nbsp; {i18n.mb}</span></div>

View file

@ -1,4 +1,4 @@
$primary: #2c54ac;
@import 'src/utils/scss/variables';
.mail-info-block {
.select-group {

View file

@ -165,8 +165,9 @@ const MainNav = () => {
return "mobile-top-nav-wrapper hide";
}
}
const topNavigation = () => {
if (document.documentElement.clientWidth > 900) {
if (window.innerWidth > 900) {
return (
<div className={topNavClassName()}>
<Menu menuHeight={state.menuHeight} mobile={false} />

View file

@ -1,37 +1,82 @@
import React, { Component } from 'react';
import React from 'react';
import Menu from '../../MainNav/Stat-menu/Menu';
import Toolbar from '../../MainNav/Toolbar/Toolbar';
import { addActiveElement } from '../../../actions/MainNavigation/mainNavigationActions';
import { useSelector, useDispatch } from "react-redux";
import { Link } from "react-router-dom";
import './MobileTopNav.scss';
class MobileTopNav extends Component {
render() {
return (
<div className={this.props.class}>
<div className="mobile-menu">
<div>
<div>Packages</div>
<div>IP</div>
<div>Graphs</div>
<div>Statistics</div>
<div>Log</div>
</div>
<div>
<div>Updates</div>
<div>Firewall</div>
<div className="fm">File Manager</div>
<div>Apps</div>
<div>Server</div>
</div>
</div>
<div className="mobile-stat-menu">
<Menu mobile={true} />
</div>
<div className="mobile-toolbar">
<Toolbar mobile={true} />
</div>
</div>
);
const MobileTopNav = props => {
const { i18n, userName } = useSelector(state => state.session);
const { session } = useSelector(state => state.userSession);
const { activeElement, focusedElement } = useSelector(state => state.mainNavigation);
const dispatch = useDispatch();
const className = (activeName, extraClass = '') => {
let className = 'top-link';
if (activeName === activeElement) {
className += ' active';
}
if (activeName === focusedElement) {
className += ' focus';
}
return className + ` ${extraClass}`;
}
const handleState = (tab, event) => {
if (`${window.location.pathname}${window.location.search}` === tab) {
return event.preventDefault();
}
dispatch(addActiveElement(tab));
}
return (
<div className={props.class}>
<div className="mobile-menu">
{userName === 'admin' && (<>
<div className={className("/list/package/")}>
<Link to="/list/package/" onClick={event => handleState("/list/package/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Packages}</Link>
</div>
<div className={className("/list/ip/")}>
<Link to="/list/ip/" onClick={event => handleState("/list/ip/", event)} onKeyPress={event => event.preventDefault()}>{i18n.IP}</Link>
</div>
<div className={className("/list/rrd/")}>
<Link to="/list/rrd/" onClick={event => handleState("/list/rrd/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Graphs}</Link>
</div>
</>)}
<div className={className("/list/stats/")}>
<Link to="/list/stats/" onClick={event => handleState("/list/stats/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Statistics}</Link>
</div>
<div className={className("/list/log/")}>
<Link to="/list/log/" onClick={event => handleState("/list/log/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Log}</Link>
</div>
{userName === 'admin' && (<>
<div className={className("/list/updates/")}>
<Link to="/list/updates/" onClick={event => handleState("/list/updates/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Updates}</Link>
</div>
{session.FIREWALL_SYSTEM && <div className={className("/list/firewall/")}>
<Link to="/list/firewall/" onClick={event => handleState("/list/firewall/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Firewall}</Link>
</div>}
</>)}
{session.FILEMANAGER_KEY && <div className={className("/list/directory/")}>
<Link to="/list/directory/">{i18n['File Manager']}</Link>
</div>}
{session.SOFTACULOUS === "yes" && <div className={className("/softaculous/")}><Link to="/softaculous/" target="_blank">{i18n.Apps ?? 'Apps'}</Link>
</div>}
{userName === 'admin' && (
<div className={className("/list/server/")}>
<Link to="/list/server/" onClick={event => handleState("/list/server/", event)} onKeyPress={event => event.preventDefault()}>{i18n.Server}</Link>
</div>
)}
</div>
<div className="mobile-stat-menu">
<Menu mobile={true} />
</div>
</div>
);
}
export default MobileTopNav;
export default MobileTopNav;

View file

@ -1,25 +1,87 @@
$secondaryLight: #f8b014;
@import 'src/utils/scss/variables';
@import 'src/utils/scss/breakpoints';
.mobile-top-nav-wrapper.hide {
opacity: 0;
}
.mobile-top-nav-wrapper.show {
z-index: 5;
opacity: 1;
position: fixed;
width: 100%;
height: 100vh;
height: 111px;
background: white;
display: flex;
flex-direction: column;
animation: showMobileNav forwards .3s;
margin-top: 34px;
margin-top: 82px;
> div {
height: 33.33%;
.mobile-menu {
padding: 0 10%;
flex-wrap: wrap;
margin-top: 15px;
}
> div .top-link {
display: flex;
justify-content: center;
align-items: center;
font-size: 14px;
padding: 4px 0;
&:hover {
background: $secondaryLight;
a, button {
color: $white;
}
}
}
div {
display: flex;
a, button {
display: flex;
justify-content: center;
align-items: center;
padding: 0 10px !important;
width: max-content;
height: 100%;
text-decoration: none;
color: $black;
}
button {
background: none;
border: none;
}
&:hover {
cursor: pointer;
}
}
div.active {
background: white;
a, button {
color: $secondary;
font-weight: bold;
&:hover {
color: white;
}
&:active {
background: $secondaryActive;
color: white;
}
}
&:hover {
color: white;
background: $secondaryLight;
}
}
.toolbar {
@ -29,13 +91,37 @@ $secondaryLight: #f8b014;
}
.mobile-stat-menu .menu-wrapper {
position: relative;
height: auto;
min-height: auto;
.mobile-stat-menu {
box-shadow: 0 5px 3px 0 hsla(0,0%,78.4%,.5);
.menu-stat {
margin: 0;
.menu-wrapper {
position: relative;
height: auto;
min-height: auto;
padding: 0;
margin-top: 9px;
.menu-stat {
margin: 0;
.stat {
text-align: left;
flex: 1 1 auto;
margin-bottom: 15px;
}
}
}
}
}
@media (max-width: 1066px) {
.mobile-stat-menu .menu-wrapper .menu-stat {
margin-top: 40px;
.stat {
.stats {
display: none;
}
}
}
}
@ -46,25 +132,17 @@ $secondaryLight: #f8b014;
}
}
@media (max-width: 450px) {
.mobile-top-nav-wrapper.show .mobile-menu {
padding: 15px 0 0 15px;
font-size: 19px;
height: 27%;
> div {
width: 50%;
height: 100%;
> div {
padding: 2px;
&:hover {
color: $secondaryLight;
}
}
@media (max-width: 725px) {
.mobile-top-nav-wrapper.show {
.menu-stat {
display: flex;
flex-wrap: wrap;
}
}
.mobile-menu {
padding: 0 10%;
}
}
@keyframes showMobileNav {

View file

@ -132,7 +132,13 @@ const Panel = props => {
<div className="top-panel small-device">
<div className="container left-menu">
<div className="logo">LOGO</div>
<div className="logo">
<Link to="/list/user/" onClick={() => dispatch(addActiveElement('/list/user/'))}>
<div>
<img src="/images/white_logo.png" alt="Logo" />
</div>
</Link>
</div>
</div>
<div className="container hamburger" onClick={toggleNavigation}>
<span className="bar"></span>
@ -140,9 +146,7 @@ const Panel = props => {
<span className="bar"></span>
</div>
<div className="container profile-menu">
<div className="bell">
<FontAwesomeIcon icon="bell" />
</div>
{panel[userName]['NOTIFICATIONS'] === 'yes' && <Notifications />}
<div><Link to={`/edit/user?user=${userName}`}>{userName}</Link></div>
<div><button onClick={signOut}>{i18n['Log out']}</button></div>
</div>
@ -151,4 +155,4 @@ const Panel = props => {
);
}
export default Panel;
export default Panel;

View file

@ -1,13 +1,5 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
@import 'src/utils/scss/breakpoints';
.top-panel.small-device {
display: none;
@ -24,6 +16,7 @@ $textColor: #555;
background: #222e44;
height: 34px;
align-items: center;
justify-content: space-between;
padding: 0 13%;
z-index: 2;
@ -53,7 +46,7 @@ $textColor: #555;
justify-content: center;
align-items: center;
padding: 0 10px !important;
width: 100%;
width: max-content;
height: 100%;
text-decoration: none;
color: white;
@ -94,8 +87,8 @@ $textColor: #555;
.left-menu {
width: 75%;
padding-left: 0;
margin-left: 0;
margin: 0;
padding: 0;
justify-content: space-between;
div {
@ -141,7 +134,10 @@ $textColor: #555;
}
.profile-menu {
width: auto;
width: 25%;
margin: 0;
padding: 0;
justify-content: flex-end;
div {
height: 100%;
@ -240,36 +236,37 @@ $textColor: #555;
}
}
@media screen and (max-width: 1350px) {
@media screen and (min-width: $desktopMax) {
.top-panel {
padding: 0 10%;
}
}
@media screen and (max-width: 1024px) {
@media screen and (max-width: $desktopMin) {
.top-panel {
padding: 0 5%;
padding: 0 8%;
}
}
//Small Devices
@media (max-width: 900px) {
@media screen and (max-width: 1200px) {
.top-panel {
padding: 0 10%;
}
}
@media (max-width: 1065px) {
.top-panel {
display: none;
}
.top-panel.small-device {
display: flex;
padding: 0;
justify-content: space-between;
padding: 0 10%;
> .container {
justify-content: center;
align-items: center;
width: 30%;
}
.profile-menu {
padding-left: 10%;
width: auto;
}
.hamburger {
@ -287,35 +284,18 @@ $textColor: #555;
}
}
}
}
@keyframes toggleNav {
from {
transform: translateY(-20px);
}
@media (max-width: $phoneMax) {
.top-panel.small-device {
padding: 0;
}
to {
transform: translateY(50px);
.top-panel .left-menu div.logo {
width: unset;
a div {
width: 5rem;
}
}
}
@media (max-width: 420px) {
.top-panel.small-device {
.profile-menu {
padding: 0;
margin-right: 5px;
.bell {
width: 20%;
}
.bell + div {
width: 40%;
}
.bell + div + div {
width: 40%;
}
}
}
}

View file

@ -50,20 +50,6 @@ const Menu = props => {
return `stat ${activeName === activeElement && 'l-active'} ${activeName === focusedElement && 'focus'}`;
}
const sizeFormatter = (bytes, decimals) => {
if (!bytes) return null;
if (bytes === "0") {
return <span className="value">0 <span className="unit">b</span></span>;
}
let k = 1024,
dm = decimals <= 0 ? 0 : decimals || 2,
sizes = ['b', 'kb', 'Mb', 'GB'],
i = Math.floor(Math.log(bytes) / Math.log(k));
return (<span className="value">{parseFloat((bytes / Math.pow(k, i)).toFixed(dm))} <span className="unit">{sizes[i]}</span></span>);
}
return (
<div className="menu-wrapper">
<div className={className(props.menuHeight)} style={{ height: style(props) }}>

View file

@ -1,13 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.menu-wrapper {
position: fixed;
@ -18,7 +9,7 @@ $textColor: #555;
.menu-stat {
display: flex;
flex-direction: row;
margin-top: 70px;
margin-top: 50px;
min-height: 45px;
max-height: 135px;
height: 145px;
@ -152,13 +143,24 @@ $textColor: #555;
}
}
@media screen and (max-width: 1024px) {
@media screen and (max-width: 1066px) {
.menu-wrapper {
padding: 0 10%;
.menu-stat {
padding: 0 10%;
margin-top: 40px;
}
}
}
@media (max-width: 900px) {
@media screen and (max-width: 1024px) {
.menu-wrapper {
.menu-stat {
padding: 0 10%;
}
}
}
@media (max-width: 1066px) {
.menu-wrapper {
padding: 1%;
@ -167,55 +169,9 @@ $textColor: #555;
min-height: auto;
.stat {
flex-grow: 1;
height: 30px;
padding-left: 5px;
min-width: 14%;
text-align: left;
h3 {
padding: 0;
}
.stats {
display: none;
}
}
}
}
}
@media (max-width: 450px) {
.main-nav .mobile-top-nav-wrapper.show .mobile-stat-menu {
border: 1px solid black;
border-width: 1px 0;
margin-top: 15px;
.menu-wrapper {
height: 100%;
padding: 0;
.menu-stat {
flex-wrap: wrap;
max-height: 100%;
min-height: 100%;
.stat {
display: flex;
align-items: center;
border: none;
padding: 5px 5px 5px 15px;
min-width: 50%;
height: auto;
h3 {
margin: 0;
}
}
.stat.l-active {
background: #fdac020d;
}
}
}
}

View file

@ -1,13 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.l-menu {
transform: translate(35px, 50%);
@ -39,6 +30,12 @@ $textColor: #555;
}
}
@media screen and (max-width: 900px) {
span.add {
display: none !important;
}
}
&:active {
background: $primary;
@ -72,6 +69,10 @@ $textColor: #555;
height: 21px;
}
}
@media screen and (max-width: 900px) {
transform: unset;
}
}
.l-menu.none {

View file

@ -1,6 +1,10 @@
.select-wrapper {
display: flex;
select {
width: auto;
}
select, button {
border-radius: 0;
}

View file

@ -1,70 +1,62 @@
import React, { Component } from 'react';
import React, { useEffect, useState } from 'react';
import './Toolbar.scss';
class Toolbar extends Component {
state = {
toolbarHeight: 205
}
const Toolbar = props => {
const [toolbarHeight, setToolbarHeight] = useState(185);
componentDidMount() {
window.addEventListener("resize", this.handleToolbar);
document.addEventListener("scroll", this.changeToolbarHeight);
}
useEffect(() => {
window.addEventListener("resize", handleToolbar);
document.addEventListener("scroll", changeToolbarHeight);
componentWillUnmount() {
window.removeEventListener("resize", this.handleToolbar);
document.removeEventListener("scroll", this.changeToolbarHeight);
}
return () => {
window.removeEventListener("resize", handleToolbar);
document.removeEventListener("scroll", changeToolbarHeight);
}
}, []);
handleToolbar = () => {
const handleToolbar = () => {
if (document.documentElement.clientWidth < 900) {
this.setState({
toolbarHeight: 115
});
setToolbarHeight(95);
} else {
this.setState({
toolbarHeight: 205
});
setToolbarHeight(185);
}
}
changeToolbarHeight = () => {
const changeToolbarHeight = () => {
if (document.documentElement.clientWidth > 900) {
let scrollTop = window.scrollY;
let toolbarHeight = Math.max(115, 205 - scrollTop);
this.setState({ toolbarHeight });
let newToolbarHeight = Math.max(95, 185 - scrollTop);
setToolbarHeight(newToolbarHeight);
}
}
className = () => {
const { className } = this.props;
const className = () => {
const { className } = props;
if (className === "justify-right") {
return this.state.toolbarHeight === 115 ? "toolbar t-shadow " + className : "toolbar " + className;
return toolbarHeight === 95 ? "toolbar t-shadow " + className : "toolbar " + className;
}
return this.state.toolbarHeight === 115 ? "toolbar t-shadow" : "toolbar";
return toolbarHeight === 95 ? "toolbar t-shadow" : "toolbar";
}
style = () => {
if (this.props.mobile) {
const style = () => {
if (props.mobile) {
return;
}
if (document.documentElement.clientWidth > 900) {
return { marginTop: this.state.toolbarHeight };
return { marginTop: toolbarHeight };
} else {
return { marginTop: 145 };
return { marginTop: 33 };
}
}
render() {
return (
<div className={this.className()} style={this.style()}>
{this.props.children}
</div>
);
}
return (
<div className={className()} style={style()} id="v-toolbar">
{props.children}
</div>
);
}
export default Toolbar;

View file

@ -1,15 +1,4 @@
$primary: #2c54ac;
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.toolbar {
display: flex;
@ -27,8 +16,15 @@ $textColor: #555;
.r-menu {
display: flex;
justify-content: center;
align-items: center;
overflow-x: scroll;
> div {
display: flex;
flex-wrap: unset;
width: 100%;
align-items: center;
}
a.button-extra,
button.button-extra {
@ -157,6 +153,30 @@ $textColor: #555;
}
}
@media (max-width: 900px) {
.toolbar {
.r-menu {
// overflow: scroll;
> div {
margin-left: 3rem;
// overflow: scroll;
position: relative;
display: flex;
flex-wrap: unset;
width: 100%;
align-items: center;
}
}
}
}
@media (max-width: 450px) {
.toolbar {
padding: 3px 1% 1px;
}
}
@media (max-width: 450px) {
.mobile-toolbar .toolbar {
display: flex;

View file

@ -1,13 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.menu {
display: flex;

View file

@ -1,15 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
$black: #000;
@import 'src/utils/scss/variables';
.modal {
display: block;

View file

@ -1,15 +1,4 @@
$white: #fff;
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.path {
display: flex;

View file

@ -12,7 +12,7 @@ const EditBackupOption = ({ data, visible }) => {
return (
<div className="server-dns-option" style={{ display: `${visible ? 'block' : 'none'}` }}>
<SelectInput
options={[i18n['no'], i18n['yes']]}
options={['no', 'yes']}
title={i18n['Local backup']}
selected={data.backup}
name="v_backup"

View file

@ -1,8 +1,7 @@
import React, { useEffect, useState } from 'react';
import React from 'react';
import SelectInput from 'src/components/ControlPanel/AddItemLayout/Form/SelectInput/SelectInput';
import TextInput from 'src/components/ControlPanel/AddItemLayout/Form/TextInput/TextInput';
import Checkbox from 'src/components/ControlPanel/AddItemLayout/Form/Checkbox/Checkbox';
import { Link } from 'react-router-dom';
import { useSelector } from 'react-redux';
@ -86,7 +85,7 @@ const EditDatabaseOption = ({ data, visible }) => {
<>
<TextInput
title={i18n['phpMyAdmin URL']}
value={data.db_pma_url}
value={data.mail_url}
name="v_mysql_url"
id="mysql_url" />

View file

@ -73,6 +73,10 @@ const EditServer = props => {
updatedServer[name] = value;
}
if (updatedServer['v_backup_type']) {
updatedServer['v_backup_type'] = updatedServer['v_backup_type'].toLowerCase();
}
updatedServer['save'] = 'save';
updatedServer['token'] = token;

View file

@ -1,14 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.edit-server {
.modules {

View file

@ -1,7 +1,7 @@
.spinner-wrapper {
position: absolute;
bottom: 5px;
width: 15%;
width: 150px;
left: 42%;
height: 10px;
}

View file

@ -35,8 +35,15 @@ const Statistic = props => {
<div className="name">{printName(data.DATE)}</div>
<div className="stats">
<Container className="c-1">
<div className="bandwidth">{i18n.Bandwidth} <span><span className="stat">{data.U_BANDWIDTH}</span>{i18n.mb}</span></div>
<div className="disk">{i18n.Disk}: <span><span className="stat">{data.U_DISK}</span>{i18n.mb}</span></div>
<div className="bandwidth">
{i18n.Bandwidth}
<span><span className="stat">{data.U_BANDWIDTH}</span>{i18n.mb}</span>
<div className="percent" style={{ width: `${data.U_BANDWIDTH_PERCENT}%` || '0%' }}></div>
</div>
<div className="disk">
{i18n.Disk}: <span><span className="stat">{data.U_DISK}</span>{i18n.mb}</span>
<div className="percent" style={{ width: `${data.U_DISK_PERCENT}%` || '0%' }}></div>
</div>
<div className="sub-disk-stats">
<div>
<div>{i18n.Web}: <span><span className="stat">{data.U_DISK_WEB}</span>{i18n.mb}</span></div>

View file

@ -1,14 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.panel-wrapper {
.logo-img {

View file

@ -1,14 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.password-wrapper {
display: flex;

View file

@ -76,8 +76,15 @@ const User = ({ data, toggleFav, handleModal, checkItem, logOut, logInAs }) => {
<div>{data.FNAME} {data.LNAME}</div>
<div className="stats">
<Container className="c-1">
<div className="bandwidth">{i18n.Bandwidth} <span><span className="stat">{data.U_BANDWIDTH}</span> {data.U_BANDWIDTH_MEASURE}</span></div>
<div className="disk">{i18n.Disk}: <span><span className="stat">{data.U_DISK}</span> {data.U_DISK_MEASURE}</span></div>
<div className="bandwidth">
{i18n.Bandwidth}
<span><span className="stat">{data.U_BANDWIDTH}</span> {data.U_BANDWIDTH_MEASURE}</span>
<div className="percent" style={{ width: `${data.U_BANDWIDTH_PERCENT}%` || '0%' }}></div>
</div>
<div className="disk">
{i18n.Disk}: <span><span className="stat">{data.U_DISK}</span> {data.U_DISK_MEASURE}</span>
<div className="percent" style={{ width: `${data.U_DISK_PERCENT}%` || '0%' }}></div>
</div>
<div className="sub-disk-stats">
<div>
<div><span>{i18n.Web}:</span> <span><b>{data.U_DISK_WEB}</b> {data.U_DISK_WEB_MEASURE}</span></div>

View file

@ -1,14 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.checkbox {
margin-bottom: 10px;
@ -75,6 +65,16 @@ span.stat.email{
justify-content: space-between;
margin-bottom: 25px;
border-bottom: 1px dotted gray;
position: relative;
.percent {
position: absolute;
left: 0px;
bottom: -1px;
height: 2px;
background: $primary;
width: 0%;
}
}
.sub-disk-stats {
@ -201,8 +201,28 @@ span.stat.email{
svg {
margin-left: 12px;
}
@media (max-width: 1066px) {
opacity: 1;
}
@media (max-width: 850px) {
> div {
width: max-content;
a, button {
width: 100%;
}
}
}
}
.list-item.focused .r-col .name {
color: $secondaryLight;
}
}
@media (max-width: 1066px) {
div.star div > svg {
opacity: 1 !important;
}
}

View file

@ -1,11 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #2e5bb1;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$textColor: #555;
@import 'src/utils/scss/variables';
.edit-web {
.ssl-support {

View file

@ -77,8 +77,15 @@ export default function WebDomain(props) {
<div>{data.IP}</div>
<div className="stats">
<Container className="c-1 w-25">
<div className="bandwidth">{i18n.Bandwidth} <span><span className="stat">{data.U_BANDWIDTH_SIZE}</span>{data.U_BANDWIDTH_MEASURE}</span></div>
<div className="disk">{i18n.Disk}: <span><span className="stat">{data.U_DISK_SIZE}</span>{data.U_DISK_MEASURE}</span></div>
<div className="bandwidth">
{i18n.Bandwidth}
<span><span className="stat">{data.U_BANDWIDTH_SIZE}</span>{data.U_BANDWIDTH_MEASURE}</span>
<div className="percent" style={{ width: `${data.U_BANDWIDTH_PERCENT}%` || '0%' }}></div>
</div>
<div className="disk">
{i18n.Disk}: <span><span className="stat">{data.U_DISK_SIZE}</span>{data.U_DISK_MEASURE}</span>
<div className="percent" style={{ width: `${data.U_DISK_PERCENT}%` || '0%' }}></div>
</div>
</Container>
<Container className="c-2 w-45">
<div>{i18n['Web Template']}: <span className="stat">{data.TPL}</span></div>

View file

@ -1,14 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
html {
overflow-y: scroll;
@ -81,6 +71,25 @@ html {
}
}
@media screen and (max-width: 700px) {
.actions {
background: unset !important;
flex-wrap: wrap;
justify-content: flex-end !important;
div {
height: 30px !important;
a,button {
background: #dfdedd !important;
padding: 0px 10px !important;
height: 100% !important;
font-size: 10px !important;
}
}
}
}
button:active, a:active, .period:active {
color: $primaryActive;
}
@ -176,3 +185,66 @@ button {
}
}
}
@media (min-width: 1067px) {
.App div.content {
padding-top: 0 !important;
margin-top: -20px !important;
}
}
@media (max-width: 1066px) {
.App div.content {
padding-top: 0 !important;
margin-top: -20px !important;
}
.content > div {
.l-col {
margin-top: 2rem;
padding-left: 5px;
}
.r-col {
margin-top: 1rem;
.name {
margin-top: 2rem;
}
.stats {
flex-wrap: wrap;
> div {
margin: 1rem 0 !important;
padding: 0 !important;
width: 100% !important;
}
}
}
}
}
@media (max-width: 900px) {
.App div.content {
padding-top: 77px !important;
margin-top: 0 !important;
}
.content > div {
.l-col {
padding-left: 5px;
}
.r-col {
padding-left: 2rem;
}
}
}
@media (max-width: 725px) {
.content {
.r-col {
padding-left: 3.5rem;
}
}
}

View file

@ -1,14 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.content {
padding: 0 13%;
@ -29,9 +19,15 @@ $textColor: #555;
}
}
@media (max-width: 1000px) {
@media (max-width: 1066px) {
.content {
padding: 5%;
padding: 5% 10%;
}
}
@media (max-width: 900px) {
.content {
margin-top: 40px;
}
}
@ -114,3 +110,15 @@ $textColor: #555;
}
}
}
@media screen and (max-width: 1066px) {
.fixed-buttons > div:first-child {
display: none;
}
}
@media screen and (max-width: 450px) {
.content {
padding: 5% 1%;
}
}

View file

@ -175,7 +175,7 @@ const CronJobs = props => {
cronFav: result.data.cron_fav,
selection: [],
toggledAll: false,
totalAmount: result.data.totalAmount
totalAmount: result.data.totalAmount,
});
resolve();
})
@ -385,7 +385,7 @@ const CronJobs = props => {
handleAction(url)
.then(res => {
displayModal(res.data.message, '');
fetchData();
fetchData().then(() => setLoading(false));
})
.catch(err => console.error(err));
}

View file

@ -1,14 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.r-menu {
> div {

View file

@ -1,14 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
.dns-records {
div.subtitle {

View file

@ -1,4 +1,4 @@
$primary: #2c54ac;
@import 'src/utils/scss/variables';
.mail-accounts {
div.subtitle {

View file

@ -395,13 +395,13 @@ const Mails = props => {
<LeftButton name="Add Mail Domain" href="/add/mail" showLeftMenu={true} />
<div className="r-menu">
<div className="input-group input-group-sm">
<Link
{state.webmail && <Link
to={{ pathname: `http://${window.location.hostname}${state.webmail}` }}
target="_blank"
className="button-extra"
type="submit">
{i18n['open webmail']}
</Link>
</Link>}
<Checkbox toggleAll={toggleAll} toggled={state.toggledAll} />
<Select list='mailList' bulkAction={bulk} />
<DropdownFilter changeSorting={changeSorting} sorting={state.sorting} order={state.order} list="mailList" />

View file

@ -1,14 +1,4 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$danger: #b00e5b;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
@import 'src/utils/scss/variables';
div.content {
margin-top: 0;

View file

@ -0,0 +1,11 @@
$phoneMin: 320px;
$phoneMax: 480px;
$tabletMin: 481px;
$tabletMax: 768px;
$smallScreenMin: 769px;
$smallScreenMax: 1024px;
$desktopMin: 1025px;
$desktopMax: 1200px;

View file

@ -0,0 +1,13 @@
$whiteBackground: #ececec;
$primary: #2c54ac;
$primaryLight: #d7dcef;
$primaryActive: #1e5cb2;
$secondary: #fcac04;
$secondaryLight: #f8b014;
$secondaryActive: #fdb51c;
$hoverButtonText: #2c54ac;
$activeButtonText: #fff;
$textColor: #555;
$danger: #b00e5b;
$black: #000;
$white: #fff;