Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

layout hints api #1452

Merged
merged 2 commits into from
Oct 18, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package io.deephaven.web.client.api;

import elemental2.core.JsObject;
import jsinterop.annotations.JsProperty;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;

public class JsLayoutHints {

private boolean savedLayoutsAllowed = true;
private String[] frontColumns;
private String[] backColumns;
private String[] hiddenColumns;
private String[] frozenColumns;

public JsLayoutHints parse(String hints) {
if (hints == null || hints.isEmpty()) {
return this;
}

final Map<String, String> options = Arrays.stream(hints.split(";"))
.map(hint -> hint.split("="))
.collect(Collectors.toMap(parts -> parts[0], parts -> parts.length == 2 ? parts[1] : ""));


if (options.containsKey("noSavedLayouts")) {
savedLayoutsAllowed = false;
}

final String frontStr = options.get("front");
if (frontStr != null && !frontStr.isEmpty()) {
frontColumns = JsObject.freeze(frontStr.split(","));
}

final String endStr = options.get("back");
if (endStr != null && !endStr.isEmpty()) {
backColumns = JsObject.freeze(endStr.split(","));
}

final String hideStr = options.get("hide");
if (hideStr != null && !hideStr.isEmpty()) {
hiddenColumns = JsObject.freeze(hideStr.split(","));
}

final String freezeStr = options.get("freeze");
if (freezeStr != null && !freezeStr.isEmpty()) {
frozenColumns = JsObject.freeze(freezeStr.split(","));
}

return this;
}

@JsProperty
public boolean getAreSavedLayoutsAllowed() {
return savedLayoutsAllowed;
}

@JsProperty
public String[] getFrontColumns() {
return frontColumns;
}

@JsProperty
public String[] getBackColumns() {
return backColumns;
}

@JsProperty
public String[] getHiddenColumns() {
return hiddenColumns;
}

@JsProperty
public String[] getFrozenColumns() {
return frozenColumns;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,11 @@ public JsArray<Column> getColumns() {
return Js.uncheckedCast(lastVisibleState().getColumns());
}

@JsProperty
public JsLayoutHints getLayoutHints() {
return lastVisibleState().getLayoutHints();
}

@JsProperty
public double getSize() {
TableViewportSubscription subscription = subscriptions.get(getHandle());
Expand Down Expand Up @@ -586,11 +591,7 @@ public JsTotalsTableConfig getTotalsTableConfig() {
// returning null here, rather than a default config. They can then easily build a
// default config, but without this ability, there is no way to indicate that the
// config omitted a totals table
String config = lastVisibleState().getTableDef().getAttributes().getTotalsTableConfig();
if (config == null) {
return null;
}
return JsTotalsTableConfig.parse(config);
return lastVisibleState().getTotalsTableConfig();
}

private Promise<JsTotalsTable> fetchTotals(Object config, JsProvider<ClientTableState> state) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,8 @@ public enum ResolutionState {
// non-final fields, but can only be set once (consider moving these into a bean of their own)
private Column[] columns;
private Column[] allColumns; // includes invisible columns
private JsLayoutHints layoutHints;
private JsTotalsTableConfig totalsTableConfig;
private long size;
private InitialTableDefinition tableDef;
private Column rowFormatColumn;
Expand Down Expand Up @@ -318,6 +320,20 @@ public Column[] getAllColumns() {
return allColumns;
}

public JsLayoutHints getLayoutHints() {
if (layoutHints == null) {
createLayoutHints();
}
return layoutHints;
}

public JsTotalsTableConfig getTotalsTableConfig() {
if (totalsTableConfig == null) {
createTotalsTableConfig();
}
return totalsTableConfig;
}

public long getSize() {
return size;
}
Expand Down Expand Up @@ -361,6 +377,26 @@ private void setTableDef(InitialTableDefinition tableDef) {
}
}

private void createLayoutHints() {
String hintsString = getTableDef().getAttributes().getLayoutHints();
JsLayoutHints jsHints = new JsLayoutHints();
if (hintsString == null) {
layoutHints = null;
} else {
layoutHints = jsHints.parse(hintsString);
}
}

private void createTotalsTableConfig() {
String configString = getTableDef().getAttributes().getTotalsTableConfig();

if (configString == null) {
totalsTableConfig = null;
} else {
totalsTableConfig = JsTotalsTableConfig.parse(configString);
}
}

private void createColumns() {
ColumnDefinition[] columnDefinitions = tableDef.getColumns();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public class TableAttributesDefinition implements Serializable {
COLUMN_DESCRIPTIONS_ATTRIBUTE = "ColumnDescriptions",
HIERARCHICAL_SOURCE_TABLE_ATTRIBUTE = "HierarchicalSourceTable",
HIERARCHICAL_SOURCE_INFO_ATTRIBUTE = "HierarchicalSourceTableInfo",
LAYOUT_HINTS_ATTRIBUTE = "LayoutHints",
PLUGIN_NAME = "PluginName";

// special cased attributes that have a complex type yet are always sent
Expand Down Expand Up @@ -104,4 +105,8 @@ public String getDescription() {
public String getPluginName() {
return getAsMap().get(PLUGIN_NAME);
}

public String getLayoutHints() {
return getAsMap().get(LAYOUT_HINTS_ATTRIBUTE);
}
}