ServerPluginTabs now parses extra pages for wide tables

This commit is contained in:
Rsl1122 2019-08-25 19:43:59 +03:00
parent 5a87dfa7e8
commit 65ddbb2ef0
5 changed files with 64 additions and 114 deletions

View File

@ -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);

View File

@ -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;
}
}
}

View File

@ -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);

View File

@ -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> &middot; " + 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>" +

View File

@ -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.