ServerPluginTabs now parses extra pages for wide tables
This commit is contained in:
parent
5a87dfa7e8
commit
65ddbb2ef0
|
@ -18,6 +18,7 @@ package com.djrapitops.plan.extension.implementation.results.server;
|
|||
|
||||
import com.djrapitops.plan.extension.implementation.results.ExtensionInformation;
|
||||
import com.djrapitops.plan.extension.implementation.results.ExtensionTabData;
|
||||
import com.djrapitops.plan.extension.implementation.results.ExtensionTableData;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
|
@ -52,6 +53,15 @@ public class ExtensionServerData implements Comparable<ExtensionServerData> {
|
|||
return tabs.size() == 1 && tabs.containsKey("");
|
||||
}
|
||||
|
||||
public boolean doesNeedWiderSpace() {
|
||||
for (ExtensionTabData tab : tabs.values()) {
|
||||
for (ExtensionTableData table : tab.getTableData()) {
|
||||
if (table.isWideTable()) return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public List<ExtensionTabData> getTabs() {
|
||||
List<ExtensionTabData> tabList = new ArrayList<>(tabs.values());
|
||||
Collections.sort(tabList);
|
||||
|
|
|
@ -1,77 +0,0 @@
|
|||
/*
|
||||
* This file is part of Player Analytics (Plan).
|
||||
*
|
||||
* Plan is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License v3 as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* Plan is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package com.djrapitops.plan.system.json;
|
||||
|
||||
import com.djrapitops.plan.api.exceptions.WebUserAuthException;
|
||||
import com.djrapitops.plan.extension.implementation.results.server.ExtensionServerData;
|
||||
import com.djrapitops.plan.extension.implementation.storage.queries.ExtensionServerDataQuery;
|
||||
import com.djrapitops.plan.system.Identifiers;
|
||||
import com.djrapitops.plan.system.database.DBSystem;
|
||||
import com.djrapitops.plan.system.webserver.RequestTarget;
|
||||
import com.djrapitops.plan.system.webserver.auth.Authentication;
|
||||
import com.djrapitops.plan.system.webserver.pages.json.ServerTabJSONHandler;
|
||||
import com.djrapitops.plan.utilities.formatting.Formatters;
|
||||
import com.djrapitops.plan.utilities.html.pages.ServerPluginTabs;
|
||||
|
||||
import javax.inject.Inject;
|
||||
import javax.inject.Singleton;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Parses JSON for with different plugin data html in it.
|
||||
*/
|
||||
@Singleton
|
||||
public class PluginTabJSONParser extends ServerTabJSONHandler<Object> {
|
||||
|
||||
@Inject
|
||||
public PluginTabJSONParser(
|
||||
DBSystem dbSystem,
|
||||
Formatters formatters,
|
||||
Identifiers identifiers
|
||||
) {
|
||||
super(identifiers, serverUUID -> {
|
||||
List<ExtensionServerData> extensionData = dbSystem.getDatabase()
|
||||
.query(new ExtensionServerDataQuery(serverUUID));
|
||||
|
||||
ServerPluginTabs pluginTabs = new ServerPluginTabs(extensionData, formatters);
|
||||
return new ExtensionTabs(pluginTabs.getNav(), pluginTabs.getTabs());
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isAuthorized(Authentication auth, RequestTarget target) throws WebUserAuthException {
|
||||
return auth.getWebUser().getPermLevel() <= 0;
|
||||
}
|
||||
|
||||
public static class ExtensionTabs {
|
||||
private final String navigation;
|
||||
private final String content;
|
||||
|
||||
public ExtensionTabs(String navigation, String content) {
|
||||
this.navigation = navigation;
|
||||
this.content = content;
|
||||
}
|
||||
|
||||
public String getNavigation() {
|
||||
return navigation;
|
||||
}
|
||||
|
||||
public String getContent() {
|
||||
return content;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -45,7 +45,6 @@ public class RootJSONHandler extends TreePageHandler {
|
|||
GraphsJSONHandler graphsJSONHandler,
|
||||
SessionsJSONHandler sessionsJSONHandler,
|
||||
PlayersTableJSONHandler playersTableJSONHandler,
|
||||
PluginTabJSONParser pluginTabJSONParser,
|
||||
ServerOverviewJSONParser serverOverviewJSONParser,
|
||||
OnlineActivityOverviewJSONParser onlineActivityOverviewJSONParser,
|
||||
SessionsOverviewJSONParser sessionsOverviewJSONParser,
|
||||
|
@ -65,7 +64,6 @@ public class RootJSONHandler extends TreePageHandler {
|
|||
registerPage("kills", playerKillsJSONHandler);
|
||||
registerPage("pingTable", jsonFactory::pingPerGeolocation);
|
||||
registerPage("graph", graphsJSONHandler);
|
||||
registerPage("extensions", pluginTabJSONParser);
|
||||
|
||||
registerPage("serverOverview", serverOverviewJSONParser);
|
||||
registerPage("onlineOverview", onlineActivityOverviewJSONParser);
|
||||
|
|
|
@ -31,6 +31,7 @@ import com.djrapitops.plan.utilities.html.structure.NavLink;
|
|||
import com.djrapitops.plan.utilities.html.structure.TabsElement;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Responsible for generating /server page plugin tabs based on DataExtension API data.
|
||||
|
@ -43,19 +44,18 @@ import java.util.*;
|
|||
public class ServerPluginTabs {
|
||||
|
||||
private List<ExtensionServerData> serverData;
|
||||
private List<ExtensionServerData> extraTabServerData;
|
||||
|
||||
private Map<FormatType, Formatter<Long>> numberFormatters;
|
||||
|
||||
private Formatter<Double> decimalFormatter;
|
||||
private Formatter<Double> percentageFormatter;
|
||||
|
||||
private String nav;
|
||||
private StringBuilder nav;
|
||||
private String tab;
|
||||
|
||||
private boolean hasWideTable;
|
||||
|
||||
public ServerPluginTabs(String nav, String tab) {
|
||||
this.nav = nav;
|
||||
this.nav = new StringBuilder(nav);
|
||||
this.tab = tab;
|
||||
}
|
||||
|
||||
|
@ -64,6 +64,10 @@ public class ServerPluginTabs {
|
|||
Formatters formatters
|
||||
) {
|
||||
this.serverData = serverData;
|
||||
this.extraTabServerData = serverData.stream()
|
||||
.filter(ExtensionServerData::doesNeedWiderSpace)
|
||||
.collect(Collectors.toList());
|
||||
this.serverData.removeAll(extraTabServerData);
|
||||
|
||||
numberFormatters = new EnumMap<>(FormatType.class);
|
||||
numberFormatters.put(FormatType.DATE_SECOND, formatters.secondLong());
|
||||
|
@ -74,13 +78,11 @@ public class ServerPluginTabs {
|
|||
this.decimalFormatter = formatters.decimals();
|
||||
this.percentageFormatter = formatters.percentage();
|
||||
|
||||
hasWideTable = false;
|
||||
|
||||
generate();
|
||||
}
|
||||
|
||||
public String getNav() {
|
||||
return nav;
|
||||
return nav.toString();
|
||||
}
|
||||
|
||||
public String getTabs() {
|
||||
|
@ -89,19 +91,50 @@ public class ServerPluginTabs {
|
|||
|
||||
private void generate() {
|
||||
if (serverData.isEmpty()) {
|
||||
nav = new NavLink(Icon.called("cubes").build(), "Overview (No Data)").toHtml();
|
||||
nav = new StringBuilder(new NavLink(Icon.called("cubes").build(), "Overview (No Data)").toHtml());
|
||||
tab = wrapInTab(
|
||||
"<div class=\"col-md-12\"><div class=\"card\"><div class=\"card-body\"><p>No Extension Data</p></div></div></div>"
|
||||
);
|
||||
} else {
|
||||
nav = new NavLink(Icon.called("cubes").build(), "Overview").toHtml();
|
||||
tab = generatePageTab();
|
||||
nav = new StringBuilder(new NavLink(Icon.called("cubes").build(), "Overview").toHtml());
|
||||
tab = generatePageTabs();
|
||||
}
|
||||
}
|
||||
|
||||
private String generatePageTab() {
|
||||
private String generatePageTabs() {
|
||||
Collections.sort(serverData);
|
||||
|
||||
String overviewTab = generateOverviewTab();
|
||||
String extraTabs = generateExtraTabs();
|
||||
|
||||
return overviewTab + extraTabs;
|
||||
}
|
||||
|
||||
private String generateExtraTabs() {
|
||||
StringBuilder tabBuilder = new StringBuilder();
|
||||
|
||||
for (ExtensionServerData datum : extraTabServerData) {
|
||||
ExtensionInformation extensionInformation = datum.getExtensionInformation();
|
||||
|
||||
boolean onlyGeneric = datum.hasOnlyGenericTab();
|
||||
|
||||
String tabsElement;
|
||||
if (onlyGeneric) {
|
||||
ExtensionTabData genericTabData = datum.getTabs().get(0);
|
||||
tabsElement = parseContentHtml(genericTabData);
|
||||
} else {
|
||||
tabsElement = new TabsElement(
|
||||
datum.getTabs().stream().map(this::wrapToTabElementTab).toArray(TabsElement.Tab[]::new)
|
||||
).toHtmlFull();
|
||||
}
|
||||
|
||||
tabBuilder.append(wrapInTab(extensionInformation, wrapInContainer(extensionInformation, tabsElement)));
|
||||
nav.append(new NavLink(Icon.fromExtensionIcon(extensionInformation.getIcon()), extensionInformation.getPluginName()).toHtml());
|
||||
}
|
||||
return tabBuilder.toString();
|
||||
}
|
||||
|
||||
private String generateOverviewTab() {
|
||||
StringBuilder tabBuilder = new StringBuilder();
|
||||
|
||||
for (ExtensionServerData datum : serverData) {
|
||||
|
@ -135,6 +168,16 @@ public class ServerPluginTabs {
|
|||
"<div class=\"card-columns\">" + content + "</div></div></div>";
|
||||
}
|
||||
|
||||
private String wrapInTab(ExtensionInformation info, String content) {
|
||||
return "<div class=\"tab\"><div class=\"container-fluid mt-4\">" +
|
||||
// Page heading
|
||||
"<div class=\"d-sm-flex align-items-center justify-content-between mb-4\">" +
|
||||
"<h1 class=\"h3 mb-0 text-gray-800\"><i class=\"sidebar-toggler fa fa-fw fa-bars\"></i><span class=\"server-name\"></span> · " + info.getPluginName() + "</h1>${backButton}" +
|
||||
"</div>" +
|
||||
// End Page heading
|
||||
"<div class=\"row\"><div class=\"col-xl-12 col-sm-12\">" + content + "</div></div></div></div>";
|
||||
}
|
||||
|
||||
private TabsElement.Tab wrapToTabElementTab(ExtensionTabData tabData) {
|
||||
TabInformation tabInformation = tabData.getTabInformation();
|
||||
String tabContentHtml = parseContentHtml(tabData);
|
||||
|
@ -175,9 +218,6 @@ public class ServerPluginTabs {
|
|||
private String parseTablesHtml(ExtensionTabData tabData) {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
for (ExtensionTableData tableData : tabData.getTableData()) {
|
||||
if (tableData.isWideTable()) {
|
||||
hasWideTable = true;
|
||||
}
|
||||
builder.append(tableData.getHtmlTable().parseHtml());
|
||||
}
|
||||
return builder.toString();
|
||||
|
@ -207,8 +247,6 @@ public class ServerPluginTabs {
|
|||
}
|
||||
|
||||
private String wrapInContainer(ExtensionInformation information, String tabsElement) {
|
||||
String colWidth = hasWideTable ? "col-md-8 col-lg-8 col-sm-12" : "col-md-4 col-lg-4 col-sm-12";
|
||||
// TODO move large tables to their own tabs
|
||||
return "<div class=\"card shadow mb-4\">" +
|
||||
"<div class=\"card-header py-3\">" +
|
||||
"<h6 class=\"m-0 font-weight-bold col-black\">" + Icon.fromExtensionIcon(information.getIcon()) + ' ' + information.getPluginName() + "</h6>" +
|
||||
|
|
|
@ -67,25 +67,6 @@ Parameter|Expected value|Description
|
|||
--|--|--
|
||||
`server` | Name or UUID of a Plan server | Used for identifying Plan server that the data should be about
|
||||
|
||||
### `GET /v1/extensions`
|
||||
|
||||
Obtain html for data extension tabs and navigation.
|
||||
|
||||
Returns:
|
||||
```javascript
|
||||
{
|
||||
String (html),
|
||||
tabs;: String (html)
|
||||
}
|
||||
```
|
||||
|
||||
Required parameters: `server`
|
||||
|
||||
Parameter|Expected value|Description
|
||||
--|--|--
|
||||
`server` | Name or UUID of a Plan server | Used for identifying Plan server that the data should be about
|
||||
|
||||
|
||||
### `GET /v1/graph`
|
||||
|
||||
Obtain data for graphs.
|
||||
|
|
Loading…
Reference in New Issue