This commit is contained in:
AuroraLS3 2023-02-25 13:03:32 +00:00
parent d7710f4cbc
commit 6157aa1e20
95 changed files with 697 additions and 457 deletions

View File

@ -20,6 +20,7 @@ Plugin:
Check_for_updates: true
Notify_about_DEV_releases: false
Frontend_BETA: false
Use_Legacy_Frontend: false
# -----------------------------------------------------
# Supported databases: MySQL
# -----------------------------------------------------

View File

@ -21,6 +21,7 @@ Plugin:
Configuration:
Allow_proxy_to_manage_settings: true
Frontend_BETA: false
Use_Legacy_Frontend: false
# -----------------------------------------------------
# Supported databases: SQLite, MySQL
# -----------------------------------------------------

View File

@ -5,38 +5,38 @@
"private": true,
"proxy": "http://localhost:8800",
"dependencies": {
"@fortawesome/fontawesome-free": "^6.2.1",
"@fortawesome/fontawesome-svg-core": "^6.2.1",
"@fortawesome/free-brands-svg-icons": "^6.2.1",
"@fortawesome/free-regular-svg-icons": "^6.2.1",
"@fortawesome/free-solid-svg-icons": "^6.2.1",
"@fortawesome/fontawesome-free": "^6.3.0",
"@fortawesome/fontawesome-svg-core": "^6.3.0",
"@fortawesome/free-brands-svg-icons": "^6.3.0",
"@fortawesome/free-regular-svg-icons": "^6.3.0",
"@fortawesome/free-solid-svg-icons": "^6.3.0",
"@fortawesome/react-fontawesome": "^0.2.0",
"@fullcalendar/bootstrap": "^5.11.3",
"@fullcalendar/daygrid": "^5.11.3",
"@fullcalendar/react": "^5.11.3",
"@fullcalendar/bootstrap": "^5.11.4",
"@fullcalendar/daygrid": "^5.11.4",
"@fullcalendar/react": "^5.11.4",
"@highcharts/map-collection": "^2.0.1",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^12.0.0",
"@testing-library/react": "^14.0.0",
"@testing-library/user-event": "^14.4.3",
"axios": "^1.2.3",
"axios": "^1.3.4",
"bootstrap": "^5.2.3",
"datatables.net": "^1.13.1",
"datatables.net-bs5": "^1.12.1",
"datatables.net": "^1.13.2",
"datatables.net-bs5": "^1.13.2",
"datatables.net-responsive-bs5": "^2.4.0",
"highcharts": "^10.3.2",
"i18next": "^22.4.9",
"highcharts": "^10.3.3",
"i18next": "^22.4.10",
"i18next-chained-backend": "^4.2.0",
"i18next-http-backend": "^2.1.1",
"i18next-localstorage-backend": "^4.1.0",
"masonry-layout": "^4.2.2",
"react": "^17.0.2",
"react-bootstrap-v5": "^1.4.0",
"react-dom": "^17.0.2",
"react-i18next": "^12.1.4",
"react": "^18.2.0",
"react-bootstrap": "^2.7.2",
"react-dom": "^18.2.0",
"react-i18next": "^12.2.0",
"react-mcjsonchat": "^1.0.0",
"react-router-dom": "6",
"react-scripts": "5.0.1",
"sass": "^1.57.1",
"sass": "^1.58.3",
"source-map-explorer": "^2.5.2",
"swagger-ui": "^4.15.5",
"web-vitals": "^3.0.2"

View File

@ -1,34 +1,36 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="Player Analytics" name="description">
<meta content="AuroraLS3" name="author">
<meta content="noindex, nofollow" name="robots">
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="Player Analytics" name="description">
<meta content="AuroraLS3" name="author">
<meta content="noindex, nofollow" name="robots">
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link href="%PUBLIC_URL%/manifest.json" rel="manifest"/>
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link href="%PUBLIC_URL%/manifest.json" rel="manifest"/>
<!--
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>Plan | Player Analytics</title>
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>Plan | Player Analytics</title>
<link crossorigin="anonymous"
href="https://fonts.googleapis.com/css?family=Nunito:400,700,800,900&display=swap&subset=latin-ext"
rel="stylesheet">
<link crossorigin="anonymous"
href="https://fonts.googleapis.com/css?family=Nunito:400,700,800,900&display=swap&subset=latin-ext"
rel="stylesheet">
</head>
<body>
<script src="%PUBLIC_URL%/pageExtensionApi.js"></script>
<script>/* This script tag will be replaced with scripts */</script>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>

View File

@ -0,0 +1,69 @@
/*
* Usage:
* - Look for any element with 'extendable' class name and use its id.
*
* // Html-string
* const render = async (context) => {
* // Any code that needs to run before the element is added to DOM
* return '<p>Hello world</p>';
* }
* const unmount = async () => {
* // Any code that needs to run when the element is removed from DOM
* };
* // 'server-overview-card' is the ID of the element
* global.pageExtensionApi.registerElement('beforeElement', 'server-overview-card', render, unmount);
*
* // HtmlElement
* global.pageExtensionApi.registerElement('afterElement', 'server-overview-card', () => {
* const para = document.createElement("p");
* para.innerText = "Hello world";
* return para;
* }, unmount);
*/
class PageExtensionApi {
beforeElementRenders = [];
afterElementRenders = [];
registerElement(position, id, renderCallback, unmountCallback) {
const renderers = position === 'beforeElement' ? this.beforeElementRenders : this.afterElementRenders;
renderers.push({id, renderCallback, unmountCallback});
}
onRender(id, position, context) {
const renderers = position === 'beforeElement' ? this.beforeElementRenders : this.afterElementRenders;
return Promise.all(renderers
.filter(renderer => renderer.id === id)
.filter(renderer => renderer.renderCallback)
.map(async renderer => {
try {
const rendered = await renderer.renderCallback(context);
if (rendered instanceof HTMLElement) {
return rendered.outerHTML;
} else {
return rendered;
}
} catch (e) {
console.warn("Error when rendering " + renderer + ": " + e);
return null;
}
})
.filter(renderedElement => renderedElement));
}
onUnmount(className, position) {
const renderers = position === 'beforeElement' ? this.beforeElementRenders : this.afterElementRenders;
return renderers
.filter(renderer => renderer.className === className)
.forEach(renderer => {
try {
return renderer.unmountCallback()
} catch (e) {
console.warn("Error when unmounting " + renderer + ": " + e);
return null;
}
});
}
}
// Global
pageExtensionApi = new PageExtensionApi();

View File

@ -14,6 +14,7 @@ import {AuthenticationContextProvider} from "./hooks/authenticationHook";
import {NavigationContextProvider} from "./hooks/navigationHook";
import MainPageRedirect from "./components/navigation/MainPageRedirect";
import {baseAddress, staticSite} from "./service/backendConfiguration";
import {PageExtensionContextProvider} from "./hooks/pageExtensionHook";
const PlayerPage = React.lazy(() => import("./views/layout/PlayerPage"));
const PlayerOverview = React.lazy(() => import("./views/player/PlayerOverview"));
@ -69,7 +70,9 @@ const ContextProviders = ({children}) => (
<MetadataContextProvider>
<ThemeContextProvider>
<NavigationContextProvider>
{children}
<PageExtensionContextProvider>
{children}
</PageExtensionContextProvider>
</NavigationContextProvider>
</ThemeContextProvider>
</MetadataContextProvider>

View File

@ -3,7 +3,7 @@ import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faCrosshairs, faGavel, faLocationArrow, faServer, faSkull} from "@fortawesome/free-solid-svg-icons";
import {faCalendarCheck, faCalendarPlus, faClock} from "@fortawesome/free-regular-svg-icons";
import Datapoint from "../Datapoint";
import {Col, Row} from "react-bootstrap-v5";
import {Col, Row} from "react-bootstrap";
import WorldPie from "../graphs/WorldPie";
import Accordion from "./Accordion";
import {faSuperpowers} from "@fortawesome/free-brands-svg-icons";

View File

@ -3,7 +3,7 @@ import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faCrosshairs, faServer, faSignal, faSkull, faUser} from "@fortawesome/free-solid-svg-icons";
import {faCalendarPlus, faClock, faMap} from "@fortawesome/free-regular-svg-icons";
import Datapoint from "../Datapoint";
import {Col, Row} from "react-bootstrap-v5";
import {Col, Row} from "react-bootstrap";
import WorldPie from "../graphs/WorldPie";
import KillsTable from "../table/KillsTable";
import Accordion from "./Accordion";

View File

@ -1,6 +1,6 @@
import React from 'react';
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {useTranslation} from "react-i18next";
const CardHeader = ({icon, color, label}) => {

View File

@ -1,14 +1,12 @@
import {useTranslation} from "react-i18next";
import {Card, Col, Dropdown, Row} from "react-bootstrap-v5";
import {Card, Col, Dropdown} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import React, {useState} from "react";
import {faExclamationTriangle, faGlobe, faLayerGroup} from "@fortawesome/free-solid-svg-icons";
import GeolocationBarGraph from "../../graphs/GeolocationBarGraph";
import GeolocationWorldMap, {ProjectionOptions} from "../../graphs/GeolocationWorldMap";
import {CardLoader} from "../../navigation/Loader";
import DropdownToggle from "react-bootstrap-v5/lib/esm/DropdownToggle";
import DropdownMenu from "react-bootstrap-v5/lib/esm/DropdownMenu";
import DropdownItem from "react-bootstrap-v5/lib/esm/DropdownItem";
import ExtendableRow from "../../layout/extension/ExtendableRow";
const ProjectionDropDown = ({projection, setProjection}) => {
const {t} = useTranslation();
@ -18,18 +16,18 @@ const ProjectionDropDown = ({projection, setProjection}) => {
return (
<Dropdown className="float-end" style={{position: "absolute", right: "0.5rem"}}
title={t('html.label.geoProjection.dropdown')}>
<DropdownToggle variant=''>
<Dropdown.Toggle variant=''>
<Fa icon={faLayerGroup}/> {t(projection)}
</DropdownToggle>
</Dropdown.Toggle>
<DropdownMenu>
<Dropdown.Menu>
<h6 className="dropdown-header">{t('html.label.geoProjection.dropdown')}</h6>
{projectionOptions.map((option, i) => (
<DropdownItem key={i} onClick={() => setProjection(option)}>
<Dropdown.Item key={i} onClick={() => setProjection(option)}>
{t(option)}
</DropdownItem>
</Dropdown.Item>
))}
</DropdownMenu>
</Dropdown.Menu>
</Dropdown>
)
}
@ -57,7 +55,7 @@ const GeolocationsCard = ({data}) => {
<ProjectionDropDown projection={projection} setProjection={setProjection}/>
</Card.Header>
<Card.Body className="chart-area" style={{height: "100%"}}>
<Row>
<ExtendableRow id={'row-geolocations-graphs-card-0'}>
<Col md={3}>
<GeolocationBarGraph series={data.geolocation_bar_series} color={data.colors.bars}/>
</Col>
@ -65,7 +63,7 @@ const GeolocationsCard = ({data}) => {
<GeolocationWorldMap series={data.geolocation_series} colors={data.colors}
projection={projection}/>
</Col>
</Row>
</ExtendableRow>
</Card.Body>
</Card>
)

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import React from "react";
import {faLifeRing} from "@fortawesome/free-regular-svg-icons";

View File

@ -1,5 +1,5 @@
import React from 'react';
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import CardHeader from "../CardHeader";
import {faWifi} from "@fortawesome/free-solid-svg-icons";
import PingTable from "../../table/PingTable";

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import React, {useEffect, useState} from "react";
import {faUsers} from "@fortawesome/free-solid-svg-icons";

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faCrosshairs} from "@fortawesome/free-solid-svg-icons";
import KillsTable from "../../table/KillsTable";

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faCalendar, faHandPointer} from "@fortawesome/free-regular-svg-icons";
import Scrollable from "../../Scrollable";

View File

@ -1,4 +1,4 @@
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import React from "react";
import {CardLoader} from "../../navigation/Loader";
import ServerPie from "../../graphs/ServerPie";

View File

@ -1,4 +1,4 @@
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import Datapoint from "../../Datapoint";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faLongArrowAltRight} from "@fortawesome/free-solid-svg-icons";

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faClock} from "@fortawesome/free-regular-svg-icons";
import WorldPie from "../../graphs/WorldPie";

View File

@ -9,7 +9,7 @@ import {
faTachometerAlt,
faUser
} from "@fortawesome/free-solid-svg-icons";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {useDataRequest} from "../../../hooks/dataFetchHook";
import {fetchPingGraph} from "../../../service/serverService";
import {tooltip, yAxisConfigurations} from "../../../util/graphs";

View File

@ -1,5 +1,5 @@
import React from 'react';
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import CardHeader from "../CardHeader";
import {
faBookOpen,

View File

@ -1,6 +1,6 @@
import React from 'react';
import CardHeader from "../CardHeader";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import PlayersOnlineGraph from "../../graphs/PlayersOnlineGraph";
import {faChartArea} from "@fortawesome/free-solid-svg-icons";
import {useTranslation} from "react-i18next";

View File

@ -1,12 +1,9 @@
import React, {useCallback, useState} from 'react';
import {Card, Dropdown} from "react-bootstrap-v5";
import {Card, Dropdown} from "react-bootstrap";
import ServersTable, {ServerSortOption} from "../../table/ServersTable";
import {faNetworkWired} from "@fortawesome/free-solid-svg-icons";
import {useTranslation} from "react-i18next";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import DropdownToggle from "react-bootstrap-v5/lib/esm/DropdownToggle";
import DropdownMenu from "react-bootstrap-v5/lib/esm/DropdownMenu";
import DropdownItem from "react-bootstrap-v5/lib/esm/DropdownItem";
import {CardLoader} from "../../navigation/Loader";
const SortDropDown = ({sortBy, sortReversed, setSortBy}) => {
@ -20,18 +17,18 @@ const SortDropDown = ({sortBy, sortReversed, setSortBy}) => {
return (
<Dropdown className="float-end" style={{position: "absolute", right: "0.5rem"}}>
<DropdownToggle variant=''>
<Dropdown.Toggle variant=''>
<Fa icon={getSortIcon()}/> {t(sortBy.label)}
</DropdownToggle>
</Dropdown.Toggle>
<DropdownMenu>
<Dropdown.Menu>
<h6 className="dropdown-header">{t('html.label.sortBy')}</h6>
{sortOptions.map((option, i) => (
<DropdownItem key={i} onClick={() => setSortBy(option)}>
<Dropdown.Item key={i} onClick={() => setSortBy(option)}>
{t(option.label)}
</DropdownItem>
</Dropdown.Item>
))}
</DropdownMenu>
</Dropdown.Menu>
</Dropdown>
)
}

View File

@ -1,6 +1,6 @@
import {useTranslation} from "react-i18next";
import {useTheme} from "../../../hooks/themeHook";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faServer, faSignature} from "@fortawesome/free-solid-svg-icons";
import Scrollable from "../../Scrollable";

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faCampground} from "@fortawesome/free-solid-svg-icons";
import React from "react";

View File

@ -1,9 +1,6 @@
import React from 'react';
import DropdownToggle from "react-bootstrap-v5/lib/esm/DropdownToggle";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import DropdownMenu from "react-bootstrap-v5/lib/esm/DropdownMenu";
import DropdownItem from "react-bootstrap-v5/lib/esm/DropdownItem";
import {Dropdown} from "react-bootstrap-v5";
import {Dropdown} from "react-bootstrap";
import {faPlus} from "@fortawesome/free-solid-svg-icons";
import {useTranslation} from "react-i18next";
import Scrollable from "../../Scrollable";
@ -47,20 +44,20 @@ const FilterDropdown = ({filterOptions, filters, setFilters}) => {
return (
<Dropdown>
<DropdownToggle variant=''>
<Dropdown.Toggle variant=''>
<Fa icon={faPlus}/> {t('html.query.filters.add')}
</DropdownToggle>
</Dropdown.Toggle>
<DropdownMenu popperConfig={{strategy: "absolute"}}>
<Dropdown.Menu popperConfig={{strategy: "absolute"}}>
<h6 className="dropdown-header">{t('html.query.filters.add')}</h6>
<Scrollable>
{filterOptions.map((option, i) => (
<DropdownItem key={i} onClick={() => addFilter(option)}>
<Dropdown.Item key={i} onClick={() => addFilter(option)}>
{getReadableFilterName(option)}
</DropdownItem>
</Dropdown.Item>
))}
</Scrollable>
</DropdownMenu>
</Dropdown.Menu>
</Dropdown>
)
};

View File

@ -29,8 +29,8 @@ const FilterList = ({filters, setFilters, setAsInvalid, setAsValid}) => {
return (
<ul id={"filters"} className={"filters"}>
{filters.map((filter, i) => <li className={"filter"}>
<Filter filter={filter} key={i} index={i}
{filters.map((filter, i) => <li key={i} className={"filter"}>
<Filter filter={filter} index={i}
setFilterOptions={newOptions => updateFilterOptions(i, newOptions)}
removeFilter={() => removeFilter(i)}
moveUp={() => moveUp(i)}

View File

@ -1,5 +1,5 @@
import React, {useCallback, useEffect, useState} from 'react';
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col, Row} from "react-bootstrap";
import {useTranslation} from "react-i18next";
import {useDataRequest} from "../../../hooks/dataFetchHook";
import {fetchFilters, postQuery} from "../../../service/queryService";
@ -61,8 +61,8 @@ const QueryOptionsCard = () => {
// View state handling
const [invalidFields, setInvalidFields] = useState([]);
const setAsInvalid = id => setInvalidFields([...invalidFields, id]);
const setAsValid = id => setInvalidFields(invalidFields.filter(invalid => id !== invalid));
const setAsInvalid = useCallback(id => setInvalidFields([...invalidFields, id]), [setInvalidFields, invalidFields]);
const setAsValid = useCallback(id => setInvalidFields(invalidFields.filter(invalid => id !== invalid)), [setInvalidFields, invalidFields]);
const [extremes, setExtremes] = useState(undefined);
/*eslint-disable react-hooks/exhaustive-deps */

View File

@ -1,5 +1,5 @@
import React from 'react';
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import CardHeader from "../CardHeader";
import {faCalendar, faCalendarCheck, faClock} from "@fortawesome/free-regular-svg-icons";
import Datapoint from "../../Datapoint";

View File

@ -2,7 +2,7 @@ import React, {useEffect, useState} from 'react';
import {useTranslation} from "react-i18next";
import DateInputField from "../../../input/DateInputField";
import TimeInputField from "../../../input/TimeInputField";
import {Col, Row} from "react-bootstrap-v5";
import {Col, Row} from "react-bootstrap";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faTrashAlt} from "@fortawesome/free-regular-svg-icons";

View File

@ -3,7 +3,7 @@ import {useTranslation} from "react-i18next";
import MultiSelect from "../../../input/MultiSelect";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faTrashAlt} from "@fortawesome/free-regular-svg-icons";
import {Col, Row} from "react-bootstrap-v5";
import {Col, Row} from "react-bootstrap";
const MultipleChoiceFilter = ({index, label, filter, removeFilter, setFilterOptions}) => {
const {t} = useTranslation();

View File

@ -3,7 +3,7 @@ import {useDataRequest} from "../../../../hooks/dataFetchHook";
import {fetchPlayerbaseDevelopmentGraph} from "../../../../service/serverService";
import {ErrorViewCard} from "../../../../views/ErrorView";
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faUsers} from "@fortawesome/free-solid-svg-icons";
import {CardLoader} from "../../../navigation/Loader";

View File

@ -4,7 +4,7 @@ import {useDataRequest} from "../../../../hooks/dataFetchHook";
import {fetchJoinAddressByDay} from "../../../../service/serverService";
import {ErrorViewCard} from "../../../../views/ErrorView";
import {CardLoader} from "../../../navigation/Loader";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faChartColumn} from "@fortawesome/free-solid-svg-icons";
import JoinAddressGraph from "../../../graphs/JoinAddressGraph";

View File

@ -4,7 +4,7 @@ import {useDataRequest} from "../../../../hooks/dataFetchHook";
import {fetchJoinAddressPie} from "../../../../service/serverService";
import {ErrorViewCard} from "../../../../views/ErrorView";
import {CardLoader} from "../../../navigation/Loader";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faLocationArrow} from "@fortawesome/free-solid-svg-icons";
import GroupVisualizer from "../../../graphs/GroupVisualizer";

View File

@ -1,6 +1,6 @@
import React from 'react';
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import CardTabs from "../../../CardTabs";
import {faChartArea} from "@fortawesome/free-solid-svg-icons";
import {useDataRequest} from "../../../../hooks/dataFetchHook";

View File

@ -3,7 +3,7 @@ import {useParams} from "react-router-dom";
import {useDataRequest} from "../../../../hooks/dataFetchHook";
import {fetchPlayersOnlineGraph} from "../../../../service/serverService";
import {ErrorViewCard} from "../../../../views/ErrorView";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faChartArea} from "@fortawesome/free-solid-svg-icons";
import PlayersOnlineGraph from "../../../graphs/PlayersOnlineGraph";

View File

@ -9,7 +9,7 @@ import {
import {ErrorViewBody} from "../../../../views/ErrorView";
import PunchCard from "../../../graphs/PunchCard";
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import CardTabs from "../../../CardTabs";
import {faBraille, faChartArea} from "@fortawesome/free-solid-svg-icons";
import {faCalendar} from "@fortawesome/free-regular-svg-icons";

View File

@ -3,7 +3,7 @@ import {useDataRequest} from "../../../../hooks/dataFetchHook";
import {fetchOptimizedPerformance, fetchPingGraph} from "../../../../service/serverService";
import {ErrorViewBody} from "../../../../views/ErrorView";
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import CardTabs from "../../../CardTabs";
import {faGears, faHdd, faMap, faMicrochip, faSignal, faTachometerAlt} from "@fortawesome/free-solid-svg-icons";
import React, {useEffect, useState} from "react";

View File

@ -2,7 +2,7 @@ import {useTranslation} from "react-i18next";
import {useDataRequest} from "../../../../hooks/dataFetchHook";
import {fetchPlayerbaseDevelopmentGraph} from "../../../../service/serverService";
import {ErrorViewCard} from "../../../../views/ErrorView";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faChartLine} from "@fortawesome/free-solid-svg-icons";
import React from "react";

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faBookOpen} from "@fortawesome/free-solid-svg-icons";
import React from "react";

View File

@ -2,7 +2,7 @@ import React from 'react';
import PerformanceAsNumbersTable from "../../../table/PerformanceAsNumbersTable";
import CardHeader from "../../CardHeader";
import {faBookOpen} from "@fortawesome/free-solid-svg-icons";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
const PerformanceAsNumbersCard = ({data}) => {
return (

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faExchangeAlt, faUsers} from "@fortawesome/free-solid-svg-icons";
import ComparisonTable from "../../../table/ComparisonTable";

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faCampground} from "@fortawesome/free-solid-svg-icons";
import React from "react";

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faCrosshairs, faExchangeAlt, faSkull, faUsers} from "@fortawesome/free-solid-svg-icons";
import ComparisonTable from "../../../table/ComparisonTable";

View File

@ -1,5 +1,5 @@
import {useTranslation} from "react-i18next";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {
faBookOpen,
@ -14,6 +14,7 @@ import Datapoint from "../../../Datapoint";
import {faCalendarCheck, faClock} from "@fortawesome/free-regular-svg-icons";
import React from "react";
import {CardLoader} from "../../../navigation/Loader";
import ExtendableCardBody from "../../../layout/extension/ExtendableCardBody";
const ServerAsNumbersCard = ({data}) => {
const {t} = useTranslation();
@ -27,7 +28,7 @@ const ServerAsNumbersCard = ({data}) => {
<Fa icon={faBookOpen}/> {data.player_kills ? t('html.label.serverAsNumberse') : t('html.label.networkAsNumbers')}
</h6>
</Card.Header>
<Card.Body>
<ExtendableCardBody id={data.player_kills ? 'card-body-server-as-numbers' : 'card-body-network-as-numbers'}>
<Datapoint name={t('html.label.currentUptime')}
color={'light-green'} icon={faPowerOff}
value={data.current_uptime}/>
@ -71,7 +72,7 @@ const ServerAsNumbersCard = ({data}) => {
<Datapoint name={t('html.label.deaths')}
color={'black'} icon={faSkull}
value={data.deaths} bold/>
</Card.Body>
</ExtendableCardBody>
</Card>
)
}

View File

@ -1,5 +1,5 @@
import React, {useEffect, useState} from "react";
import {Card, Col} from "react-bootstrap-v5";
import {Card, Col} from "react-bootstrap";
import ExtensionIcon from "./ExtensionIcon";
import Datapoint from "../Datapoint";
import Masonry from 'masonry-layout'

View File

@ -3,7 +3,7 @@ import GroupTable from "../table/GroupTable";
import GroupPie from "./GroupPie";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faBarChart, faChartColumn, faPieChart, faTable} from "@fortawesome/free-solid-svg-icons";
import {Col, Row} from "react-bootstrap-v5";
import {Col, Row} from "react-bootstrap";
import GroupBarGraph from "./GroupBarGraph";
const options = {

View File

@ -1,10 +1,10 @@
import React from 'react';
import DropdownToggle from "react-bootstrap-v5/lib/esm/DropdownToggle";
import DropdownToggle from "react-bootstrap/lib/esm/DropdownToggle";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import DropdownMenu from "react-bootstrap-v5/lib/esm/DropdownMenu";
import DropdownItem from "react-bootstrap-v5/lib/esm/DropdownItem";
import DropdownMenu from "react-bootstrap/lib/esm/DropdownMenu";
import DropdownItem from "react-bootstrap/lib/esm/DropdownItem";
import {useTranslation} from "react-i18next";
import {Dropdown} from "react-bootstrap-v5";
import {Dropdown} from "react-bootstrap";
export const DropDownWithOptions = ({selected, optionList, onChange, optionLabelMapper, icon, title}) => {
const {t} = useTranslation();

View File

@ -1,5 +1,5 @@
import React, {useState} from 'react';
import {InputGroup} from "react-bootstrap-v5";
import {InputGroup} from "react-bootstrap";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faCalendar} from "@fortawesome/free-regular-svg-icons";

View File

@ -1,5 +1,5 @@
import React, {useState} from 'react';
import {InputGroup} from "react-bootstrap-v5";
import {InputGroup} from "react-bootstrap";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faClock} from "@fortawesome/free-regular-svg-icons";

View File

@ -0,0 +1,38 @@
import React, {useCallback, useEffect, useState} from 'react';
import {Card} from "react-bootstrap";
import {usePageExtension} from "../../../hooks/pageExtensionHook";
const ExtendableCardBody = ({id, className, children}) => {
const [elementsBefore, setElementsBefore] = useState([]);
const [elementsAfter, setElementsAfter] = useState([]);
const {onRender, onUnmount, context} = usePageExtension();
const render = useCallback(async () => {
if (!onRender) return;
setElementsBefore(await onRender(id, 'beforeElement', context));
setElementsAfter(await onRender(id, 'afterElement', context));
}, [setElementsBefore, setElementsAfter, id, onRender, context])
useEffect(() => {
render();
return () => {
if (!onUnmount) return;
setElementsBefore([])
setElementsAfter([])
onUnmount(id, 'beforeElement');
onUnmount(id, 'afterElement');
}
}, [setElementsBefore, setElementsAfter, id, onUnmount, render]);
return (
<>
<div dangerouslySetInnerHTML={{__html: elementsBefore.join('')}}/>
<Card.Body id={id} className={className ? "extendable " + className : "extendable"}>
{children}
</Card.Body>
<div dangerouslySetInnerHTML={{__html: elementsAfter.join('')}}/>
</>
)
};
export default ExtendableCardBody

View File

@ -0,0 +1,38 @@
import React, {useCallback, useEffect, useState} from 'react';
import {Row} from "react-bootstrap";
import {usePageExtension} from "../../../hooks/pageExtensionHook";
const ExtendableRow = ({id, className, children}) => {
const [elementsBefore, setElementsBefore] = useState([]);
const [elementsAfter, setElementsAfter] = useState([]);
const {onRender, onUnmount, context} = usePageExtension();
const render = useCallback(async () => {
if (!onRender) return;
setElementsBefore(await onRender(id, 'beforeElement', context));
setElementsAfter(await onRender(id, 'afterElement', context));
}, [setElementsBefore, setElementsAfter, id, onRender, context])
useEffect(() => {
render();
return () => {
if (!onUnmount) return;
setElementsBefore([])
setElementsAfter([])
onUnmount(id, 'beforeElement');
onUnmount(id, 'afterElement');
}
}, [setElementsBefore, setElementsAfter, id, onUnmount, render]);
return (
<>
<div dangerouslySetInnerHTML={{__html: elementsBefore.join('')}}/>
<Row id={id} className={className ? "extendable " + className : "extendable"}>
{children}
</Row>
<div dangerouslySetInnerHTML={{__html: elementsAfter.join('')}}/>
</>
)
};
export default ExtendableRow

View File

@ -3,7 +3,7 @@ import {useTheme} from "../../hooks/themeHook";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faCloudMoon, faPalette} from "@fortawesome/free-solid-svg-icons";
import {colorEnumToBgClass} from "../../util/colors";
import {Modal} from "react-bootstrap-v5";
import {Modal} from "react-bootstrap";
import {useTranslation} from "react-i18next";
const ColorSelectorButton = ({color, setColor, disabled}) =>

View File

@ -1,7 +1,7 @@
import React from 'react';
import {useTranslation} from "react-i18next";
import {useMetadata} from "../../hooks/metadataHook";
import {Modal} from "react-bootstrap-v5";
import {Modal} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faHandPointRight} from "@fortawesome/free-regular-svg-icons";

View File

@ -1,5 +1,5 @@
import React from 'react';
import {Modal} from "react-bootstrap-v5";
import {Modal} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faHandPointRight} from "@fortawesome/free-regular-svg-icons";
import {useTranslation} from "react-i18next";

View File

@ -1,6 +1,6 @@
import React from "react";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {Modal} from "react-bootstrap-v5";
import {Modal} from "react-bootstrap";
import {
faBug,
faChartArea,

View File

@ -1,6 +1,6 @@
import React from "react";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {Modal} from "react-bootstrap-v5";
import {Modal} from "react-bootstrap";
import {faCheckCircle, faDownload} from "@fortawesome/free-solid-svg-icons";
import {useTranslation} from "react-i18next";

View File

@ -2,11 +2,8 @@ import {useMetadata} from "../../hooks/metadataHook";
import {useAuth} from "../../hooks/authenticationHook";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faBars, faClockRotateLeft, faCog, faDoorOpen, faPalette, faSyncAlt} from "@fortawesome/free-solid-svg-icons";
import DropdownMenu from "react-bootstrap-v5/lib/esm/DropdownMenu";
import DropdownItem from "react-bootstrap-v5/lib/esm/DropdownItem";
import {useTheme} from "../../hooks/themeHook";
import {Dropdown} from "react-bootstrap-v5";
import DropdownToggle from "react-bootstrap-v5/lib/esm/DropdownToggle";
import {Dropdown} from "react-bootstrap";
import {localeService} from "../../service/localeService";
import {useTranslation} from "react-i18next";
import {useNavigation} from "../../hooks/navigationHook";
@ -71,23 +68,23 @@ const Header = ({page, tab, hideUpdater}) => {
<div className="topbar-divider"/>
<Dropdown className="nav-item">
<DropdownToggle variant=''>
<Dropdown.Toggle variant=''>
{authRequired && user ? <>
<span className="me-1 login-username">{user.username} </span>
<img alt="user img" className="rounded-circle" src={headImageUrl} style={{height: "2rem"}}/>
</> : <>
<Fa icon={faCog} className="me-2"/>
</>}
</DropdownToggle>
</Dropdown.Toggle>
<DropdownMenu>
<DropdownItem onClick={toggleColorChooser}>
<Dropdown.Menu>
<Dropdown.Item onClick={toggleColorChooser}>
<Fa icon={faPalette}/> {t('html.label.themeSelect')}
</DropdownItem>
{authRequired ? <DropdownItem href={baseAddress + "/auth/logout"}>
</Dropdown.Item>
{authRequired ? <Dropdown.Item href={baseAddress + "/auth/logout"}>
<Fa icon={faDoorOpen}/> {t('html.login.logout')}
</DropdownItem> : ''}
</DropdownMenu>
</Dropdown.Item> : ''}
</Dropdown.Menu>
</Dropdown>
</nav>
)

View File

@ -1,5 +1,5 @@
import React from "react";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
export const CardLoader = () => {
return (

View File

@ -21,6 +21,7 @@ const RedirectPlaceholder = () => {
if (dateDiff > 50) {
return <>
<p style={{marginLeft: "14rem"}}></p>
<p className="m-4">Redirecting..</p>
<div style={{maxWidth: "500px"}}>
<p className="m-4">
@ -32,7 +33,7 @@ const RedirectPlaceholder = () => {
</p>
<p className="m-4">
If you are trying to set up a development environment,
change package.json "proxy" to your Plan webserver address.
change package.json "proxy" to address of your Plan webserver.
</p>
<p className="m-4">
<button className="btn bg-plan" onClick={() => window.location.reload()}>Click to Refresh the
@ -42,7 +43,10 @@ const RedirectPlaceholder = () => {
</div>
</>
} else {
return <p className="m-4">Redirecting..</p>
return <>
<p style={{marginLeft: "14rem"}}></p>
<p className="m-4">Redirecting..</p>
</>
}
}

View File

@ -2,7 +2,7 @@ import React, {useEffect, useState} from 'react';
import {faCompass} from "@fortawesome/free-solid-svg-icons";
import {useTranslation} from "react-i18next";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {InputGroup} from "react-bootstrap-v5";
import {InputGroup} from "react-bootstrap";
import {useLocation, useNavigate} from "react-router-dom";
import {useMetadata} from "../../hooks/metadataHook";
import {useAuth} from "../../hooks/authenticationHook";
@ -86,7 +86,7 @@ const PageNavigationItem = ({page}) => {
className="form-select form-select-sm scrollbar"
id="pageSelector"
defaultValue={currentPage ? currentPage : items[0].id}>
{items.map((item, i) =>
{items.map(item =>
<option key={item.id} value={item.id}>{item.displayName}</option>)}
</select>
</InputGroup>

View File

@ -10,7 +10,7 @@ import {fetchPlanVersion} from "../../service/metadataService";
import {useAuth} from "../../hooks/authenticationHook";
import {useNavigation} from "../../hooks/navigationHook";
import {useTranslation} from "react-i18next";
import {Collapse} from "react-bootstrap-v5";
import {Collapse} from "react-bootstrap";
import {baseAddress} from "../../service/backendConfiguration";
import PageNavigationItem from "./PageNavigationItem";
@ -238,7 +238,9 @@ const Sidebar = ({page, items}) => {
setVersionInfo({currentVersion: "Error getting version", updateAvailable: false})
}
}
useEffect(() => loadVersion(), []);
useEffect(() => {
loadVersion();
}, []);
return (
<>

View File

@ -0,0 +1,61 @@
import {createContext, useCallback, useContext, useMemo} from "react";
import {useAuth} from "./authenticationHook";
import {useNavigation} from "./navigationHook";
import {useTheme} from "./themeHook";
import {useMetadata} from "./metadataHook";
import {getColors, withReducedSaturation} from "../util/colors";
import axios from "axios";
const PageExtensionContext = createContext({});
export const PageExtensionContextProvider = ({children}) => {
const onRender = useCallback(async (className, position) => {
return await global.pageExtensionApi.onRender(className, position);
}, []);
const onUnmount = useCallback((className, position) => {
global.pageExtensionApi.onUnmount(className, position);
}, []);
const authContext = useAuth();
const navigationContext = useNavigation();
const themeContext = useTheme();
const metadata = useMetadata();
const callContext = useMemo(() => {
return {
authentication: {
loggedIn: authContext.loggedIn,
user: authContext.user,
hasPermission: authContext.hasPermission
},
navigation: {
currentTab: navigationContext.currentTab
},
theme: {
currentThemeColor: themeContext.selectedColor,
colorMap: getColors(),
withReducedSaturation
},
metadata: {
...metadata
},
utilities: {
axios
}
};
}, [authContext, navigationContext, themeContext, metadata]);
const sharedState = useMemo(() => {
return {
onRender, onUnmount, context: callContext
};
}, [onRender, onUnmount, callContext]);
return (<PageExtensionContext.Provider value={sharedState}>
{children}
</PageExtensionContext.Provider>
)
}
export const usePageExtension = () => {
return useContext(PageExtensionContext);
}

View File

@ -1,5 +1,5 @@
import React from 'react';
import ReactDOM from 'react-dom';
import {createRoot} from "react-dom/client";
import './index.css';
import App from './App';
@ -16,9 +16,12 @@ library.add(fab);
library.add(fas);
library.add(far);
localeService.init().then(() => ReactDOM.render(
<React.StrictMode>
<App/>
</React.StrictMode>,
document.getElementById('root')
));
localeService.init().then(() => {
const container = document.getElementById('root');
const root = createRoot(container);
root.render(
<React.StrictMode>
<App/>
</React.StrictMode>
);
});

View File

@ -1,4 +1,4 @@
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col, Row} from "react-bootstrap";
import React from "react";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faBug} from "@fortawesome/free-solid-svg-icons";

View File

@ -1,21 +1,22 @@
import React from 'react';
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import {ErrorViewCard} from "../ErrorView";
import GeolocationsCard from "../../components/cards/common/GeolocationsCard";
import PingTableCard from "../../components/cards/common/PingTableCard";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const Geolocations = ({className, geolocationData, pingData, geolocationError, pingError}) => {
return (
<LoadIn>
<section className={className}>
<Row>
<ExtendableRow id={'row-' + className}>
<Col md={12}>
{geolocationError ? <ErrorViewCard error={geolocationError}/> :
<GeolocationsCard data={geolocationData}/>}
{pingError ? <ErrorViewCard error={pingError}/> : <PingTableCard data={pingData}/>}
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -8,7 +8,7 @@ import {useDataRequest} from "../../hooks/dataFetchHook";
import {fetchErrorLogs} from "../../service/metadataService";
import ErrorPage from "./ErrorPage";
import ErrorsAccordion from "../../components/accordion/ErrorsAccordion";
import {Card} from "react-bootstrap-v5";
import {Card} from "react-bootstrap";
const ErrorsPage = () => {
const {data, loadingError} = useDataRequest(fetchErrorLogs, []);

View File

@ -1,7 +1,7 @@
import React, {useCallback, useEffect, useState} from 'react';
import logo from '../../Flaticon_circle.png'
import {Alert, Card, Col, Row} from "react-bootstrap-v5";
import {Alert, Card, Col, Row} from "react-bootstrap";
import {Link, useNavigate} from "react-router-dom";
import {useTranslation} from "react-i18next";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";

View File

@ -1,7 +1,7 @@
import React, {useCallback, useEffect, useState} from 'react';
import logo from '../../Flaticon_circle.png'
import {Alert, Card, Col, Row} from "react-bootstrap-v5";
import {Alert, Card, Col, Row} from "react-bootstrap";
import {Link, useNavigate} from "react-router-dom";
import {useTranslation} from "react-i18next";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";

View File

@ -9,7 +9,7 @@ const NetworkGeolocations = () => {
const {data: pingData, loadingError: pingLoadingError} = useDataRequest(fetchNetworkPingTable, []);
return (
<Geolocations className={"network_geolocations"}
<Geolocations className={"network-geolocations"}
geolocationData={data} geolocationError={loadingError}
pingData={pingData} pingError={pingLoadingError}
/>

View File

@ -1,21 +1,22 @@
import React from 'react';
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import JoinAddressGroupCard from "../../components/cards/server/graphs/JoinAddressGroupCard";
import JoinAddressGraphCard from "../../components/cards/server/graphs/JoinAddressGraphCard";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const NetworkJoinAddresses = () => {
return (
<LoadIn>
<section className={"network_join_addresses"}>
<Row>
<section className={"network-join-addresses"}>
<ExtendableRow id={'row-network-join-addresses-0'}>
<Col lg={8}>
<JoinAddressGraphCard identifier={undefined}/>
</Col>
<Col lg={4}>
<JoinAddressGroupCard identifier={undefined}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -2,7 +2,7 @@ import React from 'react';
import {useDataRequest} from "../../hooks/dataFetchHook";
import ErrorView from "../ErrorView";
import LoadIn from "../../components/animation/LoadIn";
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col} from "react-bootstrap";
import ServerAsNumbersCard from "../../components/cards/server/values/ServerAsNumbersCard";
import ServerWeekComparisonCard from "../../components/cards/server/tables/ServerWeekComparisonCard";
import {fetchNetworkOverview} from "../../service/networkService";
@ -11,6 +11,8 @@ import {CardLoader} from "../../components/navigation/Loader";
import Datapoint from "../../components/Datapoint";
import {faUsers} from "@fortawesome/free-solid-svg-icons";
import NetworkOnlineActivityGraphsCard from "../../components/cards/server/graphs/NetworkOnlineActivityGraphsCard";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
import ExtendableCardBody from "../../components/layout/extension/ExtendableCardBody";
const RecentPlayersCard = ({data}) => {
@ -25,7 +27,7 @@ const RecentPlayersCard = ({data}) => {
{t('html.label.players')}
</h6>
</Card.Header>
<Card.Body>
<ExtendableCardBody id={'card-body-network-overview-players'}>
<p>{t('html.label.last24hours')}</p>
<Datapoint icon={faUsers} color="light-blue"
name={t('html.label.uniquePlayers')} value={data.unique_players_1d}/>
@ -41,7 +43,7 @@ const RecentPlayersCard = ({data}) => {
name={t('html.label.uniquePlayers')} value={data.unique_players_30d}/>
<Datapoint icon={faUsers} color="light-green"
name={t('html.label.newPlayers')} value={data.new_players_30d}/>
</Card.Body>
</ExtendableCardBody>
</Card>
)
}
@ -56,22 +58,22 @@ const NetworkOverview = () => {
return (
<LoadIn>
<section className="network_overview">
<Row>
<ExtendableRow id={'row-network-overview-0'}>
<Col lg={9}>
<NetworkOnlineActivityGraphsCard/>
</Col>
<Col lg={3}>
<RecentPlayersCard data={data?.players}/>
</Col>
</Row>
<Row>
</ExtendableRow>
<ExtendableRow id={'row-network-overview-1'}>
<Col lg={4}>
<ServerAsNumbersCard data={data?.numbers}/>
</Col>
<Col lg={8}>
<ServerWeekComparisonCard data={data?.weeks}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,6 +1,6 @@
import React, {useCallback, useEffect, useState} from 'react';
import LoadIn from "../../components/animation/LoadIn";
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col} from "react-bootstrap";
import {useMetadata} from "../../hooks/metadataHook";
import CardHeader from "../../components/cards/CardHeader";
import {faServer} from "@fortawesome/free-solid-svg-icons";
@ -12,6 +12,7 @@ import PerformanceAsNumbersCard from "../../components/cards/server/tables/Perfo
import {useNavigation} from "../../hooks/navigationHook";
import {mapPerformanceDataToSeries} from "../../util/graphs";
import PerformanceGraphsCard from "../../components/cards/network/PerformanceGraphsCard";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const NetworkPerformance = () => {
const {t} = useTranslation();
@ -87,13 +88,13 @@ const NetworkPerformance = () => {
const isUpToDate = visualizedServers.every((s, i) => s === selectedOptions[i]);
return (
<LoadIn>
<section className={"network_performance"}>
<Row>
<section className={"network-performance"}>
<ExtendableRow id={'row-network-performance-0'}>
<Col>
<PerformanceGraphsCard data={performanceData}/>
</Col>
</Row>
<Row>
</ExtendableRow>
<ExtendableRow id={'row-network-performance-1'}>
<Col md={8}>
<PerformanceAsNumbersCard data={performanceData?.overview?.numbers}/>
</Col>
@ -108,7 +109,7 @@ const NetworkPerformance = () => {
</button>
</Card>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,4 +1,4 @@
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import React from "react";
import PlayerbaseDevelopmentCard from "../../components/cards/server/graphs/PlayerbaseDevelopmentCard";
import CurrentPlayerbaseCard from "../../components/cards/server/graphs/CurrentPlayerbaseCard";
@ -8,22 +8,23 @@ import PlayerbaseTrendsCard from "../../components/cards/server/tables/Playerbas
import PlayerbaseInsightsCard from "../../components/cards/server/insights/PlayerbaseInsightsCard";
import LoadIn from "../../components/animation/LoadIn";
import {fetchNetworkPlayerbaseOverview} from "../../service/networkService";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const NetworkPlayerbaseOverview = () => {
const {data, loadingError} = useDataRequest(fetchNetworkPlayerbaseOverview, []);
return (
<LoadIn>
<section className="network_playerbase">
<Row>
<section className="network-playerbase">
<ExtendableRow id={'row-network-playerbase-0'}>
<Col lg={8}>
<PlayerbaseDevelopmentCard identifier={undefined}/>
</Col>
<Col lg={4}>
<CurrentPlayerbaseCard identifier={undefined}/>
</Col>
</Row>
<Row>
</ExtendableRow>
<ExtendableRow id={'row-network-playerbase-1'}>
{loadingError && <ErrorViewCard error={loadingError}/>}
{!loadingError && <>
<Col lg={8}>
@ -33,7 +34,7 @@ const NetworkPlayerbaseOverview = () => {
<PlayerbaseInsightsCard data={data?.insights}/>
</Col>
</>}
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,11 +1,12 @@
import React, {useState} from 'react';
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import {useDataRequest} from "../../hooks/dataFetchHook";
import {fetchServersOverview} from "../../service/networkService";
import ErrorView from "../ErrorView";
import ServersTableCard from "../../components/cards/network/ServersTableCard";
import QuickViewGraphCard from "../../components/cards/network/QuickViewGraphCard";
import QuickViewDataCard from "../../components/cards/network/QuickViewDataCard";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const NetworkServers = () => {
const [selectedServer, setSelectedServer] = useState(0);
@ -17,7 +18,7 @@ const NetworkServers = () => {
}
return (
<Row>
<ExtendableRow id={'row-network-servers-0'}>
<Col md={6}>
<ServersTableCard loaded={Boolean(data)} servers={data?.servers || []}
onSelect={(index) => setSelectedServer(index)}/>
@ -26,7 +27,7 @@ const NetworkServers = () => {
{data?.servers.length && <QuickViewGraphCard server={data.servers[selectedServer]}/>}
{data?.servers.length && <QuickViewDataCard server={data.servers[selectedServer]}/>}
</Col>
</Row>
</ExtendableRow>
)
};

View File

@ -1,15 +1,16 @@
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import React from "react";
import ServerRecentSessionsCard from "../../components/cards/server/tables/ServerRecentSessionsCard";
import SessionInsightsCard from "../../components/cards/server/insights/SessionInsightsCard";
import LoadIn from "../../components/animation/LoadIn";
import ServerPieCard from "../../components/cards/common/ServerPieCard";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const NetworkSessions = () => {
return (
<LoadIn>
<section className="server_sessions">
<Row>
<section className="network-sessions">
<ExtendableRow id={'row-network-sessions-0'}>
<Col lg={8}>
<ServerRecentSessionsCard identifier={undefined}/>
</Col>
@ -17,7 +18,7 @@ const NetworkSessions = () => {
<ServerPieCard/>
<SessionInsightsCard identifier={undefined}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,5 +1,5 @@
import React from "react";
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faAddressBook, faCalendar, faCalendarCheck, faClock} from "@fortawesome/free-regular-svg-icons";
import {
@ -29,6 +29,8 @@ import {useTranslation} from "react-i18next";
import NicknamesCard from "../../components/cards/player/NicknamesCard";
import {TableRow} from "../../components/table/TableRow";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableCardBody from "../../components/layout/extension/ExtendableCardBody";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const PlayerOverviewCard = ({player}) => {
const {t} = useTranslation();
@ -42,8 +44,8 @@ const PlayerOverviewCard = ({player}) => {
<Fa icon={faAddressBook}/> {player.info.name}
</h6>
</Card.Header>
<Card.Body>
<Row>
<ExtendableCardBody id={'card-body-player-overview-card'}>
<ExtendableRow id={'row-player-overview-card-0'}>
<Col sm={4}>
<p>
<Fa icon={faCircle} className={player.info.online ? "col-green" : "col-red"}/>
@ -67,9 +69,9 @@ const PlayerOverviewCard = ({player}) => {
className="col-green"/> {t('html.label.mobKills')}: {player.info.mob_kill_count}</p>
<p><Fa icon={faSkull}/> {t('html.label.deaths')}: {player.info.death_count}</p>
</Col>
</Row>
</ExtendableRow>
<hr/>
<Row>
<ExtendableRow id={'row-player-overview-card-1'}>
<Col lg={6}>
<Datapoint
icon={faClock} color="green"
@ -136,8 +138,8 @@ const PlayerOverviewCard = ({player}) => {
name={t('html.label.lastSeen')} value={player.info.last_seen} boldTitle
/>
</Col>
</Row>
</Card.Body>
</ExtendableRow>
</ExtendableCardBody>
</Card>
);
}
@ -222,8 +224,8 @@ const PlayerOverview = () => {
return (
<LoadIn>
<section className="player_overview">
<Row>
<section className="player-overview">
<ExtendableRow id={'row-player-overview-0'}>
<Col lg={6}>
<PlayerOverviewCard player={player}/>
<NicknamesCard player={player}/>
@ -233,7 +235,7 @@ const PlayerOverview = () => {
<PunchCardCard player={player}/>
<OnlineActivityCard player={player}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,6 +1,6 @@
import React, {useEffect} from "react";
import ExtensionCard, {ExtensionCardWrapper} from "../../components/extensions/ExtensionCard";
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col, Row} from "react-bootstrap";
import {useParams} from "react-router-dom";
import Masonry from "masonry-layout";
import {usePlayer} from "../layout/PlayerPage";

View File

@ -1,5 +1,5 @@
import React from "react";
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faLifeRing} from "@fortawesome/free-regular-svg-icons";
import {faKhanda, faSkull} from "@fortawesome/free-solid-svg-icons";
@ -10,6 +10,7 @@ import {useTranslation} from "react-i18next";
import PvpPveAsNumbersCard from "../../components/cards/player/PvpPveAsNumbersCard";
import PvpKillsTableCard from "../../components/cards/common/PvpKillsTableCard";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const InsightsCard = ({player}) => {
const {t} = useTranslation();
@ -50,23 +51,23 @@ const PlayerPvpPve = () => {
const {player} = usePlayer();
return (
<LoadIn>
<section className="player_pvp_pve">
<Row>
<section className="player-pvp-pve">
<ExtendableRow id={'row-player-pvp-pve-0'}>
<Col lg={8}>
<PvpPveAsNumbersCard player={player}/>
</Col>
<Col lg={4}>
<InsightsCard player={player}/>
</Col>
</Row>
<Row>
</ExtendableRow>
<ExtendableRow id={'row-player-pvp-pve-1'}>
<Col lg={6}>
<PvpKillsTableCard player_kills={player.player_kills}/>
</Col>
<Col lg={6}>
<PvpDeathsTableCard player={player}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,5 +1,5 @@
import React from "react";
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faHandPointer} from "@fortawesome/free-regular-svg-icons";
import Scrollable from "../../components/Scrollable";
@ -10,6 +10,7 @@ import {usePlayer} from "../layout/PlayerPage";
import {useTranslation} from "react-i18next";
import PlayerPingGraph from "../../components/graphs/PlayerPingGraph";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const PingGraphCard = ({player}) => {
const {t} = useTranslation();
@ -70,20 +71,20 @@ const PlayerServers = () => {
const {player} = usePlayer();
return (
<LoadIn>
<section className="player_sessions">
<Row>
<section className="player-servers">
<ExtendableRow id={'row-player-servers-0'}>
<Col lg={12}>
<PingGraphCard player={player}/>
</Col>
</Row>
<Row>
</ExtendableRow>
<ExtendableRow id={'row-player-servers-1'}>
<Col lg={8}>
<ServersCard player={player}/>
</Col>
<Col lg={4}>
<ServerPieCard player={player}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,5 +1,5 @@
import React from "react";
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col} from "react-bootstrap";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faCalendarAlt} from "@fortawesome/free-regular-svg-icons";
import PlayerSessionCalendar from "../../components/calendar/PlayerSessionCalendar";
@ -8,6 +8,7 @@ import {useTranslation} from "react-i18next";
import PlayerWorldPieCard from "../../components/cards/player/PlayerWorldPieCard";
import PlayerRecentSessionsCard from "../../components/cards/player/PlayerRecentSessionsCard";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const SessionCalendarCard = ({player}) => {
const {t} = useTranslation();
@ -27,8 +28,8 @@ const PlayerSessions = () => {
const {player} = usePlayer();
return (
<LoadIn>
<section className="player_sessions">
<Row>
<section className="player-sessions">
<ExtendableRow id={'row-player-sessions-0'}>
<Col lg={8}>
<SessionCalendarCard player={player}/>
<PlayerRecentSessionsCard player={player}/>
@ -36,7 +37,7 @@ const PlayerSessions = () => {
<Col lg={4}>
<PlayerWorldPieCard player={player}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -2,10 +2,11 @@ import React from 'react';
import {useDataRequest} from "../../hooks/dataFetchHook";
import {fetchPlayers} from "../../service/serverService";
import ErrorView from "../ErrorView";
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import PlayerListCard from "../../components/cards/common/PlayerListCard";
import LoadIn from "../../components/animation/LoadIn";
import {CardLoader} from "../../components/navigation/Loader";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const AllPlayers = () => {
const {data, loadingError} = useDataRequest(fetchPlayers, [null]);
@ -14,11 +15,11 @@ const AllPlayers = () => {
return (
<LoadIn>
<Row>
<ExtendableRow id={'row-player-list-0'}>
<Col md={12}>
{data ? <PlayerListCard data={data}/> : <CardLoader/>}
</Col>
</Row>
</ExtendableRow>
</LoadIn>
)
};

View File

@ -1,6 +1,6 @@
import React from 'react';
import LoadIn from "../../components/animation/LoadIn";
import {Col, Row} from "react-bootstrap-v5";
import {Col, Row} from "react-bootstrap";
import QueryOptionsCard from "../../components/cards/query/QueryOptionsCard";
import QueryPath from "../../components/alert/QueryPath";

View File

@ -1,6 +1,6 @@
import React, {useCallback, useEffect} from 'react';
import LoadIn from "../../components/animation/LoadIn";
import {Col, Row} from "react-bootstrap-v5";
import {Col, Row} from "react-bootstrap";
import QueryPath from "../../components/alert/QueryPath";
import {useQueryResultContext} from "../../hooks/queryResultContext";
import {useNavigate} from "react-router-dom";

View File

@ -1,5 +1,5 @@
import React from "react";
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import OnlineActivityGraphsCard from "../../components/cards/server/graphs/OnlineActivityGraphsCard";
import OnlineActivityAsNumbersCard from "../../components/cards/server/tables/OnlineActivityAsNumbersCard";
import {useParams} from "react-router-dom";
@ -8,6 +8,7 @@ import {fetchOnlineActivityOverview} from "../../service/serverService";
import ErrorView from "../ErrorView";
import OnlineActivityInsightsCard from "../../components/cards/server/insights/OnlineActivityInsightsCard";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const OnlineActivity = () => {
const {identifier} = useParams();
@ -18,20 +19,20 @@ const OnlineActivity = () => {
return (
<LoadIn>
<section className="server_online_activity_overview">
<Row>
<section className="server-online-activity-overview">
<ExtendableRow id={'row-server-online-activity-overview-0'}>
<Col lg={12}>
<OnlineActivityGraphsCard/>
</Col>
</Row>
<Row>
</ExtendableRow>
<ExtendableRow id={'row-server-online-activity-overview-1'}>
<Col lg={8}>
<OnlineActivityAsNumbersCard data={data?.numbers}/>
</Col>
<Col lg={4}>
<OnlineActivityInsightsCard data={data?.insights}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,4 +1,4 @@
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import React from "react";
import PlayerbaseDevelopmentCard from "../../components/cards/server/graphs/PlayerbaseDevelopmentCard";
import CurrentPlayerbaseCard from "../../components/cards/server/graphs/CurrentPlayerbaseCard";
@ -9,6 +9,7 @@ import {ErrorViewCard} from "../ErrorView";
import PlayerbaseTrendsCard from "../../components/cards/server/tables/PlayerbaseTrendsCard";
import PlayerbaseInsightsCard from "../../components/cards/server/insights/PlayerbaseInsightsCard";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const PlayerbaseOverview = () => {
const {identifier} = useParams();
@ -17,16 +18,16 @@ const PlayerbaseOverview = () => {
return (
<LoadIn>
<section className="server_playerbase">
<Row>
<section className="server-playerbase">
<ExtendableRow id={'row-server-playerbase-0'}>
<Col lg={8}>
<PlayerbaseDevelopmentCard identifier={identifier}/>
</Col>
<Col lg={4}>
<CurrentPlayerbaseCard identifier={identifier}/>
</Col>
</Row>
<Row>
</ExtendableRow>
<ExtendableRow id={'row-server-playerbase-1'}>
{loadingError && <ErrorViewCard error={loadingError}/>}
{!loadingError && <>
<Col lg={8}>
@ -36,7 +37,7 @@ const PlayerbaseOverview = () => {
<PlayerbaseInsightsCard data={data?.insights}/>
</Col>
</>}
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -11,7 +11,7 @@ const ServerGeolocations = () => {
const {pingData, pingLoadingError} = useDataRequest(fetchPingTable, [identifier]);
return (
<Geolocations className={"server_geolocations"}
<Geolocations className={"server-geolocations"}
geolocationData={data} geolocationError={loadingError}
pingData={pingData} pingError={pingLoadingError}
/>

View File

@ -1,23 +1,24 @@
import React from 'react';
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import JoinAddressGroupCard from "../../components/cards/server/graphs/JoinAddressGroupCard";
import JoinAddressGraphCard from "../../components/cards/server/graphs/JoinAddressGraphCard";
import {useParams} from "react-router-dom";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const ServerJoinAddresses = () => {
const {identifier} = useParams();
return (
<LoadIn>
<section className={"server_join_addresses"}>
<Row>
<section className={"server-join-addresses"}>
<ExtendableRow id={'row-server-join-addresses-0'}>
<Col lg={8}>
<JoinAddressGraphCard identifier={identifier}/>
</Col>
<Col lg={4}>
<JoinAddressGroupCard identifier={identifier}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,6 +1,6 @@
import React from "react";
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col} from "react-bootstrap";
import {faExclamationCircle, faPowerOff, faTachometerAlt, faUser, faUsers} from "@fortawesome/free-solid-svg-icons";
import Datapoint from "../../components/Datapoint";
import {useTranslation} from "react-i18next";
@ -13,6 +13,7 @@ import ServerAsNumbersCard from "../../components/cards/server/values/ServerAsNu
import ServerWeekComparisonCard from "../../components/cards/server/tables/ServerWeekComparisonCard";
import LoadIn from "../../components/animation/LoadIn";
import {CardLoader} from "../../components/navigation/Loader";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const Last7DaysCard = ({data}) => {
const {t} = useTranslation();
@ -68,23 +69,23 @@ const ServerOverview = () => {
return (
<LoadIn>
<section className="server_overview">
<Row>
<section className="server-overview">
<ExtendableRow id={'row-server-overview-0'}>
<Col lg={9}>
<OnlineActivityCard/>
</Col>
<Col lg={3}>
<Last7DaysCard data={data?.last_7_days}/>
</Col>
</Row>
<Row>
</ExtendableRow>
<ExtendableRow id={'row-server-overview-1'}>
<Col lg={4}>
<ServerAsNumbersCard data={data?.numbers}/>
</Col>
<Col lg={8}>
<ServerWeekComparisonCard data={data?.weeks}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,6 +1,6 @@
import React from 'react';
import LoadIn from "../../components/animation/LoadIn";
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import {useParams} from "react-router-dom";
import {useDataRequest} from "../../hooks/dataFetchHook";
import {fetchPerformanceOverview} from "../../service/serverService";
@ -8,6 +8,7 @@ import PerformanceGraphsCard from "../../components/cards/server/graphs/Performa
import PerformanceInsightsCard from "../../components/cards/server/insights/PerformanceInsightsCard";
import {ErrorViewCard} from "../ErrorView";
import PerformanceAsNumbersCard from "../../components/cards/server/tables/PerformanceAsNumbersCard";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const ServerPerformance = () => {
const {identifier} = useParams();
@ -16,13 +17,13 @@ const ServerPerformance = () => {
return (
<LoadIn>
<section className="server_performance">
<Row>
<section className="server-performance">
<ExtendableRow id={'row-server-performance-0'}>
<Col lg={12}>
<PerformanceGraphsCard/>
</Col>
</Row>
<Row>
</ExtendableRow>
<ExtendableRow id={'row-server-performance-1'}>
<Col lg={8}>
{loadingError ? <ErrorViewCard error={loadingError}/> :
<PerformanceAsNumbersCard data={data?.numbers}/>}
@ -31,7 +32,7 @@ const ServerPerformance = () => {
{loadingError ? <ErrorViewCard error={loadingError}/> :
<PerformanceInsightsCard data={data?.insights}/>}
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -3,9 +3,10 @@ import {useDataRequest} from "../../hooks/dataFetchHook";
import {useParams} from "react-router-dom";
import {fetchPlayers} from "../../service/serverService";
import ErrorView from "../ErrorView";
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import PlayerListCard from "../../components/cards/common/PlayerListCard";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const ServerPlayers = () => {
const {identifier} = useParams();
@ -16,12 +17,12 @@ const ServerPlayers = () => {
return (
<LoadIn>
<section className="server_players">
<Row>
<section className="server-players">
<ExtendableRow id={'row-server-players-0'}>
<Col md={12}>
<PlayerListCard data={data}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,7 +1,7 @@
import React, {useEffect} from 'react';
import Masonry from "masonry-layout";
import LoadIn from "../../components/animation/LoadIn";
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col, Row} from "react-bootstrap";
import ExtensionCard, {ExtensionCardWrapper} from "../../components/extensions/ExtensionCard";
import Loader from "../../components/navigation/Loader";
import {useTranslation} from "react-i18next";

View File

@ -1,6 +1,6 @@
import React from "react";
import PvpPveAsNumbersCard from "../../components/cards/server/tables/PvpPveAsNumbersCard";
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import PvpKillsTableCard from "../../components/cards/common/PvpKillsTableCard";
import PvpPveInsightsCard from "../../components/cards/server/insights/PvpPveInsightsCard";
import {useParams} from "react-router-dom";
@ -8,6 +8,7 @@ import {useDataRequest} from "../../hooks/dataFetchHook";
import {fetchKills, fetchPvpPve} from "../../service/serverService";
import ErrorView from "../ErrorView";
import LoadIn from "../../components/animation/LoadIn";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const ServerPvpPve = () => {
const {identifier} = useParams();
@ -20,20 +21,20 @@ const ServerPvpPve = () => {
return (
<LoadIn show={data && killsData}>
<section className="server_pvp_pve">
<Row>
<section className="server-pvp-pve">
<ExtendableRow id={'row-server-pvp-pve-0'}>
<Col lg={8}>
<PvpPveAsNumbersCard kill_data={data?.numbers}/>
</Col>
<Col lg={4}>
<PvpPveInsightsCard data={data?.insights}/>
</Col>
</Row>
<Row>
</ExtendableRow>
<ExtendableRow id={'row-server-pvp-pve-1'}>
<Col lg={8}>
<PvpKillsTableCard player_kills={killsData?.player_kills}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,17 +1,18 @@
import {Col, Row} from "react-bootstrap-v5";
import {Col} from "react-bootstrap";
import React from "react";
import ServerWorldPieCard from "../../components/cards/server/graphs/ServerWorldPieCard";
import ServerRecentSessionsCard from "../../components/cards/server/tables/ServerRecentSessionsCard";
import SessionInsightsCard from "../../components/cards/server/insights/SessionInsightsCard";
import LoadIn from "../../components/animation/LoadIn";
import {useParams} from "react-router-dom";
import ExtendableRow from "../../components/layout/extension/ExtendableRow";
const ServerSessions = () => {
const {identifier} = useParams();
return (
<LoadIn>
<section className="server_sessions">
<Row>
<section className="server-sessions">
<ExtendableRow id={'row-server-sessions-0'}>
<Col lg={8}>
<ServerRecentSessionsCard identifier={identifier}/>
</Col>
@ -19,7 +20,7 @@ const ServerSessions = () => {
<ServerWorldPieCard/>
<SessionInsightsCard identifier={identifier}/>
</Col>
</Row>
</ExtendableRow>
</section>
</LoadIn>
)

View File

@ -1,7 +1,7 @@
import React, {useEffect, useState} from 'react';
import ErrorView from "../ErrorView";
import LoadIn from "../../components/animation/LoadIn";
import {Card, Col, Row} from "react-bootstrap-v5";
import {Card, Col, Row} from "react-bootstrap";
import ExtensionCard from "../../components/extensions/ExtensionCard";
import {useParams} from "react-router-dom";
import {useTranslation} from "react-i18next";

View File

@ -1022,10 +1022,10 @@
core-js-pure "^3.20.2"
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.19.4", "@babel/runtime@^7.20.6", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.2", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
version "7.20.6"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3"
integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==
"@babel/runtime@^7.10.2", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.3", "@babel/runtime@^7.17.2", "@babel/runtime@^7.19.4", "@babel/runtime@^7.20.6", "@babel/runtime@^7.20.7", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2":
version "7.20.13"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.13.tgz#7055ab8a7cff2b8f6058bf6ae45ff84ad2aded4b"
integrity sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==
dependencies:
regenerator-runtime "^0.13.11"
@ -1151,43 +1151,43 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
"@fortawesome/fontawesome-common-types@6.2.1":
version "6.2.1"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.2.1.tgz#411e02a820744d3f7e0d8d9df9d82b471beaa073"
integrity sha512-Sz07mnQrTekFWLz5BMjOzHl/+NooTdW8F8kDQxjWwbpOJcnoSg4vUDng8d/WR1wOxM0O+CY9Zw0nR054riNYtQ==
"@fortawesome/fontawesome-common-types@6.3.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.3.0.tgz#51f734e64511dbc3674cd347044d02f4dd26e86b"
integrity sha512-4BC1NMoacEBzSXRwKjZ/X/gmnbp/HU5Qqat7E8xqorUtBFZS+bwfGH5/wqOC2K6GV0rgEobp3OjGRMa5fK9pFg==
"@fortawesome/fontawesome-free@^6.2.1":
version "6.2.1"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.2.1.tgz#344baf6ff9eaad7a73cff067d8c56bfc11ae5304"
integrity sha512-viouXhegu/TjkvYQoiRZK3aax69dGXxgEjpvZW81wIJdxm5Fnvp3VVIP4VHKqX4SvFw6qpmkILkD4RJWAdrt7A==
"@fortawesome/fontawesome-free@^6.3.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.3.0.tgz#b5877182692a6f7a39d1108837bec24247ba4bd7"
integrity sha512-qVtd5i1Cc7cdrqnTWqTObKQHjPWAiRwjUPaXObaeNPcy7+WKxJumGBx66rfSFgK6LNpIasVKkEgW8oyf0tmPLA==
"@fortawesome/fontawesome-svg-core@^6.2.1":
version "6.2.1"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.2.1.tgz#e87e905e444b5e7b715af09b64d27b53d4c8f9d9"
integrity sha512-HELwwbCz6C1XEcjzyT1Jugmz2NNklMrSPjZOWMlc+ZsHIVk+XOvOXLGGQtFBwSyqfJDNgRq4xBCwWOaZ/d9DEA==
"@fortawesome/fontawesome-svg-core@^6.3.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.3.0.tgz#b6a17d48d231ac1fad93e43fca7271676bf316cf"
integrity sha512-uz9YifyKlixV6AcKlOX8WNdtF7l6nakGyLYxYaCa823bEBqyj/U2ssqtctO38itNEwXb8/lMzjdoJ+aaJuOdrw==
dependencies:
"@fortawesome/fontawesome-common-types" "6.2.1"
"@fortawesome/fontawesome-common-types" "6.3.0"
"@fortawesome/free-brands-svg-icons@^6.2.1":
version "6.2.1"
resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.2.1.tgz#04a6d6f7898f7ef392aba7a65030a584d4f4c84f"
integrity sha512-L8l4MfdHPmZlJ72PvzdfwOwbwcCAL0vx48tJRnI6u1PJXh+j2f3yDoKyQgO3qjEsgD5Fr2tQV/cPP8F/k6aUig==
"@fortawesome/free-brands-svg-icons@^6.3.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.3.0.tgz#436e5fcba4f4f0902edcceaec5c4ff887ba7328f"
integrity sha512-xI0c+a8xnKItAXCN8rZgCNCJQiVAd2Y7p9e2ND6zN3J3ekneu96qrePieJ7yA7073C1JxxoM3vH1RU7rYsaj8w==
dependencies:
"@fortawesome/fontawesome-common-types" "6.2.1"
"@fortawesome/fontawesome-common-types" "6.3.0"
"@fortawesome/free-regular-svg-icons@^6.2.1":
version "6.2.1"
resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.2.1.tgz#650e56d937755a8341f2eef258ecb6f95458820f"
integrity sha512-wiqcNDNom75x+pe88FclpKz7aOSqS2lOivZeicMV5KRwOAeypxEYWAK/0v+7r+LrEY30+qzh8r2XDaEHvoLsMA==
"@fortawesome/free-regular-svg-icons@^6.3.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.3.0.tgz#286f87f777e6c96af59151e86647c81083029ee2"
integrity sha512-cZnwiVHZ51SVzWHOaNCIA+u9wevZjCuAGSvSYpNlm6A4H4Vhwh8481Bf/5rwheIC3fFKlgXxLKaw8Xeroz8Ntg==
dependencies:
"@fortawesome/fontawesome-common-types" "6.2.1"
"@fortawesome/fontawesome-common-types" "6.3.0"
"@fortawesome/free-solid-svg-icons@^6.2.1":
version "6.2.1"
resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.2.1.tgz#2290ea5adcf1537cbd0c43de6feb38af02141d27"
integrity sha512-oKuqrP5jbfEPJWTij4sM+/RvgX+RMFwx3QZCZcK9PrBDgxC35zuc7AOFsyMjMd/PIFPeB2JxyqDr5zs/DZFPPw==
"@fortawesome/free-solid-svg-icons@^6.3.0":
version "6.3.0"
resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.3.0.tgz#d3bd33ae18bb15fdfc3ca136e2fea05f32768a65"
integrity sha512-x5tMwzF2lTH8pyv8yeZRodItP2IVlzzmBuD1M7BjawWgg9XAvktqJJ91Qjgoaf8qJpHQ8FEU9VxRfOkLhh86QA==
dependencies:
"@fortawesome/fontawesome-common-types" "6.2.1"
"@fortawesome/fontawesome-common-types" "6.3.0"
"@fortawesome/react-fontawesome@^0.2.0":
version "0.2.0"
@ -1196,35 +1196,35 @@
dependencies:
prop-types "^15.8.1"
"@fullcalendar/bootstrap@^5.11.3":
version "5.11.3"
resolved "https://registry.yarnpkg.com/@fullcalendar/bootstrap/-/bootstrap-5.11.3.tgz#12b0cc736562075b2270e2735ba970c9b16294e2"
integrity sha512-qCcNIz4F5YcTfpc1l2kKMtNpC2Lu/Al5/WaCASoLgqx1ukOunGuSh6WmooYrHCg/fwUJR4NOp85Qe4lggyEuSg==
"@fullcalendar/bootstrap@^5.11.4":
version "5.11.4"
resolved "https://registry.yarnpkg.com/@fullcalendar/bootstrap/-/bootstrap-5.11.4.tgz#8870915e5f4dd3fedd95c83bf14fd1a1f8d3d34f"
integrity sha512-IfBtsixKtDyludqxtiYtzlQ6Ozmaipovgl1Fz7EhjUDsm3wZ+So7YVu4yWSJL3DnFB40YjsyP8nqLTG+qPNIaA==
dependencies:
"@fullcalendar/common" "~5.11.3"
"@fullcalendar/common" "~5.11.4"
tslib "^2.1.0"
"@fullcalendar/common@~5.11.3":
version "5.11.3"
resolved "https://registry.yarnpkg.com/@fullcalendar/common/-/common-5.11.3.tgz#6d555a06925b8a6d1556570c9f039960539908d5"
integrity sha512-welVwyfQOXQQGfDwBMSfYEPbiO1cPfUD+C7jd3ZoweJR+dSO11ddFugxIQ7dGfABAGZ63oq/+LW9FsmAJezVNg==
"@fullcalendar/common@~5.11.4":
version "5.11.4"
resolved "https://registry.yarnpkg.com/@fullcalendar/common/-/common-5.11.4.tgz#3541f4605bac9ea9a28bb939173f49d0c54a301b"
integrity sha512-wjy+EZgZIPWq1Z5qeB/pV2dmsXwzTJ2teNh5bjlVeHsvDYwERXSZEG2CdoF/NCTJaYeQY93xu1cj9Jw/0KXywA==
dependencies:
tslib "^2.1.0"
"@fullcalendar/daygrid@^5.11.3":
version "5.11.3"
resolved "https://registry.yarnpkg.com/@fullcalendar/daygrid/-/daygrid-5.11.3.tgz#6bc1f956c95f84438428aa6e7a106c863a791a70"
integrity sha512-PCK0y80DRNCzWuC5lGpIWqCgKDvql1ah7rXql5lu+Gn2EeFj15ZQ8diMFjtNIQucEmFaNOXnR05Pgcry1n6Shg==
"@fullcalendar/daygrid@^5.11.4":
version "5.11.4"
resolved "https://registry.yarnpkg.com/@fullcalendar/daygrid/-/daygrid-5.11.4.tgz#8a9f0863bb3fa8c0bc0118020cdb63fbe966aa94"
integrity sha512-M/pSrxgrtG5vDkOxqTgv6WrptrsXjp5QgQLyXantSy+9EuZOagPKJDh+HEU94DKUAc0mlXS6iDdf0WzjkTHe6A==
dependencies:
"@fullcalendar/common" "~5.11.3"
"@fullcalendar/common" "~5.11.4"
tslib "^2.1.0"
"@fullcalendar/react@^5.11.3":
version "5.11.3"
resolved "https://registry.yarnpkg.com/@fullcalendar/react/-/react-5.11.3.tgz#34c076785ec8ea12cfbc29b7028cb5d923c2aecd"
integrity sha512-pxk6da5V1Mn41M664phQ1cr+0QbhXqkDHUhAVp8OOBrtMW84nhs82IYWTZNA3cbFCn4aUgoG2oGnyxekSF3pYA==
"@fullcalendar/react@^5.11.4":
version "5.11.4"
resolved "https://registry.yarnpkg.com/@fullcalendar/react/-/react-5.11.4.tgz#a256f9510567f8e024e01b1e7838f5332b5b7ace"
integrity sha512-I9n9ENcQJWBZRNUfKrfab5z5ZXVHC4XdNnjqOHCG1JJzl1jRZjkK/6v3mORbXHoxa+vf9LP62sNl4Yb9RYZwPA==
dependencies:
"@fullcalendar/common" "~5.11.3"
"@fullcalendar/common" "~5.11.4"
tslib "^2.1.0"
"@highcharts/map-collection@^2.0.1":
@ -1520,28 +1520,45 @@
schema-utils "^3.0.0"
source-map "^0.7.3"
"@popperjs/core@^2.5.3":
version "2.11.5"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.5.tgz#db5a11bf66bdab39569719555b0f76e138d7bd64"
integrity sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==
"@popperjs/core@^2.11.6":
version "2.11.6"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45"
integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==
"@react-aria/ssr@^3.4.1":
version "3.4.1"
resolved "https://registry.yarnpkg.com/@react-aria/ssr/-/ssr-3.4.1.tgz#79e8bb621487e8f52890c917d3c734f448ba95e7"
integrity sha512-NmhoilMDyIfQiOSdQgxpVH2tC2u85Y0mVijtBNbI9kcDYLEiW/r6vKYVKtkyU+C4qobXhGMPfZ70PTc0lysSVA==
dependencies:
"@swc/helpers" "^0.4.14"
"@remix-run/router@1.3.0":
version "1.3.0"
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.3.0.tgz#b6ee542c7f087b73b3d8215b9bf799f648be71cb"
integrity sha512-nwQoYb3m4DDpHTeOwpJEuDt8lWVcujhYYSFGLluC+9es2PyLjm+jjq3IeRBQbwBtPLJE/lkuHuGHr8uQLgmJRA==
"@restart/context@^2.1.4":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02"
integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==
"@restart/hooks@^0.3.21", "@restart/hooks@^0.3.25":
version "0.3.27"
resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.27.tgz#91f356d66d4699a8cd8b3d008402708b6a9dc505"
integrity sha512-s984xV/EapUIfkjlf8wz9weP2O9TNKR96C68FfMEy2bE69+H4cNv3RD4Mf97lW7Htt7PjZrYTjSC8f3SB9VCXw==
"@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7":
version "0.4.8"
resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.4.8.tgz#67ada92e36527956865ab9b1ddfb87d37aa1db42"
integrity sha512-Ivvp1FZ0Lja80iUTYAhbzy+stxwO7FbPHP95ypCtIh0wyOLiayQywXhVJ2ZYP5S1AjW2GmKHeRU4UglMwTG2sA==
dependencies:
dequal "^2.0.2"
"@restart/ui@^1.4.1":
version "1.5.4"
resolved "https://registry.yarnpkg.com/@restart/ui/-/ui-1.5.4.tgz#2537e1b7495f7ed4257dae3676c8d2b91e664e03"
integrity sha512-ziNtXY2PrjXrRUfR1D/ry1v1i5IF+kfMcH9d1kIcU2lOELfmDsVb+fzbyEDz3yKvKuqkphTunVDuLdYRJ0YsAg==
dependencies:
"@babel/runtime" "^7.20.7"
"@popperjs/core" "^2.11.6"
"@react-aria/ssr" "^3.4.1"
"@restart/hooks" "^0.4.7"
"@types/warning" "^3.0.0"
dequal "^2.0.3"
dom-helpers "^5.2.0"
uncontrollable "^7.2.1"
warning "^4.0.3"
"@rollup/plugin-babel@^5.2.0":
version "5.3.1"
resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283"
@ -1711,14 +1728,21 @@
"@svgr/plugin-svgo" "^5.5.0"
loader-utils "^2.0.0"
"@testing-library/dom@^8.0.0":
version "8.13.0"
resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.13.0.tgz#bc00bdd64c7d8b40841e27a70211399ad3af46f5"
integrity sha512-9VHgfIatKNXQNaZTtLnalIy0jNZzY35a4S3oi08YAt9Hv1VsfZ/DfA45lM8D/UhtHBGJ4/lGwp0PZkVndRkoOQ==
"@swc/helpers@^0.4.14":
version "0.4.14"
resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.4.14.tgz#1352ac6d95e3617ccb7c1498ff019654f1e12a74"
integrity sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==
dependencies:
tslib "^2.4.0"
"@testing-library/dom@^9.0.0":
version "9.0.0"
resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.0.0.tgz#cc50e8df2a7dccff95555102beebbae60e95e95e"
integrity sha512-+/TLgKNFsYUshOY/zXsQOk+PlFQK+eyJ9T13IDVNJEi+M+Un7xlJK+FZKkbGSnf0+7E1G6PlDhkSYQ/GFiruBQ==
dependencies:
"@babel/code-frame" "^7.10.4"
"@babel/runtime" "^7.12.5"
"@types/aria-query" "^4.2.0"
"@types/aria-query" "^5.0.1"
aria-query "^5.0.0"
chalk "^4.1.0"
dom-accessibility-api "^0.5.9"
@ -1740,14 +1764,14 @@
lodash "^4.17.15"
redent "^3.0.0"
"@testing-library/react@^12.0.0":
version "12.1.5"
resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-12.1.5.tgz#bb248f72f02a5ac9d949dea07279095fa577963b"
integrity sha512-OfTXCJUFgjd/digLUuPxa0+/3ZxsQmE7ub9kcbW/wi96Bh3o/p5vrETcBGfP17NWPGqeYYl5LTRpwyGoMC4ysg==
"@testing-library/react@^14.0.0":
version "14.0.0"
resolved "https://registry.yarnpkg.com/@testing-library/react/-/react-14.0.0.tgz#59030392a6792450b9ab8e67aea5f3cc18d6347c"
integrity sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==
dependencies:
"@babel/runtime" "^7.12.5"
"@testing-library/dom" "^8.0.0"
"@types/react-dom" "<18.0.0"
"@testing-library/dom" "^9.0.0"
"@types/react-dom" "^18.0.0"
"@testing-library/user-event@^14.4.3":
version "14.4.3"
@ -1764,10 +1788,10 @@
resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
"@types/aria-query@^4.2.0":
version "4.2.2"
resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc"
integrity sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==
"@types/aria-query@^5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.1.tgz#3286741fb8f1e1580ac28784add4c7a1d49bdfbc"
integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==
"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
version "7.1.19"
@ -1817,13 +1841,6 @@
dependencies:
"@types/node" "*"
"@types/classnames@^2.2.10":
version "2.3.1"
resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.3.1.tgz#3c2467aa0f1a93f1f021e3b9bcf938bd5dfdc0dd"
integrity sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==
dependencies:
classnames "*"
"@types/connect-history-api-fallback@^1.3.5":
version "1.3.5"
resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae"
@ -1926,11 +1943,6 @@
dependencies:
"@types/node" "*"
"@types/invariant@^2.2.33":
version "2.2.35"
resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.35.tgz#cd3ebf581a6557452735688d8daba6cf0bd5a3be"
integrity sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
version "2.0.4"
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44"
@ -1988,7 +2000,7 @@
resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.6.0.tgz#efcbd41937f9ae7434c714ab698604822d890759"
integrity sha512-G/AdOadiZhnJp0jXCaBQU449W2h716OW/EoXeYkCytxKL06X1WCXB4DZpp8TpZ8eyIJVS1cw4lrlkkSYU21cDw==
"@types/prop-types@*", "@types/prop-types@^15.7.3":
"@types/prop-types@*":
version "15.7.5"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==
@ -2008,12 +2020,12 @@
resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
"@types/react-dom@<18.0.0":
version "17.0.15"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.15.tgz#f2c8efde11521a4b7991e076cb9c70ba3bb0d156"
integrity sha512-Tr9VU9DvNoHDWlmecmcsE5ZZiUkYx+nKBzum4Oxe1K0yJVyBlfbq7H3eXjxXqJczBKqPGq3EgfTru4MgKb9+Yw==
"@types/react-dom@^18.0.0":
version "18.0.11"
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.0.11.tgz#321351c1459bc9ca3d216aefc8a167beec334e33"
integrity sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==
dependencies:
"@types/react" "^17"
"@types/react" "*"
"@types/react-redux@^7.1.20":
version "7.1.24"
@ -2025,10 +2037,10 @@
hoist-non-react-statics "^3.3.0"
redux "^4.0.0"
"@types/react-transition-group@^4.4.0":
version "4.4.4"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.4.tgz#acd4cceaa2be6b757db61ed7b432e103242d163e"
integrity sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==
"@types/react-transition-group@^4.4.4":
version "4.4.5"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.5.tgz#aae20dcf773c5aa275d5b9f7cdbca638abc5e416"
integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==
dependencies:
"@types/react" "*"
@ -2041,24 +2053,6 @@
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/react@^16.9.35":
version "16.14.25"
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.25.tgz#d003f712c7563fdef5a87327f1892825af375608"
integrity sha512-cXRVHd7vBT5v1is72mmvmsg9stZrbJO04DJqFeh3Yj2tVKO6vmxg5BI+ybI6Ls7ROXRG3aFbZj9x0WA3ZAoDQw==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/react@^17":
version "17.0.44"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.44.tgz#c3714bd34dd551ab20b8015d9d0dbec812a51ec7"
integrity sha512-Ye0nlw09GeMp2Suh8qoOv0odfgCoowfM/9MG6WeRD60Gq9wS90bdkdRtYbRkNhXOpG4H+YXGvj4wOWhAC0LJ1g==
dependencies:
"@types/prop-types" "*"
"@types/scheduler" "*"
csstype "^3.0.2"
"@types/resolve@1.17.1":
version "1.17.1"
resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6"
@ -2662,10 +2656,10 @@ axe-core@^4.3.5:
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.1.tgz#7dbdc25989298f9ad006645cd396782443757413"
integrity sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==
axios@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.2.3.tgz#31a3d824c0ebf754a004b585e5f04a5f87e6c4ff"
integrity sha512-pdDkMYJeuXLZ6Xj/Q5J3Phpe+jbGdsSzlQaFVkMQzRUL05+6+tetX8TV3p4HrU4kzuO9bt+io/yGQxuyxA/xcw==
axios@^1.3.4:
version "1.3.4"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024"
integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==
dependencies:
follow-redirects "^1.15.0"
form-data "^4.0.0"
@ -3116,7 +3110,7 @@ cjs-module-lexer@^1.0.0:
resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40"
integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
classnames@*, classnames@^2.2.6, classnames@^2.3.1:
classnames@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e"
integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==
@ -3594,10 +3588,10 @@ data-urls@^2.0.0:
whatwg-mimetype "^2.3.0"
whatwg-url "^8.0.0"
datatables.net-bs5@>=1.12.1, datatables.net-bs5@^1.12.1:
version "1.13.1"
resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-1.13.1.tgz#e5613b58512d9d9a0040a8f5cfc93b0b484e6082"
integrity sha512-kNmvUc23FKmK+QNpPPlNYYy+L/OQmiheRT7kTsp3cxHbtXsV7d6u/5TMxT70HH2VvlUivrgRcEtye4Mp+8mbKw==
datatables.net-bs5@>=1.12.1, datatables.net-bs5@^1.13.2:
version "1.13.2"
resolved "https://registry.yarnpkg.com/datatables.net-bs5/-/datatables.net-bs5-1.13.2.tgz#580bf08224c25cf7a86e94772757199babee7fe5"
integrity sha512-p1JOXFi+VD4wS0AxRmJPHBylJ8AC4xGJ3j0TZ+8hMspuZ+QvAhEqEPt8OEAGVzlN1ElfQimZjBeAoES/9nsuig==
dependencies:
datatables.net ">=1.12.1"
jquery ">=1.7"
@ -3619,10 +3613,10 @@ datatables.net-responsive@>=2.3.0:
datatables.net ">=1.12.1"
jquery ">=1.7"
datatables.net@>=1.12.1, datatables.net@^1.13.1:
version "1.13.1"
resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-1.13.1.tgz#199f7cb63f4536c135e161f95254212835a1c130"
integrity sha512-cX5dDHsbVdLLYKsWOSE0MvuGUcV88zU5dZ/taK2puJV6F9Fw0CFsP3+U/kr+qpDSFOBLWISRyM4Q9wWWovPTNg==
datatables.net@>=1.12.1, datatables.net@^1.13.2:
version "1.13.2"
resolved "https://registry.yarnpkg.com/datatables.net/-/datatables.net-1.13.2.tgz#48f7035b1696a29cb70909db1f2e0ebd5f946f3e"
integrity sha512-u5nOU+C9SBp1SyPmd6G+niozZtrBwo1E8xzdOk3JJaAkFYgX/KxF3Gd79R8YLbUfmIs2OLnLe5gaz/qs5U8UDA==
dependencies:
jquery ">=1.7"
@ -3712,6 +3706,11 @@ dequal@^2.0.2:
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d"
integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==
dequal@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be"
integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==
desandro-matches-selector@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/desandro-matches-selector/-/desandro-matches-selector-2.0.2.tgz#717beed4dc13e7d8f3762f707a6d58a6774218e1"
@ -3809,7 +3808,7 @@ dom-converter@^0.2.0:
dependencies:
utila "~0.4"
dom-helpers@^5.0.1, dom-helpers@^5.1.2, dom-helpers@^5.2.0:
dom-helpers@^5.0.1, dom-helpers@^5.2.0, dom-helpers@^5.2.1:
version "5.2.1"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902"
integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==
@ -4907,10 +4906,10 @@ he@^1.2.0:
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
highcharts@^10.3.2:
version "10.3.2"
resolved "https://registry.yarnpkg.com/highcharts/-/highcharts-10.3.2.tgz#cb74091b12c1a0112532857eb751044072aa34a8"
integrity sha512-uDSuAOTKXOA90WUE38KKJawzMPjeIX/4UH3fMxZdoypbGVjsbuHO6jJSdeGf1LaDpu5wRg/xjO4QXzJqXfIrkA==
highcharts@^10.3.3:
version "10.3.3"
resolved "https://registry.yarnpkg.com/highcharts/-/highcharts-10.3.3.tgz#b8acca24f2d4b1f2f726540734166e59e07b35c4"
integrity sha512-r7wgUPQI9tr3jFDn3XT36qsNwEIZYcfgz4mkKEA6E4nn5p86y+u1EZjazIG4TRkl5/gmGRtkBUiZW81g029RIw==
highlight.js@^10.4.1, highlight.js@~10.7.0:
version "10.7.3"
@ -5091,10 +5090,10 @@ i18next-localstorage-backend@^4.1.0:
dependencies:
"@babel/runtime" "^7.20.6"
i18next@^22.4.9:
version "22.4.9"
resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.4.9.tgz#98c8384c6bd41ff937da98b1e809ba03d3b41053"
integrity sha512-8gWMmUz460KJDQp/ob3MNUX84cVuDRY9PLFPnV8d+Qezz/6dkjxwOaH70xjrCNDO+JrUL25iXfAIN9wUkInNZw==
i18next@^22.4.10:
version "22.4.10"
resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.4.10.tgz#cfbfc412c6bc83e3c16564f47e6a5c145255960e"
integrity sha512-3EqgGK6fAJRjnGgfkNSStl4mYLCjUoJID338yVyLMj5APT67HUtWoqSayZewiiC5elzMUB1VEUwcmSCoeQcNEA==
dependencies:
"@babel/runtime" "^7.20.6"
@ -7644,28 +7643,22 @@ react-app-polyfill@^3.0.0:
regenerator-runtime "^0.13.9"
whatwg-fetch "^3.6.2"
react-bootstrap-v5@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/react-bootstrap-v5/-/react-bootstrap-v5-1.4.0.tgz#be8694dc14000725065f58b909c4ea8f542e5711"
integrity sha512-AsPE19bacvLNXdTVqDLspM+K5SOa4XBgT6SFesUiC5JnYGqVmspIgYSgu8SwcSaiGgrkFtd9v9XLSqf0l9YvEA==
react-bootstrap@^2.7.2:
version "2.7.2"
resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-2.7.2.tgz#100069ea7b4807cccbc5fef1e33bc90283262602"
integrity sha512-WDSln+mG4RLLFO01stkj2bEx/3MF4YihK9D/dWnHaSxOiQZLbhhlf95D2Jb20X3t2m7vMxRe888FVrfLJoGmmA==
dependencies:
"@babel/runtime" "^7.4.2"
"@restart/context" "^2.1.4"
"@restart/hooks" "^0.3.21"
"@types/classnames" "^2.2.10"
"@types/invariant" "^2.2.33"
"@types/prop-types" "^15.7.3"
"@types/react" "^16.9.35"
"@types/react-transition-group" "^4.4.0"
"@types/warning" "^3.0.0"
classnames "^2.2.6"
dom-helpers "^5.1.2"
"@babel/runtime" "^7.17.2"
"@restart/hooks" "^0.4.6"
"@restart/ui" "^1.4.1"
"@types/react-transition-group" "^4.4.4"
classnames "^2.3.1"
dom-helpers "^5.2.1"
invariant "^2.2.4"
prop-types "^15.7.2"
prop-types "^15.8.1"
prop-types-extra "^1.1.0"
react-overlays "^4.1.0"
react-transition-group "^4.4.1"
uncontrollable "^7.0.0"
react-transition-group "^4.4.2"
uncontrollable "^7.2.1"
warning "^4.0.3"
react-copy-to-clipboard@5.1.0:
@ -7714,7 +7707,7 @@ react-dev-utils@^12.0.1:
strip-ansi "^6.0.1"
text-table "^0.2.0"
react-dom@=17.0.2, react-dom@^17.0.2:
react-dom@=17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
@ -7723,15 +7716,23 @@ react-dom@=17.0.2, react-dom@^17.0.2:
object-assign "^4.1.1"
scheduler "^0.20.2"
react-dom@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d"
integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==
dependencies:
loose-envify "^1.1.0"
scheduler "^0.23.0"
react-error-overlay@^6.0.11:
version "6.0.11"
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb"
integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==
react-i18next@^12.1.4:
version "12.1.4"
resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-12.1.4.tgz#be0a60d3a45acc4321909f8a4b8cde16518a2926"
integrity sha512-XQND7jYtgM7ht5PH3yIZljCRpAMTlH/zmngM9ZjToqa+0BR6xuu8c7QF0WIIOEjcMTB2S3iOfpN/xG/ZrAnO6g==
react-i18next@^12.2.0:
version "12.2.0"
resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-12.2.0.tgz#010e3f6070b8d700442947233352ebe4b252d7a1"
integrity sha512-5XeVgSygaGfyFmDd2WcXvINRw2WEC1XviW1LXY/xLOEMzsCFRwKqfnHN+hUjla8ZipbVJR27GCMSuTr0BhBBBQ==
dependencies:
"@babel/runtime" "^7.20.6"
html-parse-stringify "^3.0.1"
@ -7773,20 +7774,6 @@ react-mcjsonchat@^1.0.0:
resolved "https://registry.yarnpkg.com/react-mcjsonchat/-/react-mcjsonchat-1.0.0.tgz#6a0c748b074c06a2d64a66db76e5fb2036c48a9a"
integrity sha512-H/OYi1iRYFG2Bntj1EYWfTxOaWtIopHy6ILoaXtD3OFONK7kQnp0lXFf6sw1G3BU0DL7s8NL4+AmMCer/A5eIQ==
react-overlays@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-4.1.1.tgz#0060107cbe1c5171a744ccda3fbf0556d064bc5f"
integrity sha512-WtJifh081e6M24KnvTQoNjQEpz7HoLxqt8TwZM7LOYIkYJ8i/Ly1Xi7RVte87ZVnmqQ4PFaFiNHZhSINPSpdBQ==
dependencies:
"@babel/runtime" "^7.12.1"
"@popperjs/core" "^2.5.3"
"@restart/hooks" "^0.3.25"
"@types/warning" "^3.0.0"
dom-helpers "^5.2.0"
prop-types "^15.7.2"
uncontrollable "^7.0.0"
warning "^4.0.3"
react-redux@^7.2.4:
version "7.2.8"
resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.2.8.tgz#a894068315e65de5b1b68899f9c6ee0923dd28de"
@ -7885,17 +7872,17 @@ react-syntax-highlighter@^15.5.0:
prismjs "^1.27.0"
refractor "^3.6.0"
react-transition-group@^4.4.1:
version "4.4.2"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.2.tgz#8b59a56f09ced7b55cbd53c36768b922890d5470"
integrity sha512-/RNYfRAMlZwDSr6z4zNKV6xu53/e2BuaBbGhbyYIXTrmgu/bGHzmqOs7mJSJBHy9Ud+ApHx3QjrkKSp1pxvlFg==
react-transition-group@^4.4.2:
version "4.4.5"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1"
integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==
dependencies:
"@babel/runtime" "^7.5.5"
dom-helpers "^5.0.1"
loose-envify "^1.4.0"
prop-types "^15.6.2"
react@=17.0.2, react@^17.0.2:
react@=17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
@ -7903,6 +7890,13 @@ react@=17.0.2, react@^17.0.2:
loose-envify "^1.1.0"
object-assign "^4.1.1"
react@^18.2.0:
version "18.2.0"
resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5"
integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==
dependencies:
loose-envify "^1.1.0"
readable-stream@^2.0.1:
version "2.3.7"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
@ -8227,10 +8221,10 @@ sass-loader@^12.3.0:
klona "^2.0.4"
neo-async "^2.6.2"
sass@^1.57.1:
version "1.57.1"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5"
integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw==
sass@^1.58.3:
version "1.58.3"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.58.3.tgz#2348cc052061ba4f00243a208b09c40e031f270d"
integrity sha512-Q7RaEtYf6BflYrQ+buPudKR26/lH+10EmO9bBqbmPh/KeLqv8bjpTNqxe71ocONqXq+jYiCbpPUmQMS+JJPk4A==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
@ -8256,6 +8250,13 @@ scheduler@^0.20.2:
loose-envify "^1.1.0"
object-assign "^4.1.1"
scheduler@^0.23.0:
version "0.23.0"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==
dependencies:
loose-envify "^1.1.0"
schema-utils@2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7"
@ -9091,6 +9092,11 @@ tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==
tslib@^2.4.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
tsutils@^3.21.0:
version "3.21.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623"
@ -9157,7 +9163,7 @@ unbox-primitive@^1.0.1:
has-symbols "^1.0.2"
which-boxed-primitive "^1.0.2"
uncontrollable@^7.0.0:
uncontrollable@^7.2.1:
version "7.2.1"
resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738"
integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==