diff --git a/src/react/src/ControlPanelService/Firewalls.js b/src/react/src/ControlPanelService/Firewalls.js index 3b2e003fd..717f1cfa4 100644 --- a/src/react/src/ControlPanelService/Firewalls.js +++ b/src/react/src/ControlPanelService/Firewalls.js @@ -17,6 +17,18 @@ export const getBanList = () => { return axios.get(BASE_URL + banListUri); } +export const bulkFirewallAction = (action, ips) => { + const formData = new FormData(); + formData.append("action", action); + formData.append("token", getAuthToken()); + + ips.forEach(ip => { + formData.append("rule[]", ip); + }); + + return axios.post(BASE_URL + '/api/v1/bulk/firewall/', formData); +}; + export const bulkAction = (action, ips, banIps) => { const formData = new FormData(); formData.append("action", action); diff --git a/src/react/src/components/ControlPanel/AddItemLayout/Form/TextInput/TextInput.jsx b/src/react/src/components/ControlPanel/AddItemLayout/Form/TextInput/TextInput.jsx index 21cd61350..a254a6079 100644 --- a/src/react/src/components/ControlPanel/AddItemLayout/Form/TextInput/TextInput.jsx +++ b/src/react/src/components/ControlPanel/AddItemLayout/Form/TextInput/TextInput.jsx @@ -9,7 +9,7 @@ const TextInput = ({ id, name, title, optionalTitle = '', type = 'text', onChang } }, [value]); - const changeCheckbox = event => { + const changeInputHandler = event => { setInputValue(event.target.value); onChange(event); } @@ -24,7 +24,7 @@ const TextInput = ({ id, name, title, optionalTitle = '', type = 'text', onChang type={type} name={name} id={id} - onChange={changeCheckbox} + onChange={changeInputHandler} readOnly={disabled} value={inputValue} className="form-control" /> diff --git a/src/react/src/components/ControlPanel/ListItem/ListItem.jsx b/src/react/src/components/ControlPanel/ListItem/ListItem.jsx index cb8470681..8d5d1cd99 100644 --- a/src/react/src/components/ControlPanel/ListItem/ListItem.jsx +++ b/src/react/src/components/ControlPanel/ListItem/ListItem.jsx @@ -52,14 +52,10 @@ const ListItem = (props) => { className += ' outdated'; } - if (suspended) { + if (suspended || stopped) { className += ' suspended'; } - if (stopped) { - className += ' stopped'; - } - if (focused) { className += ' focused'; } @@ -84,6 +80,7 @@ const ListItem = (props) => {
{props.suspended &&
{i18n.suspended}
} + {props.stopped &&
{i18n.stopped}
} {props.children} diff --git a/src/react/src/components/Firewall/Add/AddFirewall.jsx b/src/react/src/components/Firewall/Add/AddFirewall.jsx index 848b4b487..15a3e438f 100644 --- a/src/react/src/components/Firewall/Add/AddFirewall.jsx +++ b/src/react/src/components/Firewall/Add/AddFirewall.jsx @@ -23,13 +23,13 @@ const AddFirewall = props => { const [state, setState] = useState({ loading: false, actions: [ - i18n['DROP'], - i18n['ACCEPT'] + 'DROP', + 'ACCEPT' ], protocols: [ - i18n['TCP'], - i18n['UDP'], - i18n['ICMP'] + 'TCP', + 'UDP', + 'ICMP' ], okMessage: '', errorMessage: '' diff --git a/src/react/src/components/InternetProtocol/Edit/EditInternetProtocol.jsx b/src/react/src/components/InternetProtocol/Edit/EditInternetProtocol.jsx index 1f0148397..7b525877e 100644 --- a/src/react/src/components/InternetProtocol/Edit/EditInternetProtocol.jsx +++ b/src/react/src/components/InternetProtocol/Edit/EditInternetProtocol.jsx @@ -70,7 +70,7 @@ const EditInternetProtocol = () => { updatedIP['token'] = token; updatedIP['save'] = 'save'; - updatedIP['v_ip'] = state.data.database; + updatedIP['v_ip'] = state.data.ip; if (Object.keys(updatedIP).length !== 0 && updatedIP.constructor === Object) { setState({ ...state, loading: true }); diff --git a/src/react/src/components/InternetProtocol/InternetProtocol.jsx b/src/react/src/components/InternetProtocol/InternetProtocol.jsx index 3d474df87..6b4e88dce 100644 --- a/src/react/src/components/InternetProtocol/InternetProtocol.jsx +++ b/src/react/src/components/InternetProtocol/InternetProtocol.jsx @@ -1,15 +1,14 @@ -import React, { Component } from 'react'; +import React from 'react'; import ListItem from '../ControlPanel/ListItem/ListItem'; import Container from '../ControlPanel/Container/Container'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import './InternetProtocol.scss'; import { Link } from 'react-router-dom'; import { useSelector } from 'react-redux'; +import './InternetProtocol.scss'; const InternetProtocol = props => { const { data } = props; const { i18n } = useSelector(state => state.session); - const token = localStorage.getItem("token"); const toggleFav = (starred) => { if (starred) { @@ -38,7 +37,7 @@ const InternetProtocol = props => { checkItem={checkItem}> -
{data.NAME}
+
{data.NAT ? <>{data.NAT} {data.NAME} : data.NAME}

@@ -51,7 +50,7 @@ const InternetProtocol = props => {
{i18n.Owner}: {data.OWNER}
-
{i18n.Users}: {data.U_SYS_USERS.replace(',', ', ')}
+
{i18n.Users}: {data.U_SYS_USERS.replaceAll(',', ', ')}
@@ -74,4 +73,4 @@ const InternetProtocol = props => { ); } -export default InternetProtocol; \ No newline at end of file +export default InternetProtocol; diff --git a/src/react/src/components/InternetProtocol/InternetProtocol.scss b/src/react/src/components/InternetProtocol/InternetProtocol.scss index e69de29bb..a9a18c10b 100644 --- a/src/react/src/components/InternetProtocol/InternetProtocol.scss +++ b/src/react/src/components/InternetProtocol/InternetProtocol.scss @@ -0,0 +1,8 @@ +.internetProtocols { + .ip-wrapper { + .name svg { + margin: 0 10px; + font-size: 20px; + } + } +} diff --git a/src/react/src/components/Lists/Row/Row.jsx b/src/react/src/components/Lists/Row/Row.jsx index 88e8a902d..55cccdd46 100644 --- a/src/react/src/components/Lists/Row/Row.jsx +++ b/src/react/src/components/Lists/Row/Row.jsx @@ -174,7 +174,7 @@ class Row extends Component { render() { const { data: { name, owner, permissions, size, date, time } } = this.props; return ( -
  • +
  • {this.glyph()} this.openItem(e)}>{this.props.cursor === 0 ? ".." : name} diff --git a/src/react/src/components/Lists/Row/Row.scss b/src/react/src/components/Lists/Row/Row.scss index 41264fcdf..f34879e63 100644 --- a/src/react/src/components/Lists/Row/Row.scss +++ b/src/react/src/components/Lists/Row/Row.scss @@ -169,8 +169,20 @@ li.inactive { background: rgb(220, 220, 220); } -@media (max-width: 1320px){ +@media (max-width: 1400px){ .fPermissions, .fOwner { display: none; } } + +@media (max-width: 1100px){ + .fDate { + display: none; + } +} + +@media (max-width: 970px){ + .fTime { + display: none; + } +} diff --git a/src/react/src/components/MailAccount/Add/AddMailAccount.jsx b/src/react/src/components/MailAccount/Add/AddMailAccount.jsx index af353d478..1413eb595 100644 --- a/src/react/src/components/MailAccount/Add/AddMailAccount.jsx +++ b/src/react/src/components/MailAccount/Add/AddMailAccount.jsx @@ -139,7 +139,7 @@ export default function AddMailAccount(props) { setState({ ...state, username: e.target.value })} + onChange={e => setState({ ...state, userName: e.target.value })} name="v_account" id="account" /> diff --git a/src/react/src/components/MailAccount/MailInfoBlock/MailInfoBlock.jsx b/src/react/src/components/MailAccount/MailInfoBlock/MailInfoBlock.jsx index dfdb2a0bf..9a233a435 100644 --- a/src/react/src/components/MailAccount/MailInfoBlock/MailInfoBlock.jsx +++ b/src/react/src/components/MailAccount/MailInfoBlock/MailInfoBlock.jsx @@ -106,7 +106,7 @@ export default function MailInfoBlock({ webMail, hostName, domain, userName = ''
    {i18n['Webmail URL']}: - {webMail} + {webMail}
    diff --git a/src/react/src/components/MainNav/Panel/Panel.jsx b/src/react/src/components/MainNav/Panel/Panel.jsx index ad51de9d0..971b3be7d 100644 --- a/src/react/src/components/MainNav/Panel/Panel.jsx +++ b/src/react/src/components/MainNav/Panel/Panel.jsx @@ -9,7 +9,7 @@ import { Link } from "react-router-dom"; import './Panel.scss'; const Panel = props => { - const { i18n, userName } = useSelector(state => state.session); + const { i18n, userName, panel } = useSelector(state => state.session); const { session } = useSelector(state => state.userSession); const { activeElement, focusedElement } = useSelector(state => state.mainNavigation); const dispatch = useDispatch(); @@ -113,8 +113,8 @@ const Panel = props => { )}
    - -
    + {panel[userName]['NOTIFICATIONS'] === 'yes' && } +
    {session.look ?
    @@ -126,7 +126,7 @@ const Panel = props => { }
    -
    +
    diff --git a/src/react/src/components/MainNav/Panel/Panel.scss b/src/react/src/components/MainNav/Panel/Panel.scss index 4d4f98f1e..d3ba6605b 100644 --- a/src/react/src/components/MainNav/Panel/Panel.scss +++ b/src/react/src/components/MainNav/Panel/Panel.scss @@ -144,7 +144,6 @@ $textColor: #555; width: auto; div { - width: 4rem; height: 100%; } @@ -169,7 +168,7 @@ $textColor: #555; } } - div + div a { + .edit-user a { color: #a4abad; font-weight: 700; @@ -182,8 +181,8 @@ $textColor: #555; } } - div + div + div a, - div + div + div button { + .logout-button a, + .logout-button button { color: white; cursor: pointer; font-weight: 100; @@ -220,7 +219,7 @@ $textColor: #555; justify-content: space-between; align-items: center; - > div + div { + > .edit-user { width: max-content; } diff --git a/src/react/src/components/MainNav/Stat-menu/Menu.jsx b/src/react/src/components/MainNav/Stat-menu/Menu.jsx index 51672d657..72f9a2f2e 100644 --- a/src/react/src/components/MainNav/Stat-menu/Menu.jsx +++ b/src/react/src/components/MainNav/Stat-menu/Menu.jsx @@ -27,7 +27,7 @@ const style = ({ menuHeight, mobile }) => { const Menu = props => { const { activeElement, focusedElement } = useSelector(state => state.mainNavigation); - const { i18n } = useSelector(state => state.session); + const { i18n, panel, userName } = useSelector(state => state.session); const { session } = useSelector(state => state.userSession); const { user } = useSelector(state => state.menuCounters); const dispatch = useDispatch(); @@ -72,10 +72,16 @@ const Menu = props => {

    {i18n.USER}

    { - session.look + session.look && panel[session.look] ? (<> -
    {i18n.Disk}: {sizeFormatter(user.U_DISK)}
    -
    {i18n.Bandwidth}: {sizeFormatter(user.U_BANDWIDTH)}
    +
    + {i18n.Disk}: + {user.U_DISK} {panel[session.look]['U_DISK_MEASURE']} +
    +
    + {i18n.Bandwidth}: + {user.U_BANDWIDTH} {panel[session.look]['U_BANDWIDTH_MEASURE']} +
    ) : (<>
    {i18n.users}: {user.U_USERS}
    @@ -85,62 +91,79 @@ const Menu = props => {
    -
    - handleState("/list/web/", event)} onKeyPress={event => event.preventDefault()}> -

    {i18n.WEB}

    -
    -
    {i18n.domains}: {user.U_WEB_DOMAINS}
    -
    {i18n.aliases}: {user.U_WEB_ALIASES}
    -
    {i18n.spnd}: {user.SUSPENDED_WEB}
    -
    - -
    -
    - handleState("/list/dns/", event)} onKeyPress={event => event.preventDefault()}> -

    {i18n.DNS}

    -
    -
    {i18n.domains}: {user.U_DNS_DOMAINS}
    -
    {i18n.records}: {user.U_DNS_RECORDS}
    -
    {i18n.spnd}: {user.SUSPENDED_DNS}
    -
    - -
    -
    - handleState("/list/mail/", event)} onKeyPress={event => event.preventDefault()}> -

    {i18n.MAIL}

    -
    -
    {i18n.domains}: {user.U_MAIL_DOMAINS}
    -
    {i18n.accounts}: {user.U_MAIL_ACCOUNTS}
    -
    {i18n.spnd}: {user.SUSPENDED_MAIL}
    -
    - -
    -
    - handleState("/list/db/", event)} onKeyPress={event => event.preventDefault()}> -

    {i18n.DB}

    -
    -
    {i18n.databases}: {user.U_DATABASES}
    -
    {i18n.spnd}: {user.SUSPENDED_DB}
    -
    - -
    -
    - handleState("/list/cron/", event)} onKeyPress={event => event.preventDefault()}> -

    {i18n.CRON}

    -
    -
    {i18n.jobs}: {user.U_CRON_JOBS}
    -
    {i18n.spnd}: {user.SUSPENDED_CRON}
    -
    - -
    -
    - handleState("/list/backup/", event)} onKeyPress={event => event.preventDefault()}> -

    {i18n.BACKUP}

    -
    -
    {i18n.backups}: {user.U_BACKUPS}
    -
    - -
    + { + panel[userName]['WEB_DOMAINS'] !== '0' && (
    + handleState("/list/web/", event)} onKeyPress={event => event.preventDefault()}> +

    {i18n.WEB}

    +
    +
    {i18n.domains}: {user.U_WEB_DOMAINS}
    +
    {i18n.aliases}: {user.U_WEB_ALIASES}
    +
    {i18n.spnd}: {user.SUSPENDED_WEB}
    +
    + +
    ) + } + + { + panel[userName]['DNS_DOMAINS'] !== '0' && (
    + handleState("/list/dns/", event)} onKeyPress={event => event.preventDefault()}> +

    {i18n.DNS}

    +
    +
    {i18n.domains}: {user.U_DNS_DOMAINS}
    +
    {i18n.records}: {user.U_DNS_RECORDS}
    +
    {i18n.spnd}: {user.SUSPENDED_DNS}
    +
    + +
    ) + } + + { + panel[userName]['MAIL_DOMAINS'] !== '0' && (
    + handleState("/list/mail/", event)} onKeyPress={event => event.preventDefault()}> +

    {i18n.MAIL}

    +
    +
    {i18n.domains}: {user.U_MAIL_DOMAINS}
    +
    {i18n.accounts}: {user.U_MAIL_ACCOUNTS}
    +
    {i18n.spnd}: {user.SUSPENDED_MAIL}
    +
    + +
    ) + } + + { + panel[userName]['DATABASES'] !== '0' && (
    + handleState("/list/db/", event)} onKeyPress={event => event.preventDefault()}> +

    {i18n.DB}

    +
    +
    {i18n.databases}: {user.U_DATABASES}
    +
    {i18n.spnd}: {user.SUSPENDED_DB}
    +
    + +
    ) + } + + { + panel[userName]['CRON_JOBS'] !== '0' && (
    + handleState("/list/cron/", event)} onKeyPress={event => event.preventDefault()}> +

    {i18n.CRON}

    +
    +
    {i18n.jobs}: {user.U_CRON_JOBS}
    +
    {i18n.spnd}: {user.SUSPENDED_CRON}
    +
    + +
    ) + } + + { + panel[userName]['BACKUPS'] !== '0' && (
    + handleState("/list/backup/", event)} onKeyPress={event => event.preventDefault()}> +

    {i18n.BACKUP}

    +
    +
    {i18n.backups}: {user.U_BACKUPS}
    +
    + +
    ) + } ); diff --git a/src/react/src/components/Modal/Archive.jsx b/src/react/src/components/Modal/Archive.jsx index 1979f5eb9..2a621b75a 100644 --- a/src/react/src/components/Modal/Archive.jsx +++ b/src/react/src/components/Modal/Archive.jsx @@ -15,7 +15,7 @@ const Archive = (props) => {
    - +
    diff --git a/src/react/src/components/Path/Path.jsx b/src/react/src/components/Path/Path.jsx index 9aab13622..9bd9ef06e 100644 --- a/src/react/src/components/Path/Path.jsx +++ b/src/react/src/components/Path/Path.jsx @@ -1,11 +1,17 @@ -import React from 'react'; +import React, { useEffect } from 'react'; import { useSelector } from 'react-redux'; +import { useHistory } from 'react-router'; import Dropdown from './Dropdown/Dropdown'; import './Path.scss'; const Path = ({ path, isActive, className, openDirectory, changeSorting, sorting, order }) => { const { user } = useSelector(state => state.menuCounters); + const history = useHistory(); + + useEffect(() => { + if (!user) return history.push('/login'); + }, [user]); const clickablePath = () => { let splitPath = path.split('/'); diff --git a/src/react/src/components/ProgressBar/ProgressBar.jsx b/src/react/src/components/ProgressBar/ProgressBar.jsx index 6a712f406..a8f7f72b2 100644 --- a/src/react/src/components/ProgressBar/ProgressBar.jsx +++ b/src/react/src/components/ProgressBar/ProgressBar.jsx @@ -3,10 +3,10 @@ import './ProgressBar.scss'; const ProgressBar = (props) => { return ( -
    +
    ); } -export default ProgressBar; \ No newline at end of file +export default ProgressBar; diff --git a/src/react/src/components/ProgressBar/ProgressBar.scss b/src/react/src/components/ProgressBar/ProgressBar.scss index 3dd31fd47..13ca1dd86 100644 --- a/src/react/src/components/ProgressBar/ProgressBar.scss +++ b/src/react/src/components/ProgressBar/ProgressBar.scss @@ -1,13 +1,16 @@ -.spinner-wrapper .progress { - position: absolute; - top: 0; - z-index: 5; +.progress.upload { + position: fixed; + left: 0px; + top: 0px; + z-index: 9999; + height: 5px; + position: fixed; width: 100%; margin: 0; - height: 6px; display: inline-table; + background: transparent; .progress-bar { - height: 10px; + height: 5px; } -} \ No newline at end of file +} diff --git a/src/react/src/components/Server/Edit/EditBackupOption.jsx b/src/react/src/components/Server/Edit/EditBackupOption.jsx index 799b1ace9..68b5f869b 100644 --- a/src/react/src/components/Server/Edit/EditBackupOption.jsx +++ b/src/react/src/components/Server/Edit/EditBackupOption.jsx @@ -31,51 +31,47 @@ const EditBackupOption = ({ data, visible }) => { name="v_backup_dir" id="v-backup-dir" /> + + { - data.backup_remote_adv && ( - <> - + remoteBackup && ( +
    +
    - { - remoteBackup && ( - <> - + - + - + - + - - - ) - } - + +
    ) }
    diff --git a/src/react/src/components/Server/Edit/EditServer.jsx b/src/react/src/components/Server/Edit/EditServer.jsx index 38fa2ab88..05fbbac13 100644 --- a/src/react/src/components/Server/Edit/EditServer.jsx +++ b/src/react/src/components/Server/Edit/EditServer.jsx @@ -163,6 +163,12 @@ const EditServer = props => { name="v_language" id="language" /> + {/* */} +
    @@ -41,7 +31,7 @@ const User = ({ data, toggleFav, handleModal, checkItem }) => { } else { return (
    -
    @@ -86,16 +76,16 @@ const User = ({ data, toggleFav, handleModal, checkItem }) => {
    {data.FNAME} {data.LNAME}
    -
    {i18n.Bandwidth} {data.U_BANDWIDTH} {i18n.mb}
    -
    {i18n.Disk}: {data.U_DISK} {i18n.mb}
    +
    {i18n.Bandwidth} {data.U_BANDWIDTH} {data.U_BANDWIDTH_MEASURE}
    +
    {i18n.Disk}: {data.U_DISK} {data.U_DISK_MEASURE}
    -
    {i18n.Web}: {data.U_DISK_WEB} {i18n.mb}
    -
    {i18n.Mail}: {data.U_DISK_MAIL} {i18n.mb}
    +
    {i18n.Web}: {data.U_DISK_WEB} {data.U_DISK_WEB_MEASURE}
    +
    {i18n.Mail}: {data.U_DISK_MAIL} {data.U_DISK_MAIL_MEASURE}
    -
    {i18n.Databases}: {data.U_DATABASES} {i18n.mb}
    -
    {i18n['User Directories']}: {data.U_DISK_DIRS} {i18n.mb}
    +
    {i18n.Databases}: {data.U_DATABASES} {data.U_DATABASES_MEASURE}
    +
    {i18n['User Directories']}: {data.U_DISK_DIRS} {data.U_DISK_DIRS_MEASURE}
    diff --git a/src/react/src/components/WebDomain/Add/AddWebDomain.jsx b/src/react/src/components/WebDomain/Add/AddWebDomain.jsx index 1200bff38..703afab58 100644 --- a/src/react/src/components/WebDomain/Add/AddWebDomain.jsx +++ b/src/react/src/components/WebDomain/Add/AddWebDomain.jsx @@ -40,6 +40,7 @@ const AddWebDomain = props => { webStats: [], prefixI18N: '', prePath: '', + aliases: '', proxy_ext: '', internetProtocols: [] }); @@ -99,7 +100,7 @@ const AddWebDomain = props => { } const onBlurChangeAliases = value => { - setState({ ...state, domain: value }); + setState({ ...state, aliases: `www.${value}`}); } const checkboxHandler = (input, checked) => { diff --git a/src/react/src/components/WebDomain/Add/AdditionalFtpForEditing/AdditionalFtpForEditing.jsx b/src/react/src/components/WebDomain/Add/AdditionalFtpForEditing/AdditionalFtpForEditing.jsx index 6c0467ccd..41524c87b 100644 --- a/src/react/src/components/WebDomain/Add/AdditionalFtpForEditing/AdditionalFtpForEditing.jsx +++ b/src/react/src/components/WebDomain/Add/AdditionalFtpForEditing/AdditionalFtpForEditing.jsx @@ -9,7 +9,7 @@ const AdditionalFtpForEditing = ({ domain, data = {}, onDeleteAdditionalFtp, pre const { i18n, userName } = useSelector(state => state.session); const [state, setState] = useState({ username: data.v_ftp_user || '', - path: '' + path: data.v_ftp_path || '', }); const renderForm = () => { @@ -32,8 +32,9 @@ const AdditionalFtpForEditing = ({ domain, data = {}, onDeleteAdditionalFtp, pre return (
    + - + {i18n.FTP} #{data.id + 1} @@ -67,17 +68,17 @@ const AdditionalFtpForEditing = ({ domain, data = {}, onDeleteAdditionalFtp, pre
    - + setState({ ...state, path: event.target.value })} + onChange={event => setState({ ...state, path: event.target.value.indexOf('/') !== 0 ? `/${event.target.value}` : event.target.value })} className="form-control" id={`path${data.id}`} name={`v_ftp_user[${data.id}][v_ftp_path]`} /> - {prePath} + {prePath}{state.path}
    { diff --git a/src/react/src/components/WebDomain/WebDomain.jsx b/src/react/src/components/WebDomain/WebDomain.jsx index c02ffb658..0308bd2a1 100644 --- a/src/react/src/components/WebDomain/WebDomain.jsx +++ b/src/react/src/components/WebDomain/WebDomain.jsx @@ -72,7 +72,7 @@ export default function WebDomain(props) {
    {data.NAME}
    -
    {data.ALIAS}
    +
    {data.ALIAS.replaceAll(',', ', ')}
    {data.IP}
    diff --git a/src/react/src/containers/Databases/Databases.jsx b/src/react/src/containers/Databases/Databases.jsx index 1519de0e4..098484137 100644 --- a/src/react/src/containers/Databases/Databases.jsx +++ b/src/react/src/containers/Databases/Databases.jsx @@ -17,6 +17,7 @@ import Spinner from '../../components/Spinner/Spinner'; import './Databases.scss'; import { Helmet } from 'react-helmet'; import { refreshCounters } from 'src/actions/MenuCounters/menuCounterActions'; +import { Link } from 'react-router-dom'; const Databases = props => { const { i18n } = useSelector(state => state.session); @@ -35,6 +36,8 @@ const Databases = props => { toggledAll: false, dbAdmin: '', dbAdminLink: '', + db_myadmin_link: '', + db_pgadmin_link: '', sorting: i18n.Date, order: "descending", selection: [], @@ -174,6 +177,8 @@ const Databases = props => { databases: reformatData(result.data.data), dbAdmin: result.data.db_admin, dbAdminLink: result.data.db_admin_link, + db_myadmin_link: result.data.db_myadmin_link, + db_pgadmin_link: result.data.db_pgadmin_link, dbFav: result.data.dbFav, selection: [], toggledAll: false, @@ -387,7 +392,8 @@ const Databases = props => {
    - {state.dbAdmin} + {state.db_myadmin_link && phpMyAdmin} + {state.db_pgadmin_link && phpPgAdmin}