This commit is contained in:
AuroraLS3 2023-04-09 07:37:31 +00:00
parent ce3c19a332
commit a45817ca10
40 changed files with 835 additions and 546 deletions

View File

@ -5,6 +5,7 @@
# https://github.com/plan-player-analytics/Plan/wiki/Bukkit-Configuration
# -----------------------------------------------------
Server:
ServerName: Plan
IP: 0.0.0.0
Network:
Name: Plan

View File

@ -5,7 +5,7 @@ command:
description: "Název souboru zálohy (citlivé na velikost písmen)"
name: "záloha"
code:
description: "Kód použitý k dokončení registrace.."
description: "Kód použitý k dokončení registrace."
name: "${code}"
dbBackup:
description: "Typ databáze k zálohování. Použita aktuální databáze, pokud není specifikováno."
@ -54,7 +54,7 @@ command:
manage:
confirm: "> §cPřidejte '-a' argument k potvrzení provedení: ${0}"
confirmOverwrite: "Data v ${0} budou přepsána!"
confirmPartialRemoval: "Join Address Data for Server ${0} in ${1} will be removed!"
confirmPartialRemoval: "Data IP adres připojení pro server ${0} na ${1} byla smazána!"
confirmRemoval: "Data v ${0} budou smazána!"
fail: "> §cNěco se pokazilo: ${0}"
failFileNotFound: "> §cNenalezen soubor v ${0}"
@ -64,7 +64,7 @@ command:
failSameServer: "Nelze označit tento server jako odinstalován (Jste na něm)"
hotswap: "§eNezapomeňte přehodit na novou databázi (/plan db hotswap ${0}) & reload pluginu."
importers: "Importery:"
preparing: "Preparing.."
preparing: "Načítání.."
progress: "${0} / ${1} zpracovávání.."
start: "> §2Zpracovávám data.."
success: "> §aÚspěch!"
@ -163,27 +163,27 @@ command:
description: "Ukázat json Hráčských čistých dat."
inDepth: "Dovolí stáhnout hráčská data v json formátu. Všechna."
logout:
description: "Log out other users from the panel."
description: "Odhlášení ostatních uživatelů z panelu."
inDepth: "Vložte argument přezdívky hráče k odhlášení jiného uživatele, použijte * pro odhlášení všech."
migrateToOnlineUuids:
description: "Migrate offline uuid data to online uuids"
description: "Migrace offline uuid dat na online uuid"
network:
description: "Ukázat stránku sítě"
inDepth: "Získání odkazu k /network page, pouze na sítích."
inDepth: "Získání odkazu k /network stránce, pouze na sítích."
player:
description: "Ukázat stránku hráče"
inDepth: "Získání odkazu k /player page specifického hráče, či aktuálního."
inDepth: "Získání odkazu ke stránce /player specifického hráče, či aktuálního."
players:
description: "Ukázat stránku hráčů"
inDepth: "Získání odkazu k /players page k zobrazení seznamu hráčů."
inDepth: "Získání odkazu ke stránce /players k zobrazení seznamu hráčů."
register:
description: "Registrovat web uživatele"
inDepth: "Použijte bez argumentů k odkazu na stránku registrace. Použijte --code [kod] pro registraci k získání uživatele."
inDepth: "Použijte bez argumentů k odkazu na stránku registrace. Použijte --code [kód] pro registraci k získání uživatele."
reload:
description: "Restartuje plugin Plan"
inDepth: "Vypnout a zapnout plugin k obnově jakýchkoli změn v configu."
removejoinaddresses:
description: "Remove join addresses of a specified server"
description: "Odstranění adres připojení zadaného serveru"
search:
description: "Hledat podle jména hráče"
inDepth: "Zobrazit seznam všech hráčů souhlasísích s daným jménem."
@ -265,8 +265,8 @@ html:
authFailedTips: "- Ujistěte se, že jste zaregistrovaní s uživatelem s <b>/plan register</b><br>- Zkontrolujte zda je jméno a heslo správné<br>- Jméno a heslo jsou citlivá na velká/malá písmena<br><br>Pokud jste zapomněli heslo, zeptejte se člena týmu ke smazání vašeho starého uživatele či nové registraci."
noServersOnline: "Žádné online servery k vykonání žádosti."
playerNotSeen: "Hráč nebyl nenalezen."
serverNotExported: "Server doesn't exist, its data might not have been exported yet."
serverNotSeen: "Server doesn't exist"
serverNotExported: "Server neexistuje, je možné, že jeho data ještě nebyla exportována."
serverNotSeen: "Server neexistuje"
generic:
none: "Žádný"
label:
@ -277,26 +277,26 @@ html:
afkTime: "AFK čas"
all: "Vše"
allTime: "Celkově"
alphabetical: "Alphabetical"
alphabetical: "Abecední řazení"
apply: "Apply"
asNumbers: "statistiky"
average: "Average first session length"
average: "Průměrná délka prvního připojení"
averageActivePlaytime: "Průměrná herní aktivita"
averageAfkTime: "Průměrný AFK čas"
averageChunks: "Průměr chunků"
averageCpuUsage: "Average CPU Usage"
averageEntities: "Průměr entit"
averageChunks: "Průměr chunků"
averageCpuUsage: "Průměrné využití CPU"
averageEntities: "Průměr entit"
averageKdr: "Průměr KDR"
averageMobKdr: "Průměr Mob KDR"
averagePing: "Průměrný ping"
averagePlayers: "Average Players"
averagePlayers: "Průměrně hráčů"
averagePlaytime: "Průměr herní doby"
averageRamUsage: "Average RAM Usage"
averageServerDowntime: "Average Downtime / Server"
averageSessionLength: "Průměrná délka relace"
averageSessions: "Průměrná relace"
averageRamUsage: "Průměrné využití RAM"
averageServerDowntime: "Průměrná doba vypnutí / Serveru"
averageSessionLength: "Průměrná délka připojení"
averageSessions: "Průměr připojení"
averageTps: "Průměr TPS"
averageTps7days: "Average TPS (7 days)"
averageTps7days: "Proměr TPS (7 dní)"
banned: "Zabanován"
bestPeak: "Nejvíce hráčů"
bestPing: "Nejlepší ping"
@ -308,7 +308,7 @@ html:
cpuRam: "CPU & RAM"
cpuUsage: "CPU Usage"
currentPlayerbase: "Aktuální základna hráčů"
currentUptime: "Current Uptime"
currentUptime: "Aktuální doba zapnutí"
dayByDay: "Den po dni"
dayOfweek: "Den týdne"
deadliestWeapon: "Nejsmrtelnější PvP zbraň"
@ -318,72 +318,72 @@ html:
downtime: "Offline doba"
duringLowTps: "Při nízkých TPS:"
entities: "Entity"
exported: "Data export time"
exported: "Doba exportu dat"
favoriteServer: "Oblíbený server"
firstSession: "První relace"
firstSessionLength:
average: "Average first session length"
median: "Median first session length"
average: "Průměrná délka prvního připojení"
median: "Medián prvního připojení"
geoProjection:
dropdown: "Select projection"
equalEarth: "Equal Earth"
dropdown: "Zvolte projekci"
equalEarth: "Rovná země"
mercator: "Mercator"
miller: "Miller"
ortographic: "Ortographic"
ortographic: "Ortografie"
geolocations: "Geolokace"
help:
activityIndexBasis: "Activity index is based on non-AFK playtime in the past 3 weeks (21 days). Each week is considered separately."
activityIndexExample1: "If someone plays as much as threshold every week, they are given activity index ~3."
activityIndexExample2: "Very active is ~2x the threshold (y ≥ 3.75)."
activityIndexExample3: "The index approaches 5 indefinitely."
activityIndexVisual: "Here is a visualization of the curve where y = activity index, and x = playtime per week / threshold."
activityIndexWeek: "Week {}"
examples: "Examples"
activityIndexBasis: "Index aktivity vychází z času stráveného hraním mimo AFK za poslední 3 týdny (21 dní). Každý týden se posuzuje zvlášť."
activityIndexExample1: "Pokud někdo hraje každý týden tolik, kolik je limit, má index aktivity ~3."
activityIndexExample2: "Velmi aktivní je ~2x prahová hodnota (y ≥ 3,75)."
activityIndexExample3: "Index se neomezeně blíží hodnotě 5."
activityIndexVisual: "Zde je vizualizace křivky, kde y = index aktivity a x = doba hraní za týden / prahová hodnota."
activityIndexWeek: "Týden {}"
examples: "Příklady"
graph:
labels: "You can hide/show a group by clicking on the label at the bottom."
title: "Graph"
zoom: "You can Zoom in by click + dragging on the graph."
playtimeUnit: "hours"
labels: "Skupinu můžete skrýt/zobrazit kliknutím na štítek v dolní části."
title: "Graf"
zoom: "Graf si můžete přiblížit kliknutím a táhnutím."
playtimeUnit: "hodiny"
retention:
calculationStep1: "First the data is filtered using '<>' option. Any players with 'registerDate' outside the time range are ignored."
calculationStep2: "Then it is grouped into groups of players using '<0>' option, eg. With '<1>': All players who registered in January 2023, February 2023, etc"
calculationStep3: "Then the '<0>' and '<1>' options select which visualization to render."
calculationStep4: "'<>' controls how many points the graph has, eg. 'Days' has one point per day."
calculationStep5: "On each calculated point all players are checked for the condition."
calculationStep6: "Select X Axis below to see conditions."
calculationStepDate: "This visualization shows the different groups of players that are still playing on your server. The visualization uses lastSeen date. If x < lastSeenDate, the player is visible on the graph."
calculationStepDeltas: "This visualization is most effective using Player Count as the Y Axis. The visualization shows net gain of players (How many players joined minus players who stopped playing). The visualization uses both registered and lastSeen dates. If registerDate < x < lastSeenDate, the player is visible on the graph."
calculationStepPlaytime: "This visualization tells how long the gameplay loop keeps players engaged on your server. The visualization uses playtime. If x < playtime, the player is visible on the graph."
calculationStepTime: "This visualization tells how long people keep coming back to play on the server after they join the first time. The visualization uses timeDifference. If x < timeDifference, the player is visible on the graph."
compareJoinAddress: "Grouping by join address allows measuring advertising campaigns on different sites."
compareMonths: "You can compare different months by changing the '<0>' option to '<1>'"
calculationStep1: "Nejprve se data filtrují pomocí možnosti '<>'. Hráči s 'registerDate' mimo časový rozsah jsou ignorováni."
calculationStep2: "Poté je rozdělíme do skupin hráčů pomocí možnosti '<0>', např. pomocí '<1>': Všichni hráči, kteří se zaregistrovali v lednu 2023, únoru 2023 atd."
calculationStep3: "Možnosti '<0>' a '<1>' pak vybírají, která vizualizace se má vykreslit."
calculationStep4: "'<>' řídí, kolik bodů má graf, např. 'Days' má jeden bod za den."
calculationStep5: "V každém vypočteném bodě se u všech hráčů kontroluje, zda je splněna podmínka."
calculationStep6: "Pro zobrazení podmínek vyberte níže uvedenou osu X."
calculationStepDate: "Tato vizualizace zobrazuje různé skupiny hráčů, kteří stále hrají na vašem serveru. Vizualizace používá datum lastSeen. Pokud x < lastSeenDate, je hráč v grafu viditelný."
calculationStepDeltas: "Tato vizualizace je nejefektivnější při použití počtu hráčů jako osy Y. Vizualizace ukazuje čistý přírůstek hráčů (kolik hráčů se připojilo mínus hráči, kteří přestali hrát). Vizualizace používá data registrovaných i naposledy viděných hráčů. Pokud je registerDate < x < lastSeenDate, hráč je v grafu viditelný."
calculationStepPlaytime: "Tato vizualizace ukazuje, jak dlouho se hráči na vašem serveru věnují hraní. Vizualizace využívá dobu hraní. Pokud je x < době hraní, je hráč na grafu viditelný."
calculationStepTime: "Tato vizualizace ukazuje, jak dlouho se lidé vracejí hrát na server poté, co se připojili poprvé. Vizualizace využívá funkci timeDifference. Pokud je x < timeDifference, je hráč v grafu viditelný."
compareJoinAddress: "Seskupení podle adresy připojení umožňuje měřit reklamní kampaně na různých stránkách."
compareMonths: "Různé měsíce můžete porovnat změnou možnosti '<0>' na '<1>'."
examples:
adCampaign: "Comparing player gain of different ad campaigns using different Join Addresses (anonymized)"
deltas: "<> shows net gain of players."
pattern: "A general pattern emerges when all players start leaving the server at the same time"
plateau: "Comparing player gain of different months. Plateaus suggest there were players Plan doesn't know about. In this example Plan was installed in January 2022."
playtime: "Playtime tells how long the gameplay loop keeps players engaged on your server."
stack: "Cumulative player gain can be checked with stacked player count as Y axis"
howIsItCalculated: "How it is calculated"
howIsItCalculatedData: "The graph is generated from player data:"
options: "Select the options to analyze different aspects of Player Retention."
retentionBasis: "New player retention is calculated based on session data. If a registered player has played within latter half of the timespan, they are considered retained."
testPrompt: "Test it out:"
testResult: "Test result"
threshold: "Threshold"
thresholdUnit: "hours / week"
tips: "Tips"
usingTheGraph: "Using the Graph"
adCampaign: "Srovnání zisku hráčů z různých reklamních kampaní s použitím různých adres pro připojení (anonymizované)"
deltas: "<> ukazuje čistý zisk hráčů."
pattern: "Když všichni hráči začnou opouštět server ve stejnou dobu, objeví se obecný vzorec."
plateau: "Srovnání zisku hráčů v různých měsících. Plochy naznačují, že existují hráči, o kterých Plan neví. V tomto příkladu byl Plan nainstalován v lednu 2022."
playtime: "Doba hraní udává, jak dlouho jsou hráči na vašem serveru zapojeni do herní smyčky."
stack: "Kumulativní zisk hráčů lze zkontrolovat pomocí počtu hráčů na hromádce jako osy Y."
howIsItCalculated: "Jak se vypočítává"
howIsItCalculatedData: "Graf je generován z údajů o hráči:"
options: "Vyberte možnosti pro analýzu různých aspektů udržení hráčů."
retentionBasis: "Udržení nových hráčů se vypočítává na základě údajů o relacích. Pokud registrovaný hráč hrál v druhé polovině časového období, je považován za udrženého."
testPrompt: "Vyzkoušejte si to:"
testResult: "Výsledek testu"
threshold: "Prahová hodnota"
thresholdUnit: "hodin / týdnů"
tips: "Tipy"
usingTheGraph: "Použití grafu"
hourByHour: "Hodina po hodině"
inactive: "Neaktivní"
indexInactive: "Neaktivní"
indexRegular: "Pravidelný"
information: "INFORMACE"
insights: "Insights"
insights: "Postřehy"
insights30days: "Postřehy za 30 dní"
irregular: "Nepravidelný"
joinAddress: "Join Address"
joinAddresses: "Připojovací IP"
joinAddress: "Adresa Připojení"
joinAddresses: "IP Připojení"
kdr: "KDR"
killed: "Zabit"
last24hours: "Posledních 24 hodin"
@ -392,7 +392,7 @@ html:
lastConnected: "Poslední připojení"
lastPeak: "Naposledy nejvíce hráčů"
lastSeen: "Naposledy viděn"
latestJoinAddresses: "Latest Join Addresses"
latestJoinAddresses: "Poslední adresy pro připojení"
length: " Délka"
links: "ODKAZY"
loadedChunks: "Načtené chunky"
@ -401,9 +401,9 @@ html:
loneNewbieJoins: "Samotná připojení nováčků"
longestSession: "Nejdelší relace"
lowTpsSpikes: "Nejnižší TPS"
lowTpsSpikes7days: "Low TPS Spikes (7 days)"
lowTpsSpikes7days: "Nízké hodnoty TPS (7 dní)"
maxFreeDisk: "Max. volného disku"
medianSessionLength: "Median Session Length"
medianSessionLength: "Medián délky relace"
minFreeDisk: "Min. volného disku"
mobDeaths: "Smrti způsobené moby"
mobKdr: "Mob KDR"
@ -419,9 +419,9 @@ html:
new: "Nový"
newPlayerRetention: "Udržení nových hráčů"
newPlayers: "Noví hráči"
newPlayers7days: "New Players (7 days)"
newPlayers7days: "Noví hráči (7 dní)"
nickname: "Přezdívka"
noDataToDisplay: "No Data to Display"
noDataToDisplay: "Žádná data k zobrazení"
now: "Nyní"
onlineActivity: "Online aktivita"
onlineActivityAsNumbers: "Online aktivita v číslech"
@ -437,21 +437,21 @@ html:
player: "Hráč"
playerDeaths: "Smrti způsobené hráči"
playerKills: "Zabití hráči"
playerKillsVictimIndicator: "Player was killed within 24h of first time they were seen (Time since registered: <>)."
playerKillsVictimIndicator: "Hráč byl zabit do 24 hodin od doby, kdy se poprvé připojil (Čas od registrace): <>)."
playerList: "Seznam hráčů"
playerOverview: "Přehled hráče"
playerPage: "Stránka hráče"
playerRetention: "Player Retention"
playerRetention: "Udržení hráčů"
playerbase: "Hráči"
playerbaseDevelopment: "Vývoj aktivity hráčů"
playerbaseOverview: "Playerbase Overview"
playerbaseOverview: "Přehled hráčské základny"
players: "Hráči"
playersOnline: "Hráči online"
playersOnlineNow: "Players Online (Now)"
playersOnlineNow: "Hráči online (Nyní)"
playersOnlineOverview: "Přehled online aktivity"
playtime: "Herní čas"
plugins: "Pluginy"
pluginsOverview: "Plugins Overview"
pluginsOverview: "Přehled pluginů"
punchcard: "Štítky"
punchcard30days: "Štítek pro 30 dní"
pvpPve: "PvP & PvE"
@ -459,7 +459,7 @@ html:
query: "Vytvořit dotaz"
quickView: "Rychlé zobrazení"
ram: "RAM"
ramUsage: "RAM Usage"
ramUsage: "Využití RAM"
recentKills: "Poslední zabití"
recentPvpDeaths: "Poslední PvP smrti"
recentPvpKills: "Poslední PvP zabití"
@ -470,56 +470,56 @@ html:
regularPlayers: "Pravidelní hráči"
relativeJoinActivity: "Relativní aktivita připojení"
retention:
groupByNone: "No grouping"
groupByTime: "Group registered by"
inAnytime: "any time"
inLast180d: "in the last 6 months"
inLast30d: "in the last 30 days"
inLast365d: "in the last 12 months"
inLast730d: "in the last 24 months"
inLast7d: "in the last 7 days"
inLast90d: "in the last 3 months"
playersRegisteredInTime: "Players who registered"
retainedPlayersPercentage: "Retained Players %"
timeSinceRegistered: "Time since register date"
timeStep: "Time step"
groupByNone: "Žádné seskupení"
groupByTime: "Skupina registrovaná"
inAnytime: "kdykoli"
inLast180d: "za posledních 6 měsíců"
inLast30d: "za posledních 30 dní"
inLast365d: "za posledních 12 měsících"
inLast730d: "za posledních 24 měsícíců"
inLast7d: "za posledních 7 dní"
inLast90d: "za posledních 90 měsíců"
playersRegisteredInTime: "Hráči, kteří se zaregistrovali"
retainedPlayersPercentage: "Zadržení hráči %"
timeSinceRegistered: "Doba od data registrace"
timeStep: "Časový posun"
secondDeadliestWeapon: "2. PvP Zbraň"
seenNicknames: "Viděné přezdívky"
server: "Server"
serverAnalysis: "Analýza serveru"
serverAsNumberse: "Statistiky serveru"
serverCalendar: "Server Calendar"
serverDowntime: "Server offline"
serverOccupied: "Server plný"
serverCalendar: "Kalendář serveru"
serverDowntime: "Server je offline"
serverOccupied: "Server je plný"
serverOverview: "Přehled serveru"
serverPage: "Stránka serveru"
serverPlaytime: "Herní čas serveru"
serverPlaytime30days: "Herní čas serveru za 30 dní"
serverSelector: "Server selector"
serverSelector: "Výběr serveru"
servers: "Servery"
serversTitle: "SERVERY"
session: "Relace"
sessionCalendar: "Session Calendar"
sessionCalendar: "Kalendář relací"
sessionEnded: " Ukončeno"
sessionMedian: "Střední hodnota relací"
sessionStart: "Započatá relace"
sessions: "Relace"
sortBy: "Sort By"
stacked: "Stacked"
sortBy: "Seřadit podle"
stacked: "Zaplnění"
themeSelect: "Zvolené téma"
thirdDeadliestWeapon: "3. PvP Zbraň"
thirtyDays: "30 dní"
thirtyDaysAgo: "před 30 dny"
time:
date: "Date"
day: "Day"
days: "Days"
hours: "Hours"
month: "Month"
months: "Months"
week: "Week"
weeks: "Weeks"
year: "Year"
date: "Datum"
day: "Den"
days: "D"
hours: "Hodin"
month: "Měsíc"
months: "Měsíců"
week: "Týden"
weeks: "Týdnů"
year: "Rok"
timesKicked: "Počet vykopnutí"
toMainPage: "Zpět na hlavní stránku"
total: "Total"
@ -528,15 +528,15 @@ html:
totalPlayers: "Hráčů celkem"
totalPlayersOld: "Celkem hráčů"
totalPlaytime: "Herní doba celkem"
totalServerDowntime: "Total Server Downtime"
totalServerDowntime: "Celková doba vypnutí serveru"
tps: "TPS"
trend: "Trend"
trends30days: "Trendy za 30 dní"
uniquePlayers: "Unikátní hráči"
uniquePlayers7days: "Unique Players (7 days)"
uniquePlayers7days: "Unikátních hráčů (7 dní)"
unit:
percentage: "Percentage"
playerCount: "Player Count"
percentage: "Procento"
playerCount: "Počet hráčů"
veryActive: "Velmi aktivní"
weekComparison: "Týdenní srovnání"
weekdays: "'Pondělí', 'Úterý', 'Středa', 'Čtvrtek', 'Pátek', 'Sobota', 'Neděle'"
@ -547,7 +547,7 @@ html:
yAxis: "Y Axis"
login:
failed: "Přihlašování selhalo: "
forgotPassword: "Zapomněl jste heslo?"
forgotPassword: "Zapomněli jste heslo?"
forgotPassword1: "Zapomněl jste heslo? Odregistruj se a registruj se znovu."
forgotPassword2: "Pro odstranění aktuálního uživatele použij následující příkaz ve hře:"
forgotPassword3: "Nebo použij konzoli:"
@ -587,19 +587,19 @@ html:
name: "Ban status"
banned: "Zabanovaní"
country:
text: "have joined from country"
text: "se připojili ze země"
generic:
allPlayers: "Všichni hráči"
and: "a "
start: "hráčů, kteří"
hasPlayedOnServers:
name: "Has played on one of servers"
text: "have played on at least one of"
name: "Hrál na jednom ze serverů"
text: "hrál alespoň na jednom z"
hasPluginBooleanValue:
name: "Has plugin boolean value"
text: "have Plugin boolean value"
name: "Plugin má logickou hodnotu"
text: "plugin má logickou hodnotu"
joinAddress:
text: "joined with address"
text: "se připojil za pomoci ip"
nonOperators: "Bez OP"
notBanned: "Nezabanovaní"
operatorStatus:
@ -625,10 +625,10 @@ html:
from: ">od</label>"
makeAnother: "Vytvořit další dotaz"
servers:
all: "using data of all servers"
many: "using data of {number} servers"
single: "using data of 1 server"
two: "using data of 2 servers"
all: "použití dat všech serverů"
many: "použít data {number} serverů"
single: "použít data 1 serveru"
two: "použít data 2 serverů"
to: ">do</label>"
view: "Zobrazit pohled"
performQuery: "Provést dotaz!"
@ -692,9 +692,9 @@ plugin:
processingComplete: "Zpracování dokončeno."
savingSessions: "Ukládání nedokončené relace."
savingSessionsTimeout: "Překročen časový limit, ukládánm nedokončené relace pro příští spojení."
waitingDb: "Čekání na dokončení dotazu, aby se zabránilo pádu JVM SQLite.."
waitingDb: "Čekání na dokončení dotazu, aby se zabránilo pádu JVM SQLite."
waitingDbComplete: "Uzavřené připojení SQLite."
waitingTransactions: "Čekám na nedokončené transakce, aby nedošlo ke ztrátě dat.."
waitingTransactions: "Čekám na nedokončené transakce, aby nedošlo ke ztrátě dat."
waitingTransactionsComplete: "Fronta Transakce uzavřena."
webserver: "Webserver je již vypnutý."
enable:
@ -721,9 +721,9 @@ plugin:
dbNotifySQLiteWAL: "SQLite WAL mód není podporován na verzi tohoto serveru, používám default. Toto může či nemusí ovlivnit výkon."
dbPatchesAlreadyApplied: "Všechny databáze již jsou aktualizovány."
dbPatchesApplied: "Všechny databáze byly úspěšně aktualizovány."
dbSchemaPatch: "Database: Making sure schema is up to date.."
loadedServerInfo: "Server identifier loaded: ${0}"
loadingServerInfo: "Loading server identifying information"
dbSchemaPatch: "Databáze: Zajištění aktuálnosti schématu.."
loadedServerInfo: "Načtený identifikátor serveru: ${0}"
loadingServerInfo: "Načítání identifikačních informací serveru"
no: "Ne"
today: "'Dnes'"
unavailable: "Nedostupné"

View File

@ -5,11 +5,11 @@
"private": true,
"proxy": "http://localhost:8800",
"dependencies": {
"@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/fontawesome-free": "^6.4.0",
"@fortawesome/fontawesome-svg-core": "^6.4.0",
"@fortawesome/free-brands-svg-icons": "^6.4.0",
"@fortawesome/free-regular-svg-icons": "^6.4.0",
"@fortawesome/free-solid-svg-icons": "^6.4.0",
"@fortawesome/react-fontawesome": "^0.2.0",
"@fullcalendar/bootstrap": "^5.11.4",
"@fullcalendar/daygrid": "^5.11.4",
@ -18,13 +18,13 @@
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^14.0.0",
"@testing-library/user-event": "^14.4.3",
"axios": "^1.3.4",
"axios": "^1.3.5",
"bootstrap": "^5.2.3",
"datatables.net": "^1.13.4",
"datatables.net-bs5": "^1.13.4",
"datatables.net-responsive-bs5": "^2.4.1",
"highcharts": "^10.3.3",
"i18next": "^22.4.13",
"i18next": "^22.4.14",
"i18next-chained-backend": "^4.2.0",
"i18next-http-backend": "^2.2.0",
"i18next-localstorage-backend": "^4.1.0",
@ -37,9 +37,9 @@
"react-mcjsonchat": "^1.0.0",
"react-router-dom": "6",
"react-scripts": "5.0.1",
"sass": "^1.60.0",
"sass": "^1.61.0",
"source-map-explorer": "^2.5.2",
"swagger-ui": "^4.18.1",
"swagger-ui": "^4.18.2",
"web-vitals": "^3.0.2"
},
"scripts": {

View File

@ -49,7 +49,6 @@ const Accordion = ({headers, slices, open, style}) => {
}
const width = headers.length;
return (
<table className={"table accordion-striped" + (nightModeEnabled ? " table-dark" : '')} id="tableAccordion"
style={style}>

View File

@ -48,7 +48,8 @@ const QueryPath = () => {
return (
<aside id={"result-path"} className={"alert shadow " + (hasResults ? "alert-success" : "alert-warning")}>
{path.map((step, i) => <p key={i} style={{marginBottom: 0, marginLeft: i * 0.7 + "rem"}}>
{path.map((step, i) => <p key={step.kind + step.size}
style={{marginBottom: 0, marginLeft: i * 0.7 + "rem"}}>
<FontAwesomeIcon
icon={faFilter}/> '{getReadableFilterName(step.kind)}' matched {step.size} players
</p>)}

View File

@ -1,11 +1,11 @@
import React, {useEffect, useState} from 'react';
import {Transition} from 'react-transition-group';
const reduceAnimations = window.matchMedia(`(prefers-reduced-motion: reduce)`) === true;
const defaultDuration = 250;
const LoadIn = ({children, duration}) => {
if (!duration) duration = defaultDuration;
const reduceAnimations = window.matchMedia(`(prefers-reduced-motion: reduce)`).matches;
const defaultStyle = reduceAnimations ? {
transition: `opacity ${duration}ms ease-in-out`,

View File

@ -22,8 +22,8 @@ const ProjectionDropDown = ({projection, setProjection}) => {
<Dropdown.Menu>
<h6 className="dropdown-header">{t('html.label.geoProjection.dropdown')}</h6>
{projectionOptions.map((option, i) => (
<Dropdown.Item key={i} onClick={() => setProjection(option)}>
{projectionOptions.map(option => (
<Dropdown.Item key={option} onClick={() => setProjection(option)}>
{t(option)}
</Dropdown.Item>
))}

View File

@ -1,4 +1,4 @@
import React from 'react';
import React, {useEffect, useMemo, useState} from 'react';
import CardTabs from "../../CardTabs";
import {
faDragon,
@ -39,41 +39,7 @@ const PerformanceGraphsCard = ({data}) => {
const {t} = useTranslation();
const {networkMetadata} = useMetadata();
if (!data || !Object.values(data).length) return <CardLoader/>
const zones = {
tps: [{
value: data.zones.tpsThresholdMed,
color: data.colors.low
}, {
value: data.zones.tpsThresholdHigh,
color: data.colors.med
}, {
value: 30,
color: data.colors.high
}],
disk: [{
value: data.zones.diskThresholdMed,
color: data.colors.low
}, {
value: data.zones.diskThresholdHigh,
color: data.colors.med
}, {
value: Number.MAX_VALUE,
color: data.colors.high
}]
};
const serverData = [];
for (let i = 0; i < data.servers.length; i++) {
const server = data.servers[i];
const values = data.values[i];
serverData.push({
serverName: server.serverName,
values
});
}
const series = {
const [performanceSeries, setPerformanceSeries] = useState({
players: [],
tps: [],
cpu: [],
@ -81,75 +47,148 @@ const PerformanceGraphsCard = ({data}) => {
entities: [],
chunks: [],
disk: []
}
});
const spline = 'spline';
useEffect(() => {
if (!data?.zones) return;
for (const server of serverData) {
series.players.push({
name: server.serverName, type: spline, tooltip: tooltip.zeroDecimals,
data: server.values.playersOnline, color: data.colors.playersOnline, yAxis: 0
});
series.tps.push({
name: server.serverName, type: spline, tooltip: tooltip.twoDecimals,
data: server.values.tps, color: data.colors.high, zones: zones.tps, yAxis: 0
});
series.cpu.push({
name: server.serverName, type: spline, tooltip: tooltip.twoDecimals,
data: server.values.cpu, color: data.colors.cpu, yAxis: 0
});
series.ram.push({
name: server.serverName, type: spline, tooltip: tooltip.zeroDecimals,
data: server.values.ram, color: data.colors.ram, yAxis: 0
});
series.entities.push({
name: server.serverName, type: spline, tooltip: tooltip.zeroDecimals,
data: server.values.entities, color: data.colors.entities, yAxis: 0
});
series.chunks.push({
name: server.serverName, type: spline, tooltip: tooltip.zeroDecimals,
data: server.values.chunks, color: data.colors.chunks, yAxis: 0
});
series.disk.push({
name: server.serverName, type: spline, tooltip: tooltip.zeroDecimals,
data: server.values.disk, color: data.colors.high, zones: zones.disk, yAxis: 0
});
}
const zones = {
tps: [{
value: data.zones.tpsThresholdMed,
color: data.colors.low
}, {
value: data.zones.tpsThresholdHigh,
color: data.colors.med
}, {
value: 30,
color: data.colors.high
}],
disk: [{
value: data.zones.diskThresholdMed,
color: data.colors.low
}, {
value: data.zones.diskThresholdHigh,
color: data.colors.med
}, {
value: Number.MAX_VALUE,
color: data.colors.high
}]
};
const serverData = [];
for (let i = 0; i < data.servers.length; i++) {
const server = data.servers[i];
const values = data.values[i];
serverData.push({
serverName: server.serverName,
values
});
}
const series = {
players: [],
tps: [],
cpu: [],
ram: [],
entities: [],
chunks: [],
disk: []
}
const spline = 'spline';
const changeColor = (colorHex, index) => {
// TODO Convert color somehow using index
return colorHex;
}
const minuteResolution = point => {
// Ensure that the points can be stacked by moving data to minute level
point[0] -= (point[0] % 60000);
return point;
}
serverData.forEach((server, i) => {
const playersOnlineColor = changeColor(data.colors.playersOnline, i);
const tpsColor = changeColor(data.colors.high, i);
const tpsZone = [...zones.tps]
tpsZone.forEach(zone => zone.color = changeColor(zone.color, i));
const cpuColor = changeColor(data.colors.cpu, i);
const ramColors = changeColor(data.colors.ram, i);
const entitiesColor = changeColor(data.colors.entities, i);
const chunksColor = changeColor(data.colors.chunks, i);
const diskColor = changeColor(data.colors.high, i);
const diskZones = [...zones.disk];
diskZones.forEach(zone => zone.color = changeColor(zone.color, i));
series.players.push({
name: server.serverName, type: spline, tooltip: tooltip.zeroDecimals,
data: server.values.playersOnline.map(minuteResolution), color: playersOnlineColor, yAxis: 0
});
series.tps.push({
name: server.serverName, type: spline, tooltip: tooltip.twoDecimals,
data: server.values.tps.map(minuteResolution), color: tpsColor, zones: tpsZone, yAxis: 0
});
series.cpu.push({
name: server.serverName, type: spline, tooltip: tooltip.twoDecimals,
data: server.values.cpu.map(minuteResolution), color: cpuColor, yAxis: 0
});
series.ram.push({
name: server.serverName, type: spline, tooltip: tooltip.zeroDecimals,
data: server.values.ram.map(minuteResolution), color: ramColors, yAxis: 0
});
series.entities.push({
name: server.serverName, type: spline, tooltip: tooltip.zeroDecimals,
data: server.values.entities.map(minuteResolution), color: entitiesColor, yAxis: 0
});
series.chunks.push({
name: server.serverName, type: spline, tooltip: tooltip.zeroDecimals,
data: server.values.chunks.map(minuteResolution), color: chunksColor, yAxis: 0
});
series.disk.push({
name: server.serverName, type: spline, tooltip: tooltip.zeroDecimals,
data: server.values.disk.map(minuteResolution), color: diskColor, zones: diskZones, yAxis: 0
});
});
setPerformanceSeries(series);
}, [data, setPerformanceSeries])
const tabs = useMemo(() => [
{
name: t('html.label.playersOnline'), icon: faUser, color: 'light-blue', href: 'players-online',
element: <Tab data={performanceSeries.players} yAxis={yAxisConfigurations.PLAYERS_ONLINE}/>
}, {
name: t('html.label.tps'), icon: faTachometerAlt, color: 'red', href: 'tps',
element: <Tab data={performanceSeries.tps} yAxis={yAxisConfigurations.TPS}/>
}, {
name: t('html.label.cpu'), icon: faTachometerAlt, color: 'amber', href: 'cpu',
element: <Tab data={performanceSeries.cpu} yAxis={yAxisConfigurations.CPU}/>
}, {
name: t('html.label.ram'), icon: faMicrochip, color: 'light-green', href: 'ram',
element: <Tab data={performanceSeries.ram} yAxis={yAxisConfigurations.RAM_OR_DISK}/>
}, {
name: t('html.label.entities'), icon: faDragon, color: 'purple', href: 'entities',
element: <Tab data={performanceSeries.entities} yAxis={yAxisConfigurations.ENTITIES}/>
}, {
name: t('html.label.loadedChunks'), icon: faMap, color: 'blue-grey', href: 'chunks',
element: <Tab data={performanceSeries.chunks} yAxis={yAxisConfigurations.CHUNKS}/>
}, {
name: t('html.label.diskSpace'), icon: faHdd, color: 'green', href: 'disk',
element: <Tab data={performanceSeries.disk} yAxis={yAxisConfigurations.RAM_OR_DISK}/>
}, {
name: t('html.label.ping'), icon: faSignal, color: 'amber', href: 'ping',
element: networkMetadata ? <PingTab identifier={networkMetadata.currentServer.serverUUID}/> :
<ChartLoader/>
},
], [performanceSeries, networkMetadata, t]);
if (!data || !Object.values(data).length) return <CardLoader/>
if (data.errors.length) {
return <ErrorViewCard error={data.errors[0]}/>
}
return (
<Card>
<CardTabs tabs={[
{
name: t('html.label.playersOnline'), icon: faUser, color: 'light-blue', href: 'players-online',
element: <Tab data={series.players} yAxis={yAxisConfigurations.PLAYERS_ONLINE}/>
}, {
name: t('html.label.tps'), icon: faTachometerAlt, color: 'red', href: 'tps',
element: <Tab data={series.tps} yAxis={yAxisConfigurations.TPS}/>
}, {
name: t('html.label.cpu'), icon: faTachometerAlt, color: 'amber', href: 'cpu',
element: <Tab data={series.cpu} yAxis={yAxisConfigurations.CPU}/>
}, {
name: t('html.label.ram'), icon: faMicrochip, color: 'light-green', href: 'ram',
element: <Tab data={series.ram} yAxis={yAxisConfigurations.RAM_OR_DISK}/>
}, {
name: t('html.label.entities'), icon: faDragon, color: 'purple', href: 'entities',
element: <Tab data={series.entities} yAxis={yAxisConfigurations.ENTITIES}/>
}, {
name: t('html.label.loadedChunks'), icon: faMap, color: 'blue-grey', href: 'chunks',
element: <Tab data={series.chunks} yAxis={yAxisConfigurations.CHUNKS}/>
}, {
name: t('html.label.diskSpace'), icon: faHdd, color: 'green', href: 'disk',
element: <Tab data={series.disk} yAxis={yAxisConfigurations.RAM_OR_DISK}/>
}, {
name: t('html.label.ping'), icon: faSignal, color: 'amber', href: 'ping',
element: networkMetadata ? <PingTab identifier={networkMetadata.currentServer.serverUUID}/> :
<ChartLoader/>
},
]}/>
<CardTabs tabs={tabs}/>
</Card>
)
};

View File

@ -23,8 +23,8 @@ const SortDropDown = ({sortBy, sortReversed, setSortBy}) => {
<Dropdown.Menu>
<h6 className="dropdown-header">{t('html.label.sortBy')}</h6>
{sortOptions.map((option, i) => (
<Dropdown.Item key={i} onClick={() => setSortBy(option)}>
{sortOptions.map(option => (
<Dropdown.Item key={option} onClick={() => setSortBy(option)}>
{t(option.label)}
</Dropdown.Item>
))}

View File

@ -27,7 +27,7 @@ const NicknamesCard = ({player}) => {
</tr>
</thead>
<tbody>
{player.nicknames.map((nickname, i) => (<tr key={'nick-' + i}>
{player.nicknames.map(nickname => (<tr key={JSON.stringify(nickname)}>
<td dangerouslySetInnerHTML={{__html: nickname.nickname}}/>
<td>{nickname.server}</td>
<td>{nickname.date}</td>

View File

@ -51,8 +51,8 @@ const FilterDropdown = ({filterOptions, filters, setFilters}) => {
<Dropdown.Menu popperConfig={{strategy: "absolute"}}>
<h6 className="dropdown-header">{t('html.query.filters.add')}</h6>
<Scrollable>
{filterOptions.map((option, i) => (
<Dropdown.Item key={i} onClick={() => addFilter(option)}>
{filterOptions.map(option => (
<Dropdown.Item key={option} onClick={() => addFilter(option)}>
{getReadableFilterName(option)}
</Dropdown.Item>
))}

View File

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

View File

@ -10,15 +10,34 @@ import {ChartLoader} from "../../../navigation/Loader";
import TimeByTimeGraph from "../../../graphs/TimeByTimeGraph";
import PlayersOnlineGraph from "../../../graphs/PlayersOnlineGraph";
import {useMetadata} from "../../../../hooks/metadataHook";
import StackedPlayersOnlineGraph from "../../../graphs/StackedPlayersOnlineGraph";
const PlayersOnlineTab = () => {
const {serverUUID} = useMetadata();
const SingleProxyPlayersOnlineGraph = ({serverUUID}) => {
const {data, loadingError} = useDataRequest(fetchPlayersOnlineGraph, [serverUUID]);
if (loadingError) return <ErrorViewBody error={loadingError}/>
if (!serverUUID || !data) return <ChartLoader/>;
return <PlayersOnlineGraph data={data}/>
}
const MultiProxyPlayersOnlineGraph = () => {
const {data, loadingError} = useDataRequest(fetchPlayersOnlineGraph, []);
if (loadingError) return <ErrorViewBody error={loadingError}/>
if (!data) return <ChartLoader/>;
return <PlayersOnlineGraph data={data}/>
return <StackedPlayersOnlineGraph data={data}/>
}
const PlayersOnlineTab = () => {
const {serverUUID, networkMetadata} = useMetadata();
if (networkMetadata.usingRedisBungee || networkMetadata.servers.filter(server => server.proxy).length === 1) {
return <SingleProxyPlayersOnlineGraph serverUUID={serverUUID}/>
} else {
return <MultiProxyPlayersOnlineGraph/>
}
}
const DayByDayTab = () => {

View File

@ -3,12 +3,24 @@ import PerformanceAsNumbersTable from "../../../table/PerformanceAsNumbersTable"
import CardHeader from "../../CardHeader";
import {faBookOpen} from "@fortawesome/free-solid-svg-icons";
import {Card} from "react-bootstrap";
import {useTranslation} from "react-i18next";
const PerformanceAsNumbersCard = ({data, servers}) => {
const {t} = useTranslation();
const noData24h = data && "Unavailable" === data.cpu_24h;
const noData7d = data && "Unavailable" === data.cpu_7d;
const noData30d = data && "Unavailable" === data.cpu_30d;
const noDataAlert = noData30d ? <p className={"alert alert-warning mb-0"}>{t('html.description.noData30d')}</p>
: (noData7d ? <p className={"alert alert-warning mb-0"}>{t('html.description.noData7d')}</p>
: (noData24h ? <p className={"alert alert-warning mb-0"}>{t('html.description.noData24h')}</p>
: ''));
const PerformanceAsNumbersCard = ({data}) => {
return (
<Card>
<CardHeader icon={faBookOpen} color="blue-grey" label={'html.label.performanceAsNumbers'}/>
<PerformanceAsNumbersTable data={data}/>
{noDataAlert}
<PerformanceAsNumbersTable data={data} servers={servers}/>
</Card>
)
};

View File

@ -23,28 +23,36 @@ const PlayerbaseTrendsCard = ({data}) => {
headers={[t('html.label.thirtyDaysAgo'), t('html.label.now'), t('html.label.trend')]}>
<TableRow icon={faUsers} color="black" text={t('html.label.totalPlayers')}
values={[data.total_players_then, data.total_players_now,
<BigTrend trend={data.total_players_trend}/>]}/>
<BigTrend key={JSON.stringify(data.total_players_trend)}
trend={data.total_players_trend}/>]}/>
<TableRow icon={faUsers} color="lime" text={t('html.label.regularPlayers')}
values={[data.regular_players_then, data.regular_players_now,
<BigTrend trend={data.regular_players_trend}/>]}/>
<BigTrend key={JSON.stringify(data.regular_players_trend)}
trend={data.regular_players_trend}/>]}/>
<TableRow icon={faClock} color="green"
text={t('html.label.averagePlaytime') + ' ' + t('html.label.perPlayer')}
values={[data.playtime_avg_then, data.playtime_avg_now,
<BigTrend trend={data.playtime_avg_trend}/>]}/>
<BigTrend key={JSON.stringify(data.total_players_trend)}
trend={data.playtime_avg_trend}/>]}/>
<TableRow icon={faClock} color="gray" text={t('html.label.afk') + ' ' + t('html.label.perPlayer')}
values={[data.afk_then, data.afk_now, <BigTrend trend={data.afk_trend}/>]}/>
values={[data.afk_then, data.afk_now,
<BigTrend key={JSON.stringify(data.afk_trend)}
trend={data.afk_trend}/>]}/>
<TableRow icon={faClock} color="green"
text={t('html.label.averagePlaytime') + ' ' + t('html.label.perRegularPlayer')}
values={[data.regular_playtime_avg_then, data.regular_playtime_avg_now,
<BigTrend trend={data.regular_playtime_avg_trend}/>]}/>
<BigTrend key={JSON.stringify(data.regular_playtime_avg_trend)}
trend={data.regular_playtime_avg_trend}/>]}/>
<TableRow icon={faClock} color="teal"
text={t('html.label.averageSessionLength') + ' ' + t('html.label.perRegularPlayer')}
values={[data.regular_session_avg_then, data.regular_session_avg_now,
<BigTrend trend={data.regular_session_avg_trend}/>]}/>
<BigTrend key={JSON.stringify(data.regular_session_avg_trend)}
trend={data.regular_session_avg_trend}/>]}/>
<TableRow icon={faClock} color="gray"
text={t('html.label.afk') + ' ' + t('html.label.perRegularPlayer')}
values={[data.regular_afk_avg_then, data.regular_afk_avg_now,
<BigTrend trend={data.regular_afk_avg_trend}/>]}/>
<BigTrend key={JSON.stringify(data.regular_afk_avg_trend)}
trend={data.regular_afk_avg_trend}/>]}/>
</ComparisonTable>
</Card>
)

View File

@ -22,30 +22,43 @@ const ServerWeekComparisonCard = ({data}) => {
<ComparisonTable comparisonHeader={t('html.label.comparing7days')}
headers={[data.start + ' - ' + data.midpoint, data.midpoint + ' - ' + data.end, t('html.label.trend')]}>
<TableRow icon={faUsers} color="blue" text={t('html.label.uniquePlayers')}
values={[data.unique_before, data.unique_after, <BigTrend trend={data.unique_trend}/>]}/>
values={[data.unique_before, data.unique_after,
<BigTrend key={JSON.stringify(data.unique_trend)}
trend={data.unique_trend}/>]}/>
<TableRow icon={faUsers} color="light-green" text={t('html.label.newPlayers')}
values={[data.new_before, data.new_after, <BigTrend trend={data.new_trend}/>]}/>
values={[data.new_before, data.new_after,
<BigTrend key={JSON.stringify(data.new_trend)}
trend={data.new_trend}/>]}/>
<TableRow icon={faUsers} color="lime" text={t('html.label.regularPlayers')}
values={[data.regular_before, data.regular_after, <BigTrend trend={data.regular_trend}/>]}/>
values={[data.regular_before, data.regular_after,
<BigTrend key={JSON.stringify(data.regular_trend)}
trend={data.regular_trend}/>]}/>
<TableRow icon={faClock} color="green"
text={t('html.label.averagePlaytime') + ' ' + t('html.label.perPlayer')}
values={[data.average_playtime_before, data.average_playtime_after,
<BigTrend trend={data.average_playtime_trend}/>]}/>
<BigTrend key={JSON.stringify(data.average_playtime_trend)}
trend={data.average_playtime_trend}/>]}/>
<TableRow icon={faClock} color="teal"
text={t('html.label.averageSessionLength')}
values={[data.session_length_average_before, data.session_length_average_after,
<BigTrend trend={data.session_length_average_trend}/>]}/>
<BigTrend key={JSON.stringify(data.session_length_average_trend)}
trend={data.session_length_average_trend}/>]}/>
<TableRow icon={faCalendarCheck} color="teal" text={t('html.label.sessions')}
values={[data.sessions_before, data.sessions_after,
<BigTrend trend={data.sessions_trend}/>]}/>
<BigTrend key={JSON.stringify(data.sessions_trend)}
trend={data.sessions_trend}/>]}/>
<TableRow icon={faCrosshairs} color="red" text={t('html.label.playerKills')}
values={[data.player_kills_before, data.player_kills_after,
<BigTrend trend={data.player_kills_trend}/>]}/>
<BigTrend key={JSON.stringify(data.player_kills_trend)}
trend={data.player_kills_trend}/>]}/>
<TableRow icon={faCrosshairs} color="green" text={t('html.label.mobKills')}
values={[data.mob_kills_before, data.mob_kills_after,
<BigTrend trend={data.mob_kills_trend}/>]}/>
<BigTrend key={JSON.stringify(data.mob_kills_trend)}
trend={data.mob_kills_trend}/>]}/>
<TableRow icon={faSkull} color="black" text={t('html.label.deaths')}
values={[data.deaths_before, data.deaths_after, <BigTrend trend={data.deaths_trend}/>]}/>
values={[data.deaths_before, data.deaths_after,
<BigTrend key={JSON.stringify(data.deaths_trend)}
trend={data.deaths_trend}/>]}/>
</ComparisonTable>
</Card>
)

View File

@ -15,17 +15,21 @@ import {faCalendarCheck, faClock} from "@fortawesome/free-regular-svg-icons";
import React from "react";
import {CardLoader} from "../../../navigation/Loader";
import ExtendableCardBody from "../../../layout/extension/ExtendableCardBody";
import {useMetadata} from "../../../../hooks/metadataHook";
const ServerAsNumbersCard = ({data}) => {
const {t} = useTranslation();
const {networkMetadata} = useMetadata();
if (!data) return <CardLoader/>;
if (!data || !networkMetadata) return <CardLoader/>;
const isGameServer = data.player_kills !== undefined;
const showPeaks = isGameServer || networkMetadata.usingRedisBungee || networkMetadata.servers.filter(server => server.proxy).length === 1;
return (
<Card>
<Card.Header>
<h6 className="col-black">
<Fa icon={faBookOpen}/> {data.player_kills !== undefined ? t('html.label.serverAsNumberse') : t('html.label.networkAsNumbers')}
<Fa icon={faBookOpen}/> {isGameServer ? t('html.label.serverAsNumberse') : t('html.label.networkAsNumbers')}
</h6>
</Card.Header>
<ExtendableCardBody
@ -43,13 +47,15 @@ const ServerAsNumbersCard = ({data}) => {
<Datapoint name={t('html.label.playersOnline')}
color={'blue'} icon={faUser}
value={data.online_players} bold/>
<hr/>
<Datapoint name={t('html.label.lastPeak') + ' (' + data.last_peak_date + ')'}
color={'blue'} icon={faChartLine}
value={data.last_peak_players} valueLabel={t('html.unit.players')} bold/>
<Datapoint name={t('html.label.bestPeak') + ' (' + data.best_peak_date + ')'}
color={'light-green'} icon={faChartLine}
value={data.best_peak_players} valueLabel={t('html.unit.players')} bold/>
{showPeaks && <>
<hr/>
<Datapoint name={t('html.label.lastPeak') + ' (' + data.last_peak_date + ')'}
color={'blue'} icon={faChartLine}
value={data.last_peak_players} valueLabel={t('html.unit.players')} bold/>
<Datapoint name={t('html.label.bestPeak') + ' (' + data.best_peak_date + ')'}
color={'light-green'} icon={faChartLine}
value={data.best_peak_players} valueLabel={t('html.unit.players')} bold/>
</>}
<hr/>
<Datapoint name={t('html.label.totalPlaytime')}
color={'green'} icon={faClock}

View File

@ -96,7 +96,8 @@ const ExtensionCard = ({extension}) => {
</Card.Header>
<ul className="nav nav-tabs tab-nav-right" role="tablist">
{extension.onlyGenericTab ? '' :
extension.tabs.map((tab, i) => <li key={i} role="presentation" className="nav-item col-black">
extension.tabs.map((tab, i) => <li key={JSON.stringify(tab)} role="presentation"
className="nav-item col-black">
<button className={"nav-link col-black"
+ (openTabIndex === i ? ' active' : '')} onClick={() => toggleTabIndex(i)}>
<ExtensionIcon icon={tab.tabInformation.icon}/> {tab.tabInformation.tabName}

View File

@ -0,0 +1,73 @@
import React, {useEffect, useState} from "react";
import {useTranslation} from "react-i18next";
import {linegraphButtons, tooltip} from "../../util/graphs";
import LineGraph from './LineGraph'
import {ChartLoader} from "../navigation/Loader";
import {useTheme} from "../../hooks/themeHook";
const StackedPlayersOnlineGraph = ({data}) => {
const {t} = useTranslation();
const {nightModeEnabled} = useTheme();
const [graphOptions, setGraphOptions] = useState({title: {text: ''},});
useEffect(() => {
if (!data) return;
const playersOnlineSeries = data.graphs.map(graph => {
return {
name: t('html.label.playersOnline') + ' (' + graph.server.serverName + ')',
type: 'areaspline',
tooltip: tooltip.zeroDecimals,
data: graph.points.map(point => {
// Ensure that the points can be stacked by moving data to minute level
point[0] -= (point[0] % 60000);
return point;
}),
color: data.color,
yAxis: 0
}
});
setGraphOptions({
title: {text: ''},
rangeSelector: {
selected: 2,
buttons: linegraphButtons
},
chart: {
zooming: {
type: 'xy'
}
},
plotOptions: {
areaspline: {
fillOpacity: nightModeEnabled ? 0.2 : 0.4,
stacking: 'normal'
}
},
legend: {
enabled: true,
},
xAxis: {
zoomEnabled: true,
title: {
enabled: false
}
},
yAxis: {
zoomEnabled: true,
title: {text: t('html.label.players')},
softMax: 2,
min: 0
},
series: playersOnlineSeries
})
}, [data, nightModeEnabled, t])
if (!data) return <ChartLoader/>;
return (
<LineGraph id="stacked-players-online-graph"
options={graphOptions}/>
)
}
export default StackedPlayersOnlineGraph

View File

@ -13,7 +13,7 @@ const MultiSelect = ({options, selectedIndexes, setSelectedIndexes}) => {
onChange={handleChange}>
{options.map((option, i) => {
return (
<option key={i} value={selectedIndexes.includes(i)}
<option key={JSON.stringify(option)} value={selectedIndexes.includes(i)}
selected={selectedIndexes.includes(i)}>{option}</option>
)
})}

View File

@ -58,7 +58,7 @@ const getContributionIcon = (type) => {
const Contributor = ({contributor}) => {
const icons = contributor.contributed.map(
(type, i) => <Fa key={i} icon={["fa", getContributionIcon(type)]}/>);
type => <Fa key={"" + type} icon={["fa", getContributionIcon(type)]}/>);
return (
<li className="contributor">{contributor.name} {icons} </li>
)
@ -78,7 +78,7 @@ const Contributions = () => {
<p>In addition following <span className="col-theme">awesome people</span> have
contributed:</p>
<ul className="row contributors">
{contributors.map((contributor, i) => <Contributor key={i} contributor={contributor}/>)}
{contributors.map((contributor, i) => <Contributor key={contributor.name} contributor={contributor}/>)}
<li>{t('html.modal.info.contributors.bugreporters')}</li>
</ul>
<small>

View File

@ -22,8 +22,8 @@ const LanguageSelector = () => {
className="form-select form-select-sm"
id="langSelector"
defaultValue={localeService.clientLocale}>
{languages.map((lang, i) =>
<option key={i} value={lang.name}>{lang.displayName}</option>)}
{languages.map(lang =>
<option key={lang.name} value={lang.name}>{lang.displayName}</option>)}
</select>
)
}

View File

@ -80,7 +80,13 @@ const MainPageRedirect = () => {
};
if (authRequired && !loggedIn) {
return (<Navigate to="/login" replace={true}/>)
if (!window.location.pathname.startsWith("/login")) {
return (<Navigate
to={"/login?from=" + encodeURIComponent(window.location.pathname + window.location.search + window.location.hash)}
replace={true}/>)
} else {
return (<Navigate to="/login" replace={true}/>)
}
} else if (authRequired && loggedIn) {
return redirectBasedOnPermissions();
} else {

View File

@ -150,8 +150,8 @@ const SidebarCollapse = ({item, open, setOpen, collapseSidebar}) => {
<div className="bg-white py-2 collapse-inner rounded">
{item.contents
.filter(content => content !== undefined)
.map((content, i) =>
<Item key={i}
.map(content =>
<Item key={JSON.stringify(content)}
inner
active={false}
item={content}

View File

@ -30,7 +30,7 @@ const GroupTable = ({groups, colors}) => {
<table className={"table mb-0" + (nightModeEnabled ? " table-dark" : '')}>
<tbody>
{groups.length ? groups.map((group, i) =>
<GroupRow key={i}
<GroupRow key={group.name}
group={group}
color={getColor(i)}/>) :
<tr>

View File

@ -12,14 +12,20 @@ import {
import React from "react";
import {TableRow} from "./TableRow";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {faEye} from "@fortawesome/free-regular-svg-icons";
import {faEye, faQuestionCircle} from "@fortawesome/free-regular-svg-icons";
import AsNumbersTable from "./AsNumbersTable";
import {ChartLoader} from "../navigation/Loader";
const PerformanceAsNumbersTable = ({data}) => {
const PerformanceAsNumbersTable = ({data, servers}) => {
const {t} = useTranslation();
if (!data) return <ChartLoader/>;
const dataIncludesGameServers = servers && Boolean(servers.filter(server => !server.proxy).length);
const noTPSOnProxies = !servers || dataIncludesGameServers
? ''
: <Fa icon={faQuestionCircle}
title={t('html.description.performanceNoGameServers')}/>;
return (
<AsNumbersTable
headers={[t('html.label.last30days'), t('html.label.last7days'), t('html.label.last24hours')]}
@ -52,9 +58,9 @@ const PerformanceAsNumbersTable = ({data}) => {
]}/>
<TableRow icon={faTachometerAlt} color="orange" text={t('html.label.averageTps')}
values={[
data.tps_30d,
data.tps_7d,
data.tps_24h
<>{data.tps_30d} {noTPSOnProxies}</>,
<>{data.tps_7d} {noTPSOnProxies}</>,
<>{data.tps_24h} {noTPSOnProxies}</>
]}/>
<TableRow icon={faTachometerAlt} color="amber" text={t('html.label.averageCpuUsage')}
values={[
@ -70,17 +76,17 @@ const PerformanceAsNumbersTable = ({data}) => {
]}/>
<TableRow icon={faDragon} color="purple" text={t('html.label.averageEntities')}
values={[
data.entities_30d,
data.entities_7d,
data.entities_24h
<>{data.entities_30d} {noTPSOnProxies}</>,
<>{data.entities_7d} {noTPSOnProxies}</>,
<>{data.entities_24h} {noTPSOnProxies}</>
]}/>
<TableRow icon={faMap} color="blue-grey"
text={<>{t('html.label.averageChunks')}{' '}{data.chunks_30d === 'Unavailable' ?
<Fa icon={faEye} title={t('html.description.noSpongeChunks')}/> : ''}</>}
values={[
data.chunks_30d,
data.chunks_7d,
data.chunks_24h
<>{data.chunks_30d} {noTPSOnProxies}</>,
<>{data.chunks_7d} {noTPSOnProxies}</>,
<>{data.chunks_24h} {noTPSOnProxies}</>
]}/>
<TableRow icon={faHdd} color="green"
text={t('html.label.maxFreeDisk')}

View File

@ -1,7 +1,9 @@
import React from "react";
import {FontAwesomeIcon as Fa} from "@fortawesome/react-fontawesome";
import {
faBoxArchive,
faCaretSquareRight,
faExclamationTriangle,
faLineChart,
faLink,
faServer,
@ -19,9 +21,22 @@ import {NavLink} from "react-router-dom";
const ServerRow = ({server, onQuickView}) => {
const {t} = useTranslation();
const timeUtc = Date.now();
const dayMs = 86400000
let noDataWarning = '';
if (!server.playersOnline.length) {
noDataWarning = <>&nbsp;<Fa icon={faBoxArchive} title={t('html.description.noData30d')}/></>
} else if (timeUtc - server.playersOnline[server.playersOnline.length - 1][0] > dayMs) {
noDataWarning = <>&nbsp;<Fa icon={faExclamationTriangle}
className={timeUtc - server.playersOnline[server.playersOnline.length - 1][0] > dayMs * 7 ? '' : "col-deep-orange"}
title={t('html.description.noData24h')}/></>
}
return (
<tr>
<td>{server.name}</td>
<td>{server.name}{noDataWarning}</td>
<td className="p-1">
<NavLink to={"/server/" + encodeURIComponent(server.serverUUID)}
title={t('html.label.serverAnalysis') + ': ' + server.name}
@ -136,8 +151,9 @@ const ServersTable = ({servers, onSelect, sortBy, sortReversed}) => {
</tr>
</thead>
<tbody>
{sortedServers.length ? sortedServers.map((server, i) => <ServerRow key={i} server={server}
onQuickView={() => onSelect(servers.indexOf(server))}/>) :
{sortedServers.length ? sortedServers.map(server => <ServerRow key={server.serverUUID}
server={server}
onQuickView={() => onSelect(servers.indexOf(server))}/>) :
<tr>
<td>{t('html.generic.none')}</td>
<td>-</td>

View File

@ -1,4 +1,4 @@
import {createContext, useCallback, useContext, useEffect, useState} from "react";
import {createContext, useCallback, useContext, useEffect, useMemo, useState} from "react";
import {fetchWhoAmI} from "../service/authenticationService";
const AuthenticationContext = createContext({});
@ -35,7 +35,18 @@ export const AuthenticationContextProvider = ({children}) => {
updateLoginDetails();
}, [updateLoginDetails]);
const sharedState = {
const sharedState = useMemo(() => {
return {
authLoaded,
authRequired,
loggedIn,
user,
loginError,
hasPermission,
hasPermissionOtherThan,
updateLoginDetails
}
}, [
authLoaded,
authRequired,
loggedIn,
@ -44,7 +55,7 @@ export const AuthenticationContextProvider = ({children}) => {
hasPermission,
hasPermissionOtherThan,
updateLoginDetails
}
])
return (<AuthenticationContext.Provider value={sharedState}>
{children}
</AuthenticationContext.Provider>

View File

@ -1,4 +1,4 @@
import {createContext, useContext, useEffect, useState} from "react";
import {createContext, useContext, useEffect, useMemo, useState} from "react";
import {useDataRequest} from "./dataFetchHook";
import {fetchExtensionData} from "../service/serverService";
@ -15,7 +15,9 @@ export const ServerExtensionContextProvider = ({identifier, children}) => {
setExtensionDataLoadingError(loadingError);
}, [data, loadingError, setExtensionData, setExtensionDataLoadingError])
const sharedState = {extensionData, extensionDataLoadingError}
const sharedState = useMemo(() => {
return {extensionData, extensionDataLoadingError};
}, [extensionData, extensionDataLoadingError]);
return (<ServerExtensionContext.Provider value={sharedState}>
{children}
</ServerExtensionContext.Provider>

View File

@ -114,8 +114,8 @@ const fetchPlayersOnlineGraphServer = async (timestamp, identifier) => {
}
const fetchPlayersOnlineGraphNetwork = async (timestamp) => {
let url = `/v1/graph?type=playersOnline`;
if (staticSite) url = `/data/graph-playersOnline.json`;
let url = `/v1/graph?type=playersOnlineProxies`;
if (staticSite) url = `/data/graph-playersOnlineProxies.json`;
return doGetRequest(url, timestamp);
}

View File

@ -2187,7 +2187,7 @@ a.text-dark:hover, a.text-dark:focus {
border: 0;
font-weight: 900;
content: '\f105';
font-family: 'Font Awesome 5 Free';
font-family: 'Font Awesome 5 Free', sans-serif;
}
.sidebar .nav-item.dropdown.show .dropdown-toggle::after,
@ -2471,7 +2471,7 @@ a.text-dark:hover, a.text-dark:focus {
.sidebar #sidebarToggle::after {
font-weight: 900;
content: '\f104';
font-family: 'Font Awesome 5 Free';
font-family: 'Font Awesome 5 Free', sans-serif;
margin-right: 0.1rem;
}
@ -2490,7 +2490,7 @@ a.text-dark:hover, a.text-dark:focus {
.sidebar.toggled #sidebarToggle::after {
content: '\f105';
font-family: 'Font Awesome 5 Free';
font-family: 'Font Awesome 5 Free', sans-serif;
margin-left: 0.25rem;
}
@ -2611,7 +2611,7 @@ a.text-dark:hover, a.text-dark:focus {
border: 0;
font-weight: 900;
content: '\f107';
font-family: 'Font Awesome 5 Free';
font-family: 'Font Awesome 5 Free', sans-serif;
}
.sidebar .nav-item .nav-link[data-bs-toggle="collapse"].collapsed::after {
@ -2892,7 +2892,7 @@ a.text-dark:hover, a.text-dark:focus {
line-height: 51px;
font-weight: 900;
content: '\f107';
font-family: 'Font Awesome 5 Free';
font-family: 'Font Awesome 5 Free', sans-serif;
color: #d1d3e2;
}

View File

@ -123,9 +123,31 @@ export const colorClassToBgClass = colorClass => {
return "bg-" + colorClassToColorName(colorClass);
}
export const hsxStringToArray = (hsvString) => {
const color = hsvString.substring(4, hsvString.length - 1);
const split = color.split(',');
const h = Number(split[0]);
const s = Number(split[1].substring(0, split[1].length - 1));
const x = Number(split[2].substring(0, split[2].length - 1));
return [h, s, x];
}
export const hslToHsv = ([h, s, l]) => {
const hsv1 = s * (l < 50 ? l : 100 - l) / 100;
const hsvS = hsv1 === 0 ? 0 : 2 * hsv1 / (l + hsv1) * 100;
const hsvV = l + hsv1;
return [h, hsvS, hsvV];
}
export const hsvToRgb = ([h, s, v]) => {
let r, g, b;
if (s > 1) {
h = h / 360;
s = s / 100;
v = v / 100;
}
const i = Math.floor(h * 6);
const f = h * 6 - i;
const p = v * (1 - s);
@ -186,15 +208,15 @@ const rgbToHex = (component) => {
return Math.floor(component).toString(16).padStart(2, '0');
}
// From https://stackoverflow.com/a/3732187
export const withReducedSaturation = hex => {
const saturationReduction = 0.70;
// To RGB
let r = parseInt(hex.substr(1, 2), 16); // Grab the hex representation of red (chars 1-2) and convert to decimal (base 10).
let g = parseInt(hex.substr(3, 2), 16);
let b = parseInt(hex.substr(5, 2), 16);
export const hexToRgb = (hexString) => {
const r = parseInt(hexString.substring(1, 3), 16);
const g = parseInt(hexString.substring(3, 5), 16);
const b = parseInt(hexString.substring(5, 7), 16);
return [r, g, b];
}
// To HSL
// https://css-tricks.com/converting-color-spaces-in-javascript/
export const rgbToHsl = ([r, g, b]) => {
r /= 255;
g /= 255;
b /= 255;
@ -222,6 +244,15 @@ export const withReducedSaturation = hex => {
}
h /= 6;
}
return [h, s, l];
}
// From https://stackoverflow.com/a/3732187
export const withReducedSaturation = (hex, reduceSaturationPercentage) => {
const saturationReduction = reduceSaturationPercentage ? reduceSaturationPercentage : 0.70;
const rgb = hexToRgb(hex);
const [h, s, l] = rgbToHsl(rgb);
// To css property
return 'hsl(' + h * 360 + ',' + s * 100 * saturationReduction + '%,' + l * 95 + '%)';

View File

@ -146,6 +146,32 @@ const LoginPage = () => {
}
}, [setRedirectTo, setSuccessMessage, t])
const redirectAfterLogin = () => {
if (redirectTo && !redirectTo.startsWith('http') && !redirectTo.startsWith('file') && !redirectTo.startsWith('javascript')) {
// Normalize the URL so that it can't redirect to different domain.
try {
const redirectUrl = new URL(
redirectTo.substring(redirectTo.indexOf('/')) + (window.location.hash ? window.location.hash : ''),
window.location.protocol + '//' + window.location.host
);
if (redirectUrl.pathname.includes("//")) {
// Invalid redirect URL, something fishy might be going on, redirect to /
navigate('/');
} else {
navigate(
redirectUrl.pathname + redirectUrl.search + redirectUrl.hash
);
}
} catch (e) {
console.warn(e);
// Invalid redirect URL, something fishy might be going on, redirect to /
navigate('/');
}
} else {
navigate('/');
}
};
const login = async (username, password) => {
if (!username || username.length < 1) {
return setFailMessage(t('html.register.error.noUsername'));
@ -168,11 +194,7 @@ const LoginPage = () => {
}
} else if (data && data.success) {
await updateLoginDetails();
if (redirectTo && !redirectTo.startsWith('http') && !redirectTo.startsWith('file') && !redirectTo.startsWith('javascript')) {
navigate(redirectTo.substring(redirectTo.indexOf('/')) + (window.location.hash ? window.location.hash : ''));
} else {
navigate('/');
}
redirectAfterLogin();
} else {
setFailMessage(t('html.login.failed') + data ? data.error : t('generic.noData'));
}

View File

@ -117,7 +117,7 @@ const NetworkSidebar = () => {
)
}
const ServerPage = () => {
const NetworkPage = () => {
const {networkName, serverUUID} = useMetadata();
const {currentTab} = useNavigation();
@ -150,4 +150,4 @@ const ServerPage = () => {
)
}
export default ServerPage;
export default NetworkPage;

View File

@ -10,6 +10,8 @@ import {useTranslation} from "react-i18next";
import {faCalendarCheck} from "@fortawesome/free-regular-svg-icons";
import {useDataRequest} from "../../hooks/dataFetchHook";
import ErrorPage from "./ErrorPage";
import {useAuth} from "../../hooks/authenticationHook";
import MainPageRedirect from "../../components/navigation/MainPageRedirect";
const HelpModal = React.lazy(() => import("../../components/modal/HelpModal"));
@ -47,6 +49,8 @@ const PlayerPage = () => {
finishUpdate(player.timestamp, player.timestamp_f);
}, [player, t, i18n, finishUpdate, setSidebarItems])
const {authRequired, loggedIn} = useAuth();
if (authRequired && !loggedIn) return <MainPageRedirect/>;
if (loadingError) return <ErrorPage error={loadingError}/>;
return player ? (

View File

@ -9,6 +9,8 @@ import ColorSelectorModal from "../../components/modal/ColorSelectorModal";
import {useMetadata} from "../../hooks/metadataHook";
import ErrorPage from "./ErrorPage";
import {staticSite} from "../../service/backendConfiguration";
import {useAuth} from "../../hooks/authenticationHook";
import MainPageRedirect from "../../components/navigation/MainPageRedirect";
const HelpModal = React.lazy(() => import("../../components/modal/HelpModal"));
@ -30,6 +32,8 @@ const PlayersPage = () => {
setCurrentTab('html.label.players')
}, [t, i18n, setCurrentTab, setSidebarItems])
const {authRequired, loggedIn} = useAuth();
if (authRequired && !loggedIn) return <MainPageRedirect/>;
if (error) return <ErrorPage error={error}/>;
const displayedServerName = isProxy ? networkName : (serverName && serverName.startsWith('Server') ? "Plan" : serverName);

View File

@ -9,6 +9,8 @@ import ColorSelectorModal from "../../components/modal/ColorSelectorModal";
import {useMetadata} from "../../hooks/metadataHook";
import ErrorPage from "./ErrorPage";
import {QueryResultContextProvider} from "../../hooks/queryResultContext";
import {useAuth} from "../../hooks/authenticationHook";
import MainPageRedirect from "../../components/navigation/MainPageRedirect";
const QueryPage = () => {
const {t, i18n} = useTranslation();
@ -30,6 +32,8 @@ const QueryPage = () => {
setCurrentTab('html.query.title.text');
}, [t, i18n, setCurrentTab, setSidebarItems])
const {authRequired, loggedIn} = useAuth();
if (authRequired && !loggedIn) return <MainPageRedirect/>;
if (error) return <ErrorPage error={error}/>;
const displayedServerName = isProxy ? networkName : (serverName && serverName.startsWith('Server') ? "Plan" : serverName);

View File

@ -23,7 +23,7 @@ const NetworkPerformance = () => {
const [selectedOptions, setSelectedOptions] = useState([]);
const [visualizedServers, setVisualizedServers] = useState([]);
const initializeServerOptions = () => {
useEffect(() => {
if (networkMetadata) {
const options = networkMetadata.servers;
setServerOptions(options);
@ -34,8 +34,7 @@ const NetworkPerformance = () => {
setSelectedOptions([indexOfProxy]);
setVisualizedServers([indexOfProxy]);
}
};
useEffect(initializeServerOptions, [networkMetadata, setVisualizedServers]);
}, [networkMetadata, setVisualizedServers]);
const applySelected = () => {
setVisualizedServers(selectedOptions);
@ -85,7 +84,8 @@ const NetworkPerformance = () => {
loadPerformanceData();
}, [loadPerformanceData, visualizedServers, updateRequested]);
const isUpToDate = visualizedServers.every((s, i) => s === selectedOptions[i]);
const isUpToDate = selectedOptions.length === visualizedServers.length && selectedOptions.every(
(s, i) => s === visualizedServers[i]);
return (
<LoadIn>
<section className={"network-performance"}>
@ -96,7 +96,8 @@ const NetworkPerformance = () => {
</ExtendableRow>
<ExtendableRow id={'row-network-performance-1'}>
<Col md={8}>
<PerformanceAsNumbersCard data={performanceData?.overview?.numbers}/>
<PerformanceAsNumbersCard data={performanceData?.overview?.numbers}
servers={performanceData.servers || []}/>
</Col>
<Col md={4}>
<Card>
@ -104,7 +105,8 @@ const NetworkPerformance = () => {
<MultiSelect options={serverOptions.map(server => server.serverName)}
selectedIndexes={selectedOptions}
setSelectedIndexes={setSelectedOptions}/>
<button className={'btn bg-transparent'} onClick={applySelected} disabled={isUpToDate}>
<button className={'btn ' + (isUpToDate ? 'bg-transparent' : 'bg-theme')}
onClick={applySelected} disabled={isUpToDate}>
{t('html.label.apply')}
</button>
</Card>

View File

@ -34,7 +34,7 @@ const ConnectionsCard = ({player}) => {
</tr>
</thead>
<tbody>
{player.connections.map((connection, i) => (<tr key={'connection-' + i}>
{player.connections.map((connection, i) => (<tr key={JSON.stringify(connection)}>
<td>{connection.geolocation}</td>
<td>{connection.date}</td>
</tr>))}

View File

@ -1151,43 +1151,43 @@
minimatch "^3.0.4"
strip-json-comments "^3.1.1"
"@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-common-types@6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz#88da2b70d6ca18aaa6ed3687832e11f39e80624b"
integrity sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==
"@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-free@^6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-6.4.0.tgz#1ee0c174e472c84b23cb46c995154dc383e3b4fe"
integrity sha512-0NyytTlPJwB/BF5LtRV8rrABDbe3TdTXqNB3PdZ+UUUZAEIrdOJdmABqKjt4AXwIoJNaRVVZEXxpNrqvE1GAYQ==
"@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==
"@fortawesome/fontawesome-svg-core@^6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz#3727552eff9179506e9203d72feb5b1063c11a21"
integrity sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==
dependencies:
"@fortawesome/fontawesome-common-types" "6.3.0"
"@fortawesome/fontawesome-common-types" "6.4.0"
"@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==
"@fortawesome/free-brands-svg-icons@^6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.0.tgz#c785cf5563231eadc5ef5f8cd0274e0b8920433f"
integrity sha512-qvxTCo0FQ5k2N+VCXb/PZQ+QMhqRVM4OORiO6MXdG6bKolIojGU/srQ1ptvKk0JTbRgaJOfL2qMqGvBEZG7Z6g==
dependencies:
"@fortawesome/fontawesome-common-types" "6.3.0"
"@fortawesome/fontawesome-common-types" "6.4.0"
"@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==
"@fortawesome/free-regular-svg-icons@^6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.0.tgz#cacc53bd8d832d46feead412d9ea9ce80a55e13a"
integrity sha512-ZfycI7D0KWPZtf7wtMFnQxs8qjBXArRzczABuMQqecA/nXohquJ5J/RCR77PmY5qGWkxAZDxpnUFVXKwtY/jPw==
dependencies:
"@fortawesome/fontawesome-common-types" "6.3.0"
"@fortawesome/fontawesome-common-types" "6.4.0"
"@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==
"@fortawesome/free-solid-svg-icons@^6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz#48c0e790847fa56299e2f26b82b39663b8ad7119"
integrity sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==
dependencies:
"@fortawesome/fontawesome-common-types" "6.3.0"
"@fortawesome/fontawesome-common-types" "6.4.0"
"@fortawesome/react-fontawesome@^0.2.0":
version "0.2.0"
@ -1532,10 +1532,10 @@
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==
"@remix-run/router@1.5.0":
version "1.5.0"
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.5.0.tgz#57618e57942a5f0131374a9fdb0167e25a117fdc"
integrity sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==
"@restart/hooks@^0.4.6", "@restart/hooks@^0.4.7":
version "0.4.8"
@ -1740,10 +1740,10 @@
stampit "=4.3.2"
unraw "=2.0.1"
"@swagger-api/apidom-core@=0.69.0", "@swagger-api/apidom-core@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-core/-/apidom-core-0.69.0.tgz#561ffd097f74ed60b3e6c51a8815dca8ff9c6ae2"
integrity sha512-n59Mz6JjgL5SJHne7om22+5RRfDNmM8oQ0NgHvWU44rHcmA/8Byxs28w6Ke2xgJFmLYasEw6hx1bwAATBLaa7w==
"@swagger-api/apidom-core@>=0.69.1 <1.0.0", "@swagger-api/apidom-core@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-core/-/apidom-core-0.69.1.tgz#ac92066ea43149b4fb6305fecbf737022ed31e30"
integrity sha512-XkGEoIuk0cqsbzv03AdfcDr5suKJnLC+CkZS4rzHjs307RFG1xX722Aj6snUs5hRFQKBH+cdujpspugh7HdNmw==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-ast" "^0.69.0"
@ -1754,167 +1754,167 @@
short-unique-id "=4.4.4"
stampit "=4.3.2"
"@swagger-api/apidom-json-pointer@=0.69.0", "@swagger-api/apidom-json-pointer@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-0.69.0.tgz#c892d358e9d8a1cfb4df1ded793ff5d145df4903"
integrity sha512-TDcrES6POTBrQXDdq7VjlqFYZuZ/eqaxD9K2MUJcRckil+jxpDV0W38lgXE+c8Gjwvqqqce/izkilUgMA+ajFA==
"@swagger-api/apidom-json-pointer@>=0.69.1 <1.0.0", "@swagger-api/apidom-json-pointer@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-0.69.1.tgz#4a9de62c27007fec87b116784c835566bd0566a5"
integrity sha512-bRSSpSdXVQQ0LTmdY/KDZ7XqxwMf1DmgOqStFq71A8UZs1cTAa83qQ7+OAPqz3/qhSVAOE1sIU5fc32j+wqtmg==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-ns-api-design-systems@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-0.69.0.tgz#10159ea66db921b93939a6705a5e3f043f0fbddd"
integrity sha512-1W5N4wL5I9n4dD6AJ1Bh49kphn+DXmwggUQhwsq7phxey4jiEXUNC9W/CQDXJp0wkFtNE6REn8yks9QGqfkemw==
"@swagger-api/apidom-ns-api-design-systems@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-0.69.1.tgz#8b6c399f3155a787196e0a386fb95472d9eb93a7"
integrity sha512-whGQcBNhH8O/xEOuCRnhVZik+zvXGy4915sy/8zZNy792Q2GjwUIduc1iez2oXdg77NYOhBENLndXIGbNpxeuQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-asyncapi-2@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-0.69.0.tgz#098a9964518f609c73dedcb8dbdd8b657a8b4a07"
integrity sha512-D49mduzDwVQJp55+KoT8NozQEUsLMhCxbAnD4iY1E/v4uK7xSqQ3JW/Luunz6DNKWWtcWhgCiehmBwIjVAQN/A==
"@swagger-api/apidom-ns-asyncapi-2@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-0.69.1.tgz#d1fe408b1467e8d8f4011227e16de7555cf30fba"
integrity sha512-9lrMtcA0Vs9nZsZO67BPqorbQ3KGwYecXwo+2a+8ev8MqdG7eOKB9taRgt7CPdfNEllRvc3nC9A/IHOOtoefsA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-json-schema-draft-7" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-json-schema-draft-7" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-json-schema-draft-4@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-0.69.0.tgz#136224aee085aeef3394bc93129a88b984edfa4b"
integrity sha512-rRo226jITgG6DZNuk1oCuKFhr0giJ6GATyQtaaEmH9bhxB8i1eeES/LolJfo4donyejCb+imJN+L1fQ1N2YOYA==
"@swagger-api/apidom-ns-json-schema-draft-4@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-0.69.1.tgz#4d26559924fd9ca024704055652cbb4cbd7fbc29"
integrity sha512-6qkUH0R2C2dxzr5Af1p4N/ccyH34Fnv9CVT4tIPFThmxLI+Ivdzy6BbZ4lT9rzFet1G0mL3hI/pdLNz8Z28Ftw==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-json-schema-draft-6@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-0.69.0.tgz#6986e24542505cde90bd2c2366f1c1678624c666"
integrity sha512-koLHh4TS3RtrWxcYX/tZobgnwUbjiFLOESiqe0FYvs82LXNwr+dveM8Umj89ACjpCd0Pq2J+5yvfNyvuIa6WFw==
"@swagger-api/apidom-ns-json-schema-draft-6@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-0.69.1.tgz#f6a7253844a402ffc4587a1593792f4737451f0a"
integrity sha512-yTMGfqQ5JXvdVnAjlr7qdPqfBJWaL3VrXPXnp5uLwW1Wk5aMzie1Jq9jZARomajFhNKAzFTDuaZ+S+jEeqQ09Q==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-json-schema-draft-4" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-json-schema-draft-4" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-json-schema-draft-7@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-0.69.0.tgz#5ea3a07aefb5b12022614d3f4bb0a42e19bd68ce"
integrity sha512-OaEBBrgoDfqMPnZ0NCfg5HUJJ/V6XJ1AZ6OTW1AfJTqErLxYTgdNv52lYXKLiKkyLiH5olBBnPEKPPLg+DwUKQ==
"@swagger-api/apidom-ns-json-schema-draft-7@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-0.69.1.tgz#217a3fd1e0b8faa1859e2427d85d054006ec464b"
integrity sha512-Etl8J2jwJzm2r5fFu7csRmI9im8qTgcNeCbfqpEWLmVM4SirZx56VathplSt/XyApP2vXNH9sUHCa7crgJH/hQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-json-schema-draft-6" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-json-schema-draft-6" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-openapi-3-0@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-0.69.0.tgz#1cc54093e6f5919f53d8681dd54c9e1931295c1b"
integrity sha512-rKgEd/k0MNV93DhwZ6yfUaIjbs6RfS9xB3QN9M6Lx5ZJktxNGAdpS/c3WEb5jBOpkQIJ6MaNI67Q0ZHHJTlrng==
"@swagger-api/apidom-ns-openapi-3-0@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-0.69.1.tgz#eccff9a2f9ff774cb2ee8f550ab3803f8ade4a4f"
integrity sha512-WysPvllkS36ONiDWUTfNACkgpoDNibCT8sOGaEv+NTGlUjhZuyI6GMJxw5DcaeRyIV5Tp14vyCCbacGMr+02WQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-json-schema-draft-4" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-json-schema-draft-4" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-ns-openapi-3-1@=0.69.0", "@swagger-api/apidom-ns-openapi-3-1@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-0.69.0.tgz#3bae54d8298aab9f7f04ed0c2f984c5d96ac5fa0"
integrity sha512-l5g4K09I4znwTcXbkBaE4JKmvEQ7Q831hzpBWZimcnUGrC8/nJ7eYUc04bjgbdDZd37B0zEzRn6w92ax7Hi2Fg==
"@swagger-api/apidom-ns-openapi-3-1@>=0.69.1 <1.0.0", "@swagger-api/apidom-ns-openapi-3-1@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-0.69.1.tgz#0f38d7a303c028a0914b802fe22ddae672111819"
integrity sha512-chk+UF8soH5TuvabUstPmb1Mx3IP3dUJQ7SDB3tHusg+f2xEo5S7Hx/mrSKJDX2Wp0qFshqpUFSRC8ZUnFgJaQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
"@swagger-api/apidom-parser-adapter-api-design-systems-json@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-0.69.0.tgz#173b3b1b37711c10bb6c8f20638f323fc56cd5e7"
integrity sha512-oi52u6rmLrE+iXOk5wlx1NRXHd0NtGsxF1G+g2JTtC0oh5ETrj5fMGwMQwcBqYGTj3Y6vPJMkvVyaC46KUKg0Q==
"@swagger-api/apidom-parser-adapter-api-design-systems-json@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-0.69.1.tgz#4faa17655f09e2a5a5cce5327e14629810ef2d87"
integrity sha512-+xGcnM4bwGylAtp6i4rN/YRs03665Xzp53mPvx3s3vLm1y2FuaFdyro0zwjwbNdpoHu5DOsxcCHRgeX0Z8Uv9Q==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-api-design-systems" "^0.69.0"
"@swagger-api/apidom-parser-adapter-json" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-api-design-systems" "^0.69.1"
"@swagger-api/apidom-parser-adapter-json" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-0.69.0.tgz#10b89dff03f1756249318e46ffb2de0dada77060"
integrity sha512-bqgf+iHK3qrANJ5zrQJ+BoWrIftL4YhCfZyE/aWwnGW1BKdB4uGC94rx9DHhS8ZfNPz7AnW+ki6ISXpYOD8uyw==
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-0.69.1.tgz#3d0c7332ffbf39345acb2e0d3fab8b5b6d5170a1"
integrity sha512-XDH6u9MxoRKUuwWP2SxUK3aXgkFryI85IYwElRb6Utj1ndKowC1go58bCry0jBaIj1cdZREe8hZxaiuqKTSnwg==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-api-design-systems" "^0.69.0"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-api-design-systems" "^0.69.1"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-asyncapi-json-2@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-0.69.0.tgz#b54bd05c8f182993481572e85c05bcc5565e1599"
integrity sha512-3b1nGsbFh6DAUDB9plQE5iyqOE37DZS/X34Hr+5ENiq7DFA/19UYeUSJQfU+kWjtFzRDHBRluPo38nHdGnh4gg==
"@swagger-api/apidom-parser-adapter-asyncapi-json-2@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-0.69.1.tgz#393fd221a4a5c1f25e4df7f97b75c296801168c5"
integrity sha512-OvyCA9HMk2AZqjVqguANzGB1FEzHSGOqrtXql99JLxzwcxo8euDdfwQ7dZURxTvM/XwPmAeVZkgChhicidn5uQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-asyncapi-2" "^0.69.0"
"@swagger-api/apidom-parser-adapter-json" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-asyncapi-2" "^0.69.1"
"@swagger-api/apidom-parser-adapter-json" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-0.69.0.tgz#a955c9894d4b030cd74172cb0238dbd8f01c4ff5"
integrity sha512-JEuZw04wdtbn1WFkavB9Yn8MNAWtfUdlD6naa/Z4CL0iUOhC5BzG9dUfe6gn+Z+xtFRHm3MHMh9B6Xdr3MWDBg==
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-0.69.1.tgz#a304e8161ce3048348f57f70b08e803a52189395"
integrity sha512-wb1Ys1n2q8DFYDbUrFNex/+57D2I9QFdY6L/vV7skrIUafYxPmN9LPpB3TQ8cpEAwvgkRvzUI3B7rHrvA5d1QA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-asyncapi-2" "^0.69.0"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-asyncapi-2" "^0.69.1"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-json@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-0.69.0.tgz#1781852210b585c9bfc0c4923e2fba2d4f6d425a"
integrity sha512-wNSYD9FU31aSBnCCp3Nt2ZZVAdu1LGGWmlLKmcOx7SXi79F1E+T6RtqyoLa0VBGKPVEwDtaH8kWRsZzXpUZVvQ==
"@swagger-api/apidom-parser-adapter-json@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-0.69.1.tgz#9faa085c822ed321795e7ddeb5cca217f4cd4e95"
integrity sha512-YSLdRE0QJ05OnGvXVViQNmdPraY0oqGVsatID+nxB6vBmFJVh7nFeEqQc3wEK/6sMWu8qeKhF2UfgPKBilpNsA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-ast" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
@ -1923,66 +1923,66 @@
tree-sitter-json "=0.20.0"
web-tree-sitter "=0.20.7"
"@swagger-api/apidom-parser-adapter-openapi-json-3-0@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-0.69.0.tgz#ebec1c17a2309d73a82b4f89c7c54fe8172e97d6"
integrity sha512-aSNFJ4he67c5Vz9+FbKKnJzy9JdmSDqzeog8CTiLI8TFrCvj9KQns68NbemyxHHc7uH9TcOwXq3WbXgXSWv60A==
"@swagger-api/apidom-parser-adapter-openapi-json-3-0@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-0.69.1.tgz#d845affd3119310d55b7a03f453b323b02d4d2ec"
integrity sha512-QHIVhrcc+1ktICZh3hMU9mgiJQ4h+iN9WiG4MVAlWqSvv1fbpZWb0rmhPbdP6pLw20NEVPT0L7Mi9gVB7HOX1A==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.0"
"@swagger-api/apidom-parser-adapter-json" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.1"
"@swagger-api/apidom-parser-adapter-json" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-openapi-json-3-1@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-0.69.0.tgz#3591798572c5e9eed91bbb7703364d925b53b08d"
integrity sha512-7TCnTTKMVTyDiX7MKhphmqUaoKtWLOgKCaPEtBRFgd94yOkobWBKw7yG6G+0rdsCIb4Q9AFcL39eUDh5yI45/w==
"@swagger-api/apidom-parser-adapter-openapi-json-3-1@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-0.69.1.tgz#077cb4b96dca5eda18d705c3d190a0073fb6e6ac"
integrity sha512-I6nMgW2jnet4PDDlN3jzKPMvTiVS1SryqWsYmaxijiyLLtR0YWm9ykFAkNevsCQvsCGdm+ag018rONTqpEURRQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.0"
"@swagger-api/apidom-parser-adapter-json" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.1"
"@swagger-api/apidom-parser-adapter-json" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-0.69.0.tgz#eea33e6c10fc6bb4806bdf4cbdd1026af4b7fac8"
integrity sha512-mrKLsNMsJr5Z4cUDO4v5vt59uGGWfLL36hTuSKcqO9IH/3nziPrYJ7Kd4VdiJaQYqFuUQCEG7A2pOZfkpbR1KA==
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-0.69.1.tgz#6843cac67d721111188a12fad62bc6538a72b8f6"
integrity sha512-mc1DYPMAKUNj0Fn4EA30MFu/n6np4MkYBn8eNS5dGPIjP4EbrphmGWkwMa250a9rjGNM4iww5bWWWiajMAU5bA==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.0"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.1"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-0.69.0.tgz#1a139e8bfdab774354b1dc5598e9e04c063174b9"
integrity sha512-tEyNhlGoQ7/CnC0K3NqBWfhi90U+5fFDl7Z2PyV/+fRG1F0okAoHwp9+Q3/BieWdiZ5OChX8yxwOdq1kJ2+TTQ==
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-0.69.1.tgz#1773c48215b03699bf38c3a461e19f96a74c8575"
integrity sha512-FjDD9JOrdCOr+K75PAje6CD9F4kr52xXabXoTG8fwJz1LfiZSVj5rCde1DU7NNkI0JQc1t/nJyFTz4pz0mGlcQ==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.0"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.1"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
"@swagger-api/apidom-parser-adapter-yaml-1-2@^0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-0.69.0.tgz#d95aab7e8b34bc703f510250bfc8f315dd87fd31"
integrity sha512-wfvFXg9xSz89hg/MRd1u6ESUb2UQmVJVIS2wWZwi1UXN9+F3Yh2l8RB5JchJYb5bqu2HX1ZYJ6FxG3dQTQICyQ==
"@swagger-api/apidom-parser-adapter-yaml-1-2@^0.69.1":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-0.69.1.tgz#290f8c0b10b165a6fe09ab292ebe61861a0d3b95"
integrity sha512-RbAaxdhEAuc9ZAWhvCss1yQQ/AW85keuvzoqFIOZ7Px2UaSoBRQVTYq7sFou9LhLJbOF1Iz6Hs1wTqqq6QRf3A==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-ast" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@types/ramda" "=0.28.23"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
@ -1991,35 +1991,35 @@
tree-sitter-yaml "=0.5.0"
web-tree-sitter "=0.20.7"
"@swagger-api/apidom-reference@=0.69.0":
version "0.69.0"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-reference/-/apidom-reference-0.69.0.tgz#c7402693f40dde3e5b01725fdb3fda02b4b11bea"
integrity sha512-Sc3My/qTa90ofWXRaULkQ2oCUlgUCTbPN209jk/Lg0cywPTgeVEVn7Awpp2ftxl007uPPr2PwUzn/K6zzj+gyg==
"@swagger-api/apidom-reference@>=0.69.1 <1.0.0":
version "0.69.1"
resolved "https://registry.yarnpkg.com/@swagger-api/apidom-reference/-/apidom-reference-0.69.1.tgz#2d27ce8ffcc720f3a21dbe1d4d553ef9f3e1b2cf"
integrity sha512-P/HD5l9zoQAR6H6IL52Y4SjxBXRCY2kzXa0CH+jKqpNNQxLEPf7penP9T6rH339BvKhATK5LanxDYtQZRCDBdw==
dependencies:
"@babel/runtime-corejs3" "^7.20.7"
"@swagger-api/apidom-core" "^0.69.0"
"@swagger-api/apidom-core" "^0.69.1"
"@types/ramda" "=0.28.23"
axios "=1.3.4"
minimatch "=7.3.0"
minimatch "=7.4.3"
process "=0.11.10"
ramda "=0.28.0"
ramda-adjunct "=3.4.0"
stampit "=4.3.2"
optionalDependencies:
"@swagger-api/apidom-json-pointer" "^0.69.0"
"@swagger-api/apidom-ns-asyncapi-2" "^0.69.0"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.0"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.0"
"@swagger-api/apidom-parser-adapter-api-design-systems-json" "^0.69.0"
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml" "^0.69.0"
"@swagger-api/apidom-parser-adapter-asyncapi-json-2" "^0.69.0"
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2" "^0.69.0"
"@swagger-api/apidom-parser-adapter-json" "^0.69.0"
"@swagger-api/apidom-parser-adapter-openapi-json-3-0" "^0.69.0"
"@swagger-api/apidom-parser-adapter-openapi-json-3-1" "^0.69.0"
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0" "^0.69.0"
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1" "^0.69.0"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.0"
"@swagger-api/apidom-json-pointer" "^0.69.1"
"@swagger-api/apidom-ns-asyncapi-2" "^0.69.1"
"@swagger-api/apidom-ns-openapi-3-0" "^0.69.1"
"@swagger-api/apidom-ns-openapi-3-1" "^0.69.1"
"@swagger-api/apidom-parser-adapter-api-design-systems-json" "^0.69.1"
"@swagger-api/apidom-parser-adapter-api-design-systems-yaml" "^0.69.1"
"@swagger-api/apidom-parser-adapter-asyncapi-json-2" "^0.69.1"
"@swagger-api/apidom-parser-adapter-asyncapi-yaml-2" "^0.69.1"
"@swagger-api/apidom-parser-adapter-json" "^0.69.1"
"@swagger-api/apidom-parser-adapter-openapi-json-3-0" "^0.69.1"
"@swagger-api/apidom-parser-adapter-openapi-json-3-1" "^0.69.1"
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-0" "^0.69.1"
"@swagger-api/apidom-parser-adapter-openapi-yaml-3-1" "^0.69.1"
"@swagger-api/apidom-parser-adapter-yaml-1-2" "^0.69.1"
"@swc/helpers@^0.4.14":
version "0.4.14"
@ -2974,7 +2974,7 @@ 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.3.4, axios@^1.3.4:
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==
@ -2983,6 +2983,15 @@ axios@=1.3.4, axios@^1.3.4:
form-data "^4.0.0"
proxy-from-env "^1.1.0"
axios@^1.3.5:
version "1.3.5"
resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.5.tgz#e07209b39a0d11848e3e341fa087acd71dadc542"
integrity sha512-glL/PvG/E+xCWwV8S6nCHcrfg1exGx7vxyUIivIA1iL7BIh6bePylCfVHwp6k13ao7SATxB6imau2kqY+I67kw==
dependencies:
follow-redirects "^1.15.0"
form-data "^4.0.0"
proxy-from-env "^1.1.0"
axobject-query@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
@ -4234,10 +4243,10 @@ domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
dependencies:
domelementtype "^2.2.0"
dompurify@=2.3.10:
version "2.3.10"
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.10.tgz#901f7390ffe16a91a5a556b94043314cd4850385"
integrity sha512-o7Fg/AgC7p/XpKjf/+RC3Ok6k4St5F7Q6q6+Nnm3p2zGWioAY6dh0CbbuwOhH2UcSzKsdniE/YnE2/92JcsA+g==
dompurify@=3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.0.1.tgz#a0933f38931b3238934dd632043b727e53004289"
integrity sha512-60tsgvPKwItxZZdfLmamp0MTcecCta3avOhsLgPZ0qcWt96OasFfhkeIRbJ6br5i0fQawT1/RBGB5L58/Jpwuw==
domutils@^1.7.0:
version "1.7.0"
@ -5508,10 +5517,10 @@ i18next-localstorage-backend@^4.1.0:
dependencies:
"@babel/runtime" "^7.20.6"
i18next@^22.4.13:
version "22.4.13"
resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.4.13.tgz#02e291ab0056eab13b7d356fb454ff991923eaa0"
integrity sha512-GX7flMHRRqQA0I1yGLmaZ4Hwt1JfLqagk8QPDPZsqekbKtXsuIngSVWM/s3SLgNkrEXjA+0sMGNuOEkkmyqmWg==
i18next@^22.4.14:
version "22.4.14"
resolved "https://registry.yarnpkg.com/i18next/-/i18next-22.4.14.tgz#18dd94e9adc2618497c7de101a206e1ca3a18727"
integrity sha512-VtLPtbdwGn0+DAeE00YkiKKXadkwg+rBUV+0v8v0ikEjwdiJ0gmYChVE4GIa9HXymY6wKapkL93vGT7xpq6aTw==
dependencies:
"@babel/runtime" "^7.20.6"
@ -6804,10 +6813,10 @@ minimatch@3.0.4:
dependencies:
brace-expansion "^1.1.7"
minimatch@=7.3.0:
version "7.3.0"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.3.0.tgz#cfb7337e7460308e7147c58250fa0dee3da7929c"
integrity sha512-WaMDuhKa7a6zKiwplR1AOz+zGvJba24k5VU1Cy6NhEguavT2YRlHxuINUgTas4wiS6fwBpYq4TcA1XIECSntyw==
minimatch@=7.4.3:
version "7.4.3"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.3.tgz#012cbf110a65134bb354ae9773b55256cdb045a2"
integrity sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==
dependencies:
brace-expansion "^2.0.1"
@ -8338,19 +8347,19 @@ react-refresh@^0.11.0:
integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==
react-router-dom@6:
version "6.7.0"
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.7.0.tgz#0249f4ca4eb704562b8b0ff29caeb928c3a6ed38"
integrity sha512-jQtXUJyhso3kFw430+0SPCbmCmY1/kJv8iRffGHwHy3CkoomGxeYzMkmeSPYo6Egzh3FKJZRAL22yg5p2tXtfg==
version "6.10.0"
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.10.0.tgz#090ddc5c84dc41b583ce08468c4007c84245f61f"
integrity sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==
dependencies:
"@remix-run/router" "1.3.0"
react-router "6.7.0"
"@remix-run/router" "1.5.0"
react-router "6.10.0"
react-router@6.7.0:
version "6.7.0"
resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.7.0.tgz#db262684c13b5c2970694084ae9e8531718a0681"
integrity sha512-KNWlG622ddq29MAM159uUsNMdbX8USruoKnwMMQcs/QWZgFUayICSn2oB7reHce1zPj6CG18kfkZIunSSRyGHg==
react-router@6.10.0:
version "6.10.0"
resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.10.0.tgz#230f824fde9dd0270781b5cb497912de32c0a971"
integrity sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==
dependencies:
"@remix-run/router" "1.3.0"
"@remix-run/router" "1.5.0"
react-scripts@5.0.1:
version "5.0.1"
@ -8789,10 +8798,10 @@ sass-loader@^12.3.0:
klona "^2.0.4"
neo-async "^2.6.2"
sass@^1.60.0:
version "1.60.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.60.0.tgz#657f0c23a302ac494b09a5ba8497b739fb5b5a81"
integrity sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==
sass@^1.61.0:
version "1.61.0"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.61.0.tgz#d1f6761bb833887b8fdab32a24e052c40531d02b"
integrity sha512-PDsN7BrVkNZK2+dj/dpKQAWZavbAQ87IXqVvw2+oEYI+GwlTWkvbQtL7F2cCNbMqJEYKPh1EcjSxsnqIb/kyaQ==
dependencies:
chokidar ">=3.0.0 <4.0.0"
immutable "^4.0.0"
@ -9439,16 +9448,16 @@ svgo@^2.7.0:
picocolors "^1.0.0"
stable "^0.1.8"
swagger-client@^3.19.1:
version "3.19.2"
resolved "https://registry.yarnpkg.com/swagger-client/-/swagger-client-3.19.2.tgz#7fabea7d953c19532670f3ee983a61addb134304"
integrity sha512-oBR6VtD99yJOY8W3vf1h8zU91H5UpwUk2trSL4xzZIzChWtlaOMyWh+/GyUGgDCmQY4B1E4qTgAD/kFQ4dFnnA==
swagger-client@^3.19.5:
version "3.19.5"
resolved "https://registry.yarnpkg.com/swagger-client/-/swagger-client-3.19.5.tgz#5e2fc71cf0308a2e884265b416bce99e2fc19fe8"
integrity sha512-ssRMlGoYswj7/hlZV0EtGi406Y8/hfUAVw5SIqbWlsXSkaf+FfTWGRO39WOmbpfhsdLsskj/J2wmytPpbu2Njg==
dependencies:
"@babel/runtime-corejs3" "^7.20.13"
"@swagger-api/apidom-core" "=0.69.0"
"@swagger-api/apidom-json-pointer" "=0.69.0"
"@swagger-api/apidom-ns-openapi-3-1" "=0.69.0"
"@swagger-api/apidom-reference" "=0.69.0"
"@swagger-api/apidom-core" ">=0.69.1 <1.0.0"
"@swagger-api/apidom-json-pointer" ">=0.69.1 <1.0.0"
"@swagger-api/apidom-ns-openapi-3-1" ">=0.69.1 <1.0.0"
"@swagger-api/apidom-reference" ">=0.69.1 <1.0.0"
cookie "~0.5.0"
cross-fetch "^3.1.5"
deepmerge "~4.3.0"
@ -9462,10 +9471,10 @@ swagger-client@^3.19.1:
traverse "~0.6.6"
url "~0.11.0"
swagger-ui@^4.18.1:
version "4.18.1"
resolved "https://registry.yarnpkg.com/swagger-ui/-/swagger-ui-4.18.1.tgz#14b90dba50cb827e57747458ef455f99a677535b"
integrity sha512-KMG/Mg+b7oPtBOlpx9abbmU6Rm86kiVUvvpR3EkplBz0CSnseuQZN2XdDZKD7QsvM78NkUhn53y5EZCb+4rd1g==
swagger-ui@^4.18.2:
version "4.18.2"
resolved "https://registry.yarnpkg.com/swagger-ui/-/swagger-ui-4.18.2.tgz#35b4c05aedb5c055d4698932f42c4dd23f680073"
integrity sha512-0IFzqYLBZ2BQYOW5lbDzF9BZl2o2/IDXYhErsazUXHWIXLkMDCxsgd+ocdj4AGtUO3gdGk4QZgHkJwZb/OGbgg==
dependencies:
"@babel/runtime-corejs3" "^7.18.9"
"@braintree/sanitize-url" "=6.0.2"
@ -9473,7 +9482,7 @@ swagger-ui@^4.18.1:
classnames "^2.3.1"
css.escape "1.5.1"
deep-extend "0.6.0"
dompurify "=2.3.10"
dompurify "=3.0.1"
ieee754 "^1.2.1"
immutable "^3.x.x"
js-file-download "^0.4.12"
@ -9498,7 +9507,7 @@ swagger-ui@^4.18.1:
reselect "^4.1.5"
serialize-error "^8.1.0"
sha.js "^2.4.11"
swagger-client "^3.19.1"
swagger-client "^3.19.5"
url-parse "^1.5.8"
xml "=1.0.1"
xml-but-prettier "^1.0.1"