package com.sksamuel.jqm4gwt.examples.datatables;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.google.gwt.core.client.Callback;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsArray;
import com.google.gwt.core.client.JsArrayInteger;
import com.google.gwt.core.client.JsArrayMixed;
import com.google.gwt.dom.client.Element;
import com.google.gwt.dom.client.InputElement;
import com.google.gwt.dom.client.Node;
import com.google.gwt.dom.client.NodeList;
import com.google.gwt.dom.client.Style.FontWeight;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.dom.client.TableCellElement;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.Event;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Widget;
import com.sksamuel.jqm4gwt.Empty;
import com.sksamuel.jqm4gwt.HttpUtils;
import com.sksamuel.jqm4gwt.JQMCommon;
import com.sksamuel.jqm4gwt.JQMPage;
import com.sksamuel.jqm4gwt.JQMPageEvent;
import com.sksamuel.jqm4gwt.JsUtils;
import com.sksamuel.jqm4gwt.button.JQMButton;
import com.sksamuel.jqm4gwt.html.Span;
import com.sksamuel.jqm4gwt.plugins.datatables.ColumnDefEx;
import com.sksamuel.jqm4gwt.plugins.datatables.JQMDataTable;
import com.sksamuel.jqm4gwt.plugins.datatables.JQMDataTable.ColSort;
import com.sksamuel.jqm4gwt.plugins.datatables.JQMDataTable.ColSortDir;
import com.sksamuel.jqm4gwt.plugins.datatables.JQMDataTable.RowIdHelper;
import com.sksamuel.jqm4gwt.plugins.datatables.JQMDataTable.RowSelectMode;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.AjaxHandler;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.CellClickHandler;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.CellRender;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.DrawHandler;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.JsAjaxRequest;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.JsAjaxResponse;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.JsColItem;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.JsColItems;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.JsOrderItems;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.JsRowDataMetaInfo;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.RowData;
import com.sksamuel.jqm4gwt.plugins.datatables.JsDataTable.RowDetailsRenderer;
import com.sksamuel.jqm4gwt.plugins.datatables.events.JQMDataTableRowSelChangedEvent;
import com.sksamuel.jqm4gwt.table.ColumnDef;
public class DataTableExamplesPage {
private static DataTableExamplesPageUiBinder uiBinder = GWT
.create(DataTableExamplesPageUiBinder.class);
interface DataTableExamplesPageUiBinder extends UiBinder<JQMPage, DataTableExamplesPage> {
}
private JQMPage page;
@UiField
JQMDataTable dataTable1;
@UiField
JQMDataTable dataTable2;
@UiField
JQMDataTable dataTable3;
@UiField
JQMDataTable dataTable4;
@UiField
JQMDataTable dataTable5;
@UiField
JQMDataTable dataTable6;
@UiField
JQMButton btnUnselectAll;
@UiField
JQMButton btnGetSelected;
@UiField
JQMButton btnReplaceData;
@UiField
JQMButton btnDeleteSelRow;
@UiField
JQMButton btnClearSearch;
@UiField
Span selRowsInfo;
@UiField
JQMButton hideShowSalaryBtn;
@UiField
JQMButton hideShowTableBtn;
private static JsArray<JsArrayMixed> dataArray = null;
private static JsArray<JavaScriptObject> dataObjs = null;
private static class TestDataItem {
public final int id;
public final String code;
public final String name;
public TestDataItem(int id, String code, String name) {
this.id = id;
this.code = code;
this.name = name;
}
public String getValStr(String fieldName) {
if (Empty.is(fieldName)) return null;
switch (fieldName) {
case "id":
return String.valueOf(id);
case "code":
return code;
case "name":
return name;
default:
return null;
}
}
}
private static final List<TestDataItem> testDataItems = new ArrayList<>();
static {
testDataItems.add(new TestDataItem( 1, "aaa", "Alpha"));
testDataItems.add(new TestDataItem( 2, "bbb", "Beta"));
testDataItems.add(new TestDataItem( 3, "ccc", "Claw"));
testDataItems.add(new TestDataItem( 4, "ddd", "Draw"));
testDataItems.add(new TestDataItem( 5, "eee", "Effel"));
testDataItems.add(new TestDataItem( 6, "fff", "Fork"));
testDataItems.add(new TestDataItem( 7, "ggg", "Glow"));
testDataItems.add(new TestDataItem( 8, "hhh", "Halo"));
testDataItems.add(new TestDataItem( 9, "iii", "Irish"));
testDataItems.add(new TestDataItem(10, "jjj", "Jerk"));
testDataItems.add(new TestDataItem(11, "kkk", "Key"));
testDataItems.add(new TestDataItem(12, "lll", "Load"));
testDataItems.add(new TestDataItem(13, "mmm", "Mars"));
testDataItems.add(new TestDataItem(14, "nnn", "Night"));
testDataItems.add(new TestDataItem(15, "ooo", "Ork"));
testDataItems.add(new TestDataItem(16, "ppp", "Park"));
testDataItems.add(new TestDataItem(17, "qqq", "Quick"));
testDataItems.add(new TestDataItem(18, "rrr", "Road"));
testDataItems.add(new TestDataItem(19, "sss", "Salt"));
testDataItems.add(new TestDataItem(20, "ttt", "Toad"));
testDataItems.add(new TestDataItem(21, "uuu", "Uranus"));
testDataItems.add(new TestDataItem(22, "vvv", "Vortex"));
testDataItems.add(new TestDataItem(23, "www", "Work"));
testDataItems.add(new TestDataItem(24, "xxx", "Xonix"));
testDataItems.add(new TestDataItem(25, "yyy", "York"));
testDataItems.add(new TestDataItem(26, "zzz", "Zerg"));
}
public DataTableExamplesPage() {
page = uiBinder.createAndBindUi(this);
page.addPageHandler(new JQMPageEvent.DefaultHandler() {
@Override
public void onShow(JQMPageEvent event) {
dataTable5.adjustAllSizes();
}
});
hideShowSalaryBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
ColumnDefEx col = dataTable2.findColumn("salary");
if (col == null) return;
dataTable2.setColumnVisible(col.getName(), !col.isVisible());
}
});
hideShowTableBtn.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dataTable2.setVisible(!dataTable2.isVisible());
}
});
dataTable2.addCellBtnClickHandler(new CellClickHandler() {
@Override
public boolean onClick(Element cellElt, JavaScriptObject rowData, int rowIndex,
int colIndex, int colVisibleIdx) {
String s = dataTable2.getCellData(rowIndex, "name");
//Element tableElt = JsDataTable.findTableElt(cellElt);
//s += "\n\n" + tableElt.getInnerHTML();
Window.alert(s);
if (RowSelectMode.SINGLE.equals(dataTable2.getRowSelectMode())) {
dataTable2.selectOneRowOnly(cellElt);
} else if (RowSelectMode.MULTI.equals(dataTable2.getRowSelectMode())) {
dataTable2.changeRow(cellElt, true);
}
return true;
}
});
final CellClickHandler checkBoxClickHandler = new CellClickHandler() {
@Override
public boolean onClick(Element cellElt, JavaScriptObject rowData, int rowIndex,
int colIndex, int colVisibleIdx) {
Element tableElt = JsDataTable.findTableElt(cellElt);
JQMDataTable dataTable = (JQMDataTable) JQMCommon.findWidget(tableElt);
InputElement cb = cellElt.cast();
if (cb.isChecked()) {
if (RowSelectMode.SINGLE.equals(dataTable.getRowSelectMode())) {
dataTable.selectOneRowOnly(cb);
} else if (RowSelectMode.MULTI.equals(dataTable.getRowSelectMode())) {
dataTable.changeRow(cb, true);
}
} else if (dataTable.getRowSelectMode() != null) {
dataTable.changeRow(cb, false);
}
return true;
}
};
dataTable2.addCellCheckboxClickHandler(checkBoxClickHandler);
dataTable2.addRowDetailsRenderer(new RowDetailsRenderer() {
@Override
public String getHtml(Element tableElt, JavaScriptObject rowData, int rowIndex) {
String s = dataTable2.getColumnsAsTableHtml(rowIndex, "border='0' style='padding-left:50px;'");
s += "<button class='more-info-btn' style='margin-left:50px;' data-row-idx='"
+ String.valueOf(rowIndex) + "'>More Info...</button>";
s += "<button class='collapse-details-btn' style='margin-left:20px;' data-row-idx='"
+ String.valueOf(rowIndex) + "'>Collapse Details</button>";
return s;
}
});
dataTable2.addCellCustomClickHandler(new CellClickHandler() {
@Override
public boolean onClick(Element cellElt, JavaScriptObject rowData, int rowIndex,
int colIndex, int colVisibleIdx) {
dataTable2.closeRowDetails(cellElt);
return true;
}}, "td .collapse-details-btn");
dataTable2.addCellCustomClickHandler(new CellClickHandler() {
@Override
public boolean onClick(Element cellElt, JavaScriptObject rowData, int rowIndex,
int colIndex, int colVisibleIdx) {
String s = cellElt.getAttribute("data-row-idx");
s = dataTable2.getCellData(Integer.parseInt(s), "name");
Window.alert(s);
return true;
}}, "td .more-info-btn");
dataTable2.addRowSelChangedHandler(new JQMDataTableRowSelChangedEvent.Handler() {
@Override
public void onRowSelChanged(JQMDataTableRowSelChangedEvent event) {
JsArrayInteger sel = dataTable2.getSelRowIndexes();
if (sel.length() == 0) selRowsInfo.setText("No rows selected");
else {
if (sel.length() > 7) {
dataTable2.changeRow(event.getData().row, false/*selected*/);
sel = dataTable2.getSelRowIndexes();
String s = JsUtils.getObjValue(event.getData().rowData, "name");
Window.alert("Cannot select more than 7 records. Ignoring selection of: " + s);
}
selRowsInfo.setText("Selected: " + sel.length() + " rows");
}
}
});
btnUnselectAll.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
if (dataTable2.getRowSelectMode() != null) {
dataTable2.unselectAllRows();
}
}
});
btnGetSelected.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
JsArrayInteger sel = dataTable2.getSelRowIndexes();
if (sel.length() == 0) Window.alert("No rows selected");
else {
String msg = "";
for (int i = 0; i < sel.length(); i++) {
String s = dataTable2.getCellData(sel.get(i), "name");
msg += s + "\n";
}
Window.alert(msg);
}
}
});
btnClearSearch.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dataTable2.clearSearch();
}
});
btnReplaceData.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
JsArrayMixed d = dataTable3.getData().cast();
int len = d.length();
/*if (len > 0) {
JsArrayMixed r0 = d.getObject(0);
Window.alert("Total: " + String.valueOf(len) + " rows.\n" + r0.getString(0));
} else {
Window.alert("Empty table.");
}*/
dataTable3.clearData();
for (int i = 0; i <= len; i++) {
JsArrayMixed r = createDataRow(i);
dataTable3.addRow(r);
}
dataTable3.refreshDraw(true);
}
});
btnDeleteSelRow.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
dataTable3.removeSelRows();
dataTable3.refreshPage();
}
});
dataTable4.setRowIdHelper(new RowIdHelper() {
@Override
public String calcRowId(JQMDataTable table, JavaScriptObject rowData) {
JsArrayMixed r = rowData.cast();
String s = "";
for (int i = 0; i < r.length(); i++) {
s += r.getString(i);
}
return s;
}
});
dataTable4.setAjaxHandler(new AjaxHandler() {
@Override
public void getData(final Element tableElt, final JavaScriptObject request,
final JavaScriptObject drawCallback) {
if (dataArray == null) {
HttpUtils.httpGet("data/array.json", new Callback<String, String>() {
@Override
public void onSuccess(String result) {
JavaScriptObject obj = JsUtils.jsonParse(result);
dataArray = JsUtils.getNestedObjValue(obj, "data").cast();
getArrayServerData((JsAjaxRequest) request, drawCallback);
}
@Override
public void onFailure(String reason) {
Window.alert(reason);
}
});
} else {
getArrayServerData((JsAjaxRequest) request, drawCallback);
}
}
});
dataTable4.enhance();
dataTable5.addCellBtnClickHandler(new CellClickHandler() {
@Override
public boolean onClick(Element cellElt, JavaScriptObject rowData, int rowIndex,
int colIndex, int colVisibleIdx) {
String s = dataTable5.getCellData(rowIndex, "name");
Window.alert(s);
if (RowSelectMode.SINGLE.equals(dataTable5.getRowSelectMode())) {
dataTable5.selectOneRowOnly(cellElt);
} else if (RowSelectMode.MULTI.equals(dataTable5.getRowSelectMode())) {
dataTable5.changeRow(cellElt, true);
}
return true;
}
});
dataTable5.addCellCheckboxClickHandler(checkBoxClickHandler);
dataTable5.addRowDetailsRenderer(new RowDetailsRenderer() {
@Override
public String getHtml(Element tableElt, JavaScriptObject rowData, int rowIndex) {
return dataTable5.getColumnsAsTableHtml(rowIndex, "border='0' style='padding-left:50px;'");
}
});
dataTable5.setAjaxHandler(new AjaxHandler() {
@Override
public void getData(final Element tableElt, final JavaScriptObject request,
final JavaScriptObject drawCallback) {
if (dataObjs == null) {
HttpUtils.httpGet("data/nested-objects.json", new Callback<String, String>() {
@Override
public void onSuccess(String result) {
JavaScriptObject obj = JsUtils.jsonParse(result);
dataObjs = JsUtils.getNestedObjValue(obj, "data").cast();
JsAjaxRequest req = (JsAjaxRequest) request;
generateRowIds(req.getColumns());
getObjsServerData(req, drawCallback);
}
@Override
public void onFailure(String reason) {
Window.alert(reason);
}
});
} else {
getObjsServerData((JsAjaxRequest) request, drawCallback);
}
}
});
dataTable5.addDrawHandler(new DrawHandler() {
@Override
public void afterDraw(Element tableElt, JavaScriptObject settings) {
JsArray<Element> rows = JQMDataTable.doGrouping(settings, 4, new ColSort(2, ColSortDir.ASC));
for (int i = 0; i < rows.length(); i++) {
Element r = rows.get(i);
r.getStyle().setFontWeight(FontWeight.BOLD);
NodeList<Node> children = r.getChildNodes();
if (children != null && children.getLength() > 0) {
for (int j = 0; j < children.getLength(); j++) {
Node child = children.getItem(j);
String n = child.getNodeName();
if (TableCellElement.TAG_TD.equalsIgnoreCase(n)) {
String tdContent = ((TableCellElement) child).getInnerText();
Element btn = DOM.createButton();
btn.setInnerText("Info");
btn.getStyle().setMarginLeft(10, Unit.PX);
child.appendChild(btn);
Event.sinkEvents(btn, Event.ONCLICK);
Event.setEventListener(btn, event -> {
if (Event.ONCLICK == event.getTypeInt()) {
event.stopPropagation();
Window.alert(tdContent);
}
});
break;
}
}
}
}
}
@Override
public boolean beforeDraw(Element tableElt, JavaScriptObject settings) {
return true;
}
});
dataTable5.enhance();
dataTable6.addCellCheckboxClickHandler(checkBoxClickHandler);
dataTable6.addRowDetailsRenderer(new RowDetailsRenderer() {
@Override
public String getHtml(Element tableElt, JavaScriptObject rowData, int rowIndex) {
return dataTable6.getColumnsAsTableHtml(rowIndex, "border='0' style='padding-left:50px;'");
}
});
dataTable6.setAjaxHandler(new AjaxHandler() {
@Override
public void getData(final Element tableElt, final JavaScriptObject request,
final JavaScriptObject drawCallback) {
getJavaServerData((JQMDataTable) JQMCommon.findWidget(tableElt),
(JsAjaxRequest) request, drawCallback);
}
});
dataTable6.setRowData(new RowData() {
private final JsArrayMixed holder = JavaScriptObject.createArray(1).cast();
@Override
public JsArrayMixed onData(Element tableElt, JavaScriptObject rowData, String opType,
JavaScriptObject setVal, JavaScriptObject metaInfo) {
JsRowDataMetaInfo meta = metaInfo.cast();
Widget w = JQMCommon.findWidget(tableElt);
ColumnDefEx col = ((JQMDataTable) w).getColumn(meta.getCol());
if (Empty.is(col.getData())) {
holder.set(0, (JavaScriptObject) null);
return holder;
}
TestDataItem item = (TestDataItem) JsUtils.getNestedObjJavaValue(rowData, "dataItem");
switch (col.getData()) {
case "id":
holder.set(0, item.id);
break;
case "code":
holder.set(0, item.code);
break;
case "name":
holder.set(0, item.name);
break;
default:
holder.set(0, (JavaScriptObject) null);
break;
}
return holder;
}
});
dataTable6.setCellRender(new CellRender() {
@Override
public String onRender(Element tableElt, ColumnDef col, JsArrayMixed cellData,
JavaScriptObject rowData, String opType, JavaScriptObject metaInfo) {
if (!(col instanceof ColumnDefEx)) return null;
ColumnDefEx colEx = (ColumnDefEx) col;
if ("code".equals(colEx.getData())) {
TestDataItem item = (TestDataItem) JsUtils.getNestedObjJavaValue(rowData, "dataItem");
String s = "<input type='text' value='" + cellData.getString(0)
+ "' data-rowid='" + item.id
+ "' data-column='" + colEx.getData()
+ "' data-initval='" + item.code + "'>";
return s;
}
return null;
}});
dataTable6.addDrawHandler(new DrawHandler() {
@Override
public void afterDraw(Element tableElt, JavaScriptObject settings) {
}
@Override
public boolean beforeDraw(Element tableElt, JavaScriptObject settings) {
JsArray<Element> arr = getTableElts(tableElt, "input[type=text]");
String s = "";
for (int i = 0; i < arr.length(); i++) {
Element elt = arr.get(i);
String oldVal = elt.getAttribute("data-initval");
String newVal = JQMCommon.getVal(elt);
if (oldVal == newVal || oldVal != null && oldVal.equals(newVal)) {
// not changed
} else {
s += "rowId: " + elt.getAttribute("data-rowid") + "; ";
s += "column: " + elt.getAttribute("data-column") + "\n";
s += oldVal + " -> " + newVal + "\n\n";
}
}
if (!s.isEmpty()) Window.alert(s);
return true;
}
});
dataTable6.enhance();
}
private static native JsArray<Element> getTableElts(Element tableElt, String selector) /*-{
var rslt = $wnd.$(tableElt).DataTable().$(selector);
return $wnd.$.makeArray(rslt);
}-*/;
private static void getArrayServerData(JsAjaxRequest req, JavaScriptObject drawCallback) {
final JsOrderItems order = req.getOrder();
String s = "";
if (order.length() > 0) {
for (int i = 0; i < order.length(); i++) {
s += "col=" + String.valueOf(order.get(i).getCol())
+ ", dir=" + order.get(i).getDir() + "; ";
}
}
if (!s.isEmpty()) s = "order: " + s + "\n\n";
JsColItems cols = req.getColumns();
String colStr = "";
if (cols.length() > 0) {
for (int i = 0; i < cols.length(); i++) {
colStr += "data=" + String.valueOf(cols.get(i).getData())
+ ", name=" + cols.get(i).getName() + "; ";
}
}
if (!colStr.isEmpty()) colStr = "columns: " + colStr + "\n\n";
//Window.alert(s + colStr + JsUtils.stringify(req));
String search = req.getSearchValue();
search = search != null ? search.trim() : "";
String searchLo = search.toLowerCase();
final int total = dataArray.length();
List<JsArrayMixed> lst = new ArrayList<>();
cols = req.getColumns();
for (int i = 0; i < total; i++) {
JsArrayMixed row = dataArray.get(i);
boolean okRow = search.isEmpty();
if (!search.isEmpty()) {
for (int j = 0; j < cols.length(); j++) {
String v = row.getString(j);
if (Empty.is(v)) continue;
if (v.contains(search)) {
okRow = true;
break;
}
String vLo = v.toLowerCase();
if (vLo.contains(searchLo)) {
okRow = true;
break;
}
}
}
if (!okRow) continue;
for (int j = 0; j < cols.length(); j++) {
JsColItem col = cols.get(j);
if (!Empty.is(col.getSearchValue())) {
String colSearch = col.getSearchValue().trim();
String colSearchLo = colSearch.toLowerCase();
if (!colSearch.isEmpty()) {
String v = row.getString(j);
if (Empty.is(v)) {
okRow = false;
break;
}
if (!v.contains(colSearch) && !v.toLowerCase().contains(colSearchLo)) {
okRow = false;
break;
}
}
}
}
if (okRow) lst.add(row);
}
JsArrayMixed[] arr = lst.toArray(new JsArrayMixed[0]);
final int filtered = arr.length;
if (order.length() > 0) {
Arrays.sort(arr, new Comparator<JsArrayMixed>() {
@Override
public int compare(JsArrayMixed o1, JsArrayMixed o2) {
for (int i = 0; i < order.length(); i++) {
int colIdx = order.get(i).getCol();
String v1 = o1.getString(colIdx);
String v2 = o2.getString(colIdx);
int cmp = v1.compareTo(v2);
if (cmp != 0) {
String dir = order.get(i).getDir();
if ("asc".equals(dir)) return cmp;
else return -cmp;
}
}
return 0;
}});
}
JsAjaxResponse resp = JsAjaxResponse.create();
resp.setDraw(req.getDraw());
resp.setRecordsTotal(total);
resp.setRecordsFiltered(filtered);
int cnt = Math.min(filtered - req.getStart(), req.getLength());
JsArray<JsArrayMixed> d = JavaScriptObject.createArray(cnt).cast();
for (int i = 0; i < cnt; i++) {
d.set(i, arr[req.getStart() + i]);
}
resp.setData(d);
//s = JsUtils.stringify(resp);
//Window.alert(s);
JsUtils.callFunc(drawCallback, resp);
}
private static void getObjsServerData(JsAjaxRequest req, JavaScriptObject drawCallback) {
String search = req.getSearchValue();
search = search != null ? search.trim() : "";
String searchLo = search.toLowerCase();
final int total = dataObjs.length();
List<JavaScriptObject> lst = new ArrayList<>();
final JsColItems cols = req.getColumns();
for (int i = 0; i < total; i++) {
JavaScriptObject row = dataObjs.get(i);
boolean okRow = search.isEmpty();
if (!search.isEmpty()) {
for (int j = 0; j < cols.length(); j++) {
JsColItem col = cols.get(j);
if (Empty.is(col.getData())) continue;
String v = JsUtils.getChainValStr(row, col.getData());
if (Empty.is(v)) continue;
if (v.contains(search)) {
okRow = true;
break;
}
String vLo = v.toLowerCase();
if (vLo.contains(searchLo)) {
okRow = true;
break;
}
}
}
if (!okRow) continue;
for (int j = 0; j < cols.length(); j++) {
JsColItem col = cols.get(j);
if (!Empty.is(col.getData()) && !Empty.is(col.getSearchValue())) {
String colSearch = col.getSearchValue().trim();
String colSearchLo = colSearch.toLowerCase();
if (!colSearch.isEmpty()) {
String v = JsUtils.getChainValStr(row, col.getData());
if (Empty.is(v)) {
okRow = false;
break;
}
if (!v.contains(colSearch) && !v.toLowerCase().contains(colSearchLo)) {
okRow = false;
break;
}
}
}
}
if (okRow) lst.add(row);
}
JavaScriptObject[] arr = lst.toArray(new JavaScriptObject[0]);
final int filtered = arr.length;
final JsOrderItems order = req.getOrder();
if (order.length() > 0) {
Arrays.sort(arr, new Comparator<JavaScriptObject>() {
@Override
public int compare(JavaScriptObject o1, JavaScriptObject o2) {
for (int i = 0; i < order.length(); i++) {
int colIdx = order.get(i).getCol();
JsColItem col = cols.get(colIdx);
String dat = col.getData();
if (Empty.is(dat)) continue;
String v1 = JsUtils.getChainValStr(o1, dat);
String v2 = JsUtils.getChainValStr(o2, dat);
int cmp = v1.compareTo(v2);
if (cmp != 0) {
String dir = order.get(i).getDir();
if ("asc".equals(dir)) return cmp;
else return -cmp;
}
}
return 0;
}});
}
JsAjaxResponse resp = JsAjaxResponse.create();
resp.setDraw(req.getDraw());
resp.setRecordsTotal(total);
resp.setRecordsFiltered(filtered);
int cnt = Math.min(filtered - req.getStart(), req.getLength());
JsArray<JavaScriptObject> d = JavaScriptObject.createArray(cnt).cast();
for (int i = 0; i < cnt; i++) {
d.set(i, arr[req.getStart() + i]);
}
resp.setData(d);
//s = JsUtils.stringify(resp);
//Window.alert(s);
JsUtils.callFunc(drawCallback, resp);
}
private static void getJavaServerData(final JQMDataTable dataTable, JsAjaxRequest req,
JavaScriptObject drawCallback) {
// We have to work with dataTable.getColumn(), because jsColItems have getData() empty
// as result of custom RowData assigned.
String search = req.getSearchValue();
search = search != null ? search.trim() : "";
String searchLo = search.toLowerCase();
final int total = testDataItems.size();
List<TestDataItem> lst = new ArrayList<>();
final JsColItems cols = req.getColumns();
for (int i = 0; i < total; i++) {
TestDataItem row = testDataItems.get(i);
boolean okRow = search.isEmpty();
if (!search.isEmpty()) {
for (int j = 0; j < cols.length(); j++) {
ColumnDefEx col = dataTable.getColumn(j);
if (Empty.is(col.getData())) continue;
String v = row.getValStr(col.getData());
if (Empty.is(v)) continue;
if (v.contains(search)) {
okRow = true;
break;
}
String vLo = v.toLowerCase();
if (vLo.contains(searchLo)) {
okRow = true;
break;
}
}
}
if (!okRow) continue;
for (int j = 0; j < cols.length(); j++) {
JsColItem jsCol = cols.get(j);
ColumnDefEx col = dataTable.getColumn(j);
if (!Empty.is(col.getData()) && !Empty.is(jsCol.getSearchValue())) {
String colSearch = jsCol.getSearchValue().trim();
String colSearchLo = colSearch.toLowerCase();
if (!colSearch.isEmpty()) {
String v = row.getValStr(col.getData());
if (Empty.is(v)) {
okRow = false;
break;
}
if (!v.contains(colSearch) && !v.toLowerCase().contains(colSearchLo)) {
okRow = false;
break;
}
}
}
}
if (okRow) lst.add(row);
}
final JsOrderItems order = req.getOrder();
if (order.length() > 0) {
Collections.sort(lst, new Comparator<TestDataItem>() {
@Override
public int compare(TestDataItem o1, TestDataItem o2) {
for (int i = 0; i < order.length(); i++) {
int colIdx = order.get(i).getCol();
ColumnDefEx col = dataTable.getColumn(colIdx);
final int cmp;
if ("id".equals(col.getData())) {
cmp = o1.id - o2.id;
} else {
String v1 = o1.getValStr(col.getData());
String v2 = o2.getValStr(col.getData());
cmp = v1.compareTo(v2);
}
if (cmp != 0) {
String dir = order.get(i).getDir();
if ("asc".equals(dir)) return cmp;
else return -cmp;
}
}
return 0;
}});
}
final int filtered = lst.size();
JsAjaxResponse resp = JsAjaxResponse.create();
resp.setDraw(req.getDraw());
resp.setRecordsTotal(total);
resp.setRecordsFiltered(filtered);
int cnt = Math.min(filtered - req.getStart(), req.getLength());
JsArray<JavaScriptObject> d = JavaScriptObject.createArray(cnt).cast();
for (int i = 0; i < cnt; i++) {
TestDataItem item = lst.get(req.getStart() + i);
JavaScriptObject jsObj = JavaScriptObject.createObject();
JsUtils.setObjValue(jsObj, JQMDataTable.DT_ROWID, String.valueOf(item.id));
JsUtils.setNestedObjJavaValue(jsObj, "dataItem", item);
d.set(i, jsObj);
}
resp.setData(d);
//s = JsUtils.stringify(resp);
//Window.alert(s);
JsUtils.callFunc(drawCallback, resp);
}
private static void generateRowIds(JsColItems cols) {
for (int i = 0; i < dataObjs.length(); i++) {
JavaScriptObject row = dataObjs.get(i);
String s = "";
for (int j = 0; j < cols.length(); j++) {
JsColItem col = cols.get(j);
String d = col.getData();
if (Empty.is(d)) continue;
String v = JsUtils.getChainValStr(row, d);
s += v;
}
JsUtils.setObjValue(row, JQMDataTable.DT_ROWID, JsUtils.hashFnv32a(s));
}
}
private static JsArrayMixed createDataRow(int rowIdx) {
JsArrayMixed r = JavaScriptObject.createArray().cast();
r.push("Tiger Nixon");
r.push("System Architect");
r.push("Edinburgh");
r.push(String.valueOf(rowIdx));
r.push("2011/04/25");
r.push("$123,456");
return r;
}
public JQMPage getPage() {
return page;
}
}